diff --git a/src/main/java/net/momirealms/customcrops/ConfigReader.java b/src/main/java/net/momirealms/customcrops/ConfigReader.java
index 5c9a0fa..c40a9af 100644
--- a/src/main/java/net/momirealms/customcrops/ConfigReader.java
+++ b/src/main/java/net/momirealms/customcrops/ConfigReader.java
@@ -380,7 +380,11 @@ public class ConfigReader {
YamlConfiguration config = getConfig("season.yml");
enable = config.getBoolean("season.enable",false);
+
if (enable){
+ if (Config.growMode == 4){
+ AdventureManager.consoleMessage("[CustomCrops] Warining: It's not advised to enable season in mode 4");
+ }
greenhouse = config.getBoolean("season.greenhouse.enable",false);
if (greenhouse) {
range = config.getInt("season.greenhouse.range",7);
diff --git a/src/main/java/net/momirealms/customcrops/CustomCrops.java b/src/main/java/net/momirealms/customcrops/CustomCrops.java
index de1bac4..a131225 100644
--- a/src/main/java/net/momirealms/customcrops/CustomCrops.java
+++ b/src/main/java/net/momirealms/customcrops/CustomCrops.java
@@ -104,9 +104,6 @@ public final class CustomCrops extends JavaPlugin {
@Override
public void onDisable() {
-
- HoloUtil.cache.keySet().forEach(location -> HoloUtil.cache.get(location).remove());
-
if (this.cropManager != null){
this.cropManager.cleanData();
this.cropManager.updateData();
diff --git a/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java b/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java
index aea7dc6..4a22b11 100644
--- a/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java
+++ b/src/main/java/net/momirealms/customcrops/datamanager/CropManager.java
@@ -427,6 +427,7 @@ public class CropManager {
CustomBlock.remove(potLocation);
CustomBlock.place(ConfigReader.Basic.pot, potLocation);
}, random);
+ return ConfigReader.Config.growMode == 4;
}
}else {
//若无下一阶段,无巨大化,未启用季节,则移除无用数据
diff --git a/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java b/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java
index cd014d3..548fb69 100644
--- a/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java
+++ b/src/main/java/net/momirealms/customcrops/listener/InteractEntity.java
@@ -149,7 +149,7 @@ public class InteractEntity implements Listener {
if (ConfigReader.Message.hasSprinklerInfo){
String string = ConfigReader.Message.sprinklerLeft + ConfigReader.Message.sprinklerFull.repeat(currentWater) +
ConfigReader.Message.sprinklerEmpty.repeat(maxWater - currentWater) + ConfigReader.Message.sprinklerRight;
- if(HoloUtil.cache.get(location.add(0, ConfigReader.Message.sprinklerOffset,0)) == null) {
+ if(!HoloUtil.cache.contains(location.add(0, ConfigReader.Message.sprinklerOffset,0))) {
HoloUtil.showHolo(string.replace("{max_water}", String.valueOf(maxWater)).replace("{water}", String.valueOf(currentWater)), player, location, ConfigReader.Message.sprinklerTime);
}
}
diff --git a/src/main/java/net/momirealms/customcrops/listener/RightClick.java b/src/main/java/net/momirealms/customcrops/listener/RightClick.java
index 40e4e9f..4a4f65c 100644
--- a/src/main/java/net/momirealms/customcrops/listener/RightClick.java
+++ b/src/main/java/net/momirealms/customcrops/listener/RightClick.java
@@ -313,7 +313,7 @@ public class RightClick implements Listener {
Fertilizer config = ConfigReader.FERTILIZERS.get(fertilizer.getKey());
String name = config.getName();
int max_times = config.getTimes();
- if(HoloUtil.cache.get(location.add(0.5, ConfigReader.Message.cropOffset, 0.5)) == null) {
+ if(!HoloUtil.cache.contains(location.add(0.5, ConfigReader.Message.cropOffset, 0.5))) {
HoloUtil.showHolo(ConfigReader.Message.cropText.replace("{fertilizer}", name).replace("{times}", String.valueOf(fertilizer.getTimes())).replace("{max_times}", String.valueOf(max_times)), player, location, ConfigReader.Message.cropTime);
}
}
@@ -324,7 +324,7 @@ public class RightClick implements Listener {
Fertilizer config = ConfigReader.FERTILIZERS.get(fertilizer.getKey());
String name = config.getName();
int max_times = config.getTimes();
- if(HoloUtil.cache.get(location.add(0.5,ConfigReader.Message.cropOffset,0.5)) == null){
+ if(!HoloUtil.cache.contains(location.add(0.5,ConfigReader.Message.cropOffset,0.5))){
HoloUtil.showHolo(ConfigReader.Message.cropText.replace("{fertilizer}", name).replace("{times}", String.valueOf(fertilizer.getTimes())).replace("{max_times}", String.valueOf(max_times)), player, location, ConfigReader.Message.cropTime);
}
}
diff --git a/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java b/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java
index a59fdda..6ad1cf4 100644
--- a/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java
+++ b/src/main/java/net/momirealms/customcrops/utils/HoloUtil.java
@@ -28,17 +28,17 @@ import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.momirealms.customcrops.CustomCrops;
import org.bukkit.Bukkit;
import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
-import java.util.HashMap;
-import java.util.Optional;
+import java.util.*;
public class HoloUtil {
- public static HashMap cache = new HashMap<>();
-
+ public static HashSet cache = new HashSet<>();
/**
* 对指定玩家展示在指定位置的盔甲架
* @param text 文本
@@ -48,30 +48,35 @@ public class HoloUtil {
*/
public static void showHolo(String text, Player player, Location location, int duration){
- ArmorStand entity = location.getWorld().spawn(location, ArmorStand.class, a -> {
- a.setInvisible(true);
- a.setCollidable(false);
- a.setInvulnerable(true);
- a.setVisible(false);
- a.setCustomNameVisible(false);
- a.setSmall(true);
- a.setGravity(false);
- });
- cache.put(location, entity);
+ PacketContainer packet1 = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY);
+
+ int id = new Random().nextInt(1000000000);
+ packet1.getModifier().write(0, id);
+ packet1.getModifier().write(1, UUID.randomUUID());
+ packet1.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND);
+ packet1.getDoubles().write(0, location.getX());
+ packet1.getDoubles().write(1, location.getY());
+ packet1.getDoubles().write(2, location.getZ());
+
+ PacketContainer packet2 = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
Component component = MiniMessage.miniMessage().deserialize(text);
-
WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher();
- wrappedDataWatcher.setEntity(entity);
- WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Boolean.class);
+ WrappedDataWatcher.Serializer serializer1 = WrappedDataWatcher.Registry.get(Boolean.class);
+ WrappedDataWatcher.Serializer serializer2 = WrappedDataWatcher.Registry.get(Byte.class);
wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)), Optional.of(WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(component)).getHandle()));
- wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, serializer), true);
- PacketContainer packetContainer = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
- packetContainer.getIntegers().write(0, entity.getEntityId());
- packetContainer.getWatchableCollectionModifier().write(0, wrappedDataWatcher.getWatchableObjects());
-
+ wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, serializer1), true);
+ wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(5, serializer1), true);
+ byte mask1 = 0x20;
+ byte mask2 = 0x01;
+ wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, serializer2), mask1);
+ wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, serializer2), mask2);
+ packet2.getModifier().write(0,id);
+ packet2.getWatchableCollectionModifier().write(0, wrappedDataWatcher.getWatchableObjects());
+ cache.add(location);
try {
- ProtocolLibrary.getProtocolManager().sendServerPacket(player, packetContainer);
+ ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet1);
+ ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet2);
}
catch (Exception e) {
AdventureManager.consoleMessage("[CustomCrops] 无法为玩家 "+ player.getName()+" 展示悬浮信息!");
@@ -79,8 +84,20 @@ public class HoloUtil {
}
Bukkit.getScheduler().runTaskLater(CustomCrops.instance, ()->{
- entity.remove();
+ removeHolo(player, id);
cache.remove(location);
}, duration * 20L);
}
+
+ public static void removeHolo(Player player, int entityId){
+ PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
+ packet.getIntLists().write(0, List.of(entityId));
+ try {
+ ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet);
+ }
+ catch (Exception e) {
+ AdventureManager.consoleMessage("[CustomCrops] 无法为玩家 "+ player.getName()+" 移除悬浮信息!");
+ e.printStackTrace();
+ }
+ }
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 12a00e3..692e69e 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -27,7 +27,7 @@ config:
#Mode 3:
# Mode 1 + Mode 2
#Mode 4:
- # No support in this mode!
+ # No support in this mode! Please disable season in this mode!
# All the crops will grow (May cause lag)
grow-mode: 3
#The time to start growing(ticks)