2024-12-05 14:47:12 +08:00

3.4 KiB

/spawnxp command

This tutorial will cover spawning in entities using the ModAPI.promisify() API.

As usual, we'll start with the boilerplate:

(function SpawnXPMod() {
    ModAPI.meta.title("Spawn XP");
    ModAPI.meta.description("Adds a /spawnxp command.");
    ModAPI.meta.credits("By <author_name>");

    //future code
})();

We'll move context to the server, and add a command listener, and ensure the sender is a player:

PluginAPI.dedicatedServer.appendCode(function () { //Run this code on the server
    PluginAPI.addEventListener("processcommand", (event) => { //Command processing event
        if (
            !ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP")
                .instanceOf(event.sender.getRef())
        ) {
            return;
        }
    });
});

Next, we'll check that the command is /spawnxp. If it is, we'll get the current dimension of the player, and spawn an XP orb at the sender's position. To construct the XP orb, we'll get the EntityXPOrb class and get the first constructor

PluginAPI.dedicatedServer.appendCode(function () { //Run this code on the server
    PluginAPI.addEventListener("processcommand", (event) => { //Command processing event
        if (
            !ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP") //If it isn't a player, exit the method
                .instanceOf(event.sender.getRef())
        ) {
            return;
        }

        if (event.command.toLowerCase().startWith("/spawnxp")) {
            const world = event.sender.getServerForPlayer(); //get the current dimension
            const senderPos = event.sender.getPosition(); //get the player's current position

            const EntityXP = ModAPI.reflect.getClassByName("EntityXPOrb"); // Get the entity xp orb class
            
            const xporb = EntityXP.constructors[0](world.getRef(), senderPos.getX(), senderPos.getY(), senderPos.getZ(), 10); //Construct the first constructor, with arguments, World, x, y, z, xp value

            //Get the spawn entity in world method
            var spawnEntityInWorldMethod = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.world.World", "spawnEntityInWorld")];
            //Because this method reads and writes data to chunks, it tries to save and load the eaglercraft state, which won't work if eaglercraft is also running its own code.
            //To work around this issue, use ModAPI.promisify() to convert the method into one that returns a promise
            spawnEntityInWorldMethod = ModAPI.promisify(spawnEntityInWorldMethod);

            //we can now use the spawnEntityInWorld method
            //wherever you see getRef(), it means to retrieve the raw, untouched data that TeaVM can use.
            spawnEntityInWorldMethod(world.getRef(), xporb).then(result => {
                // Get the chat component class
                const ChatComponentTextClass = ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText");

                // Construct the chat component and send it to the client.
                event.sender.addChatMessage(ChatComponentTextClass.constructors[0](ModAPI.util.str("An xp orb has been spawned!")));
            });

            //Stop the unknown command error
            event.preventDefault = true;
        }
    });
});