summaryrefslogtreecommitdiff
path: root/src/main/java/net/uomc/mineshaft/crafting/CraftingRecipe.java
blob: 5f624a09cdaca51d5fe601fbc95ea4c852a39df2 (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
package net.uomc.mineshaft.crafting;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;

import net.dv8tion.jda.api.entities.Member;
import net.uomc.mineshaft.Mineshaft;
import net.uomc.mineshaft.MineshaftItem;

public class CraftingRecipe {
    MineshaftItem item;
    long quantity;
    Map<MineshaftItem, Long> ingredients;

    String buyMessage;
    Function<Member, Boolean> unlockCondition;

    private CraftingRecipe(MineshaftItem item, long quantity, Map<MineshaftItem, Long> ingredients) {
        this.item = item;
        this.quantity = quantity;
        this.ingredients = ingredients;
    }

    public static CraftingRecipe make(MineshaftItem item) {
        Map<MineshaftItem, Long> ingredients = new HashMap<>();
        return new CraftingRecipe(item, 1, ingredients);
    }

    public CraftingRecipe addIngredient(MineshaftItem item, long amount) {
        ingredients.put(item, amount);
        return this;
    }

    public MineshaftItem getItem() {
        return item;
    }

    public long getQuantity() {
        return quantity;
    }

    public Map<MineshaftItem, Long> getIngredients() {
        return ingredients;
    }

    public String getBuyMessage() {
        if (buyMessage == null)
            return "";
        return buyMessage;
    }

    public boolean isUnlocked(Member m) {
        if (unlockCondition == null)
            return true;

        return unlockCondition.apply(m);
    }

    public CraftingRecipe setBuyMessage(String message) {
        buyMessage = message;
        return this;
    }

    public CraftingRecipe setUnlockCondition(Function<Member, Boolean> function) {
        this.unlockCondition = function;
        return this;
    }

    public Map<MineshaftItem, Long> getMissingIngredients(Map<MineshaftItem, Long> items) {
        return getMissingIngredients(items, 1);
    }

    public Map<MineshaftItem, Long> getMissingIngredients(Map<MineshaftItem, Long> items, long amount) {
        Map<MineshaftItem, Long> lacking = new HashMap<MineshaftItem, Long>();
        getIngredients().forEach((item, q) -> {
            if (items.get(item)  < q* amount) {
                lacking.put(item, (q * amount) - items.get(item));
            }
        });

        return Collections.unmodifiableMap(lacking);
    }

}