From 34c83e87c4d23517abd0573cb62dd734db3725fb Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 28 Dec 2021 21:44:50 -0700 Subject: [PATCH] improve CommandSender API --- .../{entity => command}/CommandSender.java | 10 ++++++- .../com/dfsek/terra/api/entity/Entity.java | 3 +- .../platform/CommandRegistrationEvent.java | 2 +- .../com/dfsek/terra/addon/InternalAddon.java | 2 +- .../terra/bukkit/BukkitCommandSender.java | 25 +++++++++++++++- .../com/dfsek/terra/bukkit/BukkitEntity.java | 5 ---- .../com/dfsek/terra/bukkit/BukkitPlayer.java | 8 +---- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 2 +- .../terra/bukkit/world/BukkitAdapter.java | 14 +++++---- .../dfsek/terra/fabric/FabricEntryPoint.java | 2 +- .../implementations/entity/EntityMixin.java | 4 --- .../entity/ServerCommandSourceMixin.java | 30 +++++++++++++++++-- 12 files changed, 77 insertions(+), 30 deletions(-) rename common/api/src/main/java/com/dfsek/terra/api/{entity => command}/CommandSender.java (59%) diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java similarity index 59% rename from common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java rename to common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java index ad9a25030..c2ca46127 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java @@ -5,11 +5,19 @@ * reference the LICENSE file in the common/api directory. */ -package com.dfsek.terra.api.entity; +package com.dfsek.terra.api.command; import com.dfsek.terra.api.Handle; +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.terra.api.entity.Player; + +import java.util.Optional; public interface CommandSender extends Handle { void sendMessage(String message); + + Optional getEntity(); + + Optional getPlayer(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java index 68a82fb7a..0f11b746e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java @@ -7,11 +7,12 @@ package com.dfsek.terra.api.entity; +import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; -public interface Entity extends CommandSender { +public interface Entity extends Handle { Vector3 position(); void position(Vector3 position); diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java index 91ed882db..40d113079 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java @@ -2,7 +2,7 @@ package com.dfsek.terra.api.event.events.platform; import cloud.commandframework.CommandManager; -import com.dfsek.terra.api.entity.CommandSender; +import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.Event; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java b/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java index 27d44ed00..1a130d96d 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java @@ -28,7 +28,7 @@ import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.command.arguments.RegistryArgument; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.entity.CommandSender; +import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java index f7509a41f..5816d5009 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java @@ -17,9 +17,16 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.terra.api.entity.Player; + +import com.dfsek.terra.bukkit.world.BukkitAdapter; + import org.bukkit.ChatColor; -import com.dfsek.terra.api.entity.CommandSender; +import com.dfsek.terra.api.command.CommandSender; + +import java.util.Optional; public class BukkitCommandSender implements CommandSender { @@ -34,6 +41,22 @@ public class BukkitCommandSender implements CommandSender { delegate.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); } + @Override + public Optional getEntity() { + if(delegate instanceof org.bukkit.entity.Entity entity) { + return Optional.of(BukkitAdapter.adapt(entity)); + } + return Optional.empty(); + } + + @Override + public Optional getPlayer() { + if(delegate instanceof org.bukkit.entity.Player player) { + return Optional.of(BukkitAdapter.adapt(player)); + } + return Optional.empty(); + } + @Override public org.bukkit.command.CommandSender getHandle() { return delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index 75f146f64..f36436471 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -58,9 +58,4 @@ public class BukkitEntity implements Entity { public ServerWorld world() { return BukkitAdapter.adapt(entity.getWorld()); } - - @Override - public void sendMessage(String message) { - entity.sendMessage(message); - } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index e069d5f2b..7d8b0a5f0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -25,11 +25,10 @@ import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.bukkit.world.BukkitAdapter; -public class BukkitPlayer extends BukkitCommandSender implements Player { +public class BukkitPlayer implements Player { private final org.bukkit.entity.Player delegate; public BukkitPlayer(org.bukkit.entity.Player delegate) { - super(delegate); this.delegate = delegate; } @@ -60,9 +59,4 @@ public class BukkitPlayer extends BukkitCommandSender implements Player { public ServerWorld world() { return BukkitAdapter.adapt(delegate.getWorld()); } - - @Override - public void sendMessage(String message) { - delegate.sendMessage(message); - } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index a32c6323d..b58bd740c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -22,7 +22,7 @@ import cloud.commandframework.bukkit.CloudBukkitCapabilities; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.paper.PaperCommandManager; -import com.dfsek.terra.api.entity.CommandSender; +import com.dfsek.terra.api.command.CommandSender; import org.bukkit.Bukkit; import org.bukkit.generator.ChunkGenerator; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index 621fe178b..d6e9f755d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -18,10 +18,13 @@ package com.dfsek.terra.bukkit.world; +import com.dfsek.terra.api.entity.Entity; + +import com.dfsek.terra.bukkit.BukkitEntity; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.TreeType; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -31,14 +34,13 @@ import com.dfsek.terra.api.block.state.properties.enums.Axis; import com.dfsek.terra.api.block.state.properties.enums.Half; import com.dfsek.terra.api.block.state.properties.enums.RailShape; import com.dfsek.terra.api.block.state.properties.enums.RedstoneConnection; -import com.dfsek.terra.api.entity.CommandSender; +import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.item.Enchantment; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.chunk.Chunk; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitEntity; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.world.block.BukkitBlockTypeAndItem; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockState; @@ -164,11 +166,13 @@ public final class BukkitAdapter { } public static CommandSender adapt(org.bukkit.command.CommandSender sender) { - if(sender instanceof Player) return new BukkitPlayer((Player) sender); - if(sender instanceof Entity) return new BukkitEntity((Entity) sender); return new BukkitCommandSender(sender); } + public static Entity adapt(org.bukkit.entity.Entity entity) { + return new BukkitEntity(entity); + } + public static org.bukkit.command.CommandSender adapt(CommandSender sender) { return ((BukkitCommandSender) sender).getHandle(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java index 0ec32d3fc..d346b5bd3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricEntryPoint.java @@ -20,7 +20,7 @@ package com.dfsek.terra.fabric; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.fabric.FabricServerCommandManager; -import com.dfsek.terra.api.entity.CommandSender; +import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java index a53d45cd6..2cd3dd0d0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java @@ -60,8 +60,4 @@ public abstract class EntityMixin { public ServerWorld terra$world() { return (ServerWorld) world; } - - public void terra$sendMessage(String message) { - sendSystemMessage(new LiteralText(message), UUID.randomUUID()); // TODO: look into how this actually works and make it less jank - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java index ada343e6a..ae66b10fe 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java @@ -17,16 +17,22 @@ package com.dfsek.terra.fabric.mixin.implementations.entity; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; -import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import com.dfsek.terra.api.entity.CommandSender; +import java.util.Optional; + +import com.dfsek.terra.api.command.CommandSender; +import com.dfsek.terra.api.entity.Entity; +import com.dfsek.terra.api.entity.Player; @Mixin(ServerCommandSource.class) @@ -35,7 +41,27 @@ public abstract class ServerCommandSourceMixin { @Shadow public abstract void sendFeedback(Text message, boolean broadcastToOps); + @Shadow + public abstract ServerPlayerEntity getPlayer() throws CommandSyntaxException; + + @Shadow + @Nullable + public abstract net.minecraft.entity.@Nullable Entity getEntity(); + public void terra$sendMessage(String message) { sendFeedback(new LiteralText(message), true); } + + @Nullable + public Optional terra$getEntity() { + return Optional.ofNullable((Entity) getEntity()); + } + + public Optional terra$getPlayer() { + try { + return Optional.ofNullable((Player) getPlayer()); + } catch(CommandSyntaxException e) { + return Optional.empty(); + } + } }