diff --git a/Server/Components/NPCs/npcs_impl.cpp b/Server/Components/NPCs/npcs_impl.cpp index 17c382624..c729c6ae8 100644 --- a/Server/Components/NPCs/npcs_impl.cpp +++ b/Server/Components/NPCs/npcs_impl.cpp @@ -19,6 +19,7 @@ void NPCComponent::onInit(IComponentList* components) { npcNetwork.init(core, this); core->getEventDispatcher().addEventHandler(this); + core->getPlayers().getPlayerDamageDispatcher().addEventHandler(this); } void NPCComponent::free() diff --git a/Server/Components/Pawn/Scripting/NPC/Events.hpp b/Server/Components/Pawn/Scripting/NPC/Events.hpp index d932fd0db..b501602b8 100644 --- a/Server/Components/Pawn/Scripting/NPC/Events.hpp +++ b/Server/Components/Pawn/Scripting/NPC/Events.hpp @@ -27,4 +27,20 @@ struct NPCEvents : public NPCEventHandler, public Singleton { PawnManager::Get()->CallAllInEntryFirst("OnNPCDestroy", DefaultReturnValue_True, npc.getID()); } + + void onNPCWeaponStateChange(INPC& npc, PlayerWeaponState newState, PlayerWeaponState oldState) override + { + PawnManager::Get()->CallAllInEntryFirst("OnNPCWeaponStateChange", DefaultReturnValue_True, npc.getID(), int(newState), int(oldState)); + } + + bool onNPCTakeDamage(INPC& npc, IPlayer& damager, float damage, uint8_t weapon, BodyPart bodyPart) override + { + auto result = !!PawnManager::Get()->CallAllInEntryFirst("OnNPCTakeDamage", DefaultReturnValue_True, npc.getID(), damager.getID(), damage, weapon, int(bodyPart)); + return result; + } + + void onNPCDeath(INPC& npc, IPlayer* killer, int reason) override + { + PawnManager::Get()->CallAllInEntryFirst("OnNPCDeath", DefaultReturnValue_True, npc.getID(), killer ? killer->getID() : INVALID_PLAYER_ID, reason); + } }; diff --git a/Server/Components/Pawn/Scripting/NPC/Natives.cpp b/Server/Components/Pawn/Scripting/NPC/Natives.cpp index 9fc348e58..57d61b4d8 100644 --- a/Server/Components/Pawn/Scripting/NPC/Natives.cpp +++ b/Server/Components/Pawn/Scripting/NPC/Natives.cpp @@ -209,25 +209,25 @@ SCRIPT_API(NPC_GetAmmo, int(INPC& npc)) return npc.getAmmo(); } -SCRIPT_API(NPC_SetWeaponSkillLevel, bool(INPC& npc, uint8_t skill, int level)) +SCRIPT_API(NPC_SetKeys, bool(INPC& npc, uint16_t upAndDown, uint16_t leftAndDown, uint16_t keys)) { - npc.setWeaponSkillLevel(PlayerWeaponSkill(skill), level); + npc.setKeys(upAndDown, leftAndDown, keys); return true; } -SCRIPT_API(NPC_GetWeaponSkillLevel, int(INPC& npc, int skill)) +SCRIPT_API(NPC_GetKeys, bool(INPC& npc, uint16_t& upAndDown, uint16_t& leftAndDown, uint16_t& keys)) { - return npc.getWeaponSkillLevel(PlayerWeaponSkill(skill)); + npc.getKeys(upAndDown, leftAndDown, keys); + return true; } -SCRIPT_API(NPC_SetKeys, bool(INPC& npc, uint16_t upAndDown, uint16_t leftAndDown, uint16_t keys)) +SCRIPT_API(NPC_SetWeaponSkillLevel, bool(INPC& npc, uint8_t skill, int level)) { - npc.setKeys(upAndDown, leftAndDown, keys); + npc.setWeaponSkillLevel(PlayerWeaponSkill(skill), level); return true; } -SCRIPT_API(NPC_GetKeys, bool(INPC& npc, uint16_t& upAndDown, uint16_t& leftAndDown, uint16_t& keys)) +SCRIPT_API(NPC_GetWeaponSkillLevel, int(INPC& npc, int skill)) { - npc.getKeys(upAndDown, leftAndDown, keys); - return true; + return npc.getWeaponSkillLevel(PlayerWeaponSkill(skill)); }