diff options
Diffstat (limited to 'MCServer/Plugins')
-rw-r--r-- | MCServer/Plugins/ChatLog/plugin.lua | 31 | ||||
-rw-r--r-- | MCServer/Plugins/ChunkWorx/ChunkWorx.deproj | 9 | ||||
-rw-r--r-- | MCServer/Plugins/ChunkWorx/chunkworx_main.lua | 128 | ||||
-rw-r--r-- | MCServer/Plugins/ChunkWorx/chunkworx_web.lua | 274 | ||||
m--------- | MCServer/Plugins/Core | 0 | ||||
-rw-r--r-- | MCServer/Plugins/Debuggers/Debuggers.lua | 19 | ||||
-rw-r--r-- | MCServer/Plugins/Handy/handy.lua | 28 | ||||
-rw-r--r-- | MCServer/Plugins/Handy/handy_functions.lua | 216 | ||||
-rw-r--r-- | MCServer/Plugins/InfoDump.lua | 431 | ||||
-rw-r--r-- | MCServer/Plugins/MagicCarpet/objects.lua | 97 | ||||
-rw-r--r-- | MCServer/Plugins/MagicCarpet/plugin.lua | 81 |
11 files changed, 248 insertions, 1066 deletions
diff --git a/MCServer/Plugins/ChatLog/plugin.lua b/MCServer/Plugins/ChatLog/plugin.lua deleted file mode 100644 index adbf986e0..000000000 --- a/MCServer/Plugins/ChatLog/plugin.lua +++ /dev/null @@ -1,31 +0,0 @@ - --- plugin.lua - --- Implements the main entrypoint for the plugin, as well as all the handling needed - --- ChatLog plugin logs all chat messages into the server log - - - - - -function Initialize(Plugin) - Plugin:SetName("ChatLog") - Plugin:SetVersion(3) - - cPluginManager.AddHook(cPluginManager.HOOK_CHAT, OnChat) - - LOG("Initialized " .. Plugin:GetName() .. " v." .. Plugin:GetVersion()) - return true -end - - - - - -function OnChat(Player, Message) - -- Lets get loggin' - LOGINFO("[" .. Player:GetName() .. "]: " .. StripColorCodes(Message)); - - return false -end
\ No newline at end of file diff --git a/MCServer/Plugins/ChunkWorx/ChunkWorx.deproj b/MCServer/Plugins/ChunkWorx/ChunkWorx.deproj deleted file mode 100644 index 17420d1d7..000000000 --- a/MCServer/Plugins/ChunkWorx/ChunkWorx.deproj +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<project> - <file> - <filename>chunkworx_main.lua</filename> - </file> - <file> - <filename>chunkworx_web.lua</filename> - </file> -</project> diff --git a/MCServer/Plugins/ChunkWorx/chunkworx_main.lua b/MCServer/Plugins/ChunkWorx/chunkworx_main.lua deleted file mode 100644 index 88ecb3979..000000000 --- a/MCServer/Plugins/ChunkWorx/chunkworx_main.lua +++ /dev/null @@ -1,128 +0,0 @@ --- Global variables -PLUGIN = {} -- Reference to own plugin object -GENERATION_STATE = 0 -OPERATION_CODE = 0 -- 0 = generation -CX = 0 -CZ = 0 -CURRENT = 0 -TOTAL = 0 - --- AREA Variables -AreaStartX = -10 -AreaStartZ = -10 -AreaEndX = 10 -AreaEndZ = 10 - --- RADIAL Variables -RadialX = 0 -RadialZ = 0 -Radius = 10 - --- WORLD -WORK_WORLD = cRoot:Get():GetDefaultWorld():GetName() -WW_instance = cRoot:Get():GetDefaultWorld() -WORLDS = {} - - - - - -function Initialize(Plugin) - PLUGIN = Plugin - - PLUGIN:SetName("ChunkWorx") - PLUGIN:SetVersion(6) - - cPluginManager.AddHook(cPluginManager.HOOK_TICK, OnTick) - - Plugin:AddWebTab("(Re)Generation", HandleRequest_Generation) - - GENERATION_STATE = 0 - WW_instance = cRoot:Get():GetWorld(WORK_WORLD) - if (WW_instance == nil) then - LOG("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": NO WORLD found :(") - end - - -- Read the stored values: - local SettingsIni = cIniFile(); - SettingsIni:ReadFile("ChunkWorx.ini"); -- ignore any read errors - AreaStartX = SettingsIni:GetValueSetI("Area data", "StartX", AreaStartX) - AreaStartZ = SettingsIni:GetValueSetI("Area data", "StartZ", AreaStartZ) - AreaEndX = SettingsIni:GetValueSetI("Area data", "EndX", AreaEndX) - AreaEndZ = SettingsIni:GetValueSetI("Area data", "EndZ", AreaEndZ) - RadialX = SettingsIni:GetValueSetI("Radial data", "RadialX", RadialX) - RadialZ = SettingsIni:GetValueSetI("Radial data", "RadialZ", RadialZ) - Radius = SettingsIni:GetValueSetI("Radial data", "Radius", Radius) - SettingsIni:WriteFile("ChunkWorx.ini"); - - LOG("Initialized " .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion()) - return true -end - - - - - -function OnTick( DeltaTime ) - if (GENERATION_STATE == 1 or GENERATION_STATE == 3) then - LOGINFO("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": works STARTED!") - LOGINFO("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": At world: " .. WORK_WORLD) - WW_instance = cRoot:Get():GetWorld(WORK_WORLD) - if (GENERATION_STATE == 1) then GENERATION_STATE = 2 end - if (GENERATION_STATE == 3) then GENERATION_STATE = 4 end - - -- Changing in case coordinates are flipped - local shifter = AreaEndX - if (AreaStartX > AreaEndX) then - AreaEndX = AreaStartX - AreaStartX = shifter - end - shifter = AreaEndZ - if (AreaStartZ > AreaEndZ) then - AreaEndZ = AreaStartZ - AreaStartZ = shifter - end - - CX = AreaStartX - CZ = AreaStartZ - CURRENT = 0 - - if (WW_instance == nil) then - LOGERROR("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": works ABORTED") - LOGERROR("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": NO WORLD found :(") - GENERATION_STATE = 0 - end - end - - - - if (GENERATION_STATE == 2 or GENERATION_STATE == 4) then - if (WW_instance:GetGeneratorQueueLength() < 200 - and WW_instance:GetLightingQueueLength() < 200 - and (WW_instance:GetStorageSaveQueueLength() + WW_instance:GetStorageLoadQueueLength()) < 80) then - local chunk_sum = (1+ AreaEndX - AreaStartX) * (1+ AreaEndZ - AreaStartZ) - TOTAL = chunk_sum - LOG("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": PROCESSING 100 chunks, (" .. CURRENT .. "/" .. chunk_sum .. ")") - for C = 1, 100 do - if (GENERATION_STATE == 2) then WW_instance:GenerateChunk(CX, CZ) end - if (GENERATION_STATE == 4) then WW_instance:RegenerateChunk(CX, CZ) end - - CX = CX + 1 - CURRENT = CURRENT + 1 - if (CX > AreaEndX) then - CX = AreaStartX - CZ = CZ + 1 - if (CZ > AreaEndZ) then - if (GENERATION_STATE == 2) then LOGINFO("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. " - generation ENDED!") end - if (GENERATION_STATE == 4) then LOGINFO("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. " - REgeneration ENDED!") end - - GENERATION_STATE = 0 - break - end - end - end - WW_instance:QueueSaveAllChunks() - WW_instance:QueueUnloadUnusedChunks() - end - end -end
\ No newline at end of file diff --git a/MCServer/Plugins/ChunkWorx/chunkworx_web.lua b/MCServer/Plugins/ChunkWorx/chunkworx_web.lua deleted file mode 100644 index 9aec38b12..000000000 --- a/MCServer/Plugins/ChunkWorx/chunkworx_web.lua +++ /dev/null @@ -1,274 +0,0 @@ - --- chunkworx_web.lua - --- WebAdmin-related functions - - - - - -local function Buttons_Player( Name ) - return "<form method='POST'><input type='hidden' name='PlayerName' value='"..Name.."'><input type='submit' name='PlayerExact' value='Exact'><input type='submit' name='Player3x3' value='3x3'></form>" -end - - - - - -local function Button_World( Name ) - return "<form method='POST'><input type='hidden' name='WorldName' value='"..Name.."'><input type='submit' name='SelectWorld' value='Select'></form>" -end - - - - - -local function SaveSettings() - local SettingsIni = cIniFile() - SettingsIni:SetValueI("Area data", "StartX", AreaStartX) - SettingsIni:SetValueI("Area data", "StartZ", AreaStartZ) - SettingsIni:SetValueI("Area data", "EndX", AreaEndX) - SettingsIni:SetValueI("Area data", "EndZ", AreaEndZ) - SettingsIni:SetValueI("Radial data", "RadialX", RadialX) - SettingsIni:SetValueI("Radial data", "RadialZ", RadialZ) - SettingsIni:SetValueI("Radial data", "Radius", Radius) - SettingsIni:WriteFile("ChunkWorx.ini") -end - - - - - -function HandleRequest_Generation( Request ) - local Content = "" - if (Request.PostParams["AGHRRRR"] ~= nil) then - GENERATION_STATE = 0 - WW_instance:QueueSaveAllChunks() - WW_instance:QueueUnloadUnusedChunks() - LOGERROR("" .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. ": works ABORTED by admin") - end - --Content = Content .. "<head><meta http-equiv=\"refresh\" content=\"2;\"></head>" - -- PROCESSING - -------------------------------------------------------------------------------------------------- - local function ProcessingContent() - local _small_content = "" - _small_content = _small_content .. "<head><meta http-equiv=\"refresh\" content=\"2;\"></head>" - _small_content = _small_content .. "<h4>World for operations:</h4>"..WORK_WORLD - if (OPERATION_CODE == 0) then - _small_content = _small_content .. "<h4>Operation:</h4>Generation" - elseif (OPERATION_CODE == 1) then - _small_content = _small_content .. "<h4>Operation:</h4>Regeneration" - end - _small_content = _small_content .. "<h4>Area: </h4>["..AreaStartX..":"..AreaStartZ.."] ["..AreaEndX..":"..AreaEndZ.."]" - _small_content = _small_content .. "<h4>Progress:</h4>"..CURRENT.."/"..TOTAL - _small_content = _small_content .. "<br>" - _small_content = _small_content .. "<form method='POST'>" - _small_content = _small_content .. "<input type='submit' name='AGHRRRR' value='Stop'>" - _small_content = _small_content .. "</form>" - return _small_content - end - if (GENERATION_STATE == 2 or GENERATION_STATE == 4) then - Content = ProcessingContent() - return Content - end - -- SELECTING - -------------------------------------------------------------------------------------------------- - if ( Request.PostParams["FormSetWorld"] ) then - WORK_WORLD = Request.PostParams["FormWorldName"] - WW_instance = cRoot:Get():GetWorld(WORK_WORLD) - end - - if( Request.PostParams["SelectWorld"] ~= nil - and Request.PostParams["WorldName"] ~= nil ) then -- World is selected! - WORK_WORLD = Request.PostParams["WorldName"] - WW_instance = cRoot:Get():GetWorld(WORK_WORLD) - end - - if(Request.PostParams["OperationGenerate"] ~= nil) then - OPERATION_CODE = 0 - end - if(Request.PostParams["OperationReGenerate"] ~= nil) then - OPERATION_CODE = 1 - end - - if (GENERATION_STATE == 0) then - if( Request.PostParams["FormAreaStartX"] ~= nil - and Request.PostParams["FormAreaStartZ"] ~= nil - and Request.PostParams["FormAreaEndX"] ~= nil - and Request.PostParams["FormAreaEndZ"] ~= nil ) then --(Re)Generation valid! - -- COMMON (Re)gen - if( Request.PostParams["StartArea"]) then - AreaStartX = tonumber(Request.PostParams["FormAreaStartX"]) - AreaStartZ = tonumber(Request.PostParams["FormAreaStartZ"]) - AreaEndX = tonumber(Request.PostParams["FormAreaEndX"]) - AreaEndZ = tonumber(Request.PostParams["FormAreaEndZ"]) - SaveSettings(); - if (OPERATION_CODE == 0) then - GENERATION_STATE = 1 - elseif (OPERATION_CODE == 1) then - GENERATION_STATE = 3 - end - Content = ProcessingContent() - return Content - end - end - if( Request.PostParams["FormRadialX"] ~= nil - and Request.PostParams["FormRadialZ"] ~= nil - and Request.PostParams["FormRadius"] ~= nil ) then --(Re)Generation valid! - -- COMMON (Re)gen - if( Request.PostParams["StartRadial"]) then - RadialX = tonumber(Request.PostParams["FormRadialX"]) or 0 - RadialZ = tonumber(Request.PostParams["FormRadialZ"]) or 0 - Radius = tonumber(Request.PostParams["FormRadius"]) or 10 - AreaStartX = RadialX - Radius - AreaStartZ = RadialZ - Radius - AreaEndX = RadialX + Radius - AreaEndZ = RadialZ + Radius - SaveSettings() - if (OPERATION_CODE == 0) then - GENERATION_STATE = 1 - elseif (OPERATION_CODE == 1) then - GENERATION_STATE = 3 - end - Content = ProcessingContent() - return Content - end - end - -- POINT REGEN! - if( Request.PostParams["FormPointX"] ~= nil - and Request.PostParams["FormPointZ"] ~= nil ) then --ReGeneration valid! - -- EXACT - if ( Request.PostParams["PointExact"] ~= nil) then - AreaStartX = tonumber(Request.PostParams["FormPointX"]) - AreaStartZ = tonumber(Request.PostParams["FormPointZ"]) - AreaEndX = AreaStartX - AreaEndZ = AreaStartZ - GENERATION_STATE = 3 - Content = ProcessingContent() - return Content - end - -- 3x3 - if ( Request.PostParams["Point3x3"] ~= nil) then - AreaStartX = tonumber(Request.PostParams["FormPointX"]) - 1 - AreaStartZ = tonumber(Request.PostParams["FormPointZ"]) - 1 - AreaEndX = AreaStartX + 2 - AreaEndZ = AreaStartZ + 2 - GENERATION_STATE = 3 - Content = ProcessingContent() - return Content - end - end - - local GetAreaByPlayer = function(Player) - -- Player is valid only within this function, it cannot be stord and used later! - AreaStartX = Player:GetChunkX() - AreaStartZ = Player:GetChunkZ() - end - -- PLAYERS REGEN! - if( Request.PostParams["PlayerExact"] ~= nil - and Request.PostParams["PlayerName"] ~= nil ) then -- Making BOOM! I meant, regenereate... - cRoot:Get():GetWorld(WORK_WORLD):DoWithPlayer(Request.PostParams["PlayerName"],GetAreaByPlayer) - AreaEndX = AreaStartX - AreaEndZ = AreaStartZ - GENERATION_STATE = 3 - Content = ProcessingContent() - return Content - end - if( Request.PostParams["Player3x3"] ~= nil - and Request.PostParams["PlayerName"] ~= nil ) then -- Making BOOM! I meant, regenereate... - cRoot:Get():GetWorld(WORK_WORLD):DoWithPlayer(Request.PostParams["PlayerName"],GetAreaByPlayer) - AreaStartX = AreaStartX - 1 - AreaStartZ = AreaStartZ - 1 - AreaEndX = AreaStartX + 2 - AreaEndZ = AreaStartZ + 2 - GENERATION_STATE = 3 - Content = ProcessingContent() - return Content - end - end - - --Content = Content .. "<h4>World for operations: " .. WORK_WORLD .. "</h4>" - --Content = Content .. "<form method='POST'>" - --Content = Content .. "<input type='text' name='FormWorldName' value='Input world name here'><input type='submit' name='FormSetWorld' value='Set world'>" - --Content = Content .. "</form>" - - -- SELECTING WORK_WORLD - Content = Content .. "<h4>World for operations: " .. WORK_WORLD .. "</h4>" - Content = Content .. "<table>" - local WorldNum = 0 - local AddWorldToTable = function(World) - WorldNum = WorldNum + 1 - Content = Content .. "<tr>" - Content = Content .. "<td style='width: 10px;'>" .. WorldNum .. ".</td>" - Content = Content .. "<td>" .. World:GetName() .. "</td>" - Content = Content .. "<td>" .. Button_World(World:GetName()) .. "</td>" - Content = Content .. "</tr>" - end - cRoot:Get():ForEachWorld(AddWorldToTable) - if( WorldNum == 0 ) then - Content = Content .. "<tr><td>No worlds! O_O</td></tr>" - end - Content = Content .. "</table>" - Content = Content .. "<br>" - - -- SELECTING OPERATION - if (OPERATION_CODE == 0) then - Content = Content .. "<h4>Operation: Generation</h4>" - elseif (OPERATION_CODE == 1) then - Content = Content .. "<h4>Operation: Regeneration</h4>" - end - Content = Content .. "<form method='POST'>" - Content = Content .. "<input type='submit' name='OperationGenerate' value='Generation'>" - Content = Content .. "<input type='submit' name='OperationReGenerate' value='Regeneration'>" - Content = Content .. "</form>" - - -- SELECTING AREA - Content = Content .. "<h4>Area: </h4>Start X, Start Z; End X, End Z" - Content = Content .. "<form method='POST'>" - Content = Content .. "<input type='text' name='FormAreaStartX' value='" .. AreaStartX .. "'><input type='text' name='FormAreaStartZ' value='" .. AreaStartZ .. "'>" - Content = Content .. "<input type='text' name='FormAreaEndX' value='" .. AreaEndX .. "'><input type='text' name='FormAreaEndZ' value='" .. AreaEndZ .. "'>" - Content = Content .. "<input type='submit' name='StartArea' value='Start'>" - Content = Content .. "</form>" - - -- SELECTING RADIAL - Content = Content .. "<h4>Radial: </h4>Center X, Center Z, Radius" - Content = Content .. "<form method='POST'>" - Content = Content .. "<input type='text' name='FormRadialX' value='" .. RadialX .. "'><input type='text' name='FormRadialZ' value='" .. RadialZ .. "'><input type='text' name='FormRadius' value='" .. Radius .. "'>" - Content = Content .. "<input type='submit' name='StartRadial' value='Start'>" - Content = Content .. "</form>" - Content = Content .. "<br>" - Content = Content .. "<br>" - Content = Content .. "<br>" - - -- SELECTING POINT - Content = Content .. "<h4>Point regeneration:</h4> X, Z" - Content = Content .. "<form method='POST'>" - Content = Content .. "<input type='text' name='FormPointX' value='0'><input type='text' name='FormPointZ' value='0'>" - Content = Content .. "<input type='submit' name='PointExact' value='Exact'>" - Content = Content .. "<input type='submit' name='Point3x3' value='3x3'>" - Content = Content .. "</form>" - - -- SELECTING PLAYERS - Content = Content .. "<h4>Player-based regeneration:</h4>" - Content = Content .. "<table>" - local PlayerNum = 0 - local AddPlayerToTable = function( Player ) - PlayerNum = PlayerNum + 1 - Content = Content .. "<tr>" - Content = Content .. "<td style='width: 10px;'>" .. PlayerNum .. ".</td>" - Content = Content .. "<td>" .. Player:GetName() .. "</td>" - Content = Content .. "<td>" .. Buttons_Player(Player:GetName()) .. "</td>" - Content = Content .. "</tr>" - end - if (cRoot:Get():GetWorld(WORK_WORLD) == nil) then - Content = Content .. "<tr><td>Incorrect world selection</td></tr>" - else - cRoot:Get():GetWorld(WORK_WORLD):ForEachPlayer( AddPlayerToTable ) - if( PlayerNum == 0 ) then - Content = Content .. "<tr><td>No connected players</td></tr>" - end - end - Content = Content .. "</table>" - Content = Content .. "<br>" - return Content -end
\ No newline at end of file diff --git a/MCServer/Plugins/Core b/MCServer/Plugins/Core -Subproject f8c2531fbef9bfd0b6f024d4d3319384a70a083 +Subproject 3a0e0597b7a24c44bf87ec90beb9be48d0b9970 diff --git a/MCServer/Plugins/Debuggers/Debuggers.lua b/MCServer/Plugins/Debuggers/Debuggers.lua index f66ac76a0..3dcd4ebee 100644 --- a/MCServer/Plugins/Debuggers/Debuggers.lua +++ b/MCServer/Plugins/Debuggers/Debuggers.lua @@ -10,9 +10,6 @@ g_ShowFoodStats = false; -- When true, each player's food stats are sent to the function Initialize(Plugin) - Plugin:SetName("Debuggers") - Plugin:SetVersion(1) - --[[ -- Test multiple hook handlers: cPluginManager.AddHook(cPluginManager.HOOK_TICK, OnTick1); @@ -68,6 +65,8 @@ function Initialize(Plugin) PM:BindCommand("/rmitem", "debuggers", HandleRMItem, "- Remove the specified item from the inventory."); PM:BindCommand("/pickups", "debuggers", HandlePickups, "- Spawns random pickups around you"); PM:BindCommand("/poof", "debuggers", HandlePoof, "- Nudges pickups close to you away from you"); + + PM:BindConsoleCommand("sched", HandleConsoleSchedule, "Tests the world scheduling"); Plugin:AddWebTab("Debuggers", HandleRequest_Debuggers) Plugin:AddWebTab("StressTest", HandleRequest_StressTest) @@ -1630,3 +1629,17 @@ end + +function HandleConsoleSchedule(a_Split) + LOG("Scheduling a task for 2 seconds in the future") + cRoot:Get():GetDefaultWorld():ScheduleTask(40, + function () + LOG("Scheduled function is called.") + end + ) + return true, "Task scheduled" +end + + + + diff --git a/MCServer/Plugins/Handy/handy.lua b/MCServer/Plugins/Handy/handy.lua deleted file mode 100644 index e4e9d3f5f..000000000 --- a/MCServer/Plugins/Handy/handy.lua +++ /dev/null @@ -1,28 +0,0 @@ --- Global variables -PLUGIN = {} -- Reference to own plugin object -CHEST_WIDTH = 9 -HANDY_VERSION = 2 ---[[ - -Handy is a plugin for other plugins. It contain no commands, no hooks, but functions to ease plugins developers' life. - -API: - - -TODO: -1. GetChestSlot wrapper, so it will detect double chest neighbour chest and will be able to access it. -]] - -function Initialize(Plugin) - PLUGIN = Plugin - PLUGIN:SetName("Handy") - PLUGIN:SetVersion(HANDY_VERSION) - - PluginManager = cRoot:Get():GetPluginManager() - LOG("Initialized " .. PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion()) - return true -end - -function OnDisable() - LOG(PLUGIN:GetName() .. " v" .. PLUGIN:GetVersion() .. " is shutting down...") -end
\ No newline at end of file diff --git a/MCServer/Plugins/Handy/handy_functions.lua b/MCServer/Plugins/Handy/handy_functions.lua deleted file mode 100644 index af43f663a..000000000 --- a/MCServer/Plugins/Handy/handy_functions.lua +++ /dev/null @@ -1,216 +0,0 @@ ---[[ -General stuff -]] --- Returns Handy plugin version number -function GetHandyVersion() - return HANDY_VERSION -end --- Checks if handy is in proper version -function CheckForRequiredVersion( inVersion ) - if( inVersion > HANDY_VERSION ) then return false end - return true -end ---[[ -MCS-specific _functions and nasty hacks :D -]] -function GetChestHeightCheat( inChest ) - local chestGrid = inChest:GetContents() - LOGINFO( "This function serves no purpose now! You should consider chest:GetContents():GetHeight() now!" ) - LOGINFO( "Also, you might find Handy's new 'IsChestDouble()' useful for your case" ) - return chestGrid:GetHeight() -end -function IsChestDouble( inChest ) - local chestHeight = inChest:GetContents():GetHeight() - if( chestHeight == 3 ) then - return false - end - return true -end --- Those two checks how many items of given inItemID chest and player have, and how much they could fit inside them -function ReadChestForItem( inChest, inItemID ) - return ReadGridForItems( inChest:GetContents(), inItemID ) -end -function ReadPlayerForItem( inPlayer, inItemID ) - local inventoryFound, inventoryFree = ReadGridForItems( inPlayer:GetInventory():GetInventoryGrid(), inItemID ) - local hotbarFound, hotbarFree = ReadGridForItems( inPlayer:GetInventory():GetHotbarGrid(), inItemID ) - local itemsFound = inventoryFound + hotbarFound - local freeSpace = inventoryFree + hotbarFree - return itemsFound, freeSpace -end --- Following functions are for chest-related operations --- BEWARE! Those assume you did checked if chest has items/space in it! -function ReadGridForItems( inGrid, inItemID ) - local itemsFound = 0 - local freeSpace = 0 - local slotsCount = inGrid:GetNumSlots() - local testerItem = cItem( inItemID ) - local maxStackSize = testerItem:GetMaxStackSize() - for index = 0, (slotsCount - 1) do - slotItem = inGrid:GetSlot( index ) - if( slotItem:IsEmpty() ) then - freeSpace = freeSpace + maxStackSize - else - if( slotItem:IsStackableWith( testerItem ) ) then - itemsFound = itemsFound + slotItem.m_ItemCount - freeSpace = maxStackSize - slotItem.m_ItemCount - end - end - end - return itemsFound, freeSpace -end - -function TakeItemsFromGrid( inGrid, inItem ) - local slotsCount = inGrid:GetNumSlots() - local removedItem = cItem( inItem ) - for index = 0, (slotsCount - 1) do - slotItem = inGrid:GetSlot( index ) - if( slotItem:IsSameType( removedItem ) ) then - if( slotItem.m_ItemCount <= removedItem.m_ItemCount ) then - removedItem.m_ItemCount = removedItem.m_ItemCount - slotItem.m_ItemCount - inGrid:EmptySlot( index ) - else - removedItem.m_ItemCount = slotItem.m_ItemCount - removedItem.m_ItemCount - inGrid:SetSlot( index, removedItem ) - removedItem.m_ItemCount = 0 - end - if( removedItem.m_ItemCount <= 0 ) then break end - end - end - return removedItem.m_ItemCount -end --------------- -function TakeItemsFromChest( inChest, inItemID, inAmount ) -- MIGHT BE UNSAFE! CHECK FOR ITEMS FIRST!! - local chestGrid = inChest:GetContents() - local removedItem = cItem( inItemID, inAmount ) - TakeItemsFromGrid( chestGrid, removedItem ) -end -function PutItemsToChest( inChest, inItemID, inAmount ) - local chestGrid = inChest:GetContents() - local addedItem = cItem( inItemID, inAmount ) - chestGrid:AddItem( addedItem ) -end --- Similar to chest-related. -function TakeItemsFromPlayer( inPlayer, inItemID, inAmount ) -- MIGHT BE UNSAFE! CHECK FIRST! - local removedItem = cItem( inItemID, inAmount ) - local inventoryGrid = inPlayer:GetInventory():GetInventoryGrid() - local hotbarGrid = inPlayer:GetInventory():GetHotbarGrid() - local itemsLeft = TakeItemsFromGrid( inventoryGrid, removedItem ) - if( itemsLeft > 0 ) then - removedItem = cItem( inItemID, itemsLeft ) - TakeItemsFromGrid( hotbarGrid, removedItem ) - end -end -function GiveItemsToPlayer( inPlayer, inItemID, inAmount ) - local addedItem = cItem( inItemID, inAmount ) - local inventoryGrid = inPlayer:GetInventory():GetInventoryGrid() - local hotbarGrid = inPlayer:GetInventory():GetHotbarGrid() - local itemsAdded = inventoryGrid:AddItem( addedItem ) - if( itemsAdded < inAmount ) then - addedItem.m_ItemCount = addedItem.m_ItemCount - itemsAdded - hotbarGrid:AddItem( addedItem ) - end -end --- This function returns item max stack for a given itemID. It uses vanilla max stack size, and uses several non-common items notations; --- Those are: --- oneonerecord( because aparently 11record wasn't the best idea in lua scripting application ) --- carrotonastick( because it wasn't added to items.txt yet ) --- waitrecord( for same reason ) --- Feel free to ignore the difference, or to add those to items.txt -function GetItemMaxStack( inItemID ) - local testerItem = cItem( inItemID ) - LOGINFO( "This function serves no real purpose now, maybe consider using cItem:GetMaxStackSize()?" ) - return testerItem:GetMaxStackSize() -end -function ItemIsArmor( inItemID, inCheckForHorseArmor ) - inCheckForHorseArmor = inCheckForHorseArmor or false - if( inItemID == E_ITEM_LEATHER_CAP ) then return true end - if( inItemID == E_ITEM_LEATHER_TUNIC ) then return true end - if( inItemID == E_ITEM_LEATHER_PANTS ) then return true end - if( inItemID == E_ITEM_LEATHER_BOOTS ) then return true end - - if( inItemID == E_ITEM_CHAIN_HELMET ) then return true end - if( inItemID == E_ITEM_CHAIN_CHESTPLATE ) then return true end - if( inItemID == E_ITEM_CHAIN_LEGGINGS ) then return true end - if( inItemID == E_ITEM_CHAIN_BOOTS ) then return true end - - if( inItemID == E_ITEM_IRON_HELMET ) then return true end - if( inItemID == E_ITEM_IRON_CHESTPLATE ) then return true end - if( inItemID == E_ITEM_IRON_LEGGINGS ) then return true end - if( inItemID == E_ITEM_IRON_BOOTS ) then return true end - - if( inItemID == E_ITEM_DIAMOND_HELMET ) then return true end - if( inItemID == E_ITEM_DIAMOND_CHESTPLATE ) then return true end - if( inItemID == E_ITEM_DIAMOND_LEGGINGS ) then return true end - if( inItemID == E_ITEM_DIAMOND_BOOTS ) then return true end - - if( inItemID == E_ITEM_GOLD_HELMET ) then return true end - if( inItemID == E_ITEM_GOLD_CHESTPLATE ) then return true end - if( inItemID == E_ITEM_GOLD_LEGGINGS ) then return true end - if( inItemID == E_ITEM_GOLD_BOOTS ) then return true end - - if( inCheckForHorseArmor ) then - if( inItemID == E_ITEM_IRON_HORSE_ARMOR ) then return true end - if( inItemID == E_ITEM_GOLD_HORSE_ARMOR ) then return true end - if( inItemID == E_ITEM_DIAMOND_HORSE_ARMOR ) then return true end - end - return false -end --- Returns full-length playername for a short name( usefull for parsing commands ) -function GetExactPlayername( inPlayerName ) - local _result = inPlayerName - local function SetProcessingPlayername( inPlayer ) - _result = inPlayer:GetName() - end - cRoot:Get():FindAndDoWithPlayer( inPlayerName, SetProcessingPlayername ) - return _result -end -function GetPlayerByName( inPlayerName ) - local _player - local PlayerSetter = function( Player ) - _player = Player - end - cRoot:Get():FindAndDoWithPlayer( inPlayerName, PlayerSetter ) - return _player -end ---[[ -Not-so-usual math _functions -]] --- Rounds floating point number. Because lua guys think this function doesn't deserve to be presented in lua's math -function round( inX ) - if( inX%2 ~= 0.5 ) then - return math.floor( inX + 0.5 ) - end - return inX - 0.5 -end ---[[ -Functions I use for filework and stringswork -]] -function PluralString( inValue, inSingularString, inPluralString ) - local _value_string = tostring( inValue ) - if( _value_string[#_value_string] == "1" ) then - return inSingularString - end - return inPluralString -end -function PluralItemName( inItemID, inAmount ) -- BEWARE! TEMPORAL SOLUTION THERE! :D - local _value_string = tostring( inValue ) - local _name = "" - if( _value_string[#_value_string] == "1" ) then - -- singular names - _name = ItemTypeToString( inItemID ) - else - -- plural names - _name = ItemTypeToString( inItemID ).."s" - end - return _name -end --- for filewriting purposes. 0 = false, 1 = true -function StringToBool( inValue ) - if( inValue == "1" ) then return true end - return false -end --- same, but reversal -function BoolToString( inValue ) - if( inValue == true ) then return 1 end - return 0 -end diff --git a/MCServer/Plugins/InfoDump.lua b/MCServer/Plugins/InfoDump.lua index c61f9c9e6..de1d1f451 100644 --- a/MCServer/Plugins/InfoDump.lua +++ b/MCServer/Plugins/InfoDump.lua @@ -20,8 +20,8 @@ only that one plugin's documentation. This mode of operation doesn't require Lua -- Check Lua version. We use 5.1-specific construct when loading the plugin info, 5.2 is not compatible! if (_VERSION ~= "Lua 5.1") then - print("Unsupported Lua version. This script requires Lua version 5.1, this Lua is version " .. (_VERSION or "<nil>")); - return; + print("Unsupported Lua version. This script requires Lua version 5.1, this Lua is version " .. (_VERSION or "<nil>")) + return end @@ -31,38 +31,38 @@ end --- Replaces generic formatting with forum-specific formatting -- Also removes the single line-ends local function ForumizeString(a_Str) - assert(type(a_Str) == "string"); + assert(type(a_Str) == "string") -- Remove the indentation, unless in the code tag: -- Only one code or /code tag per line is supported! - local IsInCode = false; + local IsInCode = false local function RemoveIndentIfNotInCode(s) if (IsInCode) then -- we're in code section, check if this line terminates it - IsInCode = (s:find("{%%/code}") ~= nil); - return s .. "\n"; + IsInCode = (s:find("{%%/code}") ~= nil) + return s .. "\n" else -- we're not in code section, check if this line starts it - IsInCode = (s:find("{%%code}") ~= nil); - return s:gsub("^%s*", "") .. "\n"; + IsInCode = (s:find("{%%code}") ~= nil) + return s:gsub("^%s*", "") .. "\n" end end - a_Str = a_Str:gsub("(.-)\n", RemoveIndentIfNotInCode); + a_Str = a_Str:gsub("(.-)\n", RemoveIndentIfNotInCode) -- Replace multiple line ends with {%p} and single line ends with a space, -- so that manual word-wrap in the Info.lua file doesn't wrap in the forum. - a_Str = a_Str:gsub("\n\n", "{%%p}"); - a_Str = a_Str:gsub("\n", " "); + a_Str = a_Str:gsub("\n\n", "{%%p}") + a_Str = a_Str:gsub("\n", " ") -- Replace the generic formatting: - a_Str = a_Str:gsub("{%%p}", "\n\n"); - a_Str = a_Str:gsub("{%%b}", "[b]"):gsub("{%%/b}", "[/b]"); - a_Str = a_Str:gsub("{%%i}", "[i]"):gsub("{%%/i}", "[/i]"); - a_Str = a_Str:gsub("{%%list}", "[list]"):gsub("{%%/list}", "[/list]"); - a_Str = a_Str:gsub("{%%li}", "[*]"):gsub("{%%/li}", ""); + a_Str = a_Str:gsub("{%%p}", "\n\n") + a_Str = a_Str:gsub("{%%b}", "[b]"):gsub("{%%/b}", "[/b]") + a_Str = a_Str:gsub("{%%i}", "[i]"):gsub("{%%/i}", "[/i]") + a_Str = a_Str:gsub("{%%list}", "[list]"):gsub("{%%/list}", "[/list]") + a_Str = a_Str:gsub("{%%li}", "[*]"):gsub("{%%/li}", "") -- TODO: Other formatting - return a_Str; + return a_Str end @@ -72,38 +72,38 @@ end --- Replaces generic formatting with forum-specific formatting -- Also removes the single line-ends local function GithubizeString(a_Str) - assert(type(a_Str) == "string"); + assert(type(a_Str) == "string") -- Remove the indentation, unless in the code tag: -- Only one code or /code tag per line is supported! - local IsInCode = false; + local IsInCode = false local function RemoveIndentIfNotInCode(s) if (IsInCode) then -- we're in code section, check if this line terminates it - IsInCode = (s:find("{%%/code}") ~= nil); - return s .. "\n"; + IsInCode = (s:find("{%%/code}") ~= nil) + return s .. "\n" else -- we're not in code section, check if this line starts it - IsInCode = (s:find("{%%code}") ~= nil); - return s:gsub("^%s*", "") .. "\n"; + IsInCode = (s:find("{%%code}") ~= nil) + return s:gsub("^%s*", "") .. "\n" end end - a_Str = a_Str:gsub("(.-)\n", RemoveIndentIfNotInCode); + a_Str = a_Str:gsub("(.-)\n", RemoveIndentIfNotInCode) -- Replace multiple line ends with {%p} and single line ends with a space, -- so that manual word-wrap in the Info.lua file doesn't wrap in the forum. - a_Str = a_Str:gsub("\n\n", "{%%p}"); - a_Str = a_Str:gsub("\n", " "); + a_Str = a_Str:gsub("\n\n", "{%%p}") + a_Str = a_Str:gsub("\n", " ") -- Replace the generic formatting: - a_Str = a_Str:gsub("{%%p}", "\n\n"); - a_Str = a_Str:gsub("{%%b}", "**"):gsub("{%%/b}", "**"); - a_Str = a_Str:gsub("{%%i}", "*"):gsub("{%%/i}", "*"); - a_Str = a_Str:gsub("{%%list}", ""):gsub("{%%/list}", ""); - a_Str = a_Str:gsub("{%%li}", " - "):gsub("{%%/li}", ""); + a_Str = a_Str:gsub("{%%p}", "\n\n") + a_Str = a_Str:gsub("{%%b}", "**"):gsub("{%%/b}", "**") + a_Str = a_Str:gsub("{%%i}", "*"):gsub("{%%/i}", "*") + a_Str = a_Str:gsub("{%%list}", ""):gsub("{%%/list}", "") + a_Str = a_Str:gsub("{%%li}", " - "):gsub("{%%/li}", "") -- TODO: Other formatting - return a_Str; + return a_Str end @@ -117,7 +117,7 @@ end local function BuildCategories(a_PluginInfo) -- The returned result -- This will contain both an array and a dict of the categories, to allow fast search - local res = {}; + local res = {} -- For each command add a reference to it into all of its categories: local function AddCommands(a_CmdPrefix, a_Commands) @@ -130,39 +130,39 @@ local function BuildCategories(a_PluginInfo) if ((info.HelpString ~= nil) and (info.HelpString ~= "")) then -- Add to each specified category: - local Category = info.Category; + local Category = info.Category if (type(Category) == "string") then - Category = {Category}; + Category = {Category} end for idx, cat in ipairs(Category or {""}) do - local CatEntry = res[cat]; + local CatEntry = res[cat] if (CatEntry == nil) then -- First time we came across this category, create it: - local NewCat = {Name = cat, Description = "", Commands = {NewCmd}}; - table.insert(res, NewCat); - res[cat] = NewCat; + local NewCat = {Name = cat, Description = "", Commands = {NewCmd}} + table.insert(res, NewCat) + res[cat] = NewCat else -- We already have this category, just add the command to its list of commands: - table.insert(CatEntry.Commands, NewCmd); + table.insert(CatEntry.Commands, NewCmd) end end -- for idx, cat - Category[] end -- if (HelpString valid) -- Recurse all subcommands: if (info.Subcommands ~= nil) then - AddCommands(a_CmdPrefix .. cmd .. " ", info.Subcommands); + AddCommands(a_CmdPrefix .. cmd .. " ", info.Subcommands) end end -- for cmd, info - a_Commands[] end -- AddCommands() - AddCommands("", a_PluginInfo.Commands); + AddCommands("", a_PluginInfo.Commands) -- Assign descriptions to categories: for name, desc in pairs(a_PluginInfo.Categories or {}) do - local CatEntry = res[name]; + local CatEntry = res[name] if (CatEntry ~= nil) then -- The result has this category, add the description: - CatEntry.Description = desc.Description; + CatEntry.Description = desc.Description end end @@ -170,12 +170,12 @@ local function BuildCategories(a_PluginInfo) for idx, cat in ipairs(res) do table.sort(cat.Commands, function (cmd1, cmd2) - return (string.lower(cmd1.CommandString) < string.lower(cmd2.CommandString)); + return (string.lower(cmd1.CommandString) < string.lower(cmd2.CommandString)) end - ); + ) end - return res; + return res end @@ -188,9 +188,9 @@ end -- colorizes command name blue and params green local function GetCommandRefForum(a_Command) if (type(a_Command) == "string") then - return "[color=blue]" .. a_Command .. "[/color]"; + return "[color=blue]" .. a_Command .. "[/color]" end - return "[color=blue]" .. a_Command.Name .. "[/color] [color=green]" .. (a_Command.Params or "") .. "[/color]"; + return "[color=blue]" .. a_Command.Name .. "[/color] [color=green]" .. (a_Command.Params or "") .. "[/color]" end @@ -201,18 +201,18 @@ end -- If a_CommandParams is nil, returns a_CommandName apostrophed -- If a_CommandParams is a string, apostrophes a_CommandName with a_CommandParams local function GetCommandRefGithub(a_CommandName, a_CommandParams) - assert(type(a_CommandName) == "string"); + assert(type(a_CommandName) == "string") if (a_CommandParams == nil) then - return "`" .. a_CommandName .. "`"; + return "`" .. a_CommandName .. "`" end - assert(type(a_CommandParams) == "table"); + assert(type(a_CommandParams) == "table") if ((a_CommandParams.Params == nil) or (a_CommandParams.Params == "")) then - return "`" .. a_CommandName .. "`"; + return "`" .. a_CommandName .. "`" end - assert(type(a_CommandParams.Params) == "string"); - return "`" .. a_CommandName .. " " .. a_CommandParams.Params .. "`"; + assert(type(a_CommandParams.Params) == "string") + return "`" .. a_CommandName .. " " .. a_CommandParams.Params .. "`" end @@ -221,25 +221,25 @@ end --- Writes the specified command detailed help array to the output file, in the forum dump format local function WriteCommandParameterCombinationsForum(a_CmdString, a_ParameterCombinations, f) - assert(type(a_CmdString) == "string"); - assert(type(a_ParameterCombinations) == "table"); - assert(f ~= nil); + assert(type(a_CmdString) == "string") + assert(type(a_ParameterCombinations) == "table") + assert(f ~= nil) if (#a_ParameterCombinations == 0) then -- No explicit parameter combinations to write - return; + return end - f:write("The following parameter combinations are recognized:\n"); + f:write("The following parameter combinations are recognized:\n") for idx, combination in ipairs(a_ParameterCombinations) do - f:write("[color=blue]", a_CmdString, "[/color] [color=green]", combination.Params or "", "[/color]"); + f:write("[color=blue]", a_CmdString, "[/color] [color=green]", combination.Params or "", "[/color]") if (combination.Help ~= nil) then - f:write(" - ", ForumizeString(combination.Help)); + f:write(" - ", ForumizeString(combination.Help)) end if (combination.Permission ~= nil) then - f:write(" (Requires permission '[color=red]", combination.Permission, "[/color]')"); + f:write(" (Requires permission '[color=red]", combination.Permission, "[/color]')") end - f:write("\n"); + f:write("\n") end end @@ -249,25 +249,25 @@ end --- Writes the specified command detailed help array to the output file, in the forum dump format local function WriteCommandParameterCombinationsGithub(a_CmdString, a_ParameterCombinations, f) - assert(type(a_CmdString) == "string"); - assert(type(a_ParameterCombinations) == "table"); - assert(f ~= nil); + assert(type(a_CmdString) == "string") + assert(type(a_ParameterCombinations) == "table") + assert(f ~= nil) if (#a_ParameterCombinations == 0) then -- No explicit parameter combinations to write - return; + return end - f:write("The following parameter combinations are recognized:\n\n"); + f:write("The following parameter combinations are recognized:\n\n") for idx, combination in ipairs(a_ParameterCombinations) do - f:write(GetCommandRefGithub(a_CmdString, combination)); + f:write(GetCommandRefGithub(a_CmdString, combination)) if (combination.Help ~= nil) then - f:write(" - ", GithubizeString(combination.Help)); + f:write(" - ", GithubizeString(combination.Help)) end if (combination.Permission ~= nil) then - f:write(" (Requires permission '**", combination.Permission, "**')"); + f:write(" (Requires permission '**", combination.Permission, "**')") end - f:write("\n"); + f:write("\n") end end @@ -278,29 +278,29 @@ end --- Writes all commands in the specified category to the output file, in the forum dump format local function WriteCommandsCategoryForum(a_Category, f) -- Write category name: - local CategoryName = a_Category.Name; + local CategoryName = a_Category.Name if (CategoryName == "") then - CategoryName = "General"; + CategoryName = "General" end - f:write("\n[size=Large]", ForumizeString(a_Category.DisplayName or CategoryName), "[/size]\n"); + f:write("\n[size=Large]", ForumizeString(a_Category.DisplayName or CategoryName), "[/size]\n") -- Write description: if (a_Category.Description ~= "") then - f:write(ForumizeString(a_Category.Description), "\n"); + f:write(ForumizeString(a_Category.Description), "\n") end -- Write commands: - f:write("\n[list]"); + f:write("\n[list]") for idx2, cmd in ipairs(a_Category.Commands) do - f:write("\n[b]", cmd.CommandString, "[/b] - ", ForumizeString(cmd.Info.HelpString or "UNDOCUMENTED"), "\n"); + f:write("\n[b]", cmd.CommandString, "[/b] - ", ForumizeString(cmd.Info.HelpString or "UNDOCUMENTED"), "\n") if (cmd.Info.Permission ~= nil) then - f:write("Permission required: [color=red]", cmd.Info.Permission, "[/color]\n"); + f:write("Permission required: [color=red]", cmd.Info.Permission, "[/color]\n") end if (cmd.Info.DetailedDescription ~= nil) then - f:write(ForumizeString(cmd.Info.DetailedDescription)); + f:write(ForumizeString(cmd.Info.DetailedDescription)) end if (cmd.Info.ParameterCombinations ~= nil) then - WriteCommandParameterCombinationsForum(cmd.CommandString, cmd.Info.ParameterCombinations, f); + WriteCommandParameterCombinationsForum(cmd.CommandString, cmd.Info.ParameterCombinations, f) end end f:write("[/list]\n\n") @@ -313,23 +313,23 @@ end --- Writes all commands in the specified category to the output file, in the Github dump format local function WriteCommandsCategoryGithub(a_Category, f) -- Write category name: - local CategoryName = a_Category.Name; + local CategoryName = a_Category.Name if (CategoryName == "") then - CategoryName = "General"; + CategoryName = "General" end - f:write("\n### ", GithubizeString(a_Category.DisplayName or CategoryName), "\n"); + f:write("\n### ", GithubizeString(a_Category.DisplayName or CategoryName), "\n") -- Write description: if (a_Category.Description ~= "") then - f:write(GithubizeString(a_Category.Description), "\n\n"); + f:write(GithubizeString(a_Category.Description), "\n\n") end - f:write("| Command | Permission | Description | \n") - f:write("| ------- | ---------- | ----------- | \n") + f:write("| Command | Permission | Description |\n") + f:write("| ------- | ---------- | ----------- |\n") -- Write commands: for idx2, cmd in ipairs(a_Category.Commands) do - f:write("|", cmd.CommandString, " | ", cmd.Info.Permission or "", " | ", GithubizeString(cmd.Info.HelpString or "UNDOCUMENTED"), "| \n") + f:write("|", cmd.CommandString, " | ", cmd.Info.Permission or "", " | ", GithubizeString(cmd.Info.HelpString or "UNDOCUMENTED"), "|\n") end f:write("\n\n") end @@ -340,24 +340,24 @@ end local function DumpCommandsForum(a_PluginInfo, f) -- Copy all Categories from a dictionary into an array: - local Categories = BuildCategories(a_PluginInfo); + local Categories = BuildCategories(a_PluginInfo) -- Sort the categories by name: table.sort(Categories, function(cat1, cat2) - return (string.lower(cat1.Name) < string.lower(cat2.Name)); + return (string.lower(cat1.Name) < string.lower(cat2.Name)) end - ); + ) if (#Categories == 0) then - return; + return end - f:write("\n[size=X-Large]Commands[/size]\n"); + f:write("\n[size=X-Large]Commands[/size]\n") -- Dump per-category commands: for idx, cat in ipairs(Categories) do - WriteCommandsCategoryForum(cat, f); + WriteCommandsCategoryForum(cat, f) end end @@ -367,24 +367,24 @@ end local function DumpCommandsGithub(a_PluginInfo, f) -- Copy all Categories from a dictionary into an array: - local Categories = BuildCategories(a_PluginInfo); + local Categories = BuildCategories(a_PluginInfo) -- Sort the categories by name: table.sort(Categories, function(cat1, cat2) - return (string.lower(cat1.Name) < string.lower(cat2.Name)); + return (string.lower(cat1.Name) < string.lower(cat2.Name)) end - ); + ) if (#Categories == 0) then - return; + return end - f:write("\n# Commands\n"); + f:write("\n# Commands\n") -- Dump per-category commands: for idx, cat in ipairs(Categories) do - WriteCommandsCategoryGithub(cat, f); + WriteCommandsCategoryGithub(cat, f) end end @@ -393,16 +393,16 @@ end local function DumpAdditionalInfoForum(a_PluginInfo, f) - local AInfo = a_PluginInfo.AdditionalInfo; + local AInfo = a_PluginInfo.AdditionalInfo if (type(AInfo) ~= "table") then -- There is no AdditionalInfo in a_PluginInfo - return; + return end for idx, info in ipairs(a_PluginInfo.AdditionalInfo) do if ((info.Title ~= nil) and (info.Contents ~= nil)) then - f:write("\n[size=X-Large]", ForumizeString(info.Title), "[/size]\n"); - f:write(ForumizeString(info.Contents), "\n"); + f:write("\n[size=X-Large]", ForumizeString(info.Title), "[/size]\n") + f:write(ForumizeString(info.Contents), "\n") end end end @@ -412,16 +412,16 @@ end local function DumpAdditionalInfoGithub(a_PluginInfo, f) - local AInfo = a_PluginInfo.AdditionalInfo; + local AInfo = a_PluginInfo.AdditionalInfo if (type(AInfo) ~= "table") then -- There is no AdditionalInfo in a_PluginInfo - return; + return end for idx, info in ipairs(a_PluginInfo.AdditionalInfo) do if ((info.Title ~= nil) and (info.Contents ~= nil)) then - f:write("\n# ", GithubizeString(info.Title), "\n"); - f:write(GithubizeString(info.Contents), "\n"); + f:write("\n# ", GithubizeString(info.Title), "\n") + f:write(GithubizeString(info.Contents), "\n") end end end @@ -434,53 +434,53 @@ end -- Each array item is {Name = "PermissionName", Info = { PermissionInfo }} local function BuildPermissions(a_PluginInfo) -- Collect all used permissions from Commands, reference the commands that use the permission: - local Permissions = a_PluginInfo.Permissions or {}; + local Permissions = a_PluginInfo.Permissions or {} local function CollectPermissions(a_CmdPrefix, a_Commands) for cmd, info in pairs(a_Commands) do - CommandString = a_CmdPrefix .. cmd; + CommandString = a_CmdPrefix .. cmd if ((info.Permission ~= nil) and (info.Permission ~= "")) then -- Add the permission to the list of permissions: - local Permission = Permissions[info.Permission] or {}; - Permissions[info.Permission] = Permission; + local Permission = Permissions[info.Permission] or {} + Permissions[info.Permission] = Permission -- Add the command to the list of commands using this permission: - Permission.CommandsAffected = Permission.CommandsAffected or {}; - table.insert(Permission.CommandsAffected, CommandString); + Permission.CommandsAffected = Permission.CommandsAffected or {} + table.insert(Permission.CommandsAffected, CommandString) end -- Process the command param combinations for permissions: - local ParamCombinations = info.ParameterCombinations or {}; + local ParamCombinations = info.ParameterCombinations or {} for idx, comb in ipairs(ParamCombinations) do if ((comb.Permission ~= nil) and (comb.Permission ~= "")) then -- Add the permission to the list of permissions: - local Permission = Permissions[comb.Permission] or {}; - Permissions[info.Permission] = Permission; + local Permission = Permissions[comb.Permission] or {} + Permissions[info.Permission] = Permission -- Add the command to the list of commands using this permission: - Permission.CommandsAffected = Permission.CommandsAffected or {}; - table.insert(Permission.CommandsAffected, {Name = CommandString, Params = comb.Params}); + Permission.CommandsAffected = Permission.CommandsAffected or {} + table.insert(Permission.CommandsAffected, {Name = CommandString, Params = comb.Params}) end end -- Process subcommands: if (info.Subcommands ~= nil) then - CollectPermissions(CommandString .. " ", info.Subcommands); + CollectPermissions(CommandString .. " ", info.Subcommands) end end end - CollectPermissions("", a_PluginInfo.Commands); + CollectPermissions("", a_PluginInfo.Commands) -- Copy the list of permissions to an array: - local PermArray = {}; + local PermArray = {} for name, perm in pairs(Permissions) do - table.insert(PermArray, {Name = name, Info = perm}); + table.insert(PermArray, {Name = name, Info = perm}) end -- Sort the permissions array: table.sort(PermArray, function(p1, p2) - return (p1.Name < p2.Name); + return (p1.Name < p2.Name) end - ); - return PermArray; + ) + return PermArray end @@ -489,32 +489,32 @@ end local function DumpPermissionsForum(a_PluginInfo, f) -- Get the processed sorted array of permissions: - local Permissions = BuildPermissions(a_PluginInfo); + local Permissions = BuildPermissions(a_PluginInfo) if ((Permissions == nil) or (#Permissions <= 0)) then - return; + return end -- Dump the permissions: - f:write("\n[size=X-Large]Permissions[/size]\n[list]\n"); + f:write("\n[size=X-Large]Permissions[/size]\n[list]\n") for idx, perm in ipairs(Permissions) do - f:write(" - [color=red]", perm.Name, "[/color] - "); - f:write(ForumizeString(perm.Info.Description or "")); - local CommandsAffected = perm.Info.CommandsAffected or {}; + f:write(" - [color=red]", perm.Name, "[/color] - ") + f:write(ForumizeString(perm.Info.Description or "")) + local CommandsAffected = perm.Info.CommandsAffected or {} if (#CommandsAffected > 0) then - f:write("\n[list] Commands affected:\n- "); - local Affects = {}; + f:write("\n[list] Commands affected:\n- ") + local Affects = {} for idx2, cmd in ipairs(CommandsAffected) do - table.insert(Affects, GetCommandRefForum(cmd)); + table.insert(Affects, GetCommandRefForum(cmd)) end - f:write(table.concat(Affects, "\n - ")); - f:write("\n[/list]"); + f:write(table.concat(Affects, "\n - ")) + f:write("\n[/list]") end if (perm.Info.RecommendedGroups ~= nil) then - f:write("\n[list] Recommended groups: ", perm.Info.RecommendedGroups, "[/list]"); + f:write("\n[list] Recommended groups: ", perm.Info.RecommendedGroups, "[/list]") end - f:write("\n"); + f:write("\n") end - f:write("[/list]"); + f:write("[/list]") end @@ -523,34 +523,35 @@ end local function DumpPermissionsGithub(a_PluginInfo, f) -- Get the processed sorted array of permissions: - local Permissions = BuildPermissions(a_PluginInfo); + local Permissions = BuildPermissions(a_PluginInfo) if ((Permissions == nil) or (#Permissions <= 0)) then - return; + return end -- Dump the permissions: - f:write("\n# Permissions\n"); + f:write("\n# Permissions\n") f:write("| Permissions | Description | Commands | Recommended groups |\n") f:write("| ----------- | ----------- | -------- | ------------------ |\n") for idx, perm in ipairs(Permissions) do - f:write(perm.Name, " | "); - f:write(GithubizeString(perm.Info.Description or ""), " | "); - local CommandsAffected = perm.Info.CommandsAffected or {}; + f:write("| ", perm.Name, " | ") + f:write(GithubizeString(perm.Info.Description or ""), " | ") + local CommandsAffected = perm.Info.CommandsAffected or {} if (#CommandsAffected > 0) then - local Affects = {}; + local Affects = {} for idx2, cmd in ipairs(CommandsAffected) do if (type(cmd) == "string") then - table.insert(Affects, GetCommandRefGithub(cmd)); + table.insert(Affects, GetCommandRefGithub(cmd)) else - table.insert(Affects, GetCommandRefGithub(cmd.Name, cmd)); + table.insert(Affects, GetCommandRefGithub(cmd.Name, cmd)) end end - f:write(table.concat(Affects, ", "), " | "); + f:write(table.concat(Affects, ", ")) end + f:write(" | ") if (perm.Info.RecommendedGroups ~= nil) then - f:write(perm.Info.RecommendedGroups, " |"); + f:write(perm.Info.RecommendedGroups) end - f:write("\n"); + f:write(" |\n") end end @@ -558,45 +559,53 @@ end +--- Dumps the forum-format info for the plugin +-- Returns true on success, nil and error message on failure local function DumpPluginInfoForum(a_PluginFolder, a_PluginInfo) -- Open the output file: - local f, msg = io.open(a_PluginInfo.Name .. "_forum.txt", "w"); + local f, msg = io.open(a_PluginFolder .. "/forum_info.txt", "w") if (f == nil) then - print("\tCannot dump forum info for plugin " .. a_PluginFolder .. ": " .. msg); - return; + return nil, msg end -- Write the description: - f:write(ForumizeString(a_PluginInfo.Description), "\n"); - DumpAdditionalInfoForum(a_PluginInfo, f); - DumpCommandsForum(a_PluginInfo, f); - DumpPermissionsForum(a_PluginInfo, f); + f:write(ForumizeString(a_PluginInfo.Description), "\n") + DumpAdditionalInfoForum(a_PluginInfo, f) + DumpCommandsForum(a_PluginInfo, f) + DumpPermissionsForum(a_PluginInfo, f) if (a_PluginInfo.SourceLocation ~= nil) then - f:write("[b][color=blue]Source:[/color] [url=", a_PluginInfo.SourceLocation, "]Link[/url][/b]"); + f:write("[b][color=blue]Source:[/color] [url=", a_PluginInfo.SourceLocation, "]Link[/url][/b]") end - - f:close(); + f:close() + return true end +--- Dumps the README.md file into the plugin's folder with the GitHub Markdown format +-- Returns true on success, nil and error message on failure local function DumpPluginInfoGithub(a_PluginFolder, a_PluginInfo) + -- Check the params: + assert(type(a_PluginFolder) == "string") + assert(type(a_PluginInfo) == "table") + -- Open the output file: - local f, msg = io.open(a_PluginInfo.Name .. ".md", "w"); -- TODO: Save to a_PluginFolder .. "/Readme.md" instead + local f, msg = io.open(a_PluginFolder .. "/README.md", "w") if (f == nil) then - print("\tCannot dump github info for plugin " .. a_PluginFolder .. ": " .. msg); - return; + print("\tCannot dump github info for plugin " .. a_PluginFolder .. ": " .. msg) + return nil, msg end -- Write the description: - f:write(GithubizeString(a_PluginInfo.Description), "\n"); - DumpAdditionalInfoGithub(a_PluginInfo, f); - DumpCommandsGithub(a_PluginInfo, f); - DumpPermissionsGithub(a_PluginInfo, f); + f:write(GithubizeString(a_PluginInfo.Description), "\n") + DumpAdditionalInfoGithub(a_PluginInfo, f) + DumpCommandsGithub(a_PluginInfo, f) + DumpPermissionsGithub(a_PluginInfo, f) - f:close(); + f:close() + return true end @@ -607,36 +616,54 @@ end -- Returns the g_PluginInfo table on success, or nil and error message on failure local function LoadPluginInfo(a_FolderName) -- Load and compile the Info file: - local cfg, err = loadfile(a_FolderName .. "/Info.lua"); + local cfg, err = loadfile(a_FolderName .. "/Info.lua") if (cfg == nil) then - return nil, "Cannot open 'Info.lua': " .. err; + return nil, "Cannot open 'Info.lua': " .. err end -- Execute the loaded file in a sandbox: -- This is Lua-5.1-specific and won't work in Lua 5.2! - local Sandbox = {}; - setfenv(cfg, Sandbox); - cfg(); + local Sandbox = {} + setfenv(cfg, Sandbox) + local isSuccess, errMsg = pcall(cfg) + if not(isSuccess) then + return nil, "Cannot load Info.lua: " .. (errMsg or "<unknown error>") + end + if (Sandbox.g_PluginInfo == nil) then - return nil, "Info.lua doesn't contain the g_PluginInfo declaration"; + return nil, "Info.lua doesn't contain the g_PluginInfo declaration" end - return Sandbox.g_PluginInfo; + return Sandbox.g_PluginInfo end +--- Processes the info for one plugin +-- Returns true on success, nil and error message on failure local function ProcessPluginFolder(a_FolderName) - local PluginInfo, Msg = LoadPluginInfo(a_FolderName); + -- Load the plugin info: + local PluginInfo, Msg = LoadPluginInfo(a_FolderName) if (PluginInfo == nil) then - if (Msg ~= nil) then - print("\t" .. Msg); - end - return; + return nil, "Cannot load info for plugin " .. a_FolderName .. ": " .. (Msg or "<unknown error>") + end + + -- Dump the forum format: + local isSuccess + isSuccess, Msg = DumpPluginInfoForum(a_FolderName, PluginInfo) + if not(isSuccess) then + return nil, "Cannot dump forum info for plugin " .. a_FolderName .. ": " .. (Msg or "<unknown error>") + end + + -- Dump the GitHub format: + isSuccess, Msg = DumpPluginInfoGithub(a_FolderName, PluginInfo) + if not(isSuccess) then + return nil, "Cannot dump GitHub info for plugin " .. a_FolderName .. ": " .. (Msg or "<unknown error>") end - DumpPluginInfoForum(a_FolderName, PluginInfo); - DumpPluginInfoGithub(a_FolderName, PluginInfo); + + -- All OK, return success + return true end @@ -650,7 +677,7 @@ local function LoadLFS() function() return require("lfs") end - ); + ) -- ... rather, print a nice message with instructions: if not(lfs) then @@ -663,44 +690,50 @@ local function LoadLFS() If you don't have luarocks installed, you need to install them using your OS's package manager, usually: sudo apt-get install luarocks (Ubuntu / Debian) On windows, a binary distribution can be downloaded from the LuaRocks homepage, http://luarocks.org/en/Download - ]]); + ]]) - print("Original error text: ", err); - return nil; + print("Original error text: ", err) + return nil end -- We now know that LFS is present, get it normally: - return require("lfs"); + return require("lfs") end -local Arg1 = ...; +local Arg1 = arg[1] if ((Arg1 ~= nil) and (Arg1 ~= "")) then -- Called with a plugin folder name, export only that one - ProcessPluginFolder(Arg1) + local isSuccess, msg = ProcessPluginFolder(Arg1) + if not(isSuccess) then + print(msg or "<unknown error>") + end else -- Called without any arguments, process all subfolders: - local lfs = LoadLFS(); + local lfs = LoadLFS() if (lfs == nil) then -- LFS not loaded, error has already been printed, just bail out - return; + return end - print("Processing plugin subfolders:"); + print("Processing plugin subfolders:") for fnam in lfs.dir(".") do if ((fnam ~= ".") and (fnam ~= "..")) then - local Attributes = lfs.attributes(fnam); + local Attributes = lfs.attributes(fnam) if (Attributes ~= nil) then if (Attributes.mode == "directory") then - print(fnam); - ProcessPluginFolder(fnam); + print(fnam) + local isSuccess, msg = ProcessPluginFolder(fnam) + if not(isSuccess) then + print(" " .. (msg or "<unknown error>")) + end end end end end end -print("Done."); +print("Done.") diff --git a/MCServer/Plugins/MagicCarpet/objects.lua b/MCServer/Plugins/MagicCarpet/objects.lua deleted file mode 100644 index 8d81623a5..000000000 --- a/MCServer/Plugins/MagicCarpet/objects.lua +++ /dev/null @@ -1,97 +0,0 @@ --- Location object -cLocation = {} -function cLocation:new( x, y, z ) - local object = { x = x, y = y, z = z } - setmetatable(object, { __index = cLocation }) - return object -end - --- Offsets -cFibers = { } -function cFibers:new() - local object = { - cLocation:new( 2, -1, 2 ), - cLocation:new( 2, -1, 1 ), - cLocation:new( 2, -1, 0 ), - cLocation:new( 2, -1, -1 ), - cLocation:new( 2, -1, -2 ), - cLocation:new( 1, -1, 2 ), - cLocation:new( 1, -1, 1 ), - cLocation:new( 1, -1, 0 ), - cLocation:new( 1, -1, -1 ), - cLocation:new( 1, -1, -2 ), - cLocation:new( 0, -1, 2 ), - cLocation:new( 0, -1, 1 ), - cLocation:new( 0, -1, 0 ), - cLocation:new( 0, -1, -1 ), - cLocation:new( 0, -1, -2 ), - cLocation:new( -1, -1, 2 ), - cLocation:new( -1, -1, 1 ), - cLocation:new( -1, -1, 0 ), - cLocation:new( -1, -1, -1 ), - cLocation:new( -1, -1, -2 ), - cLocation:new( -2, -1, 2 ), - cLocation:new( -2, -1, 1 ), - cLocation:new( -2, -1, 0 ), - cLocation:new( -2, -1, -1 ), - cLocation:new( -2, -1, -2 ), - imadeit = false, - } - setmetatable(object, { __index = cFibers }) - return object; -end - --- Carpet object -cCarpet = {} -function cCarpet:new() - local object = { Location = cLocation:new(0,0,0), - Fibers = cFibers:new(), - } - setmetatable(object, { __index = cCarpet }) - return object -end - -function cCarpet:remove() - local World = cRoot:Get():GetDefaultWorld() - for i, fib in ipairs( self.Fibers ) do - local x = self.Location.x + fib.x - local y = self.Location.y + fib.y - local z = self.Location.z + fib.z - local BlockID = World:GetBlock( x, y, z ) - if( fib.imadeit == true and BlockID == E_BLOCK_GLASS ) then - World:SetBlock( x, y, z, 0, 0 ) - fib.imadeit = false - end - end -end - -function cCarpet:draw() - local World = cRoot:Get():GetDefaultWorld() - for i, fib in ipairs( self.Fibers ) do - local x = self.Location.x + fib.x - local y = self.Location.y + fib.y - local z = self.Location.z + fib.z - local BlockID = World:GetBlock( x, y, z ) - if( BlockID == 0 ) then - fib.imadeit = true - World:SetBlock( x, y, z, E_BLOCK_GLASS, 0 ) - else - fib.imadeit = false - end - end -end - -function cCarpet:moveTo( NewPos ) - local x = math.floor( NewPos.x ) - local y = math.floor( NewPos.y ) - local z = math.floor( NewPos.z ) - if( self.Location.x ~= x or self.Location.y ~= y or self.Location.z ~= z ) then - self:remove() - self.Location = cLocation:new( x, y, z ) - self:draw() - end -end - -function cCarpet:getY() - return self.Location.y -end
\ No newline at end of file diff --git a/MCServer/Plugins/MagicCarpet/plugin.lua b/MCServer/Plugins/MagicCarpet/plugin.lua deleted file mode 100644 index 417ea0e02..000000000 --- a/MCServer/Plugins/MagicCarpet/plugin.lua +++ /dev/null @@ -1,81 +0,0 @@ -local Carpets = {} -local PLUGIN - -function Initialize( Plugin ) - Plugin:SetName( "MagicCarpet" ) - Plugin:SetVersion( 2 ) - - cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_MOVING, OnPlayerMoving) - cPluginManager.AddHook(cPluginManager.HOOK_PLAYER_DESTROYED, OnDisconnect) - - local PluginManager = cPluginManager:Get() - PluginManager:BindCommand("/mc", "magiccarpet", HandleCarpetCommand, " - Spawns a magical carpet"); - - PLUGIN = Plugin - - LOG( "Initialised " .. Plugin:GetName() .. " v." .. Plugin:GetVersion() ) - return true -end - - - - - -function OnDisable() - LOG( PLUGIN:GetName() .. " v." .. PLUGIN:GetVersion() .. " is shutting down..." ) - for i, Carpet in pairs( Carpets ) do - Carpet:remove() - end -end - - - - - -function HandleCarpetCommand( Split, Player ) - Carpet = Carpets[ Player ] - - if( Carpet == nil ) then - Carpets[ Player ] = cCarpet:new() - Player:SendMessageSuccess("You're on a magic carpet!") - Player:SendMessageInfo("Look straight down to descend. Jump to ascend.") - else - Carpet:remove() - Carpets[ Player ] = nil - Player:SendMessageSuccess("The carpet vanished!") - end - - return true -end - - - - - -function OnDisconnect( Reason, Player ) - local Carpet = Carpets[ Player ] - if( Carpet ~= nil ) then - Carpet:remove() - end - Carpets[ Player ] = nil -end - - - - - -function OnPlayerMoving(Player) - local Carpet = Carpets[ Player ] - if( Carpet == nil ) then - return - end - - if( Player:GetPitch() == 90 ) then - Carpet:moveTo( cLocation:new( Player:GetPosX(), Player:GetPosY() - 1, Player:GetPosZ() ) ) - else - if( Player:GetPosY() < Carpet:getY() ) then - Player:TeleportToCoords(Player:GetPosX(), Carpet:getY() + 0.2, Player:GetPosZ()) - end - Carpet:moveTo( cLocation:new( Player:GetPosX(), Player:GetPosY(), Player:GetPosZ() ) ) - end -end |