【1.20.1対応】コピペで動く!AIでKubeJSスクリプトを自動生成(恐怖のドッキリ・ジャンプの悪魔編)

KubeJS

マイクラのマルチプレイ、普通にサバイバルするだけじゃ物足りなくなってきませんか?

この記事では、大人気Mod「KubeJS」を使って、「夜になると一定確率で出現し、ターゲットの畑を自ら探し出して荒らし尽くすオリジナルモンスター」を追加する、ちょっと変(で凶悪)な魔改造ギミックをご紹介します!

その名も「ジャンプの悪魔」。一見複雑な索敵AIや物理演算を含んだギミックですが、優秀なAI(Gemini 2.5 Flashなど)と筆者が試行錯誤を繰り返して、完璧に動くコードを練り上げておきました! なので、皆さんはこの記事のコードを「コピペ一発」するだけで実装可能です。こだわりのマルチサーバーにこっそり仕込んで、農業中の仲間を恐怖のどん底に陥れましょう!

(※KubeJSの導入方法がまだの方はこちらの記事からどうぞ👇)

【1.20.1対応】ConoHa VPSでマイクラ独自環境を作るMOD!KubeJS・MoreJS・LootJS導入完全ガイド
1. はじめに:KubeJSを駆使してマイクラを「独自環境」に魔改造する2. マルチプレイで独自環境を楽しむなら「ConoHa VPS」一択な理由3. ConoHa VPSでマイクラサーバーを立ち上げる3ステップ4. サーバーにKubeJS…

【重要】当サイトの動作確認環境

マイクラのModは、バージョンが少し違うだけでコードが動かなくなることがよくあります。この記事のスクリプトは、以下の環境で動作確認を行っています。

  • Minecraftバージョン: 1.20.1
  • 前提Mod: Forge
  • 使用Mod: KubeJS,
  • 環境: ConoHa VPS

1. 😈 恐怖の「ジャンプの悪魔」召喚スクリプト

今回はマイクラの世界全体の時間(Tick)を監視する処理なので、サーバー内の server_scripts フォルダを直接編集します。

FTPソフト等でサーバーに接続し、kubejs ➔ server_scripts フォルダの中に、新しく jump_demon.js というファイルを作成して、以下のコードをそのままコピペして貼り付けてください。

jump_demon.js に貼り付けるコード ▼

JavaScript

// ==========================================
// 😈 友達の畑を滅ぼす「ジャンプの悪魔」
// ==========================================

const DEMON_SPAWN_CHANCE = 0.5; // 出現確率50%
const DEMON_JUMP_POWER = 0.45;  // 絶妙なジャンプ力
const DEMON_LEAP_SPEED = 0.14;  // 飛びかかるスピード

global.demonSpawnedToday = false; 
global.demonCheckedToday = false;

LevelEvents.tick(event => {
    if (event.level.isClientSide()) return;
    const { server, level } = event;
    let time = level.dayTime() % 24000;

    // 1. 朝になったら出現フラグをリセット(※悪魔自体は倒されるまで居座る鬼仕様)
    if (time < 13000) {
        if (global.demonSpawnedToday || global.demonCheckedToday) {
            global.demonSpawnedToday = false;
            global.demonCheckedToday = false;
        }
    }

    // 2. 夜(13000)の出現判定。50%の確率で友達を絶望に突き落とす
    if (time >= 13000 && !global.demonCheckedToday) {
        global.demonCheckedToday = true; 
        if (Math.random() <= DEMON_SPAWN_CHANCE) {
            let p = level.players[0]; // ターゲットを捕捉
            if (p) {
                let spawnX = p.x + 5;
                let spawnY = p.y;
                let spawnZ = p.z + 5;
                let foundFarmland = false;

                // ターゲットの周囲から憎き「畑」をサーチして出現位置を決定
                let searchRange = 16;
                for (let ox = -searchRange; ox <= searchRange && !foundFarmland; ox += 2) {
                    for (let oz = -searchRange; oz <= searchRange && !foundFarmland; oz += 2) {
                        for (let oy = -3; oy <= 3; oy++) {
                            let checkBlock = level.getBlock(p.blockX + ox, p.blockY + oy, p.blockZ + oz);
                            if (checkBlock.id === 'minecraft:farmland') {
                                spawnX = checkBlock.x + 0.5;
                                spawnY = checkBlock.y + 1.0;
                                spawnZ = checkBlock.z + 0.5;
                                foundFarmland = true;
                                break;
                            }
                        }
                    }
                }

                // 移動速度0、ノックバック無効、発光エフェクト付きの完全なホラー仕様
                let nbt = '{Glowing:1b,Attributes:[{Name:"generic.movement_speed",Base:0.0f},{Name:"generic.knockback_resistance",Base:1.0f}],CustomName:\'{"text":"§cジャンプの悪魔"}\',Tags:["is_jump_demon"],PersistenceRequired:1b}';
                server.runCommandSilent(`summon zombie ${spawnX} ${spawnY} ${spawnZ} ${nbt}`);
                p.tell("§c§lジャンプの悪魔が畑の闇から現れた…");
            }
        }
    }

    // 3. 悪魔の凶悪アクション(3秒に1回発動)
    level.getEntities().filter(e => e.tags.contains('is_jump_demon')).forEach(d => {
        let cycle = server.tickCount % 60;
        
        // ① 足元の畑をただの土に戻す(嫌がらせの極み)
        if (cycle == 55) {
            let bx = d.blockX;
            let by = d.blockY;
            let bz = d.blockZ;

            let underBlock = level.getBlock(bx, by - 1, bz);
            let insideBlock = level.getBlock(bx, by, bz);
            let broke = false;

            if (underBlock.id === 'minecraft:farmland') {
                underBlock.set('minecraft:dirt');
                broke = true;
            } else if (insideBlock.id === 'minecraft:farmland') {
                insideBlock.set('minecraft:dirt');
                broke = true;
            }

            if (broke) {
                server.runCommandSilent(`playsound minecraft:block.grass.break block @a ${d.x} ${d.y} ${d.z} 1.0 0.5`);
                // ドッキリ失敗防止!土に戻った瞬間の数ミリの段差で足が埋まるバグを回避
                d.setPosition(d.x, d.y + 0.065, d.z);
            }
        } 
        // ② 獲物(畑)を探して振り向き、跳びかかる!
        else if (cycle == 40) {
            let targetX = d.x;
            let targetZ = d.z;
            let foundFarm = false;

            let range = 6;
            for (let ox = -range; ox <= range && !foundFarm; ox++) {
                for (let oz = -range; oz <= range; oz++) {
                    let bx = d.blockX + ox;
                    let bz = d.blockZ + oz;
                    
                    for (let oy = -2; oy <= 1; oy++) {
                        let by = d.blockY + oy;
                        if (level.getBlock(bx, by, bz).id === 'minecraft:farmland') {
                            targetX = bx + 0.5;
                            targetZ = bz + 0.5;
                            foundFarm = true;
                            break;
                        }
                    }
                }
            }

            let motionX = 0;
            let motionZ = 0;

            if (foundFarm) {
                let vecX = targetX - d.x;
                let vecZ = targetZ - d.z;
                let dist = Math.sqrt(vecX * vecX + vecZ * vecZ);

                if (dist > 0.3) {
                    motionX = (vecX / dist) * DEMON_LEAP_SPEED;
                    motionZ = (vecZ / dist) * DEMON_LEAP_SPEED;

                    // ちゃんと畑の方を振り向かせる(恐怖感アップ)
                    server.runCommandSilent(`execute as ${d.uuid} at @s run tp @s ~ ~ ~ facing ${targetX} ~ ${targetZ}`);
                }
            }

            // イカスミを撒き散らしながらビターン!と跳躍
            d.setMotion(motionX, DEMON_JUMP_POWER, motionZ);
            server.runCommandSilent(`particle minecraft:squid_ink ${d.x} ${d.y} ${d.z} 0.3 0.1 0.3 0.05 15`);
        }
    });
});

