diff --git a/src/main/java/train/client/core/ClientProxy.java b/src/main/java/train/client/core/ClientProxy.java index dda0a68d9..c773aadde 100644 --- a/src/main/java/train/client/core/ClientProxy.java +++ b/src/main/java/train/client/core/ClientProxy.java @@ -333,6 +333,14 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int } else { return null; } + case (GuiIDs.CONTROL_CAR): + if (riddenByEntity != null && riddenByEntity.ridingEntity instanceof EntityRollingStock) { + return new GuiControlCar(riddenByEntity.inventory, entity); + } else if (riddenByEntity != null && riddenByEntity.ridingEntity instanceof EntitySeat) { + return new GuiControlCar(riddenByEntity.inventory, world.getEntityByID(((EntitySeat) entity).parentId)); + } else { + return null; + } case (GuiIDs.FORNEY): if (riddenByEntity != null && riddenByEntity.ridingEntity instanceof EntityRollingStock) { return new GuiForney(riddenByEntity.inventory, entity); diff --git a/src/main/java/train/client/gui/GuiControlCar.java b/src/main/java/train/client/gui/GuiControlCar.java new file mode 100644 index 000000000..f8b8804f7 --- /dev/null +++ b/src/main/java/train/client/gui/GuiControlCar.java @@ -0,0 +1,300 @@ +package train.client.gui; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import train.common.Traincraft; +import train.common.api.*; +import train.common.core.network.*; +import train.common.inventory.InventoryControlCar; +import train.common.library.Info; + +public class GuiControlCar extends GuiContainer +{ + private String texture = Info.guiPrefix + "customButton.png"; + private int textureX = 0; + private int textureY = 46; + private int textureSizeX = 40; + private int textureSizeY = 13; + private int buttonPosX = 0; + private int buttonPosY = 0; + private GuiButton buttonLock; + + private AbstractControlCar controlCar; + private Locomotive locomotiveUnderControl; + + public GuiControlCar(InventoryPlayer inventoryplayer, Entity entityminecart) + { + super(new InventoryControlCar(inventoryplayer, (AbstractControlCar)entityminecart)); + controlCar = (AbstractControlCar) entityminecart; + locomotiveUnderControl = (Locomotive) Minecraft.getMinecraft().theWorld.getEntityByID(controlCar.getLocomotiveBeingControlledEntityID()); + + } + + @Override + public void initGui() { + super.initGui(); + buttonList.clear(); + + //region ParkingBrake + if (locomotiveUnderControl != null) + { + if (!locomotiveUnderControl.getParkingBrakeFromPacket()) + { + if (locomotiveUnderControl instanceof SteamTrain) { + textureX = 41; + textureY = 13; + textureSizeX = 40; + textureSizeY = 13; + } + else { + textureX = 126; + textureY = 13; + textureSizeX = 43; + textureSizeY = 13; + } + buttonPosX = 43; + buttonPosY = -13; + buttonList.add(new GuiCustomButton(2, ((width - xSize) / 2) + buttonPosX - 12, ((height - ySize) / 2) + buttonPosY, textureSizeX, textureSizeY, "", texture, textureX, textureY));//Brake: Off + } + else + { + if (locomotiveUnderControl instanceof SteamTrain) { + textureX = 0; + textureY = 13; + textureSizeX = 40; + textureSizeY = 13; + } + else { + textureX = 82; + textureY = 13; + textureSizeX = 43; + textureSizeY = 13; + } + buttonPosX = 0; + buttonPosY = -13; + buttonList.add(new GuiCustomButton(2, ((width - xSize) / 2) + buttonPosX, ((height - ySize) / 2) + buttonPosY, textureSizeX, textureSizeY, "", texture, textureX, textureY));//Brake: On + } + } + //endregion ParkingBrake + + int var1 = (this.width - xSize) / 2; + int var2 = (this.height - ySize) / 2; + + buttonList.add(this.buttonLock = new GuiButton(3, var1 + 108, var2 - 10, 67, 10, controlCar.getTrainLockedFromPacket() ? "Locked" : "Unlocked" )); + buttonList.add(this.buttonLock = new GuiButton(6, var1 + 108, var2 + 166, 67, 12, controlCar.isLightsEnabled() ? "Lights: On" : "Lights: Off")); + buttonList.add(this.buttonLock = new GuiButton(7, var1 + 41, var2 + 166, 67, 12, controlCar.isBeaconEnabled() ? "Beacon: On" : "Beacon: Off")); + buttonList.add(this.buttonLock = new GuiButton(8, var1 + 90, var2 + 178, 85, 12, controlCar.isDitchLightsEnabled() ? "Ditch Lights: On" : "Ditch Lights: Off")); + } + + @Override + protected void actionPerformed(GuiButton guibutton) + { + switch (guibutton.id) + { + case 2: + if ((!locomotiveUnderControl.parkingBrake) && locomotiveUnderControl.getSpeed() < 10) { + Traincraft.brakeChannel.sendToServer(new PacketParkingBrake(true, locomotiveUnderControl.getEntityId())); + locomotiveUnderControl.parkingBrake=true; + locomotiveUnderControl.isBraking=true; + guibutton.displayString = "Brake: On"; + this.initGui(); + } + else if (locomotiveUnderControl.getSpeed() < 10) { + Traincraft.brakeChannel.sendToServer(new PacketParkingBrake(false, locomotiveUnderControl.getEntityId())); + locomotiveUnderControl.parkingBrake=false; + locomotiveUnderControl.isBraking=false; + guibutton.displayString = "Brake: Off"; + this.initGui(); + } + break; + + case 3: // Lock Control Car + if (!controlCar.isNotOwner()) { + if ((!controlCar.getTrainLockedFromPacket())) { + Traincraft.lockChannel.sendToServer(new PacketSetTrainLockedToClient(true, controlCar.getEntityId())); + controlCar.locked = true; + guibutton.displayString = "Locked"; + this.initGui(); + } else { + Traincraft.lockChannel.sendToServer(new PacketSetTrainLockedToClient(false, controlCar.getEntityId())); + controlCar.locked = false; + guibutton.displayString = "UnLocked"; + this.initGui(); + } + } else { + getEntityPlayer().addChatMessage(new ChatComponentText("You are not the owner")); + } + break; + + case 6: // Lights + if (controlCar.isLightsEnabled()) + { + Traincraft.rollingStockLightsChannel.sendToServer(new PacketRollingStockLights(false, controlCar.getEntityId())); + controlCar.isLightsEnabled = false; + guibutton.displayString = "Lights: Off"; + } + else + { + Traincraft.rollingStockLightsChannel.sendToServer(new PacketRollingStockLights(true, controlCar.getEntityId())); + controlCar.isLightsEnabled = true; + guibutton.displayString = "Lights: On"; + } + break; + case 7: // Beacon + if (controlCar.isBeaconEnabled()) + { + Traincraft.rollingStockBeaconChannel.sendToServer(new PacketRollingStockBeacon(false, controlCar.getEntityId())); + controlCar.isBeaconEnabled = false; + guibutton.displayString = "Beacon: Off"; + } + else + { + Traincraft.rollingStockBeaconChannel.sendToServer(new PacketRollingStockBeacon(true, controlCar.getEntityId())); + controlCar.isBeaconEnabled = true; + guibutton.displayString = "Beacon: On"; + } + break; + case 8: // DitchLights + if (controlCar.isDitchLightsEnabled()) + { + Traincraft.rollingStockDitchLightsChannel.sendToServer(new PacketRollingStockDitchLights((byte)0, controlCar.getEntityId())); + controlCar.ditchLightMode = 0; + guibutton.displayString = "Ditch Lights: Off"; + } + else + { + Traincraft.rollingStockDitchLightsChannel.sendToServer(new PacketRollingStockDitchLights((byte)1, controlCar.getEntityId())); + controlCar.ditchLightMode = 1; + guibutton.displayString = "Ditch Lights: On"; + } + break; + } + } + + private EntityPlayer getEntityPlayer() + { + EntityPlayer p = (EntityPlayer) controlCar.riddenByEntity; + if (controlCar.seats.size() != 0 && controlCar.seats.get(0).getPassenger() instanceof EntityPlayer) { + p = (EntityPlayer) controlCar.seats.get(0).getPassenger(); + } + + return p; + } + + @Override + protected void drawCreativeTabHoveringText(String str, int t, int g) { + + String state = ""; + int textWidth = fontRendererObj.getStringWidth("the GUI, change speed, destroy it."); + int startX = 90; + int startY = 5; + + int i4 = 0xf0100010; + drawGradientRect(startX - 3, startY - 4, startX + textWidth + 3, startY + 52, i4, i4); + drawGradientRect(startX - 4, startY - 3, startX + textWidth + 4, startY + 51, i4, i4); + int colour1 = 0x505000ff; + int colour2 = (colour1 & 0xfefefe) >> 1 | colour1 & 0xff000000; + drawGradientRect(startX - 3, startY - 3, startX + textWidth + 3, startY + 51, colour1, colour2); + drawGradientRect(startX - 2, startY - 2, startX + textWidth + 2, startY + 50, i4, i4); + fontRendererObj.drawStringWithShadow(str, startX, startY, -1); + fontRendererObj.drawStringWithShadow("only its owner can open", startX, startY + 10, -1); + fontRendererObj.drawStringWithShadow("the GUI, change speed, destroy it.", startX, startY + 20, -1); + fontRendererObj.drawStringWithShadow("Current state: " + state, startX, startY + 30, -1); + fontRendererObj.drawStringWithShadow("Owner: " + controlCar.getTrainOwner().trim(), startX, + startY + 40, -1); + } + + public boolean intersectsWith(int mouseX, int mouseY) { + //System.out.println(mouseX+" "+mouseY); + int j = (width - xSize) / 2; + int k = (height - ySize) / 2; + return (mouseX >= j + 124 && mouseX <= j + 174 && mouseY >= k - 10 && mouseY <= k); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + fontRendererObj.drawString(controlCar.getInventoryName(), 39, 7, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 41, 5, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 39, 5, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 41, 7, 0x000000); + + fontRendererObj.drawString(controlCar.getInventoryName(), 39, 6, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 41, 6, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 40, 7, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 40, 5, 0x000000); + fontRendererObj.drawString(controlCar.getInventoryName(), 40, 6, 0xd3a900); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + if (intersectsWith(i, j)) { + drawCreativeTabHoveringText("When a locomotive is locked,", i, j); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float par3) + { + super.drawScreen(mouseX, mouseY,par3); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int t, int g) { + String controlCarGUIFilePath = Info.guiPrefix + "gui_loco.png"; + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.renderEngine.bindTexture(new ResourceLocation(Info.resourceLocation, controlCarGUIFilePath)); + int j = (width - xSize) / 2; + int k = (height - ySize) / 2; + drawTexturedModalRect(j, k, 0, 0, xSize, ySize); + + for (int i1 = controlCar.numCargoSlots; i1 < 5; i1++) { + drawTexturedModalRect(j + 79 + 18 * i1, k + 17, 190, 0, 18, 18); + } + for (int j1 = controlCar.numCargoSlots1; j1 < 5; j1++) { + drawTexturedModalRect(j + 79 + 18 * j1, k + 35, 190, 0, 18, 18); + } + for (int k1 = controlCar.numCargoSlots2; k1 < 5; k1++) { + drawTexturedModalRect(j + 79 + 18 * k1, k + 53, 190, 0, 18, 18); + } + + if (locomotiveUnderControl != null) + { + drawTexturedModalRect(j + 8, (k + 36 + 12) - locomotiveUnderControl.getFuelDiv(12), 176, 12 - locomotiveUnderControl.getFuelDiv(12), 14, locomotiveUnderControl.getFuelDiv(12) + 2); + + JsonObject guiDetails = new JsonParser().parse(locomotiveUnderControl.guiDetailsDW()).getAsJsonObject(); + fontRendererObj.drawStringWithShadow("Carts pulled: " + guiDetails. get("cartsPulled"), 1, 10, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Mass pulled: " + guiDetails.get("massPulled"), 1, 20, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Speed reduction: " + guiDetails.get("slowDown") + " km/h", 1, 30, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Accel reduction: " + (Math.round(guiDetails.get("accelSlowDown").getAsDouble() * 1000) / 1000), 1, 40, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Brake reduction: " + (Math.round(guiDetails.get("brakeSlowDown").getAsDouble() * 1000) / 1000), 1, 50, 0xFFFFFF); + + + fontRendererObj.drawStringWithShadow("Fuel consumption: " + ((locomotiveUnderControl.getFuelConsumption() *0.2)+"").substring(0,Math.min(((locomotiveUnderControl.getFuelConsumption() *0.2)+"").length(),4))+ " mB/s", 1, + 60, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Fuel: " + locomotiveUnderControl.getFuel(), 1, 70, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Power: " + locomotiveUnderControl.transportMetricHorsePower() + " Mhp", 1, 80, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("State: " + locomotiveUnderControl.getState(), 1, 90, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Heat level: " + locomotiveUnderControl.getOverheatLevel(), 1, 100, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Maximum Speed: " + (locomotiveUnderControl.getCustomSpeedGUI()) + " km/h", 1, 110, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Destination: " + (locomotiveUnderControl.getDestinationGUI()), 1, 120, 0xFFFFFF); + fontRendererObj.drawStringWithShadow("Primary Loco: " + (locomotiveUnderControl.getInventoryName()), 1, 130, 0xFFFFFF); + } + else + { + fontRendererObj.drawStringWithShadow("No Locomotive is attached", 1, 10, 0xFFFFFF); + } + } +} diff --git a/src/main/java/train/client/gui/HUDloco.java b/src/main/java/train/client/gui/HUDloco.java index f19c482ce..1de5b2663 100644 --- a/src/main/java/train/client/gui/HUDloco.java +++ b/src/main/java/train/client/gui/HUDloco.java @@ -7,6 +7,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderGameOverlayEvent; import org.lwjgl.opengl.GL11; +import train.common.api.AbstractControlCar; import train.common.api.DieselTrain; import train.common.api.Locomotive; import train.common.api.SteamTrain; @@ -17,21 +18,40 @@ public class HUDloco extends GuiScreen { private int windowWidth, windowHeight; @SubscribeEvent - public void onGameRender(RenderGameOverlayEvent.Text event) { - if (game != null - && game.thePlayer != null && game.thePlayer.ridingEntity != null - && (game.thePlayer.ridingEntity instanceof Locomotive || (game.thePlayer.ridingEntity instanceof EntitySeat - && ((EntitySeat) game.thePlayer.ridingEntity).parent instanceof Locomotive)) - && Minecraft.isGuiEnabled() && game.currentScreen == null) { - if (game.thePlayer.ridingEntity instanceof EntitySeat) { + public void onGameRender(RenderGameOverlayEvent.Text event) + { + if (game != null && game.thePlayer != null && game.thePlayer.ridingEntity != null && Minecraft.isGuiEnabled() && game.currentScreen == null + && (game.thePlayer.ridingEntity instanceof Locomotive + || game.thePlayer.ridingEntity instanceof AbstractControlCar + || (game.thePlayer.ridingEntity instanceof EntitySeat && ((EntitySeat) game.thePlayer.ridingEntity).parent instanceof Locomotive))) + { + if (game.thePlayer.ridingEntity instanceof AbstractControlCar) + { + if (game.theWorld.getEntityByID(game.thePlayer.ridingEntity.getDataWatcher().getWatchableObjectInt(29)) != null) + { + renderSkillHUD(event, (Locomotive) game.theWorld.getEntityByID(game.thePlayer.ridingEntity.getDataWatcher().getWatchableObjectInt(29))); + } + else + { + this.game = this.mc = Minecraft.getMinecraft(); + this.fontRendererObj = this.game.fontRenderer; + } + } + else if (game.thePlayer.ridingEntity instanceof EntitySeat) + { EntitySeat seat = (EntitySeat) game.thePlayer.ridingEntity; - if (seat.isControlSeat()) { + if (seat.isControlSeat()) + { renderSkillHUD(event, (Locomotive) ((EntitySeat) game.thePlayer.ridingEntity).parent); } - } else { + } + else + { renderSkillHUD(event, (Locomotive) game.thePlayer.ridingEntity); } - } else { + } + else + { this.game = this.mc = Minecraft.getMinecraft(); this.fontRendererObj = this.game.fontRenderer; } diff --git a/src/main/java/train/common/api/AbstractControlCar.java b/src/main/java/train/common/api/AbstractControlCar.java new file mode 100644 index 000000000..fe42cf8a4 --- /dev/null +++ b/src/main/java/train/common/api/AbstractControlCar.java @@ -0,0 +1,589 @@ +package train.common.api; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import org.lwjgl.input.Keyboard; +import train.common.Traincraft; +import train.common.core.handlers.ConfigHandler; +import train.common.core.network.PacketKeyPress; +import train.common.enums.DataMemberName; +import train.common.library.EnumSounds; +import train.common.library.GuiIDs; +import train.common.library.Info; + +import java.util.List; + +public abstract class AbstractControlCar extends EntityRollingStock implements IInventory, IPassenger, IRollingStockLightControls +{ + public Locomotive connectedLocomotive; + public int whistleDelay; + + //region inventory + public int inventorySize; + private int slotsFilled=0; + protected ItemStack controlCarInventory[]; + public int numCargoSlots; + public int numCargoSlots1; + public int numCargoSlots2; + //endregion inventory + + private boolean forwardPressed = false; + private boolean backwardPressed = false; + private boolean brakePressed = false; + + public boolean isLightsEnabled = false; + public boolean isBeaconEnabled = false; + public byte beaconCycleIndex = 0; + public byte ditchLightMode = 0; + + public AbstractControlCar(World world) + { + super(world); + numCargoSlots = 3; + numCargoSlots1 = 3; + numCargoSlots2 = 3; + inventorySize = numCargoSlots + numCargoSlots2 + numCargoSlots1 + 1; + controlCarInventory = new ItemStack[inventorySize]; + dataWatcher.addObject(28, lightingDetailsJSONString()); + if (connectedLocomotive == null) + { + dataWatcher.addObject(29, 0); + } + else + { + dataWatcher.addObject(29, connectedLocomotive.getEntityId()); + } + } + + public AbstractControlCar(World world, double d, double d1, double d2) + { + super(world); + } + + @Override + protected void writeEntityToNBT(NBTTagCompound nbttagcompound) + { + super.writeEntityToNBT(nbttagcompound); + writeInventory(nbttagcompound); + + nbttagcompound.setString("lightingDetailsJSON", lightingDetailsJSONString()); + } + + private void writeInventory(NBTTagCompound nbttagcompound) + { + NBTTagList nbttaglist = new NBTTagList(); + for (int i = 0; i < controlCarInventory.length; i++) + { + if (controlCarInventory[i] != null) + { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + nbttagcompound1.setByte("Slot", (byte) i); + controlCarInventory[i].writeToNBT(nbttagcompound1); + nbttaglist.appendTag(nbttagcompound1); + } + } + nbttagcompound.setTag("Items", nbttaglist); + } + + + + @Override + protected void readEntityFromNBT(NBTTagCompound ntc) + { + super.readEntityFromNBT(ntc); + readInventory(ntc); + + JsonObject lightingDetailsJSONObject; + try + { + lightingDetailsJSONObject = new JsonParser().parse(ntc.getString("lightingDetailsJSON")).getAsJsonObject(); + } + catch (Exception e) + { + lightingDetailsJSONObject = lightingDetailsAsJSON(); + } + + isLightsEnabled = lightingDetailsJSONObject.get(DataMemberName.isLightsEnabled.AsString()).getAsBoolean(); + isBeaconEnabled = lightingDetailsJSONObject.get(DataMemberName.isBeaconEnabled.AsString()).getAsBoolean(); + ditchLightMode = lightingDetailsJSONObject.get(DataMemberName.ditchLightMode.AsString()).getAsByte(); + beaconCycleIndex = lightingDetailsJSONObject.get(DataMemberName.beaconCycleIndex.AsString()).getAsByte(); + dataWatcher.updateObject(28, lightingDetailsJSONString()); + } + + private void readInventory(NBTTagCompound ntc) + { + NBTTagList nbttaglist = ntc.getTagList("Items", Constants.NBT.TAG_COMPOUND); + controlCarInventory = new ItemStack[getSizeInventory()]; + for (int i = 0; i < nbttaglist.tagCount(); i++) + { + NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); + int j = nbttagcompound1.getByte("Slot") & 0xff; + if (j >= 0 && j < controlCarInventory.length) + { + controlCarInventory[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1); + } + } + } + + private void cycleBeaconIndex() + { + if (isBeaconEnabled && ticksExisted % 5 == 0) + { + beaconCycleIndex++; + if (beaconCycleIndex == 4) + { + beaconCycleIndex = 0; + } + } + } + + @Override + public void onUpdate() + { + cycleBeaconIndex(); + + if (worldObj.isRemote == false) + { + //Server side stuff. + if (cartLinked1 != null) + { + if ((cartLinked1).train != null && (cartLinked1).train.getTrains().size() != 0) + { + for (int j1 = 0; j1 < (cartLinked1).train.getTrains().size(); j1++) + { + AbstractTrains daRollingStock = (cartLinked1).train.getTrains().get(j1); + if (daRollingStock instanceof Locomotive) + { + connectedLocomotive = (Locomotive) daRollingStock; + break; + } + } + } + } + else + { + connectedLocomotive = null; + } + + dataWatcher.updateObject(29, connectedLocomotive == null ? 0 : connectedLocomotive.getEntityId()); + } + else + { + //Client side stuff. + } + handleTrainMovement(); + if (whistleDelay > 0) + { + whistleDelay--; + } + + super.onUpdate(); + if (!worldObj.isRemote) + { + dataWatcher.updateObject(28, lightingDetailsJSONString()); + } + } + + public void soundHorn() + { + for (EnumSounds sounds : EnumSounds.values()) + { + if (sounds.getEntityClass() != null && sounds.getEntityClass().equals(this.getClass()) && whistleDelay == 0) + { + worldObj.playSoundAtEntity(this, Info.resourceLocation + ":" + sounds.getHornString(), sounds.getHornVolume(), 1.0F); + whistleDelay = 65; + } + } + List entities = worldObj.getEntitiesWithinAABB(EntityAnimal.class, AxisAlignedBB.getBoundingBox( + this.posX-20,this.posY-5,this.posZ-20, + this.posX+20,this.posY+5,this.posZ+20)); + + for(Object e : entities) + { + if(e instanceof EntityAnimal) + { + ((EntityAnimal) e).setTarget(this); + ((EntityAnimal) e).getNavigator().setPath(null, 0); + } + } + } + @Override + public void updateRiderPosition() + { + if(riddenByEntity!=null) + { + riddenByEntity.setPosition(posX, posY + getMountedYOffset() + riddenByEntity.getYOffset() + 0.2, posZ); + } + } + + @Override + public void pressKey(int i) + { + if (i == 7 && riddenByEntity != null && riddenByEntity instanceof EntityPlayer) + { + ((EntityPlayer) riddenByEntity).openGui(Traincraft.instance, GuiIDs.CONTROL_CAR, worldObj, (int) this.posX, (int) this.posY, (int) this.posZ); + } + } + + @Override + public void setDead() + { + super.setDead(); + isDead = true; + } + + public boolean isNotOwner() { + if (this.riddenByEntity instanceof EntityPlayer && !((EntityPlayer) this.riddenByEntity).getDisplayName().equalsIgnoreCase(this.getTrainOwner())) { + return true; + } + if (this.seats.size() > 0 && this.seats.get(0).getPassenger() instanceof EntityPlayer && !((EntityPlayer) this.seats.get(0).getPassenger()).getDisplayName().equalsIgnoreCase(this.getTrainOwner())) { + return true; + } + return false; + } + + + //I'm moving this to a separate function because it's really, really thick, and I want to try to make things look neater. + public void handleTrainMovement() + { + if (worldObj.isRemote) + { + if (ticksExisted % 2 == 0 && !Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatOpen()) + { + + if (Keyboard.isKeyDown(FMLClientHandler.instance().getClient().gameSettings.keyBindForward.getKeyCode()) + && !forwardPressed) + { + Traincraft.keyChannel.sendToServer(new PacketKeyPress(4)); + forwardPressed = true; + } + else if (!Keyboard + .isKeyDown(FMLClientHandler.instance().getClient().gameSettings.keyBindForward.getKeyCode()) + && forwardPressed) + { + Traincraft.keyChannel.sendToServer(new PacketKeyPress(13)); + forwardPressed = false; + } + + if (Keyboard.isKeyDown(FMLClientHandler.instance().getClient().gameSettings.keyBindBack.getKeyCode()) + && !backwardPressed) + { + Traincraft.keyChannel.sendToServer(new PacketKeyPress(5)); + backwardPressed = true; + } + else if (!Keyboard + .isKeyDown(FMLClientHandler.instance().getClient().gameSettings.keyBindBack.getKeyCode()) + && backwardPressed) + { + Traincraft.keyChannel.sendToServer(new PacketKeyPress(14)); + backwardPressed = false; + } + + if (Keyboard.isKeyDown(FMLClientHandler.instance().getClient().gameSettings.keyBindJump.getKeyCode()) + && !brakePressed) + { + Traincraft.keyChannel.sendToServer(new PacketKeyPress(12)); + brakePressed = true; + } + else if (!Keyboard + .isKeyDown(FMLClientHandler.instance().getClient().gameSettings.keyBindJump.getKeyCode()) + && brakePressed) + { + Traincraft.keyChannel.sendToServer(new PacketKeyPress(15)); + brakePressed = false; + } + } + } + else + { + //Server stuff. + if (connectedLocomotive != null) + { + if (forwardPressed || backwardPressed) + { + if (connectedLocomotive.getFuel() > 0 && connectedLocomotive.isLocoTurnedOn() && rand.nextInt(4) == 0 && !worldObj.isRemote) + { + if (this.getTrainLockedFromPacket() && !((EntityPlayer) this.riddenByEntity).getDisplayName() + .toLowerCase().equals(this.getTrainOwner().toLowerCase())) + { + return; + } + if (riddenByEntity != null && riddenByEntity instanceof EntityPlayer) + { + int dir = MathHelper + .floor_double((((EntityPlayer) riddenByEntity).rotationYaw * 4F) / 360F + 0.5D) & 3; + //System.out.println(dir); + if (dir == 2) + { + if (forwardPressed) + { + connectedLocomotive.motionZ -= 0.0075 * this.accelerate; + //System.out.println("A"); + } + else + { + connectedLocomotive.motionZ += 0.0075 * this.accelerate; + //System.out.println("B"); + } + } + else if (dir == 0) + { + if (forwardPressed) + { + connectedLocomotive.motionZ += 0.0075 * this.accelerate; + //System.out.println("C"); + } + else + { + connectedLocomotive.motionZ -= 0.0075 * this.accelerate; + //System.out.println("D"); + } + } + else if (dir == 1) + { + if (forwardPressed) + { + connectedLocomotive.motionX -= 0.0075 * this.accelerate; + //System.out.println("E"); + } + else + { + connectedLocomotive.motionX += 0.0075 * this.accelerate; + //System.out.println("F"); + } + } + else + { + if (forwardPressed) + { + connectedLocomotive.motionX += 0.0075 * this.accelerate; + //System.out.println("G"); + } + else + { + connectedLocomotive.motionX -= 0.0075 * this.accelerate; + //System.out.println("H"); + } + } + } + } + } + else if (brakePressed) + { + connectedLocomotive.motionX *= brake; + connectedLocomotive.motionZ *= brake; + } + } + } + } + + @Override + public void keyHandlerFromPacket(int i) + { + if (this.getTrainLockedFromPacket()) + { + if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer + && !((EntityPlayer) this.riddenByEntity).getDisplayName().toLowerCase() + .equals(this.getTrainOwner().toLowerCase())) + { + return; + } + } + pressKey(i); + if (i == 8 && ConfigHandler.SOUNDS) { + soundHorn(); + } + if (i == 4) { + forwardPressed = true; + } + if (i == 5) { + backwardPressed = true; + } + if (i == 12) { + brakePressed = true; + } + if (i == 13) { + forwardPressed = false; + } + if (i == 14) { + backwardPressed = false; + } + if (i == 15) { + brakePressed = false; + } + } + + public String lightingDetailsJSONString() + { + JsonObject lightingDetailsJSONString = new JsonObject(); + lightingDetailsJSONString.addProperty(DataMemberName.isLightsEnabled.AsString(), isLightsEnabled); + lightingDetailsJSONString.addProperty(DataMemberName.isBeaconEnabled.AsString(), isBeaconEnabled); + lightingDetailsJSONString.addProperty(DataMemberName.beaconCycleIndex.AsString(), beaconCycleIndex); + lightingDetailsJSONString.addProperty(DataMemberName.ditchLightMode.AsString(), ditchLightMode); + return lightingDetailsJSONString.toString(); + } + + public JsonObject lightingDetailsAsJSON() + { + JsonObject lightingDetailsJSON = new JsonObject(); + lightingDetailsJSON.addProperty(DataMemberName.isLightsEnabled.AsString(), isLightsEnabled); + lightingDetailsJSON.addProperty(DataMemberName.isBeaconEnabled.AsString(), isBeaconEnabled); + lightingDetailsJSON.addProperty(DataMemberName.beaconCycleIndex.AsString(), beaconCycleIndex); + lightingDetailsJSON.addProperty(DataMemberName.ditchLightMode.AsString(), ditchLightMode); + return lightingDetailsJSON; + } + + /** + * + * @param isLightsOn set 0 if lights is false, 1 if true + */ + public void setPacketLights(boolean isLightsOn) + { + isLightsEnabled = isLightsOn; + } + + /** + * + * @param isBeaconOn set 0 if beacon is false, 1 if true + */ + public void setPacketBeacon(boolean isBeaconOn) + { + isBeaconEnabled = isBeaconOn; + } + + /**Sets the Ditch light mode + * + * @param ditchLightMode set 0 for off, + */ + public void setPacketDitchLightsMode(byte ditchLightMode) + { + this.ditchLightMode = ditchLightMode; + } + + public int getLocomotiveBeingControlledEntityID() + { + return dataWatcher.getWatchableObjectInt(29); + } + + public boolean isLightsEnabled() + { + return AsJsonObject(dataWatcher.getWatchableObjectString(28)).get(DataMemberName.isLightsEnabled.AsString()).getAsBoolean(); + } + + public boolean isBeaconEnabled() + { + return AsJsonObject(dataWatcher.getWatchableObjectString(28)).get(DataMemberName.isBeaconEnabled.AsString()).getAsBoolean(); + } + + public byte getBeaconCycleIndex() + { + return AsJsonObject(dataWatcher.getWatchableObjectString(28)).get(DataMemberName.beaconCycleIndex.AsString()).getAsByte(); + } + + public boolean isDitchLightsEnabled() + { + return AsJsonObject(dataWatcher.getWatchableObjectString(28)).get(DataMemberName.ditchLightMode.AsString()).getAsByte() > 0; + } + + private JsonObject AsJsonObject(String string) + { + return new JsonParser().parse(string).getAsJsonObject(); + } + + @Override + public boolean isPoweredCart() { + return false; + } + + + //region Implement IInventory + @Override + public int getSizeInventory() + { + return inventorySize; + } + + @Override + public void markDirty() { } + + @Override + public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { + return false; + } + + @Override + public void openInventory() { + } + + @Override + public void closeInventory() { + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public ItemStack[] getInventory() { + return controlCarInventory; + } + + @Override + public ItemStack getStackInSlot(int i) { + return controlCarInventory[i]; + } + + @Override + public ItemStack getStackInSlotOnClosing(int par1) { + if (this.controlCarInventory[par1] != null) { + ItemStack var2 = this.controlCarInventory[par1]; + this.controlCarInventory[par1] = null; + return var2; + } else { + return null; + } + } + + @Override + public ItemStack decrStackSize(int i, int j) { + if (controlCarInventory[i] != null) { + if (controlCarInventory[i].stackSize <= j) { + ItemStack itemstack = controlCarInventory[i]; + controlCarInventory[i] = null; + return itemstack; + } + ItemStack itemstack1 = controlCarInventory[i].splitStack(j); + if (controlCarInventory[i].stackSize == 0) { + controlCarInventory[i] = null; + } + return itemstack1; + + } else { + return null; + } + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) { + controlCarInventory[i] = itemstack; + if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) + { + itemstack.stackSize = getInventoryStackLimit(); + } + } + + //endregion Implement IInventory +} diff --git a/src/main/java/train/common/core/CommonProxy.java b/src/main/java/train/common/core/CommonProxy.java index ac679b5c3..73d360fc8 100644 --- a/src/main/java/train/common/core/CommonProxy.java +++ b/src/main/java/train/common/core/CommonProxy.java @@ -181,9 +181,12 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int case (GuiIDs.TRAIN_WORKBENCH): return te instanceof TileTrainWbench ? new ContainerTrainWorkbench(player.inventory, player.worldObj, (TileTrainWbench) te) : null; case (GuiIDs.LOCO): - if (entity instanceof EntityRollingStock) { + if (entity instanceof EntityRollingStock) + { return riddenByEntity != null ? new InventoryLoco(riddenByEntity.inventory,(EntityRollingStock)entity) : null; } + case (GuiIDs.CONTROL_CAR): + return riddenByEntity != null ? new InventoryControlCar(riddenByEntity.inventory, (EntityRollingStock) entity) : null; case (GuiIDs.FORNEY): if (entity instanceof EntityRollingStock) { return riddenByEntity != null ? new InventoryForney(player.inventory, (EntityRollingStock) entity) : null; diff --git a/src/main/java/train/common/inventory/InventoryControlCar.java b/src/main/java/train/common/inventory/InventoryControlCar.java new file mode 100644 index 000000000..2052e927d --- /dev/null +++ b/src/main/java/train/common/inventory/InventoryControlCar.java @@ -0,0 +1,105 @@ +package train.common.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import train.common.api.AbstractControlCar; +import train.common.api.EntityRollingStock; + + +public class InventoryControlCar extends Container +{ + private AbstractControlCar controlCar; + private InventoryPlayer player; + private int inventorySize; + + public InventoryControlCar(InventoryPlayer iinventory, EntityRollingStock entityminecart) + { + player = iinventory; + controlCar = (AbstractControlCar) entityminecart; + inventorySize = ((AbstractControlCar) entityminecart).inventorySize; + int i = 1; + + // region Adds the slots for the Control Car + // This Slot is typically the slot for fuel in a locomotive + + // Disabling this slot for the time being until it can either be removed from the GUI or A Special Item goes here + //addSlotToContainer(new Slot((IInventory) entityminecart, 0, 8, 53)); + + for (int j = 0; j < controlCar.numCargoSlots; j++) { + addSlotToContainer(new Slot((IInventory) entityminecart, i, 80 + j * 18, 18)); + i++; + } + for (int k = 0; k < controlCar.numCargoSlots1; k++) { + addSlotToContainer(new Slot((IInventory) entityminecart, i, 80 + k * 18, 36)); + i++; + } + for (int l = 0; l < controlCar.numCargoSlots2; l++) { + addSlotToContainer(new Slot((IInventory) entityminecart, i, 80 + l * 18, 54)); + i++; + } + // endregion Adds the slots for the Control Car + + // region Adds the slots for the player inventory section + for (int i1 = 0; i1 < 3; i1++) + { + for (int k1 = 0; k1 < 9; k1++) + { + addSlotToContainer(new Slot(iinventory, k1 + i1 * 9 + 9, 8 + k1 * 18, 84 + i1 * 18)); + } + } + for (int j1 = 0; j1 < 9; j1++) + { + addSlotToContainer(new Slot(iinventory, j1, 8 + j1 * 18, 142)); + } + // endregion Adds the slots for the player inventory section + } + + @Override + public boolean canInteractWith(EntityPlayer var1) { + return !controlCar.isDead; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + Slot slot = (Slot) inventorySlots.get(i); + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + if (i < inventorySize) + { + if (!mergeItemStack(itemstack1, inventorySize, inventorySlots.size(), true)) + { + return null; + } + } + else if (i > inventorySize) + { + if (!mergeItemStack(itemstack1, 2, inventorySize, false)) + { + return null; + } + } + else if (!mergeItemStack(itemstack1, 2, inventorySize, false)) + { + return null; + } + if (itemstack1.stackSize == 0) + { + slot.putStack(null); + } + else + { + slot.onSlotChanged(); + } + return itemstack1; + } + else + { + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/train/common/library/GuiIDs.java b/src/main/java/train/common/library/GuiIDs.java index 7099dea0e..7be8e391a 100644 --- a/src/main/java/train/common/library/GuiIDs.java +++ b/src/main/java/train/common/library/GuiIDs.java @@ -29,4 +29,5 @@ public class GuiIDs { public static final int FIXED_OVERLAY = 107; public static final int DYNAMIC_OVERLAY = 108; public static final int SEAT_GUI = 109; + public static final int CONTROL_CAR = 110; } \ No newline at end of file