diff --git a/src/me/EtienneDx/RealEstate/AbandonedItems.java b/src/me/EtienneDx/RealEstate/AbandonedItems.java index 23a2a4d..e3b0de5 100644 --- a/src/me/EtienneDx/RealEstate/AbandonedItems.java +++ b/src/me/EtienneDx/RealEstate/AbandonedItems.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import org.bouncycastle.util.Arrays; import org.bukkit.Location; @@ -35,7 +36,7 @@ public class AbandonedItems extends YamlConfiguration } owner=item_owner; - Saved_Items=new ArrayList(); + Saved_Items=new CopyOnWriteArrayList(); String path= RealEstate.pluginDirPath + "/Abandoned_inventories/"+item_owner+".inventory"; file=new File(path); if(file.exists())//user has stuff already saved, load it @@ -47,46 +48,74 @@ public class AbandonedItems extends YamlConfiguration { return owner; + } + public void set_items(List new_set) + { + Saved_Items=new_set; + if(Saved_Items.size()>0) + { + save(); + } + else + { + delete_save(); + } + } public void add_item(ItemStack addme) { + int remaining=addme.getAmount(); - RealEstate.instance.log.info("Attempting to add: "+addme.getType()+" of stack amount "+addme.getAmount()); - for(ItemStack a : Saved_Items) - { + //for(ItemStack a : current_items) + // we want the last instance of any particular item stack, or 0 + int last_stack=-1; + + for(int i=0;imaxamount? maxamount:cursize; - remaining -= maxamount-a.getAmount(); - a.setAmount(cursize); - - - } + last_stack=i; } - if(remaining >0)//there is atleast one more to put in + } + //at this point last_stack either points to the latest stack of items, which means we need to do some jiggling around, or it is -1 meaning no items of addme.type are in the array. + if(last_stack>=0) { + ItemStack a=Saved_Items.get(last_stack); + + int cursize=a.getAmount(); + int maxamount=a.getMaxStackSize(); + if(cursizemaxamount) + { + cursize=maxamount; + remaining-=maxamount-a.getAmount(); + addme.setAmount(remaining); + Saved_Items.add(addme); + } + a.setAmount(cursize);//reset the amount in the array; } + else//cursize was *exactly* maxamount, so we just add the stack as-is. + { + Saved_Items.add(addme); + } + } - + if(last_stack==-1) { + Saved_Items.add(addme); } if(Saved_Items.size()==0)//first item being put in, heh - { - RealEstate.instance.log.info("Adding first item to the save queue"); + { Saved_Items.add(addme); } + this.save(); } diff --git a/src/me/EtienneDx/RealEstate/PlayerItemReclaim.java b/src/me/EtienneDx/RealEstate/PlayerItemReclaim.java new file mode 100644 index 0000000..0f73d7d --- /dev/null +++ b/src/me/EtienneDx/RealEstate/PlayerItemReclaim.java @@ -0,0 +1,100 @@ +package me.EtienneDx.RealEstate; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; +import org.bukkit.inventory.Inventory; + + +public class PlayerItemReclaim implements Listener +{ + void registerEvents() + { + PluginManager pm = RealEstate.instance.getServer().getPluginManager(); + + pm.registerEvents(this, RealEstate.instance); + } + + public static void reclaimItems(Player player, int page) { + // Get the items from AbandonedItems + AbandonedItems player_items=new AbandonedItems(player.getUniqueId().toString()); + + List items = player_items.get_items(); + // Create an inventory for the player to hold the items + int number=items.size(); + if(number==0) + { + Messages.sendMessage(player, "You don't have any items in storage!"); + return; + + } + int roundedNumber=0; + /* + if (number > 54) { + roundedNumber = 54; + } else { + roundedNumber = (number + 9 - 1) / 9 * 9; + }*/ + roundedNumber=(int)(Math.ceil(number / 9.0) * 9); + if(roundedNumber>54) + { + roundedNumber=54; + + } + + Inventory inv = Bukkit.createInventory(null, roundedNumber, "Reclaimed Items"); + if(page>items.size()) + { + + page=0; + } + // Add the items to the inventory + + int i = page; + while (i < items.size() && i < roundedNumber) { + inv.setItem(i - page, items.get(i)); + i++; + } + // Give the inventory to the player + player.openInventory(inv); + + + + + } + @EventHandler + public void OnInventoryCloseEvent(InventoryCloseEvent event) + { + + String title=event.getView().getTitle(); + if(title =="Reclaimed Items") + { + Inventory inv =event.getInventory(); + + HumanEntity player= event.getPlayer(); + AbandonedItems reclaimed_items=new AbandonedItems(player.getUniqueId().toString()); + + List remaining_items=new ArrayList(); + for(ItemStack a: inv.getContents()) + { + + if(a != null) + { + RealEstate.instance.log.info("Top inventory still had: "+a.getType()); + remaining_items.add(a); + } + } + reclaimed_items.set_items(remaining_items); + + } + + + } +} diff --git a/src/me/EtienneDx/RealEstate/RECommand.java b/src/me/EtienneDx/RealEstate/RECommand.java index 040116d..ce3823b 100644 --- a/src/me/EtienneDx/RealEstate/RECommand.java +++ b/src/me/EtienneDx/RealEstate/RECommand.java @@ -54,8 +54,8 @@ public class RECommand extends BaseCommand @Subcommand("list") @Description("Displays the list of all real estate offers currently existing") - @CommandCompletion("all|sell|rent|lease") - @Syntax("[all|sell|rent|lease] ") + @CommandCompletion("all|sell|rent|lease|reclaim") + @Syntax("[all|sell|rent|lease|reclaim] ") public static void list(CommandSender sender, @Optional String type, @Default("1") int page) { Player player = null; @@ -395,17 +395,20 @@ public class RECommand extends BaseCommand } } } - @Subcommand("purge") - @CommandPermission("realestate.admin") - public static void perge(Player player) + @Subcommand("reclaim") + @CommandPermission("realestate.rent") + //@Syntax("") + public static void reclaim(Player player)//, @Optional @Default("0") int page) { + if(RealEstate.instance.config.SaveInventory) { - AbandonedItems.purge_items(player); + // AbandonedItems.purge_items(player); + PlayerItemReclaim.reclaimItems(player, 0); } else Messages.sendMessage(player, RealEstate.instance.messages.msgErrorSavingDisabled); } - + @Subcommand("cancel") @Conditions("claimHasTransaction") @CommandPermission("realestate.admin") diff --git a/src/me/EtienneDx/RealEstate/RealEstate.java b/src/me/EtienneDx/RealEstate/RealEstate.java index e0c6c18..af61a75 100644 --- a/src/me/EtienneDx/RealEstate/RealEstate.java +++ b/src/me/EtienneDx/RealEstate/RealEstate.java @@ -127,6 +127,7 @@ public class RealEstate extends JavaPlugin new REListener().registerEvents(); new ClaimPermissionListener().registerEvents(); + new PlayerItemReclaim().registerEvents(); manager = new BukkitCommandManager(this); manager.enableUnstableAPI("help"); diff --git a/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java b/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java index c3bb425..1d200ef 100644 --- a/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java +++ b/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java @@ -3,7 +3,6 @@ package me.EtienneDx.RealEstate.Transactions; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.lang.reflect.Method; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -22,9 +21,12 @@ import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; +import org.bukkit.block.sign.SignSide; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import com.earth2me.essentials.User; @@ -154,9 +156,12 @@ public class ClaimRent extends BoughtTransaction { if(sign.getBlock().getState() instanceof Sign) { - Sign s = (Sign) sign.getBlock().getState(); - s.setWaxed(true); + Sign thissign = (Sign) sign.getBlock().getState(); + thissign.setWaxed(true); + SignSide s=thissign.getSide(Side.valueOf("FRONT")); s.setLine(0, Messages.getMessage(RealEstate.instance.config.cfgSignsHeader, false)); + + s.setLine(1, ChatColor.DARK_GREEN + RealEstate.instance.config.cfgReplaceRent); //s.setLine(2, owner != null ? Bukkit.getOfflinePlayer(owner).getName() : "SERVER"); String price_line = ""; @@ -191,7 +196,7 @@ public class ClaimRent extends BoughtTransaction s.setLine(2, RealEstate.instance.config.cfgContainerRentLine); s.setLine(3, price_line + " - " + period); } - s.update(true); + thissign.update(true); } else { @@ -214,7 +219,8 @@ public class ClaimRent extends BoughtTransaction } else if(sign.getBlock().getState() instanceof Sign) { - Sign s = (Sign) sign.getBlock().getState(); + Sign thissign = (Sign) sign.getBlock().getState(); + SignSide s=thissign.getSide(Side.valueOf("FRONT")); s.setLine(0, ChatColor.GOLD + RealEstate.instance.config.cfgReplaceOngoingRent); //Changed the header to "[Rented]" so that it won't waste space on the next line and allow the name of the player to show underneath. s.setLine(1, Utils.getSignString(Bukkit.getOfflinePlayer(buyer).getName()));//remove "Rented by" s.setLine(2, "Time remaining : "); @@ -223,7 +229,7 @@ public class ClaimRent extends BoughtTransaction Duration timeRemaining = Duration.ofHours(24).minus(hours); s.setLine(3, Utils.getTime(daysLeft, timeRemaining, false)); - s.update(true); + thissign.update(true); } } return false; @@ -235,7 +241,7 @@ public class ClaimRent extends BoughtTransaction return; } - String item_owner=mybuyer;//uuid saved when we started the transaction + //so now we need to scan through the entire claim, and find any inventory to save X.x //get chunks within area, get inventories, check if inventory is within the bounds, then process. List chunksToProcess=new ArrayList(); @@ -243,9 +249,6 @@ public class ClaimRent extends BoughtTransaction Location max=claim.getGreaterBoundaryCorner(); World world=min.getWorld(); - List lifeboat=new ArrayList(); - int invsize=0; - for (double x=min.getX();x processed=new ArrayList();//we have seen these inventories, this is more important for things like double chests, which we will see twice AbandonedItems item_saver=new AbandonedItems(mybuyer); for(Chunk chunk:chunksToProcess) { @@ -269,63 +273,37 @@ public class ClaimRent extends BoughtTransaction { if (tileEntity.getZ()>min.getZ()&&tileEntity.getZ()