diff --git a/src/main/java/cam72cam/immersiverailroading/IRItems.java b/src/main/java/cam72cam/immersiverailroading/IRItems.java index 1629ed728..933fba42f 100644 --- a/src/main/java/cam72cam/immersiverailroading/IRItems.java +++ b/src/main/java/cam72cam/immersiverailroading/IRItems.java @@ -5,6 +5,7 @@ public class IRItems { public static ItemRollingStock ITEM_ROLLING_STOCK = new ItemRollingStock(); + public static ItemConsistPlacer ITEM_CONSIST_PLACER = new ItemConsistPlacer(); public static ItemRollingStockComponent ITEM_ROLLING_STOCK_COMPONENT = new ItemRollingStockComponent(); public static ItemLargeWrench ITEM_LARGE_WRENCH = new ItemLargeWrench(); public static ItemHook ITEM_HOOK = new ItemHook(); diff --git a/src/main/java/cam72cam/immersiverailroading/ImmersiveRailroading.java b/src/main/java/cam72cam/immersiverailroading/ImmersiveRailroading.java index fe120fa0a..93b2f0748 100644 --- a/src/main/java/cam72cam/immersiverailroading/ImmersiveRailroading.java +++ b/src/main/java/cam72cam/immersiverailroading/ImmersiveRailroading.java @@ -2,6 +2,7 @@ import cam72cam.immersiverailroading.entity.*; import cam72cam.immersiverailroading.entity.physics.chrono.ServerChronoState; +import cam72cam.immersiverailroading.gui.ConsistPlacerGui; import cam72cam.immersiverailroading.gui.overlay.GuiBuilder; import cam72cam.immersiverailroading.items.ItemPaintBrush; import cam72cam.immersiverailroading.library.GuiTypes; @@ -13,6 +14,7 @@ import cam72cam.immersiverailroading.net.*; import cam72cam.immersiverailroading.registry.DefinitionManager; import cam72cam.immersiverailroading.registry.EntityRollingStockDefinition; +import cam72cam.immersiverailroading.registry.ConsistDefinitionManager; import cam72cam.immersiverailroading.render.SmokeParticle; import cam72cam.immersiverailroading.render.block.RailBaseModel; import cam72cam.immersiverailroading.render.item.*; @@ -85,6 +87,8 @@ public void commonEvent(ModEvent event) { Packet.register(ClientPartDragging.DragPacket::new, PacketDirection.ClientToServer); Packet.register(ClientPartDragging.SeatPacket::new, PacketDirection.ClientToServer); Packet.register(GuiBuilder.ControlChangePacket::new, PacketDirection.ClientToServer); + Packet.register(ConsistPlacerGui.ConsistItemChangePacket::new, PacketDirection.ClientToServer); + Packet.register(ConsistPlacePacket::new, PacketDirection.ClientToServer); Packet.register(ItemPaintBrush.PaintBrushPacket::new, PacketDirection.ClientToServer); ServerChronoState.register(); @@ -135,6 +139,7 @@ public void clientEvent(ModEvent event) { ItemRender.register(IRItems.ITEM_TRACK_BLUEPRINT, new TrackBlueprintItemModel()); ItemRender.register(IRItems.ITEM_ROLLING_STOCK_COMPONENT, new StockItemComponentModel()); ItemRender.register(IRItems.ITEM_ROLLING_STOCK, new StockItemModel()); + ItemRender.register(IRItems.ITEM_CONSIST_PLACER, new Identifier(MODID, "items/consist")); ItemRender.register(IRItems.ITEM_LARGE_WRENCH, ObjItemRender.getModelFor(new Identifier(MODID, "models/item/wrench/wrench.obj"), new Vec3d(0.5, 0, 0.5), 2)); ItemRender.register(IRItems.ITEM_CONDUCTOR_WHISTLE, ObjItemRender.getModelFor(new Identifier(MODID, "models/item/whistle.obj"), new Vec3d(0.5, 0.75, 0.5), 0.1f)); ItemRender.register(IRItems.ITEM_GOLDEN_SPIKE, ObjItemRender.getModelFor(new Identifier(MODID, "models/item/goldenspike/goldenspike.obj"), new Vec3d(0.5, 0.5, 0.5), 0.1f)); @@ -228,6 +233,7 @@ public void postRender(EntityMoveableRollingStock entity, RenderState state, flo Particles.SMOKE = Particle.register(SmokeParticle::new, SmokeParticle::renderAll); ClientPartDragging.register(); + ConsistDefinitionManager.load(); break; case RELOAD: DefinitionManager.initDefinitions(); diff --git a/src/main/java/cam72cam/immersiverailroading/gui/ConsistPlacerGui.java b/src/main/java/cam72cam/immersiverailroading/gui/ConsistPlacerGui.java new file mode 100644 index 000000000..e89119b17 --- /dev/null +++ b/src/main/java/cam72cam/immersiverailroading/gui/ConsistPlacerGui.java @@ -0,0 +1,678 @@ +package cam72cam.immersiverailroading.gui; + +import cam72cam.immersiverailroading.IRItems; +import cam72cam.immersiverailroading.gui.components.ListSelector; +import cam72cam.immersiverailroading.library.GuiTypes; +import cam72cam.immersiverailroading.registry.ConsistDefinition; +import cam72cam.immersiverailroading.registry.ConsistDefinitionManager; +import cam72cam.immersiverailroading.registry.DefinitionManager; +import cam72cam.immersiverailroading.registry.EntityRollingStockDefinition; +import cam72cam.mod.MinecraftClient; +import cam72cam.mod.entity.Player; +import cam72cam.mod.gui.helpers.GUIHelpers; +import cam72cam.mod.gui.screen.Button; +import cam72cam.mod.gui.screen.IScreen; +import cam72cam.mod.gui.screen.IScreenBuilder; +import cam72cam.mod.gui.screen.TextField; +import cam72cam.mod.item.ItemStack; +import cam72cam.mod.net.Packet; +import cam72cam.mod.render.opengl.RenderState; +import cam72cam.mod.serialization.TagField; + +import java.util.*; +import java.util.stream.Collectors; + +public class ConsistPlacerGui implements IScreen { + public static Context context; + private ConsistDefinition current; + + //Main Panel + private Button selection; + private Button newConsist; + private Button editCurrent; + private Button deleteCurrent; + private ListSelector definitionsSelector; + + public ConsistPlacerGui() { + this(MinecraftClient.getPlayer().getHeldItem(Player.Hand.PRIMARY)); + } + + private ConsistPlacerGui(ItemStack stack) { + stack = stack.copy(); + current = ConsistDefinitionManager.getConsistDefinition(stack.getTagCompound().getString("multi_unit")); + if (context == null) { + context = new Context(); + } + context.currentEditing = -1; + context.player = MinecraftClient.getPlayer(); + } + + @Override + public void init(IScreenBuilder screen) { + context.target = Panel.MAIN; + int xtop = -GUIHelpers.getScreenWidth() / 2; + int ytop = -GUIHelpers.getScreenHeight() / 4; + if(context.panel == Panel.EDIT) { + current = context.current; + context.current = null; + context.currentName = null; + context.currentAdditionPage = 0; + } + + selection = new Button(screen, xtop, ytop, 150, 20, "Select Unit Def") { + @Override + public void onClick(Player.Hand hand) { + definitionsSelector.setVisible(!definitionsSelector.isVisible()); + } + }; + ytop += 20; + newConsist = new Button(screen, xtop, ytop, 150, 20, "New MultiUnit") { + @Override + public void onClick(Player.Hand hand) { + context.currentPage = 0; + openEditPanel(); + } + }; + ytop += 20; + editCurrent = new Button(screen, xtop, ytop, 150, 20, "Edit Current") { + @Override + public void onClick(Player.Hand hand) { + context.current = current; + context.currentName = current.getName(); + openEditPanel(); + } + }; + ytop += 20; + deleteCurrent = new Button(screen, xtop, ytop, 150, 20, "Delete Current") { + @Override + public void onClick(Player.Hand hand) { + if ("Confirm Deletion".equals(this.getText())){ + ConsistDefinitionManager.removeConsist(current); + this.setText("Delete Current"); + current = null; + boolean flag = false; + if(definitionsSelector.isVisible()){ + definitionsSelector.setVisible(false); + flag = true; + } + + definitionsSelector = new ListSelector(screen, 150, 200, 20, null, + ConsistDefinitionManager.getValidConsists()) { + @Override + public void onClick(ConsistDefinition option) { + current = option; + if(current != null) { + editCurrent.setVisible(true); + deleteCurrent.setVisible(true); + editCurrent.setEnabled(current.isEditable()); + deleteCurrent.setEnabled(current.isEditable()); + deleteCurrent.setText("Delete Current"); + } + } + }; + if(flag) { + definitionsSelector.setVisible(true); + } + deleteCurrent.setVisible(false); + editCurrent.setVisible(false); + } else { + this.setText("Confirm Deletion"); + } + } + }; + + definitionsSelector = new ListSelector(screen, 150, 200, 20, current, + ConsistDefinitionManager.getValidConsists()) { + @Override + public void onClick(ConsistDefinition option) { + current = option; + if(current != null) { + editCurrent.setVisible(true); + deleteCurrent.setVisible(true); + editCurrent.setEnabled(current.isEditable()); + deleteCurrent.setEnabled(current.isEditable()); + deleteCurrent.setText("Delete Current"); + } + } + }; + + definitionsSelector.setVisible(false); + + if(context.panel == Panel.EDIT) { + definitionsSelector.search(context.mainSearchingName); + definitionsSelector.setPage(context.currentMainPage); + definitionsSelector.setVisible(true); + } + + if(current == null){ + editCurrent.setVisible(false); + deleteCurrent.setVisible(false); + } + context.panel = Panel.MAIN; + } + + private void openEditPanel() { + context.target = Panel.EDIT; + context.currentMainPage = definitionsSelector.getPage(); + context.mainSearchingName = definitionsSelector.getSearching(); + GuiTypes.CONSIST_EDIT.open(context.player); + } + + @Override + public void onEnterKey(IScreenBuilder iScreenBuilder) { + iScreenBuilder.close(); + } + + @Override + public void onClose() { + if (context.target != Panel.MAIN) { + return; + } + if (current != null){ + new ConsistItemChangePacket(current.getName()).sendToServer(); + } + context = null; + } + + @Override + public void draw(IScreenBuilder builder, RenderState state) { + IScreen.super.draw(builder, state); + GUIHelpers.drawRect(0, 0, 150, GUIHelpers.getScreenHeight(), 0xEE000000); + GUIHelpers.drawRect(150, 0, GUIHelpers.getScreenWidth() - 150, GUIHelpers.getScreenHeight(), 0xCC000000); + } + + public static class Context { + public int currentEditing; + public Panel panel; + public Panel target; + public Player player; + public List stockListBuilder; + public int currentPage = 0; + public ConsistDefinition.Stock building; + public ConsistDefinition current; + public String currentName; + public int currentMainPage; + public int currentAdditionPage; + public String mainSearchingName; + public String additionSearchingName; + + public void swapFront(int index) { + if(index - 1 >= 0 && index < stockListBuilder.size()) { + ConsistDefinition.Stock s = stockListBuilder.get(index); + stockListBuilder.set(index, stockListBuilder.get(index - 1)); + stockListBuilder.set(index - 1, s); + } + } + + public void swapBack(int index) { + if(index >= 0 && index + 1 < stockListBuilder.size()) { + ConsistDefinition.Stock s = stockListBuilder.get(index); + stockListBuilder.set(index, stockListBuilder.get(index + 1)); + stockListBuilder.set(index + 1, s); + } + } + + public void duplicate(int index) { + ConsistDefinition.Stock s = stockListBuilder.get(index); + stockListBuilder.add(index, s.copy()); + } + + public int index(int i) { + return currentPage * 7 + i; + } + + public Context() { + this.panel = Panel.MAIN; + this.stockListBuilder = new LinkedList<>(); + } + } + + public static class EditPanel implements IScreen { + private List