Another consistency pass

- change NotifyObject to use u16 string
- move stuff to header that is inline
- use u16strings instead of converting to u16 string
- move entity to dEntity
This commit is contained in:
David Markowitz 2023-06-16 01:01:13 -07:00
parent 9a9b9aa813
commit 92006123b8
29 changed files with 142 additions and 183 deletions

View File

@ -305,7 +305,7 @@ file(
file( file(
GLOB HEADERS_DGAME GLOB HEADERS_DGAME
LIST_DIRECTORIES false LIST_DIRECTORIES false
${PROJECT_SOURCE_DIR}/dGame/Entity.h ${PROJECT_SOURCE_DIR}/dGame/dEntity/Entity.h
${PROJECT_SOURCE_DIR}/dGame/dGameMessages/GameMessages.h ${PROJECT_SOURCE_DIR}/dGame/dGameMessages/GameMessages.h
${PROJECT_SOURCE_DIR}/dGame/EntityManager.h ${PROJECT_SOURCE_DIR}/dGame/EntityManager.h
${PROJECT_SOURCE_DIR}/dScripts/CppScripts.h ${PROJECT_SOURCE_DIR}/dScripts/CppScripts.h

View File

@ -1,5 +1,4 @@
set(DGAME_SOURCES "Character.cpp" set(DGAME_SOURCES "Character.cpp"
"Entity.cpp"
"EntityManager.cpp" "EntityManager.cpp"
"LeaderboardManager.cpp" "LeaderboardManager.cpp"
"Player.cpp" "Player.cpp"

View File

@ -247,7 +247,7 @@ const std::vector<Player*>& Player::GetAllPlayers() {
return m_Players; return m_Players;
} }
uint64_t Player::GetDroppedCoins() { uint64_t Player::GetDroppedCoins() const {
return m_DroppedCoins; return m_DroppedCoins;
} }

View File

@ -36,7 +36,7 @@ public:
std::map<LWOOBJID, Loot::Info>& GetDroppedLoot(); std::map<LWOOBJID, Loot::Info>& GetDroppedLoot();
uint64_t GetDroppedCoins(); uint64_t GetDroppedCoins() const;
/** /**
* Setters * Setters

View File

@ -1,2 +1,5 @@
set(DGAME_DENTITY_SOURCES "EntityCallbackTimer.cpp" set(DGAME_DENTITY_SOURCES
"EntityTimer.cpp" PARENT_SCOPE) "Entity.cpp"
"EntityCallbackTimer.cpp"
"EntityTimer.cpp"
PARENT_SCOPE)

View File

@ -905,8 +905,12 @@ void Entity::OnCinematicUpdate(Entity* self, Entity* sender, eCinematicEvent eve
GetScript()->OnCinematicUpdate(self, sender, event, pathName, pathTime, totalTime, waypoint); GetScript()->OnCinematicUpdate(self, sender, event, pathName, pathTime, totalTime, waypoint);
} }
void Entity::NotifyObject(Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void Entity::CancelCallbackTimers() {
GameMessages::SendNotifyObject(GetObjectID(), sender->GetObjectID(), GeneralUtils::ASCIIToUTF16(name), UNASSIGNED_SYSTEM_ADDRESS); m_CallbackTimers.clear();
}
void Entity::NotifyObject(Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
GameMessages::SendNotifyObject(GetObjectID(), sender->GetObjectID(), name, UNASSIGNED_SYSTEM_ADDRESS, param1, param2);
GetScript()->OnNotifyObject(this, sender, name, param1, param2); GetScript()->OnNotifyObject(this, sender, name, param1, param2);
} }
@ -1037,20 +1041,11 @@ void Entity::Kill(Entity* murderer) {
} }
// Track a player smashing something else // Track a player smashing something else
if (murderer) { if (!murderer) return;
auto* murdererCharacterComponent = murderer->GetComponent<CharacterComponent>(); auto* murdererCharacterComponent = murderer->GetComponent<CharacterComponent>();
if (murdererCharacterComponent) { if (murdererCharacterComponent) {
murdererCharacterComponent->UpdatePlayerStatistic(SmashablesSmashed); murdererCharacterComponent->UpdatePlayerStatistic(SmashablesSmashed);
} }
}
}
void Entity::AddDieCallback(const std::function<void()>& callback) {
m_DieCallbacks.push_back(callback);
}
void Entity::AddCollisionPhantomCallback(const std::function<void(Entity* target)>& callback) {
m_PhantomCollisionCallbacks.push_back(callback);
} }
void Entity::AddRebuildCompleteCallback(const std::function<void(Entity* user)>& callback) const { void Entity::AddRebuildCompleteCallback(const std::function<void(Entity* user)>& callback) const {
@ -1063,11 +1058,10 @@ bool Entity::GetIsDead() const {
return dest && dest->GetArmor() == 0 && dest->GetHealth() == 0; return dest && dest->GetArmor() == 0 && dest->GetHealth() == 0;
} }
// Replace static_cast with dynamic_cast
void Entity::AddLootItem(const Loot::Info& info) { void Entity::AddLootItem(const Loot::Info& info) {
if (!IsPlayer()) return; if (!IsPlayer()) return;
auto& droppedLoot = static_cast<Player*>(this)->GetDroppedLoot(); auto* player = dynamic_cast<Player*>(this);
droppedLoot.insert(std::make_pair(info.id, info)); if (player) player->GetDroppedLoot().insert(std::make_pair(info.id, info)); // Move this to Player
} }
// Replace static_cast with dynamic_cast // Replace static_cast with dynamic_cast
@ -1079,20 +1073,23 @@ void Entity::PickupItem(const LWOOBJID& objectID) {
auto* objectsTable = CDClientManager::Instance().GetTable<CDObjectsTable>(); auto* objectsTable = CDClientManager::Instance().GetTable<CDObjectsTable>();
auto* skillsTable = CDClientManager::Instance().GetTable<CDObjectSkillsTable>(); auto* skillsTable = CDClientManager::Instance().GetTable<CDObjectSkillsTable>();
auto& droppedLoot = static_cast<Player*>(this)->GetDroppedLoot(); auto* player = dynamic_cast<Player*>(this);
if (!player) return;
auto& droppedLoot = player->GetDroppedLoot();
auto lootIterator = droppedLoot.find(objectID);
if (lootIterator == droppedLoot.end()) return;
const auto& [objId, loot] = *lootIterator;
// See if there is some faster way to do this.
for (const auto& [lootObjId, loot] : droppedLoot) {
if (lootObjId != objectID) continue;
auto* characterComponent = GetComponent<CharacterComponent>(); auto* characterComponent = GetComponent<CharacterComponent>();
if (characterComponent) characterComponent->TrackLOTCollection(loot.lot); if (characterComponent) characterComponent->TrackLOTCollection(loot.lot);
const CDObjects& object = objectsTable->GetByID(loot.lot); const CDObjects& object = objectsTable->GetByID(loot.lot);
if (object.id != 0 && object.type == "Powerup") { if (object.id != 0 && object.type == "Powerup") {
const auto lootLot = loot.lot; const auto lootLot = loot.lot;
auto skills = skillsTable->Query([lootLot](CDObjectSkills entry) {return (entry.objectTemplate == lootLot); }); auto skills = skillsTable->Query([lootLot](CDObjectSkills entry) { return (entry.objectTemplate == lootLot); });
for (const auto& skill : skills) {
auto* skillBehaviorTable = CDClientManager::Instance().GetTable<CDSkillBehaviorTable>(); auto* skillBehaviorTable = CDClientManager::Instance().GetTable<CDSkillBehaviorTable>();
for (const auto& skill : skills) {
auto behaviorData = skillBehaviorTable->GetSkillByID(skill.skillID); auto behaviorData = skillBehaviorTable->GetSkillByID(skill.skillID);
// This should take a skillID, not a behaviorID. // This should take a skillID, not a behaviorID.
SkillComponent::HandleUnmanaged(behaviorData.behaviorID, GetObjectID()); SkillComponent::HandleUnmanaged(behaviorData.behaviorID, GetObjectID());
@ -1104,48 +1101,52 @@ void Entity::PickupItem(const LWOOBJID& objectID) {
} else { } else {
inventoryComponent->AddItem(loot.lot, loot.count, eLootSourceType::PICKUP, eInventoryType::INVALID, {}, LWOOBJID_EMPTY, true, false, LWOOBJID_EMPTY, eInventoryType::INVALID, 1); inventoryComponent->AddItem(loot.lot, loot.count, eLootSourceType::PICKUP, eInventoryType::INVALID, {}, LWOOBJID_EMPTY, true, false, LWOOBJID_EMPTY, eInventoryType::INVALID, 1);
} }
} droppedLoot.erase(lootIterator);
droppedLoot.erase(objectID);
} }
// This functions name is misleading and should not modify the number of dropped coins. // This functions name is misleading and should not modify the number of dropped coins.
// A separate function, PickupCoins should modify that. // A separate function, PickupCoins should modify that.
// Replace static_cast with dynamic_cast // Replace static_cast with dynamic_cast
bool Entity::CanPickupCoins(const uint64_t& count) { bool Entity::CanPickupCoins(const uint64_t& count) const {
if (!IsPlayer()) return false; if (!IsPlayer()) return false;
auto* player = static_cast<Player*>(this); const auto* player = dynamic_cast<const Player*>(this);
auto droppedCoins = player->GetDroppedCoins(); return count <= player->GetDroppedCoins();
if (count > droppedCoins) { }
return false;
} else { void Entity::PickupCoins(const uint64_t& count) {
player->SetDroppedCoins(droppedCoins - count); if (!IsPlayer()) return;
return true; auto* player = dynamic_cast<Player*>(this);
} if (!player) return;
const auto droppedCoins = player->GetDroppedCoins();
if (count <= droppedCoins) player->SetDroppedCoins(droppedCoins - count);
} }
// Replace static_cast with dynamic_cast
void Entity::RegisterCoinDrop(const uint64_t& coinsDropped) { void Entity::RegisterCoinDrop(const uint64_t& coinsDropped) {
if (!IsPlayer()) return; if (!IsPlayer()) return;
auto* player = static_cast<Player*>(this); auto* player = dynamic_cast<Player*>(this);
if (!player) return;
player->SetDroppedCoins(player->GetDroppedCoins() + coinsDropped); player->SetDroppedCoins(player->GetDroppedCoins() + coinsDropped);
} }
void Entity::AddChild(Entity* child) { void Entity::AddChild(Entity* child) {
m_IsParentChildDirty = true; m_IsParentChildDirty = true;
if (std::find(m_ChildEntities.begin(), m_ChildEntities.end(), child) == m_ChildEntities.end()) m_ChildEntities.push_back(child); if (std::find(m_ChildEntities.begin(), m_ChildEntities.end(), child) != m_ChildEntities.end()) return;
m_ChildEntities.push_back(child);
} }
void Entity::RemoveChild(Entity* child) { void Entity::RemoveChild(Entity* child) {
if (!child) return; if (!child) return;
uint32_t entityPosition = 0; uint32_t entityPosition = 0;
auto toRemove = std::remove(m_ChildEntities.begin(), m_ChildEntities.end(), child); auto toRemove = std::remove(m_ChildEntities.begin(), m_ChildEntities.end(), child);
if (toRemove != m_ChildEntities.end()) m_IsParentChildDirty = true; if (toRemove != m_ChildEntities.end()) {
m_ChildEntities.erase(toRemove, m_ChildEntities.end()); m_ChildEntities.erase(toRemove, m_ChildEntities.end());
m_IsParentChildDirty = true;
}
} }
void Entity::RemoveParent() { void Entity::RemoveParent() {
if (m_ParentEntity) m_IsParentChildDirty = true; if (m_ParentEntity) m_IsParentChildDirty = true;
else Game::logger->Log("Entity", "Attempted to remove parent from(objid:lot) (%llu:%i) when no parent existed", GetObjectID(), GetLOT()); else Game::logger->Log("Entity", "WARNING: Attempted to remove parent from(objid:lot) (%llu:%i) when no parent existed", GetObjectID(), GetLOT());
this->m_ParentEntity = nullptr; this->m_ParentEntity = nullptr;
} }
@ -1164,13 +1165,8 @@ bool Entity::HasTimer(const std::string& name) {
return possibleTimer != m_Timers.end(); return possibleTimer != m_Timers.end();
} }
void Entity::CancelCallbackTimers() {
m_CallbackTimers.clear();
}
void Entity::ScheduleKillAfterUpdate(Entity* murderer) { void Entity::ScheduleKillAfterUpdate(Entity* murderer) {
EntityManager::Instance()->ScheduleForKill(this); EntityManager::Instance()->ScheduleForKill(this);
if (murderer) m_ScheduleKiller = murderer; if (murderer) m_ScheduleKiller = murderer;
} }
@ -1180,10 +1176,10 @@ void Entity::CancelTimer(const std::string& name) {
}); });
m_Timers.erase(m_Timers.begin(), toErase); m_Timers.erase(m_Timers.begin(), toErase);
} }
// ### LEFT OFF HERE ###
void Entity::CancelAllTimers() { void Entity::CancelAllTimers() {
m_Timers.clear(); m_Timers.clear();
m_CallbackTimers.clear(); CancelCallbackTimers();
} }
bool Entity::IsPlayer() const { bool Entity::IsPlayer() const {
@ -1207,22 +1203,8 @@ Entity* Entity::GetOwner() const {
return const_cast<Entity*>(this); return const_cast<Entity*>(this);
} }
const NiPoint3& Entity::GetDefaultPosition() const {
return m_DefaultPosition;
}
const NiQuaternion& Entity::GetDefaultRotation() const {
return m_DefaultRotation;
}
void Entity::SetOwnerOverride(const LWOOBJID& value) {
m_OwnerOverride = value;
}
void Entity::SetObservers(int8_t value) { void Entity::SetObservers(int8_t value) {
if (value < 0) { if (value < 0) value = 0;
value = 0;
}
m_Observers = value; m_Observers = value;
} }
@ -1241,7 +1223,7 @@ bool Entity::IsSleeping() const {
return m_IsGhostingCandidate && m_Observers == 0; return m_IsGhostingCandidate && m_Observers == 0;
} }
// The following 3 should share a base component class so we can else if it.
const NiPoint3& Entity::GetPosition() const { const NiPoint3& Entity::GetPosition() const {
auto* controllablePhysicsComponent = GetComponent<ControllablePhysicsComponent>(); auto* controllablePhysicsComponent = GetComponent<ControllablePhysicsComponent>();
@ -1354,36 +1336,6 @@ void Entity::SetRotation(const NiQuaternion& rotation) {
EntityManager::Instance()->SerializeEntity(this); EntityManager::Instance()->SerializeEntity(this);
} }
// Move to header
bool Entity::GetBoolean(const std::u16string& name) const {
return GetVar<bool>(name);
}
// Move to header
int32_t Entity::GetI32(const std::u16string& name) const {
return GetVar<int32_t>(name);
}
// Move to header
int64_t Entity::GetI64(const std::u16string& name) const {
return GetVar<int64_t>(name);
}
// Move to header
void Entity::SetBoolean(const std::u16string& name, const bool value) {
SetVar(name, value);
}
// Move to header
void Entity::SetI32(const std::u16string& name, const int32_t value) {
SetVar(name, value);
}
// Move to header
void Entity::SetI64(const std::u16string& name, const int64_t value) {
SetVar(name, value);
}
bool Entity::HasVar(const std::u16string& name) const { bool Entity::HasVar(const std::u16string& name) const {
auto hasVar = std::find_if(m_Settings.begin(), m_Settings.end(), [&name](const LDFBaseData* data) { auto hasVar = std::find_if(m_Settings.begin(), m_Settings.end(), [&name](const LDFBaseData* data) {
return data->GetKey() == name; return data->GetKey() == name;
@ -1391,11 +1343,6 @@ bool Entity::HasVar(const std::u16string& name) const {
return hasVar != m_Settings.end(); return hasVar != m_Settings.end();
} }
// Move to header
void Entity::SetNetworkId(const uint16_t id) {
m_NetworkID = id;
}
std::vector<LWOOBJID>& Entity::GetTargetsInPhantom() { std::vector<LWOOBJID>& Entity::GetTargetsInPhantom() {
auto toRemove = std::remove_if(m_TargetsInPhantom.begin(), m_TargetsInPhantom.end(), [this](const LWOOBJID& id) { auto toRemove = std::remove_if(m_TargetsInPhantom.begin(), m_TargetsInPhantom.end(), [this](const LWOOBJID& id) {
return EntityManager::Instance()->GetEntity(id) == nullptr; return EntityManager::Instance()->GetEntity(id) == nullptr;

View File

@ -2,6 +2,7 @@
#define __ENTITY__H__ #define __ENTITY__H__
#include <memory> #include <memory>
#include <functional>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
@ -110,14 +111,14 @@ public:
void SetObservers(const int8_t value); void SetObservers(const int8_t value);
const uint16_t GetNetworkId() const { return m_NetworkID; } const uint16_t GetNetworkId() const { return m_NetworkID; }
void SetNetworkId(const uint16_t id); void SetNetworkId(const uint16_t id) { m_NetworkID = id; }
Entity* GetOwner() const; Entity* GetOwner() const;
void SetOwnerOverride(const LWOOBJID& value); void SetOwnerOverride(const LWOOBJID& value) { m_OwnerOverride = value; };
const NiPoint3& GetDefaultPosition() const; const NiPoint3& GetDefaultPosition() const { return m_DefaultPosition; };
const NiQuaternion& GetDefaultRotation() const; const NiQuaternion& GetDefaultRotation() const { return m_DefaultRotation; };
const float GetDefaultScale() const { return m_Scale; } const float GetDefaultScale() const { return m_Scale; }
@ -178,7 +179,7 @@ public:
void OnCinematicUpdate(Entity* self, Entity* sender, const eCinematicEvent event, const std::u16string& pathName, void OnCinematicUpdate(Entity* self, Entity* sender, const eCinematicEvent event, const std::u16string& pathName,
const float pathTime, const float totalTime, const int32_t waypoint); const float pathTime, const float totalTime, const int32_t waypoint);
void NotifyObject(Entity* sender, const std::string& name, const int32_t param1 = 0, const int32_t param2 = 0); void NotifyObject(Entity* sender, const std::u16string& name, const int32_t param1 = 0, const int32_t param2 = 0);
void OnEmoteReceived(const int32_t emote, Entity* target); void OnEmoteReceived(const int32_t emote, Entity* target);
void OnUse(Entity* originator); void OnUse(Entity* originator);
@ -202,14 +203,15 @@ public:
void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u""); void Smash(const LWOOBJID source = LWOOBJID_EMPTY, const eKillType killType = eKillType::VIOLENT, const std::u16string& deathType = u"");
void Kill(Entity* murderer = nullptr); void Kill(Entity* murderer = nullptr);
void AddRebuildCompleteCallback(const std::function<void(Entity* user)>& callback) const; void AddRebuildCompleteCallback(const std::function<void(Entity* user)>& callback) const;
void AddCollisionPhantomCallback(const std::function<void(Entity* target)>& callback); void AddCollisionPhantomCallback(const std::function<void(Entity* target)>& callback) { m_PhantomCollisionCallbacks.push_back(callback); };
void AddDieCallback(const std::function<void()>& callback); void AddDieCallback(const std::function<void()>& callback) { m_DieCallbacks.push_back(callback); };
void Resurrect(); void Resurrect();
void AddLootItem(const Loot::Info& info); void AddLootItem(const Loot::Info& info);
void PickupItem(const LWOOBJID& objectID); void PickupItem(const LWOOBJID& objectID);
bool CanPickupCoins(const uint64_t& count); bool CanPickupCoins(const uint64_t& count) const;
void PickupCoins(const uint64_t& count);
void RegisterCoinDrop(const uint64_t& count); void RegisterCoinDrop(const uint64_t& count);
void ScheduleKillAfterUpdate(Entity* murderer = nullptr); void ScheduleKillAfterUpdate(Entity* murderer = nullptr);
@ -230,13 +232,13 @@ public:
//Retroactively corrects the model vault size due to incorrect initialization in a previous patch. //Retroactively corrects the model vault size due to incorrect initialization in a previous patch.
void RetroactiveVaultSize(); void RetroactiveVaultSize();
bool GetBoolean(const std::u16string& name) const; bool GetBoolean(const std::u16string& name) const { return GetVar<bool>(name); };
int32_t GetI32(const std::u16string& name) const; int32_t GetI32(const std::u16string& name) const { return GetVar<int32_t>(name); };
int64_t GetI64(const std::u16string& name) const; int64_t GetI64(const std::u16string& name) const { return GetVar<int64_t>(name); };
void SetBoolean(const std::u16string& name, bool value); void SetBoolean(const std::u16string& name, bool value) { SetVar<bool>(name, value); }
void SetI32(const std::u16string& name, int32_t value); void SetI32(const std::u16string& name, int32_t value) { SetVar<int32_t>(name, value); };
void SetI64(const std::u16string& name, int64_t value); void SetI64(const std::u16string& name, int64_t value) { SetVar<int64_t>(name, value); };
bool HasVar(const std::u16string& name) const; bool HasVar(const std::u16string& name) const;

View File

@ -5318,6 +5318,7 @@ void GameMessages::HandlePickupCurrency(RakNet::BitStream* inStream, Entity* ent
auto* ch = entity->GetCharacter(); auto* ch = entity->GetCharacter();
if (entity->CanPickupCoins(currency)) { if (entity->CanPickupCoins(currency)) {
entity->PickupCoins(currency);
ch->SetCoins(ch->GetCoins() + currency, eLootSourceType::PICKUP); ch->SetCoins(ch->GetCoins() + currency, eLootSourceType::PICKUP);
} }
} }

View File

@ -1,5 +1,6 @@
#include "AmBridge.h" #include "AmBridge.h"
#include "EntityManager.h" #include "EntityManager.h"
#include "Entity.h"
void AmBridge::OnStartup(Entity* self) { void AmBridge::OnStartup(Entity* self) {
@ -14,7 +15,7 @@ void AmBridge::OnRebuildComplete(Entity* self, Entity* target) {
auto* console = consoles[0]; auto* console = consoles[0];
console->NotifyObject(self, "BridgeBuilt"); console->NotifyObject(self, u"BridgeBuilt");
self->AddTimer("SmashBridge", 50); self->AddTimer("SmashBridge", 50);
} }

View File

@ -3,6 +3,7 @@
#include "GameMessages.h" #include "GameMessages.h"
#include "SimplePhysicsComponent.h" #include "SimplePhysicsComponent.h"
#include "eTerminateType.h" #include "eTerminateType.h"
#include "Entity.h"
void AmDrawBridge::OnStartup(Entity* self) { void AmDrawBridge::OnStartup(Entity* self) {
self->SetNetworkVar(u"InUse", false); self->SetNetworkVar(u"InUse", false);
@ -72,8 +73,8 @@ void AmDrawBridge::OnTimerDone(Entity* self, std::string timerName) {
} }
} }
void AmDrawBridge::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void AmDrawBridge::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
if (name == "BridgeBuilt") { if (name == u"BridgeBuilt") {
self->SetVar(u"BridgeID", sender->GetObjectID()); self->SetVar(u"BridgeID", sender->GetObjectID());
self->AddTimer("SmashEffectBridge", 45); self->AddTimer("SmashEffectBridge", 45);

View File

@ -7,7 +7,7 @@ public:
void OnStartup(Entity* self) override; void OnStartup(Entity* self) override;
void OnUse(Entity* self, Entity* user) override; void OnUse(Entity* self, Entity* user) override;
void OnTimerDone(Entity* self, std::string timerName) override; void OnTimerDone(Entity* self, std::string timerName) override;
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) override;
void MoveBridgeDown(Entity* self, Entity* bridge, bool down); void MoveBridgeDown(Entity* self, Entity* bridge, bool down);
void NotifyDie(Entity* self, Entity* other); void NotifyDie(Entity* self, Entity* other);

View File

@ -10,7 +10,7 @@ void AmSkullkinDrillStand::OnStartup(Entity* self) {
self->SetProximityRadius(new dpEntity(self->GetObjectID(), { 6, 14, 6 }), "knockback"); self->SetProximityRadius(new dpEntity(self->GetObjectID(), { 6, 14, 6 }), "knockback");
} }
void AmSkullkinDrillStand::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void AmSkullkinDrillStand::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
} }

View File

@ -6,7 +6,7 @@ class AmSkullkinDrillStand : public CppScripts::Script
public: public:
void OnStartup(Entity* self) override; void OnStartup(Entity* self) override;
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) override;
void OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) override; void OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) override;
}; };

View File

@ -1,6 +1,7 @@
#include "NjRailPostServer.h" #include "NjRailPostServer.h"
#include "QuickBuildComponent.h" #include "QuickBuildComponent.h"
#include "EntityManager.h" #include "EntityManager.h"
#include "Entity.h"
void NjRailPostServer::OnStartup(Entity* self) { void NjRailPostServer::OnStartup(Entity* self) {
auto* quickBuildComponent = self->GetComponent<QuickBuildComponent>(); auto* quickBuildComponent = self->GetComponent<QuickBuildComponent>();
@ -9,11 +10,11 @@ void NjRailPostServer::OnStartup(Entity* self) {
} }
} }
void NjRailPostServer::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, void NjRailPostServer::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1,
int32_t param2) { int32_t param2) {
if (name == "PostRebuilt") { if (name == u"PostRebuilt") {
self->SetNetworkVar<bool>(NetworkNotActiveVariable, false); self->SetNetworkVar<bool>(NetworkNotActiveVariable, false);
} else if (name == "PostDied") { } else if (name == u"PostDied") {
self->SetNetworkVar<bool>(NetworkNotActiveVariable, true); self->SetNetworkVar<bool>(NetworkNotActiveVariable, true);
} }
} }
@ -24,7 +25,7 @@ void NjRailPostServer::OnRebuildNotifyState(Entity* self, eRebuildState state) {
if (relatedRail == nullptr) if (relatedRail == nullptr)
return; return;
relatedRail->NotifyObject(self, "PostRebuilt"); relatedRail->NotifyObject(self, u"PostRebuilt");
if (self->GetVar<bool>(NotActiveVariable)) if (self->GetVar<bool>(NotActiveVariable))
return; return;
@ -35,7 +36,7 @@ void NjRailPostServer::OnRebuildNotifyState(Entity* self, eRebuildState state) {
if (relatedRail == nullptr) if (relatedRail == nullptr)
return; return;
relatedRail->NotifyObject(self, "PostDied"); relatedRail->NotifyObject(self, u"PostDied");
} }
} }

View File

@ -3,7 +3,7 @@
class NjRailPostServer : public CppScripts::Script { class NjRailPostServer : public CppScripts::Script {
void OnStartup(Entity* self) override; void OnStartup(Entity* self) override;
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) override;
void OnRebuildNotifyState(Entity* self, eRebuildState state) override; void OnRebuildNotifyState(Entity* self, eRebuildState state) override;
private: private:
Entity* GetRelatedRail(Entity* self); Entity* GetRelatedRail(Entity* self);

View File

@ -4,8 +4,8 @@
#include "Entity.h" #include "Entity.h"
#include "RenderComponent.h" #include "RenderComponent.h"
void CatapultBaseServer::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void CatapultBaseServer::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
if (name == "BouncerBuilt") { if (name == u"BouncerBuilt") {
// start a timer for the arm to player the with bouncer animation // start a timer for the arm to player the with bouncer animation
self->AddTimer("PlatAnim", .75); self->AddTimer("PlatAnim", .75);
@ -46,7 +46,7 @@ void CatapultBaseServer::OnTimerDone(Entity* self, std::string timerName) {
if (bouncer == nullptr) return; if (bouncer == nullptr) return;
// bounce all players // bounce all players
bouncer->NotifyObject(bouncer, "bounceAllInProximity"); // Likely to trigger server side bounce, bodging this bouncer->NotifyObject(bouncer, u"bounceAllInProximity"); // Likely to trigger server side bounce, bodging this
// add a delay to play the animation // add a delay to play the animation
self->AddTimer("launchAnim", .3); self->AddTimer("launchAnim", .3);
} else if (timerName == "resetArm") { } else if (timerName == "resetArm") {

View File

@ -3,7 +3,7 @@
class CatapultBaseServer : public CppScripts::Script { class CatapultBaseServer : public CppScripts::Script {
public: public:
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) override;
void OnTimerDone(Entity* self, std::string timerName) override; void OnTimerDone(Entity* self, std::string timerName) override;
}; };

View File

@ -1,6 +1,7 @@
#include "CatapultBouncerServer.h" #include "CatapultBouncerServer.h"
#include "GameMessages.h" #include "GameMessages.h"
#include "EntityManager.h" #include "EntityManager.h"
#include "Entity.h"
void CatapultBouncerServer::OnRebuildComplete(Entity* self, Entity* target) { void CatapultBouncerServer::OnRebuildComplete(Entity* self, Entity* target) {
GameMessages::SendNotifyClientObject(self->GetObjectID(), u"Built", 0, 0, LWOOBJID_EMPTY, "", UNASSIGNED_SYSTEM_ADDRESS); GameMessages::SendNotifyClientObject(self->GetObjectID(), u"Built", 0, 0, LWOOBJID_EMPTY, "", UNASSIGNED_SYSTEM_ADDRESS);
@ -10,6 +11,6 @@ void CatapultBouncerServer::OnRebuildComplete(Entity* self, Entity* target) {
const auto base = EntityManager::Instance()->GetEntitiesInGroup(self->GetVarAsString(u"BaseGroup")); const auto base = EntityManager::Instance()->GetEntitiesInGroup(self->GetVarAsString(u"BaseGroup"));
for (auto* obj : base) { for (auto* obj : base) {
obj->NotifyObject(self, "BouncerBuilt"); obj->NotifyObject(self, u"BouncerBuilt");
} }
} }

View File

@ -12,11 +12,9 @@ class InvalidScript;
enum class eMissionState : int32_t; enum class eMissionState : int32_t;
enum class ePetTamingNotifyType : uint32_t; enum class ePetTamingNotifyType : uint32_t;
enum class eRebuildState : uint32_t; enum class eRebuildState : uint32_t;
enum class eCinematicEvent : uint32_t;
namespace CppScripts { namespace CppScripts {
extern std::unique_ptr<InvalidScript> invalidScript;
extern std::map<std::string, CppScripts::Script*> m_Scripts;
/** /**
* Base class for all scripts. Includes virtual methods to be overridden to handle LUA equivelent events. * Base class for all scripts. Includes virtual methods to be overridden to handle LUA equivelent events.
* *
@ -76,7 +74,7 @@ namespace CppScripts {
* *
* Equivalent to 'function onNotifyObject(self, msg)' * Equivalent to 'function onNotifyObject(self, msg)'
*/ */
virtual void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) {}; virtual void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) {};
/** /**
* Invoked upon a player exiting the modular build minigame. * Invoked upon a player exiting the modular build minigame.
@ -363,6 +361,8 @@ namespace CppScripts {
*/ */
virtual void OnRequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {}; virtual void OnRequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {};
}; };
Script* GetScript(Entity* parent, const std::string& scriptName); Script* GetScript(Entity* parent, const std::string& scriptName);
extern std::unique_ptr<InvalidScript> invalidScript;
extern std::map<std::string, CppScripts::Script*> m_Scripts;
}; };

