Compare commits

...

1 Commits

Author SHA1 Message Date
Jason Penilla
0d528e59d7 Work on compatibility with porting lib on Fabric 2024-10-21 19:09:41 -07:00
6 changed files with 89 additions and 26 deletions

View File

@@ -29,7 +29,7 @@ import java.util.function.Predicate;
public final class FabricHooks implements PlatformHooks { public final class FabricHooks implements PlatformHooks {
public interface OnExplosionDetonate { public interface OnExplosionDetonate {
void onExplosion(final Level world, final Explosion explosion, final List<Entity> possiblyAffecting, final double diameter); public void onExplosion(final Level world, final Explosion explosion, final List<Entity> possiblyAffecting, final double diameter);
} }
public static final Event<OnExplosionDetonate> ON_EXPLOSION_DETONATE = EventFactory.createArrayBacked( public static final Event<OnExplosionDetonate> ON_EXPLOSION_DETONATE = EventFactory.createArrayBacked(
@@ -41,6 +41,32 @@ public final class FabricHooks implements PlatformHooks {
} }
); );
public interface OnChunkWatch {
public void onChunkWatch(final ServerLevel world, final LevelChunk chunk, final ServerPlayer player);
}
public static final Event<OnChunkWatch> ON_CHUNK_WATCH = EventFactory.createArrayBacked(
OnChunkWatch.class,
listeners -> (final ServerLevel world, final LevelChunk chunk, final ServerPlayer player) -> {
for (int i = 0; i < listeners.length; i++) {
listeners[i].onChunkWatch(world, chunk, player);
}
}
);
public interface OnChunkUnwatch {
public void onChunkUnwatch(final ServerLevel world, final ChunkPos chunk, final ServerPlayer player);
}
public static final Event<OnChunkUnwatch> ON_CHUNK_UNWATCH = EventFactory.createArrayBacked(
OnChunkUnwatch.class,
listeners -> (final ServerLevel world, final ChunkPos chunk, final ServerPlayer player) -> {
for (int i = 0; i < listeners.length; i++) {
listeners[i].onChunkUnwatch(world, chunk, player);
}
}
);
@Override @Override
public String getBrand() { public String getBrand() {
return "Moonrise"; return "Moonrise";
@@ -110,12 +136,12 @@ public final class FabricHooks implements PlatformHooks {
@Override @Override
public void onChunkWatch(final ServerLevel world, final LevelChunk chunk, final ServerPlayer player) { public void onChunkWatch(final ServerLevel world, final LevelChunk chunk, final ServerPlayer player) {
ON_CHUNK_WATCH.invoker().onChunkWatch(world, chunk, player);
} }
@Override @Override
public void onChunkUnWatch(final ServerLevel world, final ChunkPos chunk, final ServerPlayer player) { public void onChunkUnWatch(final ServerLevel world, final ChunkPos chunk, final ServerPlayer player) {
ON_CHUNK_UNWATCH.invoker().onChunkUnwatch(world, chunk, player);
} }
@Override @Override

View File

@@ -0,0 +1,27 @@
package ca.spottedleaf.moonrise.fabric.mixin.chunk_system;
import net.minecraft.server.level.FullChunkStatus;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(Level.class)
abstract class FabricLevelMixin {
/**
* @reason Allow block updates in non-ticking chunks, as new chunk system sends non-ticking chunks to clients
* @author Spottedleaf
*/
@Redirect(
method = "setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;II)Z",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/level/FullChunkStatus;isOrAfter(Lnet/minecraft/server/level/FullChunkStatus;)Z"
)
)
private boolean sendUpdatesForFullChunks(final FullChunkStatus instance,
final FullChunkStatus fullChunkStatus) {
return instance.isOrAfter(FullChunkStatus.FULL);
}
}

View File

@@ -3,6 +3,7 @@
"package": "ca.spottedleaf.moonrise.fabric.mixin", "package": "ca.spottedleaf.moonrise.fabric.mixin",
"mixins": [ "mixins": [
"chunk_system.FabricDistanceManagerMixin", "chunk_system.FabricDistanceManagerMixin",
"chunk_system.FabricLevelMixin",
"chunk_system.FabricMinecraftServerMixin", "chunk_system.FabricMinecraftServerMixin",
"chunk_system.FabricServerLevelMixin", "chunk_system.FabricServerLevelMixin",
"collisions.EntityMixin" "collisions.EntityMixin"

View File

@@ -0,0 +1,31 @@
package ca.spottedleaf.moonrise.neoforge.mixin.chunk_system;
import net.minecraft.server.level.FullChunkStatus;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(Level.class)
abstract class NeoForgeLevelMixin {
/**
* @reason Allow block updates in non-ticking chunks, as new chunk system sends non-ticking chunks to clients
* @author Spottedleaf
*/
@Redirect(
method = {
// "setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;II)Z",
// NeoForge splits logic from the original method into this one
"markAndNotifyBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/chunk/LevelChunk;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;II)V"
},
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/level/FullChunkStatus;isOrAfter(Lnet/minecraft/server/level/FullChunkStatus;)Z"
)
)
private boolean sendUpdatesForFullChunks(final FullChunkStatus instance,
final FullChunkStatus fullChunkStatus) {
return instance.isOrAfter(FullChunkStatus.FULL);
}
}

View File

@@ -3,6 +3,7 @@
"package": "ca.spottedleaf.moonrise.neoforge.mixin", "package": "ca.spottedleaf.moonrise.neoforge.mixin",
"mixins": [ "mixins": [
"chunk_system.NeoForgeDistanceManagerMixin", "chunk_system.NeoForgeDistanceManagerMixin",
"chunk_system.NeoForgeLevelMixin",
"chunk_system.NeoForgeMinecraftServerMixin", "chunk_system.NeoForgeMinecraftServerMixin",
"chunk_system.NeoForgeServerLevelMixin", "chunk_system.NeoForgeServerLevelMixin",
"collisions.EntityMixin" "collisions.EntityMixin"

View File

@@ -9,7 +9,6 @@ import ca.spottedleaf.moonrise.patches.chunk_system.level.entity.EntityLookup;
import ca.spottedleaf.moonrise.patches.chunk_system.level.entity.dfl.DefaultEntityLookup; import ca.spottedleaf.moonrise.patches.chunk_system.level.entity.dfl.DefaultEntityLookup;
import ca.spottedleaf.moonrise.patches.chunk_system.world.ChunkSystemEntityGetter; import ca.spottedleaf.moonrise.patches.chunk_system.world.ChunkSystemEntityGetter;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.FullChunkStatus;
import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
@@ -28,7 +27,6 @@ import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -303,27 +301,6 @@ abstract class LevelMixin implements ChunkSystemLevel, ChunkSystemEntityGetter,
return new BlockPos(blockPos.getX(), this.getHeight(types, blockPos.getX(), blockPos.getZ()), blockPos.getZ()); return new BlockPos(blockPos.getX(), this.getHeight(types, blockPos.getX(), blockPos.getZ()), blockPos.getZ());
} }
/**
* @reason Allow block updates in non-ticking chunks, as new chunk system sends non-ticking chunks to clients
* @author Spottedleaf
*/
@Redirect(
method = {
"setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;II)Z",
// NeoForge splits logic from the original method into this one
"markAndNotifyBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/chunk/LevelChunk;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;II)V"
},
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/level/FullChunkStatus;isOrAfter(Lnet/minecraft/server/level/FullChunkStatus;)Z"
)
)
private boolean sendUpdatesForFullChunks(final FullChunkStatus instance,
final FullChunkStatus fullChunkStatus) {
return instance.isOrAfter(FullChunkStatus.FULL);
}
// TODO: Thread.currentThread() != this.thread to TickThread? // TODO: Thread.currentThread() != this.thread to TickThread?