From eb70272d4884f74d64f751ad87a64411adbd38b5 Mon Sep 17 00:00:00 2001 From: SpaceNerden <72929861+SpaceNerden@users.noreply.github.com> Date: Wed, 1 Jun 2022 15:45:28 +0800 Subject: [PATCH 01/11] Implement Timefall --- .../holoitemsrevamp/enchantment/Timefall.java | 112 ++++++++++++++++++ .../mc/holoitemsrevamp/item/TimefallItem.java | 75 ++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java create mode 100644 src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java new file mode 100644 index 00000000..6e18a93f --- /dev/null +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -0,0 +1,112 @@ +package xyz.holocons.mc.holoitemsrevamp.enchantment; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; +import xyz.holocons.mc.holoitemsrevamp.ability.PlayerInteract; +import xyz.holocons.mc.holoitemsrevamp.enchant.CustomEnchantment; + +import java.util.HashMap; +import java.util.Map; + +public class Timefall extends CustomEnchantment implements PlayerInteract { + + private final HoloItemsRevamp plugin; + + public Timefall(HoloItemsRevamp plugin) { + super(plugin, "timefall"); + this.plugin = plugin; + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public boolean conflictsWith(@NotNull Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(@NotNull ItemStack item) { + return item.getType() == Material.POWDER_SNOW_BUCKET; + } + + @Override + public @NotNull Component displayName(int level) { + return Component.text("Timefall", NamedTextColor.GOLD) + .decoration(TextDecoration.ITALIC, false); + } + + @Override + public int getItemStackCost(ItemStack itemStack) { + return Integer.MAX_VALUE; + } + + @Override + public void run(PlayerInteractEvent event, ItemStack itemStack) { + + // If not right-clicked or a container, return + if(!event.getAction().isRightClick() || event.getAction() != Action.RIGHT_CLICK_BLOCK){ + return; + } + + final Map age = new HashMap<>() { + }; + age.put(Material.COPPER_BLOCK, Material.EXPOSED_COPPER); + age.put(Material.CUT_COPPER, Material.EXPOSED_CUT_COPPER); + age.put(Material.CUT_COPPER_SLAB, Material.EXPOSED_CUT_COPPER_SLAB); + age.put(Material.CUT_COPPER_STAIRS, Material.EXPOSED_CUT_COPPER_STAIRS); + age.put(Material.EXPOSED_COPPER, Material.WEATHERED_COPPER); + age.put(Material.EXPOSED_CUT_COPPER, Material.WEATHERED_CUT_COPPER); + age.put(Material.EXPOSED_CUT_COPPER_SLAB, Material.WEATHERED_CUT_COPPER_SLAB); + age.put(Material.EXPOSED_CUT_COPPER_STAIRS, Material.WEATHERED_CUT_COPPER_STAIRS); + age.put(Material.WEATHERED_COPPER, Material.OXIDIZED_COPPER); + age.put(Material.WEATHERED_CUT_COPPER, Material.OXIDIZED_CUT_COPPER); + age.put(Material.WEATHERED_CUT_COPPER_SLAB, Material.OXIDIZED_CUT_COPPER_SLAB); + age.put(Material.WEATHERED_CUT_COPPER_STAIRS, Material.OXIDIZED_CUT_COPPER_STAIRS); + + + ItemStack item = event.getItem(); + item.setType(Material.BUCKET); + item.setItemMeta(new ItemStack(Material.BUCKET).getItemMeta()); + + Player player = event.getPlayer(); + player.setFreezeTicks(60); + Location center = player.getLocation(); + player.getWorld().spawnParticle(Particle.WHITE_ASH, center, 200, 5, 5, 5); + + boolean consumeItem = false; + for (int x=-5; x<=5; x++) { + for (int y=-5; y<=5; y++) { + for(int z=-5; z<=5; z++) { + Block block = center.clone().add(x, y, z).getBlock(); + Material type = age.get(block.getType()); + if(type!=null) + block.setType(type); + consumeItem = true; + } + } + } + + // Deletes item if it was used. + if(consumeItem){ + event.getItem().setAmount(0); + } + + + } +} + diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java new file mode 100644 index 00000000..e87e9b9b --- /dev/null +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java @@ -0,0 +1,75 @@ +package xyz.holocons.mc.holoitemsrevamp.item; + +import com.strangeone101.holoitemsapi.CustomItem; +import com.strangeone101.holoitemsapi.interfaces.Enchantable; +import com.strangeone101.holoitemsapi.recipe.RecipeManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; +import org.jetbrains.annotations.NotNull; +import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; +import xyz.holocons.mc.holoitemsrevamp.enchant.EnchantManager; + +import java.util.List; + +public class TimefallItem extends CustomItem implements Enchantable { + + private final static String name = "timefall"; + private final static Material material = Material.POWDER_SNOW_BUCKET; + private final static String displayName = ChatColor.BLUE + "Timefall"; + private final static List lore = List.of( + "Accelerate oxidation" + ); + + private final EnchantManager enchantManager; + + public TimefallItem(HoloItemsRevamp plugin) { + super(name, material, displayName, lore); + this.enchantManager = plugin.getEnchantManager(); + this.setStackable(false); + this.register(); + this.registerRecipe(); + } + + @Override + public ItemStack buildStack(Player player) { + return applyEnchantment(super.buildStack(player)); + } + + private void registerRecipe() { + final var recipe = new ShapedRecipe(getKey(), buildStack(null)); + recipe.shape( + "ABA", + "BCB", + "ABA" + ); + recipe.setIngredient('A', Material.SNOW); + recipe.setIngredient('B', Material.BONE_BLOCK); + recipe.setIngredient('C', Material.BUCKET); + RecipeManager.registerRecipe(recipe); + } + + @Override + public @NotNull Enchantment getEnchantment() { + return Enchantment.getByKey(getKey()); + } + + @Override + public ItemStack applyEnchantment(ItemStack itemStack) { + var enchantedStack = itemStack.clone(); + var enchantedMeta = enchantedStack.hasItemMeta() ? enchantedStack.getItemMeta() : Bukkit.getItemFactory().getItemMeta(enchantedStack.getType()); + + if (enchantedMeta.addEnchant(getEnchantment(), 1, false)) { + enchantedStack.setItemMeta(enchantedMeta); + enchantManager.removeCustomEnchantmentLore(enchantedStack); + enchantManager.applyCustomEnchantmentLore(enchantedStack); + return enchantedStack; + } else { + return null; + } + } +} From ee2b71872b46bef5510c92e3bc739c749fc372ce Mon Sep 17 00:00:00 2001 From: SpaceNerden Date: Thu, 31 Aug 2023 22:18:37 +0200 Subject: [PATCH 02/11] refractor: refractor branch to latest --- .../enchantment/EnchantManager.java | 2 ++ .../collection/CollectionManager.java | 3 ++- .../holoitemsrevamp/enchantment/Timefall.java | 12 ++++----- .../mc/holoitemsrevamp/item/TimefallItem.java | 27 +++++++++---------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java index 35f32e5b..f62eba3b 100644 --- a/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java +++ b/src/main/java/com/strangeone101/holoitemsapi/enchantment/EnchantManager.java @@ -9,6 +9,7 @@ import xyz.holocons.mc.holoitemsrevamp.enchantment.Magnet; import xyz.holocons.mc.holoitemsrevamp.enchantment.Memento; import xyz.holocons.mc.holoitemsrevamp.enchantment.TideRider; +import xyz.holocons.mc.holoitemsrevamp.enchantment.Timefall; import xyz.holocons.mc.holoitemsrevamp.integration.Integrations; import java.lang.reflect.Field; @@ -111,6 +112,7 @@ private static Set buildCustomEnchantments(HoloItemsRevamp pl new Magnet(plugin), new Memento(plugin), new TideRider(plugin), + new Timefall(plugin), new Backdash(plugin)); } } diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java index 9914efa9..ab99f886 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java @@ -19,6 +19,7 @@ import xyz.holocons.mc.holoitemsrevamp.item.MagnetBook; import xyz.holocons.mc.holoitemsrevamp.item.MementoItem; import xyz.holocons.mc.holoitemsrevamp.item.TideRiderItem; +import xyz.holocons.mc.holoitemsrevamp.item.TimefallItem; public class CollectionManager { @@ -572,7 +573,7 @@ public List getLore() { } private static Idol buildKronii(HoloItemsRevamp plguin) { - return new Idol() { + return new Idol(new TimefallItem(plguin)) { @Override public @NotNull String getSkinBase64() { diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index 6e18a93f..0faa065b 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -1,5 +1,7 @@ package xyz.holocons.mc.holoitemsrevamp.enchantment; +import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; +import com.strangeone101.holoitemsapi.enchantment.EnchantmentAbility; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -14,13 +16,11 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; -import xyz.holocons.mc.holoitemsrevamp.ability.PlayerInteract; -import xyz.holocons.mc.holoitemsrevamp.enchant.CustomEnchantment; import java.util.HashMap; import java.util.Map; -public class Timefall extends CustomEnchantment implements PlayerInteract { +public class Timefall extends CustomEnchantment implements EnchantmentAbility { private final HoloItemsRevamp plugin; @@ -51,12 +51,12 @@ public boolean canEnchantItem(@NotNull ItemStack item) { } @Override - public int getItemStackCost(ItemStack itemStack) { + public int getCostMultiplier() { return Integer.MAX_VALUE; } @Override - public void run(PlayerInteractEvent event, ItemStack itemStack) { + public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { // If not right-clicked or a container, return if(!event.getAction().isRightClick() || event.getAction() != Action.RIGHT_CLICK_BLOCK){ @@ -105,8 +105,6 @@ public void run(PlayerInteractEvent event, ItemStack itemStack) { if(consumeItem){ event.getItem().setAmount(0); } - - } } diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java index e87e9b9b..af40adab 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java @@ -1,18 +1,21 @@ package xyz.holocons.mc.holoitemsrevamp.item; -import com.strangeone101.holoitemsapi.CustomItem; -import com.strangeone101.holoitemsapi.interfaces.Enchantable; +import com.strangeone101.holoitemsapi.enchantment.EnchantManager; +import com.strangeone101.holoitemsapi.enchantment.Enchantable; +import com.strangeone101.holoitemsapi.item.CustomItem; import com.strangeone101.holoitemsapi.recipe.RecipeManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; import org.jetbrains.annotations.NotNull; import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; -import xyz.holocons.mc.holoitemsrevamp.enchant.EnchantManager; import java.util.List; @@ -20,27 +23,23 @@ public class TimefallItem extends CustomItem implements Enchantable { private final static String name = "timefall"; private final static Material material = Material.POWDER_SNOW_BUCKET; - private final static String displayName = ChatColor.BLUE + "Timefall"; - private final static List lore = List.of( - "Accelerate oxidation" + private final static Component displayName = Component.text("Timefall", NamedTextColor.BLUE); + + private final static List lore = List.of( + Component.text("Accelerate oxidation") ); private final EnchantManager enchantManager; public TimefallItem(HoloItemsRevamp plugin) { - super(name, material, displayName, lore); + super(plugin, name, material, displayName, lore); this.enchantManager = plugin.getEnchantManager(); this.setStackable(false); this.register(); - this.registerRecipe(); } @Override - public ItemStack buildStack(Player player) { - return applyEnchantment(super.buildStack(player)); - } - - private void registerRecipe() { + protected Recipe getRecipe() { final var recipe = new ShapedRecipe(getKey(), buildStack(null)); recipe.shape( "ABA", @@ -50,7 +49,7 @@ private void registerRecipe() { recipe.setIngredient('A', Material.SNOW); recipe.setIngredient('B', Material.BONE_BLOCK); recipe.setIngredient('C', Material.BUCKET); - RecipeManager.registerRecipe(recipe); + return recipe; } @Override From a152b9b972cd7e6a16e19094f28c66707d5bdbee Mon Sep 17 00:00:00 2001 From: SpaceNerden Date: Thu, 7 Sep 2023 22:02:01 +0200 Subject: [PATCH 03/11] fix: change implementation of Timefalleroni Instead of oxidizing copper blocks by 1 level, random tick a random tickable block x (25) times. --- .../holoitemsrevamp/enchantment/Timefall.java | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index 0faa065b..a0ba284c 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -1,5 +1,7 @@ package xyz.holocons.mc.holoitemsrevamp.enchantment; +import com.destroystokyo.paper.MaterialSetTag; +import com.destroystokyo.paper.MaterialTags; import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; import com.strangeone101.holoitemsapi.enchantment.EnchantmentAbility; import net.kyori.adventure.text.Component; @@ -19,6 +21,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Random; public class Timefall extends CustomEnchantment implements EnchantmentAbility { @@ -63,22 +66,6 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { return; } - final Map age = new HashMap<>() { - }; - age.put(Material.COPPER_BLOCK, Material.EXPOSED_COPPER); - age.put(Material.CUT_COPPER, Material.EXPOSED_CUT_COPPER); - age.put(Material.CUT_COPPER_SLAB, Material.EXPOSED_CUT_COPPER_SLAB); - age.put(Material.CUT_COPPER_STAIRS, Material.EXPOSED_CUT_COPPER_STAIRS); - age.put(Material.EXPOSED_COPPER, Material.WEATHERED_COPPER); - age.put(Material.EXPOSED_CUT_COPPER, Material.WEATHERED_CUT_COPPER); - age.put(Material.EXPOSED_CUT_COPPER_SLAB, Material.WEATHERED_CUT_COPPER_SLAB); - age.put(Material.EXPOSED_CUT_COPPER_STAIRS, Material.WEATHERED_CUT_COPPER_STAIRS); - age.put(Material.WEATHERED_COPPER, Material.OXIDIZED_COPPER); - age.put(Material.WEATHERED_CUT_COPPER, Material.OXIDIZED_CUT_COPPER); - age.put(Material.WEATHERED_CUT_COPPER_SLAB, Material.OXIDIZED_CUT_COPPER_SLAB); - age.put(Material.WEATHERED_CUT_COPPER_STAIRS, Material.OXIDIZED_CUT_COPPER_STAIRS); - - ItemStack item = event.getItem(); item.setType(Material.BUCKET); item.setItemMeta(new ItemStack(Material.BUCKET).getItemMeta()); @@ -88,22 +75,29 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { Location center = player.getLocation(); player.getWorld().spawnParticle(Particle.WHITE_ASH, center, 200, 5, 5, 5); + int ticks = 25; boolean consumeItem = false; + for (int x=-5; x<=5; x++) { for (int y=-5; y<=5; y++) { for(int z=-5; z<=5; z++) { Block block = center.clone().add(x, y, z).getBlock(); - Material type = age.get(block.getType()); - if(type!=null) - block.setType(type); + if(block.getBlockData().isRandomlyTicked()) + { + for (int i = 0; i < ticks; i++) { + block.randomTick(); + } consumeItem = true; + } } } } + + // Deletes item if it was used. if(consumeItem){ - event.getItem().setAmount(0); + event.getItem().subtract(1); } } } From 5893f6e28034087dd6ee1d72c8954a0d1058b49c Mon Sep 17 00:00:00 2001 From: SpaceNerden Date: Thu, 7 Sep 2023 22:02:48 +0200 Subject: [PATCH 04/11] fix: activation on chest right-click --- .../holocons/mc/holoitemsrevamp/enchantment/Timefall.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index a0ba284c..944c716c 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -66,6 +66,11 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { return; } + // If the block right-clicked is an interactable block, return + if(event.getClickedBlock().getBlockData().getMaterial().isInteractable()){ + return; + } + ItemStack item = event.getItem(); item.setType(Material.BUCKET); item.setItemMeta(new ItemStack(Material.BUCKET).getItemMeta()); From 81a4e0ee87a6ca69f37ec1b7037fbdaf793f5cbb Mon Sep 17 00:00:00 2001 From: SpaceNerden Date: Sat, 9 Sep 2023 10:29:48 +0200 Subject: [PATCH 05/11] perf: change implementation of timefalleroni --- .../holoitemsrevamp/enchantment/Timefall.java | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index 944c716c..727cf368 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -4,6 +4,7 @@ import com.destroystokyo.paper.MaterialTags; import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; import com.strangeone101.holoitemsapi.enchantment.EnchantmentAbility; +import net.kyori.adventure.text.BlockNBTComponent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -19,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; +import java.util.BitSet; import java.util.HashMap; import java.util.Map; import java.util.Random; @@ -58,51 +60,58 @@ public int getCostMultiplier() { return Integer.MAX_VALUE; } + // TYSM: https://stackoverflow.com/a/34363187 + private int[] get3DCoords(int id, int maxX, int maxY){ + int z = id/(maxX*maxY); + id -= (z*maxX*maxY); + int y =id/maxX; + int x = id%maxX; + return new int[] {x, y, z}; + } + @Override public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { + Block clickedBlock = event.getClickedBlock(); + // If not right-clicked or a container, return if(!event.getAction().isRightClick() || event.getAction() != Action.RIGHT_CLICK_BLOCK){ return; } // If the block right-clicked is an interactable block, return - if(event.getClickedBlock().getBlockData().getMaterial().isInteractable()){ + if(clickedBlock.getBlockData().getMaterial().isInteractable()){ return; } - ItemStack item = event.getItem(); - item.setType(Material.BUCKET); - item.setItemMeta(new ItemStack(Material.BUCKET).getItemMeta()); + itemStack.setItemMeta(null); + itemStack.setType(Material.BUCKET); Player player = event.getPlayer(); player.setFreezeTicks(60); Location center = player.getLocation(); player.getWorld().spawnParticle(Particle.WHITE_ASH, center, 200, 5, 5, 5); - int ticks = 25; - boolean consumeItem = false; - - for (int x=-5; x<=5; x++) { - for (int y=-5; y<=5; y++) { - for(int z=-5; z<=5; z++) { - Block block = center.clone().add(x, y, z).getBlock(); - if(block.getBlockData().isRandomlyTicked()) - { - for (int i = 0; i < ticks; i++) { - block.randomTick(); - } - consumeItem = true; - } - } - } - } + Random r = new Random(); + // 125 = 5^3, or the dimensions of the AoE + // To change AoE to 8x8x8, change 125 to 8*8*8 (512) and get3DCoords' maxX and maxY accordingly + BitSet visitedKeys = new BitSet(125); + // Get origin to center AoE to center + Location origin = clickedBlock.getLocation().add(-2, -2, -2); - // Deletes item if it was used. - if(consumeItem){ - event.getItem().subtract(1); + for (int i = 0; i < 25; i++) { + int blockKey = r.nextInt(125); + if (!visitedKeys.get(blockKey)){ + visitedKeys.set(blockKey); + int[] coords = get3DCoords(blockKey, 5, 5); + Block block = origin.clone().add(coords[0], coords[1], coords[2]).getBlock(); + if (block.getBlockData().isRandomlyTicked()){ + block.randomTick(); + plugin.getLogger().info(block.translationKey()+" at "+block.getLocation().toString()); + } + } } } } From 773282ef29100aa226cd6bfa012b82cf31ffdb45 Mon Sep 17 00:00:00 2001 From: SpaceNerden Date: Sat, 9 Sep 2023 10:40:10 +0200 Subject: [PATCH 06/11] fix: remove debug log --- .../xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index 727cf368..e3f56889 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -109,7 +109,6 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { Block block = origin.clone().add(coords[0], coords[1], coords[2]).getBlock(); if (block.getBlockData().isRandomlyTicked()){ block.randomTick(); - plugin.getLogger().info(block.translationKey()+" at "+block.getLocation().toString()); } } } From 295f1619e120914cda6f88d821f2a7ad5eb5a1b6 Mon Sep 17 00:00:00 2001 From: SpaceNerden Date: Sat, 9 Sep 2023 10:46:14 +0200 Subject: [PATCH 07/11] docs: fix strange comment --- .../xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index e3f56889..a447f96a 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -97,7 +97,7 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { // 125 = 5^3, or the dimensions of the AoE // To change AoE to 8x8x8, change 125 to 8*8*8 (512) and get3DCoords' maxX and maxY accordingly BitSet visitedKeys = new BitSet(125); - // Get origin to center AoE to center + // Get origin to center AoE to clicked block Location origin = clickedBlock.getLocation().add(-2, -2, -2); From 9cfc3d8ed23f433398a0f523e879c11010889d7a Mon Sep 17 00:00:00 2001 From: Derek Lee Date: Sat, 9 Sep 2023 20:36:35 -0700 Subject: [PATCH 08/11] Randomize random tick count and effect radius --- .../holoitemsrevamp/enchantment/Timefall.java | 97 ++++++++----------- .../mc/holoitemsrevamp/item/TimefallItem.java | 19 ++-- 2 files changed, 50 insertions(+), 66 deletions(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index a447f96a..d53a1e96 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -1,37 +1,33 @@ package xyz.holocons.mc.holoitemsrevamp.enchantment; -import com.destroystokyo.paper.MaterialSetTag; -import com.destroystokyo.paper.MaterialTags; -import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; -import com.strangeone101.holoitemsapi.enchantment.EnchantmentAbility; -import net.kyori.adventure.text.BlockNBTComponent; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Location; +import java.util.BitSet; +import java.util.concurrent.ThreadLocalRandom; + import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; +import org.bukkit.event.Event.Result; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; -import java.util.BitSet; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; +import com.strangeone101.holoitemsapi.enchantment.CustomEnchantment; +import com.strangeone101.holoitemsapi.enchantment.EnchantmentAbility; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; public class Timefall extends CustomEnchantment implements EnchantmentAbility { - private final HoloItemsRevamp plugin; + private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current(); + private static final int[] TICK_COUNT_OPTIONs = { 60, 80, 100, 120 }; public Timefall(HoloItemsRevamp plugin) { super(plugin, "timefall"); - this.plugin = plugin; } @Override @@ -52,7 +48,7 @@ public boolean canEnchantItem(@NotNull ItemStack item) { @Override public @NotNull Component displayName(int level) { return Component.text("Timefall", NamedTextColor.GOLD) - .decoration(TextDecoration.ITALIC, false); + .decoration(TextDecoration.ITALIC, false); } @Override @@ -60,58 +56,47 @@ public int getCostMultiplier() { return Integer.MAX_VALUE; } - // TYSM: https://stackoverflow.com/a/34363187 - private int[] get3DCoords(int id, int maxX, int maxY){ - int z = id/(maxX*maxY); - id -= (z*maxX*maxY); - int y =id/maxX; - int x = id%maxX; - return new int[] {x, y, z}; + private static Block getBlockByIndex(Block origin, int maxX, int maxY, int index) { + final var z = index / (maxX * maxY); + index -= (z * maxX * maxY); + final var y = index / maxX; + final var x = index % maxX; + return origin.getRelative(x, y, z); } @Override public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { - - Block clickedBlock = event.getClickedBlock(); - - // If not right-clicked or a container, return - if(!event.getAction().isRightClick() || event.getAction() != Action.RIGHT_CLICK_BLOCK){ - return; - } - - // If the block right-clicked is an interactable block, return - if(clickedBlock.getBlockData().getMaterial().isInteractable()){ + event.setUseItemInHand(Result.DENY); + if (event.getAction() == Action.RIGHT_CLICK_BLOCK + && event.getClickedBlock().getBlockData().getMaterial().isInteractable()) { return; } itemStack.setItemMeta(null); itemStack.setType(Material.BUCKET); - Player player = event.getPlayer(); - player.setFreezeTicks(60); - Location center = player.getLocation(); - player.getWorld().spawnParticle(Particle.WHITE_ASH, center, 200, 5, 5, 5); - - - Random r = new Random(); - // 125 = 5^3, or the dimensions of the AoE - // To change AoE to 8x8x8, change 125 to 8*8*8 (512) and get3DCoords' maxX and maxY accordingly - BitSet visitedKeys = new BitSet(125); - // Get origin to center AoE to clicked block - Location origin = clickedBlock.getLocation().add(-2, -2, -2); + final var radius = RANDOM.nextInt(3) + 2; + final var distance = (radius * 2) + 1; + final var blockCount = distance * distance * distance; - - for (int i = 0; i < 25; i++) { - int blockKey = r.nextInt(125); - if (!visitedKeys.get(blockKey)){ - visitedKeys.set(blockKey); - int[] coords = get3DCoords(blockKey, 5, 5); - Block block = origin.clone().add(coords[0], coords[1], coords[2]).getBlock(); - if (block.getBlockData().isRandomlyTicked()){ + final var player = event.getPlayer(); + player.setFreezeTicks(60); + player.getWorld().spawnParticle(Particle.WHITE_ASH, + player.getX(), player.getY() + radius - 1, player.getZ(), 200, + radius, radius, radius); + + final var visitedBlocks = new BitSet(blockCount); + final var origin = player.getLocation().add(-radius, -1, -radius).getBlock(); + final var tickCount = TICK_COUNT_OPTIONs[RANDOM.nextInt(TICK_COUNT_OPTIONs.length)]; + for (var i = 0; i < tickCount; i++) { + final var blockIndex = RANDOM.nextInt(blockCount); + if (!visitedBlocks.get(blockIndex)) { + visitedBlocks.set(blockIndex); + final var block = getBlockByIndex(origin, distance, distance, blockIndex); + if (block.getBlockData().isRandomlyTicked()) { block.randomTick(); } } } } } - diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java index af40adab..f338039b 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/item/TimefallItem.java @@ -1,23 +1,22 @@ package xyz.holocons.mc.holoitemsrevamp.item; -import com.strangeone101.holoitemsapi.enchantment.EnchantManager; -import com.strangeone101.holoitemsapi.enchantment.Enchantable; -import com.strangeone101.holoitemsapi.item.CustomItem; -import com.strangeone101.holoitemsapi.recipe.RecipeManager; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; +import java.util.List; + import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; import org.jetbrains.annotations.NotNull; -import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; -import java.util.List; +import com.strangeone101.holoitemsapi.enchantment.EnchantManager; +import com.strangeone101.holoitemsapi.enchantment.Enchantable; +import com.strangeone101.holoitemsapi.item.CustomItem; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import xyz.holocons.mc.holoitemsrevamp.HoloItemsRevamp; public class TimefallItem extends CustomItem implements Enchantable { From 70835da562aa2ef3786452794a42250fcddb52cc Mon Sep 17 00:00:00 2001 From: Derek Lee Date: Sat, 9 Sep 2023 20:38:21 -0700 Subject: [PATCH 09/11] Fix typo --- .../mc/holoitemsrevamp/collection/CollectionManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java index ab99f886..fda18f15 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/collection/CollectionManager.java @@ -572,8 +572,8 @@ public List getLore() { }; } - private static Idol buildKronii(HoloItemsRevamp plguin) { - return new Idol(new TimefallItem(plguin)) { + private static Idol buildKronii(HoloItemsRevamp plugin) { + return new Idol(new TimefallItem(plugin)) { @Override public @NotNull String getSkinBase64() { From 59de33f87de3ed50dc6e70549a4e1557d7261955 Mon Sep 17 00:00:00 2001 From: Derek Lee Date: Sat, 9 Sep 2023 23:32:00 -0700 Subject: [PATCH 10/11] Account for random tick speed game rule --- .../holocons/mc/holoitemsrevamp/enchantment/Timefall.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index d53a1e96..6ab9299c 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -3,6 +3,7 @@ import java.util.BitSet; import java.util.concurrent.ThreadLocalRandom; +import org.bukkit.GameRule; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; @@ -87,6 +88,7 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { final var visitedBlocks = new BitSet(blockCount); final var origin = player.getLocation().add(-radius, -1, -radius).getBlock(); + final var randomTickSpeed = Math.min(player.getWorld().getGameRuleValue(GameRule.RANDOM_TICK_SPEED), 30); final var tickCount = TICK_COUNT_OPTIONs[RANDOM.nextInt(TICK_COUNT_OPTIONs.length)]; for (var i = 0; i < tickCount; i++) { final var blockIndex = RANDOM.nextInt(blockCount); @@ -94,7 +96,9 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { visitedBlocks.set(blockIndex); final var block = getBlockByIndex(origin, distance, distance, blockIndex); if (block.getBlockData().isRandomlyTicked()) { - block.randomTick(); + for (var j = 0; j < randomTickSpeed; j++) { + block.randomTick(); + } } } } From bea29e4f89426e9ba10809e90979d1fbc345c3f7 Mon Sep 17 00:00:00 2001 From: Derek Lee Date: Wed, 13 Sep 2023 18:01:17 -0700 Subject: [PATCH 11/11] Randomize chance of item consumption --- .../holocons/mc/holoitemsrevamp/enchantment/Timefall.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java index 6ab9299c..17f30e4a 100644 --- a/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java +++ b/src/main/java/xyz/holocons/mc/holoitemsrevamp/enchantment/Timefall.java @@ -73,9 +73,6 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { return; } - itemStack.setItemMeta(null); - itemStack.setType(Material.BUCKET); - final var radius = RANDOM.nextInt(3) + 2; final var distance = (radius * 2) + 1; final var blockCount = distance * distance * distance; @@ -102,5 +99,10 @@ public void onPlayerInteract(PlayerInteractEvent event, ItemStack itemStack) { } } } + + if (visitedBlocks.get(RANDOM.nextInt(blockCount))) { + itemStack.setItemMeta(null); + itemStack.setType(Material.BUCKET); + } } }