View File

@ -3,6 +3,7 @@
#include "GameMessages.h" #include "GameMessages.h"
#include "eTerminateType.h" #include "eTerminateType.h"
#include "eRebuildState.h" #include "eRebuildState.h"
#include "Entity.h"
void FvConsoleLeftQuickbuild::OnStartup(Entity* self) { void FvConsoleLeftQuickbuild::OnStartup(Entity* self) {
self->SetVar(u"IAmBuilt", false); self->SetVar(u"IAmBuilt", false);
@ -16,7 +17,7 @@ void FvConsoleLeftQuickbuild::OnRebuildNotifyState(Entity* self, eRebuildState s
const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility"); const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility");
if (!objects.empty()) { if (!objects.empty()) {
objects[0]->NotifyObject(self, "ConsoleLeftUp"); objects[0]->NotifyObject(self, u"ConsoleLeftUp");
} }
} else if (state == eRebuildState::RESETTING) { } else if (state == eRebuildState::RESETTING) {
self->SetVar(u"IAmBuilt", false); self->SetVar(u"IAmBuilt", false);
@ -25,7 +26,7 @@ void FvConsoleLeftQuickbuild::OnRebuildNotifyState(Entity* self, eRebuildState s
const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility"); const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility");
if (!objects.empty()) { if (!objects.empty()) {
objects[0]->NotifyObject(self, "ConsoleLeftDown"); objects[0]->NotifyObject(self, u"ConsoleLeftDown");
} }
} }
} }
@ -41,7 +42,7 @@ void FvConsoleLeftQuickbuild::OnUse(Entity* self, Entity* user) {
const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility"); const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility");
if (!objects.empty()) { if (!objects.empty()) {
objects[0]->NotifyObject(self, "ConsoleLeftActive"); objects[0]->NotifyObject(self, u"ConsoleLeftActive");
} }
} }

