diff --git a/data/definitions/animations.yml b/data/definitions/animations.yml index 8dc3b7d31..bcc4fc989 100644 --- a/data/definitions/animations.yml +++ b/data/definitions/animations.yml @@ -736,7 +736,7 @@ emote_shake_snow_globe: run: false emote_trample_snow: id: 7528 - ticks: 8 + ticks: 4 walk: false run: false emote_candy_cane_spin: @@ -801,22 +801,22 @@ emote_squirrel_ears: run: false emote_toy_horsey_brown: id: 918 - ticks: 4 + ticks: 3 walk: false run: false emote_toy_horsey_white: id: 919 - ticks: 4 + ticks: 3 walk: false run: false emote_toy_horsey_black: id: 920 - ticks: 4 + ticks: 3 walk: false run: false emote_toy_horsey_grey: id: 921 - ticks: 4 + ticks: 3 walk: false run: false rubber_chicken_whack: diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt index e9c5327e5..cadbf92a1 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/FloorItemOptionHandler.kt @@ -3,7 +3,6 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.message -import world.gregs.voidps.engine.client.variable.hasClock import world.gregs.voidps.engine.entity.character.mode.interact.Interact import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.chat.ChatType diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt index 385ebbd0f..b0ecd2b4b 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/ObjectOptionHandler.kt @@ -3,7 +3,6 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.cache.definition.Transforms import world.gregs.voidps.engine.client.instruction.InstructionHandler -import world.gregs.voidps.engine.client.variable.hasClock import world.gregs.voidps.engine.data.definition.DefinitionsDecoder import world.gregs.voidps.engine.data.definition.ObjectDefinitions import world.gregs.voidps.engine.data.definition.VariableDefinitions diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt index 17fe73e9f..bd99d3438 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/PlayerOptionHandler.kt @@ -2,7 +2,6 @@ package world.gregs.voidps.engine.client.instruction.handle import com.github.michaelbull.logging.InlineLogger import world.gregs.voidps.engine.client.instruction.InstructionHandler -import world.gregs.voidps.engine.client.variable.hasClock import world.gregs.voidps.engine.entity.character.mode.Follow import world.gregs.voidps.engine.entity.character.mode.interact.Interact import world.gregs.voidps.engine.entity.character.player.Player diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/WalkHandler.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/WalkHandler.kt index 9d5ae9840..34f16cd51 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/WalkHandler.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/instruction/handle/WalkHandler.kt @@ -2,7 +2,6 @@ package world.gregs.voidps.engine.client.instruction.handle import world.gregs.voidps.engine.client.instruction.InstructionHandler import world.gregs.voidps.engine.client.ui.closeInterfaces -import world.gregs.voidps.engine.client.variable.hasClock import world.gregs.voidps.engine.entity.character.clearWatch import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.character.player.Player diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/NPCTask.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/NPCTask.kt index 657a75415..fe3547836 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/NPCTask.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/NPCTask.kt @@ -6,7 +6,6 @@ import world.gregs.voidps.engine.entity.character.mode.EmptyMode import world.gregs.voidps.engine.entity.character.mode.Wander import world.gregs.voidps.engine.entity.character.mode.Wander.Companion.wanders import world.gregs.voidps.engine.entity.character.npc.NPC -import kotlin.coroutines.resume class NPCTask( iterator: TaskIterator, diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/PlayerTask.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/PlayerTask.kt index ded85b0d5..97e01e2ee 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/PlayerTask.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/client/update/PlayerTask.kt @@ -4,7 +4,6 @@ import world.gregs.voidps.engine.client.ui.hasMenuOpen import world.gregs.voidps.engine.client.update.iterator.TaskIterator import world.gregs.voidps.engine.entity.character.CharacterList import world.gregs.voidps.engine.entity.character.player.Player -import kotlin.coroutines.resume class PlayerTask( iterator: TaskIterator, diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/Visuals.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/Visuals.kt index afe526101..6be66a036 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/Visuals.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/Visuals.kt @@ -12,6 +12,7 @@ import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.entity.obj.GameObject import world.gregs.voidps.engine.entity.obj.ObjectShape import world.gregs.voidps.engine.get +import world.gregs.voidps.engine.suspend.SuspendableContext import world.gregs.voidps.network.login.protocol.visual.VisualMask import world.gregs.voidps.network.login.protocol.visual.Visuals import world.gregs.voidps.network.login.protocol.visual.update.Hitsplat @@ -69,6 +70,11 @@ fun Character.setAnimation(id: String, delay: Int? = null, override: Boolean = f return definition["ticks", 0] } +context(SuspendableContext<*>) suspend fun Character.animate(id: String, override: Boolean = false) { + val ticks = setAnimation(id, override = override) + delay(ticks) +} + fun Character.clearAnimation() { visuals.animation.reset() flagAnimation() @@ -190,13 +196,21 @@ fun Character.setExactMovement( flagExactMovement() } -fun Character.exactMove(delta: Delta, delay: Int = tile.distanceTo(tile.add(delta)) * 30, direction: Direction = Direction.NONE) { +fun Character.setExactMove(delta: Delta, delay: Int = tile.distanceTo(tile.add(delta)) * 30, direction: Direction = Direction.NONE) { val start = tile tele(delta) + if (this is Player) { + movementType = MoveType.Walk + } setExactMovement(Delta.EMPTY, delay, start.delta(tile), direction = direction) } -fun Character.exactMove(target: Tile, delay: Int = tile.distanceTo(target) * 30, direction: Direction = Direction.NONE, startDelay: Int = 0) { +context(SuspendableContext<*>) suspend fun Character.exactMove(delta: Delta, delay: Int = tile.distanceTo(tile.add(delta)) * 30, direction: Direction = Direction.NONE) { + character.setExactMove(delta, delay, direction) + delay(delay / 30) +} + +fun Character.setExactMove(target: Tile, delay: Int = tile.distanceTo(target) * 30, direction: Direction = Direction.NONE, startDelay: Int = 0) { val start = tile tele(target) if (this is Player) { @@ -205,6 +219,11 @@ fun Character.exactMove(target: Tile, delay: Int = tile.distanceTo(target) * 30, setExactMovement(Delta.EMPTY, delay, start.delta(tile), startDelay, direction = direction) } +context(SuspendableContext<*>) suspend fun Character.exactMove(target: Tile, delay: Int = tile.distanceTo(target) * 30, direction: Direction = Direction.NONE, startDelay: Int = 0) { + character.setExactMove(target, delay, direction, startDelay) + delay((startDelay + delay) / 30) +} + val Character.turn: Delta get() = Tile(visuals.turn.targetX, visuals.turn.targetY, tile.level).delta(tile) diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/move/Walk.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/move/Walk.kt index 4405eb2a4..4469f0e4c 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/move/Walk.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/entity/character/move/Walk.kt @@ -4,6 +4,7 @@ import world.gregs.voidps.engine.entity.character.Character import world.gregs.voidps.engine.entity.character.mode.move.Movement import world.gregs.voidps.engine.entity.character.mode.move.target.TileTargetStrategy import world.gregs.voidps.engine.entity.obj.GameObject +import world.gregs.voidps.engine.suspend.SuspendableContext import world.gregs.voidps.type.Tile /** @@ -13,4 +14,56 @@ import world.gregs.voidps.type.Tile */ fun Character.walkTo(target: Tile, noCollision: Boolean = false, noRun: Boolean = false) { mode = Movement(this, TileTargetStrategy(target, noCollision, noRun)) +} + +/** + * Forces the character to walk to a tile + */ +context(SuspendableContext<*>) suspend fun Character.walkTo(tile: Tile) { + if (this.tile == tile) { + return + } + walkTo(tile, noCollision = false, noRun = false) + while (this.tile != tile) { + delay() + } +} + +/** + * Force a character to walk to tile ignoring collisions + */ +context(SuspendableContext<*>) suspend fun Character.walkOver(tile: Tile) { + if (this.tile == tile) { + return + } + walkTo(tile, noCollision = true, noRun = true) + while (this.tile != tile) { + delay() + } +} + +/** + * Steps a character to tile (run or walk) + */ +context(SuspendableContext<*>) suspend fun Character.stepTo(tile: Tile) { + if (this.tile == tile) { + return + } + walkTo(tile, noCollision = false, noRun = false) + while (this.tile != tile) { + delay() + } +} + +/** + * Steps a character to tile (run or walk) ignoring collisions + */ +context(SuspendableContext<*>) suspend fun Character.stepOver(tile: Tile) { + if (this.tile == tile) { + return + } + walkTo(tile, noCollision = true, noRun = false) + while (this.tile != tile) { + delay() + } } \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionQueue.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionQueue.kt index 95da915ed..3589f03e5 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionQueue.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/queue/ActionQueue.kt @@ -4,7 +4,6 @@ import kotlinx.coroutines.* import world.gregs.voidps.engine.client.ui.closeMenu import world.gregs.voidps.engine.client.ui.dialogue import world.gregs.voidps.engine.client.ui.hasMenuOpen -import world.gregs.voidps.engine.client.variable.hasClock import world.gregs.voidps.engine.entity.character.Character import world.gregs.voidps.engine.entity.character.clearAnimation import world.gregs.voidps.engine.entity.character.npc.NPC diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/Suspend.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/Suspend.kt index f9c5c1bc0..eaf7cc7a6 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/Suspend.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/Suspend.kt @@ -1,18 +1,8 @@ package world.gregs.voidps.engine.suspend -import com.github.michaelbull.logging.InlineLogger -import kotlinx.coroutines.suspendCancellableCoroutine import world.gregs.voidps.engine.client.ui.dialogue -import world.gregs.voidps.engine.client.ui.menu -import world.gregs.voidps.engine.client.variable.remaining -import world.gregs.voidps.engine.client.variable.start import world.gregs.voidps.engine.entity.character.Character -import world.gregs.voidps.engine.entity.character.mode.interact.Interact -import world.gregs.voidps.engine.entity.character.mode.interact.Interaction import world.gregs.voidps.engine.entity.character.player.Player -import world.gregs.voidps.engine.entity.character.setAnimation -import world.gregs.voidps.engine.event.Context -import world.gregs.voidps.engine.queue.Action fun Character.resumeSuspension(): Boolean { val suspend = suspension ?: return false @@ -26,25 +16,4 @@ fun Character.resumeSuspension(): Boolean { suspend fun SuspendableContext.awaitDialogues(): Boolean { Suspension.start(character) { player.dialogue == null } return true -} - -suspend fun SuspendableContext.awaitInterfaces(): Boolean { - Suspension.start(character) { player.menu == null } - return true -} - -private val logger = InlineLogger() - -context(SuspendableContext<*>) suspend fun Character.playAnimation(id: String, override: Boolean = false, canInterrupt: Boolean = true) { - val ticks = setAnimation(id, override = override) - if (ticks == -1) { - logger.warn { "No animation delay $id" } - } else { - character.start("movement_delay", ticks) - if (canInterrupt) { - pause(ticks) - } else { - delay(ticks) - } - } } \ No newline at end of file diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/SuspendableContext.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/SuspendableContext.kt index 732797eb6..a7a4dcfb2 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/SuspendableContext.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/suspend/SuspendableContext.kt @@ -2,7 +2,6 @@ package world.gregs.voidps.engine.suspend import kotlinx.coroutines.suspendCancellableCoroutine import world.gregs.voidps.engine.entity.character.Character -import world.gregs.voidps.engine.entity.character.mode.interact.Interaction import world.gregs.voidps.engine.event.Context interface SuspendableContext : Context { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/achievement/TaskSystem.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/achievement/TaskSystem.kts index f12e3f1ad..04c656e3c 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/achievement/TaskSystem.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/achievement/TaskSystem.kts @@ -14,7 +14,6 @@ import world.gregs.voidps.engine.entity.character.mode.move.enterArea import world.gregs.voidps.engine.entity.character.mode.move.exitArea import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.inject -import world.gregs.voidps.world.interact.dialogue.Happy import world.gregs.voidps.world.interact.entity.player.display.Tab val variables: VariableDefinitions by inject() diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/dnd/shootingstar/ShootingStar.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/dnd/shootingstar/ShootingStar.kts index 9e0ee7ad7..c72830e8b 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/dnd/shootingstar/ShootingStar.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/dnd/shootingstar/ShootingStar.kts @@ -10,7 +10,7 @@ import world.gregs.voidps.engine.data.Settings import world.gregs.voidps.engine.data.definition.data.Rock import world.gregs.voidps.engine.data.settingsReload import world.gregs.voidps.engine.entity.World -import world.gregs.voidps.engine.entity.character.exactMove +import world.gregs.voidps.engine.entity.character.setExactMove import world.gregs.voidps.engine.entity.character.mode.interact.Interact import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.character.npc.NPC @@ -120,7 +120,7 @@ fun startCrashedStarEvent() { for (player in under) { player.damage(random.nextInt(10, 50)) val direction = Direction.all.first { !player.blocked(it) } - player.exactMove(direction.delta, 1, direction = direction.inverse()) + player.setExactMove(direction.delta, 1, direction = direction.inverse()) player.setAnimation("step_back_startled") } World.queue("falling_star_object_removal", 1) { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianAdvanced.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianAdvanced.kts index e43e36bee..5bbc3beb5 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianAdvanced.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianAdvanced.kts @@ -1,6 +1,7 @@ package world.gregs.voidps.world.activity.skill.agility.course import world.gregs.voidps.engine.entity.character.exactMove +import world.gregs.voidps.engine.entity.character.setExactMove import world.gregs.voidps.engine.entity.character.face import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.move.walkTo @@ -13,7 +14,6 @@ import world.gregs.voidps.engine.entity.character.setAnimation import world.gregs.voidps.engine.entity.obj.objectOperate import world.gregs.voidps.type.Direction import world.gregs.voidps.type.Tile -import world.gregs.voidps.type.equals objectOperate("Run-up", "barbarian_outpost_run_wall") { if (!player.has(Skill.Agility, 90, message = true)) { @@ -24,20 +24,16 @@ objectOperate("Run-up", "barbarian_outpost_run_wall") { player.face(Direction.NORTH) player.setAnimation("barbarian_wall_jump_climb") delay(7) - player.exactMove(Tile(2538, 3545, 2), 30, Direction.NORTH) player.setAnimation("barbarian_wall_jump") - delay(2) + player.exactMove(Tile(2538, 3545, 2), 30, Direction.NORTH) + delay(1) player.exp(Skill.Agility, 15.0) player.agilityStage(3) } objectOperate("Climb-up", "barbarian_outpost_climb_wall") { player.clear("face_entity") - val move = !player.tile.equals(2537, 3546, 2) - if (move) { - player.walkTo(Tile(2537, 3546, 2)) - } - delay(if (move) 2 else 1) + player.walkTo(Tile(2537, 3546, 2)) player.face(Direction.WEST) delay() player.setAnimation("barbarian_wall_climb") @@ -56,11 +52,10 @@ objectOperate("Fire", "barbarian_outpost_spring") { target.animate("barbarian_spring_fire") delay(1) player.tele(2533, 3547, 3) - player.exactMove(Tile(2532, 3553, 3), 60, Direction.NORTH) player.setAnimation("barbarian_spring_shoot") - delay(1) + player.exactMove(Tile(2532, 3553, 3), 60, Direction.NORTH) target.animate("barbarian_spring_reset") - delay(3) + delay(2) player.exp(Skill.Agility, 15.0) player.agilityStage(5) } @@ -71,7 +66,6 @@ objectOperate("Cross", "barbarian_outpost_balance_beam") { player.setAnimation("circus_cartwheel") delay() player.exactMove(Tile(2536, 3553, 3), 45, Direction.EAST) - delay() player.renderEmote = "beam_balance" delay() player.exp(Skill.Agility, 15.0) @@ -90,11 +84,10 @@ objectOperate("Jump-over", "barbarian_outpost_gap") { } objectOperate("Slide-down", "barbarian_outpost_roof") { - player.exactMove(player.tile.copy(x = 2540), 30, Direction.EAST) player.setAnimation("barbarian_slide_start") - delay() + player.exactMove(player.tile.copy(x = 2540), 30, Direction.EAST) player.setAnimation("barbarian_slide") - player.exactMove(player.tile.copy(x = 2543, level = 1), 90, Direction.EAST) + player.setExactMove(player.tile.copy(x = 2543, level = 1), 90, Direction.EAST) delay() player.setAnimation("barbarian_slide") delay() diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianOutpost.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianOutpost.kts index 6cd47a9e8..3d6f51f67 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianOutpost.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/BarbarianOutpost.kts @@ -3,8 +3,10 @@ package world.gregs.voidps.world.activity.skill.agility.course import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.data.Settings import world.gregs.voidps.engine.entity.character.exactMove +import world.gregs.voidps.engine.entity.character.setExactMove import world.gregs.voidps.engine.entity.character.face import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.engine.entity.character.move.walkOver import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.character.player.chat.ChatType import world.gregs.voidps.engine.entity.character.player.clearRenderEmote @@ -29,40 +31,38 @@ objectOperate("Squeeze-through", "barbarian_outpost_entrance") { val start = if (player.tile.y >= 3560) Tile(2552, 3561) else Tile(2552, 3558) if (player.tile != start) { player.walkTo(start) - delay() player.face(target) delay() } player.setAnimation("climb_through_pipe") val end = if (player.tile.y >= 3560) 3558 else 3561 player.exactMove(Tile(2552, end), 60, direction = if (player.tile.y >= 3560) Direction.SOUTH else Direction.NORTH) - delay(2) } objectOperate("Swing-on", "barbarian_outpost_rope_swing") { player.walkTo(player.tile.copy(y = 3554)) + arriveDelay() player.clear("face_entity") player.face(Direction.SOUTH) val disable = Settings["agility.disableCourseFailure", false] val success = disable || Level.success(player.levels.get(Skill.Agility), 70) // 50% success at 35 // player.message("The rope swing is being used at the moment.", ChatType.Filter) - delay(2) player.setAnimation("rope_swing") target.animate("swing_rope") delay() if (success) { - player.exactMove(player.tile.copy(y = 3549), 60, Direction.SOUTH) + player.setExactMove(player.tile.copy(y = 3549), 60, Direction.SOUTH) delay() player.exp(Skill.Agility, 22.0) player.message("You skillfully swing across.", ChatType.Filter) } else { player.exactMove(player.tile.copy(y = 3550), 50, Direction.SOUTH) - delay(2) + delay(1) player.tele(player.tile.copy(y = 9950)) player.damage(50) delay(3) - player.walkTo(player.tile.copy(y = 9949), noCollision = true, noRun = true) player.message("You slip and fall to the pit below.", ChatType.Filter) + player.walkOver(player.tile.copy(y = 9949)) } if (success || Settings["agility.disableFailLapSkip", false]) { player.agilityStage(1) @@ -70,31 +70,27 @@ objectOperate("Swing-on", "barbarian_outpost_rope_swing") { } objectOperate("Walk-across", "barbarian_outpost_log_balance") { + player.walkOver(Tile(2550, 3546)) val disable = Settings["agility.disableCourseFailure", false] val success = disable || Level.success(player.levels.get(Skill.Agility), 93) // 62.1% success rate at 35 player.message("You walk carefully across the slippery log...", ChatType.Filter) player.renderEmote = "rope_balance" - player.walkTo(Tile(2550, 3546), noCollision = true, noRun = true) - delay() if (success) { - player.walkTo(Tile(2541, 3546), noCollision = true, noRun = true) - delay(9) + player.walkOver(Tile(2541, 3546)) player.clearRenderEmote() player.exp(Skill.Agility, 13.7) player.message("... and make it safely to the other side.", ChatType.Filter) } else { player.clear("face_entity") player.face(Direction.WEST) - player.walkTo(Tile(2545, 3546), noCollision = true, noRun = true) - delay(7) + player.walkOver(Tile(2545, 3546)) player.setAnimation("fall_off_log_left") delay() player.message("... but you lose your footing and fall into the water.", ChatType.Filter) player.tele(2545, 3545) player.renderEmote = "tread_water" delay() - player.walkTo(Tile(2545, 3543), noCollision = true, noRun = true) - delay(2) + player.walkOver(Tile(2545, 3543)) player.message("Something in the water bites you.", ChatType.Filter) player.clearRenderEmote() player.damage(random.nextInt(30, 52)) @@ -121,8 +117,7 @@ objectOperate("Walk-across", "barbarian_outpost_balancing_ledge") { player.renderEmote = "ledge_balance" player.message("You put your foot on the ledge and try to edge across...", ChatType.Filter) if (success) { - player.walkTo(Tile(2532, 3547, 1), noCollision = true, noRun = true) - delay(5) + player.walkOver(Tile(2532, 3547, 1)) player.face(Direction.WEST) player.setAnimation("ledge_stand_away_right") player.clearRenderEmote() @@ -130,8 +125,7 @@ objectOperate("Walk-across", "barbarian_outpost_balancing_ledge") { player.message("You skillfully edge across the gap.", ChatType.Filter) } else { // https://youtu.be/bPFbuMnCx18?si=KJIVXuBftlZ9_Wth&t=47 - player.walkTo(Tile(2534, 3547, 1), noCollision = true, noRun = true) - delay(2) + player.walkOver(Tile(2534, 3547, 1)) player.face(Direction.WEST) player.setAnimation("fall_off_log_left") delay() @@ -143,7 +137,7 @@ objectOperate("Walk-across", "barbarian_outpost_balancing_ledge") { player.clearRenderEmote() player.damage(50) delay() - player.walkTo(Tile(2534, 3545), noCollision = true, noRun = true) + player.walkOver(Tile(2534, 3545)) //player.message("", ChatType.Filter) // TODO } // Skip stage so lap doesn't count at end @@ -159,11 +153,10 @@ objectOperate("Climb-over", "barbarian_outpost_crumbling_wall") { } if (player.tile.x == target.tile.x) { player.walkTo(target.tile.addX(-1)) - delay(2) } player.message("You climb the low wall...", ChatType.Filter) player.setAnimation("climb_over_wall") - player.exactMove(target.tile.addX(1), 60, Direction.EAST) + player.setExactMove(target.tile.addX(1), 60, Direction.EAST) delay() if (target.tile.equals(2542, 3553)) { if (player.agilityStage == 5) { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeAdvanced.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeAdvanced.kts index ce10bf20d..66c6c9837 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeAdvanced.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeAdvanced.kts @@ -2,9 +2,7 @@ package world.gregs.voidps.world.activity.skill.agility.course import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.data.Settings -import world.gregs.voidps.engine.entity.character.clearAnimation -import world.gregs.voidps.engine.entity.character.exactMove -import world.gregs.voidps.engine.entity.character.face +import world.gregs.voidps.engine.entity.character.* import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.chat.ChatType @@ -12,7 +10,6 @@ import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.entity.character.player.skill.exp.exp import world.gregs.voidps.engine.entity.character.player.skill.level.Level import world.gregs.voidps.engine.entity.character.player.skill.level.Level.has -import world.gregs.voidps.engine.entity.character.setAnimation import world.gregs.voidps.engine.entity.obj.objectApproach import world.gregs.voidps.engine.entity.obj.objectOperate import world.gregs.voidps.engine.inject @@ -51,14 +48,13 @@ objectApproach("Run-across", "gnome_sign_post_advanced") { delay(1) if (!success) { player.exactMove(Tile(2480, 3418, 3), 30, Direction.EAST) - delay(6) + delay(5) } player.exactMove(Tile(2484, 3418, 3), if (success) 60 else 210, Direction.EAST) if (success) { - delay(2) player.exp(Skill.Agility, 25.0) } else { - delay(10) + delay(3) player.setAnimation("gnome_wall_stand") delay() player.damage((player.levels.get(Skill.Constitution) - 10).coerceAtMost(65)) @@ -80,16 +76,14 @@ objectApproach("Swing-to", "gnome_pole_advanced") { delay() player.setAnimation("gnome_run_up") player.exactMove(tile.copy(y = 3421), 60, Direction.NORTH) - delay(2) player.setAnimation("gnome_jump") player.exactMove(tile.copy(y = 3425), 30, Direction.NORTH) - delay(1) player.setAnimation("gnome_swing") delay(4) player.exactMove(tile.copy(y = 3429), 30, Direction.NORTH) - delay(5) + delay(4) player.exactMove(tile.copy(y = 3432), 30, Direction.NORTH) - delay(2) + delay(1) player.agilityStage(6) player.exp(Skill.Agility, 25.0) } @@ -98,7 +92,7 @@ objectOperate("Jump-over", "gnome_barrier_advanced") { player.setAnimation("gnome_jump_barrier") delay() player.exactMove(Tile(2485, 3434, 3), 30, Direction.NORTH) - delay(2) + delay(1) player.tele(2485, 3436, 0) player.setAnimation("gnome_pipe_land") if (player.agilityStage == 6) { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeStronghold.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeStronghold.kts index a1f0ce592..33bcfb88c 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeStronghold.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/GnomeStronghold.kts @@ -4,7 +4,7 @@ import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.exactMove import world.gregs.voidps.engine.entity.character.face import world.gregs.voidps.engine.entity.character.move.tele -import world.gregs.voidps.engine.entity.character.move.walkTo +import world.gregs.voidps.engine.entity.character.move.walkOver import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.chat.ChatType import world.gregs.voidps.engine.entity.character.player.clearRenderEmote @@ -24,9 +24,8 @@ objectOperate("Walk-across", "gnome_log_balance") { player.agilityCourse("gnome") npcs.gnomeTrainer("Okay get over that log, quick quick!", listOf(Zone(878901), Zone(878900), Zone(876852))) player.renderEmote = "rope_balance" - player.walkTo(Tile(2474, 3429), noCollision = true, noRun = true) player.message("You walk carefully across the slippery log...", ChatType.Filter) - delay(8) + player.walkOver(Tile(2474, 3429)) player.clearRenderEmote() player.agilityStage(1) player.exp(Skill.Agility, 7.5) @@ -58,9 +57,8 @@ objectOperate("Climb", "gnome_tree_branch_up") { objectOperate("Walk-on", "gnome_balancing_rope") { npcs.gnomeTrainer("Come on scaredy cat, get across that rope!", Zone(9263413)) - player.walkTo(Tile(2483, 3420, 2), noCollision = true, noRun = true) player.renderEmote = "rope_balance" - delay(7) + player.walkOver(Tile(2483, 3420, 2)) player.agilityStage(4) player.clearRenderEmote() player.exp(Skill.Agility, 7.5) @@ -68,9 +66,8 @@ objectOperate("Walk-on", "gnome_balancing_rope") { } objectOperate("Walk-on", "gnome_balancing_rope_end") { - player.walkTo(Tile(2477, 3420, 2), noCollision = true, noRun = true) player.renderEmote = "rope_balance" - delay(7) + player.walkOver(Tile(2477, 3420, 2)) player.clearRenderEmote() player.exp(Skill.Agility, 7.5) player.message("You passed the obstacle successfully.", ChatType.Filter) @@ -105,12 +102,10 @@ objectOperate("Squeeze-through", "gnome_obstacle_pipe_*") { delay() player.setAnimation("climb_through_pipe") player.exactMove(target.tile.addY(2)) - delay(4) player.face(Direction.NORTH) player.tele(target.tile.addY(3)) player.setAnimation("climb_through_pipe", delay = 1) player.exactMove(target.tile.addY(6)) - delay(2) if (player.agilityStage == 6) { player.agilityStage = 0 player.inc("gnome_course_laps") diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourse.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourse.kts index bd4266a68..05ed9df9f 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourse.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourse.kts @@ -5,6 +5,7 @@ import world.gregs.voidps.engine.data.Settings import world.gregs.voidps.engine.entity.character.exactMove import world.gregs.voidps.engine.entity.character.face import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.engine.entity.character.move.walkOver import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.chat.ChatType @@ -34,7 +35,7 @@ objectOperate("Open", "wilderness_agility_door_closed") { return@objectOperate } if (player.tile.y > 3916) { - enterDoor(target, delay = 2) + enterDoor(target) player.clearRenderEmote() return@objectOperate } @@ -48,15 +49,14 @@ objectOperate("Open", "wilderness_agility_door_closed") { // fallIntoPit() // return@strongQueue // } - player.walkTo(Tile(2998, 3930), noCollision = true, noRun = true) - delay(13) + player.walkOver(Tile(2998, 3930)) player.clearRenderEmote() val gateTile = Tile(2998, 3931) val gate = objects[gateTile, "wilderness_agility_gate_east_closed"] if (gate != null) { - enterDoor(gate, delay = 1) + enterDoor(gate) } else { - player.walkTo(gateTile, noCollision = true, noRun = true) + player.walkOver(gateTile) } player.message("You skillfully balance across the ridge...", ChatType.Filter) player.exp(Skill.Agility, 15.0) @@ -72,28 +72,27 @@ objectOperate("Open", "wilderness_agility_gate_east_closed", "wilderness_agility val disable = Settings["agility.disableCourseFailure", false] val success = disable || Level.success(player.levels.get(Skill.Agility), 200..250) player.message("You go through the gate and try to edge over the ridge...", ChatType.Filter) - enterDoor(target, delay = if (target.id.endsWith("west_closed")) 2 else 1) + player.walkTo(player.tile.copy(x = player.tile.x.coerceIn(2997, 2998))) + enterDoor(target) player.renderEmote = "beam_balance" if (!success) { fallIntoPit() return@objectOperate } - player.walkTo(Tile(2998, 3917), noCollision = true, noRun = true) - delay(14) + player.walkOver(Tile(2998, 3917)) player.clearRenderEmote() val door = objects[Tile(2998, 3917), "wilderness_agility_door_closed"] if (door != null) { enterDoor(door, delay = 1) } else { - player.walkTo(Tile(2998, 3916), noCollision = true, noRun = true) + player.walkOver(Tile(2998, 3916)) } player.message("You skillfully balance across the ridge...", ChatType.Filter) player.exp(Skill.Agility, 15.0) } suspend fun SuspendableContext.fallIntoPit() { - player.walkTo(Tile(2998, 3924), noCollision = true, noRun = true) - delay(7) + player.walkOver(Tile(2998, 3924)) player.clearRenderEmote() player.face(Direction.NORTH) player.setAnimation("rope_walk_fall_down") @@ -109,16 +108,13 @@ objectOperate("Squeeze-through", "wilderness_obstacle_pipe") { } if (player.tile.y == 3938) { player.walkTo(target.tile.addY(-1)) - delay(2) } player.setAnimation("climb_through_pipe", delay = 30) player.exactMove(Tile(3004, 3940), startDelay = 30, delay = 96, direction = Direction.NORTH) - delay(4) player.tele(3004, 3947) delay() player.setAnimation("climb_through_pipe", delay = 30) player.exactMove(Tile(3004, 3950), startDelay = 30, delay = 96, direction = Direction.NORTH) - delay(3) player.exp(Skill.Agility, 12.5) player.agilityStage(1) } @@ -129,18 +125,16 @@ objectOperate("Swing-on", "wilderness_rope_swing") { player.face(Direction.NORTH) val disable = Settings["agility.disableCourseFailure", false] val success = disable || Level.success(player.levels.get(Skill.Agility), 200..250) - delay(2) player.setAnimation("rope_swing") target.animate("swing_rope") delay() if (success) { player.exactMove(player.tile.copy(y = 3958), 60, Direction.NORTH) - delay() player.exp(Skill.Agility, 20.0) player.message("You skillfully swing across.", ChatType.Filter) } else { player.exactMove(player.tile.copy(y = 3957), 50, Direction.NORTH) - delay(2) + delay(1) player.tele(3004, 10357) player.damage((player.levels.get(Skill.Constitution) * 0.15).toInt() + 10) player.message("You slip and fall to the pit below.", ChatType.Filter) @@ -156,7 +150,7 @@ objectOperate("Cross", "wilderness_stepping_stone") { player.setAnimation("stepping_stone_jump") player.playSound("jump") player.exactMove(target.tile.addX(-i), delay = 30, direction = Direction.WEST, startDelay = 15) - delay(2) + delay(1) if (i == 2 && !Settings["agility.disableCourseFailure", false] && !Level.success(player.levels.get(Skill.Agility), 180..250)) { player.setAnimation("rope_walk_fall_down") player.face(Direction.WEST) @@ -181,22 +175,18 @@ objectOperate("Walk-across", "wilderness_log_balance") { val disable = Settings["agility.disableCourseFailure", false] val success = disable || Level.success(player.levels.get(Skill.Agility), 200..250) if (success) { - player.walkTo(target.tile, noCollision = true, noRun = true) - delay() + player.walkOver(target.tile) player.renderEmote = "beam_balance" - player.walkTo(Tile(2994, 3945), noCollision = true, noRun = true) - delay(7) + player.walkOver(Tile(2994, 3945)) player.message("You skillfully edge across the gap.", type = ChatType.Filter) player.clearRenderEmote() delay() player.exp(Skill.Agility, 20.0) player.agilityStage(4) } else { - player.walkTo(target.tile, noCollision = true, noRun = true) - delay() + player.walkOver(target.tile) player.renderEmote = "beam_balance" - player.walkTo(Tile(2998, 3945), noCollision = true, noRun = true) - delay(4) + player.walkOver(Tile(2998, 3945)) player.message("You slip and fall onto the spikes below.", type = ChatType.Filter) player.setAnimation("rope_walk_fall_down") player.face(Direction.NORTH) @@ -205,8 +195,7 @@ objectOperate("Walk-across", "wilderness_log_balance") { player.clearRenderEmote() player.playSound("2h_stab") delay() - player.walkTo(Tile(2998, 10345)) - delay() + player.walkOver(Tile(2998, 10345)) player.damage((player.levels.get(Skill.Constitution) * 0.15).toInt() + 10) player.playSound("male_hit_1", delay = 20) } @@ -218,8 +207,7 @@ objectOperate("Walk-across", "wilderness_log_balance") { objectOperate("Climb", "wilderness_agility_rocks") { player.message("You walk carefully across the slippery log...", ChatType.Filter) player.renderEmote = "climbing" - player.walkTo(player.tile.copy(y = 3933), noCollision = true, noRun = true) - delay(4) + player.walkOver(player.tile.copy(y = 3933)) player.clearRenderEmote() player.message("You reach the top.", type = ChatType.Filter) if (player.agilityStage == 4) { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/firemaking/Firemaking.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/firemaking/Firemaking.kts index 67fd97318..0bfb82b8e 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/firemaking/Firemaking.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/skill/firemaking/Firemaking.kts @@ -7,7 +7,6 @@ import world.gregs.voidps.engine.client.ui.interact.itemOnItem import world.gregs.voidps.engine.client.variable.remaining import world.gregs.voidps.engine.client.variable.start import world.gregs.voidps.engine.data.definition.data.Fire -import world.gregs.voidps.engine.event.Context import world.gregs.voidps.engine.entity.character.mode.interact.Interact import world.gregs.voidps.engine.entity.character.mode.interact.Interaction import world.gregs.voidps.engine.entity.character.player.Player diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/HomeTeleport.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/HomeTeleport.kts index 3bbae4a78..84e992a61 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/HomeTeleport.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/HomeTeleport.kts @@ -10,10 +10,10 @@ import world.gregs.voidps.engine.client.variable.remaining import world.gregs.voidps.engine.client.variable.start import world.gregs.voidps.engine.data.definition.AreaDefinitions import world.gregs.voidps.engine.entity.character.move.tele +import world.gregs.voidps.engine.entity.character.setAnimation import world.gregs.voidps.engine.entity.character.setGraphic import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.queue.weakQueue -import world.gregs.voidps.engine.suspend.playAnimation import world.gregs.voidps.engine.timer.epochSeconds import world.gregs.voidps.world.interact.entity.player.combat.magic.spell.removeSpellItems import java.util.concurrent.TimeUnit @@ -41,7 +41,8 @@ interfaceOption("Cast", "lumbridge_home_teleport", "modern_spellbook") { player.start("teleport_delay", 17) repeat(17) { player.setGraphic("home_tele_${it + 1}") - player.playAnimation("home_tele_${it + 1}") + val ticks = player.setAnimation("home_tele_${it + 1}") + pause(ticks) } withContext(NonCancellable) { player.tele(areas["lumbridge_teleport"].random()) diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/JewelleryTeleport.kt b/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/JewelleryTeleport.kt index a31d31a70..6bbb6621e 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/JewelleryTeleport.kt +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/JewelleryTeleport.kt @@ -1,7 +1,7 @@ package world.gregs.voidps.world.activity.transport.teleport import world.gregs.voidps.engine.client.ui.closeInterfaces -import world.gregs.voidps.engine.client.variable.start +import world.gregs.voidps.engine.entity.character.animate import world.gregs.voidps.engine.entity.character.clearAnimation import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.player.Player @@ -11,7 +11,6 @@ import world.gregs.voidps.engine.inv.discharge import world.gregs.voidps.engine.map.collision.random import world.gregs.voidps.engine.queue.ActionPriority import world.gregs.voidps.engine.queue.queue -import world.gregs.voidps.engine.suspend.playAnimation import world.gregs.voidps.type.Area import world.gregs.voidps.world.interact.entity.sound.playSound @@ -27,8 +26,7 @@ fun itemTeleport(player: Player, inventory: String, slot: Int, area: Area, type: player.queue("teleport_$type", onCancel = null) { player.playSound("teleport") player.setGraphic("teleport_$type") - player.start("movement_delay", 2) - player.playAnimation("teleport_$type", canInterrupt = false) + player.animate("teleport_$type") player.tele(area.random(player)!!) val int = player.setAnimation("teleport_land_$type") if (int == -1) { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/Teleports.kts b/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/Teleports.kts index ec22adfec..3210478e7 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/Teleports.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/activity/transport/teleport/Teleports.kts @@ -2,9 +2,9 @@ package world.gregs.voidps.world.activity.transport.teleport import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.interfaceOption -import world.gregs.voidps.engine.client.variable.start import world.gregs.voidps.engine.data.definition.AreaDefinitions import world.gregs.voidps.engine.data.definition.SpellDefinitions +import world.gregs.voidps.engine.entity.character.animate import world.gregs.voidps.engine.entity.character.clearAnimation import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.player.skill.Skill @@ -17,7 +17,6 @@ import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.engine.map.collision.random import world.gregs.voidps.engine.queue.ActionPriority import world.gregs.voidps.engine.queue.queue -import world.gregs.voidps.engine.suspend.playAnimation import world.gregs.voidps.world.interact.entity.player.combat.magic.spell.removeSpellItems import world.gregs.voidps.world.interact.entity.player.equip.inventoryItem import world.gregs.voidps.world.interact.entity.sound.playSound @@ -43,13 +42,12 @@ interfaceOption("Cast", "*_teleport", "*_spellbook") { val book = id.removeSuffix("_spellbook") player.playSound("teleport") player.setGraphic("teleport_$book") - player.start("movement_delay", 2) - player.playAnimation("teleport_$book", canInterrupt = false) + player.animate("teleport_$book") player.tele(areas[component].random(player)!!) delay(1) player.playSound("teleport_land") player.setGraphic("teleport_land_$book") - player.playAnimation("teleport_land_$book", canInterrupt = false) + player.animate("teleport_land_$book") if (book == "ancient") { delay(1) player.clearAnimation() @@ -70,11 +68,10 @@ inventoryItem("*", "*_teleport") { if (player.inventory.remove(item.id)) { player.playSound("teleport_$type") player.setGraphic("teleport_$type") - player.start("movement_delay", 2) player.setAnimation("teleport_$type") delay(3) player.tele(map.random(player)!!) - player.playAnimation("teleport_land", canInterrupt = false) + player.animate("teleport_land") } } } \ No newline at end of file diff --git a/game/src/main/kotlin/world/gregs/voidps/world/interact/dialogue/type/LevelUp.kts b/game/src/main/kotlin/world/gregs/voidps/world/interact/dialogue/type/LevelUp.kts index b54998dd5..8e874d480 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/interact/dialogue/type/LevelUp.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/interact/dialogue/type/LevelUp.kts @@ -1,6 +1,5 @@ package world.gregs.voidps.world.interact.dialogue.type -import net.pearx.kasechange.toSnakeCase import world.gregs.voidps.engine.client.ui.chat.an import world.gregs.voidps.engine.client.ui.closeInterfaces import world.gregs.voidps.engine.client.ui.dialogue diff --git a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/obj/door/Door.kt b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/obj/door/Door.kt index f7f46d6ce..d11e159fa 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/obj/door/Door.kt +++ b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/obj/door/Door.kt @@ -3,6 +3,7 @@ package world.gregs.voidps.world.interact.entity.obj.door import world.gregs.voidps.cache.definition.data.ObjectDefinition import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.mode.interact.Interaction +import world.gregs.voidps.engine.entity.character.move.walkOver import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.obj.GameObject @@ -12,6 +13,8 @@ import world.gregs.voidps.engine.get import world.gregs.voidps.engine.timer.toTicks import world.gregs.voidps.type.Direction import world.gregs.voidps.type.Tile +import world.gregs.voidps.world.interact.entity.obj.door.Door.openDoor +import world.gregs.voidps.world.interact.entity.obj.door.Door.tile import world.gregs.voidps.world.interact.entity.obj.door.Gate.isGate import world.gregs.voidps.world.interact.entity.sound.playSound import java.util.concurrent.TimeUnit @@ -166,7 +169,29 @@ object Door { /** * Enter through a door */ -suspend fun Interaction.enterDoor(door: GameObject, def: ObjectDefinition = door.def, ticks: Int = 3, delay: Int = ticks) { +suspend fun Interaction.enterDoor(door: GameObject, def: ObjectDefinition = door.def, ticks: Int = 3, delay: Int) { Door.enter(player, door, def, ticks) + if (door.id.endsWith("_opened")) { + return + } delay(delay) +} + + +/** + * Enter through a door + */ +suspend fun Interaction.enterDoor(door: GameObject, def: ObjectDefinition = door.def, ticks: Int = 3) { + if (door.id.endsWith("_opened")) { + return + } + val direction = door.tile.delta(player.tile).toDirection() + val vertical = door.rotation == 0 || door.rotation == 2 + val target = if (vertical && direction.isHorizontal() || !vertical && direction.isVertical()) { + door.tile + } else { + tile(door, 1) + } + openDoor(player, door, def, ticks, collision = false) + player.walkOver(target) } \ No newline at end of file diff --git a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/combat/melee/special/SpearShove.kts b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/combat/melee/special/SpearShove.kts index f6538efb0..7ea4a9917 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/combat/melee/special/SpearShove.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/combat/melee/special/SpearShove.kts @@ -2,7 +2,7 @@ package world.gregs.voidps.world.interact.entity.player.combat.melee.special import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.variable.hasClock -import world.gregs.voidps.engine.entity.character.exactMove +import world.gregs.voidps.engine.entity.character.setExactMove import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.setAnimation import world.gregs.voidps.engine.entity.character.setGraphic @@ -41,6 +41,6 @@ specialAttack("shove") { player -> val direction = target.tile.delta(actual).toDirection() val delta = direction.delta if (!target.blocked(direction)) { - target.exactMove(delta, 30, direction.inverse()) + target.setExactMove(delta, 30, direction.inverse()) } } \ No newline at end of file diff --git a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/Emotes.kts b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/Emotes.kts index 19a7ee15e..506024494 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/Emotes.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/Emotes.kts @@ -6,23 +6,21 @@ import world.gregs.voidps.engine.client.ui.event.interfaceOpen import world.gregs.voidps.engine.client.ui.event.interfaceRefresh import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.InterfaceDefinitions -import world.gregs.voidps.engine.entity.character.clearAnimation -import world.gregs.voidps.engine.entity.character.facing +import world.gregs.voidps.engine.entity.character.* import world.gregs.voidps.engine.entity.character.mode.interact.Interaction import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.equip.equipped import world.gregs.voidps.engine.entity.character.player.skill.Skill -import world.gregs.voidps.engine.entity.character.setGraphic import world.gregs.voidps.engine.inject import world.gregs.voidps.engine.inv.itemChange import world.gregs.voidps.engine.map.collision.blocked import world.gregs.voidps.engine.queue.strongQueue import world.gregs.voidps.engine.suspend.SuspendableContext -import world.gregs.voidps.engine.suspend.playAnimation import world.gregs.voidps.network.login.protocol.visual.update.player.EquipSlot import world.gregs.voidps.type.Direction import world.gregs.voidps.type.random import world.gregs.voidps.world.interact.dialogue.type.statement +import world.gregs.voidps.world.interact.entity.effect.clearTransform import world.gregs.voidps.world.interact.entity.effect.transform import world.gregs.voidps.world.interact.entity.gfx.areaGraphic import world.gregs.voidps.world.interact.entity.sound.playJingle @@ -44,6 +42,9 @@ interfaceRefresh("emotes") { player -> } interfaceOption(id = "emotes") { + if (player.queue.contains("emote")) { + return@interfaceOption + } val id = option.toSnakeCase() val componentId = definitions.getComponentId(this.id, component)!! if (componentId > 23 && !unlocked(id, option)) { @@ -67,16 +68,15 @@ interfaceOption(id = "emotes") { id == "yawn" && player.equipped(EquipSlot.Hat).id == "sleeping_cap" -> playEnhancedYawnEmote(player) id == "bow" && player.equipped(EquipSlot.Legs).id == "pantaloons" -> playEnhancedEmote(player, id) id == "dance" && player.equipped(EquipSlot.Legs).id == "flared_trousers" -> playEnhancedEmote(player, id) - id == "flap" && player.equipped(EquipSlot.Feet).id == "chicken_feet" && player.equipped(EquipSlot.Legs).id == "chicken_legs" && player.equipped(EquipSlot.Chest).id == "chicken_wings" && player.equipped(EquipSlot.Hat).id == "chicken_head" -> playEnhancedEmote(player, id) + id == "flap" && player.equipped(EquipSlot.Feet).id == "chicken_feet" && player.equipped(EquipSlot.Legs).id == "chicken_legs" && player.equipped(EquipSlot.Chest).id == "chicken_wings" && player.equipped(EquipSlot.Hat).id == "chicken_head" -> playEnhancedEmote(player, id) else -> { if (id == "air_guitar") { player.playJingle(id) } player.setGraphic("emote_$id") - player.playAnimation("emote_$id") + character.setAnimation("emote_$id") } } - player.clearAnimation() } } @@ -106,24 +106,30 @@ suspend fun SuspendableContext.unlocked(id: String, emote: String): Bool "Skillcape" -> player.message("You need to be wearing a skillcape in order to perform that emote.") "Air Guitar" -> player.message("You need to have 500 music tracks unlocked to perform that emote.") "Safety First" -> { - statement(""" + statement( + """ You can't use this emote yet. Visit the Stronghold of Player Safety to unlock it. - """) + """ + ) } "Explore" -> { - statement(""" + statement( + """ You can't use this emote yet. You will need to complete the Beginner Tasks in the Lumbridge and Draynor Achievement Diary to use it. - """) + """ + ) } "Give Thanks" -> player.message("This emote can be unlocked by playing a Thanksgiving seasonal event.") "Snowman Dance", "Freeze", "Dramatic Point", "Seal of Approval" -> statement("This emote can be unlocked by playing a Christmas seasonal event.") "Flap", "Slap Head", "Idea", "Stomp" -> { - statement(""" + statement( + """ You can't use that emote yet. Visit the Stronghold of Security to unlock it. - """) + """ + ) } "Faint" -> statement("This emote can be unlocked by completing the mime court case.") } @@ -150,58 +156,58 @@ itemChange("worn_equipment", EquipSlot.Cape) { player -> } suspend fun Interaction.playEnhancedEmote(player: Player, type: String) { - player.playAnimation("emote_enhanced_$type") + player.animate("emote_enhanced_$type") } suspend fun Interaction.playEnhancedYawnEmote(player: Player) { player.setGraphic("emote_enhanced_yawn") - player.playAnimation("emote_enhanced_yawn") + player.animate("emote_enhanced_yawn") } suspend fun Interaction.playGiveThanksEmote(player: Player) { player.setGraphic("emote_give_thanks") - player.playAnimation("emote_turkey_transform") + player.animate("emote_turkey_transform") player.transform("turkey") - player.playAnimation("emote_turkey_dance") + player.animate("emote_turkey_dance") player.setGraphic("emote_give_thanks") - player.transform("") - player.playAnimation("emote_turkey_return") + player.clearTransform() + player.animate("emote_turkey_return") } suspend fun Interaction.playSealOfApprovalEmote(player: Player) { player.setGraphic("emote_seal_of_approval") - player.playAnimation("emote_seal_of_approval") + player.animate("emote_seal_of_approval") player.transform("seal") - player.playAnimation("emote_seal_clap") - player.playAnimation("emote_seal_return") + player.animate("emote_seal_clap") + player.animate("emote_seal_return") player.setGraphic("emote_seal_of_approval") - player.transform("") - player.playAnimation("emote_seal_stand") + player.clearTransform() + player.animate("emote_seal_stand") } suspend fun Interaction.playSkillCapeEmote(player: Player, skill: String) { player.setGraphic("emote_$skill") - player.playAnimation("emote_$skill") + player.animate("emote_$skill") } suspend fun Interaction.playDungeoneeringCapeEmote(player: Player) { player.setGraphic("emote_dungeoneering_start") - player.playAnimation("emote_dungeoneering_start") + player.animate("emote_dungeoneering_start") when (random.nextInt(3)) { 0 -> { player.transform("primal_warrior") - player.playAnimation("emote_dungeoneering_melee") + player.animate("emote_dungeoneering_melee") } 1 -> { player.transform("celestial_mage") - player.playAnimation("emote_dungeoneering_mage") + player.animate("emote_dungeoneering_mage") } 2 -> { player.transform("sagittarian_ranger") - player.playAnimation("emote_dungeoneering_range") + player.animate("emote_dungeoneering_range") } } - player.transform("") + player.clearTransform() } suspend fun Interaction.playDungeoneeringMasterCapeEmote(player: Player) { @@ -212,14 +218,14 @@ suspend fun Interaction.playDungeoneeringMasterCapeEmote(player: Player) var tile = player.tile.add(direction.rotate(1)) var rotation = tile.delta(player.tile).toDirection().rotate(2) areaGraphic("emote_dung_master_hobgoblin", tile, rotation = rotation) - player.playAnimation("emote_dung_master_bow") + player.animate("emote_dung_master_bow") player.transform("celestial_mage") player.setGraphic("emote_dung_master_spell") tile = player.tile.add(direction.rotate(7)) rotation = tile.delta(player.tile).toDirection().rotate(4) areaGraphic("emote_dung_master_gravecreeper", tile, rotation = rotation) - player.playAnimation("emote_dung_master_spell") + player.animate("emote_dung_master_spell") player.transform("primal_warrior") player.setGraphic("emote_dung_master_return") @@ -229,7 +235,7 @@ suspend fun Interaction.playDungeoneeringMasterCapeEmote(player: Player) tile = player.tile.add(direction.inverse()) rotation = direction.rotate(3) areaGraphic("emote_dung_master_cursebearer", tile, rotation = rotation) - player.playAnimation("emote_dung_master_sword") + player.animate("emote_dung_master_sword") - player.transform("") + player.clearTransform() } \ No newline at end of file diff --git a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/ItemEmotes.kts b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/ItemEmotes.kts index 974f2016b..00c1de202 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/ItemEmotes.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/interact/entity/player/display/tab/ItemEmotes.kts @@ -4,20 +4,16 @@ import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.ui.close import world.gregs.voidps.engine.client.ui.closeDialogue import world.gregs.voidps.engine.client.ui.dialogue.continueDialogue +import world.gregs.voidps.engine.client.ui.event.interfaceClose +import world.gregs.voidps.engine.client.ui.menu import world.gregs.voidps.engine.client.ui.open -import world.gregs.voidps.engine.client.variable.hasClock -import world.gregs.voidps.engine.entity.character.clearAnimation -import world.gregs.voidps.engine.entity.character.forceChat +import world.gregs.voidps.engine.entity.character.* import world.gregs.voidps.engine.entity.character.player.playerOperate import world.gregs.voidps.engine.entity.character.player.skill.Skill -import world.gregs.voidps.engine.entity.character.setGraphic import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.queue.queue -import world.gregs.voidps.engine.suspend.awaitInterfaces -import world.gregs.voidps.engine.suspend.playAnimation import world.gregs.voidps.type.random -import world.gregs.voidps.world.interact.dialogue.continueDialogue import world.gregs.voidps.world.interact.entity.combat.weapon import world.gregs.voidps.world.interact.entity.player.equip.inventoryItem import world.gregs.voidps.world.interact.entity.player.equip.inventoryOptions @@ -27,25 +23,25 @@ import world.gregs.voidps.world.interact.entity.sound.playJingle import world.gregs.voidps.world.interact.entity.sound.playSound inventoryItem("Fly", "toy_kite") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } - player.playAnimation("emote_fly_kite") + player.animate("emote_fly_kite") } inventoryItem("Emote", "reindeer_hat", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.setGraphic("emote_reindeer") player.setGraphic("emote_reindeer_2") - player.playAnimation("emote_reindeer") + player.animate("emote_reindeer") } inventoryItem("Recite-prayer", "prayer_book", "inventory") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } @@ -66,151 +62,155 @@ inventoryItem("Recite-prayer", "prayer_book", "inventory") { } } } - player.playAnimation("emote_recite_prayer") + player.animate("emote_recite_prayer") } playerOperate("Whack") { if (player.weapon.id == "rubber_chicken") { player.playSound("rubber_chicken_whack") - player.playAnimation("rubber_chicken_whack") + player.animate("rubber_chicken_whack") } else { //todo player.playSound("") - player.playAnimation("easter_carrot_whack") + player.animate("easter_carrot_whack") } } inventoryItem("Dance", "rubber_chicken") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.playJingle("easter_scape_scrambled") - player.playAnimation("emote_chicken_dance") + player.animate("emote_chicken_dance") } inventoryItem("Spin", "spinning_plate", "inventory") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } val drop = random.nextBoolean() - player.playAnimation("emote_spinning_plate") - player.playAnimation("emote_spinning_plate_${if (drop) "drop" else "take"}") - player.playAnimation("emote_${if (drop) "cry" else "cheer"}") + player.animate("emote_spinning_plate") + player.animate("emote_spinning_plate_${if (drop) "drop" else "take"}") + player.animate("emote_${if (drop) "cry" else "cheer"}") } continueDialogue("snow_globe", "continue") { player -> player.close("snow_globe") - player.continueDialogue() +} + +interfaceClose("snow_globe") { player -> + player.queue("snow_globe_close") { + player.setGraphic("emote_snow_globe_flurry") + val ticks = player.setAnimation("emote_trample_snow") + pause(ticks) + player.message("The snow globe fills your inventory with snow!") + player.inventory.add("snowball_2007_christmas_event", player.inventory.spaces) + player.clearAnimation() + player.closeDialogue() + } } inventoryItem("Shake", "snow_globe", "inventory") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay") || player.menu != null) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.queue("snow_globe") { player.message("You shake the snow globe.") - player.playAnimation("emote_shake_snow_globe") + player.animate("emote_shake_snow_globe") player.playJingle("harmony_snow_globe") player.open("snow_globe") - awaitInterfaces() - player.setGraphic("emote_snow_globe_flurry") - player.playAnimation("emote_trample_snow") - player.message("The snow globe fills your inventory with snow!") - player.inventory.add("snowball_2007_christmas_event", player.inventory.spaces) - player.clearAnimation() - player.closeDialogue() } } inventoryOptions("Play", "Loop", "Walk", "Crazy", item = "yo_yo", inventory = "inventory") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryOptions } - player.playAnimation("emote_yoyo_${option.lowercase()}") + player.animate("emote_yoyo_${option.lowercase()}") } inventoryItem("Spin", "candy_cane", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } - player.playAnimation("emote_candy_cane_spin") + player.animate("emote_candy_cane_spin") } inventoryItem("Dance", "salty_claws_hat", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } - player.playAnimation("emote_salty_claws_hat_dance") + player.animate("emote_salty_claws_hat_dance") } inventoryItem("Celebrate", "tenth_anniversary_cake") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.setGraphic("10th_anniversary_cake") - player.playAnimation("emote_10th_anniversary_cake") + player.animate("emote_10th_anniversary_cake") } inventoryItem("Brandish (2009)", "golden_hammer", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } - player.playAnimation("emote_golden_hammer_brandish") + player.animate("emote_golden_hammer_brandish") } inventoryItem("Spin (2010)", "golden_hammer", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.setGraphic("emote_golden_hammer_spin") - player.playAnimation("emote_golden_hammer_spin") + player.animate("emote_golden_hammer_spin") } inventoryOptions("Jump", "Walk", "Bow", "Dance", item = "*_marionette", inventory = "inventory") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryOptions } player.setGraphic("emote_${item.id}_${option.lowercase()}") - player.playAnimation("emote_marionette_${option.lowercase()}") + player.animate("emote_marionette_${option.lowercase()}") } inventoryItem("Sleuth", "magnifying_glass", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } - player.playAnimation("emote_magnifying_glass_sleuth") + player.animate("emote_magnifying_glass_sleuth") } inventoryItem("Emote", "chocatrice_cape", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.setGraphic("emote_chocatrice_cape") - player.playAnimation("emote_chocatrice_cape") + player.animate("emote_chocatrice_cape") } inventoryItem("Juggle", "squirrel_ears", "worn_equipment") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } player.setGraphic("emote_squirrel_ears") - player.playAnimation("emote_squirrel_ears") + player.animate("emote_squirrel_ears") } inventoryItem("Play-with", "toy_horsey_*") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryItem } @@ -220,16 +220,16 @@ inventoryItem("Play-with", "toy_horsey_*") { else -> "Neaahhhyyy! Giddy-up horsey!" } // player.forceChat = "Just say neigh to gambling!" - player.playAnimation("emote_${item.id}") + player.animate("emote_${item.id}") } inventoryOptions("Play-with", item = "eek") { - if (player.hasClock("emote_delay")) { + if (player.contains("delay")) { player.message("Please wait till you've finished performing your current emote.") return@inventoryOptions } player.setGraphic("play_with_eek") - player.playAnimation("play_with_eek") + player.animate("play_with_eek") } inventoryItem("Summon Minion", "squirrel_ears", "worn_equipment") { diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/barbarian_outpost/BarbarianOutpostGate.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/barbarian_outpost/BarbarianOutpostGate.kts index 905abc252..70a0a4e7e 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/barbarian_outpost/BarbarianOutpostGate.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/barbarian_outpost/BarbarianOutpostGate.kts @@ -19,9 +19,6 @@ objectOperate("Open", "barbarian_outpost_gate_left_closed", "barbarian_outpost_g player.mode = Interact(player, guard, NPCOption(player, guard, guard.def, "Talk-to")) return@objectOperate } - if (player.tile.y !in 2569..3570) { - player.walkTo(player.tile.copy(y = player.tile.y.coerceIn(2569, 3570))) - delay() - } + player.walkTo(player.tile.copy(y = player.tile.y.coerceIn(2569, 3570))) enterDoor(target, delay = 2) } \ No newline at end of file diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/falador/MakeoverMage.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/falador/MakeoverMage.kts index f3d3f704a..636d4921f 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/falador/MakeoverMage.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/falador/MakeoverMage.kts @@ -7,7 +7,6 @@ import world.gregs.voidps.engine.client.ui.event.interfaceOpen import world.gregs.voidps.engine.client.ui.interfaceOption import world.gregs.voidps.engine.data.definition.EnumDefinitions import world.gregs.voidps.engine.entity.character.forceChat -import world.gregs.voidps.engine.entity.character.mode.interact.Interaction import world.gregs.voidps.engine.entity.character.npc.NPCOption import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.npc.npcOperate @@ -25,7 +24,6 @@ import world.gregs.voidps.engine.inv.transact.TransactionError import world.gregs.voidps.engine.inv.transact.operation.AddItem.add import world.gregs.voidps.engine.inv.transact.operation.RemoveItem.remove import world.gregs.voidps.engine.queue.softQueue -import world.gregs.voidps.engine.suspend.SuspendableContext import world.gregs.voidps.engine.timer.npcTimerStart import world.gregs.voidps.engine.timer.npcTimerTick import world.gregs.voidps.engine.timer.toTicks diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeChurch.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeChurch.kts index 23aaf2d22..e44a02e3d 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeChurch.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeChurch.kts @@ -5,6 +5,7 @@ import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.moveCamera import world.gregs.voidps.engine.client.turnCamera import world.gregs.voidps.engine.client.ui.interact.itemOnObjectOperate +import world.gregs.voidps.engine.entity.character.animate import world.gregs.voidps.engine.event.Context import world.gregs.voidps.engine.entity.character.face import world.gregs.voidps.engine.entity.character.forceChat @@ -24,7 +25,6 @@ import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.engine.queue.LogoutBehaviour import world.gregs.voidps.engine.queue.queue import world.gregs.voidps.engine.queue.softQueue -import world.gregs.voidps.engine.suspend.playAnimation import world.gregs.voidps.engine.timer.toTicks import world.gregs.voidps.type.Direction import world.gregs.voidps.type.Region @@ -55,7 +55,7 @@ objectOperate("Ring", "lumbridge_church_bell") { objectOperate("Close", "restless_ghost_coffin_headless", "restless_ghost_coffin") { target.replace("restless_ghost_coffin_closed") - player.playAnimation("close_chest") + player.animate("close_chest") player.message("You close the coffin.") player.playSound("coffin_close") } @@ -103,7 +103,7 @@ suspend fun Interaction.returnSkull() { restlessGhost.forceChat = "Release! Thank you" delay(4) restlessGhost.forceChat = "stranger." - restlessGhost.playAnimation("restless_ghost_ascends") + restlessGhost.animate("restless_ghost_ascends") restlessGhost.shoot("restless_ghost", Tile(3243, 3193).add(offset), height = 20, endHeight = 0, flightTime = 50) delay(2) player.moveCamera(Tile(3241, 3193).add(offset), 900) @@ -141,7 +141,7 @@ itemOnObjectOperate("muddy_skull", "restless_ghost_coffin_closed") { objectOperate("Open", "restless_ghost_coffin_closed") { player.message("You open the coffin.") - player.playAnimation("open_chest") + player.animate("open_chest") player.playSound("coffin_open") target.replace("coffin_restless_ghost_2", ticks = TimeUnit.MINUTES.toTicks(3)) if (!player.questComplete("the_restless_ghost")) { @@ -151,7 +151,7 @@ objectOperate("Open", "restless_ghost_coffin_closed") { objectOperate("Search", "restless_ghost_coffin_closed") { player.message("You open the coffin.") - player.playAnimation("open_chest") + player.animate("open_chest") player.playSound("coffin_open") target.replace("coffin_restless_ghost_2", ticks = TimeUnit.MINUTES.toTicks(3)) if (!player.questComplete("the_restless_ghost")) { @@ -169,7 +169,7 @@ suspend fun Interaction.spawnGhost() { player.playSound("bigghost_appear") delay(1) val ghost = npcs.add("restless_ghost", ghostSpawn, Direction.SOUTH) ?: return - ghost.playAnimation("restless_ghost_awakens") + ghost.animate("restless_ghost_awakens") ghost.softQueue("despawn", TimeUnit.SECONDS.toTicks(60)) { npcs.removeIndex(ghost) } diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeFlag.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeFlag.kts index 0647a6e2e..648f4e154 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeFlag.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/lumbridge/LumbridgeFlag.kts @@ -1,14 +1,14 @@ package world.gregs.voidps.world.map.lumbridge +import world.gregs.voidps.engine.entity.character.animate import world.gregs.voidps.engine.entity.character.forceChat import world.gregs.voidps.engine.entity.obj.objectOperate -import world.gregs.voidps.engine.suspend.playAnimation objectOperate("Raise", "lumbridge_flag") { target.animate("lumbridge_flag") - player.playAnimation("lumbridge_flag_raise") - player.playAnimation("lumbridge_flag_stop_raise") + player.animate("lumbridge_flag_raise") + player.animate("lumbridge_flag_stop_raise") player.forceChat = "All Hail the Duke!" - player.playAnimation("emote_salute") + player.animate("emote_salute") player["raise_the_roof_task"] = true } diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/tree_gnome_stronghold/TreeGnomeStronghold.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/tree_gnome_stronghold/TreeGnomeStronghold.kts index a18bef3e3..b575fd644 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/tree_gnome_stronghold/TreeGnomeStronghold.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/tree_gnome_stronghold/TreeGnomeStronghold.kts @@ -1,6 +1,7 @@ package world.gregs.voidps.world.map.tree_gnome_stronghold import world.gregs.voidps.engine.entity.character.face +import world.gregs.voidps.engine.entity.character.move.walkOver import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.obj.objectOperate import world.gregs.voidps.engine.entity.obj.replace @@ -11,7 +12,6 @@ objectOperate("Open", "tree_gnome_door_east_closed", "tree_gnome_door_west_close delay() player.face(target) } - player.walkTo(player.tile.addY(if (player.tile.y < target.tile.y) 2 else -2), noCollision = true, noRun = true) - delay() + player.walkOver(player.tile.addY(if (player.tile.y < target.tile.y) 2 else -2)) target.replace(target.id.replace("_closed", "_opened"), ticks = 4) } \ No newline at end of file diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/GypsyAris.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/GypsyAris.kts index e6d4d4c49..016e12060 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/GypsyAris.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/GypsyAris.kts @@ -10,8 +10,8 @@ import world.gregs.voidps.engine.event.Context import world.gregs.voidps.engine.entity.character.face import world.gregs.voidps.engine.entity.character.mode.Face import world.gregs.voidps.engine.entity.character.move.running +import world.gregs.voidps.engine.entity.character.move.stepOver import world.gregs.voidps.engine.entity.character.move.tele -import world.gregs.voidps.engine.entity.character.move.walkTo import world.gregs.voidps.engine.entity.character.npc.NPCOption import world.gregs.voidps.engine.entity.character.npc.npcOperate import world.gregs.voidps.engine.entity.character.player.Player @@ -242,9 +242,8 @@ suspend fun SuspendableContext.cutscene() { player.tele(Tile(3225, 3363).add(offset), clearInterfaces = false) delay(2) - player.walkTo(Tile(3227, 3367).add(offset), noCollision = true) player.running = true - delay(3) + player.stepOver(Tile(3227, 3367).add(offset)) player.face(Direction.NORTH) player.setAnimation("wally_demon_slay") player.playSound("demon_slayer_wally_sword", delay = 10) diff --git a/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/abyss/AbyssObstacles.kts b/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/abyss/AbyssObstacles.kts index dc893765c..7715ee836 100644 --- a/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/abyss/AbyssObstacles.kts +++ b/game/src/main/kotlin/world/gregs/voidps/world/map/varrock/abyss/AbyssObstacles.kts @@ -65,7 +65,6 @@ objectOperate("Mine", "abyss_rock") { player["abyss_obstacles"] = 13 val (walkTile, teleTile) = positions[target.tile]!! player.walkTo(walkTile) - delay(2) player.message("...and manage to break through the rock.", ChatType.Filter) player.clearAnimation() player.tele(teleTile) @@ -103,7 +102,6 @@ objectOperate("Chop", "abyss_tendrils") { player["abyss_obstacles"] = 15 val (walkTile, teleTile) = positions[target.tile]!! player.walkTo(walkTile) - delay(2) player.message("...and manage to cut a way through the tendrils.", ChatType.Filter) delay(1) player.tele(teleTile) @@ -136,10 +134,9 @@ objectOperate("Burn-down", "abyss_boil") { delay(6) player["abyss_obstacles"] = 17 val (walkTile, teleTile) = positions[target.tile]!! - player.walkTo(walkTile) areaGraphic("fire_wave_hit", target.tile, height = 128) player.playSound("boil_burst") - delay(2) + player.walkTo(walkTile) player.message("...and manage to burn it down and get past.", ChatType.Filter) delay() player.tele(teleTile) @@ -170,7 +167,6 @@ objectOperate("Distract", "abyss_eyes") { player["abyss_obstacles"] = 19 val (walkTile, teleTile) = positions[target.tile]!! player.walkTo(walkTile) - delay(2) player.message("...and sneak past while they're not looking.", ChatType.Filter) delay(1) player.tele(teleTile) diff --git a/game/src/test/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourseTest.kt b/game/src/test/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourseTest.kt index ce90d3718..f62b0ce21 100644 --- a/game/src/test/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourseTest.kt +++ b/game/src/test/kotlin/world/gregs/voidps/world/activity/skill/agility/course/WildernessCourseTest.kt @@ -17,7 +17,7 @@ internal class WildernessCourseTest : WorldTest() { val door = objects[Tile(2998, 3917), "wilderness_agility_door_closed"]!! player.objectOption(door, "Open") - tick(16) + tick(17) assertEquals(Tile(2998, 3931), player.tile) assertEquals(15.0, player.experience.get(Skill.Agility))