Skip to content

Commit 8e3c1c1

Browse files
authored
Merge pull request #5 from HaHaWTH/main
Handle mod explosion event and pass to Bukkit properly
2 parents 52d8f2c + a443862 commit 8e3c1c1

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

patches/minecraft/net/minecraft/world/Explosion.java.patch

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@
3333
private final double field_77285_c;
3434
private final double field_77282_d;
3535
- private final Entity field_77283_e;
36-
+ public final Entity field_77283_e;
37-
private final float field_77280_f;
36+
- private final float field_77280_f;
3837
- private final List<BlockPos> field_77281_g = Lists.newArrayList();
3938
- private final Map<EntityPlayer, Vec3d> field_77288_k = Maps.newHashMap();
39+
+ public final Entity field_77283_e;
40+
+ public float field_77280_f; // CatRoom - private final -> public
4041
+ private final List<BlockPos> field_77281_g;
4142
+ private final Map<EntityPlayer, Vec3d> field_77288_k;
4243
+ private final Vec3d position;

src/main/java/catserver/server/CatServerConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public class CatServerConfig {
4848

4949
public boolean waitForgeServerChatEvent = false;
5050

51+
public boolean bridgeForgeExplosionEventToBukkit = true; // CatRoom
52+
5153
public int craftRequestThrottle = 20;
5254
public int itemNBTThrottle = 200;
5355
public boolean limitFastClickGUI = false;
@@ -109,6 +111,9 @@ public void loadConfig() {
109111
releaseUseItemThrottle = getOrWriteIntConfig("network.packetLimit.releaseUseItemThrottle", releaseUseItemThrottle);
110112
disableFMLHandshake = getOrWriteBooleanConfig("network.fml.disableHandshake", config.getBoolean("disableFMLHandshake", disableFMLHandshake));
111113
disableFMLStatusModInfo = getOrWriteBooleanConfig("network.fml.disableStatusModInfo", config.getBoolean("disableFMLStatusModInfo", disableFMLStatusModInfo));
114+
// Event bridge // CatRoom start - Handle mod explosion event
115+
bridgeForgeExplosionEventToBukkit = getOrWriteBooleanConfig("event-bridge.bridgeForgeExplosionEventToBukkit", bridgeForgeExplosionEventToBukkit);
116+
// CatRoom end - Handle mod explosion event
112117
// general
113118
disableUpdateGameProfile = getOrWriteBooleanConfig("disableUpdateGameProfile", disableUpdateGameProfile);
114119
disableAsyncCatchWarn = getOrWriteBooleanConfig("disableAsyncCatchWarn", disableAsyncCatchWarn);

src/main/java/catserver/server/CatServerEventHandler.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
11
package catserver.server;
22

3+
import com.google.common.collect.Lists;
4+
import net.minecraft.entity.Entity;
35
import net.minecraft.entity.player.EntityPlayerMP;
46
import net.minecraft.server.MinecraftServer;
57
import net.minecraft.util.EnumActionResult;
68
import net.minecraft.util.math.BlockPos;
9+
import net.minecraft.util.math.Vec3d;
10+
import net.minecraft.world.Explosion;
711
import net.minecraftforge.common.util.BlockSnapshot;
812
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
913
import net.minecraftforge.event.world.BlockEvent;
14+
import net.minecraftforge.event.world.ExplosionEvent;
1015
import net.minecraftforge.fml.common.eventhandler.EventPriority;
1116
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
1217
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
1318
import org.bukkit.Bukkit;
19+
import org.bukkit.Location;
20+
import org.bukkit.Material;
21+
import org.bukkit.World;
22+
import org.bukkit.block.Block;
1423
import org.bukkit.block.BlockState;
1524
import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlockState;
1625
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
1726
import org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory;
1827
import org.bukkit.event.Event;
1928
import org.bukkit.event.block.Action;
2029
import org.bukkit.event.block.BlockBreakEvent;
30+
import org.bukkit.event.block.BlockExplodeEvent;
2131
import org.bukkit.event.block.BlockPlaceEvent;
32+
import org.bukkit.event.entity.EntityExplodeEvent;
2233
import org.bukkit.event.player.PlayerChangedWorldEvent;
2334

2435
import java.util.ArrayList;
@@ -40,6 +51,57 @@ public void onBlockBreak(BlockEvent.BreakEvent event) {
4051
bukkitBlockBreakEventCapture.put(bukkitEvent);
4152
}
4253

54+
// CatRoom start - Handle mod explosion event
55+
@SubscribeEvent(priority = EventPriority.HIGHEST)
56+
public void onExplode(ExplosionEvent.Detonate event) {
57+
if (!CatServer.getConfig().bridgeForgeExplosionEventToBukkit) return;
58+
Explosion explosion = event.getExplosion();
59+
if (explosion.getClass() != Explosion.class) {
60+
Entity exploder = explosion.exploder;
61+
World bworld = event.getWorld().getWorld();
62+
Vec3d explosionPos = explosion.getPosition();
63+
Location location = new Location(bworld, explosionPos.x, explosionPos.y, explosionPos.z);
64+
List<Block> bukkitBlocks;
65+
boolean cancelled;
66+
float yield;
67+
final List<Block> blockList = Lists.newArrayList();
68+
List<BlockPos> affectedBlockPositions = event.getAffectedBlocks();
69+
for (int i1 = affectedBlockPositions.size() - 1; i1 >= 0; i1--) {
70+
BlockPos cpos = affectedBlockPositions.get(i1);
71+
Block bblock = bworld.getBlockAt(cpos.getX(), cpos.getY(), cpos.getZ());
72+
if (bblock.getType() != Material.AIR) {
73+
blockList.add(bblock);
74+
}
75+
}
76+
if (exploder != null) {
77+
EntityExplodeEvent bukkitEvent = new EntityExplodeEvent(exploder.getBukkitEntity(), location , blockList, 1.0F / explosion.size);
78+
Bukkit.getServer().getPluginManager().callEvent(bukkitEvent);
79+
cancelled = bukkitEvent.isCancelled();
80+
bukkitBlocks = bukkitEvent.blockList();
81+
yield = bukkitEvent.getYield();
82+
} else {
83+
BlockExplodeEvent bukkitEvent = new BlockExplodeEvent(location.getBlock(), blockList, 1.0F / explosion.size);
84+
Bukkit.getServer().getPluginManager().callEvent(bukkitEvent);
85+
cancelled = bukkitEvent.isCancelled();
86+
bukkitBlocks = bukkitEvent.blockList();
87+
yield = bukkitEvent.getYield();
88+
}
89+
explosion.getAffectedBlockPositions().clear();
90+
91+
if (cancelled) {
92+
event.getAffectedEntities().clear();
93+
explosion.wasCanceled = true;
94+
} else {
95+
for (Block bblock : bukkitBlocks) {
96+
BlockPos coords = new BlockPos(bblock.getX(), bblock.getY(), bblock.getZ());
97+
explosion.getAffectedBlockPositions().add(coords);
98+
}
99+
explosion.size = yield * explosion.size;
100+
}
101+
}
102+
}
103+
// CatRoom end - Handle mod explosion event
104+
43105
@SubscribeEvent(priority = EventPriority.HIGHEST)
44106
public void onBlockPlace(BlockEvent.PlaceEvent event) {
45107
BlockPos clickPos = event.direction != null ? event.getBlockSnapshot().getPos().offset(event.direction.getOpposite()) : event.getPos();

0 commit comments

Comments
 (0)