修复了死亡后的刷新bug

This commit is contained in:
yuyu 2024-04-08 18:00:55 +08:00
parent ac3ed0ac88
commit f41a8511dd
2 changed files with 106 additions and 24 deletions

View File

@ -34,6 +34,14 @@ public final class SrWildEntity extends JavaPlugin implements CommandExecutor {
Bukkit.getPluginManager().registerEvents(entityRefreshListener,this);
//注册定时任务
this.getServer().getScheduler().scheduleSyncRepeatingTask
(this,this.entityRefreshListener::timedRdfreshEneity,
0,this.entityRefreshListener.getConfigManager().getRefreshTime()*20);
getLogger().info(ChatColor.DARK_GREEN+"SrWildEntity定时任务触发");
this.getCommand("despawn").setExecutor(entityRefreshListener);
this.getCommand("SrWildEntity").setExecutor(this::onCommand);
@ -72,10 +80,21 @@ public final class SrWildEntity extends JavaPlugin implements CommandExecutor {
commandSender.sendMessage(ChatColor.RED+"请加上reload操作");
}else {
if (strings[0].equalsIgnoreCase("reload")){
getLogger().info(ChatColor.GOLD+"SrWildEntity定时任务关闭");
Bukkit.getScheduler().cancelTasks(this);
getLogger().info(ChatColor.AQUA+"SrWildEntity重新读取配置文件");
commandSender.sendMessage(ChatColor.YELLOW+"SrWildEntity重新读取配置文件");
entityRefreshListener.setConfigManager(this.onload());
//注册定时任务
this.getServer().getScheduler().scheduleSyncRepeatingTask
(this,this.entityRefreshListener::timedRdfreshEneity,
0,this.entityRefreshListener.getConfigManager().getRefreshTime()*20);
getLogger().info(ChatColor.DARK_GREEN+"SrWildEntity定时任务触发");
}
}
}

View File

