diff --git a/build.gradle b/build.gradle index 416596c8..9db788e0 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'net.momirealms' -version = '1.2.0-SNAPSHOT' +version = '1.2.0-beta1' repositories { mavenCentral() @@ -55,7 +55,7 @@ dependencies { compileOnly('com.github.TechFortress:GriefPrevention:16.18') compileOnly('com.palmergames.bukkit.towny:towny:0.98.2.0') compileOnly('com.comphenix.protocol:ProtocolLib:4.8.0') - compileOnly('redis.clients:jedis:4.2.3') + compileOnly('redis.clients:jedis:4.3.0') compileOnly('me.clip:placeholderapi:2.11.1') compileOnly('com.sk89q.worldguard:worldguard-bukkit:7.0.7') compileOnly('io.lumine:Mythic-Dist:5.0.3-SNAPSHOT') @@ -65,6 +65,7 @@ dependencies { compileOnly('com.github.Zrips:Jobs:4.17.2') compileOnly('com.github.LoneDev6:api-itemsadder:3.2.3c') compileOnly('net.objecthunter:exp4j:0.4.8') + compileOnly('org.mariadb.jdbc:mariadb-java-client:3.0.6') implementation('net.kyori:adventure-api:4.11.0') implementation('net.kyori:adventure-platform-bukkit:4.1.2') implementation('net.kyori:adventure-text-minimessage:4.11.0') diff --git a/src/main/java/net/momirealms/customfishing/manager/FishingManager.java b/src/main/java/net/momirealms/customfishing/manager/FishingManager.java index 9893e368..3dc3d093 100644 --- a/src/main/java/net/momirealms/customfishing/manager/FishingManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/FishingManager.java @@ -42,6 +42,7 @@ import net.momirealms.customfishing.object.requirements.RequirementInterface; import net.momirealms.customfishing.object.totem.ActivatedTotem; import net.momirealms.customfishing.object.totem.Totem; import net.momirealms.customfishing.util.AdventureUtil; +import net.momirealms.customfishing.util.FakeItemUtil; import net.momirealms.customfishing.util.ItemStackUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; @@ -67,6 +68,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -146,6 +148,7 @@ public class FishingManager extends Function { boolean noRod = true; boolean noBait = true; int lureLevel = 0; + ItemStack baitItem = null; Bonus initialBonus = new Bonus(); initialBonus.setDifficulty(0); @@ -177,6 +180,7 @@ public class FishingManager extends Function { Bonus baitBonus = BonusManager.BAIT.get(nbtCompound.getString("id")); if (baitBonus != null) { initialBonus.addBonus(baitBonus); + baitItem = mainHandItem.clone(); mainHandItem.setAmount(mainHandItem.getAmount() - 1); noBait = false; } @@ -199,7 +203,9 @@ public class FishingManager extends Function { if (baitBonus != null){ initialBonus.addBonus(baitBonus); offHandItem.setAmount(offHandItem.getAmount() - 1); + baitItem = offHandItem.clone(); noBait = false; + } } else if (noSpecialRod && nbtCompound.getString("type").equals("rod")) { @@ -233,6 +239,7 @@ public class FishingManager extends Function { Bonus baitBonus = BonusManager.BAIT.get(cfCompound.getString("id")); if (baitBonus != null) { initialBonus.addBonus(baitBonus); + baitItem = itemStack.clone(); itemStack.setAmount(itemStack.getAmount() - 1); break; } @@ -256,7 +263,20 @@ public class FishingManager extends Function { return; } - BobberCheckTask bobberCheckTask = new BobberCheckTask(player, initialBonus, fishHook, this, lureLevel); + int entityID = 0; + if (baitItem != null) { + baitItem.setAmount(1); + entityID = new Random().nextInt(1000000); + try { + CustomFishing.protocolManager.sendServerPacket(player, FakeItemUtil.getSpawnPacket(entityID, fishHook.getLocation())); + CustomFishing.protocolManager.sendServerPacket(player, FakeItemUtil.getMetaPacket(entityID, baitItem)); + } + catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + BobberCheckTask bobberCheckTask = new BobberCheckTask(player, initialBonus, fishHook, this, lureLevel, entityID); bobberCheckTask.runTaskTimer(CustomFishing.plugin, 1, 1); bobberTaskCache.put(player, bobberCheckTask); }); diff --git a/src/main/java/net/momirealms/customfishing/manager/SellManager.java b/src/main/java/net/momirealms/customfishing/manager/SellManager.java index 008b4cd1..1d8a1843 100644 --- a/src/main/java/net/momirealms/customfishing/manager/SellManager.java +++ b/src/main/java/net/momirealms/customfishing/manager/SellManager.java @@ -234,13 +234,6 @@ public class SellManager extends Function { } } - public boolean isCoolDown(Player player, long delay) { - long time = System.currentTimeMillis(); - if (time - (coolDown.getOrDefault(player, time - delay)) < delay) return true; - coolDown.put(player, time); - return false; - } - @Override public void onCloseInventory(InventoryCloseEvent event) { final Player player = (Player) event.getPlayer(); diff --git a/src/main/java/net/momirealms/customfishing/object/fishing/BobberCheckTask.java b/src/main/java/net/momirealms/customfishing/object/fishing/BobberCheckTask.java index 102501f8..d281893c 100644 --- a/src/main/java/net/momirealms/customfishing/object/fishing/BobberCheckTask.java +++ b/src/main/java/net/momirealms/customfishing/object/fishing/BobberCheckTask.java @@ -27,16 +27,20 @@ import net.momirealms.customfishing.manager.LootManager; import net.momirealms.customfishing.manager.MessageManager; import net.momirealms.customfishing.object.loot.Loot; import net.momirealms.customfishing.util.AdventureUtil; +import net.momirealms.customfishing.util.FakeItemUtil; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Random; @@ -55,8 +59,10 @@ public class BobberCheckTask extends BukkitRunnable { private BukkitTask cache_2; private BukkitTask cache_3; private ArmorStand entityCache; + private int entityID; + private boolean land; - public BobberCheckTask(Player player, Bonus bonus, FishHook fishHook, FishingManager fishingManager, int lureLevel) { + public BobberCheckTask(Player player, Bonus bonus, FishHook fishHook, FishingManager fishingManager, int lureLevel, int entityID) { this.fishHook = fishHook; this.fishingManager = fishingManager; this.player = player; @@ -65,11 +71,22 @@ public class BobberCheckTask extends BukkitRunnable { this.first_time = true; this.jump_timer = 0; this.lureLevel = lureLevel; + this.entityID = entityID; + this.land = false; } @Override public void run() { timer ++; + if (!land && entityID != 0) { + try { + CustomFishing.protocolManager.sendServerPacket(player, FakeItemUtil.getVelocity(entityID, fishHook.getVelocity())); + CustomFishing.protocolManager.sendServerPacket(player, FakeItemUtil.getTpPacket(entityID, fishHook.getLocation())); + } + catch (InvocationTargetException e) { + e.printStackTrace(); + } + } if (timer > 3600) { stop(); } @@ -78,6 +95,7 @@ public class BobberCheckTask extends BukkitRunnable { return; } if (fishHook.getLocation().getBlock().getType() == Material.LAVA) { + land = true; if (!bonus.canLavaFishing()) { stop(); return; @@ -124,6 +142,14 @@ public class BobberCheckTask extends BukkitRunnable { entityCache.remove(); entityCache = null; } + if (entityID != 0) { + try { + CustomFishing.protocolManager.sendServerPacket(player, FakeItemUtil.getDestroyPacket(entityID)); + } + catch (InvocationTargetException e) { + e.printStackTrace(); + } + } } public void cancelTask() { diff --git a/src/main/java/net/momirealms/customfishing/util/FakeItemUtil.java b/src/main/java/net/momirealms/customfishing/util/FakeItemUtil.java new file mode 100644 index 00000000..4d7fa212 --- /dev/null +++ b/src/main/java/net/momirealms/customfishing/util/FakeItemUtil.java @@ -0,0 +1,66 @@ +package net.momirealms.customfishing.util; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import io.lumine.mythic.api.packs.Pack; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class FakeItemUtil { + + public static PacketContainer getDestroyPacket(int id) { + PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); + destroyPacket.getIntLists().write(0, List.of(id)); + return destroyPacket; + } + + public static PacketContainer getSpawnPacket(int id, Location location) { + PacketContainer entityPacket = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); + entityPacket.getModifier().write(0, id); + entityPacket.getModifier().write(1, UUID.randomUUID()); + entityPacket.getEntityTypeModifier().write(0, EntityType.DROPPED_ITEM); + entityPacket.getDoubles().write(0, location.getX()); + entityPacket.getDoubles().write(1, location.getY() - 0.5); + entityPacket.getDoubles().write(2, location.getZ()); + return entityPacket; + } + + public static PacketContainer getMetaPacket(int id, ItemStack itemStack) { + PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); + metaPacket.getIntegers().write(0, id); + metaPacket.getWatchableCollectionModifier().write(0, createDataWatcher(itemStack).getWatchableObjects()); + return metaPacket; + } + + public static PacketContainer getTpPacket(int id, Location location) { + PacketContainer tpPacket = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); + tpPacket.getModifier().write(0, id); + tpPacket.getDoubles().write(0, location.getX()); + tpPacket.getDoubles().write(1, location.getY() - 0.5); + tpPacket.getDoubles().write(2, location.getZ()); + return tpPacket; + } + + public static PacketContainer getVelocity(int id, Vector vector) { + PacketContainer entityPacket = new PacketContainer(PacketType.Play.Server.ENTITY_VELOCITY); + entityPacket.getModifier().write(0, id); + entityPacket.getIntegers().write(1, (int) (vector.getX() * 8000)); + entityPacket.getIntegers().write(2, (int) (vector.getY() * 8000)); + entityPacket.getIntegers().write(3, (int) (vector.getZ() * 8000)); + return entityPacket; + } + + public static WrappedDataWatcher createDataWatcher(ItemStack itemStack) { + WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(8, WrappedDataWatcher.Registry.getItemStackSerializer(false)), itemStack); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(5, WrappedDataWatcher.Registry.get(Boolean.class)), true); + return wrappedDataWatcher; + } +} diff --git a/src/main/resources/sell-fish.yml b/src/main/resources/sell-fish.yml index 95951b11..cfacebe8 100644 --- a/src/main/resources/sell-fish.yml +++ b/src/main/resources/sell-fish.yml @@ -2,6 +2,11 @@ container-title: 'Sell Fish' rows: 6 +# Limit the money player can earn per day +sell-limitation: + enable: true + upper-limit: 10000 + price-formula: '{base} + {bonus} * {size}' sounds: