diff --git a/Server/data/configs/npc_configs.json b/Server/data/configs/npc_configs.json index 683381848..97757c357 100644 --- a/Server/data/configs/npc_configs.json +++ b/Server/data/configs/npc_configs.json @@ -44609,7 +44609,9 @@ "strength_level": "1", "id": "5079", "range_level": "1", - "attack_level": "1" + "attack_level": "1", + "death_animation": "5183", + "examine": "Handle with care." }, { "examine": "It looks fluffy and cute; it's probably deadly.", diff --git a/Server/src/main/content/global/handlers/npc/ChinchompaDeathListener.kt b/Server/src/main/content/global/handlers/npc/ChinchompaDeathListener.kt new file mode 100644 index 000000000..3a146eaf4 --- /dev/null +++ b/Server/src/main/content/global/handlers/npc/ChinchompaDeathListener.kt @@ -0,0 +1,52 @@ +package content.global.handlers.npc + +import core.api.* +import core.api.playGlobalAudio +import core.api.sendGraphics +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPCBehavior +import org.rs09.consts.NPCs +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.tools.RandomFunction +import core.game.world.update.flag.context.Graphics +import core.game.node.entity.combat.ImpactHandler.HitsplatType; + +private val chinchompaIDs = intArrayOf( + NPCs.CHINCHOMPA_5079, + NPCs.CARNIVOROUS_CHINCHOMPA_5080 +) + +/** + * Minimal evasive approach to the Chinchompas exploding on death cause by combat and not by trapping. + */ +class ChinchompaDeathListener: NPCBehavior(*chinchompaIDs) { + override fun onDeathFinished(self: NPC, killer: Entity) { + + // If it 'died' from getting trapped an attribute is set of 'hunter'. + if (!self.attributes.containsKey("hunter") && killer is Player) { + val explosionLoc = self.location + val validExplosionDmgTiles = explosionLoc.surroundingTiles + + val chinExplosionGFX = Graphics(157, 96) + sendGraphics(chinExplosionGFX, explosionLoc) + playGlobalAudio(explosionLoc, 158) + + if (validExplosionDmgTiles.contains(killer.location)) { + //As weird this looks, it does allow to have a hit from 0 to 2 + val hitAmount = RandomFunction.random(0, 3) + impact(killer, hitAmount, HitsplatType.NORMAL) + } + } + } + + /** + * At content.global.skill.hunter.TrapSetting + * sets an attribute of 'hunter' during it's getCatchPulse for reward rolling, but it never cleans it up after. + * These NPCs is a member of NPC class although exists a HunterNPC class, but it's mainly used for imps. + * Logically you'd do this after death finishes, but it would interfere with the reward rolls and I fear it may affect other hunter NPCs. + */ + override fun onRespawn(self: NPC) { + self.removeAttribute("hunter") + } +} \ No newline at end of file diff --git a/Server/src/main/core/tools/RandomFunction.java b/Server/src/main/core/tools/RandomFunction.java index 61d3275ad..b74092a20 100644 --- a/Server/src/main/core/tools/RandomFunction.java +++ b/Server/src/main/core/tools/RandomFunction.java @@ -35,6 +35,7 @@ public class RandomFunction { /** * Method used to ease the access of the random class. + * In certain cases, it is inclusive from the min value and exclusive from the max values specified. * @param a the minimum random value. * @param b the maximum random value. * @return the value as an {@link Integer}.