From e7ea352f41b867dad83d170b7382b22a46f25c49 Mon Sep 17 00:00:00 2001 From: faketruth Date: Tue, 14 Feb 2012 19:14:23 +0000 Subject: Got rid of cWorld::GetAllPlayers() and implemented ForEachPlayer() more or less in Lua Core now uses ForEachPlayer() to interact with connected players git-svn-id: http://mc-server.googlecode.com/svn/trunk@260 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- Plugins/Core/onblockplace.lua | 69 ++++++++++++++++++++--------------------- Plugins/Core/playerlist.lua | 20 ++++++------ Plugins/Core/web_playerlist.lua | 26 ++++++++++------ 3 files changed, 61 insertions(+), 54 deletions(-) (limited to 'Plugins/Core') diff --git a/Plugins/Core/onblockplace.lua b/Plugins/Core/onblockplace.lua index ba75bf5c2..45d9a082e 100644 --- a/Plugins/Core/onblockplace.lua +++ b/Plugins/Core/onblockplace.lua @@ -1,3 +1,5 @@ +local BlockData = {} + function OnBlockPlace( Block, Player ) -- dont check if the direction is in the air @@ -11,50 +13,47 @@ function OnBlockPlace( Block, Player ) return true end - local collision = false - local World = Player:GetWorld() - local PlayerList = World:GetAllPlayers() - - -- check if a player occupies the placement location - for i, Player in ipairs( PlayerList ) do - - -- drop the decimals, we only care about the full block X,Y,Z - local PlayerX = math.floor(Player:GetPosX(), 0) - local PlayerY = math.floor(Player:GetPosY(), 0) - local PlayerZ = math.floor(Player:GetPosZ(), 0) - - local BlockX = Block.m_PosX - local BlockY = Block.m_PosY - local BlockZ = Block.m_PosZ + BlockData = Block + if( Player:GetWorld():ForEachPlayer( CheckCollision ) == false ) then + return true + else + return false + end - -- player height is 2 blocks, so we check the position and then offset it up one - -- so they can't place a block on there face + end - if Block.m_Direction == 0 then if PlayerY == BlockY-2 and PlayerX == BlockX and PlayerZ == BlockZ then collision = true end end - if Block.m_Direction == 1 then if PlayerY == BlockY+1 and PlayerX == BlockX and PlayerZ == BlockZ then collision = true end end + return false - if Block.m_Direction == 2 then if PlayerY == BlockY and PlayerX == BlockX and PlayerZ == BlockZ-1 then collision = true end end - if Block.m_Direction == 2 then if PlayerY+1 == BlockY and PlayerX == BlockX and PlayerZ == BlockZ-1 then collision = true end end +end - if Block.m_Direction == 3 then if PlayerY == BlockY and PlayerX == BlockX and PlayerZ == BlockZ+1 then collision = true end end - if Block.m_Direction == 3 then if PlayerY+1 == BlockY and PlayerX == BlockX and PlayerZ == BlockZ+1 then collision = true end end +function CheckCollision( Player ) + -- drop the decimals, we only care about the full block X,Y,Z + local PlayerX = math.floor(Player:GetPosX(), 0) + local PlayerY = math.floor(Player:GetPosY(), 0) + local PlayerZ = math.floor(Player:GetPosZ(), 0) - if Block.m_Direction == 4 then if PlayerY == BlockY and PlayerX == BlockX-1 and PlayerZ == BlockZ then collision = true end end - if Block.m_Direction == 4 then if PlayerY+1 == BlockY and PlayerX == BlockX-1 and PlayerZ == BlockZ then collision = true end end + local BlockX = BlockData.m_PosX + local BlockY = BlockData.m_PosY + local BlockZ = BlockData.m_PosZ - if Block.m_Direction == 5 then if PlayerY == BlockY and PlayerX == BlockX+1 and PlayerZ == BlockZ then collision = true end end - if Block.m_Direction == 5 then if PlayerY+1 == BlockY and PlayerX == BlockX+1 and PlayerZ == BlockZ then collision = true end end + -- player height is 2 blocks, so we check the position and then offset it up one + -- so they can't place a block on there face - end + local collision = false + if BlockData.m_Direction == 0 then if PlayerY == BlockY-2 and PlayerX == BlockX and PlayerZ == BlockZ then collision = true end end + if BlockData.m_Direction == 1 then if PlayerY == BlockY+1 and PlayerX == BlockX and PlayerZ == BlockZ then collision = true end end - if collision then - return true - else - return false - end + if BlockData.m_Direction == 2 then if PlayerY == BlockY and PlayerX == BlockX and PlayerZ == BlockZ-1 then collision = true end end + if BlockData.m_Direction == 2 then if PlayerY+1 == BlockY and PlayerX == BlockX and PlayerZ == BlockZ-1 then collision = true end end - end + if BlockData.m_Direction == 3 then if PlayerY == BlockY and PlayerX == BlockX and PlayerZ == BlockZ+1 then collision = true end end + if BlockData.m_Direction == 3 then if PlayerY+1 == BlockY and PlayerX == BlockX and PlayerZ == BlockZ+1 then collision = true end end - return false + if BlockData.m_Direction == 4 then if PlayerY == BlockY and PlayerX == BlockX-1 and PlayerZ == BlockZ then collision = true end end + if BlockData.m_Direction == 4 then if PlayerY+1 == BlockY and PlayerX == BlockX-1 and PlayerZ == BlockZ then collision = true end end + if BlockData.m_Direction == 5 then if PlayerY == BlockY and PlayerX == BlockX+1 and PlayerZ == BlockZ then collision = true end end + if BlockData.m_Direction == 5 then if PlayerY+1 == BlockY and PlayerX == BlockX+1 and PlayerZ == BlockZ then collision = true end end + + return collision end \ No newline at end of file diff --git a/Plugins/Core/playerlist.lua b/Plugins/Core/playerlist.lua index c120f068f..63990e825 100644 --- a/Plugins/Core/playerlist.lua +++ b/Plugins/Core/playerlist.lua @@ -1,16 +1,16 @@ +local PlayerTable = {} + function HandlePlayerListCommand( Split, Player ) - local World = Player:GetWorld() - local PlayerList = World:GetAllPlayers() + PlayerTable = {} + Player:GetWorld():ForEachPlayer( AppendToTable ) - local Message = cChatColor.Green .. "Connected players: (".. cChatColor.White.. #PlayerList .. cChatColor.Green .. ")" + local Message = cChatColor.Green .. "Connected players: (".. cChatColor.White.. #PlayerTable .. cChatColor.Green .. ")" Player:SendMessage( Message ) - - local PlayerTable = {} - for i, TempPlayer in ipairs( PlayerList ) do - local PlayerName = TempPlayer:GetName() - table.insert(PlayerTable, PlayerName ) - end - + Player:SendMessage( table.concat(PlayerTable, " ") ) return true +end + +function AppendToTable( Player ) + table.insert(PlayerTable, Player:GetName() ) end \ No newline at end of file diff --git a/Plugins/Core/web_playerlist.lua b/Plugins/Core/web_playerlist.lua index 6c736ce3c..62ccb1d44 100644 --- a/Plugins/Core/web_playerlist.lua +++ b/Plugins/Core/web_playerlist.lua @@ -1,3 +1,6 @@ +local PlayerHTML = "" +local PlayerNum = 0 + function HandleRequest_PlayerList( Request ) local World = cRoot:Get():GetWorld() local Content = "" @@ -16,20 +19,25 @@ function HandleRequest_PlayerList( Request ) Content = Content .. "

Connected Players: " .. World:GetNumPlayers() .. "

" Content = Content .. "" + PlayerNum = 0 + PlayerHTML = "" + World:ForEachPlayer( CreatePlayerList ) - local PlayerList = World:GetAllPlayers() - if( #PlayerList > 0 ) then - for i, Player in ipairs( PlayerList ) do - Content = Content .. "" - Content = Content .. "" - Content = Content .. "" - Content = Content .. "" - Content = Content .. "" - end + if( PlayerHTML ~= "" ) then + Content = Content .. PlayerHTML else Content = Content .. "" end Content = Content .. "
" .. i .. "." .. Player:GetName() .. "Kick
None
" Content = Content .. "
" return Content +end + +function CreatePlayerList( Player, Data ) + PlayerNum = PlayerNum + 1 + PlayerHTML = PlayerHTML .. "" + PlayerHTML = PlayerHTML .. "" .. PlayerNum .. "." + PlayerHTML = PlayerHTML .. "" .. Player:GetName() .. "" + PlayerHTML = PlayerHTML .. "Kick" + PlayerHTML = PlayerHTML .. "" end \ No newline at end of file -- cgit v1.2.3