Let constructor & destructor interact with world using their owner's profile. + Fixed CraftingTask duplication bug (#2158)
* Let constructor & destructor interact with world using their owner's profile. * Fixed CraftingTask duplication dupe (credits to @notcake)
This commit is contained in:
@@ -551,7 +551,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
ItemStack result = network.extractItem(toExtract, toExtract.getCount(), Action.PERFORM);
|
||||
|
||||
if (result != null) {
|
||||
internalStorage.insert(toExtract, toExtract.getCount(), Action.PERFORM);
|
||||
internalStorage.insert(toExtract, result.getCount(), Action.PERFORM);
|
||||
|
||||
toRemove.add(result);
|
||||
}
|
||||
@@ -573,7 +573,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
FluidStack result = network.extractFluid(toExtract, toExtract.amount, Action.PERFORM);
|
||||
|
||||
if (result != null) {
|
||||
internalFluidStorage.insert(toExtract, toExtract.amount, Action.PERFORM);
|
||||
internalFluidStorage.insert(toExtract, result.amount, Action.PERFORM);
|
||||
|
||||
toRemove.add(result);
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@ import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.server.management.PlayerProfileCache;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntitySkull;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
@@ -39,6 +40,7 @@ import net.minecraft.world.WorldServer;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.util.BlockSnapshot;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
import net.minecraftforge.common.util.FakePlayerFactory;
|
||||
import net.minecraftforge.event.world.BlockEvent;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
@@ -48,6 +50,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.UUID;
|
||||
|
||||
public class NetworkNodeConstructor extends NetworkNode implements IComparable, IType, ICoverable {
|
||||
public static final String ID = "constructor";
|
||||
@@ -145,8 +148,21 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
|
||||
}
|
||||
}
|
||||
|
||||
private FakePlayer getFakePlayer() {
|
||||
WorldServer world = (WorldServer) this.world;
|
||||
UUID owner = getOwner();
|
||||
if (owner != null) {
|
||||
PlayerProfileCache profileCache = world.getMinecraftServer().getPlayerProfileCache();
|
||||
GameProfile profile = profileCache.getProfileByUUID(owner);
|
||||
if (profile != null) {
|
||||
return FakePlayerFactory.get(world, profile);
|
||||
}
|
||||
}
|
||||
return FakePlayerFactory.getMinecraft(world);
|
||||
}
|
||||
|
||||
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), getFakePlayer(), EnumHand.MAIN_HAND);
|
||||
|
||||
return !MinecraftForge.EVENT_BUS.post(e);
|
||||
}
|
||||
@@ -174,7 +190,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
|
||||
if (item.getItem() instanceof ItemBlock) {
|
||||
((ItemBlock) item.getItem()).placeBlockAt(
|
||||
took,
|
||||
FakePlayerFactory.getMinecraft((WorldServer) world),
|
||||
getFakePlayer(),
|
||||
world,
|
||||
front,
|
||||
getDirection(),
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package com.raoulvdberge.refinedstorage.apiimpl.network.node;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.api.util.Action;
|
||||
import com.raoulvdberge.refinedstorage.api.util.IComparer;
|
||||
@@ -24,6 +25,7 @@ import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.server.management.PlayerProfileCache;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityShulkerBox;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
@@ -37,6 +39,7 @@ import net.minecraft.world.WorldServer;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
import net.minecraftforge.common.util.FakePlayerFactory;
|
||||
import net.minecraftforge.event.world.BlockEvent;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
@@ -52,6 +55,7 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class NetworkNodeDestructor extends NetworkNode implements IComparable, IFilterable, IType, ICoverable {
|
||||
public static final String ID = "destructor";
|
||||
@@ -86,6 +90,19 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I
|
||||
return RS.INSTANCE.config.destructorUsage + upgrades.getEnergyUsage();
|
||||
}
|
||||
|
||||
private FakePlayer getFakePlayer() {
|
||||
WorldServer world = (WorldServer) this.world;
|
||||
UUID owner = getOwner();
|
||||
if (owner != null) {
|
||||
PlayerProfileCache profileCache = world.getMinecraftServer().getPlayerProfileCache();
|
||||
GameProfile profile = profileCache.getProfileByUUID(owner);
|
||||
if (profile != null) {
|
||||
return FakePlayerFactory.get(world, profile);
|
||||
}
|
||||
}
|
||||
return FakePlayerFactory.getMinecraft(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
super.update();
|
||||
@@ -121,7 +138,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I
|
||||
new RayTraceResult(new Vec3d(pos.getX(), pos.getY(), pos.getZ()), getDirection().getOpposite()),
|
||||
world,
|
||||
front,
|
||||
FakePlayerFactory.getMinecraft((WorldServer) world)
|
||||
getFakePlayer()
|
||||
);
|
||||
|
||||
if (!frontStack.isEmpty()) {
|
||||
@@ -150,7 +167,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, getFakePlayer());
|
||||
|
||||
if (!MinecraftForge.EVENT_BUS.post(e)) {
|
||||
world.playEvent(null, 2001, front, Block.getStateId(frontBlockState));
|
||||
|
Reference in New Issue
Block a user