From b11bbf0130198a39ce181e1b1586f19602470182 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 16 Feb 2024 14:29:47 +0900 Subject: [PATCH] fix: damaging terrain would not queue the modified chunk for the autosave --- src/net/torvald/terrarum/IngameInstance.kt | 1 + src/net/torvald/terrarum/gameactors/ActorWithBody.kt | 2 +- src/net/torvald/terrarum/gameworld/GameWorld.kt | 12 ++++++++++-- .../terrarum/modulebasegame/ExplosionManager.kt | 4 ++-- .../terrarum/modulebasegame/gameitems/AxeCore.kt | 9 ++++++--- .../modulebasegame/gameitems/PickaxeGeneric.kt | 3 ++- .../modulebasegame/gameitems/SledgehammerCore.kt | 3 ++- 7 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index a30f52945..b93290893 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -295,6 +295,7 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo open fun modified(layer: Int, x: Int, y: Int) { +// printdbg(this, "Chunk modified: layer $layer ($x, $y)") modifiedChunks[layer].add(LandUtil.toChunkNum(world, x, y)) } diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 4057b22bf..43390591c 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -588,7 +588,7 @@ open class ActorWithBody : Actor { // printdbg(this, it) val dmgPerTile = terrainDamage / it.size it.forEach { (x, y) -> - world?.inflictTerrainDamage(x, y, dmgPerTile) + world?.inflictTerrainDamage(x, y, dmgPerTile, false) } } } diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index fb0d10477..4ef57cf2b 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -644,7 +644,7 @@ open class GameWorld( /** * @return ItemID of the broken block AND ore if the block is broken, `null` otherwise */ - fun inflictTerrainDamage(x: Int, y: Int, damage: Double): Pair { + fun inflictTerrainDamage(x: Int, y: Int, damage: Double, bypassEvent: Boolean): Pair { if (damage.isNaN()) throw IllegalArgumentException("Cannot inflict NaN amount of damage at($x, $y)") val damage = damage.toFloat() @@ -662,6 +662,10 @@ open class GameWorld( terrainDamages[addr] = terrainDamages[addr]!! + damage } + if (!bypassEvent) { + Terrarum.ingame?.modified(LandUtil.LAYER_TERR, x, y) + } + //println("[GameWorld] accumulated damage: ${terrainDamages[addr]}") // remove tile from the world @@ -681,7 +685,7 @@ open class GameWorld( /** * @return true if block is broken */ - fun inflictWallDamage(x: Int, y: Int, damage: Double): ItemID? { + fun inflictWallDamage(x: Int, y: Int, damage: Double, bypassEvent: Boolean): ItemID? { if (damage.isNaN()) throw IllegalArgumentException("Cannot inflict NaN amount of damage at($x, $y)") val damage = damage.toFloat() @@ -697,6 +701,10 @@ open class GameWorld( wallDamages[addr] = wallDamages[addr]!! + damage } + if (!bypassEvent) { + Terrarum.ingame?.modified(LandUtil.LAYER_TERR, x, y) + } + // remove tile from the world if (wallDamages[addr]!! >= BlockCodex[getTileFromWall(x, y)].strength) { val tileBroke = getTileFromWall(x, y) diff --git a/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt b/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt index 4b7be02b0..f2a32d1fc 100644 --- a/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt +++ b/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt @@ -140,7 +140,7 @@ object ExplosionManager { private fun memcpyToWorldBreakage(CALC_WIDTH: Int, world: GameWorld, xStart: Int, yStart: Int, yOff: Int, out: UnsafeFloatArray) { for (x in xStart until xStart + CALC_WIDTH) { - world.inflictTerrainDamage(x, yStart + yOff, out[x - xStart, yOff].toDouble()) + world.inflictTerrainDamage(x, yStart + yOff, out[x - xStart, yOff].toDouble(), false) } } @@ -273,7 +273,7 @@ object ExplosionManager { for (wx in worldXstart until worldXstart + CALC_WIDTH) { val lx = wx - (tx - CALC_RADIUS - 1) val ly = wy - (ty - CALC_RADIUS - 1) - world.inflictTerrainDamage(wx, wy, mapBoomPow[lx, ly].blastToDmg().toDouble()).let { (tile, ore) -> + world.inflictTerrainDamage(wx, wy, mapBoomPow[lx, ly].blastToDmg().toDouble(), false).let { (tile, ore) -> if (ore != null || tile != null) { // drop item val prob = if (ore != null) dropProbOre else dropProbNonOre diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt index 2ebb82761..f3be4bf10 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt @@ -79,7 +79,8 @@ object AxeCore { INGAME.world.inflictTerrainDamage( x, y, - Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg + Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg, + false ).let { tileBroken -> // tile busted if (tileBroken != null) { @@ -100,7 +101,8 @@ object AxeCore { INGAME.world.inflictTerrainDamage( x, y, - Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg + Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg, + false ).let { (tileBroken, _) -> // tile busted if (tileBroken != null) { @@ -125,7 +127,8 @@ object AxeCore { INGAME.world.inflictTerrainDamage( x, y, - Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg + Calculate.hatchetPower(actor, item?.material) * swingDmgToFrameDmg, + false ).let { (tileBroken, _) -> // tile busted if (tileBroken != null) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index f68d7ca85..ced2933ab 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -93,7 +93,8 @@ object PickaxeCore { INGAME.world.inflictTerrainDamage( x, y, - Calculate.pickaxePower(actor, item?.material) * swingDmgToFrameDmg + Calculate.pickaxePower(actor, item?.material) * swingDmgToFrameDmg, + false ).let { (tileBroken, oreBroken) -> // drop ore diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt index 09a4bc684..8ce764e45 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt @@ -94,7 +94,8 @@ object SledgehammerCore { INGAME.world.inflictWallDamage( x, y, - Calculate.pickaxePower(actor, item?.material) * swingDmgToFrameDmg + Calculate.pickaxePower(actor, item?.material) * swingDmgToFrameDmg, + false ).let { tileBroken -> // tile busted if (tileBroken != null) {