【未完成】ディメンション毎に装備やアイテム、エンダーチェストの中身を保存し、移動先のディメンションで所持していた装備やアイテム、エンダーチェストの中身を復元するプラグイン。

このプラグインは保存に不備が有り
サーバーを停止するとアイテムデータが消失する。
このプログラムに追加して、
プレイヤーのカスタムプロフィールを保存する必要がある。


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
    }
}

コマンドは未作成。
ゲートに直接アイテムを投げ入れた場合は考慮していないので
ゲート先のワールドにアイテムを持ち込む事が出来る。
保存しているアイテムの確認は出来ない。

※ネザーゲート等にアイテムを投げ入れた場合は
 アイテムの持ち込みと持ち出しが出来てしまう。※