From 585a81ad0c94d909d4d6aabea1e2706c0285d881 Mon Sep 17 00:00:00 2001 From: KeyLime17 Date: Wed, 28 May 2025 18:22:39 -0400 Subject: [PATCH] Carriage Rework, using a network of registered roads --- .../com/zivilon/cinder_loe/CinderLoE.java | 8 +- .../carriage/CarriageDestination.java | 7 +- .../carriage/CarriageDestinationsData.java | 90 ++---- .../cinder_loe/carriage/CarriageRoad.java | 13 +- .../carriage/CarriageRoadRegistry.java | 284 ++++++++++++++++++ .../cinder_loe/carriage/CarriageUtils.java | 7 +- .../command/CommandOpenCarriageMenu.java | 50 ++- .../command/CommandSetDestination.java | 37 ++- .../network/PacketOpenCarriageGui.java | 8 +- 9 files changed, 405 insertions(+), 99 deletions(-) create mode 100644 src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoadRegistry.java diff --git a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java index abbb0f7..5df098f 100644 --- a/src/main/java/com/zivilon/cinder_loe/CinderLoE.java +++ b/src/main/java/com/zivilon/cinder_loe/CinderLoE.java @@ -3,6 +3,7 @@ package com.zivilon.cinder_loe; import com.zivilon.cinder_loe.blocks.*; import com.zivilon.cinder_loe.blocks.plants.cabbageCrop; import com.zivilon.cinder_loe.blocks.plants.onionCrop; +import com.zivilon.cinder_loe.carriage.CarriageRoadRegistry; import com.zivilon.cinder_loe.character.CharacterEventListener; import com.zivilon.cinder_loe.character.CharacterRoleAPI; import com.zivilon.cinder_loe.client.render.*; @@ -338,6 +339,7 @@ public class CinderLoE { registerEntities(); modEventHandler = new CinderEventHandler(); LoEPotions.registerPotions(); + CarriageRoadRegistry.init(); } @Mod.EventHandler @@ -590,9 +592,9 @@ public class CinderLoE { dough = new LOTRItemFood(1,0.0f, false).setPotionEffect(Potion.hunger.id, 5,0,100).setUnlocalizedName("lotr:dough").setTextureName("lotr:dough"); pasta = new LOTRItemFood(2,0.0f, false).setPotionEffect(Potion.hunger.id, 5,0,100).setUnlocalizedName("lotr:pasta").setTextureName("lotr:pasta"); pretzel = new LOTRItemFood(4,1.0f, false).setUnlocalizedName("lotr:pretzel").setTextureName("lotr:pretzel"); - halva = new LOTRItemFood (7, 3.0f, false).setUnlocalizedName("lotr:halva").setTextureName("lotr:halva"); - doner_kebab = new LOTRItemFood (6, 3.0f, false).setUnlocalizedName("lotr:doner_kebab").setTextureName("lotr:doner_kebab"); - flatbread = new LOTRItemFood (3, 4.0f, false).setUnlocalizedName("lotr:flatbread").setTextureName("lotr:flatbread"); + halva = new LOTRItemFood (7, 1.0f, false).setUnlocalizedName("lotr:halva").setTextureName("lotr:halva"); + doner_kebab = new LOTRItemFood (8, 1.25f, false).setUnlocalizedName("lotr:doner_kebab").setTextureName("lotr:doner_kebab"); + flatbread = new LOTRItemFood (3, 0.25f, false).setUnlocalizedName("lotr:flatbread").setTextureName("lotr:flatbread"); // honey = new LOTRItemFood(3, 0.4f, false).setPotionEffect(Potion.regeneration.id, 5, 0, 100).setUnlocalizedName("lotr:honey").setTextureName("lotr:honey"); spiceElven = new Item().setUnlocalizedName("lotr:spice_elven").setTextureName("lotr:spice_elven"); spiceHuman = new Item().setUnlocalizedName("lotr:spice_human").setTextureName("lotr:spice_human"); diff --git a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestination.java b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestination.java index 642a78c..31e0ed3 100644 --- a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestination.java +++ b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestination.java @@ -2,13 +2,14 @@ package com.zivilon.cinder_loe.carriage; public class CarriageDestination { public final String name; - public final int x, y, z; - public final int dimension; - public CarriageDestination(String name, int x, int y, int z, int dimension) { + public final int x, y, z, dimension; + public final String road; + public CarriageDestination(String name, int x, int y, int z, int dimension, String road) { this.name = name; this.x = x; this.y = y; this.z = z; this.dimension = dimension; + this.road = road; } } diff --git a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestinationsData.java b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestinationsData.java index d4afe8c..9283875 100644 --- a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestinationsData.java +++ b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageDestinationsData.java @@ -9,6 +9,7 @@ import net.minecraft.world.storage.MapStorage; import java.util.*; import java.util.function.BiPredicate; +import java.util.stream.Collectors; public class CarriageDestinationsData extends WorldSavedData { public static final String DATA_NAME = "carriage_destinations"; @@ -33,8 +34,8 @@ public class CarriageDestinationsData extends WorldSavedData { int y = tag.getInteger("Y"); int z = tag.getInteger("Z"); int dim = tag.getInteger("Dim"); - int defaultCost = 50; // or whatever default you want - destinations.put(name, new CarriageDestination(name, x, y, z, dim)); + String road = tag.getString("Road"); + destinations.put(name, new CarriageDestination(name, x, y, z, dim, road)); } } @@ -49,6 +50,7 @@ public class CarriageDestinationsData extends WorldSavedData { tag.setInteger("Y", dest.y); tag.setInteger("Z", dest.z); tag.setInteger("Dim", dest.dimension); + String road = tag.getString("Road"); list.appendTag(tag); } nbt.setTag("Destinations", list); @@ -60,7 +62,7 @@ public class CarriageDestinationsData extends WorldSavedData { } public Map getDestinations() { - return destinations; + return Collections.unmodifiableMap(destinations); } public static CarriageDestinationsData get(World world) { @@ -76,73 +78,37 @@ public class CarriageDestinationsData extends WorldSavedData { return null; } - public List getNearestFour(double px, double pz) { - double skipRadius = 100; - Set picked = new HashSet<>(); - List result = new ArrayList<>(4); + /** + * Return up to four nearest destinations reachable via the + * same road network as the point (px, pz). Only destinations whose + * road is connected (directly or indirectly) to the start road + * will be considered. Distances under skipRadius are skipped. + */ - // north - CarriageDestination best = null; - double bestDist = Double.MAX_VALUE; - for (CarriageDestination d : destinations.values()) { - if (picked.contains(d)) continue; - double dx = d.x - px, dz = d.z - pz; - double dist = Math.sqrt(dx*dx + dz*dz); - if (dist < skipRadius || dz >= 0) continue; - double measure = Math.abs(dz); - if (measure < bestDist) { bestDist = measure; best = d; } - } - if (best != null) { picked.add(best); result.add(best); } + public List getNearestFour(double px, double pz, String startRoadId, CarriageRoadRegistry network) { + final double skipRadius = 100; - // south - best = null; bestDist = Double.MAX_VALUE; - for (CarriageDestination d : destinations.values()) { - if (picked.contains(d)) continue; - double dx = d.x - px, dz = d.z - pz; - double dist = Math.sqrt(dx*dx + dz*dz); - if (dist < skipRadius || dz <= 0) continue; - if (dz < bestDist) { bestDist = dz; best = d; } - } - if (best != null) { picked.add(best); result.add(best); } + // List of roads included, disconnected regions like Gulfen will not magically travel across the desert + Set allowedRoads = network.reachableRoadIds(startRoadId); - // east - best = null; bestDist = Double.MAX_VALUE; - for (CarriageDestination d : destinations.values()) { - if (picked.contains(d)) continue; - double dx = d.x - px, dz = d.z - pz; - double dist = Math.sqrt(dx*dx + dz*dz); - if (dist < skipRadius || dx <= 0) continue; - if (dx < bestDist) { bestDist = dx; best = d; } - } - if (best != null) { picked.add(best); result.add(best); } + List pool = destinations.values().stream() + .filter(d -> allowedRoads.contains(d.road)) + .collect(Collectors.toList()); - // west - best = null; bestDist = Double.MAX_VALUE; - for (CarriageDestination d : destinations.values()) { - if (picked.contains(d)) continue; + // Sort by distance from player + pool.sort(Comparator.comparingDouble(d -> { double dx = d.x - px, dz = d.z - pz; - double dist = Math.sqrt(dx*dx + dz*dz); - if (dist < skipRadius || dx >= 0) continue; - double measure = Math.abs(dx); - if (measure < bestDist) { bestDist = measure; best = d; } - } - if (best != null) { picked.add(best); result.add(best); } - - // fill remaining slots - List sorted = new ArrayList<>(destinations.values()); - sorted.sort(Comparator.comparingDouble(d -> { - double dx = d.x - px, dz = d.z - pz; - return Math.sqrt(dx*dx + dz*dz); + return Math.hypot(dx, dz); })); - for (CarriageDestination d : sorted) { - if (result.size() >= 4) break; + + // Pick up to 4, skip within radius + List result = new ArrayList<>(4); + for (CarriageDestination d : pool) { double dx = d.x - px, dz = d.z - pz; - double dist = Math.sqrt(dx*dx + dz*dz); + double dist = Math.hypot(dx, dz); if (dist < skipRadius) continue; - if (!picked.contains(d)) { - picked.add(d); - result.add(d); - } + result.add(d); + if (result.size() == 4) break; } return result; diff --git a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoad.java b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoad.java index deb1beb..34fff72 100644 --- a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoad.java +++ b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoad.java @@ -1,14 +1,19 @@ package com.zivilon.cinder_loe.carriage; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CarriageRoad { - String name; - List neighbors; - List destinations; + public final String name; + public final List neighbors = new ArrayList<>(); + public final List destinations = new ArrayList<>(); + + public CarriageRoad(String name) { + this.name = name; + } } -Map roads = new HashMap<>(); + diff --git a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoadRegistry.java b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoadRegistry.java new file mode 100644 index 0000000..fca7bf3 --- /dev/null +++ b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageRoadRegistry.java @@ -0,0 +1,284 @@ +package com.zivilon.cinder_loe.carriage; + +import cpw.mods.fml.common.FMLLog; +import org.apache.logging.log4j.Level; + +import java.util.*; + +public class CarriageRoadRegistry { + public static final CarriageRoadRegistry INSTANCE = new CarriageRoadRegistry(); + private static final Map roads = new HashMap<>(); + + public static void init() { + FMLLog.log(Level.INFO, "[CinderLoE] Initializing carriage road registry…"); + FMLLog.log(Level.INFO, "[CinderLoE] Registered %d roads", roads.size()); + // create roads + for (String id : Arrays.asList( + "sea", + // North West + "shire","bree","tharbad","fornost","lonelands", + "towerhills","mithlond","bluedwarf", + "longdaer", "eregion", "enedwaith", + // Vales of Anduin + "anduin", "lothlorien", "dolguldur", "greenwood", "mirkwood", "brownlands", "greymountain", + // The East + "erebor", "dale", "ironhills", "wilderland", "rhun", "rhudel", "dorwinion", + //Mordor + "gorgoroth", "sauronsroad", "morgulvale", "nurn", "eastdesolation", + //Centerlands + "isen", "rohan", "wold", "anorien","ithilien", "lebennin", "dolamroth", "lamedon", + //Harad + "harondor", "khand", "harnennor", "southron", "umbar", "southgulf", "northgulf", + //Far Harad + "southjungle", "taurelonde", "centerjungle", "northjungle", "mangrove", "halftroll" + + )) { + roads.put(id, new CarriageRoad(id)); + } + + // link neighbors + // North West + roads.get("shire").neighbors.addAll(Arrays.asList( + roads.get("bree"), + roads.get("towerhills")) + ); + roads.get("enedwaith").neighbors.addAll(Arrays.asList( + roads.get("tharbad"), + roads.get("isen")) + ); + roads.get("bree").neighbors.addAll(Arrays.asList( + roads.get("shire"), + roads.get("lonelands"), + roads.get("fornost"), + roads.get("tharbad")) + ); + roads.get("lonelands").neighbors.addAll(Arrays.asList( + roads.get("bree"), + roads.get("anduin")) + ); + roads.get("fornost").neighbors.add( + roads.get("bree") + ); + roads.get("tharbad").neighbors.addAll(Arrays.asList( + roads.get("bree"), + roads.get("longdaer"), + roads.get("eregion"), + roads.get("enedwaith")) + ); + roads.get("towerhills").neighbors.add( + roads.get("mithlond") + ); + roads.get("mithlond").neighbors.addAll(Arrays.asList( + roads.get("towerhills"), + roads.get("bluedwarf")) + ); + roads.get("bluedwarf").neighbors.add( + roads.get("mithlond") + ); + //Vales of Anduin + roads.get("anduin").neighbors.addAll(Arrays.asList( + roads.get("lonelands"), + roads.get("greymountain"), + roads.get("brownlands"), + roads.get("dolguldur")) + ); + roads.get("mirkwood").neighbors.addAll(Arrays.asList( + roads.get("anduin"), + roads.get("dale")) + ); + roads.get("greenwood").neighbors.add( + roads.get("anduin") + ); + roads.get("dolguldur").neighbors.addAll(Arrays.asList( + roads.get("brownlands"), + roads.get("anduin")) + ); + roads.get("brownlands").neighbors.addAll(Arrays.asList( + roads.get("gorgoroth"), + roads.get("anduin"), + roads.get("wilderland"), + roads.get("ithilien"), + roads.get("dolguldur")) + ); + roads.get("greymountain").neighbors.add( + roads.get("anduin") + ); + // The East + roads.get("dale").neighbors.addAll(Arrays.asList( + roads.get("erebor"), + roads.get("ironhills"), + roads.get("wilderland"), + roads.get("rhun")) + ); + roads.get("rhudel").neighbors.addAll(Arrays.asList( + roads.get("dorwinion"), + roads.get("sauronsroad"), + roads.get("rhun")) + ); + roads.get("rhun").neighbors.addAll(Arrays.asList( + roads.get("dale"), + roads.get("rhudel")) + ); + roads.get("dorwinion").neighbors.addAll(Arrays.asList( + roads.get("wilderland"), + roads.get("rhudel")) + ); + roads.get("wilderland").neighbors.addAll(Arrays.asList( + roads.get("brownlands"), + roads.get("dorwinion"), + roads.get("dale")) + ); + roads.get("erebor").neighbors.add( + roads.get("dale") + ); + roads.get("ironhills").neighbors.add( + roads.get("dale") + ); + //Mordor + roads.get("sauronsroad").neighbors.addAll(Arrays.asList( + roads.get("brownlands"), + roads.get("rhudel"), + roads.get("khand"), + roads.get("ithilien"), + roads.get("gorgoroth")) + ); + roads.get("gorgoroth").neighbors.addAll(Arrays.asList( + roads.get("brownlands"), + roads.get("sauronsroad"), + roads.get("morgulvale"), + roads.get("nurn")) + ); + roads.get("morgulvale").neighbors.addAll(Arrays.asList( + roads.get("ithilien"), + roads.get("gorgoroth")) + ); + roads.get("nurn").neighbors.add( + roads.get("gorgoroth") + ); + //Centerlands + roads.get("anorien").neighbors.addAll(Arrays.asList( + roads.get("rohan"), + roads.get("lebennin"), + roads.get("ithilien")) + ); + roads.get("lebennin").neighbors.addAll(Arrays.asList( + roads.get("anorien"), + roads.get("dolamroth"), + roads.get("lamedon"), + roads.get("ithilien")) + ); + roads.get("dolamroth").neighbors.add( + roads.get("lebennin") + ); + roads.get("lamedon").neighbors.add( + roads.get("lebennin") + ); + roads.get("rohan").neighbors.addAll(Arrays.asList( + roads.get("wold"), + roads.get("anorien"), + roads.get("isen")) + ); + roads.get("wold").neighbors.add( + roads.get("rohan") + ); + roads.get("isen").neighbors.addAll(Arrays.asList( + roads.get("enedwaith"), + roads.get("rohan")) + ); + + roads.get("ithilien").neighbors.addAll(Arrays.asList( + roads.get("anorien"), + roads.get("lebennin"), + roads.get("harondor"), + roads.get("sauronsroad"), + roads.get("morgulvale")) + ); + //Harad + roads.get("northgulf").neighbors.add( + roads.get("southgulf") + ); + roads.get("southgulf").neighbors.add( + roads.get("northgulf") + ); + roads.get("southron").neighbors.add( + roads.get("umbar") + ); + roads.get("umbar").neighbors.addAll(Arrays.asList( + roads.get("harnennor"), + roads.get("southron")) + ); + roads.get("harnennor").neighbors.addAll(Arrays.asList( + roads.get("harondor"), + roads.get("khand"), + roads.get("umbar")) + ); + roads.get("harondor").neighbors.addAll(Arrays.asList( + roads.get("harnennor"), + roads.get("ithilien")) + ); + roads.get("khand").neighbors.addAll(Arrays.asList( + roads.get("harnennor"), + roads.get("sauronsroad")) + ); + //Far Harad + roads.get("centerjungle").neighbors.addAll(Arrays.asList( + roads.get("southjungle"), + roads.get("northjungle"), + roads.get("mangrove"), + roads.get("taurelonde"), + roads.get("halftroll")) + ); + roads.get("taurelonde").neighbors.addAll(Arrays.asList( + roads.get("centerjungle"), + roads.get("northjungle")) + ); + roads.get("northjungle").neighbors.addAll(Arrays.asList( + roads.get("mangrove"), + roads.get("centerjungle"), + roads.get("taurelonde"), + roads.get("halftroll")) + ); + roads.get("mangrove").neighbors.addAll(Arrays.asList( + roads.get("northjungle"), + roads.get("centerjungle"), + roads.get("halftroll")) + ); + roads.get("halftroll").neighbors.addAll(Arrays.asList( + roads.get("northjungle"), + roads.get("centerjungle"), + roads.get("mangrove")) + ); + roads.get("southjungle").neighbors.add( + roads.get("centerjungle") + ); + + } + public static CarriageRoad getRoad(String name) { + return roads.get(name); + } + + public static Collection allRoads() { + return roads.values(); + } + + public static Set reachableRoadIds(String startRoadId) { + Set seen = new HashSet<>(); + Deque queue = new ArrayDeque<>(); + queue.add(startRoadId); + seen.add(startRoadId); + + while (!queue.isEmpty()) { + String current = queue.removeFirst(); + CarriageRoad road = CarriageRoadRegistry.getRoad(current); + if (road == null) continue; + for (CarriageRoad nbr : road.neighbors) { + if (seen.add(nbr.name)) { + queue.addLast(nbr.name); + } + } + } + + return seen; + } + +} diff --git a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageUtils.java b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageUtils.java index 3bfe4fc..faa7dde 100644 --- a/src/main/java/com/zivilon/cinder_loe/carriage/CarriageUtils.java +++ b/src/main/java/com/zivilon/cinder_loe/carriage/CarriageUtils.java @@ -80,8 +80,13 @@ public class CarriageUtils { } public static int calculateCost(double playerX, double playerZ, CarriageDestination dest) { + if (dest.road.equals("sea")) { + double dist = Math.sqrt(Math.pow(dest.x - playerX, 2) + Math.pow(dest.z - playerZ, 2)); + int cost = 500 + Math.max(1, (int)(dist / 500)); // replace 10 with another hardcoded value + return cost; + } double dist = Math.sqrt(Math.pow(dest.x - playerX, 2) + Math.pow(dest.z - playerZ, 2)); - int cost = Math.max(1, (int)(dist / 50)); // replace 10 with another hardcoded value + int cost = Math.max(1, (int)(dist / 100)); // replace 10 with another hardcoded value return cost; } diff --git a/src/main/java/com/zivilon/cinder_loe/command/CommandOpenCarriageMenu.java b/src/main/java/com/zivilon/cinder_loe/command/CommandOpenCarriageMenu.java index 81bf2a8..87bf57d 100644 --- a/src/main/java/com/zivilon/cinder_loe/command/CommandOpenCarriageMenu.java +++ b/src/main/java/com/zivilon/cinder_loe/command/CommandOpenCarriageMenu.java @@ -2,6 +2,7 @@ package com.zivilon.cinder_loe.command; import com.zivilon.cinder_loe.carriage.CarriageDestination; import com.zivilon.cinder_loe.carriage.CarriageDestinationsData; +import com.zivilon.cinder_loe.carriage.CarriageRoadRegistry; import com.zivilon.cinder_loe.network.PacketOpenCarriageGui; import lotr.common.network.LOTRPacketHandler; import net.minecraft.command.CommandBase; @@ -26,27 +27,54 @@ public class CommandOpenCarriageMenu extends CommandBase { } @Override - public void processCommand(ICommandSender sender, String[] args) { + public void processCommand(ICommandSender sender, String[] args) throws CommandException { if (!(sender instanceof EntityPlayerMP)) { throw new CommandException("Must be run by a player."); } - EntityPlayerMP player = (EntityPlayerMP) sender; World world = player.worldObj; CarriageDestinationsData data = CarriageDestinationsData.get(world); - List nearest = data.getNearestFour(player.posX, player.posZ); + if (data == null) { + throw new CommandException("Carriage data unavailable."); + } + + // 1) first get the absolute nearest stops, ignoring roads + List rawNearby = data.getNearestFour(player.posX, player.posZ, "", CarriageRoadRegistry.INSTANCE); + if (rawNearby.isEmpty()) { + throw new CommandException("No nearby carriage stops found."); + } + + // 2) grab the road of the very nearest + String startRoad = rawNearby.get(0).road; + + // 3) now get up to 4 stops on that road and its neighbors + List nearest = data.getNearestFour( + player.posX, player.posZ, + startRoad, + /* pass your registry singleton, not `new` */ CarriageRoadRegistry.INSTANCE + ); + // if you don’t have an instance() method, just call the static methods inside getNearestFour + + if (nearest.isEmpty()) { + throw new CommandException("No stops on your road or its neighbors."); + } - List names = new ArrayList<>(); - List costs = new ArrayList<>(); + // 4) build your packet + List names = new ArrayList<>(); + List costs = new ArrayList<>(); + List roads = new ArrayList<>(); - for (CarriageDestination dest : nearest) { - double dist = Math.sqrt(Math.pow(dest.x - player.posX, 2) + Math.pow(dest.z - player.posZ, 2)); - int cost = Math.max(1, (int)(dist / 50)); - names.add(dest.name); - costs.add(cost); + for (CarriageDestination d : nearest) { + double dx = d.x - player.posX; + double dz = d.z - player.posZ; + int cost = Math.max(1, (int)(Math.hypot(dx, dz) / 50)); + names .add(d.name); + costs .add(cost); + roads .add(d.road); } - LOTRPacketHandler.networkWrapper.sendTo(new PacketOpenCarriageGui(names, costs), player); + LOTRPacketHandler.networkWrapper + .sendTo(new PacketOpenCarriageGui(names, costs, roads), player); } } diff --git a/src/main/java/com/zivilon/cinder_loe/command/CommandSetDestination.java b/src/main/java/com/zivilon/cinder_loe/command/CommandSetDestination.java index 91c2c47..3d8c0ea 100644 --- a/src/main/java/com/zivilon/cinder_loe/command/CommandSetDestination.java +++ b/src/main/java/com/zivilon/cinder_loe/command/CommandSetDestination.java @@ -2,6 +2,7 @@ package com.zivilon.cinder_loe.command; import com.zivilon.cinder_loe.carriage.CarriageDestination; import com.zivilon.cinder_loe.carriage.CarriageDestinationsData; +import com.zivilon.cinder_loe.carriage.CarriageRoadRegistry; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; @@ -20,34 +21,44 @@ public class CommandSetDestination extends CommandBase { @Override public String getCommandUsage(ICommandSender sender) { - return "/set_destination \"Destination Name\""; + return "/set_destination \"Destination Name\" roadId"; } @Override - public void processCommand(ICommandSender sender, String[] args) { - if (args.length < 1) { - throw new WrongUsageException("Usage: /set_destination \"Destination Name\""); + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if (args.length < 2) { + throw new WrongUsageException(getCommandUsage(sender)); } - String name = StringUtils.join(args, " "); - World world = sender.getEntityWorld(); + // last arg is the road ID + String roadId = args[args.length - 1].toLowerCase(); + if (CarriageRoadRegistry.getRoad(roadId) == null) { + throw new CommandException("Unknown road ID: " + roadId); + } + + // everything before is the destination name + String name = StringUtils.join(args, " ", 0, args.length - 1); if (!(sender instanceof EntityPlayerMP)) { throw new CommandException("Must be run by a player."); } EntityPlayerMP player = (EntityPlayerMP) sender; - int x = (int) player.posX; - int y = (int) player.posY; - int z = (int) player.posZ; + World world = player.worldObj; + + int x = (int) Math.floor(player.posX); + int y = (int) Math.floor(player.posY); + int z = (int) Math.floor(player.posZ); int dim = player.dimension; CarriageDestinationsData data = CarriageDestinationsData.get(world); - if (data != null) { - data.addDestination(new CarriageDestination(name, x, y, z, dim)); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Destination '" + name + "' saved.")); - } else { + if (data == null) { throw new CommandException("Failed to access destination storage."); } + + data.addDestination(new CarriageDestination(name, x, y, z, dim, roadId)); + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.YELLOW + "Destination '" + name + "' on road '" + roadId + "' saved." + )); } } diff --git a/src/main/java/com/zivilon/cinder_loe/network/PacketOpenCarriageGui.java b/src/main/java/com/zivilon/cinder_loe/network/PacketOpenCarriageGui.java index e610ca7..3fc7092 100644 --- a/src/main/java/com/zivilon/cinder_loe/network/PacketOpenCarriageGui.java +++ b/src/main/java/com/zivilon/cinder_loe/network/PacketOpenCarriageGui.java @@ -15,12 +15,14 @@ import java.util.List; public class PacketOpenCarriageGui implements IMessage { private List names = new ArrayList<>(); private List costs = new ArrayList<>(); + private List road = new ArrayList<>(); public PacketOpenCarriageGui() {} - public PacketOpenCarriageGui(List names, List costs) { + public PacketOpenCarriageGui(List names, List costs, List road) { this.names = names; this.costs = costs; + this.road = road; } @Override @@ -29,6 +31,7 @@ public class PacketOpenCarriageGui implements IMessage { for (int i = 0; i < names.size(); i++) { ByteBufUtils.writeUTF8String(buf, names.get(i)); buf.writeInt(costs.get(i)); + ByteBufUtils.writeUTF8String(buf, road.get(i)); } } @@ -38,6 +41,7 @@ public class PacketOpenCarriageGui implements IMessage { for (int i = 0; i < count; i++) { names.add(ByteBufUtils.readUTF8String(buf)); costs.add(buf.readInt()); + road.add(ByteBufUtils.readUTF8String(buf)); } } @@ -49,7 +53,7 @@ public class PacketOpenCarriageGui implements IMessage { public void run() { List dests = new ArrayList<>(); for (int i = 0; i < msg.names.size(); i++) { - dests.add(new CarriageDestination(msg.names.get(i), 0, 0, 0, 0)); // dummy pos + dests.add(new CarriageDestination(msg.names.get(i), 0, 0, 0, 0, msg.road.get(i))); // dummy pos } Minecraft.getMinecraft().displayGuiScreen(new GuiCarriageMenu(dests, msg.costs)); }