你會想在這裏使用Map
。地圖是爲您的數據創建鍵值對的數據結構。您可以要求Map
輸入與給定密鑰相關聯的數據,您將獲得您輸入的值,如果找不到密鑰,則爲null。
你的地圖會是這個樣子:
private Map<Player, Location> bedLocations = new HashMap<Player, Location>();
我們將這些數據存儲您JavaPlugin類中,因爲它需要你的監聽器和命令處理程序中訪問。您還需要一種方法從您的聽衆中獲取此Map
。訪問器方法將在這裏完成這項工作。有關如何執行此操作,請參閱下面的方法。你以後也需要這樣做。
public Map<Player, Location> getBedLocations() {
return bedLocations;
}
如果你想知道,一個HashMap
是一個類型的地圖所使用的int hashCode()
方法,加快鍵值訪問的,但是這是一個更高級的話題,是風馬牛不相及的問題在眼前。
該地圖應該存儲當前所有在線牀位與其相關聯的玩家的鍵值對。由於您不需要別人的信息,所以您不應該加載配置,但仍然應該像這樣打開配置,以防止每次都讀取該文件。這應該在onEnable方法中完成。
//Near your map and other class variables
private FileConfiguration bedConfiguration;
//Inside your onEnable
bedConfiguration = YamlConfiguration.loadConfiguration(new File(PLUGIN_VARIABLE.getDataFolder(), "beds.yml"));
不要忘記將bedConfiguration存儲在類變量中。也爲它創建一個訪問器方法。我將其命名爲getBedConfiguration()
。
現在你有一個加載配置和一個地方來存儲你的數據,下一步是什麼?您需要在玩家數據加入時填充您的Map
。
在你的聽衆中,你應該寫一個方法來聽取PlayerJoinEvent
。在這裏你會加載你的播放器數據。
首先,我們需要從我們的JavaPlugin類中獲取YML文件。
FileConfiguration bedConfig = plugin.getBedConfiguration();
這會爲您提供您之前打開的FileConfiguration。現在我們檢查玩家的數據是否在配置中。
if (bedConfig.isSet(event.getPlayer().getName()) {
//Next section here
}
如果isSet方法返回true,那麼就有東西存在。現在我們加載數據。
String playerName = event.getPlayer.getName(); //You can do this above the if statement if you wish.
double x = (Double) bedConfig.get(playerName + ".x");
double y = (Double) bedConfig.get(playerName + ".y");
double z = (Double) bedConfig.get(playerName + ".z");
World bw = Bukkit.getWorld((bedConfig.get(dn + ".world").toString()));
Location loc = new Location(bw, x, y, z);
正在載入您的數據!優秀。現在我們將其存儲在地圖中供以後訪問。首先,從JavaPlugin
類中獲取Map
。然後我們將數據放入Map
。
Map<Player, Location> map = plugin.getBedLocations();
map.put(event.getPlayer(), loc);
該數據在地圖中!要訪問它,請確保您先獲取地圖,然後撥打電話map.get(PLAYER);
其他需要完成的事情包括:當玩家離開/關閉服務器時保存數據並在地圖中移除玩家時他們離開(將球員保存在地圖中是一種非常糟糕的做法,如果您希望防止該問題,則可以使用他們的名字或UUID作爲關鍵字)。
要將您的Map
保存到配置中,您可以在牀的位置發生變化時更改配置,或者等待並遍歷所有Map
條目,並將它們全部保存在最後。要循環這些,可以使用高級for循環。
for(Player player : map.keySet()) {
Location loc = map.get(player);
//save here
}
這將循環遍歷地圖所有玩家,讓你與map.get(player)
方法來訪問它們的位置。
要從地圖中刪除玩家,請收聽PlayerQuitEvent
並使用map.remove(player);
卸載他們的數據。如果不保存每次更新,請不要忘記先保存它。
如果您有任何問題,請留下評論。我試圖做得很徹底。
你有什麼方法嘗試,爲什麼他們不工作? – Jojodmo