View File

@ -3,6 +3,7 @@
#include "GameMessages.h" #include "GameMessages.h"
#include "eTerminateType.h" #include "eTerminateType.h"
#include "eRebuildState.h" #include "eRebuildState.h"
#include "Entity.h"
void FvConsoleRightQuickbuild::OnStartup(Entity* self) { void FvConsoleRightQuickbuild::OnStartup(Entity* self) {
self->SetVar(u"IAmBuilt", false); self->SetVar(u"IAmBuilt", false);
@ -16,7 +17,7 @@ void FvConsoleRightQuickbuild::OnRebuildNotifyState(Entity* self, eRebuildState
const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility"); const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility");
if (!objects.empty()) { if (!objects.empty()) {
objects[0]->NotifyObject(self, "ConsoleRightUp"); objects[0]->NotifyObject(self, u"ConsoleRightUp");
} }
} else if (state == eRebuildState::RESETTING) { } else if (state == eRebuildState::RESETTING) {
self->SetVar(u"IAmBuilt", false); self->SetVar(u"IAmBuilt", false);
@ -25,7 +26,7 @@ void FvConsoleRightQuickbuild::OnRebuildNotifyState(Entity* self, eRebuildState
const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility"); const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility");
if (!objects.empty()) { if (!objects.empty()) {
objects[0]->NotifyObject(self, "ConsoleRightDown"); objects[0]->NotifyObject(self, u"ConsoleRightDown");
} }
} }
} }
@ -41,7 +42,7 @@ void FvConsoleRightQuickbuild::OnUse(Entity* self, Entity* user) {
const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility"); const auto objects = EntityManager::Instance()->GetEntitiesInGroup("Facility");
if (!objects.empty()) { if (!objects.empty()) {
objects[0]->NotifyObject(self, "ConsoleRightActive"); objects[0]->NotifyObject(self, u"ConsoleRightActive");
} }
} }

