Files
2009scape/Server/src/main/content/global/skill/slayer/RockSlug.kt
T
Ceikry 9a4b933976 Implemented ContentInterface-based NPC Scripting
Obsoleted AbstractNPC
Implemented desert bandits
Rewrote a handful of existing NPCs into NPCBehaviors (e.g. rock slugs, nechryaels, water fiend and more)
2023-03-01 06:42:25 +00:00

50 lines
1.9 KiB
Kotlin

package content.global.skill.slayer
import core.api.*
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.node.Node
import core.game.node.entity.Entity
import core.game.node.entity.combat.BattleState
import core.game.node.entity.combat.ImpactHandler
import core.game.node.entity.npc.NPC
import core.game.node.entity.npc.NPCBehavior
import core.game.node.entity.player.Player
import org.rs09.consts.Items
import java.lang.Integer.max
class RockSlug : NPCBehavior(*Tasks.ROCK_SLUGS.ids), InteractionListener {
override fun defineListeners() {
onUseWith(IntType.NPC, Items.BAG_OF_SALT_4161, *ids, handler = ::handleSaltUsage)
}
override fun beforeDamageReceived(self: NPC, attacker: Entity, state: BattleState) {
val lifepoints = self.skills.lifepoints
if (state.estimatedHit + max(state.secondaryHit, 0) > lifepoints - 1) {
state.estimatedHit = lifepoints - 1
state.secondaryHit = -1
setAttribute(self, "shouldRun", true)
}
}
override fun tick(self: NPC): Boolean {
if (getAttribute(self, "shouldRun", false)){
self.properties.combatPulse.stop()
forceWalk(self, self.properties.spawnLocation, "smart")
removeAttribute(self, "shouldRun")
}
return true
}
private fun handleSaltUsage(player: Player, used: Node, with: Node) : Boolean {
if (with !is NPC) return false
if (!removeItem(player, used.id)) return false
if (with.skills.lifepoints >= 5)
sendMessage(player, "Your bag of salt is ineffective. The Rockslug is not weak enough.")
else {
sendMessage(player, "The Rockslug shrivels up and dies.")
with.impactHandler.manualHit(player, with.skills.lifepoints, ImpactHandler.HitsplatType.NORMAL)
}
return true
}
}