diff --git a/engine/server/application/CentralServer/src/shared/CentralServer.cpp b/engine/server/application/CentralServer/src/shared/CentralServer.cpp index 0ae86526..b5dac66b 100755 --- a/engine/server/application/CentralServer/src/shared/CentralServer.cpp +++ b/engine/server/application/CentralServer/src/shared/CentralServer.cpp @@ -3325,7 +3325,7 @@ void CentralServer::handleRequestSceneTransfer(const RequestSceneTransfer &msg) } else { - DEBUG_REPORT_LOG(true, ("Starting planet server for login")); + DEBUG_REPORT_LOG(true, ("Starting planet server for login. Host '%s', Scene: '%s'", getHostForScene(msg.getSceneName()), msg.getSceneName())); startPlanetServer(getHostForScene(msg.getSceneName()), msg.getSceneName(), 0); m_messagesWaitingForPlanetServer.push_back(Archive::ByteStream()); msg.pack(m_messagesWaitingForPlanetServer.back()); diff --git a/engine/server/library/serverGame/src/shared/command/CommandCppFuncs.cpp b/engine/server/library/serverGame/src/shared/command/CommandCppFuncs.cpp index d3297c87..52b8d204 100755 --- a/engine/server/library/serverGame/src/shared/command/CommandCppFuncs.cpp +++ b/engine/server/library/serverGame/src/shared/command/CommandCppFuncs.cpp @@ -5762,8 +5762,7 @@ static void commandFuncCreatePrototype(const Command&, const NetworkId& actor, c GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); - if (!result) - player->stopCrafting(false); + player->stopCrafting(result); } // ---------------------------------------------------------------------- @@ -5794,8 +5793,7 @@ static void commandFuncCreateManfSchematic(const Command&, const NetworkId& acto GameControllerMessageFlags::RELIABLE | GameControllerMessageFlags::DEST_AUTH_CLIENT); - if (!result) - player->stopCrafting(false); + player->stopCrafting(result); } // ---------------------------------------------------------------------- diff --git a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp index 219b08f6..6fcb2e2b 100755 --- a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp +++ b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.cpp @@ -491,6 +491,8 @@ void ConfigServerGame::install(void) KEY_STRING (serverLoadLevel, "heavy"); + KEY_INT (maxHousingLots, 10); + if (data->baseDecayRate <= 1.0f) data->baseDecayRate = 1.0f; diff --git a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h index 80094104..612fc936 100755 --- a/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h +++ b/engine/server/library/serverGame/src/shared/core/ConfigServerGame.h @@ -575,6 +575,8 @@ class ConfigServerGame bool useOldSuidGenerator; const char * serverLoadLevel; + + int maxHousingLots; }; private: @@ -1061,6 +1063,8 @@ class ConfigServerGame static bool getUseOldSuidGenerator(); static const char * getServerLoadLevel(); + + static int getMaxHousingLots(); }; //----------------------------------------------------------------------- @@ -3702,4 +3706,11 @@ inline const char *ConfigServerGame::getServerLoadLevel() return data->serverLoadLevel; } +//----------------------------------------------------------------------- + +inline int ConfigServerGame::getMaxHousingLots(void) +{ + return data->maxHousingLots; +} + #endif diff --git a/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp b/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp index 52082f6d..24b03627 100755 --- a/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp +++ b/engine/server/library/serverGame/src/shared/object/CreatureObject.cpp @@ -193,9 +193,6 @@ const SharedObjectTemplate * CreatureObject::m_defaultSharedTemplate = nullptr; //---------------------------------------------------------------------- -// The max number of lots available to a player. This value is also defined in base_class.java -static const int HOUSING_MAX_LOTS = 10; - // Slot names static const ConstCharCrcLowerString DATAPAD_SLOT_NAME("datapad"); @@ -869,6 +866,8 @@ CreatureObject::CreatureObject(const ServerCreatureObjectTemplate* newTemplate) IGNORE_RETURN(g_creatureList.insert(this)); ObjectTracker::addCreature(); + + m_maxHousingLots = ConfigServerGame::getMaxHousingLots(); } //----------------------------------------------------------------------- @@ -11915,7 +11914,7 @@ void CreatureObject::runMissionCreationQueue() int CreatureObject::getMaxNumberOfLots() const { - return HOUSING_MAX_LOTS; + return m_maxHousingLots; } //---------------------------------------------------------------------- diff --git a/engine/server/library/serverGame/src/shared/object/CreatureObject.h b/engine/server/library/serverGame/src/shared/object/CreatureObject.h index 0716c119..7dd20d2d 100755 --- a/engine/server/library/serverGame/src/shared/object/CreatureObject.h +++ b/engine/server/library/serverGame/src/shared/object/CreatureObject.h @@ -1013,6 +1013,9 @@ private: Archive::AutoDeltaVector m_wearableAppearanceData; // Vector for our appearance items. Archive::AutoDeltaVariable m_decoyOrigin; // The OID of the player whom we copied for this decoy creature. + + // The max number of lots available to a player. This value is also defined in base_class.java + int m_maxHousingLots; }; //---------------------------------------------------------------------- diff --git a/engine/server/library/serverGame/src/shared/object/ServerObject.cpp b/engine/server/library/serverGame/src/shared/object/ServerObject.cpp index 3625e9dc..33e44b0f 100755 --- a/engine/server/library/serverGame/src/shared/object/ServerObject.cpp +++ b/engine/server/library/serverGame/src/shared/object/ServerObject.cpp @@ -1415,6 +1415,36 @@ bool ServerObject::canTrade() const { return false; } + + // aconite 3/21/22 + // if an item has the move flag MF_GM but *doesn't* have the MF_Player flag + // that object shouldn't be considered tradeable because it isn't intended to + // be moved by a player (fixes, e.g., trading your buyback container) + bool hasGmFlag = false; + bool hasPlayerFlag = false; + auto tpf = dynamic_cast(getObjectTemplate()); + if(tpf) + { + const size_t flags = tpf->getMoveFlagsCount(); + if(flags > 0) + { + for (size_t i = 0; i < flags; i++) + { + if(!hasGmFlag && tpf->getMoveFlags(i) == ServerObjectTemplate::MF_gm) + { + hasGmFlag = true; + } + if (!hasPlayerFlag && tpf->getMoveFlags(i) == ServerObjectTemplate::MF_player) + { + hasPlayerFlag = true; + } + } + if(hasGmFlag && !hasPlayerFlag) + { + return false; + } + } + } return !markedNoTrade(); } diff --git a/engine/server/library/serverGame/src/shared/space/SpaceSquad.cpp b/engine/server/library/serverGame/src/shared/space/SpaceSquad.cpp index 9b998274..be21726f 100755 --- a/engine/server/library/serverGame/src/shared/space/SpaceSquad.cpp +++ b/engine/server/library/serverGame/src/shared/space/SpaceSquad.cpp @@ -116,13 +116,11 @@ SpaceSquad::~SpaceSquad() } // Tell all the squads guarding me that I am not longer guardable - - SpaceSquadList::iterator iterGuardedByList = m_guardedByList->begin(); - - for (; iterGuardedByList != m_guardedByList->end(); ++iterGuardedByList) - { - (*iterGuardedByList)->removeGuardTarget(); - } + for (SpaceSquadList::iterator it = m_guardedByList->begin(), next_it = it; it != m_guardedByList->end(); it = next_it) + { + ++next_it; + (*it)->removeGuardTarget(); + } delete m_guardedByList; diff --git a/engine/server/library/serverScript/src/shared/ScriptMethodsPlayerAccount.cpp b/engine/server/library/serverScript/src/shared/ScriptMethodsPlayerAccount.cpp index 2b687ce6..ec6fcc47 100755 --- a/engine/server/library/serverScript/src/shared/ScriptMethodsPlayerAccount.cpp +++ b/engine/server/library/serverScript/src/shared/ScriptMethodsPlayerAccount.cpp @@ -55,6 +55,7 @@ namespace ScriptMethodsPlayerAccountNamespace jboolean JNICALL isIgnoring(JNIEnv *env, jobject self, jlong player, jstring who); jboolean JNICALL adjustLotCount(JNIEnv *env, jobject self, jlong player, jint adjustment); jint JNICALL getAccountNumLots(JNIEnv *env, jobject self, jlong player); + jint JNICALL getMaxHousingLots(JNIEnv *env, jobject self); jint JNICALL getGameFeatureBits(JNIEnv *env, jobject self, jlong player); jint JNICALL getSubscriptionFeatureBits(JNIEnv *env, jobject self, jlong player); jboolean JNICALL isUsingAdminLogin(JNIEnv *env, jobject self, jlong player); @@ -91,6 +92,7 @@ const JNINativeMethod NATIVES[] = { JF("_isIgnoring", "(JLjava/lang/String;)Z", isIgnoring), JF("_adjustLotCount", "(JI)Z", adjustLotCount), JF("_getAccountNumLots", "(J)I", getAccountNumLots), + JF("_getMaxHousingLots", "()I", getMaxHousingLots), JF("_getGameFeatureBits", "(J)I", getGameFeatureBits), JF("_getSubscriptionFeatureBits", "(J)I", getSubscriptionFeatureBits), JF("_isUsingAdminLogin", "(J)Z", isUsingAdminLogin), @@ -199,6 +201,15 @@ jint JNICALL ScriptMethodsPlayerAccountNamespace::getAccountNumLots(JNIEnv *env, // ---------------------------------------------------------------------- +jint JNICALL ScriptMethodsPlayerAccountNamespace::getMaxHousingLots(JNIEnv *env, jobject self) +{ + UNREF(env); + UNREF(self); + return ConfigServerGame::getMaxHousingLots(); +} + +// ---------------------------------------------------------------------- + jint JNICALL ScriptMethodsPlayerAccountNamespace::getGameFeatureBits(JNIEnv *env, jobject self, jlong player) { CreatureObject *playerObject = 0; diff --git a/engine/server/library/serverUtility/src/shared/AdminAccountManager.cpp b/engine/server/library/serverUtility/src/shared/AdminAccountManager.cpp index 2118aa18..4a1f5a6a 100755 --- a/engine/server/library/serverUtility/src/shared/AdminAccountManager.cpp +++ b/engine/server/library/serverUtility/src/shared/AdminAccountManager.cpp @@ -77,7 +77,20 @@ int AdminAccountManager::getAdminLevel(const std::string & account) std::ostringstream postBuffer; postBuffer << "user_name=" << account << "&secretKey=" << ConfigServerUtility::getExternalAdminLevelsSecretKey(); std::string response = webAPI::simplePost(ConfigServerUtility::getExternalAdminLevelsURL(), std::string(postBuffer.str()), ""); - level = std::stoi(response); + // aconite 4/3/22 + // stoi inconsistently throws an invalid argument exception from this request + // which causes the login and/or game server to crash on an auth or /setGod; + // this is a temporary patch to safeguard against that until this can be further evaluated + try + { + int newLevel = std::stoi(response); + if(newLevel != 0) + { + level = newLevel; + } + } + catch(std::invalid_argument const& ex) {} + catch(std::out_of_range const& ex) {} return level; }