From 670a2de95b6152f9584980ac89fa0b0ce53d4cc2 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Mon, 27 Jun 2022 21:36:18 -0700 Subject: [PATCH] Address issue with Inventor Beehive and Buccaneer Monkey ability on valiant weapon (#604) * Add Script Add the FireFirstSkillonStartup script to allow for scripts that use this to function. * Add comments --- dScripts/CppScripts.cpp | 4 +++- dScripts/FireFirstSkillonStartup.cpp | 24 ++++++++++++++++++++++++ dScripts/FireFirstSkillonStartup.h | 12 ++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 dScripts/FireFirstSkillonStartup.cpp create mode 100644 dScripts/FireFirstSkillonStartup.h diff --git a/dScripts/CppScripts.cpp b/dScripts/CppScripts.cpp index 9e402a21..26bde33e 100644 --- a/dScripts/CppScripts.cpp +++ b/dScripts/CppScripts.cpp @@ -165,6 +165,7 @@ #include "PropertyPlatform.h" #include "MailBoxServer.h" #include "ActMine.h" +#include "FireFirstSkillonStartup.h" // Racing Scripts #include "RaceImagineCrateServer.h" @@ -804,7 +805,8 @@ CppScripts::Script* CppScripts::GetScript(Entity* parent, const std::string& scr script = new LegoDieRoll(); else if (scriptName == "scripts\\EquipmentScripts\\BuccaneerValiantShip.lua") script = new BuccaneerValiantShip(); - + else if (scriptName == "scripts\\EquipmentScripts\\FireFirstSkillonStartup.lua") + script = new FireFirstSkillonStartup(); // FB else if (scriptName == "scripts\\ai\\NS\\WH\\L_ROCKHYDRANT_BROKEN.lua") script = new RockHydrantBroken(); diff --git a/dScripts/FireFirstSkillonStartup.cpp b/dScripts/FireFirstSkillonStartup.cpp new file mode 100644 index 00000000..da1b420e --- /dev/null +++ b/dScripts/FireFirstSkillonStartup.cpp @@ -0,0 +1,24 @@ +#include "FireFirstSkillonStartup.h" +#include "Entity.h" +#include "SkillComponent.h" +#include "CDClientDatabase.h" +#include "CDObjectSkillsTable.h" + +void FireFirstSkillonStartup::OnStartup(Entity* self) { + auto skillComponent = self->GetComponent(); + if (!skillComponent) return; + + // Get the skill IDs of this object. + CDObjectSkillsTable* skillsTable = CDClientManager::Instance()->GetTable("ObjectSkills"); + std::vector skills = skillsTable->Query([=](CDObjectSkills entry) {return (entry.objectTemplate == self->GetLOT()); }); + + // For each skill, cast it with the associated behavior ID. + for (auto skill : skills) { + CDSkillBehaviorTable* skillBehaviorTable = CDClientManager::Instance()->GetTable("SkillBehavior"); + CDSkillBehavior behaviorData = skillBehaviorTable->GetSkillByID(skill.skillID); + + // Should parent entity be null, make the originator self. + const auto target = self->GetParentEntity() ? self->GetParentEntity()->GetObjectID() : self->GetObjectID(); + skillComponent->CalculateBehavior(skill.skillID, behaviorData.behaviorID, LWOOBJID_EMPTY, false, false, target); + } +} \ No newline at end of file diff --git a/dScripts/FireFirstSkillonStartup.h b/dScripts/FireFirstSkillonStartup.h new file mode 100644 index 00000000..ad182e70 --- /dev/null +++ b/dScripts/FireFirstSkillonStartup.h @@ -0,0 +1,12 @@ +#pragma once +#ifndef __FIREFIRSTSKILLONSTARTUP__H__ +#define __FIREFIRSTSKILLONSTARTUP__H__ + +#include "CppScripts.h" + +class FireFirstSkillonStartup : public CppScripts::Script { + public: + void OnStartup(Entity* self) override; +}; + +#endif //!__FIREFIRSTSKILLONSTARTUP__H__