All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.sefiraat.slimetinker.events.friend.EventChannels Maven / Gradle / Ivy

package io.github.sefiraat.slimetinker.events.friend;

import io.github.sefiraat.slimetinker.SlimeTinker;
import io.github.sefiraat.slimetinker.items.tinkermaterials.TinkerMaterial;
import io.github.sefiraat.slimetinker.items.tinkermaterials.TinkerMaterialManager;
import io.github.sefiraat.slimetinker.managers.TraitManager;
import io.github.sefiraat.slimetinker.utils.Experience;
import io.github.sefiraat.slimetinker.utils.Ids;
import io.github.sefiraat.slimetinker.utils.ItemUtils;
import io.github.sefiraat.slimetinker.utils.ThemeUtils;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import java.util.Map;

public final class EventChannels {

    private EventChannels() {
        throw new UnsupportedOperationException("Utility Class");
    }

    public static void settlePotionEffects(EventFriend friend) {
        Player p = friend.getPlayer();
        for (Map.Entry entry : friend.getPotionEffects().entrySet()) {
            boolean resetHealth = false;
            double health = 0;
            if (entry.getKey() == PotionEffectType.HEALTH_BOOST) {
                resetHealth = true;
                health = p.getHealth();
            }
            PotionEffectType potionEffectType = entry.getKey();
            int tickDuration = SlimeTinker.RUNNABLE_TICK_RATE + getBonusTicks(potionEffectType);
            int amplifier = entry.getValue() - 1;
            friend.getPlayer().addPotionEffect(new PotionEffect(potionEffectType, tickDuration, amplifier, false, false, true));
            if (resetHealth) {
                p.setHealth(health);
            }
        }
    }

    /**
     * We give 20 ticks bonus to traits so they stay active between applications.
     * We give more to confusion for the outro and much more to night vision for blinking
     *
     * @param potionEffectType The PotionEffect being applied
     * @return int for number of bonus ticks required
     */
    private static int getBonusTicks(PotionEffectType potionEffectType) {
        if (potionEffectType.equals(PotionEffectType.CONFUSION)) {
            return 70;
        } else if (potionEffectType.equals(PotionEffectType.NIGHT_VISION)) {
            return 210;
        }
        return 20;
    }

    public static void checkTool(EventFriend friend) {

        ItemStack i = friend.getPlayer().getInventory().getItemInMainHand();

        if (!ItemUtils.isTool(i)) {
            return;
        }

        if (eventShouldCancelIfBroken(i, friend.getEventType())) {
            friend.setActionTaken(true);
            friend.setCancelEvent(true);
            friend.getPlayer().sendMessage(ThemeUtils.WARNING + "Your tool is broken, you should really repair it!");
            return;
        }

        friend.setActionTaken(true);
        friend.setTool(i);
        friend.setActiveFriendElement(ActiveFriendElement.TOOL);

        String matPropertyHead = ItemUtils.getToolHeadMaterial(i);
        String matPropertyBinding = ItemUtils.getToolBindingMaterial(i);
        String matPropertyRod = ItemUtils.getToolRodMaterial(i);

        TinkerMaterial headMaterial = TinkerMaterialManager.getMap().get(matPropertyHead);
        TinkerMaterial binderMaterial = TinkerMaterialManager.getMap().get(matPropertyBinding);
        TinkerMaterial rodMaterial = TinkerMaterialManager.getMap().get(matPropertyRod);

        TraitManager manager = SlimeTinker.getInstance().getTraitManager();

        if (headMaterial != null && manager.isEnabled(matPropertyHead, Ids.HEAD)) {
            headMaterial.runEvent(friend.getEventType(), TraitPartType.HEAD, friend);
        }
        if (binderMaterial != null && manager.isEnabled(matPropertyBinding, Ids.BINDING)) {
            binderMaterial.runEvent(friend.getEventType(), TraitPartType.BINDER, friend);
        }
        if (rodMaterial != null && manager.isEnabled(matPropertyRod, Ids.ROD)) {
            rodMaterial.runEvent(friend.getEventType(), TraitPartType.ROD, friend);
        }

    }

    private static boolean eventShouldCancelIfBroken(ItemStack i, TraitEventType type) {
        return
            (ItemUtils.isTinkersBroken(i) && ItemUtils.doesNotWorkWhenBroken(i))
                && (type == TraitEventType.BLOCK_BREAK || type == TraitEventType.ENTITY_DAMAGED);
    }

    public static void checkArmour(EventFriend friend) {
        if (!friend.isCancelEvent()) {
            checkHelm(friend);
            checkChestplate(friend);
            checkLeggings(friend);
            checkBoots(friend);
        }
    }

