Countdown
But if it was static, how would it know what world to count ticks against?
Reply
Thanks given by:
(01-17-2014, 03:59 AM)STR_Warrior Wrote: Maybe it's static? then you have to use: cWorld:ScheduleTask
Also 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.
Reply
Thanks given by:
The ScheduleTask has not yet been exported, I'm doing it now.
Reply
Thanks given by:
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
[14:33:13] Stack trace:
[14:33:13]   [C](-1): (no name)
[14:33:13]   [C](-1): ScheduleTask
[14:33:13]   Plugins/SurvivalGames/onplayerspawn.lua(34): (no name)
[14:33:13] Stack trace end
[14:33:13] Error in plugin SurvivalGames calling function <callback>()

I use the newest MCServer Version.
Reply
Thanks given by:
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.
Reply
Thanks given by:
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
Reply
Thanks given by:
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.
Reply
Thanks given by:
Thanks, this code looks very better Smile.

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);
Reply
Thanks given by:
The SendMessage function expects a string as its parameter, and you are giving it a number.
Reply
Thanks given by:
(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?
Reply
Thanks given by:




Users browsing this thread: 2 Guest(s)