mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-01-09 22:37:07 +00:00
add child loading (#1706)
Tested that the NT combat challenge, am skullkin towers and qa wall in avant gardens all function as before.
This commit is contained in:
parent
0b261e934f
commit
021db0ecd1
@ -775,6 +775,12 @@ void Entity::Initialize() {
|
|||||||
// Hacky way to trigger these when the object has had a chance to get constructed
|
// Hacky way to trigger these when the object has had a chance to get constructed
|
||||||
AddCallbackTimer(0, [this]() {
|
AddCallbackTimer(0, [this]() {
|
||||||
this->GetScript()->OnStartup(this);
|
this->GetScript()->OnStartup(this);
|
||||||
|
if (this->m_ParentEntity) {
|
||||||
|
GameMessages::ChildLoaded childLoaded;
|
||||||
|
childLoaded.childID = this->m_ObjectID;
|
||||||
|
childLoaded.templateID = this->GetLOT();
|
||||||
|
this->m_ParentEntity->OnChildLoaded(childLoaded);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!m_Character && Game::entityManager->GetGhostingEnabled()) {
|
if (!m_Character && Game::entityManager->GetGhostingEnabled()) {
|
||||||
@ -1501,6 +1507,10 @@ void Entity::OnShootingGalleryFire(GameMessages::ShootingGalleryFire& fire) {
|
|||||||
GetScript()->OnShootingGalleryFire(*this, fire);
|
GetScript()->OnShootingGalleryFire(*this, fire);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entity::OnChildLoaded(GameMessages::ChildLoaded& childLoaded) {
|
||||||
|
GetScript()->OnChildLoaded(*this, childLoaded);
|
||||||
|
}
|
||||||
|
|
||||||
void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {
|
void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {
|
||||||
GetScript()->OnRequestActivityExit(sender, player, canceled);
|
GetScript()->OnRequestActivityExit(sender, player, canceled);
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
namespace GameMessages {
|
namespace GameMessages {
|
||||||
struct ActivityNotify;
|
struct ActivityNotify;
|
||||||
struct ShootingGalleryFire;
|
struct ShootingGalleryFire;
|
||||||
|
struct ChildLoaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Loot {
|
namespace Loot {
|
||||||
@ -217,6 +218,7 @@ public:
|
|||||||
void OnZonePropertyModelRotated(Entity* player);
|
void OnZonePropertyModelRotated(Entity* player);
|
||||||
void OnActivityNotify(GameMessages::ActivityNotify& notify);
|
void OnActivityNotify(GameMessages::ActivityNotify& notify);
|
||||||
void OnShootingGalleryFire(GameMessages::ShootingGalleryFire& notify);
|
void OnShootingGalleryFire(GameMessages::ShootingGalleryFire& notify);
|
||||||
|
void OnChildLoaded(GameMessages::ChildLoaded& childLoaded);
|
||||||
|
|
||||||
void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData);
|
void OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData);
|
||||||
void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier);
|
void OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier);
|
||||||
|
@ -758,6 +758,13 @@ namespace GameMessages {
|
|||||||
NiPoint3 target{};
|
NiPoint3 target{};
|
||||||
NiQuaternion rotation{};
|
NiQuaternion rotation{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ChildLoaded : public GameMsg {
|
||||||
|
ChildLoaded() : GameMsg(MessageType::Game::CHILD_LOADED) {}
|
||||||
|
|
||||||
|
LOT templateID{};
|
||||||
|
LWOOBJID childID{};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GAMEMESSAGES_H
|
#endif // GAMEMESSAGES_H
|
||||||
|
@ -64,21 +64,22 @@ void AmSkullkinTower::SpawnLegs(Entity* self, const std::string& loc) {
|
|||||||
|
|
||||||
info.rot = NiQuaternion::LookAt(info.pos, self->GetPosition());
|
info.rot = NiQuaternion::LookAt(info.pos, self->GetPosition());
|
||||||
|
|
||||||
auto* entity = Game::entityManager->CreateEntity(info);
|
auto* entity = Game::entityManager->CreateEntity(info, nullptr, self);
|
||||||
|
|
||||||
Game::entityManager->ConstructEntity(entity);
|
Game::entityManager->ConstructEntity(entity);
|
||||||
|
|
||||||
OnChildLoaded(self, entity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AmSkullkinTower::OnChildLoaded(Entity* self, Entity* child) {
|
void AmSkullkinTower::OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) {
|
||||||
auto legTable = self->GetVar<std::vector<LWOOBJID>>(u"legTable");
|
auto legTable = self.GetVar<std::vector<LWOOBJID>>(u"legTable");
|
||||||
|
|
||||||
legTable.push_back(child->GetObjectID());
|
legTable.push_back(childLoaded.childID);
|
||||||
|
|
||||||
self->SetVar(u"legTable", legTable);
|
self.SetVar(u"legTable", legTable);
|
||||||
|
|
||||||
const auto selfID = self->GetObjectID();
|
const auto selfID = self.GetObjectID();
|
||||||
|
auto* const child = Game::entityManager->GetEntity(childLoaded.childID);
|
||||||
|
|
||||||
|
if (!child) return;
|
||||||
|
|
||||||
child->AddDieCallback([this, selfID, child]() {
|
child->AddDieCallback([this, selfID, child]() {
|
||||||
auto* self = Game::entityManager->GetEntity(selfID);
|
auto* self = Game::entityManager->GetEntity(selfID);
|
||||||
|
@ -8,7 +8,7 @@ public:
|
|||||||
|
|
||||||
void SpawnLegs(Entity* self, const std::string& loc);
|
void SpawnLegs(Entity* self, const std::string& loc);
|
||||||
|
|
||||||
void OnChildLoaded(Entity* self, Entity* child);
|
void OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) override;
|
||||||
|
|
||||||
void NotifyDie(Entity* self, Entity* other, Entity* killer);
|
void NotifyDie(Entity* self, Entity* other, Entity* killer);
|
||||||
|
|
||||||
|
@ -77,8 +77,6 @@ void QbSpawner::OnTimerDone(Entity* self, std::string timerName) {
|
|||||||
|
|
||||||
auto* child = Game::entityManager->CreateEntity(info, nullptr, self);
|
auto* child = Game::entityManager->CreateEntity(info, nullptr, self);
|
||||||
Game::entityManager->ConstructEntity(child);
|
Game::entityManager->ConstructEntity(child);
|
||||||
|
|
||||||
OnChildLoaded(self, child);
|
|
||||||
} else {
|
} else {
|
||||||
auto* mob = Game::entityManager->GetEntity(mobTable[i]);
|
auto* mob = Game::entityManager->GetEntity(mobTable[i]);
|
||||||
AggroTargetObject(self, mob);
|
AggroTargetObject(self, mob);
|
||||||
@ -88,16 +86,19 @@ void QbSpawner::OnTimerDone(Entity* self, std::string timerName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QbSpawner::OnChildLoaded(Entity* self, Entity* child) {
|
void QbSpawner::OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) {
|
||||||
auto mobTable = self->GetVar<std::vector<LWOOBJID>>(u"mobTable");
|
auto* const child = Game::entityManager->GetEntity(childLoaded.childID);
|
||||||
|
if (!child) return;
|
||||||
|
|
||||||
|
auto mobTable = self.GetVar<std::vector<LWOOBJID>>(u"mobTable");
|
||||||
auto tableLoc = child->GetVar<int>(u"mobTableLoc");
|
auto tableLoc = child->GetVar<int>(u"mobTableLoc");
|
||||||
|
|
||||||
mobTable[tableLoc] = child->GetObjectID();
|
mobTable[tableLoc] = child->GetObjectID();
|
||||||
self->SetVar<std::vector<LWOOBJID>>(u"mobTable", mobTable);
|
self.SetVar<std::vector<LWOOBJID>>(u"mobTable", mobTable);
|
||||||
|
|
||||||
AggroTargetObject(self, child);
|
AggroTargetObject(&self, child);
|
||||||
|
|
||||||
const auto selfID = self->GetObjectID();
|
const auto selfID = self.GetObjectID();
|
||||||
|
|
||||||
child->AddDieCallback([this, selfID, child]() {
|
child->AddDieCallback([this, selfID, child]() {
|
||||||
auto* self = Game::entityManager->GetEntity(selfID);
|
auto* self = Game::entityManager->GetEntity(selfID);
|
||||||
|
@ -6,7 +6,7 @@ public:
|
|||||||
void OnStartup(Entity* self) override;
|
void OnStartup(Entity* self) override;
|
||||||
void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) override;
|
void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) override;
|
||||||
void OnTimerDone(Entity* self, std::string timerName) override;
|
void OnTimerDone(Entity* self, std::string timerName) override;
|
||||||
void OnChildLoaded(Entity* self, Entity* child);
|
void OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) override;
|
||||||
void OnChildRemoved(Entity* self, Entity* child);
|
void OnChildRemoved(Entity* self, Entity* child);
|
||||||
void AggroTargetObject(Entity* self, Entity* enemy);
|
void AggroTargetObject(Entity* self, Entity* enemy);
|
||||||
private:
|
private:
|
||||||
|
@ -91,7 +91,7 @@ void NtCombatChallengeServer::SpawnTargetDummy(Entity* self) {
|
|||||||
info.rot = self->GetRotation();
|
info.rot = self->GetRotation();
|
||||||
info.settings = { new LDFData<std::string>(u"custom_script_server", "scripts\\02_server\\Map\\NT\\L_NT_COMBAT_CHALLENGE_DUMMY.lua") };
|
info.settings = { new LDFData<std::string>(u"custom_script_server", "scripts\\02_server\\Map\\NT\\L_NT_COMBAT_CHALLENGE_DUMMY.lua") };
|
||||||
|
|
||||||
auto* dummy = Game::entityManager->CreateEntity(info);
|
auto* dummy = Game::entityManager->CreateEntity(info, nullptr, self);
|
||||||
|
|
||||||
dummy->SetVar(u"challengeObjectID", self->GetObjectID());
|
dummy->SetVar(u"challengeObjectID", self->GetObjectID());
|
||||||
|
|
||||||
@ -104,26 +104,18 @@ void NtCombatChallengeServer::SetAttackImmunity(LWOOBJID objID, bool bTurnOn) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NtCombatChallengeServer::OnChildLoaded(Entity* self, Entity* child) {
|
void NtCombatChallengeServer::OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) {
|
||||||
auto targetNumber = self->GetVar<int32_t>(u"TargetNumber");
|
auto* const child = Game::entityManager->GetEntity(childLoaded.childID);
|
||||||
if (targetNumber == 0) targetNumber = 1;
|
|
||||||
self->SetVar(u"TargetNumber", targetNumber + 1);
|
|
||||||
|
|
||||||
const auto playerID = self->GetVar<LWOOBJID>(u"playerID");
|
if (child) {
|
||||||
|
child->SetRotation(NiQuaternion::FromEulerAngles(child->GetRotation().GetEulerAngles() += NiPoint3(0, PI, 0))); // rotate 180 degrees
|
||||||
auto* player = Game::entityManager->GetEntity(playerID);
|
|
||||||
|
|
||||||
if (player == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
child->SetRotation(NiQuaternion::LookAt(child->GetPosition(), player->GetPosition()));
|
self.SetVar(u"currentTargetID", child->GetObjectID());
|
||||||
|
|
||||||
self->SetVar(u"currentTargetID", child->GetObjectID());
|
|
||||||
|
|
||||||
Game::entityManager->SerializeEntity(child);
|
Game::entityManager->SerializeEntity(child);
|
||||||
|
|
||||||
child->GetGroups().push_back("targets_" + std::to_string(self->GetObjectID()));
|
child->GetGroups().push_back("targets_" + std::to_string(self.GetObjectID()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NtCombatChallengeServer::ResetGame(Entity* self) {
|
void NtCombatChallengeServer::ResetGame(Entity* self) {
|
||||||
|
@ -12,7 +12,7 @@ public:
|
|||||||
void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) override;
|
void OnMessageBoxResponse(Entity* self, Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) override;
|
||||||
void SpawnTargetDummy(Entity* self);
|
void SpawnTargetDummy(Entity* self);
|
||||||
void SetAttackImmunity(LWOOBJID objID, bool bTurnOn);
|
void SetAttackImmunity(LWOOBJID objID, bool bTurnOn);
|
||||||
void OnChildLoaded(Entity* self, Entity* child);
|
void OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) override;
|
||||||
void ResetGame(Entity* self);
|
void ResetGame(Entity* self);
|
||||||
void OnActivityTimerUpdate(Entity* self, float timeRemaining);
|
void OnActivityTimerUpdate(Entity* self, float timeRemaining);
|
||||||
void OnTimerDone(Entity* self, std::string timerName) override;
|
void OnTimerDone(Entity* self, std::string timerName) override;
|
||||||
|
@ -373,6 +373,14 @@ namespace CppScripts {
|
|||||||
* @param fire The firing data
|
* @param fire The firing data
|
||||||
*/
|
*/
|
||||||
virtual void OnShootingGalleryFire(Entity& self, GameMessages::ShootingGalleryFire& fire) {};
|
virtual void OnShootingGalleryFire(Entity& self, GameMessages::ShootingGalleryFire& fire) {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles when a child is loaded
|
||||||
|
*
|
||||||
|
* @param self
|
||||||
|
* @param fire The child info
|
||||||
|
*/
|
||||||
|
virtual void OnChildLoaded(Entity& self, GameMessages::ChildLoaded& childLoaded) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
Script* const GetScript(Entity* parent, const std::string& scriptName);
|
Script* const GetScript(Entity* parent, const std::string& scriptName);
|
||||||
|
Loading…
Reference in New Issue
Block a user