Skip to content

Commit 9b5e5ab

Browse files
committed
Added button to enter machines directly to the GUI
This button only shows when having a shrinking device somewhere in the inventory and the player is actually allowed to enter the machine. This also includes an internal change to the way items are being recognized as Shrinking Devices.
1 parent d51e94e commit 9b5e5ab

File tree

14 files changed

+277
-51
lines changed

14 files changed

+277
-51
lines changed

src/main/java/org/dave/compactmachines3/CompactMachines3.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
1010
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
1111
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
12+
import org.dave.compactmachines3.capability.PlayerShrinkingCapability;
1213
import org.dave.compactmachines3.command.CommandCompactMachines3;
1314
import org.dave.compactmachines3.gui.GuiHandler;
1415
import org.dave.compactmachines3.integration.CapabilityNullHandlerRegistry;
1516
import org.dave.compactmachines3.miniaturization.MultiblockRecipes;
17+
import org.dave.compactmachines3.misc.CapabilityEventHandler;
1618
import org.dave.compactmachines3.misc.ConfigurationHandler;
1719
import org.dave.compactmachines3.misc.PlayerEventHandler;
1820
import org.dave.compactmachines3.misc.RenderTickCounter;
@@ -50,6 +52,7 @@ public void preInit(FMLPreInitializationEvent event) {
5052
MinecraftForge.EVENT_BUS.register(WorldSavedDataMachines.class);
5153
MinecraftForge.EVENT_BUS.register(RenderTickCounter.class);
5254
MinecraftForge.EVENT_BUS.register(BakeryHandler.class);
55+
MinecraftForge.EVENT_BUS.register(CapabilityEventHandler.class);
5356

5457
// Insist on keeping an already registered dimension by registering in pre-registerDimension.
5558
DimensionTools.registerDimension();
@@ -73,6 +76,7 @@ public void init(FMLInitializationEvent event) {
7376

7477
@EventHandler
7578
public void postInit(FMLPostInitializationEvent event) {
79+
PlayerShrinkingCapability.init();
7680
CapabilityNullHandlerRegistry.registerNullHandlers();
7781
ExtraTileDataProviderRegistry.registerExtraTileDataProviders();
7882

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.dave.compactmachines3.api;
2+
3+
public interface IPlayerShrinkingCapability {
4+
}

src/main/java/org/dave/compactmachines3/block/BlockMachine.java

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@
3333
import net.minecraftforge.fml.relauncher.Side;
3434
import net.minecraftforge.fml.relauncher.SideOnly;
3535
import org.dave.compactmachines3.CompactMachines3;
36+
import org.dave.compactmachines3.capability.PlayerShrinkingCapability;
3637
import org.dave.compactmachines3.compat.ITopInfoProvider;
3738
import org.dave.compactmachines3.init.Blockss;
38-
import org.dave.compactmachines3.item.ItemPersonalShrinkingDevice;
3939
import org.dave.compactmachines3.misc.CreativeTabCompactMachines3;
4040
import org.dave.compactmachines3.network.MessageMachineContent;
4141
import org.dave.compactmachines3.network.PackageHandler;
@@ -312,41 +312,10 @@ public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, En
312312
}
313313

314314
TileEntityMachine machine = (TileEntityMachine)world.getTileEntity(pos);
315-
if(machine.isInsideItself()) {
316-
return true;
317-
}
318-
319315
ItemStack playerStack = player.getHeldItemMainhand();
320-
if(!playerStack.isEmpty() && machine.isAllowedToEnter(player)) {
321-
Item playerItem = playerStack.getItem();
322-
323-
// TODO: Convert the ability to teleport into a machine into an itemstack capability
324-
if(playerItem instanceof ItemPersonalShrinkingDevice) {
325-
// TODO: Clean up, this belongs into a separate class
326-
if(machine.coords == -1) {
327-
StructureTools.generateCubeForMachine(machine);
328-
329-
double[] destination = new double[] {
330-
machine.coords * 1024 + 0.5 + machine.getSize().getDimension() / 2,
331-
42,
332-
0.5 + machine.getSize().getDimension() / 2
333-
};
334-
335-
WorldSavedDataMachines.INSTANCE.addSpawnPoint(machine.coords, destination);
336-
}
337-
338-
WorldSavedDataMachines.INSTANCE.addMachinePosition(machine.coords, pos, world.provider.getDimension(), machine.getSize());
339-
340-
TeleportationTools.teleportPlayerToMachine((EntityPlayerMP) player, machine);
341-
StructureTools.setBiomeForCoords(machine.coords, world.getBiome(pos));
342-
343-
if(!machine.hasOwner() || "Unknown".equals(machine.getOwnerName())) {
344-
machine.setOwner(player);
345-
machine.markDirty();
346-
}
347-
348-
return true;
349-
}
316+
if(PlayerShrinkingCapability.isShrinkingDevice(playerStack)) {
317+
TeleportationTools.tryToEnterMachine(player, machine);
318+
return true;
350319
}
351320

352321
player.openGui(CompactMachines3.instance, GuiIds.MACHINE_VIEW.ordinal(), world, pos.getX(), pos.getY(), pos.getZ());
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.dave.compactmachines3.capability;
2+
3+
import net.minecraft.entity.player.EntityPlayer;
4+
import net.minecraft.item.ItemStack;
5+
import net.minecraft.nbt.NBTBase;
6+
import net.minecraft.util.EnumFacing;
7+
import net.minecraft.util.EnumHand;
8+
import net.minecraftforge.common.capabilities.Capability;
9+
import net.minecraftforge.common.capabilities.CapabilityInject;
10+
import net.minecraftforge.common.capabilities.CapabilityManager;
11+
import org.dave.compactmachines3.api.IPlayerShrinkingCapability;
12+
13+
import javax.annotation.Nullable;
14+
import java.util.concurrent.Callable;
15+
16+
public class PlayerShrinkingCapability {
17+
@CapabilityInject(IPlayerShrinkingCapability.class)
18+
public static Capability<IPlayerShrinkingCapability> PLAYER_SHRINKING_CAPABILITY = null;
19+
20+
public static void init() {
21+
CapabilityManager.INSTANCE.register(IPlayerShrinkingCapability.class, new Storage(), new Factory());
22+
}
23+
24+
public static boolean isShrinkingDevice(ItemStack stack) {
25+
if(stack.isEmpty() || stack == null) {
26+
return false;
27+
}
28+
29+
return stack.hasCapability(PlayerShrinkingCapability.PLAYER_SHRINKING_CAPABILITY, null);
30+
}
31+
32+
public static boolean hasShrinkingDeviceInHand(EntityPlayer player) {
33+
return isShrinkingDevice(player.getHeldItemMainhand()) || isShrinkingDevice(player.getHeldItemOffhand());
34+
}
35+
36+
public static boolean hasShrinkingDeviceInHand(EntityPlayer player, EnumHand hand) {
37+
return isShrinkingDevice(player.getHeldItem(hand));
38+
}
39+
40+
public static boolean hasShrinkingDeviceInInventory(EntityPlayer player) {
41+
for(int slot = 0; slot < player.inventory.getSizeInventory(); slot++) {
42+
ItemStack stack = player.inventory.getStackInSlot(slot);
43+
if(isShrinkingDevice(stack)) {
44+
return true;
45+
}
46+
}
47+
48+
return false;
49+
}
50+
51+
private static class Storage implements Capability.IStorage<IPlayerShrinkingCapability> {
52+
53+
@Nullable
54+
@Override
55+
public NBTBase writeNBT(Capability<IPlayerShrinkingCapability> capability, IPlayerShrinkingCapability instance, EnumFacing side) {
56+
return null;
57+
}
58+
59+
@Override
60+
public void readNBT(Capability<IPlayerShrinkingCapability> capability, IPlayerShrinkingCapability instance, EnumFacing side, NBTBase nbt) {
61+
}
62+
}
63+
64+
private static class Factory implements Callable<IPlayerShrinkingCapability> {
65+
66+
@Override
67+
public IPlayerShrinkingCapability call() throws Exception {
68+
return new IPlayerShrinkingCapability() {};
69+
}
70+
}
71+
}

src/main/java/org/dave/compactmachines3/gui/machine/GuiMachine.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.minecraft.client.gui.GuiButton;
66
import net.minecraft.client.gui.GuiTextField;
77
import net.minecraft.client.gui.inventory.GuiContainer;
8-
import net.minecraft.client.network.NetworkPlayerInfo;
98
import net.minecraft.client.renderer.*;
109
import net.minecraft.client.renderer.texture.TextureManager;
1110
import net.minecraft.client.renderer.texture.TextureMap;
@@ -24,8 +23,10 @@
2423
import net.minecraftforge.client.ForgeHooksClient;
2524
import net.minecraftforge.fml.client.config.GuiCheckBox;
2625
import org.dave.compactmachines3.CompactMachines3;
26+
import org.dave.compactmachines3.capability.PlayerShrinkingCapability;
2727
import org.dave.compactmachines3.gui.GUIHelper;
2828
import org.dave.compactmachines3.init.Blockss;
29+
import org.dave.compactmachines3.init.Itemss;
2930
import org.dave.compactmachines3.misc.ConfigurationHandler;
3031
import org.dave.compactmachines3.misc.RenderTickCounter;
3132
import org.dave.compactmachines3.network.MessagePlayerWhiteListToggle;
@@ -57,6 +58,7 @@ public class GuiMachine extends GuiContainer {
5758
private GuiMachinePlayerWhitelist guiWhiteList;
5859
private GuiButton guiWhiteListAddButton;
5960
private GuiCheckBox guiMachineLockedButton;
61+
private GuiButton guiEnterButton;
6062

6163
int glListId = -1;
6264
int activeTab = 0; // TODO: This should not be an integer, but rather a GuiTab object or something like that
@@ -67,18 +69,17 @@ public GuiMachine() {
6769

6870
private boolean shouldShowTabs() {
6971
boolean isOwner = mc.player.getName().equals(GuiMachineData.owner);
70-
boolean isCreative = mc.player.isCreative();
7172

7273
// TODO: Add server-side operator & isCreative check
73-
return isOwner || isCreative;
74+
return isOwner;
7475
}
7576

7677
@Override
7778
public void initGui() {
7879
super.initGui();
7980

8081
this.bgImage = new ResourceLocation("minecraft", "textures/gui/container/crafting_table.png");
81-
this.tabIcons = new ResourceLocation(CompactMachines3.MODID, "textures/gui/tabicons.png");
82+
this.tabIcons = new ResourceLocation(CompactMachines3.MODID, "textures/gui/tabicons.png");
8283

8384
int offsetX = (int)((this.width - this.windowWidth) / 2.0f);
8485
int offsetY = (int)((this.height - this.windowHeight) / 2.0f);
@@ -98,6 +99,9 @@ public void initGui() {
9899
20,
99100
windowWidth - 10,
100101
windowHeight);
102+
103+
this.guiEnterButton = new GuiButton(2, offsetX+5+windowWidth-30, offsetY+windowHeight-25, 20, 20, "");
104+
this.buttonList.add(this.guiEnterButton);
101105
}
102106

103107
@Override
@@ -157,6 +161,7 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
157161
renderChunk();
158162

159163
drawOwner(partialTicks, mouseX, mouseY);
164+
drawEnterButton(partialTicks, mouseX, mouseY);
160165
} else {
161166
// TODO: Draw unused screen and help information; account for future updates with loot compact machines
162167
}
@@ -166,6 +171,30 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
166171
}
167172
}
168173

174+
private void drawEnterButton(float partialTicks, int mouseX, int mouseY) {
175+
if(!PlayerShrinkingCapability.hasShrinkingDeviceInInventory(mc.player)) {
176+
return;
177+
}
178+
179+
if(GuiMachineData.coords == -1) {
180+
return;
181+
}
182+
183+
if(!GuiMachineData.isAllowedToEnter(mc.player)) {
184+
return;
185+
}
186+
187+
guiEnterButton.drawButton(this.mc, mouseX, mouseY, partialTicks);
188+
189+
190+
ItemStack itemstack = new ItemStack(Itemss.psd);
191+
GlStateManager.pushAttrib();
192+
RenderHelper.enableGUIStandardItemLighting();
193+
this.itemRender.renderItemAndEffectIntoGUI(itemstack, guiEnterButton.x+2, guiEnterButton.y+1);
194+
RenderHelper.enableStandardItemLighting();
195+
GlStateManager.popAttrib();
196+
}
197+
169198
protected void drawOwner(float partialTicks, int mouseX, int mouseY) {
170199
float offsetX = (this.width - this.windowWidth) / 2.0f;
171200
float offsetY = (this.height - this.windowHeight) / 2.0f;
@@ -298,6 +327,10 @@ protected void actionPerformed(GuiButton button) throws IOException {
298327
if(button.id == 1) {
299328
PackageHandler.instance.sendToServer(new MessageRequestMachineAction(GuiMachineData.coords, MessageRequestMachineAction.Action.TOGGLE_LOCKED));
300329
}
330+
331+
if(button.id == 2) {
332+
PackageHandler.instance.sendToServer(new MessageRequestMachineAction(GuiMachineData.coords, MessageRequestMachineAction.Action.TRY_TO_ENTER));
333+
}
301334
}
302335

303336
@Override
@@ -339,6 +372,16 @@ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOEx
339372
this.guiMachineLockedButton.playPressSound(this.mc.getSoundHandler());
340373
this.actionPerformed(this.guiMachineLockedButton);
341374
}
375+
} else if(activeTab == 0 && mouseButton == 0) {
376+
boolean mousePressed = this.guiEnterButton.mousePressed(this.mc, mouseX, mouseY);
377+
boolean hasDevice = PlayerShrinkingCapability.hasShrinkingDeviceInInventory(mc.player);
378+
boolean validCoords = GuiMachineData.coords != -1;
379+
boolean isAllowedToEnter = GuiMachineData.isAllowedToEnter(mc.player);
380+
381+
if(mousePressed && hasDevice && validCoords && isAllowedToEnter) {
382+
this.guiEnterButton.playPressSound(this.mc.getSoundHandler());
383+
this.actionPerformed(this.guiEnterButton);
384+
}
342385
}
343386

344387
if(shouldShowTabs()) {

src/main/java/org/dave/compactmachines3/gui/machine/GuiMachineAdmin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class GuiMachineAdmin extends GuiMachine {
1818
private GuiButton buttonTeleportInside;
1919

2020
private List<GuiButton> adminButtons;
21-
private int buttonIdOffset = 2;
21+
private int buttonIdOffset = 3;
2222

2323
@Override
2424
public void initGui() {

src/main/java/org/dave/compactmachines3/gui/machine/GuiMachineData.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.dave.compactmachines3.gui.machine;
22

3+
import net.minecraft.entity.player.EntityPlayer;
34
import net.minecraft.nbt.NBTTagCompound;
45
import net.minecraft.util.math.BlockPos;
56
import net.minecraft.world.IBlockAccess;
@@ -31,6 +32,26 @@ public class GuiMachineData {
3132
public static boolean requiresNewDisplayList = false;
3233
public static boolean canRender = false;
3334

35+
public static boolean isAllowedToEnter(EntityPlayer player) {
36+
if(!locked) {
37+
return true;
38+
}
39+
40+
if(owner == null || owner.length() <= 0) {
41+
return true;
42+
}
43+
44+
if(player.getName().equals(owner)) {
45+
return true;
46+
}
47+
48+
if(playerWhiteList.contains(player.getName())) {
49+
return true;
50+
}
51+
52+
return false;
53+
}
54+
3455
public static void updateGuiMachineData(NBTTagCompound rawData, int machineSize, int coords, DimensionBlockPos machinePos, String owner, String customName, Set<String> playerWhiteList, boolean locked) {
3556
canRender = false;
3657
GuiMachineData.rawData = rawData;

src/main/java/org/dave/compactmachines3/gui/machine/GuiMachinePlayerWhitelist.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.minecraftforge.fml.client.GuiScrollingList;
88
import org.dave.compactmachines3.network.MessagePlayerWhiteListToggle;
99
import org.dave.compactmachines3.network.PackageHandler;
10-
import org.dave.compactmachines3.utility.Logz;
1110

1211
public class GuiMachinePlayerWhitelist extends GuiScrollingList {
1312
private final GuiContainer parent;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.dave.compactmachines3.misc;
2+
3+
4+
import net.minecraft.item.Item;
5+
import net.minecraft.item.ItemStack;
6+
import net.minecraft.util.EnumFacing;
7+
import net.minecraft.util.ResourceLocation;
8+
import net.minecraftforge.common.capabilities.Capability;
9+
import net.minecraftforge.common.capabilities.ICapabilityProvider;
10+
import net.minecraftforge.event.AttachCapabilitiesEvent;
11+
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
12+
import org.dave.compactmachines3.CompactMachines3;
13+
import org.dave.compactmachines3.capability.PlayerShrinkingCapability;
14+
import org.dave.compactmachines3.init.Itemss;
15+
16+
import javax.annotation.Nonnull;
17+
import javax.annotation.Nullable;
18+
19+
public class CapabilityEventHandler {
20+
21+
private static boolean isIntegratedShrinkingDevice(Item item) {
22+
return item == Itemss.psd;
23+
}
24+
25+
@SubscribeEvent
26+
public static void onAttachCapabilitiesToItems(AttachCapabilitiesEvent<ItemStack> event) {
27+
ItemStack stack = event.getObject();
28+
if(isIntegratedShrinkingDevice(stack.getItem()) && !PlayerShrinkingCapability.isShrinkingDevice(stack)) {
29+
event.addCapability(new ResourceLocation(CompactMachines3.MODID, "canShrinkPlayers"), new PlayerShrinkingCapabilityProvider());
30+
}
31+
}
32+
33+
private static class PlayerShrinkingCapabilityProvider implements ICapabilityProvider {
34+
35+
@Override
36+
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing) {
37+
return capability == PlayerShrinkingCapability.PLAYER_SHRINKING_CAPABILITY;
38+
}
39+
40+
@Nullable
41+
@Override
42+
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
43+
return (T) PlayerShrinkingCapability.PLAYER_SHRINKING_CAPABILITY.getDefaultInstance();
44+
}
45+
}
46+
}

src/main/java/org/dave/compactmachines3/network/MessageRequestMachineAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public enum Action {
4040
GIVE_ITEM,
4141
TELEPORT_INSIDE,
4242
TELEPORT_OUTSIDE,
43-
TOGGLE_LOCKED
43+
TOGGLE_LOCKED,
44+
TRY_TO_ENTER
4445
}
4546
}

0 commit comments

Comments
 (0)