9
0
mirror of https://github.com/Xiao-MoMi/Custom-Fishing.git synced 2025-12-29 03:49:07 +00:00

鱼饵动画

This commit is contained in:
Xiao-MoMi
2022-10-21 20:54:39 +08:00
parent 6d3eaf682c
commit 3217977e43
6 changed files with 122 additions and 11 deletions

View File

@@ -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);
});

View File

@@ -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();

View File

@@ -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() {

View File

@@ -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;
}
}