Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
8.7 kB · 277 lines
C
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278#pragma once#include "ConsoleInputSource.h"#include "..\Minecraft.World\ArrayWithLength.h"#include "..\Minecraft.World\SharedConstants.h"#include "..\Minecraft.World\C4JThread.h"
class ServerConnection;class Settings;class PlayerList;class EntityTracker;class ConsoleInput;class ConsoleCommands;class LevelStorageSource;class ChunkSource;class INetworkPlayer;class LevelRuleset;class LevelType;class ProgressRenderer;class CommandDispatcher;
#define MINECRAFT_SERVER_SLOW_QUEUE_DELAY 250
#if defined _XBOX_ONE || defined _XBOX || defined __ORBIS__ || defined __PS3__ || defined __PSVITA__#define _ACK_CHUNK_SEND_THROTTLING#endif
typedef struct _LoadSaveDataThreadParam{ LPVOID data; __int64 fileSize; const wstring saveName; _LoadSaveDataThreadParam(LPVOID data, __int64 filesize, const wstring &saveName) : data( data ), fileSize( filesize ), saveName( saveName ) {}} LoadSaveDataThreadParam;
typedef struct _NetworkGameInitData{ __int64 seed; LoadSaveDataThreadParam *saveData; DWORD settings; LevelGenerationOptions *levelGen; DWORD texturePackId; bool findSeed; unsigned int xzSize; unsigned char hellScale; ESavePlatform savePlatform;
_NetworkGameInitData() { seed = 0; saveData = NULL; settings = 0; levelGen = NULL; texturePackId = 0; findSeed = false; xzSize = LEVEL_LEGACY_WIDTH; hellScale = HELL_LEVEL_LEGACY_SCALE; savePlatform = SAVE_FILE_PLATFORM_LOCAL; }} NetworkGameInitData;
using namespace std;
// 4J Stu - 1.0.1 updates the server to implement the ServerInterface class, but I don't think we will use any of the functions that defines so not implementing hereclass MinecraftServer : public ConsoleInputSource{public: static const wstring VERSION; static const int TICK_STATS_SPAN = SharedConstants::TICKS_PER_SECOND * 5;
// static Logger logger = Logger.getLogger("Minecraft"); static unordered_map<wstring, int> ironTimers;
private: static const int DEFAULT_MINECRAFT_PORT = 25565; static const int MS_PER_TICK = 1000 / SharedConstants::TICKS_PER_SECOND;
// 4J Stu - Added 1.0.1, Not needed //wstring localIp; //int port;public: ServerConnection *connection; Settings *settings; ServerLevelArray levels;
private: PlayerList *players;
// 4J Stu - Added 1.0.1, Not needed //long[] tickTimes = new long[TICK_STATS_SPAN]; //long[][] levelTickTimes;private: ConsoleCommands *commands; bool running; bool m_bLoaded;public: bool stopped; int tickCount;
public: wstring progressStatus; int progress;private:// vector<Tickable *> tickables = new ArrayList<Tickable>(); // 4J - removed CommandDispatcher *commandDispatcher; vector<ConsoleInput *> consoleInput; // 4J - was synchronizedList - TODO - investigatepublic: bool onlineMode; bool animals; bool npcs; bool pvp; bool allowFlight; wstring motd; int maxBuildHeight; int playerIdleTimeout; bool forceGameType;
private: // 4J Added //int m_lastSentDifficulty;
public: // 4J Stu - This value should be incremented every time the list of players with friends-only UGC settings changes // It is sent with PreLoginPacket and compared when it comes back in the LoginPacket DWORD m_ugcPlayersVersion;
// This value is used to store the texture pack id for the currently loaded world DWORD m_texturePackId;
public: MinecraftServer(); ~MinecraftServer();private: // 4J Added - LoadSaveDataThreadParam bool initServer(__int64 seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed); void postProcessTerminate(ProgressRenderer *mcprogress); bool loadLevel(LevelStorageSource *storageSource, const wstring& name, __int64 levelSeed, LevelType *pLevelType, NetworkGameInitData *initData); void setProgress(const wstring& status, int progress); void endProgress(); void saveAllChunks(); void saveGameRules(); void stopServer(bool didInit);#ifdef _LARGE_WORLDS void overwriteBordersForNewWorldSize(ServerLevel* level); void overwriteHellBordersForNewWorldSize(ServerLevel* level, int oldHellSize);
#endifpublic: void setMaxBuildHeight(int maxBuildHeight); int getMaxBuildHeight(); PlayerList *getPlayers(); void setPlayers(PlayerList *players); ServerConnection *getConnection(); bool isAnimals(); void setAnimals(bool animals); bool isNpcsEnabled(); void setNpcsEnabled(bool npcs); bool isPvpAllowed(); void setPvpAllowed(bool pvp); bool isFlightAllowed(); void setFlightAllowed(bool allowFlight); bool isCommandBlockEnabled(); bool isNetherEnabled(); bool isHardcore(); int getOperatorUserPermissionLevel(); CommandDispatcher *getCommandDispatcher(); Pos *getCommandSenderWorldPosition(); Level *getCommandSenderWorld(); int getSpawnProtectionRadius(); bool isUnderSpawnProtection(Level *level, int x, int y, int z, shared_ptr<Player> player); void setForceGameType(bool forceGameType); bool getForceGameType(); static __int64 getCurrentTimeMillis(); int getPlayerIdleTimeout(); void setPlayerIdleTimeout(int playerIdleTimeout);
public: void halt(); void run(__int64 seed, void *lpParameter);
void broadcastStartSavingPacket(); void broadcastStopSavingPacket();
private: void tick();public: void handleConsoleInput(const wstring& msg, ConsoleInputSource *source); void handleConsoleInputs();// void addTickable(Tickable tickable); // 4J removed static void main(__int64 seed, void *lpParameter); static void HaltServer(bool bPrimaryPlayerSignedOut=false);
File *getFile(const wstring& name); void info(const wstring& string); void warn(const wstring& string); wstring getConsoleName(); ServerLevel *getLevel(int dimension); void setLevel(int dimension, ServerLevel *level); // 4J added static MinecraftServer *getInstance() { return server; } // 4J added static bool serverHalted() { return s_bServerHalted; } static bool saveOnExitAnswered() { return s_bSaveOnExitAnswered; } static void resetFlags() { s_bServerHalted = false; s_bSaveOnExitAnswered = false; }
bool flagEntitiesToBeRemoved(unsigned int *flags); // 4J addedprivate: //4J Added static MinecraftServer *server;
static bool setTimeOfDayAtEndOfTick; static __int64 setTimeOfDay; static bool setTimeAtEndOfTick; static __int64 setTime;
static bool m_bPrimaryPlayerSignedOut; // 4J-PB added to tell the stopserver not to save the game - another player may have signed in in their place, so ProfileManager.IsSignedIn isn't enough static bool s_bServerHalted; // 4J Stu Added so that we can halt the server even before it's been created properly static bool s_bSaveOnExitAnswered; // 4J Stu Added so that we only ask this question once when we exit
// 4J - added so that we can have a separate thread for post processing chunks on level creation static int runPostUpdate(void* lpParam); C4JThread* m_postUpdateThread; bool m_postUpdateTerminate; class postProcessRequest { public: int x, z; ChunkSource *chunkSource; postProcessRequest(int x, int z, ChunkSource *chunkSource) : x(x), z(z), chunkSource(chunkSource) {} }; vector<postProcessRequest> m_postProcessRequests; CRITICAL_SECTION m_postProcessCS;public: void addPostProcessRequest(ChunkSource *chunkSource, int x, int z);
public: static PlayerList *getPlayerList() { if( server != NULL ) return server->players; else return NULL; } static void SetTimeOfDay(__int64 time) { setTimeOfDayAtEndOfTick = true; setTimeOfDay = time; } static void SetTime(__int64 time) { setTimeAtEndOfTick = true; setTime = time; } C4JThread::Event* m_serverPausedEvent;private: // 4J Added bool m_isServerPaused;
// 4J Added - A static that stores the QNet index of the player that is next allowed to send a packet in the slow queue#ifdef _ACK_CHUNK_SEND_THROTTLING static bool s_hasSentEnoughPackets; static __int64 s_tickStartTime; static vector<INetworkPlayer *> s_sentTo; static const int MAX_TICK_TIME_FOR_PACKET_SENDS = 35;#else static int s_slowQueuePlayerIndex; static int s_slowQueueLastTime; static bool s_slowQueuePacketSent;#endif
bool IsServerPaused() { return m_isServerPaused; }
private: // 4J Added bool m_saveOnExit; bool m_suspending;
public: static bool chunkPacketManagement_CanSendTo(INetworkPlayer *player); static void chunkPacketManagement_DidSendTo(INetworkPlayer *player);#ifndef _ACK_CHUNK_SEND_THROTTLING static void cycleSlowQueueIndex();#endif void chunkPacketManagement_PreTick(); void chunkPacketManagement_PostTick();
void setSaveOnExit(bool save) { m_saveOnExit = save; s_bSaveOnExitAnswered = true; } void Suspend(); bool IsSuspending();
// 4J Stu - A load of functions were all added in 1.0.1 in the ServerInterface, but I don't think we need any of them };