diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java index a29815f..97fa704 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; +import com.sunekaer.toolkit.Toolkit; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -13,6 +14,8 @@ import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.Entity; @@ -30,6 +33,10 @@ import java.util.function.BiPredicate; public class KillEntitiesCommand { + public static final TagKey> KILL_PROTECTED = TagKey.create( + Registries.ENTITY_TYPE, + ResourceLocation.fromNamespaceAndPath(Toolkit.MOD_ID, "kill_protected")); + enum KillType implements StringRepresentable { all((p, entity) -> !(entity instanceof AbstractMinecart) && !entity.getUUID().equals(p.getUUID())), animals((p, entity) -> entity instanceof Animal), @@ -83,7 +90,7 @@ private static int killByEntity(CommandContext context, Hold EntityType entityType = reference.value(); source.sendSuccess(() -> Component.translatable("commands.toolkit.kill.start", entityType), true); - var entitiesKilled = yeetEntities((player, entity) -> entity.getType().equals(entityType), level, source.getPlayerOrException()); + var entitiesKilled = yeetEntities((player, entity) -> entity.getType().equals(entityType), level, source.getPlayerOrException(), false); yeetedEntitiesMessage(source, entitiesKilled, entityType.toShortString()); return 0; @@ -102,7 +109,7 @@ private static int kill(KillType type, CommandSourceStack source) throws Command entitiesKilled++; } } else { - entitiesKilled += yeetEntities(type.checker, level, source.getPlayerOrException()); + entitiesKilled += yeetEntities(type.checker, level, source.getPlayerOrException(), true); } yeetedEntitiesMessage(source, entitiesKilled, typeName); @@ -118,7 +125,7 @@ private static void yeetedEntitiesMessage(CommandSourceStack source, int yeetedA } } - private static int yeetEntities(BiPredicate tester, ServerLevel level, Player player) { + private static int yeetEntities(BiPredicate tester, ServerLevel level, Player player, boolean respectProtection) { int entitiesKilled = 0; Iterable entities = level.getAllEntities(); @@ -131,6 +138,10 @@ private static int yeetEntities(BiPredicate tester, ServerLevel continue; } + if (respectProtection && entity.getType().is(KILL_PROTECTED)) { + continue; + } + if (tester.test(player, entity)) { entity.remove(Entity.RemovalReason.KILLED); entitiesKilled ++; diff --git a/common/src/main/resources/data/toolkit/tags/entity_type/kill_protected.json b/common/src/main/resources/data/toolkit/tags/entity_type/kill_protected.json new file mode 100644 index 0000000..76187ef --- /dev/null +++ b/common/src/main/resources/data/toolkit/tags/entity_type/kill_protected.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + { "id": "aeronautics:propeller_bearing_contraption", "required": false } + ] +} diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 4eee266..4ce771d 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -8,6 +8,9 @@ architectury { } repositories { + maven { + url "https://maven.neoforged.net/releases" + } maven { url "https://maven.saps.dev/mirror" }