9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

添加cooldown

This commit is contained in:
XiaoMoMi
2025-05-24 03:01:20 +08:00
parent 38cd8f7a88
commit 33095f5b81
15 changed files with 401 additions and 10 deletions

View File

@@ -12,8 +12,10 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20;
import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20_5;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.KeyUtils;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.context.CooldownData;
import net.momirealms.craftengine.core.plugin.network.*;
import net.momirealms.craftengine.core.util.*;
import org.bukkit.Bukkit;
@@ -24,10 +26,12 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
@@ -191,17 +195,33 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
}
}
@EventHandler(priority = EventPriority.HIGHEST)
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
Channel channel = getChannel(player);
NetWorkUser user = removeUser(channel);
if (user == null) return;
saveCooldown(player, user);
handleDisconnection(channel);
this.onlineUsers.remove(player.getUniqueId());
this.resetUserArray();
}
private void saveCooldown(Player player, NetWorkUser user) {
if (user instanceof BukkitServerPlayer serverPlayer) {
CooldownData cd = serverPlayer.cooldown();
if (cd != null) {
try {
byte[] data = CooldownData.toBytes(cd);
player.getPersistentDataContainer().set(KeyUtils.toNamespacedKey(CooldownData.COOLDOWN_KEY), PersistentDataType.BYTE_ARRAY, data);
} catch (IOException e) {
player.getPersistentDataContainer().remove(KeyUtils.toNamespacedKey(CooldownData.COOLDOWN_KEY));
this.plugin.logger().warn("Failed to save cooldown for player " + player.getName(), e);
}
}
}
}
private void resetUserArray() {
this.onlineUserArray = this.onlineUsers.values().toArray(new BukkitServerPlayer[0]);
}

View File

@@ -19,6 +19,7 @@ import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.context.CooldownData;
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler;
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
@@ -35,11 +36,13 @@ import org.bukkit.block.Block;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.RayTraceResult;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.*;
@@ -94,6 +97,8 @@ public class BukkitServerPlayer extends Player {
// cache interaction range here
private int lastUpdateInteractionRangeTick;
private double cachedInteractionRange;
// cooldown data
private CooldownData cooldownData;
private final Map<Integer, EntityPacketHandler> entityTypeView = new ConcurrentHashMap<>();
@@ -107,6 +112,13 @@ public class BukkitServerPlayer extends Player {
this.serverPlayerRef = new WeakReference<>(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player));
this.uuid = player.getUniqueId();
this.name = player.getName();
byte[] bytes = player.getPersistentDataContainer().get(KeyUtils.toNamespacedKey(CooldownData.COOLDOWN_KEY), PersistentDataType.BYTE_ARRAY);
try {
this.cooldownData = CooldownData.fromBytes(bytes);
} catch (IOException e) {
this.cooldownData = new CooldownData();
this.plugin.logger().warn("Failed to parse cooldown data", e);
}
}
@Override
@@ -871,4 +883,14 @@ public class BukkitServerPlayer extends Player {
if (type == null) return;
this.platformPlayer().removePotionEffect(type);
}
@Override
public void clearPotionEffects() {
this.platformPlayer().clearActivePotionEffects();
}
@Override
public CooldownData cooldown() {
return this.cooldownData;
}
}