View File

@ -8,37 +8,37 @@ void FvFacilityBrick::OnStartup(Entity* self) {
self->SetVar(u"ConsoleRIGHTtActive", false); self->SetVar(u"ConsoleRIGHTtActive", false);
} }
void FvFacilityBrick::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void FvFacilityBrick::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
auto* brickSpawner = dZoneManager::Instance()->GetSpawnersByName("ImaginationBrick")[0]; auto* brickSpawner = dZoneManager::Instance()->GetSpawnersByName("ImaginationBrick")[0];
auto* bugSpawner = dZoneManager::Instance()->GetSpawnersByName("MaelstromBug")[0]; auto* bugSpawner = dZoneManager::Instance()->GetSpawnersByName("MaelstromBug")[0];
auto* canisterSpawner = dZoneManager::Instance()->GetSpawnersByName("BrickCanister")[0]; auto* canisterSpawner = dZoneManager::Instance()->GetSpawnersByName("BrickCanister")[0];
if (name == "ConsoleLeftUp") { if (name == u"ConsoleLeftUp") {
GameMessages::SendStopFXEffect(self, true, "LeftPipeOff"); GameMessages::SendStopFXEffect(self, true, "LeftPipeOff");
GameMessages::SendPlayFXEffect(self->GetObjectID(), 2775, u"create", "LeftPipeEnergy"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 2775, u"create", "LeftPipeEnergy");
} else if (name == "ConsoleLeftDown") { } else if (name == u"ConsoleLeftDown") {
self->SetVar(u"ConsoleLEFTActive", false); self->SetVar(u"ConsoleLEFTActive", false);
GameMessages::SendStopFXEffect(self, true, "LeftPipeEnergy"); GameMessages::SendStopFXEffect(self, true, "LeftPipeEnergy");
GameMessages::SendStopFXEffect(self, true, "LeftPipeOn"); GameMessages::SendStopFXEffect(self, true, "LeftPipeOn");
GameMessages::SendPlayFXEffect(self->GetObjectID(), 2774, u"create", "LeftPipeOff"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 2774, u"create", "LeftPipeOff");
} else if (name == "ConsoleLeftActive") { } else if (name == u"ConsoleLeftActive") {
self->SetVar(u"ConsoleLEFTActive", true); self->SetVar(u"ConsoleLEFTActive", true);
GameMessages::SendStopFXEffect(self, true, "LeftPipeEnergy"); GameMessages::SendStopFXEffect(self, true, "LeftPipeEnergy");
GameMessages::SendPlayFXEffect(self->GetObjectID(), 2776, u"create", "LeftPipeOn"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 2776, u"create", "LeftPipeOn");
} }
else if (name == "ConsoleRightUp") { else if (name == u"ConsoleRightUp") {
GameMessages::SendStopFXEffect(self, true, "RightPipeOff"); GameMessages::SendStopFXEffect(self, true, "RightPipeOff");
GameMessages::SendPlayFXEffect(self->GetObjectID(), 2778, u"create", "RightPipeEnergy"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 2778, u"create", "RightPipeEnergy");
} else if (name == "ConsoleRightDown") { } else if (name == u"ConsoleRightDown") {
self->SetVar(u"ConsoleRIGHTActive", false); self->SetVar(u"ConsoleRIGHTActive", false);
GameMessages::SendStopFXEffect(self, true, "RightPipeEnergy"); GameMessages::SendStopFXEffect(self, true, "RightPipeEnergy");
GameMessages::SendStopFXEffect(self, true, "RightPipeOn"); GameMessages::SendStopFXEffect(self, true, "RightPipeOn");
GameMessages::SendPlayFXEffect(self->GetObjectID(), 2777, u"create", "RightPipeOff"); GameMessages::SendPlayFXEffect(self->GetObjectID(), 2777, u"create", "RightPipeOff");
} else if (name == "ConsoleRightActive") { } else if (name == u"ConsoleRightActive") {
self->SetVar(u"ConsoleRIGHTActive", true); self->SetVar(u"ConsoleRIGHTActive", true);
GameMessages::SendStopFXEffect(self, true, "RightPipeOff"); GameMessages::SendStopFXEffect(self, true, "RightPipeOff");

View File

@ -5,7 +5,7 @@ class FvFacilityBrick : public CppScripts::Script
{ {
public: public:
void OnStartup(Entity* self) override; void OnStartup(Entity* self) override;
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) override;
void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2, void OnFireEventServerSide(Entity* self, Entity* sender, std::string args, int32_t param1, int32_t param2,
int32_t param3) override; int32_t param3) override;
}; };

