mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-12-22 13:33:35 +00:00
better vanity checks (#1666)
tested that vanity npcs now chat when close, and then on a cooldown
This commit is contained in:
parent
1644d9448d
commit
aa7c3b9061
@ -83,6 +83,7 @@
|
|||||||
#include "ItemComponent.h"
|
#include "ItemComponent.h"
|
||||||
#include "GhostComponent.h"
|
#include "GhostComponent.h"
|
||||||
#include "AchievementVendorComponent.h"
|
#include "AchievementVendorComponent.h"
|
||||||
|
#include "VanityUtilities.h"
|
||||||
|
|
||||||
// Table includes
|
// Table includes
|
||||||
#include "CDComponentsRegistryTable.h"
|
#include "CDComponentsRegistryTable.h"
|
||||||
@ -1271,6 +1272,7 @@ void Entity::Update(const float deltaTime) {
|
|||||||
auto timerName = timer.GetName();
|
auto timerName = timer.GetName();
|
||||||
m_Timers.erase(m_Timers.begin() + timerPosition);
|
m_Timers.erase(m_Timers.begin() + timerPosition);
|
||||||
GetScript()->OnTimerDone(this, timerName);
|
GetScript()->OnTimerDone(this, timerName);
|
||||||
|
VanityUtilities::OnTimerDone(this, timerName);
|
||||||
|
|
||||||
TriggerEvent(eTriggerEventType::TIMER_DONE, this);
|
TriggerEvent(eTriggerEventType::TIMER_DONE, this);
|
||||||
} else {
|
} else {
|
||||||
@ -1334,6 +1336,7 @@ void Entity::OnCollisionProximity(LWOOBJID otherEntity, const std::string& proxN
|
|||||||
if (!other) return;
|
if (!other) return;
|
||||||
|
|
||||||
GetScript()->OnProximityUpdate(this, other, proxName, status);
|
GetScript()->OnProximityUpdate(this, other, proxName, status);
|
||||||
|
VanityUtilities::OnProximityUpdate(this, other, proxName, status);
|
||||||
|
|
||||||
RocketLaunchpadControlComponent* rocketComp = GetComponent<RocketLaunchpadControlComponent>();
|
RocketLaunchpadControlComponent* rocketComp = GetComponent<RocketLaunchpadControlComponent>();
|
||||||
if (!rocketComp) return;
|
if (!rocketComp) return;
|
||||||
|
@ -38,7 +38,7 @@ void ProximityMonitorComponent::SetProximityRadius(dpEntity* entity, const std::
|
|||||||
m_ProximitiesData.insert(std::make_pair(name, entity));
|
m_ProximitiesData.insert(std::make_pair(name, entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::unordered_set<LWOOBJID>& ProximityMonitorComponent::GetProximityObjects(const std::string& name) {
|
const std::unordered_set<LWOOBJID>& ProximityMonitorComponent::GetProximityObjects(const std::string& name) const {
|
||||||
const auto iter = m_ProximitiesData.find(name);
|
const auto iter = m_ProximitiesData.find(name);
|
||||||
|
|
||||||
if (iter == m_ProximitiesData.cend()) {
|
if (iter == m_ProximitiesData.cend()) {
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
* @param name the proximity name to retrieve physics objects for
|
* @param name the proximity name to retrieve physics objects for
|
||||||
* @return a set of physics entity object IDs for this name
|
* @return a set of physics entity object IDs for this name
|
||||||
*/
|
*/
|
||||||
const std::unordered_set<LWOOBJID>& GetProximityObjects(const std::string& name);
|
const std::unordered_set<LWOOBJID>& GetProximityObjects(const std::string& name) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the passed object is in proximity of the named proximity sensor
|
* Checks if the passed object is in proximity of the named proximity sensor
|
||||||
|
@ -403,26 +403,39 @@ void SetupNPCTalk(Entity* npc) {
|
|||||||
npc->SetProximityRadius(20.0f, "talk");
|
npc->SetProximityRadius(20.0f, "talk");
|
||||||
}
|
}
|
||||||
|
|
||||||
void NPCTalk(Entity* npc) {
|
void VanityUtilities::OnProximityUpdate(Entity* entity, Entity* other, const std::string& proxName, const std::string& name) {
|
||||||
auto* proximityMonitorComponent = npc->GetComponent<ProximityMonitorComponent>();
|
if (proxName != "talk") return;
|
||||||
|
const auto* const proximityMonitorComponent = entity->GetComponent<ProximityMonitorComponent>();
|
||||||
|
if (!proximityMonitorComponent) return;
|
||||||
|
|
||||||
if (!proximityMonitorComponent->GetProximityObjects("talk").empty()) {
|
if (name == "ENTER" && !entity->HasTimer("talk")) {
|
||||||
|
NPCTalk(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VanityUtilities::OnTimerDone(Entity* npc, const std::string& name) {
|
||||||
|
if (name == "talk") {
|
||||||
|
const auto* const proximityMonitorComponent = npc->GetComponent<ProximityMonitorComponent>();
|
||||||
|
if (!proximityMonitorComponent || proximityMonitorComponent->GetProximityObjects("talk").empty()) return;
|
||||||
|
|
||||||
|
NPCTalk(npc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NPCTalk(Entity* npc) {
|
||||||
const auto& chats = npc->GetVar<std::vector<std::string>>(u"chats");
|
const auto& chats = npc->GetVar<std::vector<std::string>>(u"chats");
|
||||||
|
|
||||||
if (chats.empty()) {
|
if (chats.empty()) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& selected
|
const auto& selected
|
||||||
= chats[GeneralUtils::GenerateRandomNumber<int32_t>(0, static_cast<int32_t>(chats.size() - 1))];
|
= chats[GeneralUtils::GenerateRandomNumber<int32_t>(0, static_cast<int32_t>(chats.size() - 1))];
|
||||||
|
|
||||||
GameMessages::SendNotifyClientZoneObject(
|
GameMessages::SendNotifyClientZoneObject(
|
||||||
npc->GetObjectID(), u"sendToclient_bubble", 0, 0, npc->GetObjectID(), selected, UNASSIGNED_SYSTEM_ADDRESS);
|
npc->GetObjectID(), u"sendToclient_bubble", 0, 0, npc->GetObjectID(), selected, UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
}
|
|
||||||
|
|
||||||
Game::entityManager->SerializeEntity(npc);
|
Game::entityManager->SerializeEntity(npc);
|
||||||
|
|
||||||
const float nextTime = GeneralUtils::GenerateRandomNumber<float>(15, 60);
|
const float nextTime = GeneralUtils::GenerateRandomNumber<float>(15, 60);
|
||||||
|
|
||||||
npc->AddCallbackTimer(nextTime, [npc]() { NPCTalk(npc); });
|
npc->AddTimer("talk", nextTime);
|
||||||
}
|
}
|
||||||
|
@ -31,4 +31,8 @@ namespace VanityUtilities {
|
|||||||
std::string ParseMarkdown(
|
std::string ParseMarkdown(
|
||||||
const std::string& file
|
const std::string& file
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void OnProximityUpdate(Entity* entity, Entity* other, const std::string& proxName, const std::string& name);
|
||||||
|
|
||||||
|
void OnTimerDone(Entity* entity, const std::string& name);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user