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