Fixed hostile random events attacking other players
Fixed players being able to attack hostile random events for other players Hostile random events now authentically only reward 1/16th xp (except for pheasants, which give 0 xp)
This commit is contained in:
@@ -3,9 +3,15 @@ package content.global.ame
|
|||||||
import content.global.ame.events.MysteriousOldManNPC
|
import content.global.ame.events.MysteriousOldManNPC
|
||||||
import core.api.playGlobalAudio
|
import core.api.playGlobalAudio
|
||||||
import core.api.poofClear
|
import core.api.poofClear
|
||||||
|
import core.api.sendMessage
|
||||||
|
import core.api.utils.WeightBasedTable
|
||||||
import core.game.interaction.MovementPulse
|
import core.game.interaction.MovementPulse
|
||||||
|
import core.game.node.entity.Entity
|
||||||
|
import core.game.node.entity.combat.CombatStyle
|
||||||
import core.game.node.entity.impl.PulseType
|
import core.game.node.entity.impl.PulseType
|
||||||
import core.game.node.entity.npc.NPC
|
import core.game.node.entity.npc.NPC
|
||||||
|
import core.game.node.entity.npc.agg.AggressiveBehavior
|
||||||
|
import core.game.node.entity.npc.agg.AggressiveHandler
|
||||||
import core.game.node.entity.player.Player
|
import core.game.node.entity.player.Player
|
||||||
import core.game.node.item.Item
|
import core.game.node.item.Item
|
||||||
import core.game.world.map.Location
|
import core.game.world.map.Location
|
||||||
@@ -13,10 +19,11 @@ import core.game.world.map.RegionManager
|
|||||||
import core.game.world.map.path.Pathfinder
|
import core.game.world.map.path.Pathfinder
|
||||||
import core.game.world.update.flag.context.Graphics
|
import core.game.world.update.flag.context.Graphics
|
||||||
import core.integrations.discord.Discord
|
import core.integrations.discord.Discord
|
||||||
import core.api.utils.WeightBasedTable
|
|
||||||
import core.tools.secondsToTicks
|
import core.tools.secondsToTicks
|
||||||
import core.tools.ticksToCycles
|
import core.tools.ticksToCycles
|
||||||
import org.rs09.consts.Sounds
|
import org.rs09.consts.Sounds
|
||||||
|
import kotlin.math.ceil
|
||||||
|
import kotlin.math.min
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
import kotlin.reflect.full.createInstance
|
import kotlin.reflect.full.createInstance
|
||||||
|
|
||||||
@@ -66,7 +73,6 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||||||
if (!player.getAttribute("random:pause", false)) {
|
if (!player.getAttribute("random:pause", false)) {
|
||||||
ticksLeft--
|
ticksLeft--
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pulseManager.hasPulseRunning() && !finalized) {
|
if (!pulseManager.hasPulseRunning() && !finalized) {
|
||||||
follow()
|
follow()
|
||||||
}
|
}
|
||||||
@@ -87,6 +93,11 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||||||
location = spawnLocation
|
location = spawnLocation
|
||||||
player.setAttribute("re-npc", this)
|
player.setAttribute("re-npc", this)
|
||||||
super.init()
|
super.init()
|
||||||
|
super.aggressiveHandler = AggressiveHandler(this, object : AggressiveBehavior() {
|
||||||
|
override fun canSelectTarget(entity: Entity, target: Entity): Boolean {
|
||||||
|
return target == player
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun onTimeUp() {
|
open fun onTimeUp() {
|
||||||
@@ -118,4 +129,19 @@ abstract class RandomEventNPC(id: Int) : NPC(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract fun talkTo(npc: NPC)
|
abstract fun talkTo(npc: NPC)
|
||||||
}
|
|
||||||
|
override fun isAttackable(entity: Entity, style: CombatStyle, message: Boolean): Boolean {
|
||||||
|
if (entity != player) {
|
||||||
|
if (entity is Player) {
|
||||||
|
sendMessage(entity, "It isn't interested in fighting you.") //TODO authentic message
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return super.isAttackable(entity, style, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun idForCombatLevel(ids: List<Int>, player: Player): Int {
|
||||||
|
val index = min(ids.size, ceil(player.properties.currentCombatLevel / 20.0).toInt()) - 1
|
||||||
|
return ids[index]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package content.global.ame.events
|
||||||
|
|
||||||
|
import core.game.node.entity.Entity
|
||||||
|
import core.game.node.entity.npc.NPC
|
||||||
|
import core.game.node.entity.npc.NPCBehavior
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
|
||||||
|
class HostileRandomEventBehavior : NPCBehavior(
|
||||||
|
NPCs.EVIL_CHICKEN_2463, NPCs.EVIL_CHICKEN_2464, NPCs.EVIL_CHICKEN_2465, NPCs.EVIL_CHICKEN_2466, NPCs.EVIL_CHICKEN_2467, NPCs.EVIL_CHICKEN_2468,
|
||||||
|
NPCs.RIVER_TROLL_391, NPCs.RIVER_TROLL_392, NPCs.RIVER_TROLL_393, NPCs.RIVER_TROLL_394, NPCs.RIVER_TROLL_395, NPCs.RIVER_TROLL_396,
|
||||||
|
NPCs.ROCK_GOLEM_413, NPCs.ROCK_GOLEM_414, NPCs.ROCK_GOLEM_415, NPCs.ROCK_GOLEM_416, NPCs.ROCK_GOLEM_417, NPCs.ROCK_GOLEM_418,
|
||||||
|
NPCs.SHADE_425, NPCs.SHADE_426, NPCs.SHADE_427, NPCs.SHADE_428, NPCs.SHADE_429, NPCs.SHADE_430, NPCs.SHADE_431,
|
||||||
|
NPCs.TREE_SPIRIT_438, NPCs.TREE_SPIRIT_439, NPCs.TREE_SPIRIT_440, NPCs.TREE_SPIRIT_441, NPCs.TREE_SPIRIT_442, NPCs.TREE_SPIRIT_443,
|
||||||
|
NPCs.ZOMBIE_419, NPCs.ZOMBIE_420, NPCs.ZOMBIE_421, NPCs.ZOMBIE_422, NPCs.ZOMBIE_423, NPCs.ZOMBIE_424
|
||||||
|
) {
|
||||||
|
override fun getXpMultiplier(self: NPC, attacker: Entity): Double {
|
||||||
|
return super.getXpMultiplier(self, attacker) / 16.0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,4 +32,8 @@ class StrangePlantBehavior() : NPCBehavior(NPCs.STRANGE_PLANT_408) {
|
|||||||
override fun onDeathStarted(self: NPC, killer: Entity) {
|
override fun onDeathStarted(self: NPC, killer: Entity) {
|
||||||
AntiMacro.terminateEventNpc(killer.asPlayer())
|
AntiMacro.terminateEventNpc(killer.asPlayer())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
override fun getXpMultiplier(self: NPC, attacker: Entity): Double {
|
||||||
|
return super.getXpMultiplier(self, attacker) / 16.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package content.global.ame.events.supriseexam
|
package content.global.ame.events.surpriseexam
|
||||||
|
|
||||||
import core.game.component.Component
|
import core.game.component.Component
|
||||||
import core.game.dialogue.FacialExpression
|
import core.game.dialogue.FacialExpression
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package content.global.ame.events
|
package content.global.ame.events
|
||||||
|
|
||||||
import core.game.node.entity.player.Player
|
import core.game.node.entity.player.Player
|
||||||
import content.global.ame.events.supriseexam.SurpriseExamUtils
|
import content.global.ame.events.surpriseexam.SurpriseExamUtils
|
||||||
import core.game.dialogue.DialogueFile
|
import core.game.dialogue.DialogueFile
|
||||||
import core.game.system.timer.impl.AntiMacro
|
import core.game.system.timer.impl.AntiMacro
|
||||||
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package content.global.ame.events.supriseexam
|
package content.global.ame.events.surpriseexam
|
||||||
|
|
||||||
import core.game.dialogue.DialogueFile
|
import core.game.dialogue.DialogueFile
|
||||||
import core.tools.END_DIALOGUE
|
import core.tools.END_DIALOGUE
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package content.global.ame.events.supriseexam
|
package content.global.ame.events.surpriseexam
|
||||||
|
|
||||||
import core.game.node.entity.npc.NPC
|
import core.game.node.entity.npc.NPC
|
||||||
import org.rs09.consts.Components
|
import org.rs09.consts.Components
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package content.global.ame.events.supriseexam
|
package content.global.ame.events.surpriseexam
|
||||||
|
|
||||||
import core.game.component.Component
|
import core.game.component.Component
|
||||||
import core.game.node.entity.player.Player
|
import core.game.node.entity.player.Player
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package content.global.ame.events.supriseexam
|
package content.global.ame.events.surpriseexam
|
||||||
|
|
||||||
import core.Server
|
import core.Server
|
||||||
import core.api.*
|
import core.api.*
|
||||||
@@ -489,7 +489,7 @@ public abstract class Entity extends Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if an entity can continue it's attack.
|
* Checks if an entity can continue its attack.
|
||||||
* @param target the target.
|
* @param target the target.
|
||||||
* @param style the style.
|
* @param style the style.
|
||||||
* @return {@code True} if so.
|
* @return {@code True} if so.
|
||||||
|
|||||||
Reference in New Issue
Block a user