【未完成】ディメンション毎に装備やアイテム、エンダーチェストの中身を保存し、移動先のディメンションで所持していた装備やアイテム、エンダーチェストの中身を復元するプラグイン。
このプラグインは保存に不備が有り
サーバーを停止するとアイテムデータが消失する。
このプログラムに追加して、
プレイヤーのカスタムプロフィールを保存する必要がある。
public class changed_world_listener implements Listener {
private Map<UUID, Map<String, custom_player_profile>> profiles = new HashMap<>();
private String dimensionA = "world_the_end";
private String dimensionB = "world";
@EventHandler
public void onPlayerChangedWorld(PlayerChangedWorldEvent event){
// プレイヤーがワールドを移動した際に行う処理
Player player = event.getPlayer();
World fromWorld = event.getFrom();
World toWorld = player.getWorld();
//player.sendMessage(fromWorld.getName());
//player.sendMessage(toWorld.getName());
if (fromWorld.getName().equals(dimensionA)) {
// プレイヤーがディメンションAから、別のディメンションに移動する場合
// プレイヤーの情報を保存する
custom_player_profile profile = new custom_player_profile(player);
profiles.computeIfAbsent(player.getUniqueId(), k -> new HashMap<>()).put(dimensionA, profile);
// プレイヤーのインベントリを変更する処理
Map<String, custom_player_profile> playerProfiles = profiles.get(player.getUniqueId());
if (playerProfiles != null) {
custom_player_profile toWorldProfile = playerProfiles.get(dimensionB);
if (toWorldProfile != null) {
toWorldProfile.restore(player);
} else {
player.getInventory().clear();
player.getEnderChest().clear();
}
}
} else if (toWorld.getName().equals(dimensionA)) {
// プレイヤーがディメンションAに移動する場合
// プレイヤーの情報を保存する
custom_player_profile profile = new custom_player_profile(player);
profiles.computeIfAbsent(player.getUniqueId(), k -> new HashMap<>()).put(dimensionB, profile);
// プレイヤーのインベントリを変更する処理
Map<String, custom_player_profile> playerProfiles = profiles.get(player.getUniqueId());
if (playerProfiles != null) {
custom_player_profile toWorldProfile = playerProfiles.get(dimensionA);
if (toWorldProfile != null) {
toWorldProfile.restore(player);
} else {
player.getInventory().clear();
player.getEnderChest().clear();
}
}
}
}
}
dimensionAとdimensionBはワールドのフォルダ名
package com.tester_code.plugins;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.UUID;
public class CustomPlayerProfile {
private final UUID uuid;
private final ItemStack[] inventoryContents;
private final ItemStack[] enderChestContents;
private final ItemStack[] armorContents;
public CustomPlayerProfile(Player player) {
this.uuid = player.getUniqueId();
this.inventoryContents = player.getInventory().getContents();
this.enderChestContents = player.getEnderChest().getContents();
this.armorContents = player.getInventory().getArmorContents();
}
public void restore(Player player) {
player.getInventory().setContents(inventoryContents);
player.getEnderChest().setContents(enderChestContents);
player.getInventory().setArmorContents(armorContents);
}
}
public final class Change_item extends JavaPlugin {
@Override
public void onEnable() {
// Plugin startup logic
getServer().getPluginManager().registerEvents(new changed_world_listener(),this);
}
@Override
public void onDisable() {
// Plugin shutdown logic
}
}
コマンドは未作成。
ゲートに直接アイテムを投げ入れた場合は考慮していないので
ゲート先のワールドにアイテムを持ち込む事が出来る。
保存しているアイテムの確認は出来ない。
※ネザーゲート等にアイテムを投げ入れた場合は
アイテムの持ち込みと持ち出しが出来てしまう。※