From 02bdcfb89df4ab2e82f0a993f4545e226f78103f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=89=E7=8E=89=E7=AC=AC=E4=B8=80=E5=90=8D?= <140892950+WangBufeng@users.noreply.github.com> Date: Thu, 14 Mar 2024 21:12:52 +0800 Subject: [PATCH] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 进出城镇和死亡事件监听移到了主类中,在主类进行危险度操作但是没有区分生物群系 --- PlayerRisk.java | 110 +++++++++++++++++++++++++++++++++++++++++ PlayerRiskManager.java | 77 +++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 PlayerRisk.java create mode 100644 PlayerRiskManager.java diff --git a/PlayerRisk.java b/PlayerRisk.java new file mode 100644 index 0000000..e11d1fe --- /dev/null +++ b/PlayerRisk.java @@ -0,0 +1,110 @@ +package com.sakurarealm.playerrisk; + +import com.palmergames.bukkit.towny.event.PlayerEnterTownEvent; +import com.palmergames.bukkit.towny.event.PlayerLeaveTownEvent; +import com.sakurarealm.playerrisk.api.PlayerRiskManager; +import com.sakurarealm.playerrisk.api.PlayerRiskSettings; +import org.apache.commons.lang.NotImplementedException; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.*; + +public final class PlayerRisk extends JavaPlugin implements Listener { + + //用来记录在城镇之外的玩家 + Map playsOutTown = new Hashtable<>(); + PlayerRiskManager playerRiskManager = null; + +// public PlayerRiskManager getPlayerRiskManager() { +// if (playerRiskManager == null) { +// throw new NullPointerException("PlayerRisk plugin is not initialized."); +// } +// return playerRiskManager; +// } + + public void load() { + saveDefaultConfig(); + FileConfiguration config = getConfig(); + ConfigurationSection settingsSection = config.getConfigurationSection("settings"); + playerRiskManager = new PlayerRiskManager(this, new PlayerRiskSettings(settingsSection)); + } + + @Override + public void onEnable() { + // Plugin startup logic + load(); + getCommand("playerrisk").setExecutor(new CommandHandler(this)); + //注册监听器 + Bukkit.getPluginManager().registerEvents(this,this); + + getServer().getScheduler().scheduleSyncRepeatingTask(this, this::addRiskToOutTownPlayers, 0, 1200); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + } + + + /** + * TODO: 当玩家进入城镇时, 危险度不再增加. + * + * @param event The PlayerEnterTownEvent. + */ + @EventHandler + public void onPlayerEnterTown(PlayerEnterTownEvent event) { + //当玩家进入城镇后,移出map集合并且清零 + Player player = event.getPlayer(); + playsOutTown.remove(player.getName()); + throw new NotImplementedException("Not implemented yet."); + } + + /** + * TODO: 当玩家离开城镇时, 危险度开始增加. + * + * @param event The PlayerLeaveTownEvent. + */ + @EventHandler + public void onPlayerLeaveTown(PlayerLeaveTownEvent event) { + //当玩家离开城镇后,移出map集合并且清零 + Player player = event.getPlayer(); + playsOutTown.put(player.getName(),0); + + throw new NotImplementedException("Not implemented yet."); + } + + /** + * TODO: 当玩家死亡时, 危险度重置. + * + * @param event The PlayerDeathEvent. + */ + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getEntity(); + playsOutTown.remove(player.getName()); + throw new NotImplementedException("Not implemented yet."); + } + // TODO: Add any other event handlers needed to manage player risk. + + //注册主任务,一直循环给增加在城镇之外的玩家的危险度 + public void addRiskToOutTownPlayers(){ + for (String name : playsOutTown.keySet()){ + //获取玩家当前的危险度 + int playerRiskLevel = playerRiskManager.getPlayerRiskLevel(name); + //日志报告,测试用 + getLogger().info(ChatColor.GREEN+name+"危险度为:"+playerRiskLevel); + //注意此处是把所有生物群系的危险度放在一起计算了, + if (playerRiskLevel < playerRiskManager.settings.getLevelMax()){ + playerRiskManager.setPlayerRiskLevel(name,playerRiskLevel + 1); + } + } + } +} diff --git a/PlayerRiskManager.java b/PlayerRiskManager.java new file mode 100644 index 0000000..b3b9eb5 --- /dev/null +++ b/PlayerRiskManager.java @@ -0,0 +1,77 @@ +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.OfflinePlayer; + +import java.util.UUID; + +/** + * 危机度区间为0~level_max级,每次离开安全区(城镇),重置危险等级:每待n秒会使危机等级(变量)提升1点, + * 但开始计算时玩家在的每一个每种生物群系最多使危机等级提升10 (如上限level_max是50的话, 玩家至少进入5个不同的生物群系才能达到上限), + * 玩家每次死亡重生或回到安全区,会重置当前危机等级。 + * 所有变量见config.yml + * ... + */ +public class PlayerRiskManager { + + private final PlayerRisk plugin; + + public final PlayerRiskSettings settings; + + // 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); + //注入settings + this.settings = settings; + new PlaceHolderAPIHook(this).register(); + } + + public int getPlayerRiskLevel(String playerName) { + // Get offline player by name. + OfflinePlayer player = plugin.getServer().getOfflinePlayer(playerName); + return getPlayerRiskLevel(player); + } + + public int getPlayerRiskLevel(UUID playerId) { + // Get offline player by UUID. + OfflinePlayer player = plugin.getServer().getOfflinePlayer(playerId); + return getPlayerRiskLevel(player); + } + + /** + * TODO: 获取玩家的危险度等级 + * + * @param player 玩家 + * @return 危险度等级 + */ + public int getPlayerRiskLevel(OfflinePlayer player) { + throw new NotImplementedException("Not implemented yet."); + } + + public void setPlayerRiskLevel(String playerName, int level) { + // Get offline player by name. + OfflinePlayer player = plugin.getServer().getOfflinePlayer(playerName); + setPlayerRiskLevel(player, level); + } + + public void setPlayerRiskLevel(UUID playerId, int level) { + // Get offline player by UUID. + OfflinePlayer player = plugin.getServer().getOfflinePlayer(playerId); + setPlayerRiskLevel(player, level); + } + + /** + * TODO: 设置玩家的危险度等级 + */ + public void setPlayerRiskLevel(OfflinePlayer player, int level) { + throw new NotImplementedException("Not implemented yet."); + } + + // TODO Add any other methods needed to manage player risk. + +}