01-17-2014, 04:00 AM
01-17-2014, 04:07 AM
01-17-2014, 04:49 AM
The ScheduleTask has not yet been exported, I'm doing it now.
01-17-2014, 11:35 PM
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.
01-17-2014, 11:59 PM
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.
Since you're probably trying to make a closure, too, post a more complete code snippet.
01-18-2014, 12:07 AM
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
end01-18-2014, 01:00 AM
Well, what a mess...
Note that this was written off memory, so it may contain errors.
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.
01-18-2014, 02:40 AM
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.
.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);01-18-2014, 08:10 AM
The SendMessage function expects a string as its parameter, and you are giving it a number.
01-18-2014, 07:28 PM
(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?