mirror of
https://github.com/Xiao-MoMi/Custom-Fishing.git
synced 2025-12-29 03:49:07 +00:00
鱼饵动画
This commit is contained in:
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user