summaryrefslogtreecommitdiff
path: root/dicore3/core/src/main/java/io/dico/dicore/InventoryEventUtil.java
blob: 3be2179e1a27c985616005a324b67c16f40142e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package io.dico.dicore;

import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class InventoryEventUtil {
    
    private InventoryEventUtil() {
    
    }
    
    public static ItemStack getNewItem(InventoryClickEvent event) {
        Inventory clicked = event.getInventory();
        switch (event.getAction()) {
            case SWAP_WITH_CURSOR:
            case PLACE_ALL:
                return event.getCursor();
            case PICKUP_ALL:
            case HOTBAR_MOVE_AND_READD:
            case MOVE_TO_OTHER_INVENTORY:
            case DROP_ALL_SLOT:
            case COLLECT_TO_CURSOR:
                return null;
            case PICKUP_HALF:
            case PICKUP_SOME:
                ItemStack item = clicked.getItem(event.getSlot()).clone();
                item.setAmount(item.getAmount() / 2);
                return item;
            case PICKUP_ONE:
            case DROP_ONE_SLOT:
                item = clicked.getItem(event.getSlot()).clone();
                item.setAmount(Math.max(0, item.getAmount() - 1));
                return item;
            case PLACE_ONE:
                item = event.getView().getCursor().clone();
                item.setAmount(1);
                return item;
            case PLACE_SOME:
                item = event.getView().getCursor().clone();
                item.setAmount(item.getAmount() / 2);
                return item;
            case HOTBAR_SWAP:
                return event.getView().getBottomInventory().getItem(event.getHotbarButton());
            default:
                return clicked.getItem(event.getSlot());
        }
    }
    
    
    public static Map<Integer, ItemStack> deduceChangesIfItemAdded(Inventory inventory, ItemStack added, boolean computeNewItem) {
        int addedAmount = added.getAmount();
        Map<Integer, ItemStack> rv = Collections.emptyMap();
        
        for (int n = inventory.getSize(), i = 0; i < n; i++) {
            if (addedAmount <= 0) break;
            
            ItemStack current = inventory.getItem(i);
            if (current == null || current.getType() == Material.AIR || current.isSimilar(added)) {
                int count = current == null ? 0 : current.getAmount();
                int max = (current == null ? added : current).getType().getMaxStackSize();
                if (count < max) {
                    int diff = max - count;
                    if (diff > addedAmount) {
                        diff = addedAmount;
                    }
                    addedAmount -= diff;
                    
                    if (rv.isEmpty()) rv = new LinkedHashMap<>();
                    
                    if (computeNewItem) {
                        current = (current == null ? added : current).clone();
                        current.setAmount(count + diff);
                        rv.put(i, current);
                    } else {
                        rv.put(i, null);
                    }
                }
            }
        }
        
        return rv;
    }
    
    
    public static ItemStack getNewHeldItemIfPickedUp(PlayerInventory inventory, ItemStack added) {
        int heldItemSlot = inventory.getHeldItemSlot();
        ItemStack heldItem = inventory.getItem(heldItemSlot);
        
        if (SpigotUtil.isItemPresent(heldItem) && !added.isSimilar(heldItem)) {
            return null;
        }
        
        int amt = added.getAmount();
        for (int i = 0; i < heldItemSlot; i++) {
            ItemStack item = inventory.getItem(i);
            if (!SpigotUtil.isItemPresent(item)) {
                return null;
            }
            if (item.isSimilar(item)) {
                amt -= Math.max(0, item.getMaxStackSize() - item.getAmount());
                if (amt <= 0) {
                    return null;
                }
            }
        }
        
        added = added.clone();
        added.setAmount(amt + Math.max(0, heldItem == null ? 0 : heldItem.getAmount()));
        return added;
    }
    
    
}