    public static void checkHelm(EventFriend friend) {

        ItemStack i = friend.getPlayer().getInventory().getHelmet();

        if (!ItemUtils.isArmour(i) || (ItemUtils.isTinkersBroken(i) && ItemUtils.doesNotWorkWhenBroken(i))) {
            return;
        }

        friend.setActionTaken(true);
        friend.setActiveFriendElement(ActiveFriendElement.HELMET);
        friend.setHelmet(i);
        checkArmourPiece(friend);

    }

    public static void checkChestplate(EventFriend friend) {

        ItemStack i = friend.getPlayer().getInventory().getChestplate();

        if (!ItemUtils.isArmour(i) || (ItemUtils.isTinkersBroken(i) && ItemUtils.doesNotWorkWhenBroken(i))) {
            return;
        }

        friend.setActionTaken(true);
        friend.setActiveFriendElement(ActiveFriendElement.CHESTPLATE);
        friend.setChestplate(i);
        checkArmourPiece(friend);

    }

    public static void checkLeggings(EventFriend friend) {

        ItemStack i = friend.getPlayer().getInventory().getLeggings();

        if (!ItemUtils.isArmour(i) || (ItemUtils.isTinkersBroken(i) && ItemUtils.doesNotWorkWhenBroken(i))) {
            return;
        }

        friend.setActionTaken(true);
        friend.setActiveFriendElement(ActiveFriendElement.LEGGINGS);
        friend.setLeggings(i);
        checkArmourPiece(friend);

    }

    public static void checkBoots(EventFriend friend) {

        ItemStack i = friend.getPlayer().getInventory().getBoots();

        if (!ItemUtils.isArmour(i) || (ItemUtils.isTinkersBroken(i) && ItemUtils.doesNotWorkWhenBroken(i))) {
            return;
        }

        friend.setActionTaken(true);
        friend.setActiveFriendElement(ActiveFriendElement.BOOTS);
        friend.setBoots(i);
        checkArmourPiece(friend);

    }

    public static void checkArmourPiece(EventFriend friend) {

        ItemStack i = friend.getActiveStack();

        String matPropertyPlate = ItemUtils.getArmourPlateMaterial(i);
        String matPropertyGambeson = ItemUtils.getArmourGambesonMaterial(i);
        String matPropertyLinks = ItemUtils.getArmourLinksMaterial(i);

        TinkerMaterial plateMaterial = TinkerMaterialManager.getMap().get(matPropertyPlate);
        TinkerMaterial gambesonMaterial = TinkerMaterialManager.getMap().get(matPropertyGambeson);
        TinkerMaterial linksMaterial = TinkerMaterialManager.getMap().get(matPropertyLinks);

        TraitManager manager = SlimeTinker.getInstance().getTraitManager();

        if (plateMaterial != null && manager.isEnabled(matPropertyPlate, Ids.PLATE)) {
            plateMaterial.runEvent(friend.getEventType(), TraitPartType.PLATES, friend);
        }
        if (gambesonMaterial != null && manager.isEnabled(matPropertyGambeson, Ids.GAMBESON)) {
            gambesonMaterial.runEvent(friend.getEventType(), TraitPartType.GAMBESON, friend);
        }
        if (linksMaterial != null && manager.isEnabled(matPropertyLinks, Ids.LINKS)) {
            linksMaterial.runEvent(friend.getEventType(), TraitPartType.LINKS, friend);
        }

    }

    public static void provideKillExp(EventFriend friend, int baseAmount) {

        ItemStack tool = friend.getTool();
        ItemStack helm = friend.getHelmet();
        ItemStack chst = friend.getChestplate();
        ItemStack legg = friend.getLeggings();
        ItemStack boot = friend.getBoots();

        if (tool != null) {
            int amount = (int) (baseAmount * friend.getToolExpMod());
            Experience.addExp(tool, amount, friend.getPlayer(), false);
        }

        if (helm != null) {
            int amount = (int) (baseAmount * friend.getHelmExpMod());
            Experience.addExp(helm, amount, friend.getPlayer(), false);
        }

        if (chst != null) {
            int amount = (int) (baseAmount * friend.getChestExpMod());
            Experience.addExp(chst, amount, friend.getPlayer(), false);
        }

        if (legg != null) {
            int amount = (int) (baseAmount * friend.getLeggingsExpMod());
            Experience.addExp(legg, amount, friend.getPlayer(), false);
        }

        if (boot != null) {
            int amount = (int) (baseAmount * friend.getBootsExpMod());
            Experience.addExp(boot, amount, friend.getPlayer(), false);
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy