From 7c0771b85c1f8b8d3121d079318ead0d3f302df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=8F=E3=83=A0=E3=82=B9=E3=82=B1=20=E3=83=8F=E3=83=A0?= Date: Fri, 14 May 2021 20:26:04 +0900 Subject: [PATCH] Made setFlySpeed and setWalkSpeed usable on server --- gradle.properties | 2 +- .../java/com/hamusuke/flycommod/Main.java | 1 + .../command/CommandEntityAbilities.java | 33 +- .../flycommod/command/CommandFlying.java | 321 ++++++++---------- .../invoker/PlayerAbilitiesInvoker.java | 7 + .../flycommod/mixin/PlayerAbilitiesMixin.java | 23 ++ .../assets/flycommand/lang/en_us.json | 13 +- .../assets/flycommand/lang/ja_jp.json | 13 +- src/main/resources/fabric.mod.json | 3 + src/main/resources/flycommand.mixins.json | 12 + 10 files changed, 230 insertions(+), 198 deletions(-) create mode 100644 src/main/java/com/hamusuke/flycommod/invoker/PlayerAbilitiesInvoker.java create mode 100644 src/main/java/com/hamusuke/flycommod/mixin/PlayerAbilitiesMixin.java create mode 100644 src/main/resources/flycommand.mixins.json diff --git a/gradle.properties b/gradle.properties index 38f87c4..e0308e8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,6 @@ org.gradle.jvmargs=-Xmx1G fabric_version=0.34.0+1.16 - mod_version = 1.2 + mod_version = 1.3 maven_group = com.hamusuke archives_base_name = fly-command-mod \ No newline at end of file diff --git a/src/main/java/com/hamusuke/flycommod/Main.java b/src/main/java/com/hamusuke/flycommod/Main.java index 470cf15..1cc299d 100644 --- a/src/main/java/com/hamusuke/flycommod/Main.java +++ b/src/main/java/com/hamusuke/flycommod/Main.java @@ -16,6 +16,7 @@ public class Main implements ModInitializer { public void onInitialize() { Registry.register(Registry.ITEM, new Identifier(MOD_ID, "flying_stick"), FLYING_STICK); + CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { CommandFlying.register(dispatcher); CommandEntityAbilities.register(dispatcher); diff --git a/src/main/java/com/hamusuke/flycommod/command/CommandEntityAbilities.java b/src/main/java/com/hamusuke/flycommod/command/CommandEntityAbilities.java index d0aac02..a06db80 100644 --- a/src/main/java/com/hamusuke/flycommod/command/CommandEntityAbilities.java +++ b/src/main/java/com/hamusuke/flycommod/command/CommandEntityAbilities.java @@ -10,20 +10,33 @@ import net.minecraft.text.TranslatableText; import java.util.Collection; +import java.util.stream.Collectors; public class CommandEntityAbilities { public static void register(CommandDispatcher dispatcher) { - LiteralArgumentBuilder literalargumentbuilder = CommandManager.literal("entityabilities").requires((permission) -> permission.hasPermissionLevel(2)); + LiteralArgumentBuilder literalArgumentBuilder = CommandManager.literal("entityabilities").requires((permission) -> permission.hasPermissionLevel(2)); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("noGravity").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> noGravity(command.getSource(), EntityArgumentType.getEntities(command, "targets"), BoolArgumentType.getBool(command, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("noGravity").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> { + boolean flag = BoolArgumentType.getBool(command, "boolean"); + return noGravity(command.getSource(), EntityArgumentType.getEntities(command, "targets").stream().filter(entity -> entity.hasNoGravity() != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("setGlowing").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> setGlowing(command.getSource(), EntityArgumentType.getEntities(command, "targets"), BoolArgumentType.getBool(command, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("setGlowing").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> { + boolean flag = BoolArgumentType.getBool(command, "boolean"); + return setGlowing(command.getSource(), EntityArgumentType.getEntities(command, "targets").stream().filter(entity -> entity.isGlowing() != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("setInvulnerable").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> setInvulnerable(command.getSource(), EntityArgumentType.getEntities(command, "targets"), BoolArgumentType.getBool(command, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("setInvulnerable").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> { + boolean flag = BoolArgumentType.getBool(command, "boolean"); + return setInvulnerable(command.getSource(), EntityArgumentType.getEntities(command, "targets").stream().filter(entity -> entity.isInvulnerable() != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("setInvisible").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> setInvisible(command.getSource(), EntityArgumentType.getEntities(command, "targets"), BoolArgumentType.getBool(command, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.entities()).then(CommandManager.literal("setInvisible").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes((command) -> { + boolean flag = BoolArgumentType.getBool(command, "boolean"); + return setInvisible(command.getSource(), EntityArgumentType.getEntities(command, "targets").stream().filter(entity -> entity.isInvisible() != flag).collect(Collectors.toList()), flag); + })))); - dispatcher.register(literalargumentbuilder); + dispatcher.register(literalArgumentBuilder); } private static int noGravity(ServerCommandSource source, Collection entities, boolean flag) { @@ -36,7 +49,7 @@ private static int noGravity(ServerCommandSource source, Collection 1) { + } else { source.sendFeedback(new TranslatableText("hamusuke.command.entityabilities.success.nogravity." + flag + ".multiple", entities.size()), true); } @@ -48,7 +61,7 @@ private static int setGlowing(ServerCommandSource source, Collection 1) { + } else { source.sendFeedback(new TranslatableText("hamusuke.command.entityabilities.success.setglowing." + flag + ".multiple", entities.size()), true); } @@ -60,7 +73,7 @@ private static int setInvulnerable(ServerCommandSource source, Collection 1) { + } else { source.sendFeedback(new TranslatableText("hamusuke.command.entityabilities.success.setinvulnerable." + flag + ".multiple", entities.size()), true); } @@ -72,7 +85,7 @@ private static int setInvisible(ServerCommandSource source, Collection 1) { + } else { source.sendFeedback(new TranslatableText("hamusuke.command.entityabilities.success.invisible." + flag + ".multiple", entities.size()), true); } diff --git a/src/main/java/com/hamusuke/flycommod/command/CommandFlying.java b/src/main/java/com/hamusuke/flycommod/command/CommandFlying.java index 22312a7..917f9b5 100644 --- a/src/main/java/com/hamusuke/flycommod/command/CommandFlying.java +++ b/src/main/java/com/hamusuke/flycommod/command/CommandFlying.java @@ -1,282 +1,257 @@ package com.hamusuke.flycommod.command; +import com.hamusuke.flycommod.invoker.PlayerAbilitiesInvoker; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import net.minecraft.command.argument.EntityArgumentType; +import net.minecraft.entity.Entity; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.TranslatableText; import java.util.Collection; +import java.util.stream.Collectors; public class CommandFlying { public static void register(CommandDispatcher dispatcher) { - LiteralArgumentBuilder literalargumentbuilder = CommandManager.literal("fly").requires((permission) -> permission.hasPermissionLevel(2)); + LiteralArgumentBuilder literalArgumentBuilder = CommandManager.literal("fly").requires((permission) -> permission.hasPermissionLevel(2)); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("allow").executes(e -> allow(e, EntityArgumentType.getPlayers(e, "targets"))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("allow").executes(e -> allow(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> !serverPlayerEntity.abilities.allowFlying).collect(Collectors.toList()))))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("noAllow").executes(e -> disallow(e, EntityArgumentType.getPlayers(e, "targets"))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("noAllow").executes(e -> disallow(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.abilities.allowFlying).collect(Collectors.toList()))))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("noGravity").executes(e -> noGravity(e, EntityArgumentType.getPlayers(e, "targets"))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("noGravity").executes(e -> noGravity(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> !serverPlayerEntity.hasNoGravity()).collect(Collectors.toList()))))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("gravity").executes(e -> gravity(e, EntityArgumentType.getPlayers(e, "targets"))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("gravity").executes(e -> gravity(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(Entity::hasNoGravity).collect(Collectors.toList()))))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("getFlySpeed").executes(e -> getFlySpeed(e, EntityArgumentType.getPlayers(e, "targets"))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("getFlySpeed").executes(e -> getFlySpeed(e, EntityArgumentType.getPlayers(e, "targets"))))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("getWalkSpeed").executes(e -> getWalkSpeed(e, EntityArgumentType.getPlayers(e, "targets"))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("getWalkSpeed").executes(e -> getWalkSpeed(e, EntityArgumentType.getPlayers(e, "targets"))))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setFlySpeed").then(CommandManager.argument("speed", FloatArgumentType.floatArg()).executes(e -> setFlySpeed(e, EntityArgumentType.getPlayers(e, "targets"), FloatArgumentType.getFloat(e, "speed")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setFlySpeed").then(CommandManager.argument("speed", FloatArgumentType.floatArg()).executes(e -> { + float speed = FloatArgumentType.getFloat(e, "speed"); + return setFlySpeed(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.abilities.getFlySpeed() != speed).collect(Collectors.toList()), speed); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setWalkSpeed").then(CommandManager.argument("speed", FloatArgumentType.floatArg()).executes(e -> setWalkSpeed(e, EntityArgumentType.getPlayers(e, "targets"), FloatArgumentType.getFloat(e, "speed")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setWalkSpeed").then(CommandManager.argument("speed", FloatArgumentType.floatArg()).executes(e -> { + float speed = FloatArgumentType.getFloat(e, "speed"); + return setWalkSpeed(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.abilities.getWalkSpeed() != speed).collect(Collectors.toList()), speed); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("allowEdit").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> allowEdit(e, EntityArgumentType.getPlayers(e, "targets"), BoolArgumentType.getBool(e, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("allowEdit").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> { + boolean flag = BoolArgumentType.getBool(e, "boolean"); + return allowEdit(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.abilities.allowModifyWorld != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("disableDamage").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> disableDamage(e, EntityArgumentType.getPlayers(e, "targets"), BoolArgumentType.getBool(e, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("disableDamage").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> { + boolean flag = BoolArgumentType.getBool(e, "boolean"); + return disableDamage(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.abilities.invulnerable != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("isFlying").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> isFlying(e, EntityArgumentType.getPlayers(e, "targets"), BoolArgumentType.getBool(e, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("isFlying").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> { + boolean flag = BoolArgumentType.getBool(e, "boolean"); + return isFlying(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.abilities.flying != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setGlowing").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> isGlowing(e, EntityArgumentType.getPlayers(e, "targets"), BoolArgumentType.getBool(e, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setGlowing").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> { + boolean flag = BoolArgumentType.getBool(e, "boolean"); + return isGlowing(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.isGlowing() != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setInvulnerable").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> isInvulnerable(e, EntityArgumentType.getPlayers(e, "targets"), BoolArgumentType.getBool(e, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setInvulnerable").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> { + boolean flag = BoolArgumentType.getBool(e, "boolean"); + return isInvulnerable(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.isInvulnerable() != flag).collect(Collectors.toList()), flag); + })))); - literalargumentbuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setInvisible").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> isInvisible(e, EntityArgumentType.getPlayers(e, "targets"), BoolArgumentType.getBool(e, "boolean")))))); + literalArgumentBuilder.then(CommandManager.argument("targets", EntityArgumentType.players()).then(CommandManager.literal("setInvisible").then(CommandManager.argument("boolean", BoolArgumentType.bool()).executes(e -> { + boolean flag = BoolArgumentType.getBool(e, "boolean"); + return isInvisible(e, EntityArgumentType.getPlayers(e, "targets").stream().filter(serverPlayerEntity -> serverPlayerEntity.isInvisible() != flag).collect(Collectors.toList()), flag); + })))); - dispatcher.register(literalargumentbuilder); + dispatcher.register(literalArgumentBuilder); } private static int allow(CommandContext source, Collection players) { - int i = 0; - for (ServerPlayerEntity serverplayerentity : players) { - if (!serverplayerentity.abilities.allowFlying) { - serverplayerentity.abilities.allowFlying = true; - serverplayerentity.sendAbilitiesUpdate(); - ++i; - } - } + players.forEach(serverPlayerEntity -> { + serverPlayerEntity.abilities.allowFlying = true; + serverPlayerEntity.sendAbilitiesUpdate(); + }); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.allow.single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.allow.multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.allow.multiple", players.size()), true); } - return i; + + return players.size(); } private static int disallow(CommandContext source, Collection players) { - int i = 0; - for (ServerPlayerEntity serverplayerentity : players) { - if (serverplayerentity.abilities.allowFlying) { - serverplayerentity.abilities.allowFlying = false; - serverplayerentity.abilities.flying = false; - serverplayerentity.sendAbilitiesUpdate(); - serverplayerentity.fallDistance = -(float) (serverplayerentity.getY() + 10.0D); - ++i; - } - } - - if (i == 1) { + players.forEach(serverPlayerEntity -> { + serverPlayerEntity.abilities.allowFlying = false; + serverPlayerEntity.abilities.flying = false; + serverPlayerEntity.sendAbilitiesUpdate(); + serverPlayerEntity.fallDistance = -(float) (serverPlayerEntity.getY() + 10.0D); + }); + + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.noallow.single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.noallow.multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.noallow.multiple", players.size()), true); } - return i; + + return players.size(); } private static int noGravity(CommandContext source, Collection players) { - int i = 0; - for (ServerPlayerEntity serverplayerentity : players) { - if (!serverplayerentity.hasNoGravity()) { - serverplayerentity.setNoGravity(true); - ++i; - } - } + players.forEach(serverPlayerEntity -> serverPlayerEntity.setNoGravity(true)); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.nogravity.single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.nogravity.multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.nogravity.multiple", players.size()), true); } - return i; + + return players.size(); } private static int gravity(CommandContext source, Collection players) { - int i = 0; - for (ServerPlayerEntity serverplayerentity : players) { - if (serverplayerentity.hasNoGravity()) { - serverplayerentity.setNoGravity(false); - serverplayerentity.fallDistance = -(float) (serverplayerentity.getY() + 10.0D); - ++i; - } - } + players.forEach(serverPlayerEntity -> { + serverPlayerEntity.setNoGravity(false); + serverPlayerEntity.fallDistance = -(float) (serverPlayerEntity.getY() + 10.0D); + }); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.gravity.single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.gravity.multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.gravity.multiple", players.size()), true); } - return i; + + return players.size(); } private static int getFlySpeed(CommandContext source, Collection players) { - players.forEach(serverplayerentity -> source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.getflyspeed", serverplayerentity.getDisplayName(), serverplayerentity.abilities.getFlySpeed()), false)); + players.forEach(serverPlayerEntity -> source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.getflyspeed", serverPlayerEntity.getDisplayName(), serverPlayerEntity.abilities.getFlySpeed()), false)); return players.size(); } private static int getWalkSpeed(CommandContext source, Collection players) { - players.forEach(serverplayerentity -> source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.getwalkspeed", serverplayerentity.getDisplayName(), serverplayerentity.abilities.getWalkSpeed()), false)); + players.forEach(serverPlayerEntity -> source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.getwalkspeed", serverPlayerEntity.getDisplayName(), serverPlayerEntity.abilities.getWalkSpeed()), false)); return players.size(); } - private static int setFlySpeed(CommandContext source, Collection players, float flyspeed) { - int i = 0; - if (!source.getSource().getMinecraftServer().isSinglePlayer()) { - source.getSource().sendError(new TranslatableText("hamusuke.command.fly.error")); - return i; - } - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.abilities.getFlySpeed() != flyspeed) { - serverPlayerEntity.abilities.setFlySpeed(flyspeed); - serverPlayerEntity.sendAbilitiesUpdate(); - ++i; - } - } + private static int setFlySpeed(CommandContext source, Collection players, float flySpeed) { + players.forEach(serverPlayerEntity -> { + ((PlayerAbilitiesInvoker) serverPlayerEntity.abilities).setFlySpeed(flySpeed); + serverPlayerEntity.sendAbilitiesUpdate(); + }); - if (i == 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setflyspeed.single", players.iterator().next().getDisplayName(), flyspeed), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setflyspeed.multiple", i, flyspeed), true); + if (players.size() == 1) { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setflyspeed.single", players.iterator().next().getDisplayName(), flySpeed), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setflyspeed.multiple", players.size(), flySpeed), true); } - return i; + + return players.size(); } - private static int setWalkSpeed(CommandContext source, Collection players, float walkspeed) { - int i = 0; - if (!source.getSource().getMinecraftServer().isSinglePlayer()) { - source.getSource().sendError(new TranslatableText("hamusuke.command.fly.error")); - return i; - } - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.abilities.getWalkSpeed() != walkspeed) { - serverPlayerEntity.abilities.setWalkSpeed(walkspeed); - serverPlayerEntity.sendAbilitiesUpdate(); - ++i; - } - } + private static int setWalkSpeed(CommandContext source, Collection players, float walkSpeed) { + players.forEach(serverPlayerEntity -> { + ((PlayerAbilitiesInvoker) serverPlayerEntity.abilities).setWalkSpeed(walkSpeed); + serverPlayerEntity.sendAbilitiesUpdate(); + }); - if (i == 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setwalkspeed.single", players.iterator().next().getDisplayName(), walkspeed), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setwalkspeed.multiple", i, walkspeed), true); + if (players.size() == 1) { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setwalkspeed.single", players.iterator().next().getDisplayName(), walkSpeed), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setwalkspeed.multiple", players.size(), walkSpeed), true); } - return i; + + return players.size(); } private static int allowEdit(CommandContext source, Collection players, boolean flag) { - int i = 0; - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.abilities.allowModifyWorld != flag) { - serverPlayerEntity.abilities.allowModifyWorld = flag; - serverPlayerEntity.sendAbilitiesUpdate(); - ++i; - } - } + players.forEach(serverPlayerEntity -> { + serverPlayerEntity.abilities.allowModifyWorld = flag; + serverPlayerEntity.sendAbilitiesUpdate(); + }); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.allowedit." + flag + ".single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.allowedit." + flag + ".multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.allowedit." + flag + ".multiple", players.size()), true); } - return i; + + return players.size(); } private static int disableDamage(CommandContext source, Collection players, boolean flag) { - int i = 0; - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.abilities.invulnerable != flag) { - serverPlayerEntity.abilities.invulnerable = flag; - serverPlayerEntity.sendAbilitiesUpdate(); - ++i; - } - } + players.forEach(serverPlayerEntity -> { + serverPlayerEntity.abilities.invulnerable = flag; + serverPlayerEntity.sendAbilitiesUpdate(); + }); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.disabledamage." + flag + ".single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.disabledamage." + flag + ".multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.disabledamage." + flag + ".multiple", players.size()), true); } - return i; + + return players.size(); } private static int isFlying(CommandContext source, Collection players, boolean flag) { - int i = 0; - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.abilities.flying != flag) { - serverPlayerEntity.abilities.flying = flag; - serverPlayerEntity.sendAbilitiesUpdate(); - ++i; - } - } + players.forEach(serverPlayerEntity -> { + serverPlayerEntity.abilities.flying = flag; + serverPlayerEntity.sendAbilitiesUpdate(); + }); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.isflying." + flag + ".single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.isflying." + flag + ".multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.isflying." + flag + ".multiple", players.size()), true); } - return i; + + return players.size(); } private static int isGlowing(CommandContext source, Collection players, boolean flag) { - int i = 0; - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.isGlowing() != flag) { - serverPlayerEntity.setGlowing(flag); - ++i; - } - } + players.forEach(serverPlayerEntity -> serverPlayerEntity.setGlowing(flag)); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setglowing." + flag + ".single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setglowing." + flag + ".multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setglowing." + flag + ".multiple", players.size()), true); } - return i; + + return players.size(); } private static int isInvulnerable(CommandContext source, Collection players, boolean flag) { - int i = 0; - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.isInvulnerable() != flag) { - serverPlayerEntity.setInvulnerable(flag); - ++i; - } - } + players.forEach(serverPlayerEntity -> serverPlayerEntity.setInvulnerable(flag)); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setinvulnerable." + flag + ".single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setinvulnerable." + flag + ".multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.setinvulnerable." + flag + ".multiple", players.size()), true); } - return i; + + return players.size(); } private static int isInvisible(CommandContext source, Collection players, boolean flag) { - int i = 0; - for (ServerPlayerEntity serverPlayerEntity : players) { - if (serverPlayerEntity.isInvisible() != flag) { - serverPlayerEntity.setInvisible(flag); - ++i; - } - } + players.forEach(serverPlayerEntity -> serverPlayerEntity.setInvisible(flag)); - if (i == 1) { + if (players.size() == 1) { source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.invisible." + flag + ".single", players.iterator().next().getDisplayName()), true); - } else if (i > 1) { - source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.invisible." + flag + ".multiple", i), true); + } else { + source.getSource().sendFeedback(new TranslatableText("hamusuke.command.fly.success.invisible." + flag + ".multiple", players.size()), true); } - return i; + + return players.size(); } } diff --git a/src/main/java/com/hamusuke/flycommod/invoker/PlayerAbilitiesInvoker.java b/src/main/java/com/hamusuke/flycommod/invoker/PlayerAbilitiesInvoker.java new file mode 100644 index 0000000..33aed50 --- /dev/null +++ b/src/main/java/com/hamusuke/flycommod/invoker/PlayerAbilitiesInvoker.java @@ -0,0 +1,7 @@ +package com.hamusuke.flycommod.invoker; + +public interface PlayerAbilitiesInvoker { + void setFlySpeed(float flySpeed); + + void setWalkSpeed(float walkSpeed); +} diff --git a/src/main/java/com/hamusuke/flycommod/mixin/PlayerAbilitiesMixin.java b/src/main/java/com/hamusuke/flycommod/mixin/PlayerAbilitiesMixin.java new file mode 100644 index 0000000..ec4f702 --- /dev/null +++ b/src/main/java/com/hamusuke/flycommod/mixin/PlayerAbilitiesMixin.java @@ -0,0 +1,23 @@ +package com.hamusuke.flycommod.mixin; + +import com.hamusuke.flycommod.invoker.PlayerAbilitiesInvoker; +import net.minecraft.entity.player.PlayerAbilities; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(PlayerAbilities.class) +public class PlayerAbilitiesMixin implements PlayerAbilitiesInvoker { + @Shadow + private float flySpeed; + + @Shadow + private float walkSpeed; + + public void setFlySpeed(float flySpeed) { + this.flySpeed = flySpeed; + } + + public void setWalkSpeed(float walkSpeed) { + this.walkSpeed = walkSpeed; + } +} diff --git a/src/main/resources/assets/flycommand/lang/en_us.json b/src/main/resources/assets/flycommand/lang/en_us.json index d2aab4b..5f252bd 100644 --- a/src/main/resources/assets/flycommand/lang/en_us.json +++ b/src/main/resources/assets/flycommand/lang/en_us.json @@ -1,15 +1,14 @@ { "item.flycommand.flying_stick": "AllowFlyingStick", "item.flycommand.flying_stick.desc": "Right click to toggle allow and disallow flying", - "hamusuke.command.fly.error": "This command can not use in server", - "hamusuke.command.fly.success.getflyspeed": "%s's flight speed is '%s'", - "hamusuke.command.fly.success.getwalkspeed": "%s's walk speed is '%s'", + "hamusuke.command.fly.success.getflyspeed": "%s's flight speed is %s", + "hamusuke.command.fly.success.getwalkspeed": "%s's walk speed is %s", "hamusuke.command.fly.success.allow.single": "%s can now fly", "hamusuke.command.fly.success.noallow.single": "%s can not now fly", "hamusuke.command.fly.success.nogravity.single": "%s is now weightless", "hamusuke.command.fly.success.gravity.single": "%s is not now weightless", - "hamusuke.command.fly.success.setflyspeed.single": "Set %s's flight speed to '%s'", - "hamusuke.command.fly.success.setwalkspeed.single": "Set %s's walk speed to '%s'", + "hamusuke.command.fly.success.setflyspeed.single": "Set %s's flight speed to %s", + "hamusuke.command.fly.success.setwalkspeed.single": "Set %s's walk speed to %s", "hamusuke.command.fly.success.allowedit.true.single": "%s is allowed to modify the surroundings", "hamusuke.command.fly.success.allowedit.false.single": "%s is not allowed to modify the surroundings", "hamusuke.command.fly.success.disabledamage.true.single": "Disabled %s damage", @@ -26,8 +25,8 @@ "hamusuke.command.fly.success.noallow.multiple": "%s players can not now fly", "hamusuke.command.fly.success.nogravity.multiple": "%s players are now weightless", "hamusuke.command.fly.success.gravity.multiple": "%s players are not now weightless", - "hamusuke.command.fly.success.setflyspeed.multiple": "Set %s players' flight speed to '%s'", - "hamusuke.command.fly.success.setwalkspeed.multiple": "Set %s players' walk speed to '%s'", + "hamusuke.command.fly.success.setflyspeed.multiple": "Set %s players' flight speed to %s", + "hamusuke.command.fly.success.setwalkspeed.multiple": "Set %s players' walk speed to %s", "hamusuke.command.fly.success.allowedit.true.multiple": "%s players are allowed to modify the surroundings", "hamusuke.command.fly.success.allowedit.false.multiple": "%s players are not allowed to modify the surroundings", "hamusuke.command.fly.success.disabledamage.true.multiple": "Disabled %s players damage", diff --git a/src/main/resources/assets/flycommand/lang/ja_jp.json b/src/main/resources/assets/flycommand/lang/ja_jp.json index 583a0d9..6a24f60 100644 --- a/src/main/resources/assets/flycommand/lang/ja_jp.json +++ b/src/main/resources/assets/flycommand/lang/ja_jp.json @@ -1,15 +1,14 @@ { "item.flycommand.flying_stick": "飛行許可棒", "item.flycommand.flying_stick.desc": "右クリックで飛行の許可と禁止を切り替えます", - "hamusuke.command.fly.error": "このコマンドはサーバーでは使用できません", - "hamusuke.command.fly.success.getflyspeed": "%s の飛行速度は '%s' です", - "hamusuke.command.fly.success.getwalkspeed": "%s の歩行速度は '%s' です", + "hamusuke.command.fly.success.getflyspeed": "%s の飛行速度は %s です", + "hamusuke.command.fly.success.getwalkspeed": "%s の歩行速度は %s です", "hamusuke.command.fly.success.allow.single": "%s を飛行可能にしました", "hamusuke.command.fly.success.noallow.single": "%s を飛行不可能にしました", "hamusuke.command.fly.success.nogravity.single": "%s を無重力状態にしました", "hamusuke.command.fly.success.gravity.single": "%s の無重力状態を解除しました", - "hamusuke.command.fly.success.setflyspeed.single": "%s の飛行速度を '%s' にしました", - "hamusuke.command.fly.success.setwalkspeed.single": "%s の歩行速度を '%s' にしました", + "hamusuke.command.fly.success.setflyspeed.single": "%s の飛行速度を %s にしました", + "hamusuke.command.fly.success.setwalkspeed.single": "%s の歩行速度を %s にしました", "hamusuke.command.fly.success.allowedit.true.single": "%s は周囲を変更することができるようになりました", "hamusuke.command.fly.success.allowedit.false.single": "%s は周囲を変更することができないようになりました", "hamusuke.command.fly.success.disabledamage.true.single": "%s のダメージを無効にしました", @@ -26,8 +25,8 @@ "hamusuke.command.fly.success.noallow.multiple": "%s 体のプレイヤーを飛行不可能にしました", "hamusuke.command.fly.success.nogravity.multiple": "%s 体のプレイヤーを無重力状態にしました", "hamusuke.command.fly.success.gravity.multiple": "%s 体のプレイヤーの無重力状態を解除しました", - "hamusuke.command.fly.success.setflyspeed.multiple": "%s 体のプレイヤーの飛行速度を '%s' にしました", - "hamusuke.command.fly.success.setwalkspeed.multiple": "%s 体のプレイヤーの歩行速度を '%s' にしました", + "hamusuke.command.fly.success.setflyspeed.multiple": "%s 体のプレイヤーの飛行速度を %s にしました", + "hamusuke.command.fly.success.setwalkspeed.multiple": "%s 体のプレイヤーの歩行速度を %s にしました", "hamusuke.command.fly.success.allowedit.true.multiple": "%s 体のプレイヤーは周囲を変更することができるようになりました", "hamusuke.command.fly.success.allowedit.false.multiple": "%s 体のプレイヤーは周囲を変更することができないようになりました", "hamusuke.command.fly.success.disabledamage.true.multiple": "%s 体のプレイヤーのダメージを無効にしました", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 806fbc3..2e51e77 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -11,6 +11,9 @@ "homepage": "https://www.curseforge.com/minecraft/mc-mods/flycommandmod-fabric", "sources": "https://github.com/hamusuke0323/FlyCommandMod-Fabric" }, + "mixins": [ + "flycommand.mixins.json" + ], "license": "CC0-1.0", "environment": "*", "entrypoints": { diff --git a/src/main/resources/flycommand.mixins.json b/src/main/resources/flycommand.mixins.json new file mode 100644 index 0000000..df205df --- /dev/null +++ b/src/main/resources/flycommand.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.hamusuke.flycommod.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "PlayerAbilitiesMixin" + ], + "injectors": { + "defaultRequire": 1 + } +}