From e5d6183b91b6ecdaf4c2e19cc19ea81951af9d4a Mon Sep 17 00:00:00 2001 From: CoolMagic233 <3078023566@qq.com> Date: Sun, 7 Sep 2025 08:23:23 +0800 Subject: [PATCH 1/5] fix: the issue of player damage in lava --- src/main/java/cn/nukkit/block/BlockLava.java | 12 +++++++++--- src/main/java/cn/nukkit/entity/Entity.java | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/nukkit/block/BlockLava.java b/src/main/java/cn/nukkit/block/BlockLava.java index 7c19922f1..c65a9426f 100644 --- a/src/main/java/cn/nukkit/block/BlockLava.java +++ b/src/main/java/cn/nukkit/block/BlockLava.java @@ -58,11 +58,17 @@ public void onEntityCollide(Entity entity) { // Making sure the entity is actually alive and not invulnerable. && entity.isAlive() && entity.noDamageTicks == 0) { - entity.setOnFire(ev.getDuration()); + if (!entity.isOnFire()){ + entity.setOnFire(ev.getDuration()); + } } - if (!entity.hasEffect(Effect.FIRE_RESISTANCE)) { - entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.LAVA, 4)); + entity.inLavaTicks ++; + if ((entity.inLavaTicks % 10) == 0){ + if (!entity.hasEffect(Effect.FIRE_RESISTANCE)) { + entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.LAVA, 4)); + } + entity.inLavaTicks = 0; } super.onEntityCollide(entity); diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java index c8fd5c62c..bb78082c3 100644 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ b/src/main/java/cn/nukkit/entity/Entity.java @@ -482,6 +482,7 @@ public abstract class Entity extends Location implements Metadatable { protected boolean noFallDamage; public float fallDistance = 0; public int lastUpdate; + public int inLavaTicks = 0; public int fireTicks = 0; public int inPortalTicks = 0; public int freezingTicks = 0;//0 - 140 From 4ec00a86681e0fbe62f8d972a03a96a4d25c3768 Mon Sep 17 00:00:00 2001 From: CoolMagic233 <3078023566@qq.com> Date: Sun, 7 Sep 2025 17:39:19 +0800 Subject: [PATCH 2/5] commit --- src/main/java/cn/nukkit/block/BlockLava.java | 12 +----------- src/main/java/cn/nukkit/entity/Entity.java | 14 +++++++++----- src/main/java/cn/nukkit/entity/EntityLiving.java | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/main/java/cn/nukkit/block/BlockLava.java b/src/main/java/cn/nukkit/block/BlockLava.java index c65a9426f..facd842ef 100644 --- a/src/main/java/cn/nukkit/block/BlockLava.java +++ b/src/main/java/cn/nukkit/block/BlockLava.java @@ -58,17 +58,7 @@ public void onEntityCollide(Entity entity) { // Making sure the entity is actually alive and not invulnerable. && entity.isAlive() && entity.noDamageTicks == 0) { - if (!entity.isOnFire()){ - entity.setOnFire(ev.getDuration()); - } - } - - entity.inLavaTicks ++; - if ((entity.inLavaTicks % 10) == 0){ - if (!entity.hasEffect(Effect.FIRE_RESISTANCE)) { - entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.LAVA, 4)); - } - entity.inLavaTicks = 0; + entity.setOnFire(ev.getDuration()); } super.onEntityCollide(entity); diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java index bb78082c3..145708a94 100644 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ b/src/main/java/cn/nukkit/entity/Entity.java @@ -2,10 +2,7 @@ import cn.nukkit.Player; import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockFire; -import cn.nukkit.block.BlockID; -import cn.nukkit.block.BlockWater; +import cn.nukkit.block.*; import cn.nukkit.blockentity.BlockEntityPistonArm; import cn.nukkit.entity.custom.CustomEntity; import cn.nukkit.entity.custom.EntityDefinition; @@ -1879,7 +1876,9 @@ public boolean entityBaseTick(int tickDiff) { } } else { if (!this.hasEffect(Effect.FIRE_RESISTANCE) && ((this.fireTicks % 20) == 0 || tickDiff > 20)) { - this.attack(new EntityDamageEvent(this, DamageCause.FIRE_TICK, 1)); + if (!isInsideOfLava()){ + this.attack(new EntityDamageEvent(this, DamageCause.FIRE_TICK, 1)); + } } this.fireTicks -= tickDiff; } @@ -2423,6 +2422,11 @@ public boolean isInsideOfWater() { return block.isWater() || block.getWaterloggingType() != Block.WaterloggingType.NO_WATERLOGGING && block.getLevelBlockAtLayer(1).isWater(); } + public boolean isInsideOfLava() { + Block block = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); + return block instanceof BlockLava || block.getLevelBlockAtLayer(1) instanceof BlockLava; + } + public boolean isInsideOfSolid() { double y = this.y + this.getEyeHeight(); Block block = this.level.getBlock( diff --git a/src/main/java/cn/nukkit/entity/EntityLiving.java b/src/main/java/cn/nukkit/entity/EntityLiving.java index 2cfc96ce1..51b5806b8 100644 --- a/src/main/java/cn/nukkit/entity/EntityLiving.java +++ b/src/main/java/cn/nukkit/entity/EntityLiving.java @@ -4,6 +4,7 @@ import cn.nukkit.Server; import cn.nukkit.block.Block; import cn.nukkit.block.BlockCactus; +import cn.nukkit.block.BlockLava; import cn.nukkit.block.BlockMagma; import cn.nukkit.entity.mob.EntityDrowned; import cn.nukkit.entity.mob.EntityWolf; @@ -321,6 +322,20 @@ public boolean entityBaseTick(int tickDiff) { this.resetFallDistance(); } + if (this.isInsideOfLava()){ + this.inLavaTicks ++; + if ((this.inLavaTicks % 10) == 0){ + if (!this.hasEffect(Effect.FIRE_RESISTANCE)) { + Block lavaBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); + if (!(lavaBlock instanceof BlockLava)){ + lavaBlock = lavaBlock.getLevelBlockAtLayer(1); + } + this.attack(new EntityDamageByBlockEvent(lavaBlock, this, DamageCause.LAVA, 4)); + } + this.inLavaTicks = 0; + } + } + if (inWater && !this.hasEffect(Effect.WATER_BREATHING)) { if (this instanceof EntitySwimming || this.isDrowned || (this instanceof Player && (((Player) this).isCreative() || ((Player) this).isSpectator()))) { this.setAirTicks(400); From e4ea76fecb24dacb8f33bc88db57031039dffc84 Mon Sep 17 00:00:00 2001 From: CoolMagic233 <3078023566@qq.com> Date: Sun, 7 Sep 2025 18:59:33 +0800 Subject: [PATCH 3/5] commit --- src/main/java/cn/nukkit/block/BlockFire.java | 4 --- src/main/java/cn/nukkit/entity/Entity.java | 5 +-- .../java/cn/nukkit/entity/EntityLiving.java | 32 +++++++++++++------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main/java/cn/nukkit/block/BlockFire.java b/src/main/java/cn/nukkit/block/BlockFire.java index a3a1fd52d..8be545ab2 100644 --- a/src/main/java/cn/nukkit/block/BlockFire.java +++ b/src/main/java/cn/nukkit/block/BlockFire.java @@ -80,10 +80,6 @@ public void onEntityCollide(Entity entity) { return; } - if (!entity.hasEffect(Effect.FIRE_RESISTANCE) && this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE)) { - entity.attack(new EntityDamageByBlockEvent(this, entity, DamageCause.FIRE, 1)); - } - EntityCombustByBlockEvent ev = new EntityCombustByBlockEvent(this, entity, 8); if (entity instanceof EntityArrow) { ev.setCancelled(); diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java index 145708a94..938111c7e 100644 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ b/src/main/java/cn/nukkit/entity/Entity.java @@ -480,6 +480,7 @@ public abstract class Entity extends Location implements Metadatable { public float fallDistance = 0; public int lastUpdate; public int inLavaTicks = 0; + public int inFireTicks = 0; public int fireTicks = 0; public int inPortalTicks = 0; public int freezingTicks = 0;//0 - 140 @@ -1875,8 +1876,8 @@ public boolean entityBaseTick(int tickDiff) { this.fireTicks = 0; } } else { - if (!this.hasEffect(Effect.FIRE_RESISTANCE) && ((this.fireTicks % 20) == 0 || tickDiff > 20)) { - if (!isInsideOfLava()){ + if (!this.hasEffect(Effect.FIRE_RESISTANCE) && ((this.fireTicks % 20) == 0 || tickDiff > 20) && this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE)) { + if (!isInsideOfLava() && !isInsideOfFire()){ this.attack(new EntityDamageEvent(this, DamageCause.FIRE_TICK, 1)); } } diff --git a/src/main/java/cn/nukkit/entity/EntityLiving.java b/src/main/java/cn/nukkit/entity/EntityLiving.java index 51b5806b8..6e39c9d76 100644 --- a/src/main/java/cn/nukkit/entity/EntityLiving.java +++ b/src/main/java/cn/nukkit/entity/EntityLiving.java @@ -322,20 +322,34 @@ public boolean entityBaseTick(int tickDiff) { this.resetFallDistance(); } - if (this.isInsideOfLava()){ - this.inLavaTicks ++; - if ((this.inLavaTicks % 10) == 0){ - if (!this.hasEffect(Effect.FIRE_RESISTANCE)) { - Block lavaBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - if (!(lavaBlock instanceof BlockLava)){ - lavaBlock = lavaBlock.getLevelBlockAtLayer(1); + if (this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE)){ + if (this.isInsideOfLava()){ + this.inLavaTicks ++; + if ((this.inLavaTicks % 10) == 0){ + if (!this.hasEffect(Effect.FIRE_RESISTANCE)) { + Block lavaBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); + if (!(lavaBlock instanceof BlockLava)){ + lavaBlock = lavaBlock.getLevelBlockAtLayer(1); + } + this.attack(new EntityDamageByBlockEvent(lavaBlock, this, DamageCause.LAVA, 4)); + } + this.inLavaTicks = 0; + } + } + + if (this.isInsideOfFire()){ + this.inFireTicks ++; + if ((this.inFireTicks % 10) == 0) { + if (!this.hasEffect(Effect.FIRE_RESISTANCE)) { + Block fireBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); + this.attack(new EntityDamageByBlockEvent(fireBlock, this, DamageCause.FIRE, 1)); } - this.attack(new EntityDamageByBlockEvent(lavaBlock, this, DamageCause.LAVA, 4)); + this.inFireTicks = 0; } - this.inLavaTicks = 0; } } + if (inWater && !this.hasEffect(Effect.WATER_BREATHING)) { if (this instanceof EntitySwimming || this.isDrowned || (this instanceof Player && (((Player) this).isCreative() || ((Player) this).isSpectator()))) { this.setAirTicks(400); From 44e80a487ecaaa10ba82ce2f092de67d2d4c13d9 Mon Sep 17 00:00:00 2001 From: CoolMagic233 <3078023566@qq.com> Date: Mon, 8 Sep 2025 08:57:58 +0800 Subject: [PATCH 4/5] Add soul fire processing --- src/main/java/cn/nukkit/Player.java | 2 +- .../java/cn/nukkit/block/BlockSoulFire.java | 5 ++++ .../java/cn/nukkit/entity/EntityLiving.java | 25 ++++++++----------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/cn/nukkit/Player.java b/src/main/java/cn/nukkit/Player.java index dd0a01e49..f7a64c1b3 100644 --- a/src/main/java/cn/nukkit/Player.java +++ b/src/main/java/cn/nukkit/Player.java @@ -5045,7 +5045,7 @@ private void onBlockBreakStart(Vector3 pos, BlockFace face) { } Block block = target.getSide(face); - if (block.getId() == Block.FIRE) { + if (block.getId() == Block.FIRE || block.getId() == Block.SOUL_FIRE) { this.level.setBlock(block, Block.get(BlockID.AIR), true); this.level.addLevelSoundEvent(block, LevelSoundEventPacket.SOUND_EXTINGUISH_FIRE); return; diff --git a/src/main/java/cn/nukkit/block/BlockSoulFire.java b/src/main/java/cn/nukkit/block/BlockSoulFire.java index bf70df73c..1969c827c 100644 --- a/src/main/java/cn/nukkit/block/BlockSoulFire.java +++ b/src/main/java/cn/nukkit/block/BlockSoulFire.java @@ -23,6 +23,11 @@ public String getName() { return "Soul Fire"; } + @Override + public int getLightLevel() { + return 10; + } + @Override public int onUpdate(int type) { if (type == Level.BLOCK_UPDATE_NORMAL) { diff --git a/src/main/java/cn/nukkit/entity/EntityLiving.java b/src/main/java/cn/nukkit/entity/EntityLiving.java index 6e39c9d76..cf3021c93 100644 --- a/src/main/java/cn/nukkit/entity/EntityLiving.java +++ b/src/main/java/cn/nukkit/entity/EntityLiving.java @@ -2,10 +2,7 @@ import cn.nukkit.Player; import cn.nukkit.Server; -import cn.nukkit.block.Block; -import cn.nukkit.block.BlockCactus; -import cn.nukkit.block.BlockLava; -import cn.nukkit.block.BlockMagma; +import cn.nukkit.block.*; import cn.nukkit.entity.mob.EntityDrowned; import cn.nukkit.entity.mob.EntityWolf; import cn.nukkit.entity.projectile.EntityProjectile; @@ -322,17 +319,15 @@ public boolean entityBaseTick(int tickDiff) { this.resetFallDistance(); } - if (this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE)){ + if (this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE) && !this.hasEffect(Effect.FIRE_RESISTANCE)){ if (this.isInsideOfLava()){ this.inLavaTicks ++; if ((this.inLavaTicks % 10) == 0){ - if (!this.hasEffect(Effect.FIRE_RESISTANCE)) { - Block lavaBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - if (!(lavaBlock instanceof BlockLava)){ - lavaBlock = lavaBlock.getLevelBlockAtLayer(1); - } - this.attack(new EntityDamageByBlockEvent(lavaBlock, this, DamageCause.LAVA, 4)); + Block lavaBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); + if (!(lavaBlock instanceof BlockLava)){ + lavaBlock = lavaBlock.getLevelBlockAtLayer(1); } + this.attack(new EntityDamageByBlockEvent(lavaBlock, this, DamageCause.LAVA, 4)); this.inLavaTicks = 0; } } @@ -340,10 +335,12 @@ public boolean entityBaseTick(int tickDiff) { if (this.isInsideOfFire()){ this.inFireTicks ++; if ((this.inFireTicks % 10) == 0) { - if (!this.hasEffect(Effect.FIRE_RESISTANCE)) { - Block fireBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - this.attack(new EntityDamageByBlockEvent(fireBlock, this, DamageCause.FIRE, 1)); + Block fireBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); + int fireDamage = 1; + if (fireBlock instanceof BlockSoulFire){ + fireDamage = 2; } + this.attack(new EntityDamageByBlockEvent(fireBlock, this, DamageCause.FIRE, fireDamage)); this.inFireTicks = 0; } } From cd6a62f6b7b7806ed5b3b7ef93dac7ea58b2c9f2 Mon Sep 17 00:00:00 2001 From: CoolMagic233 <3078023566@qq.com> Date: Sat, 20 Sep 2025 09:51:41 +0800 Subject: [PATCH 5/5] format code --- src/main/java/cn/nukkit/entity/Entity.java | 9 +++++++-- src/main/java/cn/nukkit/entity/EntityLiving.java | 16 ++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java index 938111c7e..9309c2cd2 100644 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ b/src/main/java/cn/nukkit/entity/Entity.java @@ -2424,8 +2424,13 @@ public boolean isInsideOfWater() { } public boolean isInsideOfLava() { - Block block = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - return block instanceof BlockLava || block.getLevelBlockAtLayer(1) instanceof BlockLava; + for (Block block : this.getCollisionBlocks()) { + if (block instanceof BlockLava) { + return true; + } + } + + return false; } public boolean isInsideOfSolid() { diff --git a/src/main/java/cn/nukkit/entity/EntityLiving.java b/src/main/java/cn/nukkit/entity/EntityLiving.java index cf3021c93..b60fb1e24 100644 --- a/src/main/java/cn/nukkit/entity/EntityLiving.java +++ b/src/main/java/cn/nukkit/entity/EntityLiving.java @@ -319,12 +319,12 @@ public boolean entityBaseTick(int tickDiff) { this.resetFallDistance(); } - if (this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE) && !this.hasEffect(Effect.FIRE_RESISTANCE)){ - if (this.isInsideOfLava()){ - this.inLavaTicks ++; - if ((this.inLavaTicks % 10) == 0){ + if (this.level.getGameRules().getBoolean(GameRule.FIRE_DAMAGE) && !this.hasEffect(Effect.FIRE_RESISTANCE)) { + if (this.isInsideOfLava()) { + this.inLavaTicks++; + if ((this.inLavaTicks % 10) == 0) { Block lavaBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); - if (!(lavaBlock instanceof BlockLava)){ + if (!(lavaBlock instanceof BlockLava)) { lavaBlock = lavaBlock.getLevelBlockAtLayer(1); } this.attack(new EntityDamageByBlockEvent(lavaBlock, this, DamageCause.LAVA, 4)); @@ -332,12 +332,12 @@ public boolean entityBaseTick(int tickDiff) { } } - if (this.isInsideOfFire()){ - this.inFireTicks ++; + if (this.isInsideOfFire()) { + this.inFireTicks++; if ((this.inFireTicks % 10) == 0) { Block fireBlock = level.getBlock(this.getFloorX(), this.getFloorY(), this.getFloorZ()); int fireDamage = 1; - if (fireBlock instanceof BlockSoulFire){ + if (fireBlock instanceof BlockSoulFire) { fireDamage = 2; } this.attack(new EntityDamageByBlockEvent(fireBlock, this, DamageCause.FIRE, fireDamage));