Configurable block fall damage modifiers

This commit is contained in:
MelnCat
2025-01-12 16:38:27 -08:00
committed by granny
parent 81194a0cce
commit f8501a9d9d
5 changed files with 85 additions and 110 deletions

View File

@@ -1,110 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MelnCat <melncatuwu@gmail.com>
Date: Sat, 1 Oct 2022 18:06:52 -0700
Subject: [PATCH] Configurable block fall damage modifiers
diff --git a/net/minecraft/world/level/block/BedBlock.java b/net/minecraft/world/level/block/BedBlock.java
index db79ef24ea01db5f619ab29700d3d391438fb742..54836f2a1e4cc9046ba29fb71ea237b358c9cb7d 100644
--- a/net/minecraft/world/level/block/BedBlock.java
+++ b/net/minecraft/world/level/block/BedBlock.java
@@ -183,7 +183,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
@Override
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
- super.fallOn(world, state, pos, entity, fallDistance * 0.5F);
+ super.fallOn(world, state, pos, entity, fallDistance); // Purpur
}
@Override
diff --git a/net/minecraft/world/level/block/Block.java b/net/minecraft/world/level/block/Block.java
index 7531381e2e4d87ceeaa6478e13b23f6c072bef07..f00526753a83f95689fad2a132bef79f4479eec6 100644
--- a/net/minecraft/world/level/block/Block.java
+++ b/net/minecraft/world/level/block/Block.java
@@ -88,6 +88,10 @@ public class Block extends BlockBehaviour implements ItemLike {
public static final int UPDATE_LIMIT = 512;
protected final StateDefinition<Block, BlockState> stateDefinition;
private BlockState defaultBlockState;
+ // Purpur start
+ public float fallDamageMultiplier = 1.0F;
+ public float fallDistanceMultiplier = 1.0F;
+ // Purpur end
// Paper start - Protect Bedrock and End Portal/Frames from being destroyed
public final boolean isDestroyable() {
return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits ||
@@ -473,7 +477,7 @@ public class Block extends BlockBehaviour implements ItemLike {
}
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
- entity.causeFallDamage(fallDistance, 1.0F, entity.damageSources().fall());
+ entity.causeFallDamage(fallDistance * fallDistanceMultiplier, fallDamageMultiplier, entity.damageSources().fall()); // Purpur
}
public void updateEntityMovementAfterFallOn(BlockGetter world, Entity entity) {
diff --git a/net/minecraft/world/level/block/HayBlock.java b/net/minecraft/world/level/block/HayBlock.java
index ef364aa171a48482a45bc18cfe730ec20c3f7be6..74971d90506aa253d5ee821b5390fb2551a3a393 100644
--- a/net/minecraft/world/level/block/HayBlock.java
+++ b/net/minecraft/world/level/block/HayBlock.java
@@ -23,6 +23,6 @@ public class HayBlock extends RotatedPillarBlock {
@Override
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
- entity.causeFallDamage(fallDistance, 0.2F, world.damageSources().fall());
+ super.fallOn(world, state, pos, entity, fallDistance); // Purpur
}
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
index 87ae04dff2645ba058325077cae4bcb20c7eab40..d32eaca6dbb258187086d11038f8c78c00b1778d 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
@@ -513,4 +513,50 @@ public class PurpurConfig {
block.explosionResistance = blastResistance.floatValue();
});
}
+ private static void blockFallMultiplierSettings() {
+ getMap("settings.block-fall-multipliers", Map.ofEntries(
+ Map.entry("minecraft:hay_block", Map.of("damage", 0.2F)),
+ Map.entry("minecraft:white_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:light_gray_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:gray_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:black_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:brown_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:pink_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:red_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:orange_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:yellow_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:green_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:lime_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:cyan_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:light_blue_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:blue_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:purple_bed", Map.of("distance", 0.5F)),
+ Map.entry("minecraft:magenta_bed", Map.of("distance", 0.5F))
+ )).forEach((blockId, value) -> {
+ Block block = BuiltInRegistries.BLOCK.getValue(ResourceLocation.parse(blockId));
+ if (block == Blocks.AIR) {
+ log(Level.SEVERE, "Invalid block for `settings.block-fall-multipliers`: " + blockId);
+ return;
+ }
+ if (!(value instanceof Map<?, ?> map)) {
+ log(Level.SEVERE, "Invalid fall multiplier for `settings.block-fall-multipliers." + blockId + "`: " + value
+ + ", expected a map with keys `damage` and `distance` to floats.");
+ return;
+ }
+ Object rawFallDamageMultiplier = map.get("damage");
+ if (rawFallDamageMultiplier == null) rawFallDamageMultiplier = 1F;
+ if (!(rawFallDamageMultiplier instanceof Number fallDamageMultiplier)) {
+ log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".damage`: " + map.get("damage"));
+ return;
+ }
+ Object rawFallDistanceMultiplier = map.get("distance");
+ if (rawFallDistanceMultiplier == null) rawFallDistanceMultiplier = 1F;
+ if (!(rawFallDistanceMultiplier instanceof Number fallDistanceMultiplier)) {
+ log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".distance`: " + map.get("distance"));
+ return;
+ }
+ block.fallDamageMultiplier = fallDamageMultiplier.floatValue();
+ block.fallDistanceMultiplier = fallDistanceMultiplier.floatValue();
+ });
+ }
}

