Skip to content

Commit

Permalink
implementation /log, fix CommandAPI
Browse files Browse the repository at this point in the history
  • Loading branch information
MC-XiaoHei committed Aug 7, 2024
1 parent ff04e72 commit fc3e213
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 88 deletions.
32 changes: 24 additions & 8 deletions patches/server/0003-Command-API-support.patch
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ index 0000000000000000000000000000000000000000..0c978c7f7a5291b27b62457519d0373a
\ No newline at end of file
diff --git a/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java b/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3228efcb0d85c0c43cd4e52fe0b877414a5ebe5
index 0000000000000000000000000000000000000000..2e625f0345d79a8c8fe709b083f43460badc82bc
--- /dev/null
+++ b/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java
@@ -0,0 +1,1081 @@
Expand Down Expand Up @@ -297,7 +297,7 @@ index 0000000000000000000000000000000000000000..e3228efcb0d85c0c43cd4e52fe0b8774
+ // For some reason, MethodHandles fails for this field, but Field works okay
+ // entitySelectorUsesSelector = EntitySelector::usesSelector;
+ Field usesSelector = null;
+ for (Field field : EntitySelector.class.getFields()) {
+ for (Field field : EntitySelector.class.getDeclaredFields()) {
+ if (field.getType().equals(boolean.class) && Modifier.isPublic(field.getModifiers())) {
+ usesSelector = CommandAPIHandler.getField(EntitySelector.class, field.getName(), "");
+ }
Expand All @@ -306,7 +306,7 @@ index 0000000000000000000000000000000000000000..e3228efcb0d85c0c43cd4e52fe0b8774
+ // itemInput = SafeVarHandle.ofOrNull(ItemInput.class, "c", "tag", CompoundTag.class);
+ // For some reason, MethodHandles fails for this field, but Field works okay
+ Field dispatcher = null;
+ for (Field field : ServerFunctionLibrary.class.getFields()) {
+ for (Field field : ServerFunctionLibrary.class.getDeclaredFields()) {
+ if (CommandDispatcher.class.isAssignableFrom(field.getType())) {
+ Type genericType = field.getGenericType();
+ if (genericType instanceof ParameterizedType) {
Expand Down Expand Up @@ -1771,18 +1771,17 @@ index 9af388a8e56806ab44f8c3ef4f97086ce38ef3b4..7956046156b8e382fb377ebbc63fe873
if (missingDependencies.isEmpty()) {
validatedProviders.add(provider);
diff --git a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
index d78ad5eccd18d89050a486a0c40090a09683bd16..8302e4bedc03795c4cda526466fa4dc279b2dd21 100644
index d78ad5eccd18d89050a486a0c40090a09683bd16..17351285d16956d22eca0d5dce336699b485e42f 100644
--- a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
+++ b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
@@ -53,7 +53,7 @@ public class EntitySelector {
@@ -53,6 +53,7 @@ public class EntitySelector {
@Nullable
private final UUID entityUUID;
private final EntityTypeTest<Entity, ?> type;
- private final boolean usesSelector;
+ public final boolean usesSelector; // Lumina - Command API
+ @org.leavesmc.lumina.utils.ReflectTargetField // Lumina - Command API
private final boolean usesSelector;

public EntitySelector(int count, boolean includesNonPlayers, boolean localWorldOnly, Predicate<Entity> basePredicate, MinMaxBounds.Doubles distance, Function<Vec3, Vec3> positionOffset, @Nullable AABB box, BiConsumer<Vec3, List<? extends Entity>> sorter, boolean senderOnly, @Nullable String playerName, @Nullable UUID uuid, @Nullable EntityType<?> type, boolean usesAt) {
this.maxResults = count;
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index cc40d3e69a3635ca7895876159f2821091c14a9a..f16e1ee682415cf1b49aeba2fb3f879b07be3226 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
Expand Down Expand Up @@ -1825,3 +1824,20 @@ index 0000000000000000000000000000000000000000..8afd999c0e4453df6b3b0c52cd652175
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/leavesmc/lumina/utils/ReflectTargetField.java b/src/main/java/org/leavesmc/lumina/utils/ReflectTargetField.java
new file mode 100644
index 0000000000000000000000000000000000000000..4deb7ca3c09a03faf0ddf2b49d0a0581a9682c75
--- /dev/null
+++ b/src/main/java/org/leavesmc/lumina/utils/ReflectTargetField.java
@@ -0,0 +1,11 @@
+package org.leavesmc.lumina.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface ReflectTargetField {
+}
78 changes: 0 additions & 78 deletions patches/server/0005-Lumina-server-config-and-command.patch
Original file line number Diff line number Diff line change
Expand Up @@ -4,67 +4,6 @@ Date: Thu, 11 Apr 2024 22:58:15 +0800
Subject: [PATCH] Lumina server config and command


diff --git a/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java b/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java
index e3228efcb0d85c0c43cd4e52fe0b877414a5ebe5..bdc35ec969486f6f026f6fb9bb0b9c22b947c414 100644
--- a/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java
+++ b/src/main/java/dev/jorel/commandapi/nms/NMS_1_20_R4.java
@@ -25,19 +25,12 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
@@ -190,6 +183,7 @@ import net.minecraft.world.phys.Vec3;
import net.minecraft.world.scores.ScoreHolder;
import org.bukkit.loot.LootTable;
import org.jetbrains.annotations.NotNull;
+import org.leavesmc.lumina.utils.ReflectTargetField;

// Mojang-Mapped reflection

@@ -222,8 +216,10 @@ public class NMS_1_20_R4 extends NMS_Common {
// entitySelectorUsesSelector = EntitySelector::usesSelector;
Field usesSelector = null;
for (Field field : EntitySelector.class.getFields()) {
- if (field.getType().equals(boolean.class) && Modifier.isPublic(field.getModifiers())) {
- usesSelector = CommandAPIHandler.getField(EntitySelector.class, field.getName(), "");
+ for (Annotation annotation : field.getAnnotations()) {
+ if (annotation instanceof ReflectTargetField) {
+ usesSelector = CommandAPIHandler.getField(EntitySelector.class, field.getName(), "");
+ }
}
}
entitySelectorUsesSelector = usesSelector;
diff --git a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
index 8302e4bedc03795c4cda526466fa4dc279b2dd21..17351285d16956d22eca0d5dce336699b485e42f 100644
--- a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
+++ b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
@@ -53,7 +53,8 @@ public class EntitySelector {
@Nullable
private final UUID entityUUID;
private final EntityTypeTest<Entity, ?> type;
- public final boolean usesSelector; // Lumina - Command API
+ @org.leavesmc.lumina.utils.ReflectTargetField // Lumina - Command API
+ private final boolean usesSelector;

public EntitySelector(int count, boolean includesNonPlayers, boolean localWorldOnly, Predicate<Entity> basePredicate, MinMaxBounds.Doubles distance, Function<Vec3, Vec3> positionOffset, @Nullable AABB box, BiConsumer<Vec3, List<? extends Entity>> sorter, boolean senderOnly, @Nullable String playerName, @Nullable UUID uuid, @Nullable EntityType<?> type, boolean usesAt) {
this.maxResults = count;
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index f01863e33b7407c14e8bcd2a44e63bed01afe838..a37c35fd271ac815bd67a40ceaca95ff895ffd9e 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
Expand Down Expand Up @@ -984,20 +923,3 @@ index 0000000000000000000000000000000000000000..119b50c12f08c548e7a56dd983805324
+ EVERYONE
+ }
+}
diff --git a/src/main/java/org/leavesmc/lumina/utils/ReflectTargetField.java b/src/main/java/org/leavesmc/lumina/utils/ReflectTargetField.java
new file mode 100644
index 0000000000000000000000000000000000000000..4deb7ca3c09a03faf0ddf2b49d0a0581a9682c75
--- /dev/null
+++ b/src/main/java/org/leavesmc/lumina/utils/ReflectTargetField.java
@@ -0,0 +1,11 @@
+package org.leavesmc.lumina.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface ReflectTargetField {
+}
98 changes: 96 additions & 2 deletions patches/server/0056-Implementation-Carpet-features.patch
Original file line number Diff line number Diff line change
Expand Up @@ -3959,7 +3959,7 @@ index 0000000000000000000000000000000000000000..0d5758fd377dc834e3824a1e6dfcbc1f
\ No newline at end of file
diff --git a/src/main/java/org/leavesmc/lumina/carpet/CarpetServer.java b/src/main/java/org/leavesmc/lumina/carpet/CarpetServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7e4b712ead395aa3afe72484c333a8835efb878
index 0000000000000000000000000000000000000000..5951ca60109a7d26601745cf08e4c4ed8c97d2db
--- /dev/null
+++ b/src/main/java/org/leavesmc/lumina/carpet/CarpetServer.java
@@ -0,0 +1,141 @@
Expand Down Expand Up @@ -4048,7 +4048,7 @@ index 0000000000000000000000000000000000000000..a7e4b712ead395aa3afe72484c333a88
+ InfoCommand.register();
+ }
+ if (CarpetConfig.configModule.commandLog) {
+ // TODO
+ LogCommand.register();
+ }
+ if (CarpetConfig.configModule.commandSpawn) {
+ SpawnCommand.register();
Expand Down Expand Up @@ -4381,6 +4381,100 @@ index 0000000000000000000000000000000000000000..df59f4c3280ed0f4ef33ad24ca9dee8a
+ grep));
+ }
+}
diff --git a/src/main/java/org/leavesmc/lumina/carpet/command/LogCommand.java b/src/main/java/org/leavesmc/lumina/carpet/command/LogCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..0937d1e18e39ceb3a22477cb33a309978c885dc9
--- /dev/null
+++ b/src/main/java/org/leavesmc/lumina/carpet/command/LogCommand.java
@@ -0,0 +1,88 @@
+package org.leavesmc.lumina.carpet.command;
+
+import dev.jorel.commandapi.CommandAPICommand;
+import dev.jorel.commandapi.arguments.EntitySelectorArgument;
+import dev.jorel.commandapi.arguments.LiteralArgument;
+import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.leavesmc.lumina.carpet.logging.LoggerRegistry;
+
+import static net.kyori.adventure.text.Component.*;
+import static net.kyori.adventure.text.format.NamedTextColor.*;
+import static net.kyori.adventure.text.format.Style.*;
+import static net.kyori.adventure.text.format.TextDecoration.*;
+
+public class LogCommand {
+ public static void register() {
+ createBase()
+ .withArguments(new LiteralArgument("clear"))
+ .withOptionalArguments(new EntitySelectorArgument.OnePlayer("target"))
+ .executes((sender, args) -> {
+ Player target = (Player) args.get("target");
+ if (sender instanceof Player player) {
+ target = player;
+ }
+ if (target == null) {
+ sender.sendMessage(text("Must specified a player when run this in console").color(RED));
+ }
+ unsubFromAll(sender, target);
+ })
+ .register("carpet");
+ }
+
+ private static CommandAPICommand createBase() {
+ return new CommandAPICommand("log")
+ .withPermission("carpet.command.log");
+ }
+
+ private static void unsubFromAll(CommandSender sender, Player target) {
+ net.minecraft.world.entity.player.Player player = ((CraftPlayer) target).getHandle();
+ for (String logName : LoggerRegistry.getLoggerNames()) {
+ LoggerRegistry.unsubscribePlayer(target.getName(), logName);
+ }
+ sender.sendMessage(text("Unsubscribed from all logs").color(GRAY).style(style(ITALIC)));
+ }
+
+ private static int unsubFromLogger(CommandSender sender, Player target, String logName) {
+ if (LoggerRegistry.getLogger(logName) == null) {
+ sender.sendMessage(text("Unknown logger: " + logName).color(RED));
+ return 0;
+ }
+ LoggerRegistry.unsubscribePlayer(target.getName(), logName);
+ sender.sendMessage(text("Unsubscribed from " + logName).color(GRAY).style(style(ITALIC)));
+ return 1;
+ }
+
+ private static int toggleSubscription(CommandSender sender, Player target, String logName) {
+ if (LoggerRegistry.getLogger(logName) == null) {
+ sender.sendMessage(text("Unknown logger: " + logName).color(RED));
+ return 0;
+ }
+ boolean subscribed = LoggerRegistry.togglePlayerSubscription(target.getName(), logName);
+ if (subscribed) {
+ sender.sendMessage(text(target.getName() + " subscribed to " + logName + ".").color(GRAY));
+ } else {
+ sender.sendMessage(text(target.getName() + " unsubscribed from " + logName + ".").color(GRAY));
+ }
+ return 1;
+ }
+
+ private static int subscribePlayer(CommandSender sender, Player target, String logName, String option) {
+ if (LoggerRegistry.getLogger(logName) == null) {
+ sender.sendMessage(text("Unknown logger: " + logName).color(RED));
+ return 0;
+ }
+ if (!LoggerRegistry.getLogger(logName).isOptionValid(option)) {
+ sender.sendMessage(text("Invalid option: " + option).color(RED));
+ return 0;
+ }
+ LoggerRegistry.subscribePlayer(target.getName(), logName, option);
+ if (option != null) {
+ sender.sendMessage(text("Subscribed to " + logName + "(" + option + ")").color(GRAY).style(style(ITALIC)));
+ } else {
+ sender.sendMessage(text("Subscribed to " + logName).color(GRAY).style(style(ITALIC)));
+ }
+ return 1;
+ }
+}
diff --git a/src/main/java/org/leavesmc/lumina/carpet/command/PerimeterInfoCommand.java b/src/main/java/org/leavesmc/lumina/carpet/command/PerimeterInfoCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed445c468541c6c7f9198cca3b64f6422b87c091
Expand Down

0 comments on commit fc3e213

Please sign in to comment.