Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ loom_version=1.16-SNAPSHOT
fabric_api_version=0.145.1+26.1

# Mod Properties
mod_version=1.0.0
mod_version=1.1.0
maven_group=dev.loat
archives_base_name=msmp-entity-mod

Expand Down
6 changes: 2 additions & 4 deletions src/main/java/dev/loat/msmp_entity/MSMPEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import dev.loat.msmp.MSMPNamespace;
import dev.loat.msmp.MSMPServer;
import dev.loat.msmp_entity.logging.Logger;
import dev.loat.msmp_entity.msmp.methods.Methods;
import dev.loat.msmp_entity.msmp.notifications.Notifications;
import dev.loat.msmp_entity.msmp.endpoints.Endpoints;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;

Expand Down Expand Up @@ -38,8 +37,7 @@ public class MSMPEntity implements ModInitializer {
public void onInitialize() {
Logger.setLoggerClass(MSMPEntity.class);

Methods.register(NS);
Notifications.register(NS, () -> msmp);
Endpoints.register(NS, () -> msmp);

ServerLifecycleEvents.SERVER_STARTED.register(server -> {
NS.attach(server);
Expand Down
58 changes: 58 additions & 0 deletions src/main/java/dev/loat/msmp_entity/msmp/endpoints/Endpoints.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package dev.loat.msmp_entity.msmp.endpoints;

import dev.loat.msmp.MSMPNamespace;
import dev.loat.msmp.MSMPServer;
import dev.loat.msmp_entity.msmp.endpoints.dimension.Dimension;
import dev.loat.msmp_entity.msmp.endpoints.dimension.DimensionSet;
import dev.loat.msmp_entity.msmp.endpoints.dimension.changed.DimensionChangedAdd;
import dev.loat.msmp_entity.msmp.endpoints.dimension.changed.DimensionChangedRemove;
import dev.loat.msmp_entity.msmp.endpoints.dimension.notification.changed.DimensionChanged;
import dev.loat.msmp_entity.msmp.endpoints.health.Health;
import dev.loat.msmp_entity.msmp.endpoints.health.HealthSet;
import dev.loat.msmp_entity.msmp.endpoints.items.Items;
import dev.loat.msmp_entity.msmp.endpoints.items.ItemsSet;
import dev.loat.msmp_entity.msmp.endpoints.position.Position;
import dev.loat.msmp_entity.msmp.endpoints.position.PositionSet;
import dev.loat.msmp_entity.msmp.endpoints.rotation.Rotation;
import dev.loat.msmp_entity.msmp.endpoints.rotation.RotationSet;
import dev.loat.msmp_entity.msmp.endpoints.uuid.UUID;

import java.util.function.Supplier;


/**
* Central registration point for all {@code entity} MSMP endpoints.
*
* <p>Each endpoint is implemented in its own sub-package and registered here.</p>
*/
public class Endpoints {
private Endpoints() {}

/**
* Registers all endpoints on the given {@link MSMPNamespace}.
*
* @param namespace The namespace to register all endpoints under
* @param msmpServer A supplier for the MSMPServer instance, used by some endpoints to subscribe to server events
*/
public static void register(MSMPNamespace namespace, Supplier<MSMPServer> msmpServer) {
Dimension.register(namespace);
DimensionSet.register(namespace);
DimensionChanged.register(namespace, msmpServer);
DimensionChangedAdd.register(namespace);
DimensionChangedRemove.register(namespace);

Health.register(namespace);
HealthSet.register(namespace);

Items.register(namespace);
ItemsSet.register(namespace);

Position.register(namespace);
PositionSet.register(namespace);

Rotation.register(namespace);
RotationSet.register(namespace);

UUID.register(namespace);
}
}
Original file line number Diff line number Diff line change
@@ -1,44 +1,51 @@
package dev.loat.msmp_entity.msmp.methods.dimension;
package dev.loat.msmp_entity.msmp.endpoints.dimension;

import dev.loat.msmp.MSMPNamespace;
import dev.loat.msmp_entity.logging.Logger;
import dev.loat.msmp_entity.logging.RPCConnectionLogger;
import dev.loat.msmp_entity.msmp.components.EntityRequest;
import dev.loat.msmp_entity.msmp.components.EntityResolver;

import net.minecraft.world.entity.Entity;


/**
* Registers the {@code entity:dimension} MSMP method.
*
* <p>Returns the dimension of any loaded entity.
* Players can be looked up by UUID or name; all other entities require a UUID.</p>
*
*
* <p>Returns the current dimension of any loaded entity.</p>
*
* <p>Example request:</p>
* <pre>{@code
* { "jsonrpc": "2.0", "id": 1, "method": "entity:dimension",
* "params": [{ "name": "Steve" }] }
* }</pre>
* <pre><code>
* {
* "jsonrpc": "2.0",
* "id": 1,
* "method": "entity:dimension",
* "params": [{ "name": "Steve" }]
* }
* </code></pre>
*
* <p>Example response:</p>
* <pre>{@code
* { "entity": { "id": "069a...", "name": "Steve" }, "dimension": "minecraft:overworld" }
* }</pre>
* <pre><code>
* {
* "entity": { "id": "069a...", "name": "Steve" },
* "dimension": "minecraft:overworld"
* }
* </code></pre>
*/
public class Dimension {

private Dimension() {}

/**
* Registers the {@code entity:dimension} method on the given {@link MSMPNamespace}.
* Registers the {@code entity:dimension} method.
*
* <p>Entity lookup is delegated to {@link EntityResolver#resolveEntity}.
* The dimension is returned as a resource key string via {@code identifier().toString()},
* e.g. {@code minecraft:overworld}, {@code minecraft:the_nether}, {@code minecraft:the_end}.</p>
* <p>The dimension is returned as a resource key string, ex. {@code minecraft:overworld},
* {@code minecraft:the_nether}, {@code minecraft:the_end}.</p>
*
* @param namespace The namespace to register this method under
*/
public static void register(MSMPNamespace namespace) {
namespace.method("dimension",
namespace.method(
"dimension",
EntityRequest.SCHEMA,
DimensionResponse.SCHEMA,
"Returns the current dimension of any loaded entity by UUID, or a player by name",
Expand All @@ -50,7 +57,7 @@ public static void register(MSMPNamespace namespace) {
entity.level().dimension().identifier().toString()
);
} catch (IllegalArgumentException e) {
Logger.warning("entity:dimension - " + e.getMessage());
RPCConnectionLogger.warning(client.connectionId(), "entity:dimension - " + e.getMessage());
throw e;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
package dev.loat.msmp_entity.msmp.methods.dimension;
package dev.loat.msmp_entity.msmp.endpoints.dimension;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;

import dev.loat.msmp_entity.msmp.components.EntityRef;

import net.minecraft.server.jsonrpc.api.Schema;

/**
* Response payload shared between {@code entity:dimension} and {@code entity:dimension/set}.
* Response payload for the {@code entity:dimension} and {@code entity:dimension/set} method.
*
* <p>Example JSON representation:</p>
* <pre>{@code
* <p>Example response:</p>
* <pre><code>
* {
* "entity": { "id": "069a79f4-44e9-4726-a5be-fca90e38aaf5", "name": "Steve" },
* "entity": { "id": "069a79f4-44e9-4726-a5be-fca90e38aaf5", "name": "Steve" },
* "dimension": "minecraft:overworld"
* }
* }</pre>
* </code></pre>
*
* @param entity The entity reference; always includes UUID, name only for players
* @param entity The entity reference; always includes UUID, name only for players
* @param dimension The resource key of the dimension the entity is currently in
*/
public record DimensionResponse(EntityRef entity, String dimension) {
Expand All @@ -37,3 +38,4 @@ public record DimensionResponse(EntityRef entity, String dimension) {
.withField("entity", EntityRef.SCHEMA)
.withField("dimension", Schema.STRING_SCHEMA);
}

Original file line number Diff line number Diff line change
@@ -1,39 +1,47 @@
package dev.loat.msmp_entity.msmp.methods.dimension;
package dev.loat.msmp_entity.msmp.endpoints.dimension;

import dev.loat.msmp.MSMPNamespace;
import dev.loat.msmp_entity.logging.RPCConnectionLogger;
import dev.loat.msmp_entity.msmp.components.EntityResolver;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;


/**
* Registers the {@code entity:dimension/set} MSMP method.
*
* <p>Transfers the entity to the given dimension, keeping its current position and rotation.</p>
*
* <p>Example request:</p>
* <pre>{@code
* { "jsonrpc": "2.0", "id": 1, "method": "entity:dimension/set",
* "params": [{ "name": "Steve", "dimension": "minecraft:the_nether" }] }
* {
* "jsonrpc": "2.0",
* "id": 1,
* "method": "entity:dimension/set",
* "params": [{ "name": "Steve", "dimension": "minecraft:the_nether" }]
* }
* }</pre>
*
* <p>Example response:</p>
* <pre>{@code
* { "entity": { "id": "069a...", "name": "Steve" }, "dimension": "minecraft:the_nether" }
* {
* "entity": { "id": "069a...", "name": "Steve" },
* "dimension": "minecraft:the_nether"
* }
* }</pre>
*/
public class DimensionSet {

private DimensionSet() {}

/**
* Registers the {@code entity:dimension/set} method on the given {@link MSMPNamespace}.
* Registers the {@code entity:dimension/set} method.
*
* <p>The entity is teleported to the target dimension at its current position and rotation.
* Throws {@link IllegalArgumentException} if the dimension identifier is unknown.</p>
* <p>The entity is teleported to the target dimension at its current position and rotation.</p>
*
* @param namespace The namespace to register this method under
*/
Expand All @@ -46,10 +54,10 @@ public static void register(MSMPNamespace namespace) {
try {
Entity entity = EntityResolver.resolveEntity(server, params);

Identifier dimId = Identifier.parse(params.dimension());
Identifier dimensionId = Identifier.parse(params.dimension());
ResourceKey<Level> dimKey = ResourceKey.create(
net.minecraft.core.registries.Registries.DIMENSION,
dimId
Registries.DIMENSION,
dimensionId
);
ServerLevel targetLevel = server.getLevel(dimKey);
if (targetLevel == null) {
Expand Down Expand Up @@ -78,3 +86,4 @@ public static void register(MSMPNamespace namespace) {
);
}
}

Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package dev.loat.msmp_entity.msmp.methods.dimension;
package dev.loat.msmp_entity.msmp.endpoints.dimension;

import java.util.Optional;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;

import dev.loat.msmp_entity.msmp.components.EntityLookup;
import net.minecraft.server.jsonrpc.api.Schema;

import java.util.Optional;
import net.minecraft.server.jsonrpc.api.Schema;


/**
Expand All @@ -15,12 +16,12 @@
* <p>Transfers the entity to the given dimension at its current position.</p>
*
* <p>Example JSON representation:</p>
* <pre>{@code
* <pre><code>
* { "name": "Steve", "dimension": "minecraft:the_nether" }
* }</pre>
* </code></pre>
*
* @param id The entity's UUID as a string, if provided
* @param name The player's in-game name, if provided (only works for online players)
* @param id The entity's UUID as a string, if provided
* @param name The player's in-game name, if provided (only works for online players)
* @param dimension The target dimension resource key (e.g. {@code minecraft:the_nether})
*/
public record DimensionSetRequest(
Expand All @@ -46,3 +47,4 @@ public record DimensionSetRequest(
.withField("name", Schema.STRING_SCHEMA)
.withField("dimension", Schema.STRING_SCHEMA);
}

Loading