From f727e3951c63bcd178d30a8d7696be1704269054 Mon Sep 17 00:00:00 2001 From: Aaron Kimbre Date: Thu, 9 Nov 2023 21:28:52 -0600 Subject: [PATCH] consolidate code --- dGame/dUtilities/VanityUtilities.cpp | 101 +++++-------------- dGame/dUtilities/VanityUtilities.h | 2 +- dZoneManager/Level.cpp | 139 ++++++++++++++------------- dZoneManager/Level.h | 2 + 4 files changed, 97 insertions(+), 147 deletions(-) diff --git a/dGame/dUtilities/VanityUtilities.cpp b/dGame/dUtilities/VanityUtilities.cpp index e047eb83..d2941620 100644 --- a/dGame/dUtilities/VanityUtilities.cpp +++ b/dGame/dUtilities/VanityUtilities.cpp @@ -18,6 +18,7 @@ #include "Spawner.h" #include "dZoneManager.h" #include "../dWorldServer/ObjectIDManager.h" +#include "Level.h" #include @@ -95,7 +96,6 @@ void VanityUtilities::SpawnVanity() { taken.push_back(npcIndex); - // Spawn the NPC LOG("ldf size is %i", npc.ldf.size()); if (npc.ldf.empty()) { npc.ldf = { @@ -105,10 +105,14 @@ void VanityUtilities::SpawnVanity() { } // Spawn the NPC - auto* npcEntity = SpawnNPC(npc.m_LOT, npc.m_Name, location.m_Position, location.m_Rotation, npc.m_Equipment, npc.ldf); - if (!npc.m_Phrases.empty()) { - npcEntity->SetVar>(u"chats", m_PartyPhrases); - SetupNPCTalk(npcEntity); + if (npc.m_LOT == 176){ + npc.m_ID = SpawnSpawner(npc.m_LOT, location.m_Position, location.m_Rotation, npc.ldf); + } else { + auto* npcEntity = SpawnNPC(npc.m_LOT, npc.m_Name, location.m_Position, location.m_Rotation, npc.m_Equipment, npc.ldf); + if (!npc.m_Phrases.empty()) { + npcEntity->SetVar>(u"chats", m_PartyPhrases); + SetupNPCTalk(npcEntity); + } } } return; @@ -137,9 +141,7 @@ void VanityUtilities::SpawnVanity() { }; } if (npc.m_LOT == 176){ - auto* spawner = SpawnSpawner(npc.m_LOT, location.m_Position, location.m_Rotation, npc.ldf); - if (!spawner) continue; - npc.m_ID = spawner->m_Info.spawnerID; + npc.m_ID = SpawnSpawner(npc.m_LOT, location.m_Position, location.m_Rotation, npc.ldf); } else { // Spawn the NPC auto* npcEntity = SpawnNPC(npc.m_LOT, npc.m_Name, location.m_Position, location.m_Rotation, npc.m_Equipment, npc.ldf); @@ -181,76 +183,19 @@ void VanityUtilities::SpawnVanity() { } } -Spawner* VanityUtilities::SpawnSpawner(LOT lot, const NiPoint3& position, const NiQuaternion& rotation, const std::vector& ldf){ - SpawnerInfo spawnInfo = SpawnerInfo(); - SpawnerNode* node = new SpawnerNode(); - spawnInfo.templateID = lot; - spawnInfo.spawnerID = ObjectIDManager::Instance()->GenerateObjectID(); - spawnInfo.templateScale = 1.0; - node->position = position; - node->rotation = rotation; - node->config = ldf; - spawnInfo.nodes.push_back(node); - for (LDFBaseData* data : node->config) { - if (data) { - if (data->GetKey() == u"spawntemplate") { - spawnInfo.templateID = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"spawner_node_id") { - node->nodeID = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"spawner_name") { - spawnInfo.name = data->GetValueAsString(); - } - - if (data->GetKey() == u"max_to_spawn") { - spawnInfo.maxToSpawn = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"spawner_active_on_load") { - spawnInfo.activeOnLoad = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"active_on_load") { - spawnInfo.activeOnLoad = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"respawn") { - if (data->GetValueType() == eLDFType::LDF_TYPE_FLOAT) // Floats are in seconds - { - spawnInfo.respawnTime = std::stof(data->GetValueAsString()); - } else if (data->GetValueType() == eLDFType::LDF_TYPE_U32) // Ints are in ms? - { - spawnInfo.respawnTime = std::stoul(data->GetValueAsString()) / 1000; - } - } - if (data->GetKey() == u"spawnsGroupOnSmash") { - spawnInfo.spawnsOnSmash = std::stoi(data->GetValueAsString()); - } - if (data->GetKey() == u"spawnNetNameForSpawnGroupOnSmash") { - spawnInfo.spawnOnSmashGroupName = data->GetValueAsString(); - } - if (data->GetKey() == u"groupID") { // Load object groups - std::string groupStr = data->GetValueAsString(); - spawnInfo.groups = GeneralUtils::SplitString(groupStr, ';'); - spawnInfo.groups.erase(spawnInfo.groups.end() - 1); - } - if (data->GetKey() == u"no_auto_spawn") { - spawnInfo.noAutoSpawn = static_cast*>(data)->GetValue(); - } - if (data->GetKey() == u"no_timed_spawn") { - spawnInfo.noTimedSpawn = static_cast*>(data)->GetValue(); - } - if (data->GetKey() == u"spawnActivator") { - spawnInfo.spawnActivator = static_cast*>(data)->GetValue(); - } - } - } - auto* spawner = new Spawner(spawnInfo); - Game::zoneManager->AddSpawner(spawnInfo.spawnerID, spawner); - return spawner; +LWOOBJID VanityUtilities::SpawnSpawner(LOT lot, const NiPoint3& position, const NiQuaternion& rotation, const std::vector& ldf){ + SceneObject obj; + obj.lot = lot; + // guratantee we have no collisions + do { + obj.id = ObjectIDManager::Instance()->GenerateObjectID(); + } while(Game::zoneManager->GetSpawner(obj.id)); + obj.position = position; + obj.rotation = rotation; + obj.settings = ldf; + Level::MakeSpawner(obj); + LOG("created spawner %llu", obj.id); + return obj.id; } Entity* VanityUtilities::SpawnNPC(LOT lot, const std::string& name, const NiPoint3& position, const NiQuaternion& rotation, const std::vector& inventory, const std::vector& ldf) { diff --git a/dGame/dUtilities/VanityUtilities.h b/dGame/dUtilities/VanityUtilities.h index 97738c8d..cff73bce 100644 --- a/dGame/dUtilities/VanityUtilities.h +++ b/dGame/dUtilities/VanityUtilities.h @@ -45,7 +45,7 @@ public: const std::vector& ldf ); - static Spawner* SpawnSpawner( + static LWOOBJID SpawnSpawner( LOT lot, const NiPoint3& position, const NiQuaternion& rotation, diff --git a/dZoneManager/Level.cpp b/dZoneManager/Level.cpp index 953b11e2..4c83d494 100644 --- a/dZoneManager/Level.cpp +++ b/dZoneManager/Level.cpp @@ -38,6 +38,76 @@ Level::~Level() { } } +void Level::MakeSpawner(SceneObject obj){ + SpawnerInfo spawnInfo = SpawnerInfo(); + SpawnerNode* node = new SpawnerNode(); + spawnInfo.templateID = obj.lot; + spawnInfo.spawnerID = obj.id; + spawnInfo.templateScale = obj.scale; + node->position = obj.position; + node->rotation = obj.rotation; + node->config = obj.settings; + spawnInfo.nodes.push_back(node); + for (LDFBaseData* data : obj.settings) { + if (data) { + if (data->GetKey() == u"spawntemplate") { + spawnInfo.templateID = std::stoi(data->GetValueAsString()); + } + + if (data->GetKey() == u"spawner_node_id") { + node->nodeID = std::stoi(data->GetValueAsString()); + } + + if (data->GetKey() == u"spawner_name") { + spawnInfo.name = data->GetValueAsString(); + } + + if (data->GetKey() == u"max_to_spawn") { + spawnInfo.maxToSpawn = std::stoi(data->GetValueAsString()); + } + + if (data->GetKey() == u"spawner_active_on_load") { + spawnInfo.activeOnLoad = std::stoi(data->GetValueAsString()); + } + + if (data->GetKey() == u"active_on_load") { + spawnInfo.activeOnLoad = std::stoi(data->GetValueAsString()); + } + + if (data->GetKey() == u"respawn") { + if (data->GetValueType() == eLDFType::LDF_TYPE_FLOAT) // Floats are in seconds + { + spawnInfo.respawnTime = std::stof(data->GetValueAsString()); + } else if (data->GetValueType() == eLDFType::LDF_TYPE_U32) // Ints are in ms? + { + spawnInfo.respawnTime = std::stoul(data->GetValueAsString()) / 1000; + } + } + if (data->GetKey() == u"spawnsGroupOnSmash") { + spawnInfo.spawnsOnSmash = std::stoi(data->GetValueAsString()); + } + if (data->GetKey() == u"spawnNetNameForSpawnGroupOnSmash") { + spawnInfo.spawnOnSmashGroupName = data->GetValueAsString(); + } + if (data->GetKey() == u"groupID") { // Load object groups + std::string groupStr = data->GetValueAsString(); + spawnInfo.groups = GeneralUtils::SplitString(groupStr, ';'); + spawnInfo.groups.erase(spawnInfo.groups.end() - 1); + } + if (data->GetKey() == u"no_auto_spawn") { + spawnInfo.noAutoSpawn = static_cast*>(data)->GetValue(); + } + if (data->GetKey() == u"no_timed_spawn") { + spawnInfo.noTimedSpawn = static_cast*>(data)->GetValue(); + } + if (data->GetKey() == u"spawnActivator") { + spawnInfo.spawnActivator = static_cast*>(data)->GetValue(); + } + } + } + Game::zoneManager->MakeSpawner(spawnInfo); +} + const void Level::PrintAllObjects() { for (std::map::iterator it = m_ChunkHeaders.begin(); it != m_ChunkHeaders.end(); ++it) { if (it->second.id == Level::ChunkTypeID::SceneObjectData) { @@ -230,74 +300,7 @@ void Level::ReadSceneObjectDataChunk(std::istream& file, Header& header) { } if (obj.lot == 176) { //Spawner - SpawnerInfo spawnInfo = SpawnerInfo(); - SpawnerNode* node = new SpawnerNode(); - spawnInfo.templateID = obj.lot; - spawnInfo.spawnerID = obj.id; - spawnInfo.templateScale = obj.scale; - node->position = obj.position; - node->rotation = obj.rotation; - node->config = obj.settings; - spawnInfo.nodes.push_back(node); - for (LDFBaseData* data : obj.settings) { - if (data) { - if (data->GetKey() == u"spawntemplate") { - spawnInfo.templateID = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"spawner_node_id") { - node->nodeID = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"spawner_name") { - spawnInfo.name = data->GetValueAsString(); - } - - if (data->GetKey() == u"max_to_spawn") { - spawnInfo.maxToSpawn = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"spawner_active_on_load") { - spawnInfo.activeOnLoad = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"active_on_load") { - spawnInfo.activeOnLoad = std::stoi(data->GetValueAsString()); - } - - if (data->GetKey() == u"respawn") { - if (data->GetValueType() == eLDFType::LDF_TYPE_FLOAT) // Floats are in seconds - { - spawnInfo.respawnTime = std::stof(data->GetValueAsString()); - } else if (data->GetValueType() == eLDFType::LDF_TYPE_U32) // Ints are in ms? - { - spawnInfo.respawnTime = std::stoul(data->GetValueAsString()) / 1000; - } - } - if (data->GetKey() == u"spawnsGroupOnSmash") { - spawnInfo.spawnsOnSmash = std::stoi(data->GetValueAsString()); - } - if (data->GetKey() == u"spawnNetNameForSpawnGroupOnSmash") { - spawnInfo.spawnOnSmashGroupName = data->GetValueAsString(); - } - if (data->GetKey() == u"groupID") { // Load object groups - std::string groupStr = data->GetValueAsString(); - spawnInfo.groups = GeneralUtils::SplitString(groupStr, ';'); - spawnInfo.groups.erase(spawnInfo.groups.end() - 1); - } - if (data->GetKey() == u"no_auto_spawn") { - spawnInfo.noAutoSpawn = static_cast*>(data)->GetValue(); - } - if (data->GetKey() == u"no_timed_spawn") { - spawnInfo.noTimedSpawn = static_cast*>(data)->GetValue(); - } - if (data->GetKey() == u"spawnActivator") { - spawnInfo.spawnActivator = static_cast*>(data)->GetValue(); - } - } - } - Spawner* spawner = new Spawner(spawnInfo); - Game::zoneManager->AddSpawner(obj.id, spawner); + MakeSpawner(obj); } else { //Regular object EntityInfo info; info.spawnerID = 0; diff --git a/dZoneManager/Level.h b/dZoneManager/Level.h index 0f8fa72d..a27326a2 100644 --- a/dZoneManager/Level.h +++ b/dZoneManager/Level.h @@ -53,6 +53,8 @@ public: public: Level(Zone* parentZone, const std::string& filepath); ~Level(); + + static void MakeSpawner(SceneObject obj); const void PrintAllObjects();