Files
KitPvP/src/main/java/com/planetgallium/kitpvp/api/Kit.java
T

246 lines
7.7 KiB
Java

package com.planetgallium.kitpvp.api;
import com.planetgallium.kitpvp.item.AttributeWriter;
import com.planetgallium.kitpvp.util.Cooldown;
import com.planetgallium.kitpvp.util.Resource;
import com.planetgallium.kitpvp.util.Toolkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Kit {
private final String name;
private String permission;
private Cooldown cooldown;
private int level;
private int health;
private final Map<String, Object> options;
private final Map<Integer, ItemStack> inventory;
private final List<PotionEffect> effects;
private ItemStack kitHelmet;
private ItemStack kitChestplate;
private ItemStack kitLeggings;
private ItemStack kitBoots;
private ItemStack offhand;
private ItemStack fill;
public Kit(String name) {
this.name = name;
this.options = new HashMap<>();
this.inventory = new HashMap<>();
this.effects = new ArrayList<>();
}
public void setPermission(String permission) {
this.permission = permission;
}
public void setCooldown(Cooldown cooldown) {
this.cooldown = cooldown;
}
public void setLevel(int level) {
this.level = level;
}
public void setHealth(int health) {
this.health = health;
}
public void setOption(String key, Object value) {
// NOTE: using this strategy to pass data rather than using Resources class so
// kit class can be used externally without needing access to Resources
this.options.put(key, value);
}
public void setInventoryItem(int slot, ItemStack item) {
inventory.put(slot, item);
}
public void addEffect(PotionEffectType type, int amplifierNonZeroBased, int durationSeconds) {
PotionEffect effect = new PotionEffect(type, durationSeconds * 20, amplifierNonZeroBased - 1);
effects.add(effect);
}
public void setHelmet(ItemStack helmet) {
this.kitHelmet = helmet;
}
public void setChestplate(ItemStack chestplate) {
this.kitChestplate = chestplate;
}
public void setLeggings(ItemStack leggings) {
this.kitLeggings = leggings;
}
public void setBoots(ItemStack boots) {
this.kitBoots = boots;
}
public void setOffhand(ItemStack offhand) {
this.offhand = offhand;
}
public void setFill(ItemStack fill) {
this.fill = fill;
}
public void apply(Player player) {
List<ItemStack> overflowItems = new ArrayList<>();
boolean addOverflowItems = (Boolean) options.get("AddOverflowItemsOnKit");
if (kitHelmet != null) {
if (player.getInventory().getHelmet() == null) {
player.getInventory().setHelmet(kitHelmet);
} else {
overflowItems.add(kitHelmet);
}
}
if (kitChestplate != null) {
if (player.getInventory().getChestplate() == null) {
player.getInventory().setChestplate(kitChestplate);
} else {
overflowItems.add(kitChestplate);
}
}
if (kitLeggings != null) {
if (player.getInventory().getLeggings() == null) {
player.getInventory().setLeggings(kitLeggings);
} else {
overflowItems.add(kitLeggings);
}
}
if (kitBoots != null) {
if (player.getInventory().getBoots() == null) {
player.getInventory().setBoots(kitBoots);
} else {
overflowItems.add(kitBoots);
}
}
Toolkit.setMaxHealth(player, health);
for (int i = 0; i < 36; i++) {
if (addOverflowItems) {
// if kit wants to put an item in slot i, but slot i in player inventory is already taken
if (inventory.containsKey(i) && player.getInventory().getItem(i) != null) {
overflowItems.add(inventory.get(i)); // add kit item to overflow items
continue; // ignore this kit item, will be accounted for with giveOverflowItems
}
}
if (inventory.get(i) != null) {
player.getInventory().setItem(i, inventory.get(i));
} else {
if (fill != null) {
player.getInventory().setItem(i, fill);
}
}
}
if (offhand != null && Toolkit.versionToNumber() >= 19) {
player.getInventory().setItemInOffHand(offhand);
}
if (addOverflowItems) {
giveOverflowItems(player, overflowItems);
}
effects.stream().forEach(effect -> player.addPotionEffect(effect));
}
private void giveOverflowItems(Player p, List<ItemStack> overflowItems) {
for (int i = 0; i < 36; i++) {
if (p.getInventory().getItem(i) == null) { // if empty slot found
if (overflowItems.size() >= 1) {
p.getInventory().setItem(i, overflowItems.get(0));
overflowItems.remove(0);
} else {
return; // if no overflow items left, return out of function
}
}
}
boolean dropRemainingOverflowItems = (Boolean) options.get("DropRemainingOverflowItemsOnKit");
if (dropRemainingOverflowItems) {
for (ItemStack remainingOverflowItem : overflowItems) {
p.getWorld().dropItem(p.getLocation(), remainingOverflowItem);
}
} else {
String overflowItemsLostMessage = (String) options.get("Message-OverflowItemsLost");
p.sendMessage(overflowItemsLostMessage);
}
}
public void toResource(Resource resource) {
resource.set("Kit.Permission", permission != null ? permission : "kp.kit." + name);
resource.set("Kit.Cooldown", cooldown != null ? cooldown.formatted(true) : 0);
resource.set("Kit.Level", level);
resource.set("Kit.Health", health);
resource.save();
AttributeWriter.itemStackToResource(resource, "Inventory.Armor.Helmet", kitHelmet);
AttributeWriter.itemStackToResource(resource, "Inventory.Armor.Chestplate", kitChestplate);
AttributeWriter.itemStackToResource(resource, "Inventory.Armor.Leggings", kitLeggings);
AttributeWriter.itemStackToResource(resource, "Inventory.Armor.Boots", kitBoots);
for (Integer slot : inventory.keySet()) {
AttributeWriter.itemStackToResource(resource, "Inventory.Items." + slot, inventory.get(slot));
}
AttributeWriter.itemStackToResource(resource, "Inventory.Items.Offhand", offhand);
AttributeWriter.itemStackToResource(resource, "Inventory.Items.Fill", fill);
for (PotionEffect effect : effects) {
AttributeWriter.potionEffectToResource(resource, "Effects", effect);
}
resource.save();
}
public String getName() { return name; }
public String getPermission() { return permission; }
public Cooldown getCooldown() { return cooldown; }
public int getLevel() { return level; }
public int getHealth() { return health; }
public Map<Integer, ItemStack> getInventory() { return inventory; }
public List<PotionEffect> getEffects() { return effects; }
public ItemStack getHelmet() { return kitHelmet; }
public ItemStack getChestplate() { return kitChestplate; }
public ItemStack getLeggings() { return kitLeggings; }
public ItemStack getBoots() { return kitBoots; }
public ItemStack getFill() { return fill; }
}