diff --git a/Source/Contents/World/World.h b/Source/Contents/World/World.h index 750ed058..dd4cf168 100644 --- a/Source/Contents/World/World.h +++ b/Source/Contents/World/World.h @@ -28,6 +28,7 @@ public: virtual ~CWorld(); CWorld(const CWorld&) = delete; CWorld& operator=(const CWorld&) = delete; + void LoadMapEffects(); void Clear(); void OnExitFrame(); void OnProcess(); diff --git a/Source/Contents/World/WorldEffects.cpp b/Source/Contents/World/WorldEffects.cpp new file mode 100644 index 00000000..d2510471 --- /dev/null +++ b/Source/Contents/World/WorldEffects.cpp @@ -0,0 +1,46 @@ +#include "Contents/World/World.h" + +#include "Client/Mode/CGameMode.h" +#include "Contents/Effects/EffectLists.h" +#include "Contents/Effects/EffectMaker.h" +#include "Contents/Sound/SoundConfiguration.h" +#include "Contents/Sound/SoundMaker.h" +#include "Resource/ResourceMgr.h" +#include "Resource/World/WorldResource.h" + +#include + +// GLOBAL: gl_25108 +SoundConfiguration g_soundConfiguration; + +// OFFSET: 0x00AC9040 +// FUNCTION: fn_17682 +void CWorld::LoadMapEffects() { + std::string name = reinterpret_cast(this->gameMode->SendMsg(9, 0, 0, 0, 0)); + C3dWorldRes* resource = static_cast(ResourceMgr::Instance().Load(name.c_str())); + + for (auto it = resource->effects.begin(); it != resource->effects.end(); ++it) { + WorldEffectRecord* record = *it; + + if (g_effectMgr->HasAllocator(record->id)) { + g_effectMgr->Spawn(0, record->id, record->position[0], record->position[1], record->position[2], 0, -1, 0, 0); + } else { + CEffectMaker* effect = new CEffectMaker; + const int address = reinterpret_cast(record); + effect->SendMsg(nullptr, 14, 0, address, address >> 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + this->objects.push_back(effect); + } + } + + g_effectMgr->LoadMapEffectScript(true); + + if (g_soundConfiguration.mode != 0) { + for (auto it = resource->sounds.begin(); it != resource->sounds.end(); ++it) { + WorldSoundRecord* record = *it; + CSoundMaker* sound = new CSoundMaker; + const int address = reinterpret_cast(record); + sound->SendMsg(nullptr, 14, 0, address, address >> 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + this->objects.push_back(sound); + } + } +} diff --git a/data/compile.json b/data/compile.json index 5952bb77..99050795 100644 --- a/data/compile.json +++ b/data/compile.json @@ -653,6 +653,7 @@ "Source/Contents/UserData/NormalItemSlots.cpp": 4, "Source/Contents/World/SkyBox.cpp": 3, "Source/Contents/World/WorldActors.cpp": 4, + "Source/Contents/World/WorldEffects.cpp": 3, "Source/Contents/World/WorldModelLoading.cpp": 3, "Source/Contents/World/WorldModelView.cpp": 3, "Source/Contents/World/WorldObjects.cpp": 4,