mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-06-21 06:04:20 +00:00
feat: hatchlings
tested that hatchlings now function fixes #759 Update MovementAIComponent.cpp Update MovementAIComponent.cpp Update HatchlingPets.cpp
This commit is contained in:
@@ -37,6 +37,7 @@ target_include_directories(dScriptsServerBase PUBLIC "."
|
||||
"Minigame"
|
||||
"Minigame/General"
|
||||
"Objects"
|
||||
"Objects/Hatchlings"
|
||||
)
|
||||
target_precompile_headers(dScriptsServerBase REUSE_FROM dScriptsBase)
|
||||
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
add_subdirectory(Hatchlings)
|
||||
|
||||
set(DSCRIPTS_SOURCES_02_SERVER_OBJECTS
|
||||
"AgSurvivalBuffStation.cpp"
|
||||
"StinkyFishTarget.cpp"
|
||||
PARENT_SCOPE)
|
||||
"StinkyFishTarget.cpp")
|
||||
|
||||
foreach(file ${DSCRIPTS_SOURCES_02_SERVER_OBJECTS_HATCHLINGS})
|
||||
set(DSCRIPTS_SOURCES_02_SERVER_OBJECTS ${DSCRIPTS_SOURCES_02_SERVER_OBJECTS} "Hatchlings/${file}")
|
||||
endforeach()
|
||||
|
||||
set(DSCRIPTS_SOURCES_02_SERVER_OBJECTS ${DSCRIPTS_SOURCES_02_SERVER_OBJECTS} PARENT_SCOPE)
|
||||
|
||||
3
dScripts/02_server/Objects/Hatchlings/CMakeLists.txt
Normal file
3
dScripts/02_server/Objects/Hatchlings/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
set(DSCRIPTS_SOURCES_02_SERVER_OBJECTS_HATCHLINGS
|
||||
"HatchlingPets.cpp"
|
||||
PARENT_SCOPE)
|
||||
83
dScripts/02_server/Objects/Hatchlings/HatchlingPets.cpp
Normal file
83
dScripts/02_server/Objects/Hatchlings/HatchlingPets.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
#include "HatchlingPets.h"
|
||||
|
||||
#include "Entity.h"
|
||||
#include "MovementAIComponent.h"
|
||||
|
||||
void HatchlingPets::OnStartup(Entity* self) {
|
||||
self->SetVar(u"follow", false);
|
||||
|
||||
self->SetProximityRadius(5, "StopFollow");
|
||||
self->SetProximityRadius(15, "Wander");
|
||||
self->SetProximityRadius(50, "Teleport");
|
||||
|
||||
Wander(*self, *self->GetOwner());
|
||||
self->AddComponent<MovementAIComponent>(-1, MovementAIInfo{ .wanderRadius = 2.5f });
|
||||
}
|
||||
|
||||
void HatchlingPets::OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) {
|
||||
auto* const parent = self->GetOwner();
|
||||
if (!entering || !entering->IsPlayer() || parent->GetObjectID() != entering->GetObjectID()) return;
|
||||
|
||||
if (name == "StopFollow") {
|
||||
if (status == "ENTER") {
|
||||
if (self->GetVar<bool>(u"follow")) {
|
||||
const auto randomWanderTime = GeneralUtils::GenerateRandomNumber<float>(4, 9);
|
||||
self->AddTimer("StartWander", randomWanderTime);
|
||||
// stop following the player
|
||||
auto* const movementAI = self->GetComponent<MovementAIComponent>();
|
||||
if (movementAI) {
|
||||
movementAI->Stop();
|
||||
movementAI->FollowTarget(LWOOBJID_EMPTY);
|
||||
}
|
||||
self->SetVar(u"follow", false);
|
||||
}
|
||||
}
|
||||
} else if (name == "Wander") {
|
||||
if (status == "LEAVE") {
|
||||
self->CancelAllTimers();
|
||||
// follow the player
|
||||
auto* const movementAI = self->GetComponent<MovementAIComponent>();
|
||||
if (movementAI) {
|
||||
movementAI->Stop();
|
||||
movementAI->FollowTarget(entering->GetObjectID());
|
||||
}
|
||||
self->SetVar(u"follow", true);
|
||||
}
|
||||
} else if (name == "Teleport") {
|
||||
if (status == "LEAVE") {
|
||||
// stop following the player
|
||||
auto* const movementAI = self->GetComponent<MovementAIComponent>();
|
||||
if (movementAI) {
|
||||
movementAI->Stop();
|
||||
movementAI->FollowTarget(LWOOBJID_EMPTY);
|
||||
}
|
||||
GameMessages::GetPosition getPos;
|
||||
getPos.Send(entering->GetObjectID());
|
||||
getPos.pos.z += 5.0f;
|
||||
self->SetPosition(getPos.pos);
|
||||
Game::entityManager->SerializeEntity(*self);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HatchlingPets::OnTimerDone(Entity* self, std::string timerName) {
|
||||
if (timerName == "StartWander") {
|
||||
Wander(*self, *self->GetOwner());
|
||||
}
|
||||
}
|
||||
|
||||
void HatchlingPets::Wander(Entity& self, Entity& player) {
|
||||
GameMessages::GetPosition getPos;
|
||||
if (!getPos.Send(player.GetObjectID())) {
|
||||
LOG("Failed to get position for %llu", player.GetObjectID());
|
||||
return;
|
||||
}
|
||||
|
||||
const auto xWander = GeneralUtils::GenerateRandomNumber<float>(0, 20) - 10.0f;
|
||||
const auto zWander = GeneralUtils::GenerateRandomNumber<float>(0, 20) - 10.0f;
|
||||
getPos.pos.x += xWander;
|
||||
getPos.pos.z += zWander;
|
||||
auto* const movementAI = self.GetComponent<MovementAIComponent>();
|
||||
if (movementAI) movementAI->SetDestination(getPos.pos);
|
||||
self.AddTimer("StartWander", GeneralUtils::GenerateRandomNumber<float>(4, 9));
|
||||
}
|
||||
14
dScripts/02_server/Objects/Hatchlings/HatchlingPets.h
Normal file
14
dScripts/02_server/Objects/Hatchlings/HatchlingPets.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef HATCHLINGPETS_H
|
||||
#define HATCHLINGPETS_H
|
||||
|
||||
#include "CppScripts.h"
|
||||
#include "NiPoint3.h"
|
||||
|
||||
class HatchlingPets : public CppScripts::Script {
|
||||
void OnStartup(Entity* self) override;
|
||||
void OnProximityUpdate(Entity* self, Entity* entering, std::string name, std::string status) override;
|
||||
void OnTimerDone(Entity* self, std::string timerName) override;
|
||||
void Wander(Entity& self, Entity& player);
|
||||
};
|
||||
|
||||
#endif //!HATCHLINGPETS_H
|
||||
@@ -166,6 +166,7 @@
|
||||
#include "AgSalutingNpcs.h"
|
||||
#include "BossSpiderQueenEnemyServer.h"
|
||||
#include "RockHydrantSmashable.h"
|
||||
#include "HatchlingPets.h"
|
||||
|
||||
// Misc Scripts
|
||||
#include "ExplodingAsset.h"
|
||||
@@ -423,6 +424,7 @@ namespace {
|
||||
{"scripts\\ai\\NS\\L_NS_CONCERT_INSTRUMENT_QB.lua", []() {return new NsConcertInstrument();}},
|
||||
{"scripts\\ai\\NS\\L_NS_JONNY_FLAG_MISSION_SERVER.lua", []() {return new NsJohnnyMissionServer();}},
|
||||
{"scripts\\02_server\\Objects\\L_STINKY_FISH_TARGET.lua", []() {return new StinkyFishTarget();}},
|
||||
{"scripts\\02_server\\Objects\\Hatchlings\\L_HATCHLING_PETS.lua", []() {return new HatchlingPets();}},
|
||||
{"scripts\\zone\\PROPERTY\\NS\\L_ZONE_NS_PROPERTY.lua", []() {return new ZoneNsProperty();}},
|
||||
{"scripts\\02_server\\Map\\Property\\NS_Med\\L_ZONE_NS_MED_PROPERTY.lua", []() {return new ZoneNsMedProperty();}},
|
||||
{"scripts\\02_server\\Map\\NS\\L_NS_TOKEN_CONSOLE_SERVER.lua", []() {return new NsTokenConsoleServer();}},
|
||||
|
||||
Reference in New Issue
Block a user