@ -27,8 +27,10 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.plugin.Plugin;
@ -76,10 +78,7 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
this.germPlugin = GermPlugin.getPlugin();
logger.info(ChatColor.DARK_GREEN+"SrWildEntity定时任务触发");
//注册定时任务
plugin.getServer().getScheduler().scheduleSyncRepeatingTask
(this.plugin,this::timedRdfreshEneity,0,configManager.getRefreshTime()*20);
}
/**
@ -115,8 +114,7 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
Collection<? extends Player> onlinePlayers = plugin.getServer().getOnlinePlayers();
for (Player player : onlinePlayers){
String name = player.getName();
Town town = TownyAPI.getInstance().getTown(player.getLocation());
if (town == null){
if (!this.playerStayTown(player.getLocation())){
PlayerRefreshinfo playerRefreshinfo = new PlayerRefreshinfo(name, 0, new ArrayList<>());
refreshPlayer.put(name, playerRefreshinfo);
}
@ -133,8 +131,9 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
return true;
}
}else {
String choice = strings[0];//只能是on或者off
if (choice.equalsIgnoreCase("on") || choice.equalsIgnoreCase("off")){
String choice = strings[0];//只能是onoff或者clear
if (choice.equalsIgnoreCase("on") || choice.equalsIgnoreCase("off")
|| choice.equalsIgnoreCase("clear")){
if (choice.equalsIgnoreCase("on")){
Player player = plugin.getServer().getPlayer(strings[1]);
if (player == null){
@ -147,7 +146,7 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
commandSender.sendMessage(ChatColor.YELLOW+strings[1]+"开始刷怪");
return true;
}
}else {
}else if (choice.equalsIgnoreCase("off")){
Player player = plugin.getServer().getPlayer(strings[1]);
if (player == null){
commandSender.sendMessage("请输入正确的玩家姓名!");
@ -159,6 +158,12 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
commandSender.sendMessage(ChatColor.YELLOW+strings[1]+"停止刷怪");
return true;
}
}else {
//清空刷新的怪物
this.clearRefreshEntity();
logger.info(ChatColor.GOLD+"SrWildEntity刷新的所有实体被清除!");
commandSender.sendMessage(ChatColor.GOLD+"SrWildEntity刷新的所有实体被清除!");
return true;
}
}
}
@ -191,16 +196,22 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
public void onPlayerInTown(PlayerEnterTownEvent event) {
if (flag){
String name = event.getPlayer().getName();
// List<UUID> entityList = refreshPlayer.get(name).getEntityList();
// for (UUID uuid : entityList){
// //删除储存的实体信息
// entityUUIDToPlayer.remove(uuid);
// }
refreshPlayer.remove(name);
logger.info(name + "开始停止怪物");
}
}
@EventHandler
public void playerRevive(PlayerRespawnEvent event){
Location respawnLocation = event.getRespawnLocation();
if (!this.playerStayTown(respawnLocation)){
// 返回true则表示在城镇不用管
//反之增加
String name = event.getPlayer().getName();
this.playerRefreshEntiyt(name);
}
}
/**
* 玩家离开城镇
* @param event
@ -209,11 +220,7 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
public void onPlayerLeaveTown(PlayerLeaveTownEvent event) {
if (flag) {
String name = event.getPlayer().getName();
if (!noRefreshPlayer.contains(name)) {
PlayerRefreshinfo playerRefreshinfo = new PlayerRefreshinfo(name, 0, new ArrayList<>());
refreshPlayer.put(name, playerRefreshinfo);
logger.info(name + "开始刷新实体");
}
this.playerRefreshEntiyt(name);
}
}
@ -226,11 +233,8 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
if (flag){
Player player = event.getPlayer();
String name = player.getName();
Town town = TownyAPI.getInstance().getTown(player.getLocation());
if (town == null && !noRefreshPlayer.contains(name)) {
PlayerRefreshinfo playerRefreshinfo = new PlayerRefreshinfo(name, 0, new ArrayList<>());
refreshPlayer.put(name, playerRefreshinfo);
logger.info(ChatColor.MAGIC + player.getName() + "在野外登录,开始刷新实体");
if (!this.playerStayTown(player.getLocation()) && !noRefreshPlayer.contains(name)) {
this.playerRefreshEntiyt(name);
}
}
}
@ -459,4 +463,63 @@ public class EntityRefreshListener implements Listener, CommandExecutor {
public void setConfigManager(ConfigManager configManager) {
this.configManager = configManager;
}
/**
* 清空所有记录在的实体
*/
public void clearRefreshEntity(){
Server server = plugin.getServer();
Collection<? extends Player> onlinePlayers = server.getOnlinePlayers();
for (Player player : onlinePlayers){
String name = player.getName();
List<UUID> entityList = refreshPlayer.get(name).getEntityList();
for (UUID uuid : entityList){
Entity entity = server.getEntity(uuid);
if (entity != null){
entity.remove();
if (entityUUIDToPlayer.containsKey(uuid)){
entityUUIDToPlayer.remove(uuid);
}
}
}
//entity清除完后
refreshPlayer.get(name).setEntityList(new ArrayList<>());
}
}
public void playerRefreshEntiyt(String name){
if (!noRefreshPlayer.contains(name) && !entityUUIDToPlayer.containsValue(name)) {
PlayerRefreshinfo playerRefreshinfo = new PlayerRefreshinfo(name, 0, new ArrayList<>());
refreshPlayer.put(name, playerRefreshinfo);
logger.info(name + "开始刷新实体");
}else {
List<UUID> uuidList = new ArrayList<>();
for (UUID uuid : entityUUIDToPlayer.keySet()){
String s = entityUUIDToPlayer.get(uuid);
if (s.equals(name)){
uuidList.add(uuid);
}
}
PlayerRefreshinfo playerRefreshinfo = new PlayerRefreshinfo(name,0, uuidList);
refreshPlayer.put(name, playerRefreshinfo);
logger.info(name + "开始刷新实体");
}
}
/**
* 用于判断玩家是否在城镇
* @param location
* @return
*/
public boolean playerStayTown(Location location) {
Town town = TownyAPI.getInstance().getTown(location);
if (town == null){
//为空则不再城镇
return false;
}else {
return true;
}
}
}