|
| 1 | +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| 2 | +From: MelnCat <melncatuwu@gmail.com> |
| 3 | +Date: Sat, 1 Oct 2022 18:06:52 -0700 |
| 4 | +Subject: [PATCH] Configurable block fall damage modifiers |
| 5 | + |
| 6 | + |
| 7 | +diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java |
| 8 | +index e1d274a9be856f6fa5be00958c35b7d7c58357a7..1df761d866b10a3fb46d132c0377b58293b0cb07 100644 |
| 9 | +--- a/src/main/java/net/minecraft/world/level/block/BedBlock.java |
| 10 | ++++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java |
| 11 | +@@ -170,7 +170,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock |
| 12 | + |
| 13 | + @Override |
| 14 | + public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { |
| 15 | +- super.fallOn(world, state, pos, entity, fallDistance * 0.5F); |
| 16 | ++ super.fallOn(world, state, pos, entity, fallDistance); // Purpur |
| 17 | + } |
| 18 | + |
| 19 | + @Override |
| 20 | +diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java |
| 21 | +index ce4127f3701efa7d1c86bcdb4e7804fee11c397c..e94ca6283a0471a49b31942de763472ccb989dcb 100644 |
| 22 | +--- a/src/main/java/net/minecraft/world/level/block/Block.java |
| 23 | ++++ b/src/main/java/net/minecraft/world/level/block/Block.java |
| 24 | +@@ -98,6 +98,10 @@ public class Block extends BlockBehaviour implements ItemLike { |
| 25 | + public static final int UPDATE_LIMIT = 512; |
| 26 | + protected final StateDefinition<Block, BlockState> stateDefinition; |
| 27 | + private BlockState defaultBlockState; |
| 28 | ++ // Purpur start |
| 29 | ++ public float fallDamageMultiplier = 1.0F; |
| 30 | ++ public float fallDistanceMultiplier = 1.0F; |
| 31 | ++ // Purpur end |
| 32 | + // Paper start |
| 33 | + public final boolean isDestroyable() { |
| 34 | + return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || |
| 35 | +@@ -516,7 +520,7 @@ public class Block extends BlockBehaviour implements ItemLike { |
| 36 | + } |
| 37 | + |
| 38 | + public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { |
| 39 | +- entity.causeFallDamage(fallDistance, 1.0F, DamageSource.FALL); |
| 40 | ++ entity.causeFallDamage(fallDistance * fallDistanceMultiplier, fallDamageMultiplier, DamageSource.FALL); // Purpur |
| 41 | + } |
| 42 | + |
| 43 | + public void updateEntityAfterFallOn(BlockGetter world, Entity entity) { |
| 44 | +diff --git a/src/main/java/net/minecraft/world/level/block/HayBlock.java b/src/main/java/net/minecraft/world/level/block/HayBlock.java |
| 45 | +index c316fb1d3081c1fbf4602dd72e96e57491bc8efd..3b054f2bda6fae31e8ab7bce088e228f800b0d43 100644 |
| 46 | +--- a/src/main/java/net/minecraft/world/level/block/HayBlock.java |
| 47 | ++++ b/src/main/java/net/minecraft/world/level/block/HayBlock.java |
| 48 | +@@ -16,6 +16,6 @@ public class HayBlock extends RotatedPillarBlock { |
| 49 | + |
| 50 | + @Override |
| 51 | + public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { |
| 52 | +- entity.causeFallDamage(fallDistance, 0.2F, DamageSource.FALL); |
| 53 | ++ super.fallOn(world, state, pos, entity, fallDistance); // Purpur |
| 54 | + } |
| 55 | + } |
| 56 | +diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java |
| 57 | +index 14844cb8a402ac987f44a91b95d5ebdac73c6dfe..3cfbb4300e82cce409a7a0b53ef98987f166143c 100644 |
| 58 | +--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java |
| 59 | ++++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java |
| 60 | +@@ -588,4 +588,50 @@ public class PurpurConfig { |
| 61 | + block.explosionResistance = blastResistance.floatValue(); |
| 62 | + }); |
| 63 | + } |
| 64 | ++ private static void blockFallMultiplierSettings() { |
| 65 | ++ getMap("settings.block-fall-multipliers", Map.ofEntries( |
| 66 | ++ Map.entry("minecraft:hay_block", Map.of("damage", 0.2F)), |
| 67 | ++ Map.entry("minecraft:white_bed", Map.of("distance", 0.5F)), |
| 68 | ++ Map.entry("minecraft:light_gray_bed", Map.of("distance", 0.5F)), |
| 69 | ++ Map.entry("minecraft:gray_bed", Map.of("distance", 0.5F)), |
| 70 | ++ Map.entry("minecraft:black_bed", Map.of("distance", 0.5F)), |
| 71 | ++ Map.entry("minecraft:brown_bed", Map.of("distance", 0.5F)), |
| 72 | ++ Map.entry("minecraft:pink_bed", Map.of("distance", 0.5F)), |
| 73 | ++ Map.entry("minecraft:red_bed", Map.of("distance", 0.5F)), |
| 74 | ++ Map.entry("minecraft:orange_bed", Map.of("distance", 0.5F)), |
| 75 | ++ Map.entry("minecraft:yellow_bed", Map.of("distance", 0.5F)), |
| 76 | ++ Map.entry("minecraft:green_bed", Map.of("distance", 0.5F)), |
| 77 | ++ Map.entry("minecraft:lime_bed", Map.of("distance", 0.5F)), |
| 78 | ++ Map.entry("minecraft:cyan_bed", Map.of("distance", 0.5F)), |
| 79 | ++ Map.entry("minecraft:light_blue_bed", Map.of("distance", 0.5F)), |
| 80 | ++ Map.entry("minecraft:blue_bed", Map.of("distance", 0.5F)), |
| 81 | ++ Map.entry("minecraft:purple_bed", Map.of("distance", 0.5F)), |
| 82 | ++ Map.entry("minecraft:magenta_bed", Map.of("distance", 0.5F)) |
| 83 | ++ )).forEach((blockId, value) -> { |
| 84 | ++ Block block = Registry.BLOCK.get(new ResourceLocation(blockId)); |
| 85 | ++ if (block == Blocks.AIR) { |
| 86 | ++ log(Level.SEVERE, "Invalid block for `settings.block-fall-multipliers`: " + blockId); |
| 87 | ++ return; |
| 88 | ++ } |
| 89 | ++ if (!(value instanceof Map<?, ?> map)) { |
| 90 | ++ log(Level.SEVERE, "Invalid fall multiplier for `settings.block-fall-multipliers." + blockId + "`: " + value |
| 91 | ++ + ", expected a map with keys `damage` and `distance` to floats."); |
| 92 | ++ return; |
| 93 | ++ } |
| 94 | ++ Object rawFallDamageMultiplier = map.get("damage"); |
| 95 | ++ if (rawFallDamageMultiplier == null) rawFallDamageMultiplier = 1F; |
| 96 | ++ if (!(rawFallDamageMultiplier instanceof Number fallDamageMultiplier)) { |
| 97 | ++ log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".damage`: " + map.get("damage")); |
| 98 | ++ return; |
| 99 | ++ } |
| 100 | ++ Object rawFallDistanceMultiplier = map.get("distance"); |
| 101 | ++ if (rawFallDistanceMultiplier == null) rawFallDistanceMultiplier = 1F; |
| 102 | ++ if (!(rawFallDistanceMultiplier instanceof Number fallDistanceMultiplier)) { |
| 103 | ++ log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".distance`: " + map.get("distance")); |
| 104 | ++ return; |
| 105 | ++ } |
| 106 | ++ block.fallDamageMultiplier = fallDamageMultiplier.floatValue(); |
| 107 | ++ block.fallDistanceMultiplier = fallDistanceMultiplier.floatValue(); |
| 108 | ++ }); |
| 109 | ++ } |
| 110 | + } |
0 commit comments