<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Помогите разобраться в принципе работы скрипта LUA]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Помогите разобраться в принципе работы скрипта LUA форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 10:29:18 +0300</pubDate>
		<item>
			<title>Помогите разобраться в принципе работы скрипта LUA</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32568/topic3852/">Помогите разобраться в принципе работы скрипта LUA</a></b> <i>LUA</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте, хоу установить на сервер новый аддон на рулетку, но не понимаю принцип генерации чисел. Прошу помогите!<br /><br /><br /><br />AddCSLuaFile()<br /><br />DEFINE_BASECLASS(&quot;casinokit_table&quot;)<br />ENT.Base = &quot;casinokit_table&quot;<br /><br />ENT.SeatCount = 0<br /><br />ENT.Model = &quot;models/casinokit/roulette.mdl&quot;<br /><br />ENT.Spawnable = true<br />ENT.Category = &quot;Casino Kit&quot;<br />ENT.PrintName = &quot;Roulette table&quot;<br /><br />ENT.GameClass = &quot;Roulette&quot;<br /><br />function ENT:OnGameConfigReceived(key, value)<br />	if key == &quot;minbet&quot; then<br />		assert(type(value) == &quot;number&quot; and value &gt; 0)<br />		self:SetMinBet(value)<br />	elseif key == &quot;maxtotalbet&quot; then<br />		assert(type(value) == &quot;number&quot; and value &gt;= 0)<br />		self:SetMaxTotalBet(value)<br />	elseif key == &quot;rollinterval&quot; then<br />		assert(type(value) == &quot;number&quot; and (value == 0 or value &gt;= 25))<br />		self:SetRollInterval(value)<br />	end<br />end<br /><br />function ENT:SetupDataTables()<br />	BaseClass.SetupDataTables(self)<br /><br />	self:NetworkVar(&quot;Bool&quot;, 0, &quot;Rolling&quot;)<br />	self:NetworkVar(&quot;Float&quot;, 0, &quot;LastRoll&quot;)<br />	self:NetworkVar(&quot;Float&quot;, 1, &quot;RollInterval&quot;)<br />	self:NetworkVar(&quot;Int&quot;, 1, &quot;MinBet&quot;)<br />	self:NetworkVar(&quot;Int&quot;, 2, &quot;MaxTotalBet&quot;)<br />end<br /><br />ENT.ROUL_INNER_RAD = 0.1<br />ENT.ROUL_INNER_HEIGHT = 0.15<br /><br />ENT.ROUL_MID_HEIGHT = 0.15<br /><br />ENT.ROUL_OUTER_RAD = 0.32<br />ENT.ROUL_OUTER_HEIGHT = 0.05<br /><br />ENT.ROUL_BORDER_HEIGHT = 0.116<br />ENT.ROUL_TOTAL_RAD = 0.43 -- ~27 inch<br /><br />ENT.ROUL_BALL_RAD = 0.021 -- 21mm<br /><br />ENT.ROUL_BALL_MASS = 0.00374<br />ENT.ROUL_BALL_ROLLFRICTION_COEFFICIENT = 0.001<br />ENT.ROUL_BALL_ROLLSLIDEFRICTION_COEFFICIENT = 0.014<br /><br />local roulSeq = {<br />	6, 21, 33, 16, 4, 23, 35, 14, 2, 0, 28, 9, 26, 30, 11, 7, 20,<br />	32, 17, 5, 22, 34, 15, 3, 24, 36, 13, 1, &quot;00&quot;, 27, 10, 25, 29, 12, 8, 19, 31, 18,<br />}<br />local radPerNumber = math.pi*2 / #roulSeq<br /><br />ENT.NumberSequence = roulSeq<br />ENT.RedNumbers = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36}<br /><br />function ENT:GetNumberFromRad(rad)<br />	local index = math.floor((rad - radPerNumber/2) / radPerNumber)<br />	return self.NumberSequence&#91;(index % #self.NumberSequence) + 1&#93;<br />end<br /><br />local wheelRotPerSec = 0.3<br />function ENT:WheelRotationAt(time)<br />	return time * wheelRotPerSec<br />end<br />function ENT:GetWheelAngle()<br />	return self:WheelRotationAt(CurTime())<br />end<br /><br />function ENT:GetBallYFromRad(rad)<br />	return math.Remap(rad, self.ROUL_OUTER_RAD, self.ROUL_TOTAL_RAD, self.ROUL_OUTER_HEIGHT, self.ROUL_BORDER_HEIGHT - 0.03)<br />end<br /><br />local acceleration = -0.6<br />function ENT:GetBallAngle(elapsed, strength)<br />	elapsed = self:ClampElapsed(elapsed, strength)<br />	local initialVelocity = strength<br />	local ballHorizDistance = initialVelocity*elapsed + 0.5*acceleration*elapsed^2<br />	return -(ballHorizDistance / self.ROUL_OUTER_RAD)<br />end<br /><br />function ENT:GetBallStopTime(strength)<br />	return -strength / acceleration<br />end<br /><br />function ENT:ClampElapsed(elapsed, strength)<br />	local ballHorizStopTime = self:GetBallStopTime(strength)<br />	local ballStopElapsed = 0<br />	if ballHorizStopTime &lt; elapsed then<br />		return ballHorizStopTime, elapsed - ballHorizStopTime<br />	end<br />	return elapsed, 0<br />end<br /><br />function ENT:GetBallNumber(start, strength)<br />	local elapsed, ballStopElapsed = self:ClampElapsed(CurTime() - start, strength)<br />	local ballHorizStopTime = -strength / acceleration<br />	local ballAng = -self:GetBallAngle(elapsed, strength)<br />	return self:GetNumberFromRad(self:WheelRotationAt(start + ballHorizStopTime) + -self:GetBallAngle(elapsed, strength))<br />end<br /><br />function ENT:SimulateBall(start, strength)<br />	local elapsed, ballStopElapsed = self:ClampElapsed(CurTime() - start, strength)<br /><br />	local initialVelocity = strength<br /><br />	local ballAngle = self:GetBallAngle(elapsed, strength) % (math.pi*2)<br />	local ballHorizVelocity = initialVelocity + acceleration*elapsed<br /><br />	-- convert to relative to wheel<br />	ballAngle = ballAngle + ballStopElapsed * wheelRotPerSec<br /><br />	local ballRadius = self.ROUL_TOTAL_RAD - 0.02<br />	if ballHorizVelocity &lt; 1 then<br />		local ballFrac = math.max(ballHorizVelocity, 0) ^ (1/1.5) -- note: normalize to 0-1 first if you edit<br /><br />		ballRadius = math.Remap(ballFrac, 0, 1, self.ROUL_OUTER_RAD, self.ROUL_TOTAL_RAD - 0.02)<br />	end<br /><br />	-- x flipped cuz texture is flipped. LAME but easieat hacky fix??<br />	return Vector(math.cos(ballAngle) * ballRadius, math.sin(ballAngle) * ballRadius, self:GetBallYFromRad(ballRadius) + 0.02)<br />end<br /><br />function ENT:GetTimeToNextRoll()<br />	local interval = self:GetRollInterval()<br />	if interval == 0 then interval = 30 end<br /><br />	return (interval - (CurTime() % interval))<br />end<br /><br />local function withinNumbers(num)<br />	num = tonumber(num)<br />	return num and num &gt;= 1 and num &lt;= 36<br />end<br />function ENT:IsValidBet(id, param)<br />	if id == &quot;single&quot; then<br />		return withinNumbers(param)<br />	end<br /><br />	if id == &quot;split&quot; then<br />		local split0, split1 = param:match(&quot;(%d+)%-(%d+)&quot;)<br />		if not withinNumbers(split0) or not withinNumbers(split1) then return false end<br /><br />		local n0, n1 = tonumber(split0), tonumber(split1)<br />		if n0-3 == n1 then return true end -- left split<br />		if n0+1 == n1 and (n0 % 3) ~= 0 then return true end -- bottom split<br />		return false<br />	end<br /><br />	if id == &quot;street&quot; then<br />		return withinNumbers(param) and (tonumber(param) - 1) % 3 == 0<br />	end<br /><br />	if id == &quot;corner&quot; then<br />		return withinNumbers(param) and (tonumber(param) - 1) % 3 ~= 0 and tonumber(param) &gt; 2<br />	end<br /><br />	if id == &quot;1-12&quot; or id == &quot;13-24&quot; or id == &quot;25-36&quot; or id == &quot;1-18&quot; or id == &quot;even&quot; or<br />	 &nbsp; id == &quot;red&quot; or id == &quot;black&quot; or id == &quot;odd&quot; or id == &quot;19-36&quot; or id == &quot;0&quot; or<br />	 &nbsp; id == &quot;00&quot; or id == &quot;column-1&quot; or id == &quot;column-2&quot; or id == &quot;column-3&quot; then<br />		return true<br />	end<br /><br />	return false<br />end <br />
			<i>07.08.2018 09:22:17, CyberJacks.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32568/topic3852/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32568/topic3852/</guid>
			<pubDate>Tue, 07 Aug 2018 09:22:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
