マイクラをヴァンサバライクにするプラグインの開発

首先

这是第6天的圣诞节日历!我负责的是3年级的片平。
昨天,我们讨论了关于桃山在LINE上共享日历的文章。
通过LINE通知共享日历的功能非常实用,我一定要试试看!

アドベントカレンダーは初めてなので、至らないところがあったらすみません。
今日は僕の好きなMinecraft関連の記事です!

Minecraftのマルチサーバーで使えるプラグインを作成したので、それの解説となります!
昔は全くできなかったことが宮治研に入ってできるようになって、成長を感じています。

制作的东西

マイクラをヴァンサバライク(Vampire Survivorsというゲーム風)なゲームに変えるプラグインを作成しました。
機能としてはマイクラの進捗(実績のようなもの)を獲得するたびにプレイヤーのレベルがあがり、能力値を選んで上昇させることができるものです。

実際に作ったのは夏休みで、追加したい機能は他にもあるのですがとりあえずレベルアップとステ振りの機能だけ実装しました。

我使用Java和IntelliJ IDEA进行开发。

安装

当你第一次启动IntelliJ IDEA后,你可以在插件中搜索Minecraft,并安装列表中最上方的Minecraft Development插件。

image.png
image.png

只要生成的Test.java文件一开始就是这样的,就算成功。

    package com.example.test;
    
    import org.bukkit.plugin.java.JavaPlugin;
    
    public final class Test extends JavaPlugin {
    
        @Override
        public void onEnable() {
            // Plugin startup logic
    
        }
    
        @Override
        public void onDisable() {
            // Plugin shutdown logic
        }
    }

代码 (Mandarin Chinese option)

只写中文内容,省略了主要的Test.java代码。
虽然还没有整理好,但是请谅解我将它们全部放在一个文件中。
另外,可能会有调试代码和未完成的处理代码存在?‍♂️?‍♂️。

public class Listeners implements Listener {

    //マップ生成
    public HashMap<Player, Integer> mapDamage = new HashMap<>();
    public HashMap<Player, Integer> mapHp = new HashMap<>();
    public HashMap<Player, Integer> mapDefence = new HashMap<>();
    public HashMap<Player, Integer> mapLuck = new HashMap<>();
    Inventory inventory = Bukkit.createInventory(null, 9, "LEVEL UP");

