From 380bd6e0fde84f1f83ab8bd4d5788ba8798fb7cd Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 16 May 2026 23:54:35 -0400 Subject: [PATCH] wave spawning based on wave caps in WaveDefinition --- .../minigame/barbassault/BarbassDevHelper.kt | 16 +++++++-- .../barbassault/arena/BarbassaultGameArea.kt | 11 ------ .../barbassault/arena/BarbassaultSession.kt | 35 +++++++++++++++---- .../arena/Npcs/PenanceFighterNPC.kt | 2 +- .../arena/Npcs/PenanceHealerNPC.kt | 2 ++ .../barbassault/arena/Npcs/PenanceHelper.kt | 5 +-- .../arena/Npcs/PenanceRangerNPC.kt | 2 +- .../arena/Npcs/PenanceRunnerNPC.kt | 2 +- .../barbassault/arena/WaveDefinition.kt | 2 +- .../barbassault/arena/scenery/EggCannon.kt | 2 +- 10 files changed, 53 insertions(+), 26 deletions(-) diff --git a/Server/src/main/content/minigame/barbassault/BarbassDevHelper.kt b/Server/src/main/content/minigame/barbassault/BarbassDevHelper.kt index c3a8459cd..bb3f65c4a 100644 --- a/Server/src/main/content/minigame/barbassault/BarbassDevHelper.kt +++ b/Server/src/main/content/minigame/barbassault/BarbassDevHelper.kt @@ -1,5 +1,6 @@ package content.minigame.barbassault +import content.minigame.barbassault.arena.Npcs.dropPenanceEggCluster import content.minigame.barbassault.bots.BarbassBot import content.minigame.barbassault.lobby.BarbassaultLobby import core.api.* @@ -21,7 +22,7 @@ class BarbassDevHelper : CommandSet(Privilege.ADMIN) { return@define } define ("setbarbwave") { player,args -> - player.setAttribute("/save:barbass:wave", args[1].toIntOrNull()) + player.setBarbWave(args[1].toInt()) return@define } @@ -45,7 +46,18 @@ class BarbassDevHelper : CommandSet(Privilege.ADMIN) { define("defgear"){ player,_-> player.equipment.replace(Item(954),2) return@define - + } + define("eggloot"){ player,_-> + dropPenanceEggCluster(player) + return@define + } + define("spawnwave"){ player,_-> + player.baSession?.spawnNpcWave() + return@define + } + define("spawnwaveforce"){ player,_-> + player.baSession?.spawnNpcWave(true) + return@define } define("babot"){ player,_-> if (babotcount >= 25) { diff --git a/Server/src/main/content/minigame/barbassault/arena/BarbassaultGameArea.kt b/Server/src/main/content/minigame/barbassault/arena/BarbassaultGameArea.kt index 5d8a28247..063517678 100644 --- a/Server/src/main/content/minigame/barbassault/arena/BarbassaultGameArea.kt +++ b/Server/src/main/content/minigame/barbassault/arena/BarbassaultGameArea.kt @@ -67,17 +67,6 @@ class BarbassaultGameArea : InteractionListener, MapArea { EggCannonLoc(EggCannonSide.WEST, 21, 34, 0, Direction.SOUTH), EggCannonLoc(EggCannonSide.EAST, 40, 34, 0, Direction.SOUTH) ) - - enum class pennanceNPC { RUNNER, HEALER, FIGHTER, RANGER } - data class npcSpawnLoc(val tunnel:pennanceNPC, val x: Int,val y: Int,val z: Int,val direction: Direction) - val npcSpawns: List = listOf( - npcSpawnLoc(pennanceNPC.RUNNER,42,45,0,Direction.SOUTH), - npcSpawnLoc(pennanceNPC.HEALER,36,46,0,Direction.SOUTH), - - npcSpawnLoc(pennanceNPC.FIGHTER,24,46,0,Direction.SOUTH), - npcSpawnLoc(pennanceNPC.RANGER,36,46,0,Direction.SOUTH), - ) - override fun defineAreaBorders(): Array { //block standard teleports. BarbassaultTut.BarbassTutNPCs.forEach { diff --git a/Server/src/main/content/minigame/barbassault/arena/BarbassaultSession.kt b/Server/src/main/content/minigame/barbassault/arena/BarbassaultSession.kt index e58fdda8f..f982b76f1 100644 --- a/Server/src/main/content/minigame/barbassault/arena/BarbassaultSession.kt +++ b/Server/src/main/content/minigame/barbassault/arena/BarbassaultSession.kt @@ -11,7 +11,6 @@ import content.minigame.barbassault.getBarbWave import content.minigame.barbassault.lobby.* import core.api.* import core.game.node.entity.Entity -import core.game.node.entity.combat.CombatStyle import core.game.node.entity.impl.PulseManager import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player @@ -24,7 +23,6 @@ import core.game.world.map.Direction import core.game.world.map.Location import core.game.world.map.build.DynamicRegion import core.game.world.map.zone.* -import core.game.world.update.flag.context.Graphics import core.tools.Log import core.tools.secondsToTicks import core.tools.ticksToSeconds @@ -35,6 +33,7 @@ import org.rs09.consts.NPCs enum class BarbassaultState { PARTY_CREATION, STARTING, IN_ARENA,FORFEIT, COMPLETE,DEATH, END } +data class PenanceNpcTunnel(val type:PenanceType, val x: Int,val y: Int,val z: Int,val direction: Direction) { fun toLocation(): Location = Location(x, y, z) } class BarbassaultSession( val activity: BarbassaultActivity ? = null) :LogoutListener, MapArea { //constructor(region: DynamicRegion, activity: BarbassaultActivity) : this(activity) {this.region = region; this.base = region.baseLocation} @@ -45,6 +44,13 @@ class BarbassaultSession( val activity: BarbassaultActivity ? = null) :LogoutLi var state: BarbassaultState = BarbassaultState.PARTY_CREATION val sessionNpcs = mutableListOf() + var currentNPCCount = SpawnCaps(0,0,0,0) + val npcTunnel: List = listOf( + PenanceNpcTunnel(PenanceType.RUNNER,42,46,0,Direction.SOUTH), + PenanceNpcTunnel(PenanceType.HEALER,36,47,0,Direction.SOUTH), + PenanceNpcTunnel(PenanceType.FIGHTER,24,46,0,Direction.SOUTH), + PenanceNpcTunnel(PenanceType.RANGER,18,46,0,Direction.SOUTH), + ) val BAgroundItems = mutableListOf() val eggHopper = EggCannon.EggHopper() var eggCannonNpcWest: NPC? = null @@ -136,7 +142,6 @@ class BarbassaultSession( val activity: BarbassaultActivity ? = null) :LogoutLi Pulser.submit(countdownPulse!!) } private fun InitEvents(){ - eventBus.register(BarbAssEvent.NPCDied::class.java) { event -> val tracker = scoreManager.trackerFor(event.killer) val npcRoleType = event.npc.getAttribute("barbass-role") @@ -163,10 +168,29 @@ class BarbassaultSession( val activity: BarbassaultActivity ? = null) :LogoutLi tracker.healerStats.wrongPoisonUsed++ } } - fun forfeit(){ - state = BarbassaultState.FORFEIT + + fun spawnNpcWave(force: Boolean = false) { + val caps = currentWaveDefinition.caps + val npcIds = currentWaveDefinition.npcIds + + tryPenanceSpawn(PenanceType.RANGER, currentNPCCount.rangers, caps.rangers, npcIds, force) { currentNPCCount.rangers++ } + tryPenanceSpawn(PenanceType.FIGHTER, currentNPCCount.fighters, caps.fighters, npcIds,force) { currentNPCCount.fighters++ } + tryPenanceSpawn(PenanceType.RUNNER, currentNPCCount.runners, caps.runners,npcIds,force) { currentNPCCount.runners++ } + tryPenanceSpawn(PenanceType.HEALER, currentNPCCount.healers, caps.healers, npcIds,force) { currentNPCCount.healers++ } } + fun tryPenanceSpawn(type: PenanceType,current: Int,cap: Int,npcIds: Map, force: Boolean, increment: () -> Unit) { + if (!force && current >= cap) { return } + val npcId = npcIds[type] ?: return + val spawn = npcTunnel.firstOrNull { it.type == type } ?: return + + var thisNpc = sessionNPCSpawn(npcId, base.transform(30,31,0), spawn.direction) + thisNpc?.location = base.transform(spawn.toLocation()) + increment() + } + + + fun forfeit(){ state = BarbassaultState.FORFEIT } fun isInBarbAssaultGame() = state == BarbassaultState.IN_ARENA fun endGame(endReason: String){ @@ -309,7 +333,6 @@ class BarbassaultSession( val activity: BarbassaultActivity ? = null) :LogoutLi fun sessionNPCSpawn(id: Int, location: Location, direction: Direction, vararg objects: Any): NPC? { val npc = NPC.create(id, location, direction, *objects) npc.init() - sessionNpcs.add(npc) return npc } diff --git a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceFighterNPC.kt b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceFighterNPC.kt index 3a92a691c..d5e343db3 100644 --- a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceFighterNPC.kt +++ b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceFighterNPC.kt @@ -60,7 +60,7 @@ class PenanceFighterNPC : NPCBehavior(*PENANCE_FIGHTER_IDS.toIntArray()) { self.isWalks = true // self.isNeverWalks = false self.properties.isNPCWalkable = false - self.walkRadius = 64 + self.walkRadius = 24 self.isAggressive = true self.isRespawn = false diff --git a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHealerNPC.kt b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHealerNPC.kt index 0682a1a34..ef7cc2666 100644 --- a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHealerNPC.kt +++ b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHealerNPC.kt @@ -29,6 +29,8 @@ class PenanceHealerNPC : NPCBehavior(*PENANCE_HEALER_IDS.toIntArray()) { override fun onCreation (self: NPC) { self.setAttribute("barbass-role", BarbRole.HEALER) + self.isWalks = true + self.walkRadius = 24 } //sendMessage(player,"that's the wrong type of poisoned food to use! Penalty!") diff --git a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHelper.kt b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHelper.kt index ff642747e..0d1b63129 100644 --- a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHelper.kt +++ b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceHelper.kt @@ -8,8 +8,9 @@ import core.game.node.entity.player.Player import core.game.world.map.RegionManager import org.rs09.consts.Items -fun dropPenanceEggCluster(killer: Player, npc: NPC) { - val tiles = npc.dropLocation.get3x3Tiles().shuffled() +fun dropPenanceEggCluster(killer: Player, npc: NPC? = null) { + val center = npc?.dropLocation ?: killer.location + val tiles = center.get3x3Tiles().shuffled() val eggs = listOf( Items.RED_EGG_10532, Items.RED_EGG_10532, Items.BLUE_EGG_10533, Items.BLUE_EGG_10533, diff --git a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRangerNPC.kt b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRangerNPC.kt index d0f36bdaf..ac90b158d 100644 --- a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRangerNPC.kt +++ b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRangerNPC.kt @@ -50,7 +50,7 @@ class PenanceRangerNPC : NPCBehavior(*PENANCE_RANGER_IDS.toIntArray()) { self.setAttribute("agg_radius",6) self.isWalks = true self.isNeverWalks = false - self.walkRadius = 64 + self.walkRadius = 24 self.isAggressive = true self.definition.combatGraphics[1] = Graphics(866, 25, 0) self.setAttribute("barbass-role",BarbRole.ATTACKER) diff --git a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRunnerNPC.kt b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRunnerNPC.kt index d6b5939f7..159f4d65c 100644 --- a/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRunnerNPC.kt +++ b/Server/src/main/content/minigame/barbassault/arena/Npcs/PenanceRunnerNPC.kt @@ -36,7 +36,7 @@ class PenanceRunnerNPC : NPCBehavior(*PENANCE_RUNNER_IDS.toIntArray()) { } override fun onCreation(self: NPC) { self.isWalks = true - self.walkRadius = 22 + self.walkRadius = 24 self.destinationFlag self.setAttribute("barbass-role", BarbRole.DEFENDER) diff --git a/Server/src/main/content/minigame/barbassault/arena/WaveDefinition.kt b/Server/src/main/content/minigame/barbassault/arena/WaveDefinition.kt index 22b032fbc..81b66f083 100644 --- a/Server/src/main/content/minigame/barbassault/arena/WaveDefinition.kt +++ b/Server/src/main/content/minigame/barbassault/arena/WaveDefinition.kt @@ -12,7 +12,7 @@ fun getWaveDefinition(index: Int): WaveDefinition { data class WaveDefinition( val caps: SpawnCaps, val npcIds: Map ) enum class PenanceType { HEALER, RUNNER, FIGHTER, RANGER, QUEEN } -data class SpawnCaps(val rangers: Int, val fighters: Int, val runners: Int, val healers: Int) +data class SpawnCaps(var rangers: Int, var fighters: Int, var runners: Int, var healers: Int) private val waves = listOf( WaveDefinition( //Wave tut SpawnCaps(rangers = 1, fighters = 1, runners = 1, healers = 1), diff --git a/Server/src/main/content/minigame/barbassault/arena/scenery/EggCannon.kt b/Server/src/main/content/minigame/barbassault/arena/scenery/EggCannon.kt index eafe2ef4f..5165b4b26 100644 --- a/Server/src/main/content/minigame/barbassault/arena/scenery/EggCannon.kt +++ b/Server/src/main/content/minigame/barbassault/arena/scenery/EggCannon.kt @@ -232,7 +232,7 @@ class EggCannon : ComponentPlugin() { val target = findClosestTargetNPCIDFromNPC(npcId, eggCannon as NPC ,14) val hopper = player.baSession?.eggHopper ?: return - if (target == null) { sendDialogueLines(player,"There are no targetable Penance ${type.name} within firing range.") ;return} + if (target == null) { sendDialogueLines(player,"There are no targetable Penance ${type.name.lowercase().replaceFirstChar { it.uppercase() }} within firing range.") ;return} if (!eggType.tryConsume(hopper)) { sendMessage(player, "There are no ${eggType.name.lowercase()} eggs in the hopper.") return