Countdown - Printable Version +- Cuberite Forum (https://forum.cuberite.org) +-- Forum: Plugins (https://forum.cuberite.org/forum-1.html) +--- Forum: Plugin Discussion (https://forum.cuberite.org/forum-8.html) +--- Thread: Countdown (/thread-1314.html) |
RE: Countdown - bearbin - 01-17-2014 But if it was static, how would it know what world to count ticks against? RE: Countdown - daniel0916 - 01-17-2014 (01-17-2014, 03:59 AM)STR_Warrior Wrote: Maybe it's static? then you have to use: cWorld:ScheduleTaskAlso don't work. (01-17-2014, 04:00 AM)bearbin Wrote: But if it was static, how would it know what world to count ticks against?right. RE: Countdown - xoft - 01-17-2014 The ScheduleTask has not yet been exported, I'm doing it now. RE: Countdown - daniel0916 - 01-17-2014 cRoot:Get():GetWorld("world"):ScheduleTask(LobbyCountDown(I), (COUNT_TO - I) * 20); function LobbyCountDown(Time) Error: Code: [14:33:13] LUA: Plugins/SurvivalGames/onplayerspawn.lua:34: Error in function call 'ScheduleTask': Expected a function for parameter #1 I use the newest MCServer Version. RE: Countdown - xoft - 01-17-2014 You need to first define the function, and only then use it. Since you're probably trying to make a closure, too, post a more complete code snippet. RE: Countdown - daniel0916 - 01-18-2014 local COUNT_TO = 60; for I=COUNT_TO, 0, -1 do -- Countdown --AddLobbySchedule(LobbyCountDown, {I}, (COUNT_TO - I) * 20); cRoot:Get():GetWorld("world"):ScheduleTask(LobbyCountDown(I), (COUNT_TO - I) * 20); end function LobbyCountDown(Time) cRoot:Get():ForEachPlayer(function(Player) Player:DeltaExperience(-(cPlayer:XpForLevel(Player:GetXpLevel()) - cPlayer:XpForLevel(Player:GetXpLevel() - 1))); end) if (Time == 60) then cRoot:Get():ForEachPlayer(function(Player) Player:DeltaExperience(-Player:GetXpLevel()); Player:DeltaExperience(cPlayer:XpForLevel(60)); end) cRoot:Get():BroadcastChat(Time); elseif (Time == 50) then cRoot:Get():BroadcastChat(Time); elseif (Time == 40) then cRoot:Get():BroadcastChat(Time); elseif (Time == 30) then cRoot:Get():BroadcastChat(Time); elseif (Time == 20) then cRoot:Get():BroadcastChat(Time); elseif (Time == 15) then cRoot:Get():ForEachPlayer(function(Player) Player:GetInventory():Clear(); Player:GetInventory():SetHotbarSlot(8, cItem(E_ITEM_FIRE_CHARGE)); end) --cRoot:Get():BroadcastChat("The Voting has ended!"); --cRoot:Get():BroadcastChat("Map: " .. map); elseif (Time == 10) then cRoot:Get():BroadcastChat(Time); elseif (Time == 9) then cRoot:Get():BroadcastChat(Time); elseif (Time == 8) then cRoot:Get():BroadcastChat(Time); elseif (Time == 7) then cRoot:Get():BroadcastChat(Time); elseif (Time == 6) then cRoot:Get():BroadcastChat(Time); elseif (Time == 5) then cRoot:Get():BroadcastChat(Time); elseif (Time == 4) then cRoot:Get():BroadcastChat(Time); elseif (Time == 3) then cRoot:Get():BroadcastChat(Time); elseif (Time == 2) then cRoot:Get():BroadcastChat(Time); elseif (Time == 1) then cRoot:Get():BroadcastChat(Time); elseif (Time == 0) then cRoot:Get():BroadcastChat(Time); local onlineplayers = cRoot:Get():GetServer():GetNumPlayers(); if (onlineplayers >= 0) then gamerunning = "yes"; cRoot:Get():ForEachPlayer(function(Player) --Player:DeltaExperience(-Player:GetXpLevel()); Player:GetInventory():Clear(); Player:SetGameMode(0); --Player:MoveToWorld(map); --Teleport player to right coords... --Player:TeleportToCoords(48, 4, 283); local COUNT_TO = 30; for I=COUNT_TO, 0, -1 do -- Countdown --AddStartSchedule(StartCountDown, {I}, (COUNT_TO - I) * 20); cRoot:Get():GetWorld("world").ScheduleTask(StartCountDown(I), (COUNT_TO - I) * 20); end end) else cRoot:Get():BroadcastChat("Game don't start. Too few players!"); end end end RE: Countdown - xoft - 01-18-2014 Well, what a mess... local World = cRoot:Get():GetWorld("world") local GameStartSecond = 60 -- Number of seconds till the game start local GameStartTick = GameStartSecond * 20 -- Set up timed messages until the game start: local AnnouncedSecods = {60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2} -- When to broadcast for idx, Second in ipairs(AnnouncedSeconds) do World:ScheduleTask( function (a_World) a_World:BroadcastChat("Time till game start: " .. Second .. " seconds") end, GameStartTick - Second * 20 ) end -- One last message to schedule, due to message text change: World:ScheduleTask( function (a_World) a_World:BroadcastChat("Time till game start: 1 second"); end, GameStartTick - 20 -- 1 second before game start ) -- Schedule the Voting end: World:ScheduleTask( function (a_World) -- a_World:BroadcastChat("The Voting has ended!"); a_World:ForEachPlayer( function(Player) Player:GetInventory():Clear(); Player:GetInventory():SetHotbarSlot(8, cItem(E_ITEM_FIRE_CHARGE)); end ) end, GameStartTick - 15 * 20 -- 15 seconds before game start ) -- Schedule the game start: World:ScheduleTask( function (a_World) -- TODO: Start the game end, GameStartTick ) Note that this was written off memory, so it may contain errors. RE: Countdown - daniel0916 - 01-18-2014 Thanks, this code looks very better . Edit: I think i found the mistake. You writed AnnouncedSecods and not AnnouncedSeconds.. Edit2: Okay, now it comes no error but the schedule isn't starting.. i will see if i can fix it. Edit3: What is here false? I will try something with mcserver code. Code: a_Player->SendMessage(a_Item.m_ItemType); RE: Countdown - xoft - 01-18-2014 The SendMessage function expects a string as its parameter, and you are giving it a number. RE: Countdown - daniel0916 - 01-18-2014 (01-18-2014, 08:10 AM)xoft Wrote: The SendMessage function expects a string as its parameter, and you are giving it a number. Oh, thanks. What program are you using for mcserver programming? And can i start mcserver from them? without compiling? Edit: Should i download Visual C++ 2013 or 2008? |