From 511450c67d3c3dfc9f07f668f412fef4ee3825ee Mon Sep 17 00:00:00 2001 From: MadHau5 <35187665+MadHau5@users.noreply.github.com> Date: Sat, 25 Apr 2020 00:57:03 +0530 Subject: [PATCH 1/4] Add /effect --- .../server/command/commands/EffectCommand | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/main/java/kroppeb/server/command/commands/EffectCommand diff --git a/src/main/java/kroppeb/server/command/commands/EffectCommand b/src/main/java/kroppeb/server/command/commands/EffectCommand new file mode 100644 index 0000000..a9c4425 --- /dev/null +++ b/src/main/java/kroppeb/server/command/commands/EffectCommand @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2020 MadHau5 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package kroppeb.server.command.commands; + +import kroppeb.server.command.Command; +import kroppeb.server.command.arguments.Selector; +import kroppeb.server.command.reader.Reader; +import kroppeb.server.command.reader.ReaderException; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +import java.util.Collection; + +abstract public class EffectCommand implements Command { // TODO: Restrict input + final Selector targets; + final Identifier effect; + + public static EffectCommand read(Reader reader) throws ReaderException { + String sub = reader.readLiteral(); + switch (sub) { + case "give": + return GiveCommand.read(reader); + case "clear": + return ClearCommand.read(reader); + default: + throw new ReaderException("Unexpected effect literal: " + sub); + } + + } + + public static class GiveCommand extends EffectCommand { + final int duration; + final int amplifier; + final boolean hideParticles; + + public GiveCommand(Selector targets, Identifier effect, int duration, int amplifier, boolean hideParticles) { + this.targets = targets; + this.effect = effect; + this.duration = duration; + this.amplifier = amplifier; + this.hideParticles = hideParticles; + } + + public static GiveCommand read(Reader reader) throws ReaderException { + Selector targets = Selector.read(reader); + Identifier effect = reader.readIdentifier(); + int duration; + int amplifier = 0; + boolean hideParticles = false; + if (reader.hasNext()) { + reader.moveNext(); + duration = reader.readInt(); + } else { + duration = -1; + } + if (reader.hasNext()) { + reader.moveNext(); + amplifier = reader.readInt(); + } + if (reader.hasNext()) { + String bool = reader.readLiteral(); + switch (bool) { + case "true": + hideParticles = true; + break; + case "false": + hideParticles = false; + break; + default: + throw new ReaderException("Unexpected boolean literal: " + bool); + } + } + return new GiveCommand(targets, effect, duration, amplifier, hideParticles); + } + + @Override + public int execute(ServerCommandSource source) { + Collection entities = targets.getEntities(source); + for (Entity entity : entities) { + if (entity instanceof LivingEntity) { + LivingEntity livingEntity = (LivingEntity) entity; + StatusEffect statusEffect = Registry.STATUS_EFFECT.get(effect); + if (statusEffect.isInstant()) { + if (duration == -1) { + duration = 1; + } + } else { + if (duration == -1) { + duration = 30; + } + duration *= 20; + } + livingEntity.addStatusEffect(new StatusEffectInstance(statusEffect, + duration, amplifier, false, hideParticles)); + } + } + return entities.size(); + } + } + + public static class ClearCommand extends EffectCommand { + + public ClearCommand(Selector targets, Identifier effect) { + this.targets = targets; + this.effect = effect; + } + + public static ClearCommand read(Reader reader) throws ReaderException { + Selector targets = Selector.read(reader); + Identifier effect; + if (reader.hasNext()) { + effect = reader.readIdentifier(); + } else { + effect = null; + } + return new ClearCommand(targets, effect); + } + + @Override + public int execute(ServerCommandSource source) { + Collection entities = targets.getEntities(source); + for (Entity entity : entities) { + if (entity instanceof LivingEntity) { + LivingEntity livingEntity = (LivingEntity) entity; + if (effect == null) { + livingEntity.clearStatusEffects(); + } else { + StatusEffect statusEffect = Registry.STATUS_EFFECT.get(effect); + livingEntity.removeStatusEffect(statusEffect); + } + } + } + return entities.size(); + } + } +} From fd851363b1ea166789d504a3efbc3dea59325ff2 Mon Sep 17 00:00:00 2001 From: MadHau5 Date: Sat, 25 Apr 2020 14:11:14 +0530 Subject: [PATCH 2/4] Add /give and slightly optimize /effect --- .../command/commands/EffectCommand.java | 153 ++++++++++++++++++ .../server/command/commands/GiveCommand.java | 74 +++++++++ 2 files changed, 227 insertions(+) create mode 100644 src/main/java/kroppeb/server/command/commands/EffectCommand.java create mode 100644 src/main/java/kroppeb/server/command/commands/GiveCommand.java diff --git a/src/main/java/kroppeb/server/command/commands/EffectCommand.java b/src/main/java/kroppeb/server/command/commands/EffectCommand.java new file mode 100644 index 0000000..b0b68cd --- /dev/null +++ b/src/main/java/kroppeb/server/command/commands/EffectCommand.java @@ -0,0 +1,153 @@ +/* +* Copyright (c) 2020 MadHau5 +* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +package kroppeb.server.command.commands; + +import kroppeb.server.command.Command; +import kroppeb.server.command.arguments.Selector; +import kroppeb.server.command.reader.Reader; +import kroppeb.server.command.reader.ReaderException; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.registry.Registry; + +import java.util.Collection; + +abstract public class EffectCommand implements Command { + final Selector targets; + final StatusEffect effect; + + public static EffectCommand read(Reader reader) throws ReaderException { + String sub = reader.readLiteral(); + switch (sub) { + case "give": + return GiveCommand.read(reader); + case "clear": + return ClearCommand.read(reader); + default: + throw new ReaderException("Unexpected effect literal: " + sub); + } + + } + + public static class GiveCommand extends EffectCommand { + final int duration; + final int amplifier; + final boolean hideParticles; + + public GiveCommand(Selector targets, StatusEffect effect, int duration, int amplifier, boolean hideParticles) { + this.targets = targets; + this.effect = effect; + this.duration = duration; + this.amplifier = amplifier; + this.hideParticles = hideParticles; + } + + public static GiveCommand read(Reader reader) throws ReaderException { + Selector targets = Selector.read(reader); + StatusEffect effect = Registry.STATUS_EFFECT.get(reader.readIdentifier()); + int duration; + int amplifier = 0; + boolean hideParticles = false; + if (reader.hasNext()) { + reader.moveNext(); + duration = reader.readInt(); + } else { + duration = -1; + } + if (reader.hasNext()) { + reader.moveNext(); + amplifier = reader.readInt(); + } + if (reader.hasNext()) { + String bool = reader.readLiteral(); + switch (bool) { + case "true": + hideParticles = true; + break; + case "false": + hideParticles = false; + break; + default: + throw new ReaderException("Unexpected boolean literal: " + bool); + } + } + return new GiveCommand(targets, effect, duration, amplifier, hideParticles); + } + + public int execute(ServerCommandSource source) { + int e = 0; + Collection entities = targets.getEntities(source); + for (Entity entity : entities) { + if (entity instanceof LivingEntity) { + LivingEntity livingEntity = (LivingEntity) entity; + if (effect.isInstant()) { + if (duration == -1) { + duration = 1; + } + } else { + if (duration == -1) { + duration = 30; + } + duration *= 20; + } + livingEntity.addStatusEffect(new StatusEffectInstance(effect, + duration, amplifier, false, hideParticles)); + e++; + } + } + if (e == 0) { + // TODO: throw error on failed command + } + return e; + } + } + + public static class ClearCommand extends EffectCommand { + + public ClearCommand(Selector targets, StatusEffect effect) { + this.targets = targets; + this.effect = null; + } + + public static ClearCommand read(Reader reader) throws ReaderException { + Selector targets = Selector.read(reader); + StatusEffect effect; + if (reader.hasNext()) { + effect = Registry.STATUS_EFFECT.get(reader.readIdentifier()); + } + return new ClearCommand(targets, effect); + } + + public int execute(ServerCommandSource source) { + int e = 0; + Collection entities = targets.getEntities(source); + if (effect == null) { + for (Entity entity : entities) { + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).clearStatusEffects(); + e++; + } + } + } else { + for (Entity entity : entities) { + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).removeStatusEffect(effect); + e++; + } + } + } + if (e == 0) { + // TODO: throw error on failed command + } + return e; + } + } +} diff --git a/src/main/java/kroppeb/server/command/commands/GiveCommand.java b/src/main/java/kroppeb/server/command/commands/GiveCommand.java new file mode 100644 index 0000000..4872b3e --- /dev/null +++ b/src/main/java/kroppeb/server/command/commands/GiveCommand.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 MadHau5 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package kroppeb.server.command.commands; + +import kroppeb.server.command.Command; +import kroppeb.server.command.arguments.Selector; +import kroppeb.server.command.reader.Reader; +import kroppeb.server.command.reader.ReaderException; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +import java.util.Collection; + +abstract public class GiveCommand implements Command { + final Selector targets; + final Identifier item; + final CompoundTag nbt; + final int count; + + public GiveCommand(Selector targets, Identifier item, CompoundTag nbt, int count) { + this.targets = targets; + this.item = item; + this.nbt = nbt; + this.count = count; + } + + public static GiveCommand read(Reader reader) throws ReaderException { + Selector targets = Selector.read(reader); + Identifier item = Registry.ITEM.get(reader.readIdentifier()); + CompoundTag nbt; + int count = 1; + boolean hideParticles = false; + if (reader.hasNext()) { + // nbt = ???; + // TODO: Process NBT tags + } + if (reader.hasNext()) { + reader.moveNext(); + count = reader.readInt(); + } + return new GiveCommand(targets, item, nbt, count); + } + + public int execute(ServerCommandSource source) { + int e = 0; + + ItemStack stack = ItemStack(item, stackSize); + // TODO: throw error for 'illegal' item (not found / more than max count) + + Collection entities = targets.getEntities(source); + for (Entity entity : entities) { + if (entity instanceof PlayerEntity) { + player = (PlayerEntity) entity; + player.inventory.insertStack(stack); + // TODO: drop item on full player inventory + e++; + } + } + if (e == 0) { + // TODO: throw error on failed command + } + return e; + } +} From ceb4d4e2a2e413b69e2b44095e427e294614bd80 Mon Sep 17 00:00:00 2001 From: MadHau5 <35187665+MadHau5@users.noreply.github.com> Date: Sat, 25 Apr 2020 14:14:49 +0530 Subject: [PATCH 3/4] Fix accidental rename --- .../server/command/commands/EffectCommand | 146 ------------------ 1 file changed, 146 deletions(-) delete mode 100644 src/main/java/kroppeb/server/command/commands/EffectCommand diff --git a/src/main/java/kroppeb/server/command/commands/EffectCommand b/src/main/java/kroppeb/server/command/commands/EffectCommand deleted file mode 100644 index a9c4425..0000000 --- a/src/main/java/kroppeb/server/command/commands/EffectCommand +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2020 MadHau5 - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -package kroppeb.server.command.commands; - -import kroppeb.server.command.Command; -import kroppeb.server.command.arguments.Selector; -import kroppeb.server.command.reader.Reader; -import kroppeb.server.command.reader.ReaderException; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; - -import java.util.Collection; - -abstract public class EffectCommand implements Command { // TODO: Restrict input - final Selector targets; - final Identifier effect; - - public static EffectCommand read(Reader reader) throws ReaderException { - String sub = reader.readLiteral(); - switch (sub) { - case "give": - return GiveCommand.read(reader); - case "clear": - return ClearCommand.read(reader); - default: - throw new ReaderException("Unexpected effect literal: " + sub); - } - - } - - public static class GiveCommand extends EffectCommand { - final int duration; - final int amplifier; - final boolean hideParticles; - - public GiveCommand(Selector targets, Identifier effect, int duration, int amplifier, boolean hideParticles) { - this.targets = targets; - this.effect = effect; - this.duration = duration; - this.amplifier = amplifier; - this.hideParticles = hideParticles; - } - - public static GiveCommand read(Reader reader) throws ReaderException { - Selector targets = Selector.read(reader); - Identifier effect = reader.readIdentifier(); - int duration; - int amplifier = 0; - boolean hideParticles = false; - if (reader.hasNext()) { - reader.moveNext(); - duration = reader.readInt(); - } else { - duration = -1; - } - if (reader.hasNext()) { - reader.moveNext(); - amplifier = reader.readInt(); - } - if (reader.hasNext()) { - String bool = reader.readLiteral(); - switch (bool) { - case "true": - hideParticles = true; - break; - case "false": - hideParticles = false; - break; - default: - throw new ReaderException("Unexpected boolean literal: " + bool); - } - } - return new GiveCommand(targets, effect, duration, amplifier, hideParticles); - } - - @Override - public int execute(ServerCommandSource source) { - Collection entities = targets.getEntities(source); - for (Entity entity : entities) { - if (entity instanceof LivingEntity) { - LivingEntity livingEntity = (LivingEntity) entity; - StatusEffect statusEffect = Registry.STATUS_EFFECT.get(effect); - if (statusEffect.isInstant()) { - if (duration == -1) { - duration = 1; - } - } else { - if (duration == -1) { - duration = 30; - } - duration *= 20; - } - livingEntity.addStatusEffect(new StatusEffectInstance(statusEffect, - duration, amplifier, false, hideParticles)); - } - } - return entities.size(); - } - } - - public static class ClearCommand extends EffectCommand { - - public ClearCommand(Selector targets, Identifier effect) { - this.targets = targets; - this.effect = effect; - } - - public static ClearCommand read(Reader reader) throws ReaderException { - Selector targets = Selector.read(reader); - Identifier effect; - if (reader.hasNext()) { - effect = reader.readIdentifier(); - } else { - effect = null; - } - return new ClearCommand(targets, effect); - } - - @Override - public int execute(ServerCommandSource source) { - Collection entities = targets.getEntities(source); - for (Entity entity : entities) { - if (entity instanceof LivingEntity) { - LivingEntity livingEntity = (LivingEntity) entity; - if (effect == null) { - livingEntity.clearStatusEffects(); - } else { - StatusEffect statusEffect = Registry.STATUS_EFFECT.get(effect); - livingEntity.removeStatusEffect(statusEffect); - } - } - } - return entities.size(); - } - } -} From b7701e0e53f28bb33c5d063c28301ddaa1c007a1 Mon Sep 17 00:00:00 2001 From: MadHau5 Date: Sat, 25 Apr 2020 16:01:20 +0530 Subject: [PATCH 4/4] Add /gamemode, make /give drop items --- .../command/commands/GameModeCommand.java | 60 +++++++++++++++++++ .../server/command/commands/GiveCommand.java | 21 +++++-- 2 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/main/java/kroppeb/server/command/commands/GameModeCommand.java diff --git a/src/main/java/kroppeb/server/command/commands/GameModeCommand.java b/src/main/java/kroppeb/server/command/commands/GameModeCommand.java new file mode 100644 index 0000000..d3e7e42 --- /dev/null +++ b/src/main/java/kroppeb/server/command/commands/GameModeCommand.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 MadHau5 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package kroppeb.server.command.commands; + +import kroppeb.server.command.Command; +import kroppeb.server.command.arguments.Selector; +import kroppeb.server.command.reader.Reader; +import kroppeb.server.command.reader.ReaderException; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.GameMode; + +import java.util.Collection; + +abstract public class GameModeCommand implements Command { + final Selector targets; + final GameMode gm; + + public GameModeCommand(Selector targets, GameMode gm) { + this.targets = targets; + this.gm = gm; + } + + public static GameModeCommand read(Reader reader) throws ReaderException { + Selector targets = null; + GameMode gm = GameMode.byName(reader.readLiteral()); // TODO: handle custom gamemodes + if (reader.hasNext()) { + targets = Selector.read(reader); + } + return new GameModeCommand(targets, gm); + } + + public int execute(ServerCommandSource source) { + int e = 0; + Collection entities; + if (targets == null) { + entities = Collections.singleton(source.getPlayer()); + } else { + entities = targets.getEntities(source); + } + for (Entity entity : entities) { + if (entity instanceof PlayerEntity) { + ((PlayerEntity) entity).setGameMode(gm); + e++; + } + } + if (e == 0) { + // TODO: throw error on failed command + } + return e; + } +} diff --git a/src/main/java/kroppeb/server/command/commands/GiveCommand.java b/src/main/java/kroppeb/server/command/commands/GiveCommand.java index 4872b3e..86e9ac0 100644 --- a/src/main/java/kroppeb/server/command/commands/GiveCommand.java +++ b/src/main/java/kroppeb/server/command/commands/GiveCommand.java @@ -39,7 +39,6 @@ public static GiveCommand read(Reader reader) throws ReaderException { Identifier item = Registry.ITEM.get(reader.readIdentifier()); CompoundTag nbt; int count = 1; - boolean hideParticles = false; if (reader.hasNext()) { // nbt = ???; // TODO: Process NBT tags @@ -54,15 +53,27 @@ public static GiveCommand read(Reader reader) throws ReaderException { public int execute(ServerCommandSource source) { int e = 0; - ItemStack stack = ItemStack(item, stackSize); - // TODO: throw error for 'illegal' item (not found / more than max count) + int stackMax = item.getMaxCount(); + int stackCount = count / stackMax; + ItemStack stack = ItemStack(item, stackMax); + // TODO: throw error for 'illegal' item (not found) Collection entities = targets.getEntities(source); for (Entity entity : entities) { if (entity instanceof PlayerEntity) { player = (PlayerEntity) entity; - player.inventory.insertStack(stack); - // TODO: drop item on full player inventory + for (int i = 0; i < stackCount + 1; i++) { + if (i == stackCount) { + stack.setCount(count % stackMax); + } + ItemEntity itemEntity = player.dropItem(stack, false); + if (itemEntity != null) { + itemEntity.setOwner(player); + itemEntity.resetPickupDelay(); + } else { + i--; + } + } e++; } }