diff --git a/src/main/java/net/gensokyoreimagined/nitori/mixin/collections/goals/GoalSelectorMixin.java b/src/main/java/net/gensokyoreimagined/nitori/mixin/collections/goals/GoalSelectorMixin.java new file mode 100644 index 0000000..b5a5ed7 --- /dev/null +++ b/src/main/java/net/gensokyoreimagined/nitori/mixin/collections/goals/GoalSelectorMixin.java @@ -0,0 +1,33 @@ +package net.gensokyoreimagined.nitori.mixin.collections.goals; + +import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; +import net.minecraft.world.entity.ai.goal.GoalSelector; +import net.minecraft.world.entity.ai.goal.WrappedGoal; +import net.minecraft.util.profiling.ProfilerFiller; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Set; +import java.util.function.Supplier; + +@Mixin(GoalSelector.class) +public abstract class GoalSelectorMixin { + + @Mutable + @Shadow + @Final + private Set availableGoals; + + /** + * Replace the goal set with an optimized collection type which performs better for iteration. + */ + @Inject(method = "", at = @At("RETURN")) + private void reinit(Supplier supplier, CallbackInfo ci) { + this.availableGoals = new ObjectLinkedOpenHashSet<>(this.availableGoals); + } +} \ No newline at end of file diff --git a/src/main/resources/mixins.core.json b/src/main/resources/mixins.core.json index 05960a9..49db3df 100755 --- a/src/main/resources/mixins.core.json +++ b/src/main/resources/mixins.core.json @@ -48,6 +48,7 @@ "collections.entity_by_type.TypeFilterableListMixin", "collections.chunk_tickets.SortedArraySetMixin", "collections.block_entity_tickers.WorldChunkMixin", + "collections.goals.GoalSelectorMixin", "world.block_entity_ticking.sleeping.WrappedBlockEntityTickInvokerAccessor", "world.block_entity_ticking.sleeping.campfire.CampfireBlockEntityMixin", "world.block_entity_ticking.sleeping.campfire.unlit.CampfireBlockEntityMixin",