View File

@@ -18,3 +18,12 @@
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
} }
@@ -175,7 +_,7 @@
@Override
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
- super.fallOn(level, state, pos, entity, fallDistance * 0.5F);
+ super.fallOn(level, state, pos, entity, fallDistance); // Purpur - Configurable block fall damage modifiers
}
@Override

View File

@@ -1,5 +1,16 @@
--- a/net/minecraft/world/level/block/Block.java --- a/net/minecraft/world/level/block/Block.java
+++ b/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java
@@ -90,6 +_,10 @@
public static final int UPDATE_LIMIT = 512;
protected final StateDefinition<Block, BlockState> stateDefinition;
private BlockState defaultBlockState;
+ // Purpur start - Configurable block fall damage modifiers
+ public float fallDamageMultiplier = 1.0F;
+ public float fallDistanceMultiplier = 1.0F;
+ // Purpur end - Configurable block fall damage modifiers
// Paper start - Protect Bedrock and End Portal/Frames from being destroyed
public final boolean isDestroyable() {
return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits ||
@@ -299,7 +_,7 @@ @@ -299,7 +_,7 @@
event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping
event.callEvent(); event.callEvent();
@@ -67,3 +78,12 @@
public boolean isPossibleToRespawnInThis(BlockState state) { public boolean isPossibleToRespawnInThis(BlockState state) {
return !state.isSolid() && !state.liquid(); return !state.isSolid() && !state.liquid();
@@ -423,7 +_,7 @@
}
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
- entity.causeFallDamage(fallDistance, 1.0F, entity.damageSources().fall());
+ entity.causeFallDamage(fallDistance * fallDistanceMultiplier, fallDamageMultiplier, entity.damageSources().fall()); // Purpur - Configurable block fall damage modifiers
}
public void updateEntityMovementAfterFallOn(BlockGetter level, Entity entity) {

View File

@@ -0,0 +1,10 @@
--- a/net/minecraft/world/level/block/HayBlock.java
+++ b/net/minecraft/world/level/block/HayBlock.java
@@ -23,6 +_,6 @@
@Override
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
- entity.causeFallDamage(fallDistance, 0.2F, level.damageSources().fall());
+ super.fallOn(level, state, pos, entity, fallDistance); // Purpur - Configurable block fall damage modifiers
}
}

View File

@@ -509,4 +509,50 @@ public class PurpurConfig {
block.explosionResistance = blastResistance.floatValue(); block.explosionResistance = blastResistance.floatValue();
}); });
} }
private static void blockFallMultiplierSettings() {
getMap("settings.block-fall-multipliers", Map.ofEntries(
Map.entry("minecraft:hay_block", Map.of("damage", 0.2F)),
Map.entry("minecraft:white_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:light_gray_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:gray_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:black_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:brown_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:pink_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:red_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:orange_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:yellow_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:green_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:lime_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:cyan_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:light_blue_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:blue_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:purple_bed", Map.of("distance", 0.5F)),
Map.entry("minecraft:magenta_bed", Map.of("distance", 0.5F))
)).forEach((blockId, value) -> {
Block block = BuiltInRegistries.BLOCK.getValue(ResourceLocation.parse(blockId));
if (block == Blocks.AIR) {
log(Level.SEVERE, "Invalid block for `settings.block-fall-multipliers`: " + blockId);
return;
}
if (!(value instanceof Map<?, ?> map)) {
log(Level.SEVERE, "Invalid fall multiplier for `settings.block-fall-multipliers." + blockId + "`: " + value
+ ", expected a map with keys `damage` and `distance` to floats.");
return;
}
Object rawFallDamageMultiplier = map.get("damage");
if (rawFallDamageMultiplier == null) rawFallDamageMultiplier = 1F;
if (!(rawFallDamageMultiplier instanceof Number fallDamageMultiplier)) {
log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".damage`: " + map.get("damage"));
return;
}
Object rawFallDistanceMultiplier = map.get("distance");
if (rawFallDistanceMultiplier == null) rawFallDistanceMultiplier = 1F;
if (!(rawFallDistanceMultiplier instanceof Number fallDistanceMultiplier)) {
log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".distance`: " + map.get("distance"));
return;
}
block.fallDamageMultiplier = fallDamageMultiplier.floatValue();
block.fallDistanceMultiplier = fallDistanceMultiplier.floatValue();
});
}
} }