diff options
author | Grayray75 <69988482+Grayray75@users.noreply.github.com> | 2023-09-29 16:58:26 +0200 |
---|---|---|
committer | Grayray75 <69988482+Grayray75@users.noreply.github.com> | 2023-09-29 16:59:10 +0200 |
commit | 3cc5f282d65d37c66a8c93035da38210c42fcb1d (patch) | |
tree | fb63e71a59ba10f8ed3fef9823a4280cf07f935c /src/main/java/me/xmrvizzy/skyblocker/skyblock/item | |
parent | 23e8e8a703db8f7bfda09a0c57919aa608631e8c (diff) | |
download | Skyblocker-3cc5f282d65d37c66a8c93035da38210c42fcb1d.tar.gz Skyblocker-3cc5f282d65d37c66a8c93035da38210c42fcb1d.tar.bz2 Skyblocker-3cc5f282d65d37c66a8c93035da38210c42fcb1d.zip |
Move code into the skyblock.item package
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker/skyblock/item')
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemCooldowns.java | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemCooldowns.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemCooldowns.java new file mode 100644 index 00000000..6569e04c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemCooldowns.java @@ -0,0 +1,119 @@ +package me.xmrvizzy.skyblocker.skyblock.item; + +import com.google.common.collect.ImmutableList; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.events.ClientPlayerBlockBreakEvent; +import me.xmrvizzy.skyblocker.utils.ItemUtils; +import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.HashMap; +import java.util.Map; + +public class ItemCooldowns { + private static final String JUNGLE_AXE_ID = "JUNGLE_AXE"; + private static final String TREECAPITATOR_ID = "TREECAPITATOR_AXE"; + private static final String GRAPPLING_HOOK_ID = "GRAPPLING_HOOK"; + private static final ImmutableList<String> BAT_ARMOR_IDS = ImmutableList.of("BAT_PERSON_HELMET", "BAT_PERSON_CHESTPLATE", "BAT_PERSON_LEGGINGS", "BAT_PERSON_BOOTS"); + + private static final Map<String, CooldownEntry> itemCooldowns = new HashMap<>(); + private static SkyblockerConfig.ItemCooldown config; + + public static void init() { + ClientPlayerBlockBreakEvent.AFTER.register(ItemCooldowns::afterBlockBreak); + UseItemCallback.EVENT.register(ItemCooldowns::onItemInteract); + config = SkyblockerConfig.get().general.itemCooldown; + } + + public static void afterBlockBreak(BlockPos pos, PlayerEntity player) { + if (!config.enableItemCooldowns) return; + + String usedItemId = ItemUtils.getItemId(player.getMainHandStack()); + if (usedItemId == null) return; + + if (usedItemId.equals(JUNGLE_AXE_ID)) { + if (!isItemOnCooldown(JUNGLE_AXE_ID)) { + itemCooldowns.put(JUNGLE_AXE_ID, new CooldownEntry(2000)); + } + } + else if (usedItemId.equals(TREECAPITATOR_ID)) { + if (!isItemOnCooldown(TREECAPITATOR_ID)) { + itemCooldowns.put(TREECAPITATOR_ID, new CooldownEntry(2000)); + } + } + } + + private static TypedActionResult<ItemStack> onItemInteract(PlayerEntity player, World world, Hand hand) { + if (!config.enableItemCooldowns) return TypedActionResult.pass(ItemStack.EMPTY); + + String usedItemId = ItemUtils.getItemId(player.getMainHandStack()); + if (usedItemId != null && usedItemId.equals(GRAPPLING_HOOK_ID) && player.fishHook != null) { + if (!isItemOnCooldown(GRAPPLING_HOOK_ID) && !isPlayerWearingBatArmor(player)) { + itemCooldowns.put(GRAPPLING_HOOK_ID, new CooldownEntry(2000)); + } + } + + return TypedActionResult.pass(ItemStack.EMPTY); + } + + public static boolean isItemOnCooldown(ItemStack itemStack) { + return isItemOnCooldown(ItemUtils.getItemId(itemStack)); + } + + private static boolean isItemOnCooldown(String itemId) { + if (itemCooldowns.containsKey(itemId)) { + CooldownEntry cooldownEntry = itemCooldowns.get(itemId); + if (cooldownEntry.isOnCooldown()) { + return true; + } + else { + itemCooldowns.remove(cooldownEntry); + return false; + } + } + + return false; + } + + public static CooldownEntry getItemCooldownEntry(ItemStack itemStack) { + return itemCooldowns.get(ItemUtils.getItemId(itemStack)); + } + + private static boolean isPlayerWearingBatArmor(PlayerEntity player) { + for (ItemStack stack : player.getArmorItems()) { + String itemId = ItemUtils.getItemId(stack); + if (!BAT_ARMOR_IDS.contains(itemId)) { + return false; + } + } + return true; + } + + public static class CooldownEntry { + private final int cooldown; + private final long startTime; + + public CooldownEntry(int cooldown) { + this.cooldown = cooldown; + this.startTime = System.currentTimeMillis(); + } + + public boolean isOnCooldown() { + return (this.startTime + this.cooldown) > System.currentTimeMillis(); + } + + public long getRemainingCooldown() { + long time = (this.startTime + this.cooldown) - System.currentTimeMillis(); + return time <= 0 ? 0 : time; + } + + public float getRemainingCooldownPercent() { + return this.isOnCooldown() ? ((float) this.getRemainingCooldown()) / ((float) cooldown) : 0.0f; + } + } +} |