diff --git a/src/main/java/com/yuyu/srwildentity/SrWildEntity.java b/src/main/java/com/yuyu/srwildentity/SrWildEntity.java index bcf1609..2496f67 100644 --- a/src/main/java/com/yuyu/srwildentity/SrWildEntity.java +++ b/src/main/java/com/yuyu/srwildentity/SrWildEntity.java @@ -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定时任务触发"); + } } } diff --git a/src/main/java/com/yuyu/srwildentity/listener/EntityRefreshListener.java b/src/main/java/com/yuyu/srwildentity/listener/EntityRefreshListener.java index 4ed905f..448b8fa 100644 --- a/src/main/java/com/yuyu/srwildentity/listener/EntityRefreshListener.java +++ b/src/main/java/com/yuyu/srwildentity/listener/EntityRefreshListener.java @@ -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 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];//只能是on,off或者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 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 onlinePlayers = server.getOnlinePlayers(); + for (Player player : onlinePlayers){ + String name = player.getName(); + List 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 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; + } + } }