View File

@ -5,9 +5,9 @@ void WildNinjaBricks::OnStartup(Entity* self) {
self->AddToGroups("Ninjastuff"); self->AddToGroups("Ninjastuff");
} }
void WildNinjaBricks::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void WildNinjaBricks::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
if (name == "Crane") GameMessages::SendPlayAnimation(self, u"crane"); if (name == u"Crane") GameMessages::SendPlayAnimation(self, u"crane");
else if (name == "Tiger") GameMessages::SendPlayAnimation(self, u"tiger"); else if (name == u"Tiger") GameMessages::SendPlayAnimation(self, u"tiger");
else if (name == "Mantis") GameMessages::SendPlayAnimation(self, u"mantis"); else if (name == u"Mantis") GameMessages::SendPlayAnimation(self, u"mantis");
} }

View File

@ -4,6 +4,6 @@
class WildNinjaBricks : public CppScripts::Script { class WildNinjaBricks : public CppScripts::Script {
public: public:
void OnStartup(Entity* self) override; void OnStartup(Entity* self) override;
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) override;
}; };

View File

@ -9,27 +9,27 @@ void WildNinjaSensei::OnStartup(Entity* self) {
void WildNinjaSensei::OnTimerDone(Entity* self, std::string timerName) { void WildNinjaSensei::OnTimerDone(Entity* self, std::string timerName) {
if (timerName == "CraneStart") { if (timerName == "CraneStart") {
auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff"); auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff");
for (auto ninja : ninjas) ninja->NotifyObject(self, "Crane"); for (auto ninja : ninjas) ninja->NotifyObject(self, u"Crane");
self->AddTimer("Bow", 15.5f); self->AddTimer("Bow", 15.5f);
self->AddTimer("TigerStart", 25); self->AddTimer("TigerStart", 25);
GameMessages::SendPlayAnimation(self, u"crane"); GameMessages::SendPlayAnimation(self, u"crane");
} else if (timerName == "TigerStart") { } else if (timerName == "TigerStart") {
auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff"); auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff");
GameMessages::SendPlayAnimation(self, u"bow"); GameMessages::SendPlayAnimation(self, u"bow");
for (auto ninja : ninjas) ninja->NotifyObject(self, "Tiger"); for (auto ninja : ninjas) ninja->NotifyObject(self, u"Tiger");
self->AddTimer("Bow", 15.5f); self->AddTimer("Bow", 15.5f);
self->AddTimer("MantisStart", 25); self->AddTimer("MantisStart", 25);
GameMessages::SendPlayAnimation(self, u"tiger"); GameMessages::SendPlayAnimation(self, u"tiger");
} else if (timerName == "MantisStart") { } else if (timerName == "MantisStart") {
auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff"); auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff");
GameMessages::SendPlayAnimation(self, u"tiger"); GameMessages::SendPlayAnimation(self, u"tiger");
for (auto ninja : ninjas) ninja->NotifyObject(self, "Mantis"); for (auto ninja : ninjas) ninja->NotifyObject(self, u"Mantis");
self->AddTimer("Bow", 15.5f); self->AddTimer("Bow", 15.5f);
self->AddTimer("CraneStart", 25); self->AddTimer("CraneStart", 25);
GameMessages::SendPlayAnimation(self, u"mantis"); GameMessages::SendPlayAnimation(self, u"mantis");
} else if (timerName == "Bow") { } else if (timerName == "Bow") {
auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff"); auto ninjas = EntityManager::Instance()->GetEntitiesInGroup("Ninjastuff");
for (auto ninja : ninjas) ninja->NotifyObject(self, "Bow"); for (auto ninja : ninjas) ninja->NotifyObject(self, u"Bow");
GameMessages::SendPlayAnimation(self, u"bow"); GameMessages::SendPlayAnimation(self, u"bow");
} }
} }