2. 【解説】ドッキリを絶対に成功させるための「こだわりの工夫」

今回のスクリプト、ただ畑を荒らすだけならもっと簡単なコードでも動きます。でも、「いかに友達を本気でビビらせるか」「マイクラ特有のバグでドッキリを台無しにしないか」を追求して、コードにかなりこだわりの調整(魔改造)を加えてみました!

  • 「耕地」を探し出して向きを変える(執念の索敵AI) ただランダムに跳ね回るのではなく、周囲6ブロック以内の「耕地(farmland)」を自動でスキャンする仕様にしました。ターゲットを見つけると、コマンドでしっかり標的の畑を振り向いてから飛びかかってきます。この「狙われている感」が恐怖を倍増させます。
  • 足が埋まるバグを回避する「微小押し上げ」 マイクラの耕地ブロックは、実は通常のブロックより少しだけ高さが低く(15/16ピクセル)なっています。これが荒らされて「土(フルブロック)」に戻った瞬間、上にいるモブはブロックの中に足が埋まってスタック(行動不能)してしまうバグが起きます。 ドッキリがこれのせいで不発になるのを防ぐため、コード内に d.setPosition(d.x, d.y + 0.065, d.z) を仕込み、土に戻る瞬間に悪魔の体を数ミリだけフワッと持ち上げてスタックを完全回避しています!
  • 移動速度はあえて「0」に! 歩くスピードは完全にゼロに設定しました。普通に歩いてくるのではなく、イカスミを吐き出しながら3秒に1回「ビターン!」とジャンプだけで執拗に近づいてくる不気味さを演出しています。

3. ゲーム内で即座に反映して夜を待とう!

サーバー上のファイルを保存したら、OP権限を持った状態でマイクラのチャット欄を開き、以下のコマンドを実行するだけで即座に反映されます。

/reload

あとは、ゲーム内で夜(夕暮れ)になるのを待つだけです。 確率50%を引き当てると、チャット欄に「ジャンプの悪魔が畑の闇から現れた…」という不吉なメッセージと共に、畑のど真ん中にヤツが現れます!

💡 予告:自分だけのオリジナルイベントを作ってみよう!

今回はコピペですぐに遊べる完成済みのコードをご紹介しましたが、「こういうイベントってどうやってイチから作るの?」「自分でもオリジナルのギミックを考えてみたい!」と思った方もいるはず。

次回は、今回使った LevelEvents.tick などの「KubeJSを使ったイベントの作り方」を基礎から深掘りする解説記事をお届けします! AIへの指示の出し方のコツや、イベントが動く仕組みが分かれば、世界に一つだけのギミックが自由自在に作れるようになりますよ。ぜひお楽しみに!

👉 【次回の記事:KubeJSイベント作成の基礎(準備中)】

▼ 安定したマイクラサーバー構築ならこの環境! ▼ こだわりのMod環境やドッキリギミックを安定して動かすなら、当ブログでも使っているConoHa VPSが一番手軽で確実です。設定ファイルの編集も簡単に行えるので、ぜひ皆さんも最高の独自ワールドを構築してみてくださいね!

コメント

タイトルとURLをコピーしました