Fixed a crash when the Constructor tries to place a block when a multipart is attached to it, fixes #1648

This commit is contained in:
raoulvdberge
2018-03-08 19:05:41 +01:00
parent 1510e27dad
commit f04645758a
4 changed files with 40 additions and 5 deletions

View File

@@ -11,6 +11,7 @@
- Fixed Disk Manipulator being stuck on unemptiable, non-empty disks (ineternet) - Fixed Disk Manipulator being stuck on unemptiable, non-empty disks (ineternet)
- Fixed orientations of the Portable Grid (TeamSpen210) - Fixed orientations of the Portable Grid (TeamSpen210)
- Fixed crafting event in Crafting Grid being fired twice (raoulvdberge) - Fixed crafting event in Crafting Grid being fired twice (raoulvdberge)
- Fixed a crash when the Constructor tries to place a block when a multipart is attached to it (raoulvdberge)
- Attempted to fix FPS drop on Grid sorting (raoulvdberge) - Attempted to fix FPS drop on Grid sorting (raoulvdberge)
- Disk Manipulator in fluid mode will now extract a bucket at a time instead of 1 mB (or 64 buckets at a time with a Stack Upgrade instead of 64 mB) (raoulvdberge) - Disk Manipulator in fluid mode will now extract a bucket at a time instead of 1 mB (or 64 buckets at a time with a Stack Upgrade instead of 64 mB) (raoulvdberge)

View File

@@ -4,6 +4,8 @@ import com.mojang.authlib.GameProfile;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.container.slot.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.SlotFilter;
import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP;
import com.raoulvdberge.refinedstorage.integration.mcmp.RSMCMPAddon;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
@@ -132,8 +134,18 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
} }
} }
private WorldServer getWorldServer() {
World world = this.world;
if (IntegrationMCMP.isLoaded()) {
world = RSMCMPAddon.unwrapWorld(world);
}
return (WorldServer) world;
}
private boolean canPlace(BlockPos pos, IBlockState state) { private boolean canPlace(BlockPos pos, IBlockState state) {
BlockEvent.PlaceEvent e = new BlockEvent.PlaceEvent(new BlockSnapshot(world, pos, state), world.getBlockState(pos), FakePlayerFactory.getMinecraft((WorldServer) world), EnumHand.MAIN_HAND); BlockEvent.PlaceEvent e = new BlockEvent.PlaceEvent(new BlockSnapshot(world, pos, state), world.getBlockState(pos), FakePlayerFactory.getMinecraft(getWorldServer()), EnumHand.MAIN_HAND);
return !MinecraftForge.EVENT_BUS.post(e); return !MinecraftForge.EVENT_BUS.post(e);
} }
@@ -149,7 +161,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
IBlockState state = SlotFilter.getBlockState(world, front, took); IBlockState state = SlotFilter.getBlockState(world, front, took);
if (state != null && world.isAirBlock(front) && state.getBlock().canPlaceBlockAt(world, front)) { if (state != null && world.isAirBlock(front) && state.getBlock().canPlaceBlockAt(world, front)) {
state = state.getBlock().getStateForPlacement(world, front, getDirection(), 0.5F, 0.5F, 0.5F, took.getMetadata(), FakePlayerFactory.getMinecraft((WorldServer) world), EnumHand.MAIN_HAND); state = state.getBlock().getStateForPlacement(world, front, getDirection(), 0.5F, 0.5F, 0.5F, took.getMetadata(), FakePlayerFactory.getMinecraft(getWorldServer()), EnumHand.MAIN_HAND);
if (!canPlace(front, state)) { if (!canPlace(front, state)) {
return; return;
@@ -161,7 +173,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
if (item.getItem() instanceof ItemBlock) { if (item.getItem() instanceof ItemBlock) {
((ItemBlock) item.getItem()).placeBlockAt( ((ItemBlock) item.getItem()).placeBlockAt(
took, took,
FakePlayerFactory.getMinecraft((WorldServer) world), FakePlayerFactory.getMinecraft(getWorldServer()),
world, world,
front, front,
getDirection(), getDirection(),
@@ -173,7 +185,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
} else { } else {
world.setBlockState(front, state, 1 | 2); world.setBlockState(front, state, 1 | 2);
state.getBlock().onBlockPlacedBy(world, front, state, FakePlayerFactory.getMinecraft((WorldServer) world), took); state.getBlock().onBlockPlacedBy(world, front, state, FakePlayerFactory.getMinecraft(getWorldServer()), took);
} }
// From ItemBlock#onItemUse // From ItemBlock#onItemUse

View File

@@ -2,6 +2,8 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP;
import com.raoulvdberge.refinedstorage.integration.mcmp.RSMCMPAddon;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
@@ -72,6 +74,16 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I
return RS.INSTANCE.config.destructorUsage + upgrades.getEnergyUsage(); return RS.INSTANCE.config.destructorUsage + upgrades.getEnergyUsage();
} }
private WorldServer getWorldServer() {
World world = this.world;
if (IntegrationMCMP.isLoaded()) {
world = RSMCMPAddon.unwrapWorld(world);
}
return (WorldServer) world;
}
@Override @Override
public void update() { public void update() {
super.update(); super.update();
@@ -130,7 +142,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I
} }
} }
BlockEvent.BreakEvent e = new BlockEvent.BreakEvent(world, front, frontBlockState, FakePlayerFactory.getMinecraft((WorldServer) world)); BlockEvent.BreakEvent e = new BlockEvent.BreakEvent(world, front, frontBlockState, FakePlayerFactory.getMinecraft(getWorldServer()));
if (!MinecraftForge.EVENT_BUS.post(e)) { if (!MinecraftForge.EVENT_BUS.post(e)) {
world.playEvent(null, 2001, front, Block.getStateId(frontBlockState)); world.playEvent(null, 2001, front, Block.getStateId(frontBlockState));

View File

@@ -14,6 +14,7 @@ import mcmultipart.api.ref.MCMPCapabilities;
import mcmultipart.api.slot.EnumCenterSlot; import mcmultipart.api.slot.EnumCenterSlot;
import mcmultipart.block.BlockMultipartContainer; import mcmultipart.block.BlockMultipartContainer;
import mcmultipart.block.TileMultipartContainer; import mcmultipart.block.TileMultipartContainer;
import mcmultipart.util.MCMPWorldWrapper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@@ -23,6 +24,7 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider;
@@ -136,6 +138,14 @@ public class RSMCMPAddon implements IMCMPAddon {
return tile; return tile;
} }
public static World unwrapWorld(World world) {
if (world instanceof MCMPWorldWrapper) {
return ((MCMPWorldWrapper) world).getActualWorld();
}
return world;
}
public static Block unwrapBlock(IBlockAccess world, BlockPos pos) { public static Block unwrapBlock(IBlockAccess world, BlockPos pos) {
IBlockState state = world.getBlockState(pos); IBlockState state = world.getBlockState(pos);