From e1abd870804719a387e227d6f0eab02270f7a65a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 12 Oct 2025 17:45:23 +0200 Subject: feat(command): /withdraw --- .../java/world/anhgelus/lifesteal/Commands.java | 36 ++++++++++++++++++++++ .../java/world/anhgelus/lifesteal/LifeSteal.java | 9 ++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/world/anhgelus/lifesteal/Commands.java (limited to 'src') diff --git a/src/main/java/world/anhgelus/lifesteal/Commands.java b/src/main/java/world/anhgelus/lifesteal/Commands.java new file mode 100644 index 0000000..86aa901 --- /dev/null +++ b/src/main/java/world/anhgelus/lifesteal/Commands.java @@ -0,0 +1,36 @@ +package world.anhgelus.lifesteal; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.Text; + +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.literal; + +public class Commands { + public static void registerWithdraw(CommandDispatcher dispatcher) { + final var cmd = literal("withdraw").then(argument("hearts", IntegerArgumentType.integer(1)) + .executes(context -> { + final var source = context.getSource(); + final var hearts = IntegerArgumentType.getInteger(context, "hearts"); + final var p = source.getPlayerOrThrow(); + final var lifeStealer = LifeStealer.Manager.getLifeStealer(p); + // if the amount will ban the LifeStealer, returns + if (lifeStealer.getHealthModifier() - hearts * 2 <= LifeSteal.MIN_HEALTH - 20) { + source.sendError(Text.of("You cannot give that amount.")); + return Command.SINGLE_SUCCESS; + } + for (int i = 0; i < hearts; i++) { + lifeStealer.death(); + p.giveOrDropStack(lifeStealer.getHeart()); + } + source.sendFeedback(() -> Text.of("Hearts given."), false); + return Command.SINGLE_SUCCESS; + }) + ); + + dispatcher.register(cmd); + } +} diff --git a/src/main/java/world/anhgelus/lifesteal/LifeSteal.java b/src/main/java/world/anhgelus/lifesteal/LifeSteal.java index 83d442f..419480c 100644 --- a/src/main/java/world/anhgelus/lifesteal/LifeSteal.java +++ b/src/main/java/world/anhgelus/lifesteal/LifeSteal.java @@ -1,6 +1,8 @@ package world.anhgelus.lifesteal; +import com.mojang.brigadier.CommandDispatcher; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; @@ -8,9 +10,12 @@ import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory; import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.minecraft.command.CommandRegistryAccess; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.GameRules; @@ -36,6 +41,10 @@ public class LifeSteal implements ModInitializer { public void onInitialize() { LOGGER.info("Initializing LifeSteal"); + CommandRegistrationCallback.EVENT.register((CommandDispatcher dispatcher, CommandRegistryAccess registryAccess, CommandManager.RegistrationEnvironment environment) -> { + Commands.registerWithdraw(dispatcher); + }); + ServerLifecycleEvents.SERVER_STARTED.register(server -> { final var state = StateSaver.getServerState(server); LifeStealer.Manager.loadPlayers(state); -- cgit v1.2.3