From ff2365535317b84b01ed57541fe72bbbf3b9e942 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 13:43:44 -0500 Subject: [PATCH 01/11] Move inventory utils out of main class --- src/main/java/io/github/cccm5/CargoMain.java | 5 +- src/main/java/io/github/cccm5/LoadTask.java | 3 +- src/main/java/io/github/cccm5/UnloadTask.java | 3 +- src/main/java/io/github/cccm5/Utils.java | 125 ---------------- .../github/cccm5/util/CraftInventoryUtil.java | 141 ++++++++++++++++++ 5 files changed, 148 insertions(+), 129 deletions(-) create mode 100644 src/main/java/io/github/cccm5/util/CraftInventoryUtil.java diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 22d8d83..4b896d0 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -7,6 +7,7 @@ import com.degitise.minevid.dtlTraders.guis.items.AGUIItem; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import com.degitise.minevid.dtlTraders.utils.citizens.TraderTrait; +import io.github.cccm5.util.CraftInventoryUtil; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.countercraft.movecraft.craft.Craft; @@ -277,7 +278,7 @@ private void unload(Player player){ assert finalItem!=null; String itemName = finalItem.getMainItem().getItemMeta().getDisplayName() != null && finalItem.getMainItem().getItemMeta().getDisplayName().length() > 0 ? finalItem.getMainItem().getItemMeta().getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); - List invs = Utils.getInventories(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); + List invs = CraftInventoryUtil.getInventories(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); int size = invs.size(); if(size <=0 ){ player.sendMessage(CargoMain.ERROR_TAG + "You have no " + itemName + " on this craft!"); @@ -369,7 +370,7 @@ private void load(Player player){ return; } - List invs = Utils.getInventoriesWithSpace(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); + List invs = CraftInventoryUtil.getInventoriesWithSpace(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); int size = invs.size(); if(size <=0 ){ player.sendMessage(CargoMain.ERROR_TAG + "You don't have any space for " + itemName + " on this craft!"); diff --git a/src/main/java/io/github/cccm5/LoadTask.java b/src/main/java/io/github/cccm5/LoadTask.java index 9db44bf..e20491b 100644 --- a/src/main/java/io/github/cccm5/LoadTask.java +++ b/src/main/java/io/github/cccm5/LoadTask.java @@ -1,6 +1,7 @@ package io.github.cccm5; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import io.github.cccm5.util.CraftInventoryUtil; import net.countercraft.movecraft.craft.PlayerCraft; import org.bukkit.Material; @@ -15,7 +16,7 @@ public LoadTask(PlayerCraft craft, TradableGUIItem item) { } protected void execute() { - List invs = Utils.getInventoriesWithSpace(craft, item.getMainItem(), Material.CHEST, + List invs = CraftInventoryUtil.getInventoriesWithSpace(craft, item.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); Inventory inv = invs.get(0); diff --git a/src/main/java/io/github/cccm5/UnloadTask.java b/src/main/java/io/github/cccm5/UnloadTask.java index a5f34fd..bf6eaa3 100644 --- a/src/main/java/io/github/cccm5/UnloadTask.java +++ b/src/main/java/io/github/cccm5/UnloadTask.java @@ -1,6 +1,7 @@ package io.github.cccm5; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import io.github.cccm5.util.CraftInventoryUtil; import net.countercraft.movecraft.craft.PlayerCraft; import org.bukkit.Material; @@ -14,7 +15,7 @@ public UnloadTask(PlayerCraft craft, TradableGUIItem item) { } public void execute() { - List invs = Utils.getInventories(craft, item.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); + List invs = CraftInventoryUtil.getInventories(craft, item.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); Inventory inv = invs.get(0); int count = 0; for (int i = 0; i < inv.getSize(); i++) { diff --git a/src/main/java/io/github/cccm5/Utils.java b/src/main/java/io/github/cccm5/Utils.java index d8e09a9..d7410b4 100644 --- a/src/main/java/io/github/cccm5/Utils.java +++ b/src/main/java/io/github/cccm5/Utils.java @@ -19,34 +19,6 @@ public class Utils { - private static final Material[] INVENTORY_MATERIALS = new Material[]{Material.CHEST, Material.TRAPPED_CHEST, Material.FURNACE, Material.HOPPER, Material.DROPPER, Material.DISPENSER, Material.BREWING_STAND, Material.BARREL}; - - /** - * Converts a movecraftLocation Object to a bukkit Location Object - * - * @param movecraftLoc the movecraft location to be converted - * @param world the world of the location - * @return the converted location - */ - public static Location movecraftLocationToBukkitLocation(MovecraftLocation movecraftLoc, World world){ - return new Location(world,movecraftLoc.getX(),movecraftLoc.getY(),movecraftLoc.getZ()); - } - - /** - * Converts a list of movecraftLocation Object to a bukkit Location Object - * - * @param movecraftLocations the movecraftLocations to be converted - * @param world the world of the location - * @return the converted location - */ - public static ArrayList movecraftLocationToBukkitLocation(HitBox movecraftLocations, World world){ - ArrayList locations = new ArrayList<>(); - for(MovecraftLocation movecraftLoc : movecraftLocations){ - locations.add(movecraftLocationToBukkitLocation(movecraftLoc,world)); - } - return locations; - } - public static ArrayList getNPCsWithTrait(Class c){ ArrayList npcs = new ArrayList<>(); for(NPCRegistry registry : net.citizensnpcs.api.CitizensAPI.getNPCRegistries()) @@ -55,103 +27,6 @@ public static ArrayList getNPCsWithTrait(Class c){ npcs.add(npc); return npcs; } - - /** - * Gets the first inventory of a lookup material type on a craft holding a specific item, returns null if none found - * an input of null for item searches without checking inventory contents - * - * @param craft the craft to scan - * @param item the item to look for during the scan - * @param lookup the materials to compare against while scanning - * @return the first inventory matching a lookup material on the craft - */ - public static List getInventoriesWithSpace(Craft craft, ItemStack item, Material... lookup){ - boolean test=false; - for(Material m : lookup){ - for(Material compare : INVENTORY_MATERIALS) - if(compare == m){ - test=true; - } - if(!test) - throw new IllegalArgumentException(m + " is not an inventory type"); - } - if(craft == null) - throw new IllegalArgumentException("craft must not be null"); - if(item.getType() == Material.AIR) - throw new IllegalArgumentException("item must not have type Material.AIR"); - ArrayList invs = new ArrayList(); - for(Location loc : movecraftLocationToBukkitLocation(craft.getHitBox(),craft.getWorld())) - for(Material m : lookup){ - boolean foundStack=false; - if(loc.getBlock().getType() == m) - { - Inventory inv = ((InventoryHolder)loc.getBlock().getState()).getInventory(); - if(item==null){ - if (!invs.contains(inv)) { - invs.add(inv); - break; - } - } - for(ItemStack i : inv) - if(i==null || i.getType() == Material.AIR || (i.isSimilar(item) && i.getAmount() < item.getMaxStackSize() )){ - if (!invs.contains(inv)) { - invs.add(inv); - foundStack = true; - break; - } - } - if(foundStack) - break; - } - } - return invs; - } - - /** - * Gets the first inventory of a lookup material type on a craft holding a specific item, returns null if none found - * an input of null for item searches without checking inventory contents - * an input of an ItemStack with type set to Material.AIR for searches for empty space in an inventory - * - * @param craft the craft to scan - * @param item the item to look for during the scan - * @param lookup the materials to compare against while scanning - * @return the first inventory matching a lookup material on the craft - */ - public static List getInventories(Craft craft, ItemStack item, Material... lookup){ - boolean test=false; - for(Material m : lookup){ - for(Material compare : INVENTORY_MATERIALS) - if(compare == m){ - test=true; - } - if(!test) - throw new IllegalArgumentException(m + " is not an inventory type"); - } - if(craft == null) - throw new IllegalArgumentException("craft must not be null"); - ArrayList invs = new ArrayList(); - for(Location loc : movecraftLocationToBukkitLocation(craft.getHitBox(),craft.getWorld())) - for(Material m : lookup){ - boolean foundStack=false; - if(loc.getBlock().getType() == m) - { - Inventory inv = ((InventoryHolder)loc.getBlock().getState()).getInventory(); - if(item==null){ - invs.add(inv); - break; - } - for(ItemStack i : inv) - if((item.getType()==Material.AIR && (i==null || i.getType()==Material.AIR)) || (i!=null && i.isSimilar(item))){ - invs.add(inv); - foundStack=true; - break; - } - if(foundStack) - break; - } - } - return invs; - } diff --git a/src/main/java/io/github/cccm5/util/CraftInventoryUtil.java b/src/main/java/io/github/cccm5/util/CraftInventoryUtil.java new file mode 100644 index 0000000..3dda55f --- /dev/null +++ b/src/main/java/io/github/cccm5/util/CraftInventoryUtil.java @@ -0,0 +1,141 @@ +package io.github.cccm5.util; + +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.craft.Craft; +import net.countercraft.movecraft.util.hitboxes.HitBox; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class CraftInventoryUtil { + private static final Material[] INVENTORY_MATERIALS = new Material[]{Material.CHEST, Material.TRAPPED_CHEST, Material.FURNACE, Material.HOPPER, Material.DROPPER, Material.DISPENSER, Material.BREWING_STAND, Material.BARREL}; + + /** + * Converts a movecraftLocation Object to a bukkit Location Object + * + * @param movecraftLoc the movecraft location to be converted + * @param world the world of the location + * @return the converted location + */ + private static Location movecraftLocationToBukkitLocation(MovecraftLocation movecraftLoc, World world){ + return new Location(world,movecraftLoc.getX(),movecraftLoc.getY(),movecraftLoc.getZ()); + } + + /** + * Converts a list of movecraftLocation Object to a bukkit Location Object + * + * @param movecraftLocations the movecraftLocations to be converted + * @param world the world of the location + * @return the converted location + */ + private static ArrayList movecraftLocationToBukkitLocation(HitBox movecraftLocations, World world){ + ArrayList locations = new ArrayList<>(); + for(MovecraftLocation movecraftLoc : movecraftLocations){ + locations.add(movecraftLocationToBukkitLocation(movecraftLoc,world)); + } + return locations; + } + + /** + * Gets the first inventory of a lookup material type on a craft holding a specific item, returns null if none found + * an input of null for item searches without checking inventory contents + * + * @param craft the craft to scan + * @param item the item to look for during the scan + * @param lookup the materials to compare against while scanning + * @return the first inventory matching a lookup material on the craft + */ + public static List getInventoriesWithSpace(Craft craft, ItemStack item, Material... lookup){ + boolean test=false; + for(Material m : lookup){ + for(Material compare : INVENTORY_MATERIALS) + if(compare == m){ + test=true; + } + if(!test) + throw new IllegalArgumentException(m + " is not an inventory type"); + } + if(craft == null) + throw new IllegalArgumentException("craft must not be null"); + if(item.getType() == Material.AIR) + throw new IllegalArgumentException("item must not have type Material.AIR"); + ArrayList invs = new ArrayList(); + for(Location loc : movecraftLocationToBukkitLocation(craft.getHitBox(),craft.getWorld())) + for(Material m : lookup){ + boolean foundStack=false; + if(loc.getBlock().getType() == m) + { + Inventory inv = ((InventoryHolder)loc.getBlock().getState()).getInventory(); + if(item==null){ + if (!invs.contains(inv)) { + invs.add(inv); + break; + } + } + for(ItemStack i : inv) + if(i==null || i.getType() == Material.AIR || (i.isSimilar(item) && i.getAmount() < item.getMaxStackSize() )){ + if (!invs.contains(inv)) { + invs.add(inv); + foundStack = true; + break; + } + } + if(foundStack) + break; + } + } + return invs; + } + + /** + * Gets the first inventory of a lookup material type on a craft holding a specific item, returns null if none found + * an input of null for item searches without checking inventory contents + * an input of an ItemStack with type set to Material.AIR for searches for empty space in an inventory + * + * @param craft the craft to scan + * @param item the item to look for during the scan + * @param lookup the materials to compare against while scanning + * @return the first inventory matching a lookup material on the craft + */ + public static List getInventories(Craft craft, ItemStack item, Material... lookup){ + boolean test=false; + for(Material m : lookup){ + for(Material compare : INVENTORY_MATERIALS) + if(compare == m){ + test=true; + } + if(!test) + throw new IllegalArgumentException(m + " is not an inventory type"); + } + if(craft == null) + throw new IllegalArgumentException("craft must not be null"); + ArrayList invs = new ArrayList(); + for(Location loc : movecraftLocationToBukkitLocation(craft.getHitBox(),craft.getWorld())) + for(Material m : lookup){ + boolean foundStack=false; + if(loc.getBlock().getType() == m) + { + Inventory inv = ((InventoryHolder)loc.getBlock().getState()).getInventory(); + if(item==null){ + invs.add(inv); + break; + } + for(ItemStack i : inv) + if((item.getType()==Material.AIR && (i==null || i.getType()==Material.AIR)) || (i!=null && i.isSimilar(item))){ + invs.add(inv); + foundStack=true; + break; + } + if(foundStack) + break; + } + } + return invs; + } +} From 879961b9f96f3166b0efd2dde1841317a9cfe0ba Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 13:45:11 -0500 Subject: [PATCH 02/11] Move NPC utils to new class --- src/main/java/io/github/cccm5/CargoMain.java | 5 +++-- .../cccm5/{Utils.java => util/NPCUtil.java} | 19 ++----------------- 2 files changed, 5 insertions(+), 19 deletions(-) rename src/main/java/io/github/cccm5/{Utils.java => util/NPCUtil.java} (53%) diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 4b896d0..6f88f4a 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -8,6 +8,7 @@ import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import com.degitise.minevid.dtlTraders.utils.citizens.TraderTrait; import io.github.cccm5.util.CraftInventoryUtil; +import io.github.cccm5.util.NPCUtil; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.countercraft.movecraft.craft.Craft; @@ -230,7 +231,7 @@ private void unload(Player player){ List nearbyMerchants = new ArrayList<>(); double distance;//, lastScan = scanRange; MovecraftLocation loc = playerCraft.getHitBox().getMidPoint(); - for(NPC npc :Utils.getNPCsWithTrait(CargoTrait.class)){ + for(NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)){ if(!npc.isSpawned()) continue; distance = cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); @@ -310,7 +311,7 @@ private void load(Player player){ List nearbyMerchants = new ArrayList<>(); double distance;//, lastScan = scanRange; MovecraftLocation loc = playerCraft.getHitBox().getMidPoint(); - for(NPC npc :Utils.getNPCsWithTrait(CargoTrait.class)){ + for(NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)){ if(!npc.isSpawned()) continue; distance = cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); diff --git a/src/main/java/io/github/cccm5/Utils.java b/src/main/java/io/github/cccm5/util/NPCUtil.java similarity index 53% rename from src/main/java/io/github/cccm5/Utils.java rename to src/main/java/io/github/cccm5/util/NPCUtil.java index d7410b4..01c51a7 100644 --- a/src/main/java/io/github/cccm5/Utils.java +++ b/src/main/java/io/github/cccm5/util/NPCUtil.java @@ -1,24 +1,12 @@ -package io.github.cccm5; +package io.github.cccm5.util; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCRegistry; import net.citizensnpcs.api.trait.Trait; -import net.countercraft.movecraft.craft.Craft; -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.util.hitboxes.HitBox; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; import java.util.ArrayList; -import java.util.List; - -public class Utils -{ +public class NPCUtil { public static ArrayList getNPCsWithTrait(Class c){ ArrayList npcs = new ArrayList<>(); for(NPCRegistry registry : net.citizensnpcs.api.CitizensAPI.getNPCRegistries()) @@ -27,7 +15,4 @@ public static ArrayList getNPCsWithTrait(Class c){ npcs.add(npc); return npcs; } - - - } From b00d3aa34db842ce1b874131cac5d45ec246a5f6 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 13:45:56 -0500 Subject: [PATCH 03/11] Move tasks to new package --- src/main/java/io/github/cccm5/CargoMain.java | 3 +++ src/main/java/io/github/cccm5/{ => async}/CargoTask.java | 3 ++- src/main/java/io/github/cccm5/{ => async}/LoadTask.java | 3 ++- src/main/java/io/github/cccm5/{ => async}/ProcessingTask.java | 3 ++- src/main/java/io/github/cccm5/{ => async}/UnloadTask.java | 3 ++- 5 files changed, 11 insertions(+), 4 deletions(-) rename src/main/java/io/github/cccm5/{ => async}/CargoTask.java (97%) rename src/main/java/io/github/cccm5/{ => async}/LoadTask.java (98%) rename src/main/java/io/github/cccm5/{ => async}/ProcessingTask.java (97%) rename src/main/java/io/github/cccm5/{ => async}/UnloadTask.java (96%) diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 6f88f4a..8a44322 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -7,6 +7,9 @@ import com.degitise.minevid.dtlTraders.guis.items.AGUIItem; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import com.degitise.minevid.dtlTraders.utils.citizens.TraderTrait; +import io.github.cccm5.async.LoadTask; +import io.github.cccm5.async.ProcessingTask; +import io.github.cccm5.async.UnloadTask; import io.github.cccm5.util.CraftInventoryUtil; import io.github.cccm5.util.NPCUtil; import net.citizensnpcs.api.CitizensAPI; diff --git a/src/main/java/io/github/cccm5/CargoTask.java b/src/main/java/io/github/cccm5/async/CargoTask.java similarity index 97% rename from src/main/java/io/github/cccm5/CargoTask.java rename to src/main/java/io/github/cccm5/async/CargoTask.java index de0e1d1..428fa9a 100644 --- a/src/main/java/io/github/cccm5/CargoTask.java +++ b/src/main/java/io/github/cccm5/async/CargoTask.java @@ -1,6 +1,7 @@ -package io.github.cccm5; +package io.github.cccm5.async; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import io.github.cccm5.CargoMain; import net.countercraft.movecraft.craft.PlayerCraft; import net.countercraft.movecraft.craft.type.CraftType; import net.countercraft.movecraft.util.hitboxes.HitBox; diff --git a/src/main/java/io/github/cccm5/LoadTask.java b/src/main/java/io/github/cccm5/async/LoadTask.java similarity index 98% rename from src/main/java/io/github/cccm5/LoadTask.java rename to src/main/java/io/github/cccm5/async/LoadTask.java index e20491b..c361be1 100644 --- a/src/main/java/io/github/cccm5/LoadTask.java +++ b/src/main/java/io/github/cccm5/async/LoadTask.java @@ -1,6 +1,7 @@ -package io.github.cccm5; +package io.github.cccm5.async; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import io.github.cccm5.CargoMain; import io.github.cccm5.util.CraftInventoryUtil; import net.countercraft.movecraft.craft.PlayerCraft; diff --git a/src/main/java/io/github/cccm5/ProcessingTask.java b/src/main/java/io/github/cccm5/async/ProcessingTask.java similarity index 97% rename from src/main/java/io/github/cccm5/ProcessingTask.java rename to src/main/java/io/github/cccm5/async/ProcessingTask.java index a748938..ce136e6 100644 --- a/src/main/java/io/github/cccm5/ProcessingTask.java +++ b/src/main/java/io/github/cccm5/async/ProcessingTask.java @@ -1,6 +1,7 @@ -package io.github.cccm5; +package io.github.cccm5.async; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import io.github.cccm5.CargoMain; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; diff --git a/src/main/java/io/github/cccm5/UnloadTask.java b/src/main/java/io/github/cccm5/async/UnloadTask.java similarity index 96% rename from src/main/java/io/github/cccm5/UnloadTask.java rename to src/main/java/io/github/cccm5/async/UnloadTask.java index bf6eaa3..a39e027 100644 --- a/src/main/java/io/github/cccm5/UnloadTask.java +++ b/src/main/java/io/github/cccm5/async/UnloadTask.java @@ -1,6 +1,7 @@ -package io.github.cccm5; +package io.github.cccm5.async; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import io.github.cccm5.CargoMain; import io.github.cccm5.util.CraftInventoryUtil; import net.countercraft.movecraft.craft.PlayerCraft; From 784e738556b97b0c9bd620740ac8dedf472af02c Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 14:00:19 -0500 Subject: [PATCH 04/11] Extract config from main class --- src/main/java/io/github/cccm5/CargoMain.java | 152 ++++++++---------- .../java/io/github/cccm5/async/CargoTask.java | 31 ++-- .../java/io/github/cccm5/async/LoadTask.java | 33 ++-- .../io/github/cccm5/async/ProcessingTask.java | 16 +- .../io/github/cccm5/async/UnloadTask.java | 9 +- .../java/io/github/cccm5/config/Config.java | 15 ++ 6 files changed, 124 insertions(+), 132 deletions(-) create mode 100644 src/main/java/io/github/cccm5/config/Config.java diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 8a44322..2909537 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -10,6 +10,7 @@ import io.github.cccm5.async.LoadTask; import io.github.cccm5.async.ProcessingTask; import io.github.cccm5.async.UnloadTask; +import io.github.cccm5.config.Config; import io.github.cccm5.util.CraftInventoryUtil; import io.github.cccm5.util.NPCUtil; import net.citizensnpcs.api.CitizensAPI; @@ -17,6 +18,7 @@ import net.countercraft.movecraft.craft.Craft; import net.countercraft.movecraft.craft.CraftManager; import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.craft.PlayerCraft; import net.milkbowl.vault.economy.Economy; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -38,34 +40,16 @@ import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; + public class CargoMain extends JavaPlugin implements Listener { - public static final String ERROR_TAG = ChatColor.RED + "Error: " + ChatColor.DARK_RED; - public static final String SUCCESS_TAG = ChatColor.DARK_AQUA + "Cargo: " + ChatColor.WHITE; - public static Logger logger; private static Economy economy; private static ArrayList playersInQue; - private static double unloadTax,loadTax; private static CargoMain instance; - private static int delay;//ticks - private static Material SIGN_POST = Material.getMaterial("SIGN_POST"); private static Main dtlTradersPlugin; - private CraftManager craftManager; - private FileConfiguration config; - private boolean cardinalDistance; - private static boolean debug; - private double scanRange; - public void onEnable() { - logger = this.getLogger(); - this.getServer().getPluginManager().registerEvents(this, this); - playersInQue = new ArrayList(); - instance = this; - //************************ - //* Configs * - //************************ - config = getConfig(); + private void loadConfig() { + FileConfiguration config = getConfig(); + config.addDefault("Scan range",100.0); config.addDefault("Transfer delay ticks",300); config.addDefault("Load tax percent", 0.01D); @@ -73,27 +57,35 @@ public void onEnable() { config.addDefault("Cardinal distance",true); config.addDefault("Debug mode",false); config.options().copyDefaults(true); - this.saveConfig(); - scanRange = config.getDouble("Scan range") >= 1.0 ? config.getDouble("Scan range") : 100.0; - delay = config.getInt("Transfer delay ticks"); - loadTax = config.getDouble("Load tax percent")<=1.0 && config.getDouble("Load tax percent")>=0.0 ? config.getDouble("Load tax percent") : 0.01; - unloadTax = config.getDouble("Unload tax percent")<=1.0 && config.getDouble("Unload tax percent")>=0.0 ? config.getDouble("Unload tax percent") : 0.01; - cardinalDistance = config.getBoolean("Cardinal distance"); - debug = config.getBoolean("Debug mode"); + saveConfig(); + + Config.scanRange = config.getDouble("Scan range") >= 1.0 ? config.getDouble("Scan range") : 100.0; + Config.delay = config.getInt("Transfer delay ticks"); + Config.loadTax = config.getDouble("Load tax percent")<=1.0 && config.getDouble("Load tax percent")>=0.0 ? config.getDouble("Load tax percent") : 0.01; + Config.unloadTax = config.getDouble("Unload tax percent")<=1.0 && config.getDouble("Unload tax percent")>=0.0 ? config.getDouble("Unload tax percent") : 0.01; + Config.cardinalDistance = config.getBoolean("Cardinal distance"); + Config.debug = config.getBoolean("Debug mode"); + } + + public void onEnable() { + getServer().getPluginManager().registerEvents(this, this); + playersInQue = new ArrayList<>(); + instance = this; + + loadConfig(); //************************ //* Load Movecraft * //************************ if(getServer().getPluginManager().getPlugin("Movecraft") == null || !getServer().getPluginManager().getPlugin("Movecraft").isEnabled()) { - logger.log(Level.SEVERE, "Movecraft not found or not enabled"); + getLogger().severe("Movecraft not found or not enabled"); getServer().getPluginManager().disablePlugin(this); return; } - craftManager = CraftManager.getInstance(); //************************ //* Load Citizens * //************************ if(getServer().getPluginManager().getPlugin("Citizens") == null || !getServer().getPluginManager().getPlugin("Citizens").isEnabled()) { - logger.log(Level.SEVERE, "Citizens 2.0 not found or not enabled"); + getLogger().severe("Citizens 2.0 not found or not enabled"); getServer().getPluginManager().disablePlugin(this); return; } @@ -103,20 +95,24 @@ public void onEnable() { //* Load Vault * //************************ if (getServer().getPluginManager().getPlugin("Vault") == null || !getServer().getPluginManager().getPlugin("Vault").isEnabled()) { - logger.log(Level.SEVERE, "Vault not found or not enabled"); + getLogger().severe("Vault not found or not enabled"); getServer().getPluginManager().disablePlugin(this); return; } + //************************ + //* Load dtlTraders * + //************************ Plugin traders = getServer().getPluginManager().getPlugin("dtlTraders"); - if (traders == null || !(traders instanceof Main)){ + if (!(traders instanceof Main)){ + getLogger().severe("dtlTraders not found or not enabled"); getServer().getPluginManager().disablePlugin(this); + return; } dtlTradersPlugin = (Main) traders; economy = getServer().getServicesManager().getRegistration(Economy.class).getProvider(); } public void onDisable() { - logger = null; economy = null; instance = null; } @@ -124,7 +120,7 @@ public void onDisable() { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { // Plugin if (command.getName().equalsIgnoreCase("unload")) { if(!(sender instanceof Player)){ - sender.sendMessage(ERROR_TAG + "You need to be a player to execute that command!"); + sender.sendMessage(Config.ERROR_TAG + "You need to be a player to execute that command!"); return true; } unload((Player) sender); @@ -133,7 +129,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (command.getName().equalsIgnoreCase("load")) { if(!(sender instanceof Player)){ - sender.sendMessage(ERROR_TAG + "You need to be a player to execute that command!"); + sender.sendMessage(Config.ERROR_TAG + "You need to be a player to execute that command!"); return true; } load((Player) sender); @@ -142,15 +138,15 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (command.getName().equalsIgnoreCase("cargo")) { if(!sender.hasPermission("Cargo.cargo")){ - sender.sendMessage(ERROR_TAG + "You don't have permission to do that!"); + sender.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return true; } sender.sendMessage(ChatColor.WHITE + "--[ " + ChatColor.DARK_AQUA + " Movecraft Cargo " + ChatColor.WHITE + " ]--"); - sender.sendMessage(ChatColor.DARK_AQUA + "Scan Range: " + ChatColor.WHITE + scanRange + " Blocks"); - sender.sendMessage(ChatColor.DARK_AQUA + "Transfer Delay: " + ChatColor.WHITE + delay + " ticks"); - sender.sendMessage(ChatColor.DARK_AQUA + "Unload Tax: " + ChatColor.WHITE + String.format("%.2f",100*unloadTax) + "%"); - sender.sendMessage(ChatColor.DARK_AQUA + "Load Tax: " + ChatColor.WHITE + String.format("%.2f",100*loadTax) + "%"); - sender.sendMessage(ChatColor.DARK_AQUA + "Distance Type: " + ChatColor.WHITE + (cardinalDistance ? "Cardinal" : "Direct")); + sender.sendMessage(ChatColor.DARK_AQUA + "Scan Range: " + ChatColor.WHITE + Config.scanRange + " Blocks"); + sender.sendMessage(ChatColor.DARK_AQUA + "Transfer Delay: " + ChatColor.WHITE + Config.delay + " ticks"); + sender.sendMessage(ChatColor.DARK_AQUA + "Unload Tax: " + ChatColor.WHITE + String.format("%.2f",100*Config.unloadTax) + "%"); + sender.sendMessage(ChatColor.DARK_AQUA + "Load Tax: " + ChatColor.WHITE + String.format("%.2f",100*Config.loadTax) + "%"); + sender.sendMessage(ChatColor.DARK_AQUA + "Distance Type: " + ChatColor.WHITE + (Config.cardinalDistance ? "Cardinal" : "Direct")); return true; } return false; @@ -187,10 +183,6 @@ public void onSignPlace(SignChangeEvent e){ } - public static boolean isDebug(){ - return debug; - } - public static Economy getEconomy(){ return economy; } @@ -199,35 +191,23 @@ public static List getQue(){ return playersInQue; } - public static double getLoadTax(){ - return loadTax; - } - - public static double getUnloadTax(){ - return unloadTax; - } - - public static int getDelay(){ - return delay; - } - public static CargoMain getInstance(){ return instance; } private void unload(Player player){ if(!player.hasPermission("Cargo.unload")){ - player.sendMessage(ERROR_TAG + "You don't have permission to do that!"); + player.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return; } - Craft playerCraft = craftManager.getCraftByPlayer(player); + PlayerCraft playerCraft = CraftManager.getInstance().getCraftByPlayer(player); if(playersInQue.contains(player)){ - player.sendMessage(ERROR_TAG + "You're already moving cargo!"); + player.sendMessage(Config.ERROR_TAG + "You're already moving cargo!"); return; } if(playerCraft == null){ - player.sendMessage(ERROR_TAG + "You need to be piloting a craft to do that!"); + player.sendMessage(Config.ERROR_TAG + "You need to be piloting a craft to do that!"); return; } //NPC cargoMerchant=null; @@ -237,18 +217,18 @@ private void unload(Player player){ for(NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)){ if(!npc.isSpawned()) continue; - distance = cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); - if( distance <= scanRange){ + distance = Config.cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); + if( distance <= Config.scanRange){ nearbyMerchants.add(npc); } } if(nearbyMerchants.size()==0){ - player.sendMessage(ERROR_TAG + "You need to be within " + scanRange + " blocks of a merchant to use that command!"); + player.sendMessage(Config.ERROR_TAG + "You need to be within " + Config.scanRange + " blocks of a merchant to use that command!"); return; } if(player.getInventory().getItemInMainHand() == null || player.getInventory().getItemInMainHand().getType() == Material.AIR){ - player.sendMessage(ERROR_TAG + "You need to be holding a cargo item to do that!"); + player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } String guiName; @@ -273,7 +253,7 @@ private void unload(Player player){ } } if (finalItem == null || finalItem.getTradePrice() == 0.0) { - player.sendMessage(ERROR_TAG + "You need to be holding a cargo item to do that!"); + player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } @@ -285,29 +265,29 @@ private void unload(Player player){ List invs = CraftInventoryUtil.getInventories(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); int size = invs.size(); if(size <=0 ){ - player.sendMessage(CargoMain.ERROR_TAG + "You have no " + itemName + " on this craft!"); + player.sendMessage(Config.ERROR_TAG + "You have no " + itemName + " on this craft!"); return; } - player.sendMessage(SUCCESS_TAG + "Started unloading cargo"); + player.sendMessage(Config.SUCCESS_TAG + "Started unloading cargo"); playersInQue.add(player); - new UnloadTask(craftManager.getCraftByPlayer(player),finalItem ).runTaskTimer(this,delay,delay); + new UnloadTask(playerCraft,finalItem ).runTaskTimer(this,Config.delay,Config.delay); new ProcessingTask(player, finalItem,size).runTaskTimer(this,0,20); } private void load(Player player){ if(!player.hasPermission("Cargo.load")){ - player.sendMessage(ERROR_TAG + "You don't have permission to do that!"); + player.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return; } - Craft playerCraft = craftManager.getCraftByPlayer(player); + PlayerCraft playerCraft = CraftManager.getInstance().getCraftByPlayer(player); if(playersInQue.contains(player)){ - player.sendMessage(ERROR_TAG + "You're already moving cargo!"); + player.sendMessage(Config.ERROR_TAG + "You're already moving cargo!"); return; } if(playerCraft == null){ - player.sendMessage(ERROR_TAG + "You need to be piloting a craft to do that!"); + player.sendMessage(Config.ERROR_TAG + "You need to be piloting a craft to do that!"); return; } //NPC cargoMerchant=null; @@ -317,19 +297,19 @@ private void load(Player player){ for(NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)){ if(!npc.isSpawned()) continue; - distance = cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); - if( distance <= scanRange){ + distance = Config.cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); + if( distance <= Config.scanRange){ nearbyMerchants.add(npc); } } if(nearbyMerchants.size()==0){ - player.sendMessage(ERROR_TAG + "You need to be within " + scanRange + " blocks of a merchant to use that command!"); + player.sendMessage(Config.ERROR_TAG + "You need to be within " + Config.scanRange + " blocks of a merchant to use that command!"); return; } if(player.getInventory().getItemInMainHand() == null || player.getInventory().getItemInMainHand().getType() == Material.AIR){ - logger.info(player.getInventory().getItemInMainHand().getType().name()); - player.sendMessage(ERROR_TAG + "You need to be holding a cargo item to do that!"); + getLogger().info(player.getInventory().getItemInMainHand().getType().name()); + player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } String guiName; @@ -363,27 +343,27 @@ private void load(Player player){ break; } if (finalItem == null || finalItem.getTradePrice() == 0.0) { - player.sendMessage(ERROR_TAG + "You need to be holding a cargo item to do that!"); + player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } final ItemMeta meta = finalItem.getMainItem().getItemMeta(); String itemName = meta.getDisplayName() != null && meta.getDisplayName().length() > 0 ? meta.getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); - if(!economy.has(player,finalItem.getTradePrice()*(1+loadTax))){ - player.sendMessage(ERROR_TAG + "You don't have enough money to buy any " + itemName + "!"); + if(!economy.has(player,finalItem.getTradePrice()*(1+Config.loadTax))){ + player.sendMessage(Config.ERROR_TAG + "You don't have enough money to buy any " + itemName + "!"); return; } List invs = CraftInventoryUtil.getInventoriesWithSpace(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); int size = invs.size(); if(size <=0 ){ - player.sendMessage(CargoMain.ERROR_TAG + "You don't have any space for " + itemName + " on this craft!"); + player.sendMessage(Config.ERROR_TAG + "You don't have any space for " + itemName + " on this craft!"); return; } playersInQue.add(player); - new LoadTask(craftManager.getCraftByPlayer(player),finalItem ).runTaskTimer(this,delay,delay); + new LoadTask(playerCraft,finalItem).runTaskTimer(this,Config.delay,Config.delay); new ProcessingTask(player, finalItem,size).runTaskTimer(this,0,20); - player.sendMessage(SUCCESS_TAG + "Started loading cargo"); + player.sendMessage(Config.SUCCESS_TAG + "Started loading cargo"); } } diff --git a/src/main/java/io/github/cccm5/async/CargoTask.java b/src/main/java/io/github/cccm5/async/CargoTask.java index 428fa9a..4fe58c7 100644 --- a/src/main/java/io/github/cccm5/async/CargoTask.java +++ b/src/main/java/io/github/cccm5/async/CargoTask.java @@ -2,6 +2,7 @@ import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import io.github.cccm5.CargoMain; +import io.github.cccm5.config.Config; import net.countercraft.movecraft.craft.PlayerCraft; import net.countercraft.movecraft.craft.type.CraftType; import net.countercraft.movecraft.util.hitboxes.HitBox; @@ -16,48 +17,44 @@ public abstract class CargoTask extends BukkitRunnable { protected final Player originalPilot; protected TradableGUIItem item; - // protected Stock stock; - // protected final StockItem item; protected CargoTask(PlayerCraft craft, TradableGUIItem guiItem) { if (craft == null) { throw new IllegalArgumentException("craft must not be null"); - } else if (!(craft instanceof PlayerCraft)) { - throw new IllegalArgumentException("craft must not be a player craft"); - } else - this.craft = (PlayerCraft) craft; + } + this.craft = craft; if (guiItem == null) throw new IllegalArgumentException("item must not be null"); else - this.item = guiItem; - this.originalLocations = craft.getHitBox(); - this.originalPilot = this.craft.getPilot(); + item = guiItem; + originalLocations = craft.getHitBox(); + originalPilot = craft.getPilot(); } @Override public void run() { if (CraftManager.getInstance().getCraftByPlayer(originalPilot) == null) { - if (CargoMain.isDebug()) - CargoMain.logger.info("canceling CargoTask due to missing player/craft"); + if (Config.debug) + CargoMain.getInstance().getLogger().info("canceling CargoTask due to missing player/craft"); CargoMain.getQue().remove(originalPilot); - this.cancel(); + cancel(); return; } - if (this.craft.getPilot() != originalPilot) { + if (craft.getPilot() != originalPilot) { originalPilot.sendMessage("Pilots changed!"); CargoMain.getQue().remove(originalPilot); - this.cancel(); + cancel(); return; } if (craft.getHitBox() != originalLocations) { originalPilot.sendMessage("Blocks moved/changed!"); CargoMain.getQue().remove(originalPilot); - this.cancel(); + cancel(); return; } - if (CargoMain.isDebug()) - CargoMain.logger.info("Running execute method for CargoTask with address " + this + ". Pilot: " + if (Config.debug) + CargoMain.getInstance().getLogger().info("Running execute method for CargoTask with address " + this + ". Pilot: " + originalPilot.getName() + " CraftSize: " + originalLocations.size() + " CraftType: " + craft.getType().getStringProperty(CraftType.NAME) + " StockItem: " + (item.getDisplayName().length() > 0 ? item.getDisplayName() diff --git a/src/main/java/io/github/cccm5/async/LoadTask.java b/src/main/java/io/github/cccm5/async/LoadTask.java index c361be1..b1539f7 100644 --- a/src/main/java/io/github/cccm5/async/LoadTask.java +++ b/src/main/java/io/github/cccm5/async/LoadTask.java @@ -2,6 +2,7 @@ import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import io.github.cccm5.CargoMain; +import io.github.cccm5.config.Config; import io.github.cccm5.util.CraftInventoryUtil; import net.countercraft.movecraft.craft.PlayerCraft; @@ -29,7 +30,7 @@ protected void execute() { ? item.getMainItem().getMaxStackSize() : inv.getItem(i).getMaxStackSize() - inv.getItem(i).getAmount(); if (CargoMain.getEconomy().getBalance(originalPilot) > item.getTradePrice() * maxCount - * (1 + CargoMain.getLoadTax())) { + * (1 + Config.loadTax)) { loaded += maxCount; ItemStack tempItem = item.getMainItem().clone(); tempItem.setAmount(tempItem.getMaxStackSize()); @@ -37,18 +38,18 @@ protected void execute() { } else { maxCount = (int) (CargoMain.getEconomy().getBalance(originalPilot) - / (item.getTradePrice() * (1 + CargoMain.getLoadTax()))); + / (item.getTradePrice() * (1 + Config.loadTax))); this.cancel(); CargoMain.getQue().remove(originalPilot); - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "You ran out of money!"); + originalPilot.sendMessage(Config.SUCCESS_TAG + "You ran out of money!"); if (maxCount <= 0) { - if (CargoMain.isDebug()) { - CargoMain.logger.info("Balance: " + CargoMain.getEconomy().getBalance(originalPilot) + if (Config.debug) { + CargoMain.getInstance().getLogger().info("Balance: " + CargoMain.getEconomy().getBalance(originalPilot) + ". maxCount: " + maxCount + "."); } - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "Loaded " + loaded + " items worth $" + originalPilot.sendMessage(Config.SUCCESS_TAG + "Loaded " + loaded + " items worth $" + String.format("%.2f", loaded * item.getTradePrice()) + " took a tax of " - + String.format("%.2f", CargoMain.getLoadTax() * loaded * item.getTradePrice())); + + String.format("%.2f", Config.loadTax * loaded * item.getTradePrice())); return; } ItemStack tempItem = item.getMainItem().clone(); @@ -58,29 +59,29 @@ protected void execute() { tempItem.setAmount(inv.getItem(i).getAmount() + maxCount); inv.setItem(i, tempItem); loaded += maxCount; - if (CargoMain.isDebug()) { - CargoMain.logger.info("Balance: " + CargoMain.getEconomy().getBalance(originalPilot) + if (Config.debug) { + CargoMain.getInstance().getLogger().info("Balance: " + CargoMain.getEconomy().getBalance(originalPilot) + ". maxCount: " + maxCount + ". Actual stack-size: " + tempItem.getAmount()); } - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "Loaded " + loaded + " items worth $" + originalPilot.sendMessage(Config.SUCCESS_TAG + "Loaded " + loaded + " items worth $" + String.format("%.2f", loaded * item.getTradePrice()) + " took a tax of " - + String.format("%.2f", CargoMain.getLoadTax() * loaded * item.getTradePrice())); + + String.format("%.2f", Config.loadTax * loaded * item.getTradePrice())); CargoMain.getEconomy().withdrawPlayer(originalPilot, - loaded * item.getTradePrice() * (1 + CargoMain.getLoadTax())); + loaded * item.getTradePrice() * (1 + Config.loadTax)); return; } CargoMain.getEconomy().withdrawPlayer(originalPilot, - maxCount * item.getTradePrice() * (1 + CargoMain.getLoadTax())); + maxCount * item.getTradePrice() * (1 + Config.loadTax)); } - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "Loaded " + loaded + " items worth $" + originalPilot.sendMessage(Config.SUCCESS_TAG + "Loaded " + loaded + " items worth $" + String.format("%.2f", loaded * item.getTradePrice()) + " took a tax of " - + String.format("%.2f", CargoMain.getLoadTax() * loaded * item.getTradePrice())); + + String.format("%.2f", Config.loadTax * loaded * item.getTradePrice())); if (invs.size() <= 1) { this.cancel(); CargoMain.getQue().remove(originalPilot); - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "All cargo loaded"); + originalPilot.sendMessage(Config.SUCCESS_TAG + "All cargo loaded"); return; } new ProcessingTask(originalPilot, item, invs.size()).runTaskTimer(CargoMain.getInstance(), 0, 20); diff --git a/src/main/java/io/github/cccm5/async/ProcessingTask.java b/src/main/java/io/github/cccm5/async/ProcessingTask.java index ce136e6..edac0d9 100644 --- a/src/main/java/io/github/cccm5/async/ProcessingTask.java +++ b/src/main/java/io/github/cccm5/async/ProcessingTask.java @@ -2,6 +2,7 @@ import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import io.github.cccm5.CargoMain; +import io.github.cccm5.config.Config; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -19,23 +20,20 @@ public class ProcessingTask extends BukkitRunnable implements Listener { private static final int DELAY_BETWEEN_DISPLAY = 1; - private int remainingTime,remainingChests; + private int remainingTime; + private final int remainingChests; private final Player player; - private final TradableGUIItem item; - private final String itemDisplayName; - private Scoreboard board; - private Objective objective; + private final Objective objective; public ProcessingTask(Player player, TradableGUIItem item, int remainingChests){//, int remainingChests){ if (item == null) throw new IllegalArgumentException("item must not be null"); if (player == null) throw new IllegalArgumentException("player must not be null"); this.player = player; - this.item = item; - this.remainingTime = CargoMain.getDelay()/20; + this.remainingTime = Config.delay/20; this.remainingChests = remainingChests; - board = Bukkit.getScoreboardManager().getNewScoreboard(); - itemDisplayName = item.getMainItem().getItemMeta().getDisplayName() != null && item.getMainItem().getItemMeta().getDisplayName().length() > 0 ? item.getMainItem().getItemMeta().getDisplayName() : item.getMainItem().getType().name().toLowerCase(); + Scoreboard board = Bukkit.getScoreboardManager().getNewScoreboard(); + String itemDisplayName = item.getMainItem().getItemMeta().getDisplayName() != null && item.getMainItem().getItemMeta().getDisplayName().length() > 0 ? item.getMainItem().getItemMeta().getDisplayName() : item.getMainItem().getType().name().toLowerCase(); objective = itemDisplayName.length() <=14 ? board.registerNewObjective(ChatColor.DARK_AQUA + itemDisplayName, "dummy") : board.registerNewObjective(ChatColor.DARK_AQUA + "Cargo", "dummy","Cargo"); objective.setDisplaySlot(DisplaySlot.SIDEBAR); player.setScoreboard(board); diff --git a/src/main/java/io/github/cccm5/async/UnloadTask.java b/src/main/java/io/github/cccm5/async/UnloadTask.java index a39e027..b4a6979 100644 --- a/src/main/java/io/github/cccm5/async/UnloadTask.java +++ b/src/main/java/io/github/cccm5/async/UnloadTask.java @@ -2,6 +2,7 @@ import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import io.github.cccm5.CargoMain; +import io.github.cccm5.config.Config; import io.github.cccm5.util.CraftInventoryUtil; import net.countercraft.movecraft.craft.PlayerCraft; @@ -25,16 +26,16 @@ public void execute() { inv.setItem(i, null); } } - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "Unloaded " + count + " worth $" + originalPilot.sendMessage(Config.SUCCESS_TAG + "Unloaded " + count + " worth $" + String.format("%.2f", count * item.getTradePrice()) + " took a tax of " - + String.format("%.2f", CargoMain.getUnloadTax() * count * item.getTradePrice())); + + String.format("%.2f", Config.unloadTax * count * item.getTradePrice())); CargoMain.getEconomy().depositPlayer(originalPilot, - count * item.getTradePrice() * (1 - CargoMain.getUnloadTax())); + count * item.getTradePrice() * (1 - Config.unloadTax)); if (invs.size() <= 1) { this.cancel(); CargoMain.getQue().remove(originalPilot); - originalPilot.sendMessage(CargoMain.SUCCESS_TAG + "All cargo unloaded"); + originalPilot.sendMessage(Config.SUCCESS_TAG + "All cargo unloaded"); return; } new ProcessingTask(originalPilot, item, invs.size()).runTaskTimer(CargoMain.getInstance(), 0, 20); diff --git a/src/main/java/io/github/cccm5/config/Config.java b/src/main/java/io/github/cccm5/config/Config.java new file mode 100644 index 0000000..137273e --- /dev/null +++ b/src/main/java/io/github/cccm5/config/Config.java @@ -0,0 +1,15 @@ +package io.github.cccm5.config; + +import org.bukkit.ChatColor; + +public class Config { + public static final String ERROR_TAG = ChatColor.RED + "Error: " + ChatColor.DARK_RED; + public static final String SUCCESS_TAG = ChatColor.DARK_AQUA + "Cargo: " + ChatColor.WHITE; + + public static double scanRange = 100.0; + public static int delay; + public static double loadTax = 0.01D; + public static double unloadTax = 0.01D; + public static boolean cardinalDistance = true; + public static boolean debug = false; +} From bfd2da8ac769496d568f9dd7d79371529f35635e Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 14:12:13 -0500 Subject: [PATCH 05/11] Extract commands from main class --- src/main/java/io/github/cccm5/CargoMain.java | 47 ++++--------------- .../github/cccm5/commands/CargoCommand.java | 30 ++++++++++++ .../io/github/cccm5/commands/LoadCommand.java | 25 ++++++++++ .../github/cccm5/commands/UnloadCommand.java | 25 ++++++++++ 4 files changed, 89 insertions(+), 38 deletions(-) create mode 100644 src/main/java/io/github/cccm5/commands/CargoCommand.java create mode 100644 src/main/java/io/github/cccm5/commands/LoadCommand.java create mode 100644 src/main/java/io/github/cccm5/commands/UnloadCommand.java diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 2909537..fac1d39 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -10,6 +10,9 @@ import io.github.cccm5.async.LoadTask; import io.github.cccm5.async.ProcessingTask; import io.github.cccm5.async.UnloadTask; +import io.github.cccm5.commands.CargoCommand; +import io.github.cccm5.commands.LoadCommand; +import io.github.cccm5.commands.UnloadCommand; import io.github.cccm5.config.Config; import io.github.cccm5.util.CraftInventoryUtil; import io.github.cccm5.util.NPCUtil; @@ -110,6 +113,10 @@ public void onEnable() { } dtlTradersPlugin = (Main) traders; economy = getServer().getServicesManager().getRegistration(Economy.class).getProvider(); + + getCommand("cargo").setExecutor(new CargoCommand()); + getCommand("load").setExecutor(new LoadCommand()); + getCommand("unload").setExecutor(new UnloadCommand()); } public void onDisable() { @@ -117,42 +124,6 @@ public void onDisable() { instance = null; } - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { // Plugin - if (command.getName().equalsIgnoreCase("unload")) { - if(!(sender instanceof Player)){ - sender.sendMessage(Config.ERROR_TAG + "You need to be a player to execute that command!"); - return true; - } - unload((Player) sender); - return true; - } - - if (command.getName().equalsIgnoreCase("load")) { - if(!(sender instanceof Player)){ - sender.sendMessage(Config.ERROR_TAG + "You need to be a player to execute that command!"); - return true; - } - load((Player) sender); - return true; - } - - if (command.getName().equalsIgnoreCase("cargo")) { - if(!sender.hasPermission("Cargo.cargo")){ - sender.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); - return true; - } - sender.sendMessage(ChatColor.WHITE + "--[ " + ChatColor.DARK_AQUA + " Movecraft Cargo " + ChatColor.WHITE + " ]--"); - sender.sendMessage(ChatColor.DARK_AQUA + "Scan Range: " + ChatColor.WHITE + Config.scanRange + " Blocks"); - sender.sendMessage(ChatColor.DARK_AQUA + "Transfer Delay: " + ChatColor.WHITE + Config.delay + " ticks"); - sender.sendMessage(ChatColor.DARK_AQUA + "Unload Tax: " + ChatColor.WHITE + String.format("%.2f",100*Config.unloadTax) + "%"); - sender.sendMessage(ChatColor.DARK_AQUA + "Load Tax: " + ChatColor.WHITE + String.format("%.2f",100*Config.loadTax) + "%"); - sender.sendMessage(ChatColor.DARK_AQUA + "Distance Type: " + ChatColor.WHITE + (Config.cardinalDistance ? "Cardinal" : "Direct")); - return true; - } - return false; - - } - @EventHandler public void onSignClick(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { @@ -195,7 +166,7 @@ public static CargoMain getInstance(){ return instance; } - private void unload(Player player){ + public void unload(Player player){ if(!player.hasPermission("Cargo.unload")){ player.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return; @@ -275,7 +246,7 @@ private void unload(Player player){ new ProcessingTask(player, finalItem,size).runTaskTimer(this,0,20); } - private void load(Player player){ + public void load(Player player){ if(!player.hasPermission("Cargo.load")){ player.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return; diff --git a/src/main/java/io/github/cccm5/commands/CargoCommand.java b/src/main/java/io/github/cccm5/commands/CargoCommand.java new file mode 100644 index 0000000..b0821c4 --- /dev/null +++ b/src/main/java/io/github/cccm5/commands/CargoCommand.java @@ -0,0 +1,30 @@ +package io.github.cccm5.commands; + +import io.github.cccm5.config.Config; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class CargoCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (command.getName().equalsIgnoreCase("cargo")) + return false; + + if (!sender.hasPermission("Cargo.cargo")) { + sender.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); + return true; + } + + sender.sendMessage(ChatColor.WHITE + "--[ " + ChatColor.DARK_AQUA + " Movecraft Cargo " + ChatColor.WHITE + " ]--"); + sender.sendMessage(ChatColor.DARK_AQUA + "Scan Range: " + ChatColor.WHITE + Config.scanRange + " Blocks"); + sender.sendMessage(ChatColor.DARK_AQUA + "Transfer Delay: " + ChatColor.WHITE + Config.delay + " ticks"); + sender.sendMessage(ChatColor.DARK_AQUA + "Unload Tax: " + ChatColor.WHITE + String.format("%.2f",100*Config.unloadTax) + "%"); + sender.sendMessage(ChatColor.DARK_AQUA + "Load Tax: " + ChatColor.WHITE + String.format("%.2f",100*Config.loadTax) + "%"); + sender.sendMessage(ChatColor.DARK_AQUA + "Distance Type: " + ChatColor.WHITE + (Config.cardinalDistance ? "Cardinal" : "Direct")); + + return true; + } +} diff --git a/src/main/java/io/github/cccm5/commands/LoadCommand.java b/src/main/java/io/github/cccm5/commands/LoadCommand.java new file mode 100644 index 0000000..d5c1fb7 --- /dev/null +++ b/src/main/java/io/github/cccm5/commands/LoadCommand.java @@ -0,0 +1,25 @@ +package io.github.cccm5.commands; + +import io.github.cccm5.CargoMain; +import io.github.cccm5.config.Config; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class LoadCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { // Plugin + if (!command.getName().equalsIgnoreCase("load")) + return false; + + if (!(sender instanceof Player)) { + sender.sendMessage(Config.ERROR_TAG + "You need to be a player to execute that command!"); + return true; + } + + CargoMain.getInstance().load((Player) sender); + return true; + } +} diff --git a/src/main/java/io/github/cccm5/commands/UnloadCommand.java b/src/main/java/io/github/cccm5/commands/UnloadCommand.java new file mode 100644 index 0000000..de7a003 --- /dev/null +++ b/src/main/java/io/github/cccm5/commands/UnloadCommand.java @@ -0,0 +1,25 @@ +package io.github.cccm5.commands; + +import io.github.cccm5.CargoMain; +import io.github.cccm5.config.Config; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class UnloadCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!command.getName().equalsIgnoreCase("unload")) + return false; + + if (!(sender instanceof Player)) { + sender.sendMessage(Config.ERROR_TAG + "You need to be a player to execute that command!"); + return true; + } + + CargoMain.getInstance().unload((Player) sender); + return true; + } +} From 8be4cc39d6136a30e2285aa03c38369653222420 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 14:18:47 -0500 Subject: [PATCH 06/11] Extract listeners from main class --- src/main/java/io/github/cccm5/CargoMain.java | 36 +++---------------- .../cccm5/listener/SignClickListener.java | 31 ++++++++++++++++ .../cccm5/listener/SignPlaceListener.java | 18 ++++++++++ 3 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 src/main/java/io/github/cccm5/listener/SignClickListener.java create mode 100644 src/main/java/io/github/cccm5/listener/SignPlaceListener.java diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index fac1d39..9a6f3f2 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -14,6 +14,8 @@ import io.github.cccm5.commands.LoadCommand; import io.github.cccm5.commands.UnloadCommand; import io.github.cccm5.config.Config; +import io.github.cccm5.listener.SignClickListener; +import io.github.cccm5.listener.SignPlaceListener; import io.github.cccm5.util.CraftInventoryUtil; import io.github.cccm5.util.NPCUtil; import net.citizensnpcs.api.CitizensAPI; @@ -71,7 +73,6 @@ private void loadConfig() { } public void onEnable() { - getServer().getPluginManager().registerEvents(this, this); playersInQue = new ArrayList<>(); instance = this; @@ -114,6 +115,9 @@ public void onEnable() { dtlTradersPlugin = (Main) traders; economy = getServer().getServicesManager().getRegistration(Economy.class).getProvider(); + getServer().getPluginManager().registerEvents(new SignClickListener(), this); + getServer().getPluginManager().registerEvents(new SignPlaceListener(), this); + getCommand("cargo").setExecutor(new CargoCommand()); getCommand("load").setExecutor(new LoadCommand()); getCommand("unload").setExecutor(new UnloadCommand()); @@ -124,36 +128,6 @@ public void onDisable() { instance = null; } - @EventHandler - public void onSignClick(PlayerInteractEvent e) { - if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { - return; - } - if (!e.getClickedBlock().getType().name().equals("SIGN_POST") && !e.getClickedBlock().getType().name().endsWith("SIGN") && !e.getClickedBlock().getType().name().endsWith("WALL_SIGN")) { - return; - } - Sign sign = (Sign) e.getClickedBlock().getState(); - if (sign.getLine(0).equals(ChatColor.DARK_AQUA + "[UnLoad]")) { - unload(e.getPlayer()); - return; - } - if (sign.getLine(0).equals(ChatColor.DARK_AQUA + "[Load]")) { - load(e.getPlayer()); - } - - } - - @EventHandler - public void onSignPlace(SignChangeEvent e){ - if(!e.getBlock().getType().name().equals("SIGN_POST") && !e.getBlock().getType().name().endsWith("SIGN") && !e.getBlock().getType().name().endsWith("WALL_SIGN")){ - return; - } - if(ChatColor.stripColor(e.getLine(0)).equalsIgnoreCase("[Load]") || ChatColor.stripColor(e.getLine(0)).equalsIgnoreCase("[UnLoad]")){ - e.setLine(0,ChatColor.DARK_AQUA + (ChatColor.stripColor(e.getLine(0))).replaceAll("u","U").replaceAll("l","L")); - } - - } - public static Economy getEconomy(){ return economy; } diff --git a/src/main/java/io/github/cccm5/listener/SignClickListener.java b/src/main/java/io/github/cccm5/listener/SignClickListener.java new file mode 100644 index 0000000..3cc91cd --- /dev/null +++ b/src/main/java/io/github/cccm5/listener/SignClickListener.java @@ -0,0 +1,31 @@ +package io.github.cccm5.listener; + +import io.github.cccm5.CargoMain; +import org.bukkit.ChatColor; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.jetbrains.annotations.NotNull; + +public class SignClickListener implements Listener { + @EventHandler + public void onSignClick(@NotNull PlayerInteractEvent e) { + if (e.getAction() != Action.RIGHT_CLICK_BLOCK) + return; + BlockState state = e.getClickedBlock().getState(); + if (!(state instanceof Sign)) + return; + + Sign sign = (Sign) e.getClickedBlock().getState(); + if (sign.getLine(0).equals(ChatColor.DARK_AQUA + "[UnLoad]")) { + CargoMain.getInstance().unload(e.getPlayer()); + return; + } + if (sign.getLine(0).equals(ChatColor.DARK_AQUA + "[Load]")) { + CargoMain.getInstance().load(e.getPlayer()); + } + } +} diff --git a/src/main/java/io/github/cccm5/listener/SignPlaceListener.java b/src/main/java/io/github/cccm5/listener/SignPlaceListener.java new file mode 100644 index 0000000..3680b42 --- /dev/null +++ b/src/main/java/io/github/cccm5/listener/SignPlaceListener.java @@ -0,0 +1,18 @@ +package io.github.cccm5.listener; + +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.SignChangeEvent; +import org.jetbrains.annotations.NotNull; + +public class SignPlaceListener implements Listener { + @EventHandler + public void onSignPlace(@NotNull SignChangeEvent e) { + String header = ChatColor.stripColor(e.getLine(0)); + if (!header.equalsIgnoreCase("[Load]") && !header.equalsIgnoreCase("[UnLoad]")) + return; + + e.setLine(0,ChatColor.DARK_AQUA + (ChatColor.stripColor(e.getLine(0))).replaceAll("u","U").replaceAll("l","L")); + } +} From b6902668913fa00a8488e0bb40d75779af9d9d24 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 15:50:15 -0500 Subject: [PATCH 07/11] Extract load and unload item searches from main class --- src/main/java/io/github/cccm5/CargoMain.java | 139 +++++------------- .../java/io/github/cccm5/util/NPCUtil.java | 106 ++++++++++++- 2 files changed, 137 insertions(+), 108 deletions(-) diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 9a6f3f2..ae409a7 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -42,6 +42,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -140,153 +141,79 @@ public static CargoMain getInstance(){ return instance; } - public void unload(Player player){ - if(!player.hasPermission("Cargo.unload")){ + public void unload(@NotNull Player player){ + if (!player.hasPermission("Cargo.unload")) { player.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return; } - PlayerCraft playerCraft = CraftManager.getInstance().getCraftByPlayer(player); - if(playersInQue.contains(player)){ + if (playersInQue.contains(player)) { player.sendMessage(Config.ERROR_TAG + "You're already moving cargo!"); return; } + if (player.getInventory().getItemInMainHand().getType() == Material.AIR) { + player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); + return; + } - if(playerCraft == null){ + PlayerCraft playerCraft = CraftManager.getInstance().getCraftByPlayer(player); + if(playerCraft == null) { player.sendMessage(Config.ERROR_TAG + "You need to be piloting a craft to do that!"); return; } - //NPC cargoMerchant=null; - List nearbyMerchants = new ArrayList<>(); - double distance;//, lastScan = scanRange; - MovecraftLocation loc = playerCraft.getHitBox().getMidPoint(); - for(NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)){ - if(!npc.isSpawned()) - continue; - distance = Config.cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); - if( distance <= Config.scanRange){ - nearbyMerchants.add(npc); - } - } - if(nearbyMerchants.size()==0){ + + List nearbyMerchants = NPCUtil.getNPCsInRange(playerCraft.getHitBox().getMidPoint()); + if (nearbyMerchants.isEmpty()) { player.sendMessage(Config.ERROR_TAG + "You need to be within " + Config.scanRange + " blocks of a merchant to use that command!"); return; } - if(player.getInventory().getItemInMainHand() == null || player.getInventory().getItemInMainHand().getType() == Material.AIR){ + TradableGUIItem finalItem = NPCUtil.getUnloadItem(nearbyMerchants, player.getInventory().getItemInMainHand().clone(), dtlTradersPlugin); + if (finalItem == null || finalItem.getTradePrice() == 0.0) { player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } - String guiName; - TradableGUIItem finalItem = null; - for(NPC cargoMerchant : nearbyMerchants) { - if(finalItem!=null) - break; - guiName = cargoMerchant.getTrait(TraderTrait.class).getGUIName(); - AGUI gui = dtlTradersPlugin.getGuiListService().getGUI(guiName); - TradeGUI tradeGUI = (TradeGUI) gui; - ItemStack compareItem = player.getInventory().getItemInMainHand().clone(); - finalItem = null; - for (TradeGUIPage page : tradeGUI.getPages()) { - if (page == null) continue; - for (AGUIItem tempItem : page.getItems("sell")) { - if (!(tempItem instanceof TradableGUIItem)) continue; - if (tempItem.getMainItem().isSimilar(compareItem)) { - if (tempItem.getMainItem().getAmount() > 1) - continue; - finalItem = (TradableGUIItem) tempItem; - break; - } - } - if (finalItem == null || finalItem.getTradePrice() == 0.0) { - player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); - return; - } - } - } - assert finalItem!=null; String itemName = finalItem.getMainItem().getItemMeta().getDisplayName() != null && finalItem.getMainItem().getItemMeta().getDisplayName().length() > 0 ? finalItem.getMainItem().getItemMeta().getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); - - List invs = CraftInventoryUtil.getInventories(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); - int size = invs.size(); - if(size <=0 ){ + List inventories = CraftInventoryUtil.getInventories(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); + if (inventories.isEmpty()) { player.sendMessage(Config.ERROR_TAG + "You have no " + itemName + " on this craft!"); return; } player.sendMessage(Config.SUCCESS_TAG + "Started unloading cargo"); playersInQue.add(player); - new UnloadTask(playerCraft,finalItem ).runTaskTimer(this,Config.delay,Config.delay); - new ProcessingTask(player, finalItem,size).runTaskTimer(this,0,20); + new UnloadTask(playerCraft, finalItem).runTaskTimer(this, Config.delay, Config.delay); + new ProcessingTask(player, finalItem, inventories.size()).runTaskTimer(this, 0, 20); } - public void load(Player player){ - if(!player.hasPermission("Cargo.load")){ + public void load(@NotNull Player player){ + if (!player.hasPermission("Cargo.load")) { player.sendMessage(Config.ERROR_TAG + "You don't have permission to do that!"); return; } - PlayerCraft playerCraft = CraftManager.getInstance().getCraftByPlayer(player); - if(playersInQue.contains(player)){ + if (playersInQue.contains(player)) { player.sendMessage(Config.ERROR_TAG + "You're already moving cargo!"); return; } - - if(playerCraft == null){ - player.sendMessage(Config.ERROR_TAG + "You need to be piloting a craft to do that!"); + if (player.getInventory().getItemInMainHand().getType() == Material.AIR) { + getLogger().info(player.getInventory().getItemInMainHand().getType().name()); + player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } - //NPC cargoMerchant=null; - List nearbyMerchants = new ArrayList<>(); - double distance;//, lastScan = scanRange; - MovecraftLocation loc = playerCraft.getHitBox().getMidPoint(); - for(NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)){ - if(!npc.isSpawned()) - continue; - distance = Config.cardinalDistance ? Math.abs(loc.getX()-npc.getEntity().getLocation().getX()) + Math.abs(loc.getZ()-npc.getEntity().getLocation().getZ()) : Math.sqrt(Math.pow(loc.getX()-npc.getEntity().getLocation().getX(),2) + Math.pow(loc.getZ()-npc.getEntity().getLocation().getZ(),2)); - if( distance <= Config.scanRange){ - nearbyMerchants.add(npc); - } - } - if(nearbyMerchants.size()==0){ - player.sendMessage(Config.ERROR_TAG + "You need to be within " + Config.scanRange + " blocks of a merchant to use that command!"); + + PlayerCraft playerCraft = CraftManager.getInstance().getCraftByPlayer(player); + if (playerCraft == null) { + player.sendMessage(Config.ERROR_TAG + "You need to be piloting a craft to do that!"); return; } - if(player.getInventory().getItemInMainHand() == null || player.getInventory().getItemInMainHand().getType() == Material.AIR){ - getLogger().info(player.getInventory().getItemInMainHand().getType().name()); - player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); + List nearbyMerchants = NPCUtil.getNPCsInRange(playerCraft.getHitBox().getMidPoint()); + if (nearbyMerchants.isEmpty()) { + player.sendMessage(Config.ERROR_TAG + "You need to be within " + Config.scanRange + " blocks of a merchant to use that command!"); return; } - String guiName; - TradableGUIItem finalItem = null; - for(NPC cargoMerchant : nearbyMerchants) { - guiName = cargoMerchant.getTrait(TraderTrait.class).getGUIName(); - AGUI gui = dtlTradersPlugin.getGuiListService().getGUI(guiName); - TradeGUI tradeGUI = (TradeGUI) gui; - ItemStack compareItem = player.getInventory().getItemInMainHand().clone(); - for (TradeGUIPage page : tradeGUI.getPages()) { - if (page == null) - continue; - for (AGUIItem tempItem : page.getItems("buy")) { - if (!(tempItem instanceof TradableGUIItem)) - continue; - - TradableGUIItem tradeItem = (TradableGUIItem) tempItem; - if (tradeItem.getMainItem().isSimilar(compareItem)) { - if (tempItem.getMainItem().getAmount() > 1) - continue; - - finalItem = tradeItem; - break; - } - } - if (finalItem != null) - break; - } - if (finalItem != null) - break; - } + TradableGUIItem finalItem = NPCUtil.getLoadItem(nearbyMerchants, player.getInventory().getItemInMainHand(), dtlTradersPlugin); if (finalItem == null || finalItem.getTradePrice() == 0.0) { player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; diff --git a/src/main/java/io/github/cccm5/util/NPCUtil.java b/src/main/java/io/github/cccm5/util/NPCUtil.java index 01c51a7..c4fbcf2 100644 --- a/src/main/java/io/github/cccm5/util/NPCUtil.java +++ b/src/main/java/io/github/cccm5/util/NPCUtil.java @@ -1,18 +1,120 @@ package io.github.cccm5.util; +import com.degitise.minevid.dtlTraders.Main; +import com.degitise.minevid.dtlTraders.guis.AGUI; +import com.degitise.minevid.dtlTraders.guis.gui.TradeGUI; +import com.degitise.minevid.dtlTraders.guis.gui.TradeGUIPage; +import com.degitise.minevid.dtlTraders.guis.items.AGUIItem; +import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; +import com.degitise.minevid.dtlTraders.utils.citizens.TraderTrait; +import io.github.cccm5.CargoTrait; +import io.github.cccm5.config.Config; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCRegistry; import net.citizensnpcs.api.trait.Trait; +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.util.MathUtils; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.List; public class NPCUtil { - public static ArrayList getNPCsWithTrait(Class c){ - ArrayList npcs = new ArrayList<>(); + @NotNull + public static List getNPCsWithTrait(Class c){ + List npcs = new ArrayList<>(); for(NPCRegistry registry : net.citizensnpcs.api.CitizensAPI.getNPCRegistries()) for(NPC npc : registry) if(npc.hasTrait(c)) npcs.add(npc); return npcs; } + + @NotNull + public static List getNPCsInRange(MovecraftLocation center) { + List result = new ArrayList<>(); + for (NPC npc :NPCUtil.getNPCsWithTrait(CargoTrait.class)) { + if (!npc.isSpawned()) + continue; + + MovecraftLocation npcLocation = MathUtils.bukkit2MovecraftLoc(npc.getEntity().getLocation()); + double distanceSquared; + if (Config.cardinalDistance) { + distanceSquared = Math.abs(center.getX() - npcLocation.getX()) + Math.abs(center.getZ() - npcLocation.getZ()); + distanceSquared *= distanceSquared; + } + else { + distanceSquared = center.distanceSquared(npcLocation); + } + + if (distanceSquared <= (Config.scanRange * Config.scanRange)) { + result.add(npc); + } + } + return result; + } + + @Nullable + public static TradableGUIItem getUnloadItem(@NotNull List nearbyMerchants, ItemStack compareItem, Main dtlTradersPlugin) { + TradableGUIItem result = null; + for (NPC cargoMerchant : nearbyMerchants) { + if (result != null) + break; + String guiName = cargoMerchant.getTrait(TraderTrait.class).getGUIName(); + AGUI gui = dtlTradersPlugin.getGuiListService().getGUI(guiName); + TradeGUI tradeGUI = (TradeGUI) gui; + result = null; + for (TradeGUIPage page : tradeGUI.getPages()) { + if (page == null) continue; + for (AGUIItem tempItem : page.getItems("sell")) { + if (!(tempItem instanceof TradableGUIItem)) continue; + if (tempItem.getMainItem().isSimilar(compareItem)) { + if (tempItem.getMainItem().getAmount() > 1) + continue; + result = (TradableGUIItem) tempItem; + break; + } + } + if (result == null || result.getTradePrice() == 0.0) { + return null; + } + } + } + return result; + } + + @Nullable + public static TradableGUIItem getLoadItem(@NotNull List nearbyMerchants, ItemStack compareItem, Main dtlTradersPlugin) { + TradableGUIItem result = null; + for (NPC cargoMerchant : nearbyMerchants) { + String guiName = cargoMerchant.getTrait(TraderTrait.class).getGUIName(); + AGUI gui = dtlTradersPlugin.getGuiListService().getGUI(guiName); + TradeGUI tradeGUI = (TradeGUI) gui; + for (TradeGUIPage page : tradeGUI.getPages()) { + if (page == null) + continue; + + for (AGUIItem tempItem : page.getItems("buy")) { + if (!(tempItem instanceof TradableGUIItem)) + continue; + + TradableGUIItem tradeItem = (TradableGUIItem) tempItem; + if (tradeItem.getMainItem().isSimilar(compareItem)) { + if (tempItem.getMainItem().getAmount() > 1) + continue; + + result = tradeItem; + break; + } + } + if (result != null) + break; + } + if (result != null) + break; + } + return result; + } } From cbaabce75048b859642b407ba6219c6f551da93d Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 15:57:55 -0500 Subject: [PATCH 08/11] Add debug --- src/main/java/io/github/cccm5/util/NPCUtil.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/io/github/cccm5/util/NPCUtil.java b/src/main/java/io/github/cccm5/util/NPCUtil.java index c4fbcf2..aa920cd 100644 --- a/src/main/java/io/github/cccm5/util/NPCUtil.java +++ b/src/main/java/io/github/cccm5/util/NPCUtil.java @@ -7,6 +7,7 @@ import com.degitise.minevid.dtlTraders.guis.items.AGUIItem; import com.degitise.minevid.dtlTraders.guis.items.TradableGUIItem; import com.degitise.minevid.dtlTraders.utils.citizens.TraderTrait; +import io.github.cccm5.CargoMain; import io.github.cccm5.CargoTrait; import io.github.cccm5.config.Config; import net.citizensnpcs.api.npc.NPC; @@ -53,6 +54,12 @@ public static List getNPCsInRange(MovecraftLocation center) { result.add(npc); } } + if (Config.debug) { + CargoMain.getInstance().getLogger().info("Found " + result.size() + " merchants:"); + for (NPC npc : result) { + CargoMain.getInstance().getLogger().info("- " + npc.getId() + ": " + npc.getName()); + } + } return result; } From d4716de4f46a43b418c4d3c267a69729f5020819 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 16:21:51 -0500 Subject: [PATCH 09/11] Combine load and unload --- src/main/java/io/github/cccm5/CargoMain.java | 32 +++++++-- .../java/io/github/cccm5/util/NPCUtil.java | 68 +++++-------------- 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index ae409a7..9081493 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; public class CargoMain extends JavaPlugin implements Listener { private static Economy economy; @@ -167,8 +168,18 @@ public void unload(@NotNull Player player){ return; } - TradableGUIItem finalItem = NPCUtil.getUnloadItem(nearbyMerchants, player.getInventory().getItemInMainHand().clone(), dtlTradersPlugin); - if (finalItem == null || finalItem.getTradePrice() == 0.0) { + Set items = NPCUtil.getItems(nearbyMerchants, player.getInventory().getItemInMainHand(), dtlTradersPlugin, "sell"); + TradableGUIItem finalItem = null; + for (TradableGUIItem item : items) { + if (finalItem == null) { + finalItem = item; + continue; + } + + if (item.getTradePrice() > finalItem.getTradePrice()) + finalItem = item; + } + if (finalItem == null || finalItem.getTradePrice() <= 0.0) { player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } @@ -213,14 +224,23 @@ public void load(@NotNull Player player){ return; } - TradableGUIItem finalItem = NPCUtil.getLoadItem(nearbyMerchants, player.getInventory().getItemInMainHand(), dtlTradersPlugin); - if (finalItem == null || finalItem.getTradePrice() == 0.0) { + Set items = NPCUtil.getItems(nearbyMerchants, player.getInventory().getItemInMainHand(), dtlTradersPlugin, "buy"); + TradableGUIItem finalItem = null; + for (TradableGUIItem item : items) { + if (finalItem == null) { + finalItem = item; + continue; + } + + if (item.getTradePrice() < finalItem.getTradePrice()) + finalItem = item; + } + if (finalItem == null || finalItem.getTradePrice() <= 0.0) { player.sendMessage(Config.ERROR_TAG + "You need to be holding a cargo item to do that!"); return; } - final ItemMeta meta = finalItem.getMainItem().getItemMeta(); - String itemName = meta.getDisplayName() != null && meta.getDisplayName().length() > 0 ? meta.getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); + String itemName = finalItem.getMainItem().getItemMeta().getDisplayName() != null && finalItem.getMainItem().getItemMeta().getDisplayName().length() > 0 ? finalItem.getMainItem().getItemMeta().getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); if(!economy.has(player,finalItem.getTradePrice()*(1+Config.loadTax))){ player.sendMessage(Config.ERROR_TAG + "You don't have enough money to buy any " + itemName + "!"); return; diff --git a/src/main/java/io/github/cccm5/util/NPCUtil.java b/src/main/java/io/github/cccm5/util/NPCUtil.java index aa920cd..c0e6fc2 100644 --- a/src/main/java/io/github/cccm5/util/NPCUtil.java +++ b/src/main/java/io/github/cccm5/util/NPCUtil.java @@ -20,7 +20,9 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class NPCUtil { @NotNull @@ -63,64 +65,28 @@ public static List getNPCsInRange(MovecraftLocation center) { return result; } - @Nullable - public static TradableGUIItem getUnloadItem(@NotNull List nearbyMerchants, ItemStack compareItem, Main dtlTradersPlugin) { - TradableGUIItem result = null; - for (NPC cargoMerchant : nearbyMerchants) { - if (result != null) - break; - String guiName = cargoMerchant.getTrait(TraderTrait.class).getGUIName(); - AGUI gui = dtlTradersPlugin.getGuiListService().getGUI(guiName); - TradeGUI tradeGUI = (TradeGUI) gui; - result = null; - for (TradeGUIPage page : tradeGUI.getPages()) { - if (page == null) continue; - for (AGUIItem tempItem : page.getItems("sell")) { - if (!(tempItem instanceof TradableGUIItem)) continue; - if (tempItem.getMainItem().isSimilar(compareItem)) { - if (tempItem.getMainItem().getAmount() > 1) - continue; - result = (TradableGUIItem) tempItem; - break; - } - } - if (result == null || result.getTradePrice() == 0.0) { - return null; - } - } - } - return result; - } - - @Nullable - public static TradableGUIItem getLoadItem(@NotNull List nearbyMerchants, ItemStack compareItem, Main dtlTradersPlugin) { - TradableGUIItem result = null; - for (NPC cargoMerchant : nearbyMerchants) { - String guiName = cargoMerchant.getTrait(TraderTrait.class).getGUIName(); + @NotNull + public static Set getItems(@NotNull List merchants, ItemStack item, Main dtlTradersPlugin, String shopMode) { + Set result = new HashSet<>(); + for (NPC merchant : merchants) { + String guiName = merchant.getTrait(TraderTrait.class).getGUIName(); AGUI gui = dtlTradersPlugin.getGuiListService().getGUI(guiName); - TradeGUI tradeGUI = (TradeGUI) gui; - for (TradeGUIPage page : tradeGUI.getPages()) { - if (page == null) - continue; + if (!(gui instanceof TradeGUI)) + continue; - for (AGUIItem tempItem : page.getItems("buy")) { - if (!(tempItem instanceof TradableGUIItem)) + for (TradeGUIPage page : ((TradeGUI) gui).getPages()) { + for (AGUIItem guiItem : page.getItems(shopMode)) { + if (!(guiItem instanceof TradableGUIItem tradableItem)) + continue; + if (!guiItem.getMainItem().isSimilar(item) || guiItem.getMainItem().getAmount() > 1) continue; - TradableGUIItem tradeItem = (TradableGUIItem) tempItem; - if (tradeItem.getMainItem().isSimilar(compareItem)) { - if (tempItem.getMainItem().getAmount() > 1) - continue; - - result = tradeItem; - break; + result.add(tradableItem); + if (Config.debug) { + CargoMain.getInstance().getLogger().info("Found for $" + tradableItem.getTradePrice() + " in " + merchant.getId() + "/" + page.getPageName()); } } - if (result != null) - break; } - if (result != null) - break; } return result; } From d407376a597307a012d1e72d5d12d4a6c18ff8cc Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 16:26:24 -0500 Subject: [PATCH 10/11] Update build.gradle.kts --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index e5c337b..7bb5262 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { } group = "io.github.cccm5" -version = "2.0.0_beta-4" +version = "2.0.0_beta-5" description = "Cargo" java.toolchain.languageVersion = JavaLanguageVersion.of(21) From 3b32b925b1ddcc6fcb20f24726583fdf91ed32f5 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 16 Mar 2025 16:28:25 -0500 Subject: [PATCH 11/11] Update CargoMain.java --- src/main/java/io/github/cccm5/CargoMain.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/cccm5/CargoMain.java b/src/main/java/io/github/cccm5/CargoMain.java index 9081493..3ff5132 100644 --- a/src/main/java/io/github/cccm5/CargoMain.java +++ b/src/main/java/io/github/cccm5/CargoMain.java @@ -187,7 +187,7 @@ public void unload(@NotNull Player player){ String itemName = finalItem.getMainItem().getItemMeta().getDisplayName() != null && finalItem.getMainItem().getItemMeta().getDisplayName().length() > 0 ? finalItem.getMainItem().getItemMeta().getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); List inventories = CraftInventoryUtil.getInventories(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); if (inventories.isEmpty()) { - player.sendMessage(Config.ERROR_TAG + "You have no " + itemName + " on this craft!"); + player.sendMessage(Config.ERROR_TAG + "You have no " + itemName + ChatColor.RESET + " on this craft!"); return; } @@ -242,14 +242,14 @@ public void load(@NotNull Player player){ String itemName = finalItem.getMainItem().getItemMeta().getDisplayName() != null && finalItem.getMainItem().getItemMeta().getDisplayName().length() > 0 ? finalItem.getMainItem().getItemMeta().getDisplayName() : finalItem.getMainItem().getType().name().toLowerCase(); if(!economy.has(player,finalItem.getTradePrice()*(1+Config.loadTax))){ - player.sendMessage(Config.ERROR_TAG + "You don't have enough money to buy any " + itemName + "!"); + player.sendMessage(Config.ERROR_TAG + "You don't have enough money to buy any " + itemName + ChatColor.RESET + "!"); return; } List invs = CraftInventoryUtil.getInventoriesWithSpace(playerCraft, finalItem.getMainItem(), Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL); int size = invs.size(); if(size <=0 ){ - player.sendMessage(Config.ERROR_TAG + "You don't have any space for " + itemName + " on this craft!"); + player.sendMessage(Config.ERROR_TAG + "You don't have any space for " + itemName + ChatColor.RESET + " on this craft!"); return; }