View File

@ -1,14 +1,15 @@
#include "WildNinjaStudent.h" #include "WildNinjaStudent.h"
#include "GameMessages.h" #include "GameMessages.h"
#include "Entity.h"
void WildNinjaStudent::OnStartup(Entity* self) { void WildNinjaStudent::OnStartup(Entity* self) {
self->AddToGroups("Ninjastuff"); self->AddToGroups("Ninjastuff");
GameMessages::SendPlayAnimation(self, u"bow"); GameMessages::SendPlayAnimation(self, u"bow");
} }
void WildNinjaStudent::OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1, int32_t param2) { void WildNinjaStudent::OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1, int32_t param2) {
if (name == "Crane") GameMessages::SendPlayAnimation(self, u"crane"); if (name == u"Crane") GameMessages::SendPlayAnimation(self, u"crane");
else if (name == "Tiger") GameMessages::SendPlayAnimation(self, u"tiger"); else if (name == u"Tiger") GameMessages::SendPlayAnimation(self, u"tiger");
else if (name == "Mantis") GameMessages::SendPlayAnimation(self, u"mantis"); else if (name == u"Mantis") GameMessages::SendPlayAnimation(self, u"mantis");
else if (name == "Bow") GameMessages::SendPlayAnimation(self, u"bow"); else if (name == u"Bow") GameMessages::SendPlayAnimation(self, u"bow");
} }

View File

@ -4,6 +4,6 @@
class WildNinjaStudent : public CppScripts::Script { class WildNinjaStudent : public CppScripts::Script {
public: public:
void OnStartup(Entity* self) override; void OnStartup(Entity* self) override;
void OnNotifyObject(Entity* self, Entity* sender, const std::string& name, int32_t param1 = 0, int32_t param2 = 0) override; void OnNotifyObject(Entity* self, Entity* sender, const std::u16string& name, int32_t param1 = 0, int32_t param2 = 0) override;
}; };