Fixed Family Crest getting stuck when the drop from Chronozon is not picked up (fight is now repeatable if item is lost)

This commit is contained in:
GregF 2024-03-17 09:01:42 +00:00 committed by Ryan
parent b8a887b319
commit 675f0c1e37
3 changed files with 57 additions and 59 deletions

View file

@ -11996,7 +11996,7 @@
{ {
"minAmount": "1", "minAmount": "1",
"weight": "100.0", "weight": "100.0",
"id": "526", "id": "592",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {

View file

@ -11,23 +11,19 @@ import core.game.world.map.zone.ZoneBuilder
import core.plugin.Initializable import core.plugin.Initializable
import core.plugin.Plugin import core.plugin.Plugin
import content.region.misthalin.varrock.quest.familycrest.ChronozonNPC import content.region.misthalin.varrock.quest.familycrest.ChronozonNPC
import core.game.node.item.Item
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable @Initializable
class ChronozonCaveZone: MapZone("FC ChronozoneZone", true), Plugin<Unit> { class ChronozonCaveZone: MapZone("FC ChronozoneZone", true), Plugin<Unit> {
val triggers = ArrayList<Location>() val spawnLoc = Location(3086, 9936, 0)
var chronozon = ChronozonNPC(667, Location(3086, 9936, 0)) var chronozon = ChronozonNPC(NPCs.CHRONOZON_667, spawnLoc)
override fun configure() { override fun configure() {
register(ZoneBorders(3082, 9929, 3091, 9940)) register(ZoneBorders(3082, 9929, 3091, 9940))
triggers.add(Location.create(3083, 9939))
triggers.add(Location.create(3084, 9939))
triggers.add(Location.create(3085, 9939))
triggers.add(Location.create(3086, 9939))
triggers.add(Location.create(3087, 9939))
triggers.add(Location.create(3088, 9939))
triggers.add(Location.create(3089, 9939))
triggers.add(Location.create(3090, 9939))
} }
override fun move(e: Entity?, from: Location?, to: Location?): Boolean { override fun move(e: Entity?, from: Location?, to: Location?): Boolean {
@ -37,18 +33,19 @@ class ChronozonCaveZone: MapZone("FC ChronozoneZone", true), Plugin<Unit> {
override fun enter(e: Entity?): Boolean { override fun enter(e: Entity?): Boolean {
if (e != null) { if (e != null) {
if (e.isPlayer) { if (e.isPlayer) {
chronozon = ChronozonNPC(667, Location(3086, 9936, 0)) val player = e as Player
var player = e as Player if (player.questRepository.getQuest("Family Crest").getStage(e) in (19..99) &&
if (player.questRepository.getQuest("Family Crest").getStage(e) == 19 && !RegionManager.getLocalNpcs( !player.hasItem(Item(Items.CREST_PART_781))){
Location(3086, 9936, 0), // Chronozon is allowed to spawn (quest stage right and the player doesn't have the crest part)
5 // Now check there is not one already
).contains(chronozon) if(!RegionManager.getLocalNpcs(spawnLoc, 5).contains(chronozon)){
) {
chronozon.setPlayer(e) chronozon.setPlayer(e)
chronozon.isRespawn = false chronozon.isRespawn = false
chronozon.location = spawnLoc
chronozon.init() chronozon.init()
} }
} }
}
return true return true
} }
return false return false

View file

@ -6,32 +6,32 @@ import core.game.node.entity.combat.CombatStyle
import core.game.node.entity.npc.AbstractNPC import core.game.node.entity.npc.AbstractNPC
import core.game.node.entity.player.Player import core.game.node.entity.player.Player
import core.game.world.map.Location import core.game.world.map.Location
import org.rs09.consts.NPCs
class ChronozonNPC(id: Int, location: Location?) : AbstractNPC(NPCs.CHRONOZON_667, Location(3086, 9936, 0)){
class ChronozonNPC(id: Int, location: Location?) : AbstractNPC(667, Location(3086, 9936, 0)){ private lateinit var targetplayer: Player
lateinit var m_targetPlayer: Player private var amountOfFireDamageTaken: Int = 0
var m_amountOfFireDamageTaken: Int = 0 private var amountOfAirDamageTaken: Int = 0
var m_amountOfAirDamageTaken: Int = 0 private var amountOfWaterDamageTaken: Int = 0
var m_amountOfWaterDamageTaken: Int = 0 private var amountOfEarthDamageTaken: Int = 0
var m_amountOfEarthDamageTaken: Int = 0
override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC { override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC {
return ChronozonNPC(id, location) return ChronozonNPC(id, location)
} }
override fun getIds(): IntArray { override fun getIds(): IntArray {
return intArrayOf(667) return intArrayOf(NPCs.CHRONOZON_667)
} }
override fun handleTickActions() { override fun handleTickActions() {
super.handleTickActions() super.handleTickActions()
if (!m_targetPlayer.isActive || m_targetPlayer.getLocation().getDistance(getLocation()) > 15) { if (!targetplayer.isActive || targetplayer.getLocation().getDistance(getLocation()) > 15) {
clear() clear()
} }
@ -39,8 +39,8 @@ class ChronozonNPC(id: Int, location: Location?) : AbstractNPC(667, Location(308
override fun checkImpact(state: BattleState?) { override fun checkImpact(state: BattleState?) {
if (state != null) { if (state != null) {
if(m_amountOfAirDamageTaken == 0 || m_amountOfWaterDamageTaken == 0 || if(amountOfAirDamageTaken == 0 || amountOfWaterDamageTaken == 0 ||
m_amountOfEarthDamageTaken == 0 || m_amountOfFireDamageTaken == 0) { amountOfEarthDamageTaken == 0 || amountOfFireDamageTaken == 0) {
if(state.style != CombatStyle.MAGIC || state.totalDamage >= skills.lifepoints) { if(state.style != CombatStyle.MAGIC || state.totalDamage >= skills.lifepoints) {
state.neutralizeHits() state.neutralizeHits()
} }
@ -48,59 +48,60 @@ class ChronozonNPC(id: Int, location: Location?) : AbstractNPC(667, Location(308
if(state.spell != null) { if(state.spell != null) {
if(state.spell.spellId == 24) { if(state.spell.spellId == 24) {
if(state.totalDamage > 0 && m_amountOfAirDamageTaken == 0) { if(state.totalDamage > 0 && amountOfAirDamageTaken == 0) {
m_targetPlayer.sendMessage("Chronozon weakens...") targetplayer.sendMessage("Chronozon weakens...")
} }
m_amountOfAirDamageTaken += state.totalDamage amountOfAirDamageTaken += state.totalDamage
} }
if(state.spell.spellId == 27) { if(state.spell.spellId == 27) {
if(state.totalDamage > 0 && m_amountOfWaterDamageTaken == 0) { if(state.totalDamage > 0 && amountOfWaterDamageTaken == 0) {
m_targetPlayer.sendMessage("Chronozon weakens...") targetplayer.sendMessage("Chronozon weakens...")
} }
m_amountOfWaterDamageTaken += state.totalDamage amountOfWaterDamageTaken += state.totalDamage
} }
if(state.spell.spellId == 33) { if(state.spell.spellId == 33) {
if(state.totalDamage > 0 && m_amountOfEarthDamageTaken == 0) { if(state.totalDamage > 0 && amountOfEarthDamageTaken == 0) {
m_targetPlayer.sendMessage("Chronozon weakens...") targetplayer.sendMessage("Chronozon weakens...")
} }
m_amountOfEarthDamageTaken += state.totalDamage amountOfEarthDamageTaken += state.totalDamage
} }
if(state.spell.spellId == 38) { if(state.spell.spellId == 38) {
if(state.totalDamage > 0 && m_amountOfFireDamageTaken == 0) { if(state.totalDamage > 0 && amountOfFireDamageTaken == 0) {
m_targetPlayer.sendMessage("Chronozon weakens...") targetplayer.sendMessage("Chronozon weakens...")
} }
m_amountOfFireDamageTaken += state.totalDamage amountOfFireDamageTaken += state.totalDamage
} }
} }
} }
} }
override fun isAttackable(entity: Entity, style: CombatStyle?, message: Boolean): Boolean {
return entity == m_targetPlayer &&
m_targetPlayer.questRepository.getQuest("Family Crest").getStage(m_targetPlayer) == 19 &&
super.isAttackable(entity, style, message)
}
override fun clear() {
super.clear()
}
override fun finalizeDeath(killer: Entity?) { override fun finalizeDeath(killer: Entity?) {
if(killer == m_targetPlayer) { if(killer == targetplayer) {
m_targetPlayer.questRepository.getQuest("Family Crest").setStage(m_targetPlayer, 20) if (targetplayer.questRepository.getStage("Family Crest") != 20){
targetplayer.questRepository.getQuest("Family Crest").setStage(targetplayer, 20)
}
} }
clear() clear()
super.finalizeDeath(killer) super.finalizeDeath(killer)
} }
fun setPlayer(player: Player){ fun setPlayer(player: Player){
m_targetPlayer = player targetplayer = player
}
override fun init() {
// Make sure to reset damage taken when spawning in
amountOfFireDamageTaken = 0
amountOfAirDamageTaken= 0
amountOfWaterDamageTaken= 0
amountOfEarthDamageTaken= 0
super.init()
} }
} }
//3086, 9936, 0