03e29802cd
Added limited world. Configurable through webadmin. Added a Manage server page in webadmin where you can reload/restart/stop the server. You can add players to groups with the webadmin. without the player have to relog first You can change someone's group in-game with a command, without the player have to relog first Hardcore mode Improved death messages git-svn-id: http://mc-server.googlecode.com/svn/trunk@1306 0a769ca7-a7f5-676a-18bf-c427514a06d6
221 lines
5.7 KiB
Lua
221 lines
5.7 KiB
Lua
|
|
-- console.lua
|
|
|
|
-- Implements things related to console commands
|
|
|
|
|
|
|
|
|
|
|
|
function InitConsoleCommands()
|
|
local PluginMgr = cPluginManager:Get();
|
|
PluginMgr:BindConsoleCommand("help", HandleConsoleHelp, "Lists all commands");
|
|
PluginMgr:BindConsoleCommand("numchunks", HandleConsoleNumChunks, "Shows number of chunks currently loaded");
|
|
PluginMgr:BindConsoleCommand("players", HandleConsolePlayers, "Lists all connected players");
|
|
PluginMgr:BindConsoleCommand("primaryserverversion", HandleConsolePrimaryServerVersion, "Gets or sets server version reported to 1.4+ clients");
|
|
PluginMgr:BindConsoleCommand("reload", HandleConsoleReload, "Reloads all plugins");
|
|
PluginMgr:BindConsoleCommand("save-all", HandleConsoleSaveAll, "Saves all chunks");
|
|
PluginMgr:BindConsoleCommand("say", HandleConsoleSay, "Sends a chat message to all players");
|
|
PluginMgr:BindConsoleCommand("unload", HandleConsoleUnload, "Unloads all unused chunks");
|
|
PluginMgr:BindConsoleCommand("rank", HandleConsoleRank, " [Player] [Rank] - to add someone to a group");
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsoleHelp(Split)
|
|
local Commands = {}; -- {index => {"Command", "HelpString"} }
|
|
local MaxLength = 0;
|
|
local AddToTable = function(Command, HelpString)
|
|
table.insert(Commands, { Command, HelpString });
|
|
local CmdLen = Command:len();
|
|
if (CmdLen > MaxLength) then
|
|
MaxLength = CmdLen;
|
|
end
|
|
end
|
|
|
|
cPluginManager:Get():ForEachConsoleCommand(AddToTable);
|
|
|
|
-- Sort the table:
|
|
local CompareCommands = function(a, b)
|
|
return a[1] < b[1]; -- compare command strings
|
|
end
|
|
table.sort(Commands, CompareCommands);
|
|
|
|
for i, Command in ipairs(Commands) do
|
|
local Cmd = Command[1] .. string.rep(" ", MaxLength - Command[1]:len()); -- Align to a table
|
|
LOG(Cmd .. " - " .. Command[2]);
|
|
end
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsoleNumChunks(Split)
|
|
local Output = {};
|
|
local AddNumChunks = function(World)
|
|
Output[World:GetName()] = World:GetNumChunks();
|
|
end;
|
|
|
|
cRoot:Get():ForEachWorld(AddNumChunks);
|
|
|
|
local Total = 0;
|
|
for name, num in pairs(Output) do
|
|
LOG(" " .. name .. ": " .. num .. " chunks");
|
|
Total = Total + num;
|
|
end
|
|
LOG("Total: " .. Total .. " chunks");
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsolePlayers(Split)
|
|
local PlayersInWorlds = {}; -- "WorldName" => [players array]
|
|
local AddToTable = function(Player)
|
|
local WorldName = Player:GetWorld():GetName();
|
|
if (PlayersInWorlds[WorldName] == nil) then
|
|
PlayersInWorlds[WorldName] = {};
|
|
end
|
|
table.insert(PlayersInWorlds[WorldName], Player:GetName() .. " @ " .. Player:GetIP());
|
|
end
|
|
|
|
cRoot:Get():ForEachPlayer(AddToTable);
|
|
|
|
for WorldName, Players in pairs(PlayersInWorlds) do
|
|
LOG("World " .. WorldName .. ":");
|
|
for i, PlayerName in ipairs(Players) do
|
|
LOG(" " .. PlayerName);
|
|
end
|
|
end
|
|
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsolePrimaryServerVersion(Split)
|
|
if (#Split == 1) then
|
|
-- Display current version:
|
|
local Version = cRoot:Get():GetPrimaryServerVersion();
|
|
LOG("Primary server version: #" .. Version .. ", " .. cRoot:GetProtocolVersionTextFromInt(Version));
|
|
return true;
|
|
end
|
|
|
|
-- Set new value as the version:
|
|
cRoot:Get():SetPrimaryServerVersion(tonumber(Split[2]));
|
|
local Version = cRoot:Get():GetPrimaryServerVersion();
|
|
LOG("Primary server version is now #" .. Version .. ", " .. cRoot:GetProtocolVersionTextFromInt(Version));
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsoleReload(Split)
|
|
Server = cRoot:Get():GetServer();
|
|
Server:SendMessage(cChatColor.Green .. "Reloading all plugins.");
|
|
cPluginManager:Get():ReloadPlugins();
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsoleSaveAll(Split)
|
|
cRoot:Get():SaveAllChunks();
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsoleSay(Split)
|
|
table.remove(Split, 1);
|
|
local Message = "";
|
|
for i, Text in ipairs(Split) do
|
|
Message = Message .. " " .. Text;
|
|
end
|
|
Message = Message:sub(2); -- Cut off the first space
|
|
cRoot:Get():GetServer():BroadcastChat(cChatColor.Purple .. "[SERVER] " .. Message);
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsoleUnload(Split)
|
|
local UnloadChunks = function(World)
|
|
World:UnloadUnusedChunks();
|
|
end
|
|
|
|
LOGINFO("Num loaded chunks before: " .. cRoot:Get():GetTotalChunkCount());
|
|
cRoot:Get():ForEachWorld(UnloadChunks);
|
|
LOGINFO("Num loaded chunks after: " .. cRoot:Get():GetTotalChunkCount());
|
|
return true;
|
|
end
|
|
|
|
function HandleConsoleRank(Split)
|
|
if Split[2] == nil or Split[3] == nil then
|
|
LOG("Usage: /rank [Player] [Group]")
|
|
return true
|
|
end
|
|
local GroupsIni = cIniFile("groups.ini")
|
|
if( GroupsIni:ReadFile() == false ) then
|
|
LOG("Could not read groups.ini!")
|
|
end
|
|
if GroupsIni:FindKey(Split[3]) == -1 then
|
|
LOG("Group does not exist")
|
|
return true
|
|
end
|
|
local UsersIni = cIniFile("users.ini")
|
|
if( UsersIni:ReadFile() == false ) then
|
|
LOG("Could not read users.ini!")
|
|
end
|
|
UsersIni:DeleteKey(Split[2])
|
|
UsersIni:GetValueSet(Split[2], "Groups", Split[3])
|
|
UsersIni:WriteFile()
|
|
local loopPlayers = function( Player )
|
|
if Player:GetName() == Split[2] then
|
|
Player:SendMessage( cChatColor.Green .. "You were moved to group " .. Split[3] )
|
|
Player:LoadPermissionsFromDisk()
|
|
end
|
|
end
|
|
local loopWorlds = function ( World )
|
|
World:ForEachPlayer( loopPlayers )
|
|
end
|
|
cRoot:Get():ForEachWorld( loopWorlds )
|
|
LOG("Player " .. Split[2] .. " Was moved to " .. Split[3])
|
|
return true
|
|
end
|
|
|
|
|
|
function HandleConsole(Split)
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function HandleConsole(Split)
|
|
return true;
|
|
end
|
|
|
|
|
|
|
|
|
|
|