From 22f6a76f464aec6df0f8d32f2b2823ae7d7f3883 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Tue, 29 Sep 2026 09:27:48 -0500 Subject: [PATCH] feat(scripts): turret enemies are immovable as L_TURRET makes them L_TURRET (LOTs 12286 and 13093, e.g. the Crux Prime auto turrets) had no script, so these turrets could be stunned, knocked back and pulled. They now push the same immunities the live script does. Check: stun and knock back a Crux Prime auto turret: nothing happens. Co-Authored-By: Claude Opus 5.5 --- dScripts/02_server/Objects/CMakeLists.txt | 1 + dScripts/02_server/Objects/ImmovableTurret.cpp | 16 ++++++++++++++++ dScripts/02_server/Objects/ImmovableTurret.h | 8 ++++++++ dScripts/CppScripts.cpp | 2 ++ 4 files changed, 27 insertions(+) create mode 100644 dScripts/02_server/Objects/ImmovableTurret.cpp create mode 100644 dScripts/02_server/Objects/ImmovableTurret.h diff --git a/dScripts/02_server/Objects/CMakeLists.txt b/dScripts/02_server/Objects/CMakeLists.txt index da7e9b60e..5340e50cc 100644 --- a/dScripts/02_server/Objects/CMakeLists.txt +++ b/dScripts/02_server/Objects/CMakeLists.txt @@ -2,6 +2,7 @@ add_subdirectory(Hatchlings) set(DSCRIPTS_SOURCES_02_SERVER_OBJECTS "AgSurvivalBuffStation.cpp" + "ImmovableTurret.cpp" "StinkyFishTarget.cpp") foreach(file ${DSCRIPTS_SOURCES_02_SERVER_OBJECTS_HATCHLINGS}) diff --git a/dScripts/02_server/Objects/ImmovableTurret.cpp b/dScripts/02_server/Objects/ImmovableTurret.cpp new file mode 100644 index 000000000..1b8eb606b --- /dev/null +++ b/dScripts/02_server/Objects/ImmovableTurret.cpp @@ -0,0 +1,16 @@ +#include "ImmovableTurret.h" + +#include "ControllablePhysicsComponent.h" +#include "DestroyableComponent.h" +#include "Entity.h" +#include "eStateChangeType.h" + +void ImmovableTurret::OnStartup(Entity* self) { + // SetStunImmunity (attack, interrupt) and SetStatusImmunity (pull to point, knockback); DLU keeps interrupt with the status ones + if (auto* controllablePhysics = self->GetComponent()) { + controllablePhysics->SetStunImmunity(eStateChangeType::PUSH, self->GetObjectID(), true, false, false, false, false, false, false); + } + if (auto* destroyable = self->GetComponent()) { + destroyable->SetStatusImmunity(eStateChangeType::PUSH, false, false, true, true, false, false, false, false, true); + } +} diff --git a/dScripts/02_server/Objects/ImmovableTurret.h b/dScripts/02_server/Objects/ImmovableTurret.h new file mode 100644 index 000000000..ac51cecc9 --- /dev/null +++ b/dScripts/02_server/Objects/ImmovableTurret.h @@ -0,0 +1,8 @@ +#pragma once +#include "CppScripts.h" + +// L_TURRET: turret enemies can't be stunned, interrupted, knocked back or pulled +class ImmovableTurret : public CppScripts::Script { +public: + void OnStartup(Entity* self) override; +}; diff --git a/dScripts/CppScripts.cpp b/dScripts/CppScripts.cpp index ce0ae133f..bedf0a6c0 100644 --- a/dScripts/CppScripts.cpp +++ b/dScripts/CppScripts.cpp @@ -76,6 +76,7 @@ #include "NsConcertInstrument.h" #include "NsJohnnyMissionServer.h" #include "StinkyFishTarget.h" +#include "ImmovableTurret.h" #include "ZoneNsProperty.h" #include "ZoneNsMedProperty.h" #include "NsTokenConsoleServer.h" @@ -434,6 +435,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\\L_TURRET.lua", []() {return new ImmovableTurret();}}, {"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();}},