Skip to content

Commit f28d282

Browse files
authored
Configurable block fall damage modifiers (#1143)
1 parent aafe275 commit f28d282

1 file changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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

Comments
 (0)