2014-07-15 60 views
1

我遇到了我正在更新的bukkit插件的問題。在我在做什麼,當玩家使用一張牀,它下面的數據保存到一個名爲beds.yml文件:Bukkit插件 - 檢查文件中是否存在特定數據,並聲明它

ThePlayersUsername: 
    X: (double) 
    Y: (double) 
    Z: (double) 
    world: worldName 

當插件被初始化,我需要聲明幾個變量,因爲它們使用稍後在代碼中。

Player p = (Player)sender; 
String dn = p.getDisplayName(); 
dn = ChatColor.stripColor(dn); 
double x = (Double) yml.get(dn + ".x"); 
double y = (Double) yml.get(dn + ".y"); 
double z = (Double) yml.get(dn + ".z"); 
World bw = Bukkit.getWorld((yml.get(dn + ".world").toString())); 
Location l = new Location(bw, x, y, z); 

我不能這樣做,如果他們不存在,但是,我不能恢復到任何違約,因爲新項目將加入到每次有人進入牀的配置,所有的數據是用戶-具體。

我該如何去檢查玩家在配置中是否有一些數據,如果沒有,告訴他們睡在牀上,當他們在配置中有數據時,如何聲明它以便他們可以使用命令使用配置中的數據傳送。謝謝。在配置

一個簡單的字符串列表是做魔術只是存儲姓名

-The在線玩家

-The球員:

+0

你有什麼方法嘗試,爲什麼他們不工作? – Jojodmo

回答

0

創建2個列表或數組。然後比較它們。類似的東西:

List<String> online_players = new List<String>(); 
//fill list code here 

List<String players_in_config = new List<String>(); 
//fill list code here 

List<String> output = new List<String>(); 

for(String s : online_players){ 
    for(String a : players_in_config){ 
     if(s.equals(a)){ 
      output.add(s); 
     break; 
     } 
    } 
} 

//and now output contains the names of the players that online and have a bed in the config 
0

你會想在這裏使用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);卸載他們的數據。如果不保存每次更新,請不要忘記先保存它。

如果您有任何問題,請留下評論。我試圖做得很徹底。

相關問題