| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- package me.lethunderhawk.tradeplugin.trade;
- import me.lethunderhawk.economy.EconomyModule;
- import me.lethunderhawk.main.Main;
- import me.lethunderhawk.main.util.ItalicDeco;
- import me.lethunderhawk.tradeplugin.TradeModule;
- import net.kyori.adventure.audience.Audience;
- import net.kyori.adventure.text.Component;
- import net.kyori.adventure.text.format.NamedTextColor;
- import org.bukkit.NamespacedKey;
- import org.bukkit.entity.Player;
- import org.bukkit.inventory.Inventory;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.inventory.meta.ItemMeta;
- import org.bukkit.inventory.meta.SkullMeta;
- import org.bukkit.persistence.PersistentDataContainer;
- import org.bukkit.persistence.PersistentDataType;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.UUID;
- public class TradeSession {
- private final Player p1;
- private final Player p2;
- private final List<ItemStack> p1Items = new ArrayList<>();
- private final List<ItemStack> p2Items = new ArrayList<>();
- private static final NamespacedKey FLUX_KEY =
- new NamespacedKey(Main.getInstance(), "flux_item");
- private static final NamespacedKey OWNER_KEY =
- new NamespacedKey(Main.getInstance(), "flux_owner");
- private static final NamespacedKey VALUE_KEY =
- new NamespacedKey(Main.getInstance(), "flux_value");
- private TradeState state = TradeState.WAITING;
- private int p1Flux = 0, p2Flux = 0;
- private final TradeInventory inventory;
- public TradeSession(Player p1, Player p2) {
- this.p1 = p1;
- this.p2 = p2;
- this.inventory = new TradeInventory(this);
- p1.openInventory(inventory.getInventoryFor(p1));
- p2.openInventory(inventory.getInventoryFor(p2));
- }
- /**
- * @return if the player has already accepted
- */
- public boolean accept(Player p) {
- if (p.equals(p1)) {
- if(state == TradeState.ACCEPTED_P1){
- return true;
- }
- state = state == TradeState.ACCEPTED_P2 ? TradeState.COMPLETED : TradeState.ACCEPTED_P1;
- updateInventories();
- } else if(p.equals(p2)){
- if(state == TradeState.ACCEPTED_P2){
- return true;
- }
- state = state == TradeState.ACCEPTED_P1 ? TradeState.COMPLETED : TradeState.ACCEPTED_P2;
- updateInventories();
- }
- return false;
- }
- public void undoAccept(Player p){
- if (p.equals(p1)) {
- state = state == TradeState.ACCEPTED_P1 ? TradeState.WAITING : TradeState.ACCEPTED_P1;
- updateInventories();
- } else if(p.equals(p2)){
- state = state == TradeState.ACCEPTED_P2 ? TradeState.WAITING : TradeState.ACCEPTED_P2;
- updateInventories();
- }
- }
- private void updateInventories() {
- inventory.updateInventory(state);
- }
- public boolean addItem(Player p, ItemStack item) {
- if(item == null) return false;
- if (p.equals(p1)) {
- if(inventory.addItem(p1, item, true)
- && inventory.addItem(p2, item, false)){
- p1Items.add(item);
- return true;
- }
- } else if(p.equals(p2)){
- if(inventory.addItem(p2, item, true)
- && inventory.addItem(p1, item, false)){
- p2Items.add(item);
- return true;
- }
- }
- return false;
- }
- public boolean addCosmeticItem(Player p, ItemStack item) {
- if(item == null) return false;
- if (p.equals(p1)) {
- return inventory.addItem(p1, item, true)
- && inventory.addItem(p2, item, false);
- } else if(p.equals(p2)){
- return inventory.addItem(p2, item, true)
- && inventory.addItem(p1, item, false);
- }
- return false;
- }
- public void complete() {
- sendTradeCompletedMsg();
- for (ItemStack item : p1Items) {
- if(item != null){
- p2.getInventory().addItem(item);
- }
- }
- for (ItemStack item : p2Items) {
- if(item != null) {
- p1.getInventory().addItem(item);
- }
- }
- transferFlux();
- p1Items.clear();
- p2Items.clear();
- }
- private void sendReceivingMsg(Audience receiver, Component itemName, int amount){
- TradeModule.sendText(receiver, Component.text("+ ", NamedTextColor.GREEN )
- .append(itemName.color(NamedTextColor.GRAY))
- .append(Component.text((amount> 1 ? " x" + amount : ""), NamedTextColor.GRAY)));
- }
- private void sendGivingMsg(Audience receiver, Component itemName, int amount){
- TradeModule.sendText(receiver, Component.text("- ", NamedTextColor.RED )
- .append(itemName.color(NamedTextColor.GRAY))
- .append(Component.text((amount> 1 ? " x" + amount : ""), NamedTextColor.GRAY)));
- }
- private void sendTradeCompletedMsg() {
- sendTradeCompletedLine(p1, p2);
- sendTradeCompletedLine(p2, p1);
- sendItemTransfers(p1Items, p1, p2);
- sendItemTransfers(p2Items, p2, p1);
- sendFluxTransfer(p1Flux, p1, p2);
- sendFluxTransfer(p2Flux, p2, p1);
- }
- private void sendTradeCompletedLine(Player receiver, Player other) {
- TradeModule.sendText(receiver,
- Component.text("Handel mit ", NamedTextColor.GOLD)
- .append(other.displayName().color(NamedTextColor.GRAY))
- .append(Component.text(" abgeschlossen!", NamedTextColor.GOLD))
- );
- }
- private void sendItemTransfers(List<ItemStack> items, Audience giver, Audience receiver) {
- for (ItemStack item : items) {
- if (item == null) continue;
- sendGivingMsg(giver, item.displayName(), item.getAmount());
- sendReceivingMsg(receiver, item.displayName(), item.getAmount());
- }
- }
- private void sendFluxTransfer(int flux, Audience giver, Audience receiver) {
- if (flux <= 0) return;
- Component fluxComp = Component.text(flux)
- .append(Component.text(" Flux"));
- sendGivingMsg(giver, fluxComp, 1);
- sendReceivingMsg(receiver, fluxComp, 1);
- }
- private void transferFlux() {
- if(p2Flux > 0){
- EconomyModule.getInstance().getEconomyAPI().pay(p2.getUniqueId(), p1.getUniqueId(), p2Flux);
- }
- if(p1Flux > 0){
- EconomyModule.getInstance().getEconomyAPI().pay(p1.getUniqueId(), p2.getUniqueId(), p1Flux);
- }
- }
- public void decline() {
- for (ItemStack item : p1Items) {
- if(item != null){
- p1.getInventory().addItem(item);
- }
- }
- for (ItemStack item : p2Items) {
- if(item != null) {
- p2.getInventory().addItem(item);
- }
- }
- p1Items.clear();
- p2Items.clear();
- }
- public Player getP1() { return p1; }
- public Player getP2() { return p2; }
- public TradeInventory getTradeInventory() { return inventory; }
- public TradeState getTradeState() {
- return state;
- }
- public void removeItem(Player p, ItemStack item, int mySlot) {
- if(item == null) return;
- if (p.equals(p1)) {
- if(inventory.removeItem(p1, item, mySlot)){
- p1Items.remove(item);
- }
- } else if(p.equals(p2)){
- if(inventory.removeItem(p2, item, mySlot)){
- p2Items.remove(item);
- }
- }
- }
- public void setTradeState(TradeState state) {
- this.state = state;
- }
- public int getMoneyFor(Player p) {
- if(p1.getUniqueId().equals(p.getUniqueId())){
- return p1Flux;
- }
- if(p2.getUniqueId().equals(p.getUniqueId())){
- return p2Flux;
- }
- return 0;
- }
- public boolean addFluxValue(Player player, int value) {
- if(p1.getUniqueId().equals(player.getUniqueId())){
- if(addCosmeticItem(p1, getCosmeticFlux(p1, value))){
- p1Flux += value;
- refreshAllFlux();
- return true;
- }
- }else if(p2.getUniqueId().equals(player.getUniqueId())){
- if(addCosmeticItem(p2, getCosmeticFlux(p2, value))){
- p2Flux += value;
- refreshAllFlux();
- return true;
- }
- }
- return false;
- }
- public ItemStack getCosmeticFlux(Player owner, int value) {
- ItemStack item = TradeInventory.getFluxItemStack();
- SkullMeta meta = (SkullMeta) item.getItemMeta();
- meta.displayName(ItalicDeco.remove(Component.text(value + " Flux", NamedTextColor.GOLD)));
- meta.getPersistentDataContainer().set(FLUX_KEY, PersistentDataType.INTEGER, 1);
- meta.getPersistentDataContainer().set(OWNER_KEY, PersistentDataType.STRING, owner.getUniqueId().toString());
- meta.getPersistentDataContainer().set(VALUE_KEY, PersistentDataType.INTEGER, value);
- int total = TradeModule.getTradeManager()
- .getSession(owner)
- .getMoneyFor(owner);
- meta.lore(List.of(
- ItalicDeco.remove(Component.text("Lup-sum amount", NamedTextColor.GRAY)),
- ItalicDeco.remove(Component.text("", NamedTextColor.GRAY)),
- ItalicDeco.remove(Component.text("Total Flux Offered: ", NamedTextColor.GOLD)),
- ItalicDeco.remove(Component.text(String.valueOf(total), NamedTextColor.GRAY))
- ));
- item.setItemMeta(meta);
- return item;
- }
- public void refreshFluxItems(Inventory inv) {
- for (int i = 0; i < inv.getSize(); i++) {
- ItemStack item = inv.getItem(i);
- if (item == null) continue;
- ItemMeta meta = item.getItemMeta();
- if (meta == null) continue;
- PersistentDataContainer pdc = meta.getPersistentDataContainer();
- if (!pdc.has(FLUX_KEY, PersistentDataType.INTEGER)) continue;
- UUID ownerId = UUID.fromString(pdc.get(OWNER_KEY, PersistentDataType.STRING));
- int value = pdc.get(VALUE_KEY, PersistentDataType.INTEGER);
- Player owner = ownerId.equals(getP1().getUniqueId())
- ? getP1()
- : getP2();
- inv.setItem(i, getCosmeticFlux(owner, value));
- }
- }
- /**
- *
- * @param p The Player who is not the viewer
- * @return The Player who is the viewer
- */
- public Player getViewer(Player p){
- if(p.equals(p1)) {
- return p2;
- }else if(p.equals(p2)) {
- return p1;
- }
- return null;
- }
- public static NamespacedKey getFluxKey(){
- return FLUX_KEY;
- }
- public static NamespacedKey getOwnerKey(){
- return OWNER_KEY;
- }
- public static NamespacedKey getValueKey(){
- return VALUE_KEY;
- }
- public void removeFlux(Player p, int value) {
- if (p.equals(p1)) {
- p1Flux -= value;
- if (p1Flux < 0) p1Flux = 0;
- } else if (p.equals(p2)) {
- p2Flux -= value;
- if (p2Flux < 0) p2Flux = 0;
- }
- }
- public void refreshAllFlux() {
- refreshFluxItems(inventory.getInventoryFor(p1));
- refreshFluxItems(inventory.getInventoryFor(p2));
- }
- public boolean isP1(Player p) {
- return p1.equals(p);
- }
- }
|