Initial commit
This commit is contained in:
173
c_script.lua
Normal file
173
c_script.lua
Normal file
@@ -0,0 +1,173 @@
|
||||
local total
|
||||
local rank = 0
|
||||
local start
|
||||
local sx, sy = GuiElement.getScreenSize()
|
||||
local alpha
|
||||
local leaders
|
||||
local length,lowerLimit, upperLimit = 0,0,0
|
||||
local removeTimer
|
||||
|
||||
addEventHandler('onClientResourceStart', resourceRoot,
|
||||
function()
|
||||
|
||||
local txd = EngineTXD('model.txd', true)
|
||||
txd:import(1974)
|
||||
|
||||
local dff = EngineDFF('model.dff', 0)
|
||||
dff:replace(1974)
|
||||
|
||||
local col = EngineCOL('model.col')
|
||||
col:replace(1974)
|
||||
end
|
||||
)
|
||||
|
||||
addEvent("showTotal", true)
|
||||
addEventHandler("showTotal", root,
|
||||
function (prez)
|
||||
total = prez
|
||||
start = getTickCount()
|
||||
if prez == 1 then
|
||||
alpha = 255
|
||||
removeEventHandler("onClientRender", root, intro)
|
||||
addEventHandler("onClientRender", root, intro)
|
||||
else
|
||||
removeEventHandler("onClientRender", root, drawTotal)
|
||||
addEventHandler("onClientRender", root, drawTotal)
|
||||
end
|
||||
end)
|
||||
|
||||
function drawTotal()
|
||||
local now = getTickCount()
|
||||
if now - start > 5000 then
|
||||
removeEventHandler("onClientRender", root, drawTotal)
|
||||
end
|
||||
dxDrawText("You have " ..total.. " presents", 0, sy-30, sx, sy, tocolor(255,255,255,255), 1.3, "default-bold", "center", "center", false, false, false, true)
|
||||
end
|
||||
|
||||
function intro()
|
||||
local now = getTickCount()
|
||||
if now - start > 15000 then
|
||||
if alpha < 10 then
|
||||
removeEventHandler("onClientRender", root, intro)
|
||||
else
|
||||
alpha = alpha - 10
|
||||
end
|
||||
end
|
||||
dxDrawText("Welcome to the SKC Christmas Event!", 0, sy-300, sx+1, sy+1, tocolor(0,0,0,alpha), 2, "default-bold", "center", "center", false, false, false, true)
|
||||
dxDrawText("Welcome to the #ff8000SKC Christmas Event!", 0, sy-300, sx, sy, tocolor(255,255,255,alpha), 2, "default-bold", "center", "center", false, false, false, true)
|
||||
|
||||
dxDrawText("Collect as many presents as you can.", 0, sy-220, sx+1, sy+1, tocolor(0,0,0,alpha), 1.6, "default-bold", "center", "center", false, false, false, true)
|
||||
dxDrawText("Collect as many presents as you can.", 0, sy-220, sx, sy, tocolor(255,255,255,alpha), 1.6, "default-bold", "center", "center", false, false, false, true)
|
||||
end
|
||||
|
||||
function drawLeaders()
|
||||
local offsetX_SKC = 400
|
||||
dxDrawRectangle(sx-200-offsetX_SKC, 10, length, 35, tocolor(0,0,0,220))
|
||||
if length >= 190 then
|
||||
dxDrawText("Christmas Event Leaders", sx-200-offsetX_SKC, 20, sx-10-offsetX_SKC, 40, tocolor(255,255,255,255), 1, "default-bold", "center")
|
||||
for i, v in ipairs(leaders) do
|
||||
if i > lowerLimit and i <= upperLimit then
|
||||
if i == rank then
|
||||
dxDrawRectangle(sx-170-offsetX_SKC, 24+(28*(i-lowerLimit)), 160, 28, tocolor(100,100,100,155))
|
||||
else
|
||||
dxDrawRectangle(sx-170-offsetX_SKC, 24+(28*(i-lowerLimit)), 160, 28, tocolor(0,0,0,155))
|
||||
end
|
||||
dxDrawRectangle(sx-200-offsetX_SKC, 24+(28*(i-lowerLimit)), 30, 28, tocolor(0,0,0,220))
|
||||
if i < 6 then
|
||||
dxDrawText(i, sx-200-offsetX_SKC, 30+(28*(i-lowerLimit)), sx-170-offsetX_SKC, 30+(30*(i-lowerLimit)), tocolor(255,255,0+((i-1)*50),255), 1, "default-bold", "center")
|
||||
else
|
||||
dxDrawText(i, sx-200-offsetX_SKC, 30+(28*(i-lowerLimit)), sx-170-offsetX_SKC, 30+(30*(i-lowerLimit)), tocolor(255,255,255,255), 1, "default-bold", "center")
|
||||
end
|
||||
dxDrawText(v[1], sx-160-offsetX_SKC, 30+(28*(i-lowerLimit)), sx-10-offsetX_SKC, 30+(30*(i-lowerLimit)), tocolor(255,255,255,255), 1, "default-bold", "left", "top", false, false, false, true)
|
||||
dxDrawText(v[2], sx-31-offsetX_SKC, 30+(28*(i-lowerLimit)), sx-15-offsetX_SKC, 30+(30*(i-lowerLimit)), tocolor(255,0,0,255), 1, "default-bold", "right", "top")
|
||||
if i > upperLimit then
|
||||
break --don't carry on looping, this helps performance quite a bit
|
||||
end
|
||||
end
|
||||
end
|
||||
if rank > upperLimit and upperLimit > 0 then
|
||||
dxDrawRectangle(sx-170-offsetX_SKC, 61+(28*(upperLimit-lowerLimit)), 160, 28, tocolor(0,0,0,155))
|
||||
dxDrawRectangle(sx-200-offsetX_SKC, 61+(28*(upperLimit-lowerLimit)), 30, 28, tocolor(0,0,0,220))
|
||||
dxDrawText(rank, sx-200-offsetX_SKC, 67+(28*(upperLimit-lowerLimit)), sx-170-offsetX_SKC, 100+(28*(upperLimit-lowerLimit)), tocolor(255,255,255,255), 1, "default-bold", "center")
|
||||
dxDrawText(leaders[rank][1], sx-160-offsetX_SKC, 67+(28*(upperLimit-lowerLimit)), sx-10-offsetX_SKC, 100+(28*(upperLimit-lowerLimit)), tocolor(255,255,255,255), 1, "default-bold", "left", "top", false, false, false, true)
|
||||
dxDrawText(leaders[rank][2], sx-31-offsetX_SKC, 67+(28*(upperLimit-lowerLimit)), sx-15-offsetX_SKC, 100+(28*(upperLimit-lowerLimit)), tocolor(255,0,0,255), 1, "default-bold", "right", "top")
|
||||
end
|
||||
if upperLimit == 0 then
|
||||
dxDrawRectangle(sx-200-offsetX_SKC, 45, length, 25, tocolor(0,0,0,220))
|
||||
dxDrawText("Mouse wheel to show", sx-200-offsetX_SKC, 45, sx-10-offsetX_SKC, 60, tocolor(255,255,255,255), 0.85, "default-bold", "center")
|
||||
end
|
||||
else
|
||||
length = length + 5
|
||||
end
|
||||
end
|
||||
|
||||
addEvent("updateTables", true)
|
||||
addEventHandler("updateTables", root,
|
||||
function (data)
|
||||
leaders = data
|
||||
if removeTimer and removeTimer.valid then
|
||||
removeTimer:reset()
|
||||
elseif upperLimit == 0 then
|
||||
removeTimer = Timer(removeLeaders, 15000, 1)
|
||||
end
|
||||
removeEventHandler("onClientRender", root, drawLeaders)
|
||||
removeEventHandler("onClientRender", root, boom)
|
||||
addEventHandler("onClientRender", root, drawLeaders)
|
||||
local name = localPlayer.name
|
||||
for i, v in ipairs(leaders) do
|
||||
if v[1] == name then
|
||||
rank = i
|
||||
end
|
||||
end
|
||||
if length == 0 then
|
||||
bindKey("mouse_wheel_up", "down", moveLimits)
|
||||
bindKey("mouse_wheel_down", "down", moveLimits)
|
||||
end
|
||||
end)
|
||||
|
||||
function removeLeaders()
|
||||
addEventHandler("onClientRender", root, boom)
|
||||
end
|
||||
|
||||
function boom()
|
||||
if length < 10 then
|
||||
unbindKey("mouse_wheel_up", "down", moveLimits)
|
||||
unbindKey("mouse_wheel_down", "down", moveLimits)
|
||||
removeEventHandler("onClientRender", root, drawLeaders)
|
||||
removeEventHandler("onClientRender", root, boom)
|
||||
length = 0
|
||||
else
|
||||
length = length - 10
|
||||
end
|
||||
end
|
||||
|
||||
function moveLimits(button)
|
||||
if length < 190 then return end
|
||||
if button == "mouse_wheel_up" then
|
||||
if lowerLimit > 0 then
|
||||
upperLimit = upperLimit - 1
|
||||
lowerLimit = lowerLimit - 1
|
||||
elseif lowerLimit == 0 and upperLimit == 5 then
|
||||
upperLimit = 0
|
||||
removeTimer = Timer(removeLeaders, 15000, 1)
|
||||
elseif upperLimit ~= 0 then
|
||||
lowerLimit = 0
|
||||
upperLimit = 5
|
||||
end
|
||||
elseif button == "mouse_wheel_down" then
|
||||
if upperLimit < #leaders then
|
||||
if upperLimit == 0 then
|
||||
triggerServerEvent("statsForPoon", localPlayer)
|
||||
if removeTimer and removeTimer.valid then
|
||||
removeTimer:destroy()
|
||||
end
|
||||
upperLimit = 5
|
||||
elseif upperLimit < 10 then
|
||||
upperLimit = 10
|
||||
else
|
||||
upperLimit = upperLimit + 1
|
||||
lowerLimit = lowerLimit + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
81
meta.xml
Normal file
81
meta.xml
Normal file
@@ -0,0 +1,81 @@
|
||||
<meta>
|
||||
<oop>true</oop>
|
||||
<info name="xmas" author="Driggero and Greenlander" description="Xmas presents for DD and DM" type="script" version="2.0" addon="race"/>
|
||||
<script src="c_script.lua" type="client" />
|
||||
<script src="s_utils.lua" type="server" />
|
||||
<script src="s_script.lua" type="server" />
|
||||
<script src="s_commands.lua" type="server" />
|
||||
<script src="s_events.lua" type="server" />
|
||||
<file src="model.dff" />
|
||||
<file src="model.col" />
|
||||
<file src="model.txd" />
|
||||
|
||||
<settings>
|
||||
<setting name="*gamemode" value="DM"
|
||||
friendlyname="Gamemode"
|
||||
accept="DD,DM"
|
||||
group="Gamemode"
|
||||
desc="Switch between DD and DM gamemode depending on server."
|
||||
/>
|
||||
<setting name="*minplayers" value="3"
|
||||
friendlyname="Min player count"
|
||||
accept="1-5"
|
||||
group="Gameplay"
|
||||
desc="Presents will only spawn with at least this amount of players online."
|
||||
/>
|
||||
<setting name="*giftfactor" value="1"
|
||||
friendlyname="Presents score multiplicator"
|
||||
accept="1-10"
|
||||
group="Gameplay"
|
||||
desc="Determines how valuable the presents are. (NOT USED ATM!)"
|
||||
/>
|
||||
<setting name="*spawnprobability" value="10"
|
||||
friendlyname="Probability threshold of spwaning presents"
|
||||
accept="0-50"
|
||||
group="Gameplay"
|
||||
desc="Determines the probability threashold of spawning a present on parts of the track (in %)."
|
||||
/>
|
||||
<setting name="*minplayers" value="3"
|
||||
friendlyname="Min player count"
|
||||
accept="1-5"
|
||||
group="Gameplay"
|
||||
desc="Presents will only spawn with at least this amount of players online."
|
||||
/>
|
||||
<setting name="*eventstart" value="18"
|
||||
friendlyname="Starting hour of the event"
|
||||
accept="0-23"
|
||||
group="Event"
|
||||
desc="Sets the hour of the days when the event will start."
|
||||
/>
|
||||
<setting name="*eventduration" value="2"
|
||||
friendlyname="Duration of the event"
|
||||
accept="1-24"
|
||||
group="Event"
|
||||
desc="Sets the duration for the event [in hours]."
|
||||
/>
|
||||
<setting name="*endmonth" value="1"
|
||||
friendlyname="Ending month"
|
||||
accept="1-12"
|
||||
group="End date"
|
||||
desc="Sets the month when the event will end automatically."
|
||||
/>
|
||||
<setting name="*endday" value="1"
|
||||
friendlyname="Ending day"
|
||||
accept="1-31"
|
||||
group="End date"
|
||||
desc="Sets the day when the event will end automatically."
|
||||
/>
|
||||
<setting name="*endhour" value="0"
|
||||
friendlyname="Ending hour"
|
||||
accept="0-23"
|
||||
group="End date"
|
||||
desc="Sets the hour when the event will end automatically."
|
||||
/>
|
||||
<setting name="*endminute" value="0"
|
||||
friendlyname="Ending minute"
|
||||
accept="0-59"
|
||||
group="End date"
|
||||
desc="Sets the minute when the event will end automatically."
|
||||
/>
|
||||
</settings>
|
||||
</meta>
|
||||
22
s_commands.lua
Normal file
22
s_commands.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
addCommandHandler("xmas",
|
||||
function(player, arg1, arg2)
|
||||
local accName = getAccountName ( getPlayerAccount ( player ) )
|
||||
local isAdmin = isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" )) or isObjectInACLGroup ("user."..accName, aclGetGroup ( "Administrator" ))
|
||||
if arg2 == "update" then
|
||||
updateTop(player)
|
||||
elseif arg2 == "clearstats" then
|
||||
if accName ~= "Greenlander" then return end
|
||||
if isAdmin then
|
||||
outputDebugString('[xmas]: Clearing the Xmas presents account stats.')
|
||||
|
||||
executeSQLQuery("DELETE FROM `xmas`")
|
||||
g_data["leaders"] = {}
|
||||
updateTop()
|
||||
end
|
||||
elseif arg2 == "top" then
|
||||
if (isAdmin) then
|
||||
updateTop()
|
||||
showTop()
|
||||
end
|
||||
end
|
||||
end)
|
||||
91
s_events.lua
Normal file
91
s_events.lua
Normal file
@@ -0,0 +1,91 @@
|
||||
addEvent ( "onSettingChange" )
|
||||
addEventHandler('onSettingChange', getResourceRootElement(),
|
||||
function(name, oldvalue, value, player)
|
||||
cacheGameOptions()
|
||||
checkTime()
|
||||
end
|
||||
)
|
||||
|
||||
addEventHandler("onResourceStart", resourceRoot,
|
||||
function ()
|
||||
math.randomseed(os.time())
|
||||
|
||||
cacheGameOptions()
|
||||
checkTime()
|
||||
|
||||
executeSQLQuery("CREATE TABLE IF NOT EXISTS `xmas` (`account` TEXT, `name` TEXT, `presents` INTEGER)")
|
||||
end)
|
||||
|
||||
addEvent("statsForPoon", true)
|
||||
addEventHandler("statsForPoon", root,
|
||||
function()
|
||||
if source.type ~= "player" then return end
|
||||
|
||||
outputDebugString(source.name .. " checked the scoreboard")
|
||||
end)
|
||||
|
||||
addEvent("onRaceStateChanging")
|
||||
addEventHandler("onRaceStateChanging", root,
|
||||
function(new, old)
|
||||
if new == "PreGridCountdown" then
|
||||
if g_data["finished"] then outputDebugString("[xmas]: Competition over, not generating presents") return end
|
||||
if g_data["event"] == false then return end
|
||||
setTimer(function() spawnPresents() end, 1500, 1)
|
||||
elseif new == "GridCountdown" then
|
||||
if g_data["event"] == false then return end
|
||||
updateTop()
|
||||
elseif new == "LoadingMap" then
|
||||
for i, v in ipairs(g_data["presents"]) do
|
||||
v[1]:destroy()
|
||||
v[2]:destroy()
|
||||
end
|
||||
g_data["presents"] = {}
|
||||
end
|
||||
end)
|
||||
|
||||
addEventHandler ( "onColShapeHit", root,
|
||||
function (player)
|
||||
if player.type ~= "player" then return end
|
||||
for i, v in ipairs(g_data["presents"]) do
|
||||
if source == v[2] then
|
||||
local acc = player.account
|
||||
local accName = acc.name
|
||||
--local acc = getPlayerAccount(player)
|
||||
--local accName = getAccountName(acc)
|
||||
if acc.guest then
|
||||
outputChatBox("* #ffffffPlease #ff8000login#ffffff to join the Christmas Competition", player, 255,0,0,true)
|
||||
else
|
||||
v[1]:destroy()
|
||||
v[2]:destroy()
|
||||
v[1], v[2] = nil, nil
|
||||
table.remove(g_data["presents"], i)
|
||||
|
||||
local result = executeSQLQuery("SELECT `name`, `presents` FROM `xmas` WHERE LOWER(`account`)=?", string.lower(accName))
|
||||
|
||||
if result == false or #result == 0 then
|
||||
executeSQLQuery("INSERT INTO `xmas`(`account`,`name`,`presents`) VALUES(?,?,?)", accName, player.name, 0)
|
||||
result = executeSQLQuery("SELECT `name`, `presents` FROM `xmas` WHERE LOWER(`account`)=?", string.lower(accName))
|
||||
end
|
||||
|
||||
local prez = result[1].presents
|
||||
local name = result[1].name
|
||||
|
||||
if not name or name ~= player.name then
|
||||
executeSQLQuery("UPDATE `xmas` SET `name`=? WHERE LOWER(`account`)=?", player.name, string.lower(accName))
|
||||
end
|
||||
prez = prez + 1
|
||||
executeSQLQuery("UPDATE `xmas` SET `presents`=? WHERE LOWER(`account`)=?", prez, string.lower(accName))
|
||||
triggerClientEvent(player, "showTotal", resourceRoot, prez)
|
||||
local randomScore = math.random(1, 4)*g_data["gameOptions"].giftfactor
|
||||
|
||||
--addPoints(randomScore, player)
|
||||
--[[if randomScore > 1 then
|
||||
outputChatBox("* #ffffffYou recieved #ff0000" .. randomScore .. "#ffffff points from this present", player, 255,0,0,true)
|
||||
else
|
||||
outputChatBox("* #ffffffYou recieved #ff0000" .. randomScore .. "#ffffff point from this present", player, 255,0,0,true)
|
||||
end]]
|
||||
outputChatBox("* #ffffff" .. player.name .. "#ffffff found a present! [" .. #g_data["presents"] .. " left]", root,255,0,0,true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
192
s_script.lua
Normal file
192
s_script.lua
Normal file
@@ -0,0 +1,192 @@
|
||||
g_data = {}
|
||||
g_data["presents"] = {}
|
||||
g_data["leaders"] = {}
|
||||
g_data["gameOptions"] = {}
|
||||
g_data["finished"] = false
|
||||
g_data["event"] = false
|
||||
g_data["validObjects"] = {}
|
||||
|
||||
function cacheGameOptions()
|
||||
g_data["gameOptions"] = {}
|
||||
g_data["gameOptions"].gamemode = getString('gamemode','DM')
|
||||
g_data["gameOptions"].minplayers = getNumber('minplayers',3)
|
||||
g_data["gameOptions"].giftfactor = getNumber('giftfactor',1)
|
||||
g_data["gameOptions"].spawnprobability = getNumber('spawnprobability',10)
|
||||
g_data["gameOptions"].eventstart = getNumber('eventstart',18)
|
||||
g_data["gameOptions"].eventduration = getNumber('eventduration',2)
|
||||
g_data["gameOptions"].endmonth = getNumber('endmonth',1)
|
||||
g_data["gameOptions"].endday = getNumber('endday',1)
|
||||
g_data["gameOptions"].endhour = getNumber('endhour',0)
|
||||
g_data["gameOptions"].endminute = getNumber('endminute',0)
|
||||
|
||||
if g_data["gameOptions"].gamemode == 'DM' then
|
||||
g_data["validObjects"] = {
|
||||
[3458]=true,
|
||||
[8558]=true,
|
||||
[8838]=true,
|
||||
[8947]=true,
|
||||
[6959]=true,
|
||||
[18450]=true,
|
||||
[7657]=true,
|
||||
[9623]=true}
|
||||
elseif g_data["gameOptions"].gamemode == 'DD' then
|
||||
g_data["validObjects"] = {
|
||||
[3458]=true,
|
||||
[8558]=true,
|
||||
[8838]=true,
|
||||
[3095]=true,
|
||||
[13649]=true,
|
||||
[1482]=true,
|
||||
[12857]=true}
|
||||
end
|
||||
end
|
||||
|
||||
function spawnPresents()
|
||||
local playerCount = #Element.getAllByType("player")
|
||||
local probability
|
||||
if playerCount < g_data["gameOptions"].minplayers then
|
||||
outputDebugString("[xmas]: No presents this time. Not enough players.")
|
||||
return
|
||||
else
|
||||
probability = math.random(0, g_data["gameOptions"].spawnprobability)
|
||||
end
|
||||
local objects = {}
|
||||
|
||||
for index, object in pairs(Element.getAllByType("object")) do
|
||||
if g_data["validObjects"][object.model] then
|
||||
if isElementVisible(object) then
|
||||
if isElementFlat(object) then --only use flat objects
|
||||
table.insert(objects, object)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
outputDebugString("[xmas]: " .. #objects .. " possible places with " .. probability .. "% chance.")
|
||||
|
||||
local count = 0
|
||||
for i=1, math.floor(#objects*(probability/100)) do
|
||||
-- limit amount of presents spawned based on playercount
|
||||
if count > (playerCount*2) then
|
||||
break
|
||||
end
|
||||
|
||||
-- get random object from table
|
||||
local index = math.random(#objects)
|
||||
local object = objects[index]
|
||||
|
||||
-- model specific offsets with randomness in present placement
|
||||
local offset = getModelOffset(object)
|
||||
-- spawn present and create colsphere for hit detection
|
||||
local v = object.position
|
||||
local o = Object(1974, v.x+offset.x, v.y+offset.y, v.z+offset.z, 0,0,0,true)
|
||||
o:setCollisionsEnabled(false)
|
||||
local c = ColShape.Sphere(v.x+offset.x, v.y+offset.y, v.z+offset.z, 3.0)
|
||||
table.insert(g_data["presents"], {o, c})
|
||||
count = count + 1
|
||||
|
||||
-- remove object from list
|
||||
table.remove(objects, index)
|
||||
end
|
||||
|
||||
if #g_data["presents"] == 0 then
|
||||
outputChatBox("* #ffffff"..#g_data["presents"] .. " presents spawned on the map. Blame Ryan... #ff0000*", root,255,0,0,true)
|
||||
else
|
||||
outputChatBox("* #ffffff"..#g_data["presents"] .. " presents spawned on the map. Try to find them all #ff0000*", root,255,0,0,true)
|
||||
end
|
||||
outputDebugString("[xmas]: " .. #g_data["presents"] .. " presents spawned.")
|
||||
end
|
||||
|
||||
function rotatePresents()
|
||||
for i, v in ipairs(g_data["presents"]) do
|
||||
local pos = v[1].position
|
||||
moveObject(v[1], 5000, pos.x, pos.y, pos.z, 0, 0, 360)
|
||||
end
|
||||
end
|
||||
setTimer(rotatePresents, 5000, 0)
|
||||
|
||||
function addPoints(pts, player)
|
||||
--SKC specific!!! Just tested for DD
|
||||
--[[local result = executeSQLQuery( "SELECT score FROM stats WHERE LOWER(nick)=?" , string.lower(getAccountName(getPlayerAccount(player))) )
|
||||
if result == false or #result == 0 then return end
|
||||
local pts_before = result[1]["score"]
|
||||
executeSQLQuery( "UPDATE stats SET score=? WHERE LOWER(nick)=?", pts_before+pts, string.lower(getAccountName(getPlayerAccount(player))) )
|
||||
|
||||
exports.dd_player_stats:updatePlayerVisualPoints(player)]]
|
||||
end
|
||||
|
||||
function checkTime()
|
||||
local t = getRealTime()
|
||||
local hour = t.hour
|
||||
local minute = t.minute
|
||||
local day = t.monthday
|
||||
local month = t.month
|
||||
outputDebugString("[xmas]: "..month..' - '..day..' - '..hour..':'..minute)
|
||||
|
||||
-- check if competition ended
|
||||
if month == (g_data["gameOptions"].endmonth-1) then
|
||||
if day >= g_data["gameOptions"].endday then
|
||||
if hour >= g_data["gameOptions"].endhour then
|
||||
if minute >= g_data["gameOptions"].endminute and not g_data["finished"] then
|
||||
outputChatBox("* #ffffffThe Christmas Competition has now ended! Thanks to all those who took part #ff0000*", root, 255,0,0, true)
|
||||
--outputChatBox("* #ffffffThe Top 5 will be contacted shortly about the prizes #ff0000*", root, 255,0,0, true)
|
||||
g_data["finished"] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- check if it's event time
|
||||
if hour >= g_data["gameOptions"].eventstart and hour < (g_data["gameOptions"].eventstart+g_data["gameOptions"].eventduration) then
|
||||
if g_data["event"] == false then
|
||||
outputDebugString("[xmas]: Event started.")
|
||||
outputChatBox("* #ffffffThe Christmas Competition has started for "..g_data["gameOptions"].eventduration.." hours. Collect as many presents as possible #ff0000*", root, 255,0,0, true)
|
||||
end
|
||||
g_data["event"] = true
|
||||
else
|
||||
if g_data["event"] then
|
||||
outputDebugString("[xmas]: Event ended.")
|
||||
outputChatBox("* #ffffffThe Christmas Competition has ended for today. #ff0000*", root, 255,0,0, true)
|
||||
end
|
||||
g_data["event"] = false
|
||||
end
|
||||
|
||||
-- check if it's about to be event time
|
||||
if hour == (g_data["gameOptions"].eventstart-1) and minute == 55 then
|
||||
outputChatBox("* #ffffffThe Christmas Competition will start in 5 minutes #ff0000*", root, 255,0,0, true)
|
||||
end
|
||||
|
||||
end
|
||||
setTimer(checkTime, 50000, 0)
|
||||
|
||||
function updateTop(player)
|
||||
if player then
|
||||
outputChatBox(" * #ffffff" ..player.name.. "#ffffff updated the top 3", root,255,0,0,true)
|
||||
end
|
||||
g_data["leaders"] = {}
|
||||
|
||||
local result = executeSQLQuery([[
|
||||
SELECT `name`, `presents`
|
||||
FROM `xmas`
|
||||
WHERE `presents`>0
|
||||
ORDER BY `presents` DESC
|
||||
LIMIT 10]])
|
||||
|
||||
for i,v in ipairs(result) do
|
||||
local prez = v.presents
|
||||
local name = v.name
|
||||
table.insert(g_data["leaders"], {name, prez})
|
||||
end
|
||||
triggerClientEvent("updateTables", resourceRoot, g_data["leaders"])
|
||||
end
|
||||
|
||||
function showTop()
|
||||
outputChatBox("** #ffffffChristmas Event Top 3 #ff0000**", root, 255,0,0,true)
|
||||
outputChatBox(" ")
|
||||
for i, v in ipairs(g_data["leaders"]) do
|
||||
if v[1] and i < 11 then
|
||||
outputChatBox(i .. ". #ffffff" .. v[1] .. " - #ff0000" ..v[2], root, 255,0,0,true)
|
||||
end
|
||||
end
|
||||
outputChatBox("** #ffffffEnds 1st January 2021 #ff0000**", root, 255,0,0,true)
|
||||
end
|
||||
100
s_utils.lua
Normal file
100
s_utils.lua
Normal file
@@ -0,0 +1,100 @@
|
||||
-- get string or default
|
||||
function getString(var,default)
|
||||
local result = get(var)
|
||||
if not result then
|
||||
return default
|
||||
end
|
||||
return tostring(result)
|
||||
end
|
||||
|
||||
-- get number or default
|
||||
function getNumber(var,default)
|
||||
local result = get(var)
|
||||
if not result then
|
||||
return default
|
||||
end
|
||||
return tonumber(result)
|
||||
end
|
||||
|
||||
-- get true or false or default
|
||||
function getBool(var,default)
|
||||
local result = get(var)
|
||||
if not result then
|
||||
return default
|
||||
end
|
||||
return result == 'true'
|
||||
end
|
||||
|
||||
function isElementVisible(e)
|
||||
local res = false
|
||||
if e.interior == 0 and e.dimension == 0 and e.alpha == 255 and e.scale == 1.0 then
|
||||
res = true
|
||||
end
|
||||
|
||||
return res
|
||||
end
|
||||
|
||||
function isElementFlat(e)
|
||||
local ret = false
|
||||
local tol = 0.1
|
||||
if not e then return ret end
|
||||
local v = e.rotation
|
||||
if e.model == 7657 then
|
||||
if (v.x < 270+tol and v.x > 270-tol) and (v.y < tol and v.y > -tol) then
|
||||
ret = true
|
||||
end
|
||||
else
|
||||
if (v.y < tol and v.y > -tol) and (v.x < tol and v.x > -tol) then
|
||||
ret = true
|
||||
end
|
||||
end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
function getModelOffset(m)
|
||||
local offset = Vector3(0.0, 0.0, 0.0)
|
||||
local randX, randY = 0.0, 0.0
|
||||
if m.model == 3458 or m.model == 8558 or m.model == 8838 then
|
||||
randX = math.random(-9,9) + math.random()
|
||||
randY = math.random(-1,1) + math.random()
|
||||
offset.z = 1.6
|
||||
elseif m.model == 8947 then
|
||||
randX = math.random(-2,2) + math.random()
|
||||
randY = math.random(-6,6) + math.random()
|
||||
offset.z = 3.25
|
||||
elseif m.model == 6959 then
|
||||
randX = math.random(-7,7) + math.random()
|
||||
randY = math.random(-7,7) + math.random()
|
||||
elseif m.model == 18450 then
|
||||
randX = math.random(-24,24) + math.random()
|
||||
randY = math.random(-4,4) + math.random()
|
||||
offset.z = 0.5
|
||||
elseif m.model == 7657 then
|
||||
randX = math.random(-4,4) + math.random()
|
||||
randY = math.random()
|
||||
offset.z = 0.15
|
||||
elseif m.model == 9623 then
|
||||
randX = math.random(-9,9) + math.random()
|
||||
randY = math.random(-2,2) + math.random()
|
||||
offset.z = 3.0
|
||||
elseif m.model == 13649 then
|
||||
offset.z = 0.7
|
||||
elseif m.model == 3095 then
|
||||
randX = math.random(-2,2) + math.random()
|
||||
randY = math.random(-2,2) + math.random()
|
||||
offset.z = 0.6
|
||||
elseif m.model == 1482 then
|
||||
randX = math.random()
|
||||
randY = math.random(-2,2) + math.random()
|
||||
offset.z = 1.5
|
||||
elseif m.model == 12857 then
|
||||
randX = math.random(-3,3) + math.random()
|
||||
randY = math.random(-17,17) + math.random()
|
||||
offset.z = 2.6
|
||||
end
|
||||
offset.x = math.cos(math.rad(m.rotation.z))*randX + math.sin(math.rad(m.rotation.z))*randY
|
||||
offset.y = math.sin(math.rad(m.rotation.z))*randX - math.cos(math.rad(m.rotation.z))*randY
|
||||
|
||||
return offset
|
||||
end
|
||||
Reference in New Issue
Block a user