diff --git a/src/client/gui/screens/SimpleChooseLevelScreen.cpp b/src/client/gui/screens/SimpleChooseLevelScreen.cpp index bf4033d..80fe88c 100755 --- a/src/client/gui/screens/SimpleChooseLevelScreen.cpp +++ b/src/client/gui/screens/SimpleChooseLevelScreen.cpp @@ -12,11 +12,13 @@ SimpleChooseLevelScreen::SimpleChooseLevelScreen(const std::string& levelName) : bHeader(0), bGamemode(0), + bCheats(0), bBack(0), bCreate(0), levelName(levelName), hasChosen(false), gamemode(GameType::Survival), + cheatsEnabled(false), tLevelName(0, "World name"), tSeed(1, "World seed") { @@ -26,6 +28,7 @@ SimpleChooseLevelScreen::~SimpleChooseLevelScreen() { if (bHeader) delete bHeader; delete bGamemode; + delete bCheats; delete bBack; delete bCreate; } @@ -55,18 +58,22 @@ void SimpleChooseLevelScreen::init() } if (minecraft->useTouchscreen()) { bGamemode = new Touch::TButton(1, "Survival mode"); + bCheats = new Touch::TButton(4, "Cheats: Off"); bCreate = new Touch::TButton(3, "Create"); } else { bGamemode = new Button(1, "Survival mode"); + bCheats = new Button(4, "Cheats: Off"); bCreate = new Button(3, "Create"); } buttons.push_back(bHeader); buttons.push_back(bBack); buttons.push_back(bGamemode); + buttons.push_back(bCheats); buttons.push_back(bCreate); tabButtons.push_back(bGamemode); + tabButtons.push_back(bCheats); tabButtons.push_back(bBack); tabButtons.push_back(bCreate); @@ -101,16 +108,26 @@ void SimpleChooseLevelScreen::setupPositions() tSeed.x = tLevelName.x; tSeed.y = tLevelName.y + 30; - bGamemode->width = 140; - bGamemode->x = centerX - bGamemode->width / 2; - // compute vertical centre for gamemode in remaining space + const int buttonWidth = 120; + const int buttonSpacing = 10; + const int totalButtonWidth = buttonWidth * 2 + buttonSpacing; + + bGamemode->width = buttonWidth; + bCheats->width = buttonWidth; + + bGamemode->x = centerX - totalButtonWidth / 2; + bCheats->x = bGamemode->x + buttonWidth + buttonSpacing; + + // compute vertical centre for buttons in remaining space { int bottomPad = 20; int availTop = buttonHeight + 20 + 30 + 10; // just below seed int availBottom = height - bottomPad - bCreate->height - 10; // leave some gap before create int availHeight = availBottom - availTop; if (availHeight < 0) availHeight = 0; - bGamemode->y = availTop + (availHeight - bGamemode->height) / 2; + int y = availTop + (availHeight - bGamemode->height) / 2; + bGamemode->y = y; + bCheats->y = y; } bCreate->width = 100; @@ -131,14 +148,14 @@ void SimpleChooseLevelScreen::render( int xm, int ym, float a ) renderDirtBackground(0); glEnable2(GL_BLEND); - const char* str = NULL; + const char* modeDesc = NULL; if (gamemode == GameType::Survival) { - str = "Mobs, health and gather resources"; + modeDesc = "Mobs, health and gather resources"; } else if (gamemode == GameType::Creative) { - str = "Unlimited resources and flying"; + modeDesc = "Unlimited resources and flying"; } - if (str) { - drawCenteredString(minecraft->font, str, width/2, bGamemode->y + bGamemode->height + 4, 0xffcccccc); + if (modeDesc) { + drawCenteredString(minecraft->font, modeDesc, width / 2, bGamemode->y + bGamemode->height + 4, 0xffcccccc); } drawString(minecraft->font, "World name:", tLevelName.x, tLevelName.y - Font::DefaultLineHeight - 2, 0xffcccccc); @@ -195,6 +212,12 @@ void SimpleChooseLevelScreen::buttonClicked( Button* button ) return; } + if (button == bCheats) { + cheatsEnabled = !cheatsEnabled; + bCheats->msg = cheatsEnabled ? "Cheats: On" : "Cheats: Off"; + return; + } + if (button == bCreate && !tLevelName.text.empty()) { int seed = getEpochTimeS(); if (!tSeed.text.empty()) { @@ -207,7 +230,7 @@ void SimpleChooseLevelScreen::buttonClicked( Button* button ) } } std::string levelId = getUniqueLevelName(tLevelName.text); - LevelSettings settings(seed, gamemode); + LevelSettings settings(seed, gamemode, cheatsEnabled); minecraft->selectLevel(levelId, levelId, settings); minecraft->hostMultiplayer(); minecraft->setScreen(new ProgressScreen()); diff --git a/src/client/gui/screens/SimpleChooseLevelScreen.h b/src/client/gui/screens/SimpleChooseLevelScreen.h index 893876d..59f53c4 100755 --- a/src/client/gui/screens/SimpleChooseLevelScreen.h +++ b/src/client/gui/screens/SimpleChooseLevelScreen.h @@ -29,12 +29,14 @@ public: private: Touch::THeader* bHeader; Button* bGamemode; + Button* bCheats; ImageButton* bBack; Button* bCreate; bool hasChosen; std::string levelName; int gamemode; + bool cheatsEnabled; TextBox tLevelName; TextBox tSeed; diff --git a/src/world/level/LevelSettings.h b/src/world/level/LevelSettings.h index efb8fa9..98cdde3 100755 --- a/src/world/level/LevelSettings.h +++ b/src/world/level/LevelSettings.h @@ -14,13 +14,14 @@ namespace GameType { class LevelSettings { public: - LevelSettings(long seed, int gameType) + LevelSettings(long seed, int gameType, bool allowCheats = false) : seed(seed), - gameType(gameType) + gameType(gameType), + allowCheats(allowCheats) { } static LevelSettings None() { - return LevelSettings(-1,-1); + return LevelSettings(-1,-1,false); } long getSeed() const { @@ -31,6 +32,10 @@ public: return gameType; } + bool getAllowCheats() const { + return allowCheats; + } + // // Those two should actually not be here // @todo: Move out when we add LevelSettings.cpp :p @@ -53,6 +58,7 @@ public: private: const long seed; const int gameType; + const bool allowCheats; }; #endif /*NET_MINECRAFT_WORLD_LEVEL__LevelSettings_H__*/ diff --git a/src/world/level/storage/LevelData.cpp b/src/world/level/storage/LevelData.cpp index c40e5d3..4cafdf9 100755 --- a/src/world/level/storage/LevelData.cpp +++ b/src/world/level/storage/LevelData.cpp @@ -12,8 +12,8 @@ LevelData::LevelData() dimension(Dimension::NORMAL), playerDataVersion(-1), storageVersion(0), - gameType(GameType::Default), - loadedPlayerTag(NULL) + gameType(GameType::Default), spawnMobs(false), + allowCheats(false), loadedPlayerTag(NULL) { //LOGI("ctor 1: %p\n", this); spawnMobs = (gameType == GameType::Survival); @@ -21,8 +21,7 @@ LevelData::LevelData() LevelData::LevelData( const LevelSettings& settings, const std::string& levelName, int generatorVersion /*= -1*/ ) : seed(settings.getSeed()), - gameType(settings.getGameType()), - levelName(levelName), + gameType(settings.getGameType()), allowCheats(settings.getAllowCheats()), levelName(levelName), xSpawn(128), ySpawn(64), zSpawn(128), @@ -62,6 +61,7 @@ LevelData::LevelData( const LevelData& rhs ) playerDataVersion(rhs.playerDataVersion), generatorVersion(rhs.generatorVersion), spawnMobs(rhs.spawnMobs), + allowCheats(rhs.allowCheats), loadedPlayerTag(NULL), playerData(rhs.playerData) { @@ -84,6 +84,7 @@ LevelData& LevelData::operator=( const LevelData& rhs ) time = rhs.time; dimension = rhs.dimension; spawnMobs = rhs.spawnMobs; + allowCheats = rhs.allowCheats; playerData = rhs.playerData; playerDataVersion = rhs.playerDataVersion; generatorVersion = rhs.generatorVersion; @@ -161,6 +162,7 @@ void LevelData::setTagData( CompoundTag* tag, CompoundTag* playerTag ) if (!tag) return; tag->putLong("RandomSeed", seed); tag->putInt("GameType", gameType); + tag->putBoolean("AllowCommands", allowCheats); tag->putInt("SpawnX", xSpawn); tag->putInt("SpawnY", ySpawn); tag->putInt("SpawnZ", zSpawn); @@ -181,6 +183,7 @@ void LevelData::getTagData( const CompoundTag* tag ) if (!tag) return; seed = (long)tag->getLong("RandomSeed"); gameType = tag->getInt("GameType"); + allowCheats = tag->getBoolean("AllowCommands"); xSpawn = tag->getInt("SpawnX"); ySpawn = tag->getInt("SpawnY"); zSpawn = tag->getInt("SpawnZ"); @@ -362,3 +365,13 @@ void LevelData::setSpawnMobs( bool doSpawn ) { spawnMobs = doSpawn; } + +bool LevelData::getAllowCheats() const +{ + return allowCheats; +} + +void LevelData::setAllowCheats( bool allow ) +{ + allowCheats = allow; +} diff --git a/src/world/level/storage/LevelData.h b/src/world/level/storage/LevelData.h index 3bf69db..c3f0a79 100755 --- a/src/world/level/storage/LevelData.h +++ b/src/world/level/storage/LevelData.h @@ -72,6 +72,9 @@ public: bool getSpawnMobs() const; void setSpawnMobs(bool doSpawn); + bool getAllowCheats() const; + void setAllowCheats(bool allow); + public: PlayerData playerData; int playerDataVersion; @@ -89,6 +92,7 @@ private: int gameType; int storageVersion; bool spawnMobs; + bool allowCheats; //@note: This version is never written or loaded to disk. The only purpose // is to use it in the level generator on server and clients. int generatorVersion;