Skip to content

Commit

Permalink
Random fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
himekifee committed Sep 12, 2024
1 parent b2bca75 commit 9507f23
Show file tree
Hide file tree
Showing 11 changed files with 96 additions and 23 deletions.
11 changes: 9 additions & 2 deletions src/main/java/net/himeki/mcmtfabric/ParallelProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,13 @@
import net.himeki.mcmtfabric.serdes.filter.ISerDesFilter;
import net.himeki.mcmtfabric.serdes.pools.PostExecutePool;
import net.minecraft.block.entity.PistonBlockEntity;
import net.minecraft.block.entity.SculkCatalystBlockEntity;
import net.minecraft.block.entity.SculkSensorBlockEntity;
import net.minecraft.block.entity.SculkShriekerBlockEntity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.FallingBlockEntity;
import net.minecraft.entity.TntEntity;
import net.minecraft.entity.passive.AllayEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld;
Expand Down Expand Up @@ -221,7 +226,7 @@ public static void callEntityTick(Consumer<Entity> tickConsumer, Entity entityIn
tickConsumer.accept(entityIn);
return;
}
if (entityIn instanceof PlayerEntity || entityIn instanceof FallingBlockEntity) {
if (entityIn instanceof PlayerEntity || entityIn instanceof FallingBlockEntity || entityIn instanceof AllayEntity || entityIn instanceof TntEntity) {
tickConsumer.accept(entityIn);
return;
}
Expand Down Expand Up @@ -267,7 +272,9 @@ public static void callBlockEntityTick(BlockEntityTickInvoker tte, World world)
tte.tick();
return;
}
if (((WorldChunk.DirectBlockEntityTickInvoker<?>) ((WorldChunk.WrappedBlockEntityTickInvoker) tte).wrapped).blockEntity instanceof PistonBlockEntity) {
var blockEntity = ((WorldChunk.DirectBlockEntityTickInvoker<?>) ((WorldChunk.WrappedBlockEntityTickInvoker) tte).wrapped).blockEntity;
if (blockEntity instanceof PistonBlockEntity || blockEntity instanceof SculkSensorBlockEntity ||
blockEntity instanceof SculkShriekerBlockEntity || blockEntity instanceof SculkCatalystBlockEntity) {
tte.tick();
return;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package net.himeki.mcmtfabric.mixin;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.block.ChainRestrictedNeighborUpdater;
import net.minecraft.world.block.NeighborUpdater;
import org.spongepowered.asm.mixin.Final;
Expand All @@ -18,5 +21,9 @@ public abstract class ChainRestrictedNeighborUpdaterMixin implements NeighborUpd
@Mutable
List<ChainRestrictedNeighborUpdater.Entry> pending = new CopyOnWriteArrayList<>();

@WrapMethod(method = "enqueue")
private synchronized void syncEnqueue(BlockPos pos, ChainRestrictedNeighborUpdater.Entry entry, Operation<Void> original) {
original.call(pos, entry);
}

}

This file was deleted.

18 changes: 18 additions & 0 deletions src/main/java/net/himeki/mcmtfabric/mixin/LockHelperMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package net.himeki.mcmtfabric.mixin;

import net.minecraft.util.thread.LockHelper;
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 java.util.concurrent.Semaphore;

@Mixin(LockHelper.class)
public abstract class LockHelperMixin {

@Shadow
@Final
@Mutable
private Semaphore semaphore = new Semaphore(255);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
package net.himeki.mcmtfabric.mixin;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.ai.brain.sensor.NearestLivingEntitiesSensor;
import net.minecraft.server.world.ServerWorld;
import org.spongepowered.asm.mixin.Mixin;

@Mixin(NearestLivingEntitiesSensor.class)
public class NearestLivingEntitiesSensorMixin {
public class NearestLivingEntitiesSensorMixin<T extends LivingEntity> {

@WrapMethod(method = "sense")
private synchronized void syncSense(ServerWorld world, T entity, Operation<Void> original) {
original.call(world, entity);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
package net.himeki.mcmtfabric.mixin;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import net.minecraft.entity.ai.pathing.Path;
import net.minecraft.entity.ai.pathing.PathNodeNavigator;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.ChunkCache;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;

import java.util.Set;

@Mixin(PathNodeNavigator.class)
public class PathNodeNavigatorMixin {
@WrapMethod(method = "findPathToAny(Lnet/minecraft/world/chunk/ChunkCache;Lnet/minecraft/entity/mob/MobEntity;Ljava/util/Set;FIF)Lnet/minecraft/entity/ai/pathing/Path;")
private synchronized @Nullable Path syncFindPathToAny(ChunkCache world, MobEntity mob, Set<BlockPos> positions, float followRange, int distance, float rangeMultiplier, Operation<Path> original) {
return original.call(world, mob, positions, followRange, distance, rangeMultiplier);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package net.himeki.mcmtfabric.mixin;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.mojang.datafixers.DataFixer;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import net.himeki.mcmtfabric.parallelised.fastutil.Int2ObjectConcurrentHashMap;
import net.minecraft.server.world.ChunkHolder;
import net.minecraft.server.world.ServerChunkLoadingManager;
import net.minecraft.world.ChunkLoadingManager;
import net.minecraft.world.chunk.AbstractChunkHolder;
import net.minecraft.world.chunk.ChunkLoader;
import net.minecraft.world.storage.StorageKey;
import net.minecraft.world.storage.VersionedChunkStorage;
import org.spongepowered.asm.mixin.Final;
Expand All @@ -14,6 +18,8 @@
import org.spongepowered.asm.mixin.Shadow;

import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@Mixin(ServerChunkLoadingManager.class)
public abstract class ServerChunkLoadingManagerMixin extends VersionedChunkStorage implements ChunkHolder.PlayersWatchingChunkProvider, ChunkLoadingManager {
Expand All @@ -26,4 +32,16 @@ public ServerChunkLoadingManagerMixin(StorageKey storageKey, Path directory, Dat
@Final
@Mutable
private Int2ObjectMap<ServerChunkLoadingManager.EntityTracker> entityTrackers = new Int2ObjectConcurrentHashMap<>();


@Shadow
@Final
@Mutable
private List<ChunkLoader> loaders = new CopyOnWriteArrayList<>();


@WrapMethod(method = "release")
private synchronized void release(AbstractChunkHolder chunkHolder, Operation<Void> original) {
original.call(chunkHolder);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package net.himeki.mcmtfabric.mixin;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import net.himeki.mcmtfabric.ParallelProcessor;

import net.minecraft.server.world.ServerChunkManager;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkManager;
import net.minecraft.world.chunk.ChunkStatus;
import net.minecraft.world.chunk.WorldChunk;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Final;
Expand Down Expand Up @@ -51,6 +55,11 @@ private void overwriteProfilerVisit(Profiler instance, String s) {
else instance.visit("getChunkCacheMiss");
}

@WrapMethod(method = "putInCache")
private synchronized void syncPutInCache(long pos, Chunk chunk, ChunkStatus status, Operation<Void> original) {
original.call(pos, chunk, status);
}

// @Inject(method = "getChunk(IILnet/minecraft/world/chunk/ChunkStatus;Z)Lnet/minecraft/world/chunk/Chunk;", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerChunkManager$MainThreadExecutor;runTasks(Ljava/util/function/BooleanSupplier;)V"))
// private void callCompletableFutureHook(int x, int z, ChunkStatus leastStatus, boolean create, CallbackInfoReturnable<Chunk> cir, @Local long chunkPos, @Local CompletableFuture<OptionalChunk<Chunk>> completableFuture) {
// DebugHookTerminator.chunkLoadDrive(this.mainThreadExecutor, completableFuture::isDone, (ServerChunkManager) (Object) this, completableFuture, chunkPos);
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/net/himeki/mcmtfabric/mixin/SyncAllMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import net.minecraft.entity.ai.pathing.EntityNavigation;
import net.minecraft.entity.ai.pathing.PathMinHeap;
import net.minecraft.util.thread.LockHelper;
import net.minecraft.util.math.random.CheckedRandom;
import net.minecraft.world.chunk.light.LevelPropagator;
import net.minecraft.world.event.listener.SimpleGameEventDispatcher;
import net.minecraft.world.tick.ChunkTickScheduler;
import org.spongepowered.asm.mixin.Mixin;

@Mixin(value = {PathMinHeap.class, ChunkTickScheduler.class, LevelPropagator.class, EntityNavigation.class, LockHelper.class, SimpleGameEventDispatcher.class})
@Mixin(value = {PathMinHeap.class, ChunkTickScheduler.class, LevelPropagator.class, EntityNavigation.class,
SimpleGameEventDispatcher.class, CheckedRandom.class})
public class SyncAllMixin {
}
13 changes: 6 additions & 7 deletions src/main/java/net/himeki/mcmtfabric/mixin/SynchronisePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,17 @@ public void onLoad(String mixinPackage) {
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.ServerWorldMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_1937", "method_19282", "(Lnet/minecraft/class_2338;Lnet/minecraft/class_2680;Lnet/minecraft/class_2680;)V"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.LevelPropagatorMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_3554", "method_15492", "(I)I"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.LevelPropagatorMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_3554", "method_15478", "(JJIZ)V"));
mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.ChainRestrictedNeighborUpdaterMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_7159", "method_41706", "(Lnet/minecraft/class_2338;Lnet/minecraft/class_7159$class_7162;)V"));
mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.ServerChunkManagerMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_3215", "method_21738", "(JLnet/minecraft/class_2791;Lnet/minecraft/class_2806;)V"));
mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.PathNodeNavigatorMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_13", "method_52", "(Lnet/minecraft/class_1950;Lnet/minecraft/class_1308;Ljava/util/Set;FIF)Lnet/minecraft/class_11;"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.ChainRestrictedNeighborUpdaterMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_7159", "method_41706", "(Lnet/minecraft/class_2338;Lnet/minecraft/class_7159$class_7162;)V"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.ServerChunkManagerMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_3215", "method_21738", "(JLnet/minecraft/class_2791;Lnet/minecraft/class_2806;)V"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.PathNodeNavigatorMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_13", "method_52", "(Lnet/minecraft/class_1950;Lnet/minecraft/class_1308;Ljava/util/Set;FIF)Lnet/minecraft/class_11;"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.ChunkStatusMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_2806", "method_20612", "(Lnet/minecraft/class_3218;Lnet/minecraft/class_3485;Lnet/minecraft/class_3227;Ljava/util/function/Function;Lnet/minecraft/class_2791;)Ljava/util/concurrent/CompletableFuture;"));
mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.NearestLivingEntitiesSensorMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_4148","method_19101", "(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)V"));
mixin2MethodsExcludeMap.put("net.himeki.mcmtfabric.mixin.SyncAllMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_2806", "method_12165", "(Lnet/minecraft/class_2806;)Z"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.NearestLivingEntitiesSensorMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_4148","method_19101", "(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)V"));
// mixin2MethodsMap.put("net.himeki.mcmtfabric.mixin.TntEntityMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_1541","method_6971", "(Lnet/minecraft/class_3218;Lnet/minecraft/class_1309;)V"));

mixin2MethodsExcludeMap.put("net.himeki.mcmtfabric.mixin.SyncAllMixin", mappingResolver.mapMethodName("intermediary", "net.minecraft.class_2806", "method_12165", "()V"));

syncAllSet.add("net.himeki.mcmtfabric.mixin.FastUtilsMixin");
syncAllSet.add("net.himeki.mcmtfabric.mixin.SyncAllMixin");
syncAllSet.add("net.himeki.mcmtfabric.mixin.CheckedRandomMixin"); // For some reason the mapping does not cover next() so sync all for now

}

Expand Down Expand Up @@ -85,7 +85,6 @@ public void postApply(String targetClassName, ClassNode targetClass, String mixi
}
}
else if (syncAllSet.contains(mixinClassName)) {
// int posFilter = Opcodes.ACC_PUBLIC;
int negFilter = Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT | Opcodes.ACC_BRIDGE;

for (MethodNode method : targetClass.methods) {
Expand Down
6 changes: 3 additions & 3 deletions src/main/resources/mcmtfabric.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@
"required": true,
"minVersion": "0.8",
"package": "net.himeki.mcmtfabric.mixin",
"compatibilityLevel": "JAVA_16",
"compatibilityLevel": "JAVA_21",
"mixins": [
"ChainRestrictedNeighborUpdaterMixin",
"CheckedRandomMixin",
"ChunkHolderMixin",
"ChunkMixin",
"ChunkTicketManagerMixin",
Expand All @@ -15,17 +14,18 @@
"FastUtilsMixin",
"ItemEntityMixin",
"LevelPropagatorMixin",
"LockHelperMixin",
"MinecraftServerMixin",
"NearestLivingEntitiesSensorMixin",
"PathNodeNavigatorMixin",
"PendingUpdateQueueMixin",
"SectionedEntityCacheMixin",
"SerializingRegionBasedStorageMixin",
"ServerChunkLoadingManagerMixin",
"ServerChunkManagerMixin",
"ServerWorldMixin",
"SimulationDistanceLevelPropagatorMixin",
"SyncAllMixin",
"ServerChunkLoadingManagerMixin",
"TypeFilterableListMixin",
"UtilMixin",
"WorldMixin",
Expand Down

0 comments on commit 9507f23

Please sign in to comment.