    //マップ作成
    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        mapDamage.put(e.getPlayer(), 0);
        mapHp.put(e.getPlayer(), 0);
        mapDefence.put(e.getPlayer(), 0);
        mapLuck.put(e.getPlayer(), 0);
    }

    //実績解除時のレベルアップ
    @EventHandler
    public void onGetAdvancement(PlayerAdvancementDoneEvent e) {
        Player p = e.getPlayer();
        NamespacedKey advancementKey = e.getAdvancement().getKey();
        Advancement advancement = Bukkit.getAdvancement(advancementKey);

        if (advancement != null) {
            // 実績の表示名を取得
            String displayName = advancement.getDisplay().getTitle();
            Bukkit.broadcastMessage(p.getName() + "さんが" + displayName + "をクリアしてレベルアップしました。");
            inventory.setItem(0, new ViewItems().BuffHeart());
            inventory.setItem(2, new ViewItems().BuffAttack());
            inventory.setItem(4, new ViewItems().BuffDefence());
            inventory.setItem(6, new ViewItems().BuffSpeed());

        } else {
            Bukkit.broadcastMessage(p.getName() + "さんが不明な実績をクリアしてレベルアップしました。");
        }
        p.openInventory(inventory);
        p.playSound(p, Sound.ENTITY_PLAYER_LEVELUP, 1.0F, 1.0F);
    }

    //ステータス割り振り
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        Inventory clickedInventory = e.getClickedInventory();
        ItemStack clickedItem = e.getCurrentItem();

        if (clickedInventory != null && clickedItem != null) {
            if (p.getOpenInventory().getTopInventory().equals(inventory)) {
                if (clickedInventory.equals(inventory)) {
                    if (clickedItem.isSimilar(new ViewItems().BuffHeart())) {
                        // クリックされたアイテムが ViewItemsMain() で設定されたアイテムと一致する場合
                        e.setCancelled(true); // クリックをキャンセル
                        p.updateInventory();
                        p.closeInventory();
                        // ここでアイテムが一致した場合の処理を記述
                        p.sendMessage("HPが増加しました");
                        p.playSound(p, Sound.ENTITY_ITEM_PICKUP, 1.0F, 1.0F);
                        int PlayerHpValue = mapHp.get(p);
                        mapHp.put(p, PlayerHpValue + 2);
                        p.setHealthScale(p.getHealthScale() + 2);
                    } else if (clickedItem.isSimilar(new ViewItems().BuffAttack())) {
                        e.setCancelled(true); // クリックをキャンセル
                        p.updateInventory();
                        p.closeInventory();

                        p.sendMessage("攻撃力が増加しました。");
                        p.playSound(p, Sound.ENTITY_ITEM_PICKUP, 1.0F, 1.0F);
                        int PlayerDamageValue = mapDamage.get(p);
                        mapDamage.put(p, PlayerDamageValue + 1);

                    } else if (clickedItem.isSimilar(new ViewItems().BuffDefence())) {
                        e.setCancelled(true); // クリックをキャンセル
                        p.updateInventory();
                        p.closeInventory();

                        p.sendMessage("防御力が増加しました。");
                        p.playSound(p, Sound.ENTITY_ITEM_PICKUP, 1.0F, 1.0F);
                        int PlayerDefenceValue = mapDefence.get(p);
                        mapDamage.put(p, PlayerDefenceValue + 1);

                    } else if (clickedItem.isSimilar(new ViewItems().BuffSpeed())) {
                        e.setCancelled(true); // クリックをキャンセル
                        p.updateInventory();
                        p.closeInventory();

                        p.sendMessage("運が増加しました。");
                        p.playSound(p, Sound.ENTITY_ITEM_PICKUP, 1.0F, 1.0F);
                        int PlayerLuckValue = mapLuck.get(p);
                        mapLuck.put(p, PlayerLuckValue + 10);


                    } else {
                        // クリックされたアイテムが一致しない場合
                        e.setCancelled(true); // クリックをキャンセル
                        p.sendMessage("このアイテムはクリックできません!");
                    }
                } else {
                    e.setCancelled(true);
                    p.updateInventory();
                    p.sendMessage("インベントリの操作はできません");
                }
            }
        }
    }

    //ダメージアップ処理
    @EventHandler
    public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
        EntityType attacker = e.getDamager().getType();
        double damage = e.getDamage();
        if (attacker == EntityType.PLAYER) {
            Player p = (Player) e.getDamager();
            e.setDamage(damage + mapDamage.get(p));
            p.sendMessage("あなたは" + damage + mapDamage.get(p) + "のダメージを与えた。");
        }
    }

    //防御処理
    @EventHandler
    public void onEntityDamage(EntityDamageEvent e) {
        EntityType entityType = e.getEntityType();
        double damage = e.getDamage();
        if (entityType == EntityType.PLAYER) {
            Player p = (Player) e.getEntity();
            if (damage - mapDefence.get(p) < 0) {
                e.setDamage(0);
                p.sendMessage("あなたは" + damage + mapDamage.get(p) + "のダメージをうけた。(無敵)");
            } else {
                e.setDamage(damage - mapDefence.get(p));
                p.sendMessage("あなたは" + damage + mapDamage.get(p) + "のダメージをうけた。");
            }
        }
    }

    //幸運処理
    @EventHandler
    public void onBlockDropItem(BlockDropItemEvent e ){
        Player p = e.getPlayer();

        if( e.isCancelled()) {
            return;
        }

        List<Item> drops = e.getItems();
        Random random = new Random();

        for (Item drop : drops) {
            if (random.nextDouble() * 100 < mapLuck.get(p)) {
                ItemStack itemStack = drop.getItemStack(); // ItemからItemStackを取得
                p.getInventory().addItem(itemStack); // プレイヤーのインベントリにアイテムを追加
                p.updateInventory(); // インベントリを更新
                p.sendMessage(itemStack.getType().toString() + "が増えました。");
            }
        }

    }
}

完成 –

完成了 –

做完了 – zuò

办好了 –

已结束 – yǐ

これらをビルドしてプラグインサーバーを立てれば完成します
このように実績解除すると4つのうちから報酬を選んぶことができます

2023-12-06_04.02.49.png

一応それぞれ効果としては
体力増加や攻撃力増加、防御力増加、移動速度上昇(調整中)となります

以上是插件开发的结束!!

結束

虽然还有很多我不明白的事情,但通过不断尝试和努力,最终实现它时的喜悦是巨大的!我非常喜欢Minecraft,如果有同样喜欢的人,请务必与我交朋友!

广告
将在 10 秒后关闭
bannerAds