package com.sakurarealm.playerrisk.api; import com.sakurarealm.playerrisk.PlayerRisk; import com.sakurarealm.playerrisk.hook.PlaceHolderAPIHook; import org.apache.commons.lang.NotImplementedException; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.logging.Logger; /** * 危机度区间为0~level_max级,每次离开安全区(城镇),重置危险等级:每待n秒会使危机等级(变量)提升1点, * 但开始计算时玩家在的每一个每种生物群系最多使危机等级提升10 (如上限level_max是50的话, 玩家至少进入5个不同的生物群系才能达到上限), * 玩家每次死亡重生或回到安全区,会重置当前危机等级。 * 所有变量见config.yml * ... */ public class PlayerRiskManager { Logger logger = Logger.getLogger("PlayerRisk"); private final PlayerRisk plugin; public final PlayerRiskSettings settings; //用来记录在野外下线的玩家的危险度,这部分后续可以改成用数据库记录 private final Map> OffOnlinePlayerBiomeRisk; //记录玩家的总危险度 private final Map playerRiskLevels; //用来记录每个玩家在每个生物群系里面的危险度 private final Map> playerBiomeRisk; // TODO: Add any data structures needed to manage player risk. public PlayerRiskManager(PlayerRisk plugin, PlayerRiskSettings settings) { this.plugin = plugin; // Register the event listener. // plugin.getServer().getPluginManager().registerEvents(new Listener(), plugin); this.playerRiskLevels = new HashMap<>(); this.playerBiomeRisk = new HashMap<>(); this.OffOnlinePlayerBiomeRisk = new HashMap<>(); //注入settings this.settings = settings; new PlaceHolderAPIHook(this).register(); } /** * * @param playerName 通过玩家姓名获取玩家总危险度 * @return */ public int getPlayerRiskLevel(String playerName) { Integer riskLevel = playerRiskLevels.get(playerName); return riskLevel; } /** * * @param playerName 玩家姓名, * @param biome 生物群系 * @return 返回该玩家在Biome中的危险度 */ public int getBiomeRiskLevel(String playerName,String biome){ Integer level = playerBiomeRisk.get(playerName).get(biome); return level; } /** * 修改玩家某个biome的危险度 * @param playerName * @param biome */ public void setPlayerRiskLevel(String playerName,String biome) { if (playerBiomeRisk.get(playerName).get(biome) == null){ playerBiomeRisk.get(playerName).put(biome,1); logger.info(ChatColor.GOLD+playerName+"进入了新的生物去群系且社危险度为1"); }else { if (playerBiomeRisk.get(playerName).get(biome) <= settings.getLevelMax()/5) { playerBiomeRisk.get(playerName).put(biome, playerBiomeRisk.get(playerName).get(biome) + 1); }else { logger.info(ChatColor.GOLD+playerName+"的"+biome+"的危险度为:"+playerBiomeRisk.get(playerName).get(biome)); } } //修改总群系的危险度 addAllBiomeRisk(playerName); logger.info(ChatColor.GOLD+playerName+"的"+biome+"的危险度:"+playerBiomeRisk.get(playerName).get(biome)); } /** * 玩家死亡或者进入城镇后,通过玩家姓名将玩家从map里删除 * @param playerName */ public void removePlayerLevel(String playerName){ playerRiskLevels.remove(playerName); playerBiomeRisk.remove(playerName); } /** * 玩家下线后,通过玩家姓名将玩家判断是删除玩家危险度还是记录 * @param playerName */ public void offOnlinePlayer(String playerName){ if (playerRiskLevels.get(playerName) != null) { Map biomeRisks = playerBiomeRisk.get(playerName); for (String biome : biomeRisks.keySet()) { logger.info(ChatColor.AQUA+playerName+"保存的"+biome+"群系危险度:"+biomeRisks.get(biome)); } //下线后记录到下线的map中 OffOnlinePlayerBiomeRisk.put(playerName, biomeRisks); logger.info(ChatColor.GOLD+playerName+"的危险度被记录了"); } playerRiskLevels.remove(playerName); playerBiomeRisk.remove(playerName); } /** * 玩家离开城镇,并进入对应的biome后,将玩家放入对应的map中 * 注意此处,当玩家从1群系到2群系的时候,不能调用此方法修改map * @param playerName * @param biome */ public void addPlayerToMap(String playerName,String biome){ Map biomeRisk = new HashMap<>(); biomeRisk.put(biome,0);//从0开始计算 playerBiomeRisk.put(playerName,biomeRisk); playerRiskLevels.put(playerName,0); } // TODO Add any other methods needed to manage player risk. /** * * @param playerName 通过玩家姓名获取修改危险度 */ public void addAllBiomeRisk(String playerName){ Map stringIntegerMap = playerBiomeRisk.get(playerName); //循环叠加每个群系的危险度 Integer sumLevel = 0; for (String str : stringIntegerMap.keySet()){ sumLevel += stringIntegerMap.get(str); } //放入总值 playerRiskLevels.put(playerName,sumLevel); logger.info(ChatColor.GREEN+playerName+"的总危险度:"+sumLevel); } public Map> getPlayerBiomeRisk() { return playerBiomeRisk; } /** * 判断玩家上下时是否在野外 * @param name */ public void playerLoginBoolean(String name) { int sumRiskLevel = 0; //不为空则玩家在野外下线 if (OffOnlinePlayerBiomeRisk.containsKey(name)){ //获取之前下线前保存的生物群系集合 Map biomeRisks = OffOnlinePlayerBiomeRisk.get(name); //把之前保存的生物群系危险度集合放入 playerBiomeRisk.put(name,biomeRisks); //计算总危险度 for (String biome : biomeRisks.keySet()){ logger.info(ChatColor.RED+biome); Integer level = biomeRisks.get(biome); sumRiskLevel += level; logger.info(ChatColor.GREEN+name+"登录后的"+biome+"的危险度"+level); } //计入总危险度 playerRiskLevels.put(name,sumRiskLevel); logger.info(ChatColor.AQUA+name+"登录后的总危险度"+sumRiskLevel); //最后删除 OffOnlinePlayerBiomeRisk 中保存的集合 OffOnlinePlayerBiomeRisk.remove(name); } } }