1
0
cuberite-2a/src/Root.h

259 lines
9.2 KiB
C
Raw Normal View History

#pragma once
#include "BlockTypeRegistry.h"
2014-02-04 17:39:57 -05:00
#include "Defines.h"
#include "FunctionRef.h"
#include "HTTP/HTTPServer.h"
#include "Protocol/Authenticator.h"
#include "Protocol/MojangAPI.h"
2014-08-08 17:12:22 -04:00
#include "RankManager.h"
// fwd:
class cItem;
class cMonsterConfig;
2015-09-24 04:48:33 -04:00
class cBrewingRecipes;
class cCraftingRecipes;
Introduce recipe book functionality (#4493) * Introduce recipe book functionality The recipe book helps especially new players. Missing it gives the impression that cuberite is not as advanced as it is. The handling of the recipe book uses the following functions: - Unlock Recipes (https://wiki.vg/index.php?title=Protocol&oldid=14204#Unlock_Recipes) to make recipes available and show the notification for new recipes. Initialization is done on player login for known ones, the update is done when new items are discovered. - Craft Recipe Request (https://wiki.vg/index.php?title=Protocol&oldid=14204#Craft_Recipe_Request) when the user selects a recipe from the recipe book to fill the slots. Known recipes are initialized on player login via `Unlock Recipes` with `Action` 0. As soon as a new recipe is discovered this is added via `Unlock Recipes` with `Action` 1. To be able to know and recognize new recipes the player class is extended with `KnownItems` and `KnownRecipes`. As soon as a player touches an item this is compared to the list of `KnownItems`, if the item is unknown the recipes are checked for this item and the other ingredients are checked with the list of `KnownItems`. If a full match is discovered the recipe is unlocked with the client and stored in the `KnownRecipes`. To unlock recipes the recipe ID is sent to the client. A mapping file (for protocol 1.12.2) translated the minecraft recipe names to ids. The crafting.txt is extended with and minecraft recipe names is possible. Limitations: Only a single recipe is added to the crafting area. Multiple clicks or shift click does not increase the number of builds. Co-authored-by: peterbell10 <peterbell10@live.co.uk> * Address first issues mentioned by @peterbell10 - Some linting - Extract loading of recipe specific protocol mapping into a function - Build `RecipeNameMap` only once - Use `std::optional` - Extract `LoadRecipe` from `Window` * Start to implement new suggestions * Update with suggestions from @peterbell10 * Some minor cleanup * Update protocol packet IDs * Remove unused include * Include header in cmake * Change a vector to integer counter * Change dromedaryCase method names to PascalCase * Address suggestions from @madmaxoft * Read Protocol subdirectories to load recipe books To load all recipebooks iterate over the `Protocol` subdirectories to find mapping files. Co-authored-by: peterbell10 <peterbell10@live.co.uk>
2020-07-14 12:56:42 -04:00
class cRecipeMapper;
class cFurnaceRecipe;
class cWebAdmin;
class cPluginManager;
class cServer;
class cWorld;
class cPlayer;
class cCommandOutputCallback;
class cCompositeChat;
class cSettingsRepositoryInterface;
class cDeadlockDetect;
2017-08-25 08:43:18 -04:00
class cUUID;
class BlockTypePalette;
class ProtocolPalettes;
using cPlayerListCallback = cFunctionRef<bool(cPlayer &)>;
using cWorldListCallback = cFunctionRef<bool(cWorld &)>;
2014-07-15 19:03:47 -04:00
namespace Json
{
class Value;
}
/** The root of the object hierarchy */
// tolua_begin
class cRoot
{
public:
static cRoot * Get() { return s_Root; }
// tolua_end
static bool m_TerminateEventRaised;
static bool m_RunAsService;
/** which ini file to load settings from, default is settings.ini */
AString m_SettingsFilename;
cRoot(void);
~cRoot();
void Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo);
/** Stops the server, as if "/stop" was typed in the console. */
void StopServer();
// tolua_begin
cServer * GetServer(void) { return m_Server; }
cWorld * GetDefaultWorld(void);
/** Returns a pointer to the world specified. If no world of that name exists, returns a nullptr. */
cWorld * GetWorld(const AString & a_WorldName);
/** Returns the up time of the server in seconds */
int GetServerUpTime(void)
{
return static_cast<int>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - m_StartTime).count());
}
// tolua_end
2015-07-31 10:49:10 -04:00
/** Calls the callback for each world; returns true if the callback didn't abort (return true) */
bool ForEachWorld(cWorldListCallback a_Callback); // >> Exported in ManualBindings <<
2015-07-31 10:49:10 -04:00
/** Writes chunkstats, for each world and totals, to the output callback */
void LogChunkStats(cCommandOutputCallback & a_Output);
cMonsterConfig * GetMonsterConfig(void) { return m_MonsterConfig; }
cCraftingRecipes * GetCraftingRecipes(void) { return m_CraftingRecipes; } // tolua_export
Introduce recipe book functionality (#4493) * Introduce recipe book functionality The recipe book helps especially new players. Missing it gives the impression that cuberite is not as advanced as it is. The handling of the recipe book uses the following functions: - Unlock Recipes (https://wiki.vg/index.php?title=Protocol&oldid=14204#Unlock_Recipes) to make recipes available and show the notification for new recipes. Initialization is done on player login for known ones, the update is done when new items are discovered. - Craft Recipe Request (https://wiki.vg/index.php?title=Protocol&oldid=14204#Craft_Recipe_Request) when the user selects a recipe from the recipe book to fill the slots. Known recipes are initialized on player login via `Unlock Recipes` with `Action` 0. As soon as a new recipe is discovered this is added via `Unlock Recipes` with `Action` 1. To be able to know and recognize new recipes the player class is extended with `KnownItems` and `KnownRecipes`. As soon as a player touches an item this is compared to the list of `KnownItems`, if the item is unknown the recipes are checked for this item and the other ingredients are checked with the list of `KnownItems`. If a full match is discovered the recipe is unlocked with the client and stored in the `KnownRecipes`. To unlock recipes the recipe ID is sent to the client. A mapping file (for protocol 1.12.2) translated the minecraft recipe names to ids. The crafting.txt is extended with and minecraft recipe names is possible. Limitations: Only a single recipe is added to the crafting area. Multiple clicks or shift click does not increase the number of builds. Co-authored-by: peterbell10 <peterbell10@live.co.uk> * Address first issues mentioned by @peterbell10 - Some linting - Extract loading of recipe specific protocol mapping into a function - Build `RecipeNameMap` only once - Use `std::optional` - Extract `LoadRecipe` from `Window` * Start to implement new suggestions * Update with suggestions from @peterbell10 * Some minor cleanup * Update protocol packet IDs * Remove unused include * Include header in cmake * Change a vector to integer counter * Change dromedaryCase method names to PascalCase * Address suggestions from @madmaxoft * Read Protocol subdirectories to load recipe books To load all recipebooks iterate over the `Protocol` subdirectories to find mapping files. Co-authored-by: peterbell10 <peterbell10@live.co.uk>
2020-07-14 12:56:42 -04:00
cRecipeMapper * GetRecipeMapper(void) { return m_RecipeMapper.get(); }
cFurnaceRecipe * GetFurnaceRecipe (void) { return m_FurnaceRecipe; } // Exported in ManualBindings.cpp with quite a different signature
2015-09-24 04:48:33 -04:00
cBrewingRecipes * GetBrewingRecipes (void) { return m_BrewingRecipes.get(); } // Exported in ManualBindings.cpp
/** Returns the (read-write) storage for registered block types. */
BlockTypeRegistry & GetBlockTypeRegistry() { return m_BlockTypeRegistry; }
2015-07-31 10:49:10 -04:00
/** Returns the number of ticks for how long the item would fuel a furnace. Returns zero if not a fuel */
static int GetFurnaceFuelBurnTime(const cItem & a_Fuel); // tolua_export
/** Returns the completions for a player name across all worlds. Returns an
empty vector if none are found. */
AStringVector GetPlayerTabCompletionMultiWorld(const AString & a_Text);
/** The current time where the startup of the server has been completed */
std::chrono::steady_clock::time_point m_StartTime;
cWebAdmin * GetWebAdmin (void) { return m_WebAdmin; } // tolua_export
cPluginManager * GetPluginManager (void) { return m_PluginManager; } // tolua_export
cAuthenticator & GetAuthenticator (void) { return m_Authenticator; }
2014-12-21 09:31:20 -05:00
cMojangAPI & GetMojangAPI (void) { return *m_MojangAPI; }
cRankManager * GetRankManager (void) { return m_RankManager.get(); }
/** Queues a console command for execution through the cServer class.
The command will be executed in the tick thread
The command's output will be written to the a_Output callback
"stop" and "restart" commands have special handling.
*/
void QueueExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);
/** Queues a console command for execution through the cServer class.
The command will be executed in the tick thread
The command's output will be sent to console
"stop" and "restart" commands have special handling.
*/
void QueueExecuteConsoleCommand(const AString & a_Cmd); // tolua_export
2015-07-31 10:49:10 -04:00
/** Executes a console command through the cServer class; does special handling for "stop" and "restart". */
void ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);
2015-07-31 10:49:10 -04:00
/** Kicks the user, no matter in what world they are. Used from cAuthenticator */
void KickUser(int a_ClientID, const AString & a_Reason);
2015-07-31 10:49:10 -04:00
/** Called by cAuthenticator to auth the specified user */
2017-08-25 08:43:18 -04:00
void AuthenticateUser(int a_ClientID, const AString & a_Name, const cUUID & a_UUID, const Json::Value & a_Properties);
2015-07-31 10:49:10 -04:00
/** Executes commands queued in the command queue */
void TickCommands(void);
2015-07-31 10:49:10 -04:00
/** Returns the number of chunks loaded */
size_t GetTotalChunkCount(void); // tolua_export
2015-07-31 10:49:10 -04:00
/** Saves all chunks in all worlds */
void SaveAllChunks(void); // tolua_export
/** Sets whether saving chunks is enabled in all worlds (overrides however the worlds were already set) */
void SetSavingEnabled(bool a_SavingEnabled); // tolua_export
2015-07-31 10:49:10 -04:00
/** Calls the callback for each player in all worlds */
bool ForEachPlayer(cPlayerListCallback a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
2015-07-31 10:49:10 -04:00
/** Finds a player from a partial or complete player name and calls the callback - case-insensitive */
bool FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
2014-02-05 18:24:02 -05:00
/** Finds the player over his uuid and calls the callback */
bool DoWithPlayerByUUID(const cUUID & a_PlayerUUID, cPlayerListCallback a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
/** Finds the player using it's complete username and calls the callback */
bool DoWithPlayer(const AString & a_PlayerName, cPlayerListCallback a_Callback);
/** Send playerlist of all worlds to player */
void SendPlayerLists(cPlayer * a_DestPlayer);
/** Broadcast playerlist addition through all worlds */
void BroadcastPlayerListsAddPlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr);
/** Broadcast playerlist removal through all worlds */
void BroadcastPlayerListsRemovePlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude = nullptr);
// tolua_begin
2015-07-31 10:49:10 -04:00
/** Sends a chat message to all connected clients (in all worlds) */
void BroadcastChat (const AString & a_Message, eMessageType a_ChatPrefix = mtCustom);
void BroadcastChat (const cCompositeChat & a_Message);
void BroadcastChatDeath (const AString & a_Message) { BroadcastChat(a_Message, mtDeath); }
void BroadcastChatFailure(const AString & a_Message) { BroadcastChat(a_Message, mtFailure); }
void BroadcastChatFatal (const AString & a_Message) { BroadcastChat(a_Message, mtFailure); }
void BroadcastChatInfo (const AString & a_Message) { BroadcastChat(a_Message, mtInformation); }
void BroadcastChatJoin (const AString & a_Message) { BroadcastChat(a_Message, mtJoin); }
void BroadcastChatLeave (const AString & a_Message) { BroadcastChat(a_Message, mtLeave); }
void BroadcastChatSuccess(const AString & a_Message) { BroadcastChat(a_Message, mtSuccess); }
void BroadcastChatWarning(const AString & a_Message) { BroadcastChat(a_Message, mtWarning); }
2015-07-31 10:49:10 -04:00
/** Returns the textual description of the protocol version: 49 -> "1.4.4". Provided specifically for Lua API */
static AString GetProtocolVersionTextFromInt(int a_ProtocolVersionNum);
2015-07-31 10:49:10 -04:00
/** Returns the amount of virtual RAM used, in KiB. Returns a negative number on error */
static int GetVirtualRAMUsage(void);
2015-07-31 10:49:10 -04:00
/** Returns the amount of virtual RAM used, in KiB. Returns a negative number on error */
static int GetPhysicalRAMUsage(void);
// tolua_end
private:
class cCommand
{
public:
cCommand(const AString & a_Command, cCommandOutputCallback * a_Output) :
m_Command(a_Command),
m_Output(a_Output)
{
}
AString m_Command;
cCommandOutputCallback * m_Output;
} ;
typedef std::map<AString, cWorld> WorldMap;
typedef std::vector<cCommand> cCommandQueue;
cWorld * m_pDefaultWorld;
WorldMap m_WorldsByName;
cCriticalSection m_CSPendingCommands;
cCommandQueue m_PendingCommands;
2014-10-18 19:29:34 -04:00
std::thread m_InputThread;
cEvent m_StopEvent;
std::atomic_flag m_InputThreadRunFlag;
cServer * m_Server;
cMonsterConfig * m_MonsterConfig;
cCraftingRecipes * m_CraftingRecipes;
Introduce recipe book functionality (#4493) * Introduce recipe book functionality The recipe book helps especially new players. Missing it gives the impression that cuberite is not as advanced as it is. The handling of the recipe book uses the following functions: - Unlock Recipes (https://wiki.vg/index.php?title=Protocol&oldid=14204#Unlock_Recipes) to make recipes available and show the notification for new recipes. Initialization is done on player login for known ones, the update is done when new items are discovered. - Craft Recipe Request (https://wiki.vg/index.php?title=Protocol&oldid=14204#Craft_Recipe_Request) when the user selects a recipe from the recipe book to fill the slots. Known recipes are initialized on player login via `Unlock Recipes` with `Action` 0. As soon as a new recipe is discovered this is added via `Unlock Recipes` with `Action` 1. To be able to know and recognize new recipes the player class is extended with `KnownItems` and `KnownRecipes`. As soon as a player touches an item this is compared to the list of `KnownItems`, if the item is unknown the recipes are checked for this item and the other ingredients are checked with the list of `KnownItems`. If a full match is discovered the recipe is unlocked with the client and stored in the `KnownRecipes`. To unlock recipes the recipe ID is sent to the client. A mapping file (for protocol 1.12.2) translated the minecraft recipe names to ids. The crafting.txt is extended with and minecraft recipe names is possible. Limitations: Only a single recipe is added to the crafting area. Multiple clicks or shift click does not increase the number of builds. Co-authored-by: peterbell10 <peterbell10@live.co.uk> * Address first issues mentioned by @peterbell10 - Some linting - Extract loading of recipe specific protocol mapping into a function - Build `RecipeNameMap` only once - Use `std::optional` - Extract `LoadRecipe` from `Window` * Start to implement new suggestions * Update with suggestions from @peterbell10 * Some minor cleanup * Update protocol packet IDs * Remove unused include * Include header in cmake * Change a vector to integer counter * Change dromedaryCase method names to PascalCase * Address suggestions from @madmaxoft * Read Protocol subdirectories to load recipe books To load all recipebooks iterate over the `Protocol` subdirectories to find mapping files. Co-authored-by: peterbell10 <peterbell10@live.co.uk>
2020-07-14 12:56:42 -04:00
std::unique_ptr<cRecipeMapper> m_RecipeMapper;
cFurnaceRecipe * m_FurnaceRecipe;
2015-09-24 04:48:33 -04:00
std::unique_ptr<cBrewingRecipes> m_BrewingRecipes;
cWebAdmin * m_WebAdmin;
cPluginManager * m_PluginManager;
cAuthenticator m_Authenticator;
2014-12-21 09:31:20 -05:00
cMojangAPI * m_MojangAPI;
std::unique_ptr<cRankManager> m_RankManager;
cHTTPServer m_HTTPServer;
/** The storage for all registered block types. */
BlockTypeRegistry m_BlockTypeRegistry;
void LoadGlobalSettings();
2015-07-31 10:49:10 -04:00
/** Loads the worlds from settings.ini, creates the worldmap */
void LoadWorlds(cDeadlockDetect & a_dd, cSettingsRepositoryInterface & a_Settings, bool a_IsNewIniFile);
2015-07-31 10:49:10 -04:00
/** Starts each world's life */
void StartWorlds(cDeadlockDetect & a_DeadlockDetect);
2015-07-31 10:49:10 -04:00
/** Stops each world's threads, so that it's safe to unload them */
void StopWorlds(cDeadlockDetect & a_DeadlockDetect);
static cRoot * s_Root;
2014-10-18 19:29:34 -04:00
static void InputThread(cRoot & a_Params);
}; // tolua_export