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
```javascript
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;
}
}); });