From 9706fef822c40518ac10f17627f7f7680e4cc5b5 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Tue, 12 Mar 2024 01:24:39 +0800 Subject: [PATCH] 3.4.0.6 --- .../customcrops/api/manager/ItemManager.java | 5 +- .../api/mechanic/misc/CRotation.java | 21 ++++++ build.gradle.kts | 2 +- .../mechanic/action/ActionManagerImpl.java | 45 +++++++++---- .../condition/ConditionManagerImpl.java | 22 +++++++ .../mechanic/item/CustomProvider.java | 18 ++++- .../mechanic/item/ItemManagerImpl.java | 45 +++++++------ .../item/custom/oraxen/OraxenProvider.java | 2 - .../customcrops/mechanic/world/CChunk.java | 5 +- .../world/adaptor/BukkitWorldAdaptor.java | 4 +- .../world/adaptor/SlimeWorldAdaptor.java | 10 ++- .../mechanic/world/block/MemoryCrop.java | 5 +- .../customcrops/utils/DisplayEntityUtils.java | 15 +++++ .../customcrops/utils/RandomUtils.java | 29 --------- .../customcrops/utils/RotationUtils.java | 65 ++++++++++++++++++- 15 files changed, 212 insertions(+), 81 deletions(-) create mode 100644 api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/CRotation.java create mode 100644 plugin/src/main/java/net/momirealms/customcrops/utils/DisplayEntityUtils.java delete mode 100644 plugin/src/main/java/net/momirealms/customcrops/utils/RandomUtils.java diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java index 39d9245..a1708df 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java @@ -20,6 +20,7 @@ package net.momirealms.customcrops.api.manager; import net.momirealms.customcrops.api.common.Reloadable; import net.momirealms.customcrops.api.integration.ItemLibrary; import net.momirealms.customcrops.api.mechanic.item.*; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Entity; @@ -42,9 +43,9 @@ public interface ItemManager extends Reloadable { void placeItem(Location location, ItemCarrier carrier, String id); - void placeItem(Location location, ItemCarrier carrier, String id, boolean rotate); + void placeItem(Location location, ItemCarrier carrier, String id, CRotation rotate); - void removeAnythingAt(Location location); + CRotation removeAnythingAt(Location location); @Nullable WateringCan getWateringCanByID(@NotNull String id); diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/CRotation.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/CRotation.java new file mode 100644 index 0000000..69f25e6 --- /dev/null +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/CRotation.java @@ -0,0 +1,21 @@ +package net.momirealms.customcrops.api.mechanic.misc; + +public enum CRotation { + + NONE(0f), + RANDOM(0f), + EAST(-90f), + SOUTH(0f), + WEST(90f), + NORTH(180f); + + private final float yaw; + + CRotation(float yaw) { + this.yaw = yaw; + } + + public float getYaw() { + return yaw; + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 4149a06..573db37 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { allprojects { project.group = "net.momirealms" - project.version = "3.4.0.4" + project.version = "3.4.0.6" apply() apply(plugin = "java") diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java index 8314f2d..317202a 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/action/ActionManagerImpl.java @@ -35,6 +35,7 @@ import net.momirealms.customcrops.api.mechanic.item.*; import net.momirealms.customcrops.api.mechanic.item.fertilizer.QualityCrop; import net.momirealms.customcrops.api.mechanic.item.fertilizer.Variation; import net.momirealms.customcrops.api.mechanic.item.fertilizer.YieldIncrease; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import net.momirealms.customcrops.api.mechanic.misc.Value; import net.momirealms.customcrops.api.mechanic.requirement.Requirement; import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate; @@ -281,6 +282,7 @@ public class ActionManagerImpl implements ActionManager { ArrayList msg = ConfigUtils.stringListArgs(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; List replaced = PlaceholderManager.getInstance().parse( state.getPlayer(), msg, @@ -343,6 +345,7 @@ public class ActionManagerImpl implements ActionManager { private void registerCloseInvAction() { registerAction("close-inv", (args, chance) -> state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; state.getPlayer().closeInventory(); }); } @@ -352,6 +355,7 @@ public class ActionManagerImpl implements ActionManager { String text = (String) args; return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; String parsed = PlaceholderManager.getInstance().parse(state.getPlayer(), text, state.getArgs()); AdventureManagerImpl.getInstance().sendActionbar(state.getPlayer(), parsed); }; @@ -360,6 +364,7 @@ public class ActionManagerImpl implements ActionManager { ArrayList texts = ConfigUtils.stringListArgs(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; String random = texts.get(ThreadLocalRandom.current().nextInt(texts.size())); random = PlaceholderManager.getInstance().parse(state.getPlayer(), random, state.getArgs()); AdventureManagerImpl.getInstance().sendActionbar(state.getPlayer(), random); @@ -372,6 +377,7 @@ public class ActionManagerImpl implements ActionManager { var value = ConfigUtils.getValue(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; if (CustomCropsPlugin.get().getVersionManager().isSpigot()) { state.getPlayer().getLocation().getWorld().spawn(state.getPlayer().getLocation(), ExperienceOrb.class, e -> e.setExperience((int) value.get(state.getPlayer()))); } else { @@ -387,6 +393,7 @@ public class ActionManagerImpl implements ActionManager { var value = ConfigUtils.getValue(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; Player player = state.getPlayer(); player.setFoodLevel((int) (player.getFoodLevel() + value.get(player))); }; @@ -395,6 +402,7 @@ public class ActionManagerImpl implements ActionManager { var value = ConfigUtils.getValue(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; Player player = state.getPlayer(); player.setSaturation((float) (player.getSaturation() + value.get(player))); }; @@ -406,6 +414,7 @@ public class ActionManagerImpl implements ActionManager { var value = ConfigUtils.getValue(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; state.getPlayer().giveExp((int) value.get(state.getPlayer())); AdventureManagerImpl.getInstance().sendSound(state.getPlayer(), Sound.Source.PLAYER, Key.key("minecraft:entity.experience_orb.pickup"), 1, 1); }; @@ -417,6 +426,7 @@ public class ActionManagerImpl implements ActionManager { boolean arg = (boolean) args; return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; state.getPlayer().swingHand(arg ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); }; }); @@ -523,7 +533,7 @@ public class ActionManagerImpl implements ActionManager { if (r1 < ratio[j]) { ItemStack drop = plugin.getItemManager().getItemStack(state.getPlayer(), qualityLoots[j]); if (drop == null || drop.getType() == Material.AIR) return; - if (toInv) { + if (toInv && state.getPlayer() != null) { ItemUtils.giveItem(state.getPlayer(), drop, 1); } else { state.getLocation().getWorld().dropItemNaturally(state.getLocation(), drop); @@ -563,7 +573,7 @@ public class ActionManagerImpl implements ActionManager { } } itemStack.setAmount(random); - if (toInv) { + if (toInv && state.getPlayer() != null) { ItemUtils.giveItem(state.getPlayer(), itemStack, random); } else { state.getLocation().getWorld().dropItemNaturally(state.getLocation(), itemStack); @@ -645,20 +655,17 @@ public class ActionManagerImpl implements ActionManager { plugin.getScheduler().runTaskSync(() -> { // fire event if (state.getPlayer() != null) { - CropPlantEvent plantEvent = new CropPlantEvent(state.getPlayer(), state.getItemInHand(), location, crop, 0); + CropPlantEvent plantEvent = new CropPlantEvent(state.getPlayer(), state.getItemInHand(), location, crop, point); if (EventUtils.fireAndCheckCancel(plantEvent)) { return; } + + plugin.getItemManager().placeItem(location, crop.getItemCarrier(), crop.getStageItemByPoint(plantEvent.getPoint()), crop.hasRotation() ? CRotation.RANDOM : CRotation.NONE); + plugin.getWorldManager().addCropAt(new MemoryCrop(SimpleLocation.of(location), crop.getKey(), plantEvent.getPoint()), SimpleLocation.of(location)); + } else { + plugin.getItemManager().placeItem(location, crop.getItemCarrier(), crop.getStageItemByPoint(point), crop.hasRotation() ? CRotation.RANDOM : CRotation.NONE); + plugin.getWorldManager().addCropAt(new MemoryCrop(SimpleLocation.of(location), crop.getKey(), point), SimpleLocation.of(location)); } - // place the crop - switch (crop.getItemCarrier()) { - case ITEM_FRAME, ITEM_DISPLAY, TRIPWIRE -> plugin.getItemManager().placeItem(location, crop.getItemCarrier(), crop.getStageItemByPoint(point)); - default -> { - LogUtils.warn("Unsupported type for crop: " + crop.getItemCarrier().name()); - return; - } - } - plugin.getWorldManager().addCropAt(new MemoryCrop(SimpleLocation.of(location), crop.getKey(), point), SimpleLocation.of(location)); }, state.getLocation()); }; } else { @@ -674,6 +681,10 @@ public class ActionManagerImpl implements ActionManager { boolean arg = (boolean) (args == null ? true : args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) { + LogUtils.warn("Break action can only be triggered by players"); + return; + } plugin.getScheduler().runTaskSync(() -> { Optional removed = plugin.getWorldManager().getBlockAt(SimpleLocation.of(state.getLocation())); if (removed.isPresent()) { @@ -792,6 +803,7 @@ public class ActionManagerImpl implements ActionManager { return state -> { if (Math.random() > chance) return; Player player = state.getPlayer(); + if (player == null) return; ItemStack itemStack = player.getInventory().getItemInMainHand(); itemStack.setAmount(Math.max(0, itemStack.getAmount() + amount)); }; @@ -822,6 +834,7 @@ public class ActionManagerImpl implements ActionManager { return state -> { if (Math.random() > chance) return; Player player = state.getPlayer(); + if (player == null) return; ItemUtils.giveItem(player, Objects.requireNonNull(CustomCropsPlugin.get().getItemManager().getItemStack(player, id)), amount); }; } else { @@ -855,6 +868,7 @@ public class ActionManagerImpl implements ActionManager { var value = ConfigUtils.getValue(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; VaultHook.getEconomy().depositPlayer(state.getPlayer(), value.get(state.getPlayer())); }; }); @@ -862,6 +876,7 @@ public class ActionManagerImpl implements ActionManager { var value = ConfigUtils.getValue(args); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; VaultHook.getEconomy().withdrawPlayer(state.getPlayer(), value.get(state.getPlayer())); }; }); @@ -963,6 +978,7 @@ public class ActionManagerImpl implements ActionManager { int fadeOut = section.getInt("fade-out", 10); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; AdventureManagerImpl.getInstance().sendTitle( state.getPlayer(), PlaceholderManager.getInstance().parse(state.getPlayer(), title, state.getArgs()), @@ -988,6 +1004,7 @@ public class ActionManagerImpl implements ActionManager { int fadeOut = section.getInt("fade-out", 10); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; AdventureManagerImpl.getInstance().sendTitle( state.getPlayer(), PlaceholderManager.getInstance().parse(state.getPlayer(), titles.get(ThreadLocalRandom.current().nextInt(titles.size())), state.getArgs()), @@ -1014,6 +1031,7 @@ public class ActionManagerImpl implements ActionManager { ); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; state.getPlayer().addPotionEffect(potionEffect); }; } else { @@ -1029,6 +1047,7 @@ public class ActionManagerImpl implements ActionManager { return state -> { if (Math.random() > chance) return; Player player = state.getPlayer(); + if (player == null) return; player.setLevel((int) Math.max(0, player.getLevel() + value.get(state.getPlayer()))); }; }); @@ -1046,6 +1065,7 @@ public class ActionManagerImpl implements ActionManager { ); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; AdventureManagerImpl.getInstance().sendSound(state.getPlayer(), sound); }; } else { @@ -1122,6 +1142,7 @@ public class ActionManagerImpl implements ActionManager { String target = section.getString("target"); return state -> { if (Math.random() > chance) return; + if (state.getPlayer() == null) return; Optional.ofNullable(plugin.getIntegrationManager().getLevelPlugin(pluginName)).ifPresentOrElse(it -> { it.addXp(state.getPlayer(), target, value.get(state.getPlayer())); }, () -> LogUtils.warn("Plugin (" + pluginName + "'s) level is not compatible. Please double check if it's a problem caused by pronunciation.")); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java index 6d530b4..9abdf14 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/condition/ConditionManagerImpl.java @@ -36,6 +36,8 @@ import net.momirealms.customcrops.mechanic.misc.CrowAttackAnimation; import net.momirealms.customcrops.utils.ClassUtils; import net.momirealms.customcrops.utils.ConfigUtils; import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.Farmland; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -634,6 +636,26 @@ public class ConditionManagerImpl implements ConditionManager { return worldPot.filter(pot -> pot.getWater() < value).isPresent(); }; }); + registerCondition("moisture_more_than", (args) -> { + int value = (int) args; + return block -> { + Block underBlock = block.getLocation().copy().add(0,-1,0).getBukkitLocation().getBlock(); + if (underBlock.getBlockData() instanceof Farmland farmland) { + return farmland.getMoisture() > value; + } + return false; + }; + }); + registerCondition("moisture_less_than", (args) -> { + int value = (int) args; + return block -> { + Block underBlock = block.getLocation().copy().add(0,-1,0).getBukkitLocation().getBlock(); + if (underBlock.getBlockData() instanceof Farmland farmland) { + return farmland.getMoisture() < value; + } + return false; + }; + }); } @SuppressWarnings("ResultOfMethodCallIgnored") diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/CustomProvider.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/CustomProvider.java index e854fcb..c23dd29 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/CustomProvider.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/CustomProvider.java @@ -18,12 +18,16 @@ package net.momirealms.customcrops.mechanic.item; import net.momirealms.customcrops.api.manager.VersionManager; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import net.momirealms.customcrops.utils.ConfigUtils; +import net.momirealms.customcrops.utils.DisplayEntityUtils; +import net.momirealms.customcrops.utils.RotationUtils; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -67,7 +71,7 @@ public interface CustomProvider { return entities.size() == 0; } - default void removeAnythingAt(Location location) { + default CRotation removeAnythingAt(Location location) { if (!removeBlock(location)) { Collection entities = location.getWorld().getNearbyEntities(location.toCenterLocation(), 0.5,0.51,0.5); entities.removeIf(entity -> { @@ -75,10 +79,22 @@ public interface CustomProvider { return type != EntityType.ITEM_FRAME && (!VersionManager.isHigherThan1_19_R3() || type != EntityType.ITEM_DISPLAY); }); + if (entities.size() == 0) return CRotation.NONE; + CRotation previousCRotation; + Entity first = entities.stream().findFirst().get(); + if (first instanceof ItemFrame itemFrame) { + previousCRotation = RotationUtils.getCRotation(itemFrame.getRotation()); + } else if (VersionManager.isHigherThan1_19_R3()) { + previousCRotation = DisplayEntityUtils.getRotation(first); + } else { + previousCRotation = CRotation.NONE; + } for (Entity entity : entities) { removeFurniture(entity); } + return previousCRotation; } + return CRotation.NONE; } default String getSomethingAt(Location location) { diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java index 22cf9f7..809e34f 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/ItemManagerImpl.java @@ -31,6 +31,7 @@ import net.momirealms.customcrops.api.mechanic.condition.DeathConditions; import net.momirealms.customcrops.api.mechanic.item.*; import net.momirealms.customcrops.api.mechanic.item.water.PassiveFillMethod; import net.momirealms.customcrops.api.mechanic.item.water.PositiveFillMethod; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar; import net.momirealms.customcrops.api.mechanic.requirement.State; import net.momirealms.customcrops.api.mechanic.world.SimpleLocation; @@ -337,27 +338,24 @@ public class ItemManagerImpl implements ItemManager { } @Override - public void placeItem(Location location, ItemCarrier carrier, String id, boolean rotate) { + public void placeItem(Location location, ItemCarrier carrier, String id, CRotation rotate) { switch (carrier) { case ITEM_DISPLAY, ITEM_FRAME -> { Entity entity = customProvider.placeFurniture(location, id); - if (rotate) { - if (entity instanceof ItemFrame frame) { - frame.setRotation(RotationUtils.getRandomRotation()); - } else if (entity instanceof ItemDisplay display) { - display.setRotation(RotationUtils.getRandomFloatRotation(), display.getLocation().getPitch()); - } + if (rotate == null || rotate == CRotation.NONE) return; + if (entity instanceof ItemFrame frame) { + frame.setRotation(RotationUtils.getBukkitRotation(rotate)); + } else if (entity instanceof ItemDisplay display) { + display.setRotation(RotationUtils.getFloatRotation(rotate), display.getLocation().getPitch()); } } - case TRIPWIRE, NOTE_BLOCK, CHORUS, MUSHROOM -> { - customProvider.placeBlock(location, id); - } + case TRIPWIRE, NOTE_BLOCK, CHORUS, MUSHROOM -> customProvider.placeBlock(location, id); } } @Override - public void removeAnythingAt(Location location) { - customProvider.removeAnythingAt(location); + public CRotation removeAnythingAt(Location location) { + return customProvider.removeAnythingAt(location); } @Override @@ -529,6 +527,11 @@ public class ItemManagerImpl implements ItemManager { return FunctionResult.PASS; } Player player = furnitureWrapper.getPlayer(); + // prevent players from rotating the crops + if (player.isSneaking()) { + return FunctionResult.CANCEL_EVENT_AND_RETURN; + } + Location cropLocation = furnitureWrapper.getLocation(); ItemStack itemInHand = furnitureWrapper.getItemInHand(); String itemID = getItemID(itemInHand); @@ -1661,14 +1664,8 @@ public class ItemManagerImpl implements ItemManager { return FunctionResult.RETURN; } // place the crop - switch (crop.getItemCarrier()) { - case ITEM_FRAME, ITEM_DISPLAY -> customProvider.placeFurniture(seedLocation, crop.getStageItemByPoint(plantEvent.getPoint())); - case TRIPWIRE -> customProvider.placeBlock(seedLocation, crop.getStageItemByPoint(plantEvent.getPoint())); - default -> { - LogUtils.warn("Unsupported type for crop: " + crop.getItemCarrier().name()); - return FunctionResult.RETURN; - } - } + this.placeItem(seedLocation, crop.getItemCarrier(), crop.getStageItemByPoint(plantEvent.getPoint()), crop.hasRotation() ? CRotation.RANDOM : CRotation.NONE); + // reduce item if (player.getGameMode() != GameMode.CREATIVE) itemInHand.setAmount(itemInHand.getAmount() - 1); @@ -1690,8 +1687,14 @@ public class ItemManagerImpl implements ItemManager { if (!(conditionWrapper instanceof InteractWrapper interactWrapper)) { return FunctionResult.PASS; } - Location cropLocation = interactWrapper.getLocation().toBlockLocation(); + Player player = interactWrapper.getPlayer(); + // prevent players from rotating the crops + if (player.isSneaking() && interactWrapper instanceof InteractFurnitureWrapper) { + return FunctionResult.CANCEL_EVENT_AND_RETURN; + } + + Location cropLocation = interactWrapper.getLocation().toBlockLocation(); ItemStack itemInHand = interactWrapper.getItemInHand(); State cropState = new State(player, itemInHand, cropLocation); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java index 6df9c96..73b2589 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/item/custom/oraxen/OraxenProvider.java @@ -23,8 +23,6 @@ import io.th0rgal.oraxen.api.OraxenItems; import io.th0rgal.oraxen.items.ItemBuilder; import io.th0rgal.oraxen.mechanics.Mechanic; import io.th0rgal.oraxen.mechanics.provided.gameplay.furniture.FurnitureMechanic; -import io.th0rgal.oraxen.mechanics.provided.gameplay.noteblock.NoteBlockMechanic; -import io.th0rgal.oraxen.mechanics.provided.gameplay.stringblock.StringBlockMechanic; import net.momirealms.customcrops.mechanic.item.CustomProvider; import org.bukkit.Location; import org.bukkit.Material; diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java index a9a2891..0766304 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java @@ -23,6 +23,7 @@ import net.momirealms.customcrops.api.mechanic.item.Crop; import net.momirealms.customcrops.api.mechanic.item.Fertilizer; import net.momirealms.customcrops.api.mechanic.item.Pot; import net.momirealms.customcrops.api.mechanic.item.Sprinkler; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import net.momirealms.customcrops.api.mechanic.requirement.State; import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate; import net.momirealms.customcrops.api.mechanic.world.ChunkPos; @@ -354,8 +355,8 @@ public class CChunk implements CustomCropsChunk { String pre = crop.getStageItemByPoint(previousPoint); String after = crop.getStageItemByPoint(x); if (pre.equals(after)) return; - CustomCropsPlugin.get().getItemManager().removeAnythingAt(bkLoc); - CustomCropsPlugin.get().getItemManager().placeItem(bkLoc, crop.getItemCarrier(), after, crop.hasRotation()); + CRotation CRotation = CustomCropsPlugin.get().getItemManager().removeAnythingAt(bkLoc); + CustomCropsPlugin.get().getItemManager().placeItem(bkLoc, crop.getItemCarrier(), after, CRotation); } @Override diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java index bfcb8b6..ffc2177 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java @@ -458,12 +458,12 @@ public class BukkitWorldAdaptor extends AbstractWorldAdaptor { // read date and season YamlConfiguration data = YamlConfiguration.loadConfiguration(leagcyFile); try { - Season season = Season.valueOf(data.getString("season")); + Season season = Season.valueOf(data.getString("season", "SPRING")); if (cWorld != null) cWorld.setInfoData(new WorldInfoData(season, data.getInt("date", 1))); world.getPersistentDataContainer().set(key, PersistentDataType.STRING, gson.toJson(new WorldInfoData(season, data.getInt("date", 1)))); - } catch (IllegalArgumentException e) { + } catch (Exception e) { if (cWorld != null) cWorld.setInfoData(WorldInfoData.empty()); } diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java index d562555..ad0e49f 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java @@ -23,7 +23,6 @@ import com.infernalsuite.aswm.api.events.LoadSlimeWorldEvent; import com.infernalsuite.aswm.api.world.SlimeWorld; import net.momirealms.customcrops.api.CustomCropsPlugin; import net.momirealms.customcrops.api.manager.WorldManager; -import net.momirealms.customcrops.api.mechanic.world.AbstractWorldAdaptor; import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate; import net.momirealms.customcrops.api.mechanic.world.ChunkPos; import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock; @@ -37,12 +36,11 @@ import net.momirealms.customcrops.scheduler.task.TickTask; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.event.EventHandler; -import org.bukkit.event.world.WorldLoadEvent; -import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.persistence.PersistentDataType; -import java.io.*; -import java.util.*; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.PriorityQueue; import java.util.concurrent.ConcurrentHashMap; public class SlimeWorldAdaptor extends BukkitWorldAdaptor { diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryCrop.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryCrop.java index f322ece..13094a4 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryCrop.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/block/MemoryCrop.java @@ -28,6 +28,7 @@ import net.momirealms.customcrops.api.mechanic.item.Crop; import net.momirealms.customcrops.api.mechanic.item.Fertilizer; import net.momirealms.customcrops.api.mechanic.item.ItemType; import net.momirealms.customcrops.api.mechanic.item.fertilizer.SpeedGrow; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import net.momirealms.customcrops.api.mechanic.requirement.State; import net.momirealms.customcrops.api.mechanic.world.SimpleLocation; import net.momirealms.customcrops.api.mechanic.world.level.AbstractCustomCropsBlock; @@ -173,8 +174,8 @@ public class MemoryCrop extends AbstractCustomCropsBlock implements WorldCrop { } } if (pre.equals(after)) return; - CustomCropsPlugin.get().getItemManager().removeAnythingAt(bukkitLocation); - CustomCropsPlugin.get().getItemManager().placeItem(bukkitLocation, crop.getItemCarrier(), after, crop.hasRotation()); + CRotation CRotation = CustomCropsPlugin.get().getItemManager().removeAnythingAt(bukkitLocation); + CustomCropsPlugin.get().getItemManager().placeItem(bukkitLocation, crop.getItemCarrier(), after, CRotation); }, bukkitLocation); } } \ No newline at end of file diff --git a/plugin/src/main/java/net/momirealms/customcrops/utils/DisplayEntityUtils.java b/plugin/src/main/java/net/momirealms/customcrops/utils/DisplayEntityUtils.java new file mode 100644 index 0000000..e23914e --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customcrops/utils/DisplayEntityUtils.java @@ -0,0 +1,15 @@ +package net.momirealms.customcrops.utils; + +import net.momirealms.customcrops.api.mechanic.misc.CRotation; +import org.bukkit.entity.Entity; +import org.bukkit.entity.ItemDisplay; + +public class DisplayEntityUtils { + + public static CRotation getRotation(Entity entity) { + if (entity instanceof ItemDisplay itemDisplay) { + return RotationUtils.getCRotation(itemDisplay.getLocation().getYaw()); + } + return CRotation.NONE; + } +} diff --git a/plugin/src/main/java/net/momirealms/customcrops/utils/RandomUtils.java b/plugin/src/main/java/net/momirealms/customcrops/utils/RandomUtils.java deleted file mode 100644 index 93da139..0000000 --- a/plugin/src/main/java/net/momirealms/customcrops/utils/RandomUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customcrops.utils; - -import java.util.concurrent.ThreadLocalRandom; - -public class RandomUtils { - - private static final ThreadLocalRandom randomSource = ThreadLocalRandom.current(); - - public static int getRandomInt(int from, int to) { - return randomSource.nextInt(from, to); - } -} diff --git a/plugin/src/main/java/net/momirealms/customcrops/utils/RotationUtils.java b/plugin/src/main/java/net/momirealms/customcrops/utils/RotationUtils.java index 1a89fe8..fd7c07d 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/utils/RotationUtils.java +++ b/plugin/src/main/java/net/momirealms/customcrops/utils/RotationUtils.java @@ -17,6 +17,7 @@ package net.momirealms.customcrops.utils; +import net.momirealms.customcrops.api.mechanic.misc.CRotation; import org.bukkit.Rotation; import java.util.Random; @@ -26,11 +27,73 @@ public class RotationUtils { private static final Rotation[] rotationsI = {Rotation.NONE, Rotation.FLIPPED, Rotation.CLOCKWISE, Rotation.COUNTER_CLOCKWISE}; private static final float[] rotationsF = {0f, 90f, 180f, -90f}; - public static Rotation getRandomRotation() { + public static Rotation getRandomBukkitRotation() { return rotationsI[new Random().nextInt(4)]; } public static float getRandomFloatRotation() { return rotationsF[new Random().nextInt(4)]; } + + public static float getFloatRotation(CRotation cRotation) { + if (cRotation == CRotation.RANDOM) { + return getRandomFloatRotation(); + } + return cRotation.getYaw(); + } + + public static Rotation getBukkitRotation(CRotation cRotation) { + switch (cRotation) { + case RANDOM -> { + return getRandomBukkitRotation(); + } + case EAST -> { + return Rotation.COUNTER_CLOCKWISE; + } + case WEST -> { + return Rotation.CLOCKWISE; + } + case NORTH -> { + return Rotation.FLIPPED; + } + default -> { + return Rotation.NONE; + } + } + } + + public static CRotation getCRotation(Rotation rotation) { + switch (rotation) { + default -> { + return CRotation.NONE; + } + case CLOCKWISE -> { + return CRotation.WEST; + } + case COUNTER_CLOCKWISE -> { + return CRotation.EAST; + } + case FLIPPED -> { + return CRotation.NORTH; + } + } + } + + public static CRotation getCRotation(float yaw) { + yaw = Math.abs(yaw); + switch ((int) (yaw/90)) { + case 1 -> { + return CRotation.WEST; + } + case 2 -> { + return CRotation.NORTH; + } + case 3 -> { + return CRotation.EAST; + } + default -> { + return CRotation.SOUTH; + } + } + } }