From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 9 Nov 2077 00:00:00 +0800 Subject: [PATCH] Skip inactive entity for execute diff --git a/net/minecraft/commands/arguments/EntityArgument.java b/net/minecraft/commands/arguments/EntityArgument.java index 4acf68e42a9644612608c8521020a989cbdea4a9..76487244de9caad06696f2f4910c52c09547f775 100644 --- a/net/minecraft/commands/arguments/EntityArgument.java +++ b/net/minecraft/commands/arguments/EntityArgument.java @@ -76,7 +76,7 @@ public class EntityArgument implements ArgumentType { String selectorString = context.getInput().substring(idxStart, idxEnd); Collection entities = TICK_ENTITY_CACHE.get(selectorString); if (entities == null) { - entities = selector.findEntities(context.getSource()); + entities = org.dreeam.leaf.config.modules.opt.SkipInactiveEntityForExecute.skipInactiveEntityForExecute ? selector.findEntitiesSkipInactive(context.getSource()) : selector.findEntities(context.getSource()); TICK_ENTITY_CACHE.put(selectorString, entities); } return entities; @@ -90,14 +90,17 @@ public class EntityArgument implements ArgumentType { String selectorString = context.getInput().substring(idxStart, idxEnd); Collection entities = TICK_ENTITY_CACHE.get(selectorString); if (entities == null) { - entities = selector.findEntities(context.getSource()); + entities = org.dreeam.leaf.config.modules.opt.SkipInactiveEntityForExecute.skipInactiveEntityForExecute ? selector.findEntitiesSkipInactive(context.getSource()) : selector.findEntities(context.getSource()); // Leaf - Skip inactive entity for execute TICK_ENTITY_CACHE.put(selectorString, entities); } return entities; } // Leaf end - Cache function getEntity calls public static Collection getOptionalEntities(CommandContext context, String name) throws CommandSyntaxException { - return context.getArgument(name, EntitySelector.class).findEntities(context.getSource()); + // Leaf start - Skip inactive entity for execute + EntitySelector entitySelector = context.getArgument(name, EntitySelector.class); + return org.dreeam.leaf.config.modules.opt.SkipInactiveEntityForExecute.skipInactiveEntityForExecute && context.getSource().source instanceof net.minecraft.server.MinecraftServer ? entitySelector.findEntitiesSkipInactive(context.getSource()) : entitySelector.findEntities(context.getSource()); + // Leaf end - Skip inactive entity for execute } public static Collection getOptionalPlayers(CommandContext context, String name) throws CommandSyntaxException { diff --git a/net/minecraft/commands/arguments/selector/EntitySelector.java b/net/minecraft/commands/arguments/selector/EntitySelector.java index bbaf1a29f86a9bfc13795249d545b6f7f1bb53eb..60904d6b3046d28b8bba5c050225bf476f2f601a 100644 --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java @@ -165,6 +165,51 @@ public class EntitySelector { } } + // Leaf start - Skip inactive entity for execute + public java.util.Collection findEntitiesSkipInactive(CommandSourceStack source) throws CommandSyntaxException { + this.checkPermissions(source); + if (!this.includesEntities) { + return this.findPlayers(source); + } else if (this.playerName != null) { + ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); + playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer + return playerByName == null ? List.of() : List.of(playerByName); + } else if (this.entityUUID != null) { + for (ServerLevel serverLevel : source.getServer().getAllLevels()) { + Entity entity = serverLevel.getEntity(this.entityUUID); + if (entity != null && !(entity instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // Leaves - skip photographer + if (entity.getType().isEnabled(source.enabledFeatures())) { + return List.of(entity); + } + break; + } + } + + return List.of(); + } else { + Vec3 vec3 = this.position.apply(source.getPosition()); + AABB absoluteAabb = this.getAbsoluteAabb(vec3); + if (this.currentEntity) { + Predicate predicate = this.getPredicateSkipInactive(vec3, absoluteAabb, null); + return source.getEntity() != null && !(source.getEntity() instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(source.getEntity()) ? List.of(source.getEntity()) : List.of(); // Leaves - skip photographer + } else { + Predicate predicate = this.getPredicateSkipInactive(vec3, absoluteAabb, source.enabledFeatures()); + List list = new ObjectArrayList<>(); + if (this.isWorldLimited()) { + this.addEntities(list, source.getLevel(), absoluteAabb, predicate); + } else { + for (ServerLevel serverLevel1 : source.getServer().getAllLevels()) { + this.addEntities(list, serverLevel1, absoluteAabb, predicate); + } + } + list.removeIf(entity -> entity instanceof org.leavesmc.leaves.replay.ServerPhotographer); // Leaves - skip photographer + + return this.sortAndLimit(vec3, list); + } + } + } + // Leaf end - Skip inactive entity for execute + private void addEntities(List entities, ServerLevel level, @Nullable AABB box, Predicate predicate) { int resultLimit = this.getResultLimit(); if (entities.size() < resultLimit) { @@ -264,6 +309,38 @@ public class EntitySelector { return Util.allOf(list); } + // Leaf start - Skip inactive entity for execute + private Predicate getPredicateSkipInactive(Vec3 pos, @Nullable AABB box, @Nullable FeatureFlagSet enabledFeatures) { + boolean flag = enabledFeatures != null; + boolean flag1 = box != null; + boolean flag2 = !this.range.isAny(); + int i = (flag ? 1 : 0) + (flag1 ? 1 : 0) + (flag2 ? 1 : 0); + List> list; + if (i == 0) { + list = this.contextFreePredicates; + } else { + List> list1 = new ObjectArrayList<>(this.contextFreePredicates.size() + i); + list1.addAll(this.contextFreePredicates); + if (flag) { + list1.add(entity -> entity.getType().isEnabled(enabledFeatures)); + } + + if (flag1) { + list1.add(entity -> box.intersects(entity.getBoundingBox())); + } + + if (flag2) { + list1.add(entity -> this.range.matchesSqr(entity.distanceToSqr(pos))); + } + + list1.add(io.papermc.paper.entity.activation.ActivationRange::checkIfActive); + list = list1; + } + + return Util.allOf(list); + } + // Leaf end - Skip inactive entity for execute + private List sortAndLimit(Vec3 pos, List entities) { if (entities.size() > 1) { this.order.accept(pos, entities);