Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.server.event.EventMergeStructureSpawns;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.util.TriState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.util.random.WeightedRandomList;
Expand All @@ -10,25 +16,21 @@
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.MobSpawnSettings;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.util.TriState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(ChunkGenerator.class)
public class ChunkGeneratorMixin {
@Inject(at = @At("RETURN"), remap = CitadelConstants.REMAPREFS, cancellable = true, method = "getMobsAt(Lnet/minecraft/core/Holder;Lnet/minecraft/world/level/StructureManager;Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/util/random/WeightedRandomList;")
private void citadel_getMobsAt(Holder<Biome> biome, StructureManager structureManager, MobCategory mobCategory, BlockPos pos, CallbackInfoReturnable<WeightedRandomList<MobSpawnSettings.SpawnerData>> cir) {
@ModifyReturnValue(at = @At("RETURN"), remap = CitadelConstants.REMAPREFS, method = "getMobsAt(Lnet/minecraft/core/Holder;Lnet/minecraft/world/level/StructureManager;Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/util/random/WeightedRandomList;")
private WeightedRandomList<MobSpawnSettings.SpawnerData> citadel_getMobsAt(WeightedRandomList<MobSpawnSettings.SpawnerData> original, Holder<Biome> biome, StructureManager structureManager, MobCategory mobCategory, BlockPos pos) {
WeightedRandomList<MobSpawnSettings.SpawnerData> biomeSpawns = biome.value().getMobSettings().getMobs(mobCategory);
if (biomeSpawns != cir.getReturnValue()) {
EventMergeStructureSpawns event = new EventMergeStructureSpawns(structureManager, pos, mobCategory, cir.getReturnValue(), biomeSpawns);
if (biomeSpawns != original) {
EventMergeStructureSpawns event = new EventMergeStructureSpawns(structureManager, pos, mobCategory, original, biomeSpawns);
NeoForge.EVENT_BUS.post(event);
if (event.getResult() == TriState.TRUE) {
cir.setReturnValue(event.getStructureSpawns());
return event.getStructureSpawns();
}
}

return original;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.server.world.ModifiableTickRateServer;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerTickRateManager;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
Expand All @@ -12,6 +10,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ServerTickRateManager;

/**
* In 1.21+, Minecraft uses TickRateManager with setTickRate() instead of hardcoded 50L constants.
* We use the native API to modify tick rate instead of @ModifyConstant.
Expand All @@ -22,13 +23,13 @@ public abstract class MinecraftServerMixin implements ModifiableTickRateServer {
@Shadow @Final private ServerTickRateManager tickRateManager;

@Unique
private long modifiedMsPerTick = -1;
private long citadel$modifiedMsPerTick = -1;
@Unique
private long masterMs;
private long citadel$masterMs;
@Unique
private float originalTickRate = 20.0F;
private float citadel$originalTickRate = 20.0F;
@Unique
private boolean hasStoredOriginalTickRate = false;
private boolean citadel$hasStoredOriginalTickRate = false;

@Inject(
method = "runServer",
Expand All @@ -45,25 +46,25 @@ protected void citadel_beforeServerTick(CallbackInfo ci) {

@Unique
private void masterTick() {
masterMs += 50L;
citadel$masterMs += 50L;
}

@Override
public void setGlobalTickLengthMs(long msPerTick) {
this.modifiedMsPerTick = msPerTick;
this.citadel$modifiedMsPerTick = msPerTick;

if (msPerTick == -1) {
// Reset to original tick rate (20 TPS = 50ms per tick)
if (hasStoredOriginalTickRate) {
tickRateManager.setTickRate(originalTickRate);
if (citadel$hasStoredOriginalTickRate) {
tickRateManager.setTickRate(citadel$originalTickRate);
} else {
tickRateManager.setTickRate(20.0F);
}
} else {
// Store original tick rate before modifying
if (!hasStoredOriginalTickRate) {
originalTickRate = tickRateManager.tickrate();
hasStoredOriginalTickRate = true;
if (!citadel$hasStoredOriginalTickRate) {
citadel$originalTickRate = tickRateManager.tickrate();
citadel$hasStoredOriginalTickRate = true;
}
// Convert ms per tick to ticks per second: TPS = 1000 / msPerTick
float newTickRate = 1000.0F / msPerTick;
Expand All @@ -73,6 +74,6 @@ public void setGlobalTickLengthMs(long msPerTick) {

@Override
public long getMasterMs() {
return masterMs;
return citadel$masterMs;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,25 @@

import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.server.tick.ServerTickRateTracker;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.ModifyConstant;
import org.spongepowered.asm.mixin.injection.At;

import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;

@Mixin(ServerLevel.class)
public class ServerLevelMixin {
@Shadow
@Final
private MinecraftServer server;

@ModifyConstant(
@ModifyExpressionValue(
method = "tickTime",
remap = CitadelConstants.REMAPREFS,
constant = @Constant(longValue = 1L),
at = @At(value = "CONSTANT", args = "longValue=1"),
expect = 2)
private long citadel_clientSetDayTime(long timeIn) {
return ServerTickRateTracker.getForServer(server).getDayTimeIncrement(timeIn);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
package com.github.alexthe666.citadel.mixin.client;

import java.util.function.Supplier;

import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.client.event.EventGetStarBrightness;
import com.github.alexthe666.citadel.client.tick.ClientTickRateTracker;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import com.llamalad7.mixinextras.sugar.Local;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.util.TriState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.core.Holder;
Expand All @@ -12,16 +22,6 @@
import net.minecraft.world.level.Level;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.storage.WritableLevelData;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.util.TriState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyConstant;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.function.Supplier;

@Mixin(ClientLevel.class)
public abstract class ClientLevelMixin extends Level {
Expand All @@ -30,19 +30,21 @@ protected ClientLevelMixin(WritableLevelData writableLevelData, ResourceKey<Leve
super(writableLevelData, levelResourceKey, registryAccess, dimensionTypeHolder, filler, b1, b2, seed, i);
}

@Inject(at = @At("RETURN"), remap = CitadelConstants.REMAPREFS, method = "getStarBrightness", cancellable = true)
private void citadel_getStarBrightness(float partialTicks, CallbackInfoReturnable<Float> cir) {
EventGetStarBrightness event = new EventGetStarBrightness(((ClientLevel) (Object) this), cir.getReturnValue(), partialTicks);
@ModifyReturnValue(at = @At("RETURN"), remap = CitadelConstants.REMAPREFS, method = "getStarBrightness")
private float citadel_getStarBrightness(float original, @Local(argsOnly = true) float partialTicks) {
EventGetStarBrightness event = new EventGetStarBrightness(((ClientLevel) (Object) this), original, partialTicks);
NeoForge.EVENT_BUS.post(event);
if (event.getResult() == TriState.TRUE) {
cir.setReturnValue(event.getBrightness());
return event.getBrightness();
}

return original;
}

@ModifyConstant(
@ModifyExpressionValue(
method = "tickTime",
remap = CitadelConstants.REMAPREFS,
constant = @Constant(longValue = 1L),
at = @At(value = "CONSTANT", args = "longValue=1"),
expect = 2)
private long citadel_clientSetDayTime(long timeIn) {
return ClientTickRateTracker.getForClient(Minecraft.getInstance()).getDayTimeIncrement(timeIn);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,8 @@
import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.client.event.EventGetOutlineColor;
import com.github.alexthe666.citadel.client.shader.PostEffectRegistry;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.util.TriState;
import org.joml.Matrix4f;
Expand All @@ -24,6 +17,16 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;

@Mixin(LevelRenderer.class)
public class LevelRendererMixin {

Expand Down Expand Up @@ -72,15 +75,16 @@ private void citadel_renderLevel_end(DeltaTracker deltaTracker, boolean renderBl
PostEffectRegistry.blitEffects();
}

@Redirect(
@WrapOperation(
method = "renderLevel",
remap = CitadelConstants.REMAPREFS,
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;getTeamColor()I")
)
private int citadel_getTeamColor(Entity entity) {
EventGetOutlineColor event = new EventGetOutlineColor(entity, entity.getTeamColor());
private int citadel_getTeamColor(Entity entity, Operation<Integer> original) {
int originalValue = original.call(entity);
EventGetOutlineColor event = new EventGetOutlineColor(entity, originalValue);
NeoForge.EVENT_BUS.post(event);
int color = entity.getTeamColor();
int color = originalValue;
if (event.getResult() == TriState.TRUE) {
color = event.getColor();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@
import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.client.event.EventLivingRenderer;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.world.entity.LivingEntity;
import net.neoforged.neoforge.common.NeoForge;
import org.spongepowered.asm.mixin.Mixin;
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 net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.world.entity.LivingEntity;

@Mixin(LivingEntityRenderer.class)
public class LivingEntityRendererMixin<T extends LivingEntity> {

Expand Down Expand Up @@ -61,7 +62,7 @@ protected void citadel_render_setupAnim_after(LivingEntity livingEntity, float y
}

@Inject(
method = {"Lnet/minecraft/client/renderer/entity/LivingEntityRenderer;render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"},
method = {"render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"},
remap = CitadelConstants.REMAPREFS,
at = @At(value = "RETURN")
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@

import com.github.alexthe666.citadel.CitadelConstants;
import com.github.alexthe666.citadel.client.tick.ClientTickRateTracker;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import com.llamalad7.mixinextras.sugar.Local;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.sounds.SoundInstance;
import net.minecraft.client.sounds.SoundEngine;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(SoundEngine.class)
public class SoundEngineMixin {
@Inject(
@ModifyReturnValue(
method = "calculatePitch",
remap = CitadelConstants.REMAPREFS,
cancellable = true,
at = @At(value = "RETURN")
)
protected void citadel_setupRotations(SoundInstance soundInstance, CallbackInfoReturnable<Float> cir) {
cir.setReturnValue(cir.getReturnValue() * ClientTickRateTracker.getForClient(Minecraft.getInstance()).modifySoundPitch(soundInstance));
protected float citadel_setupRotations(float original, @Local(argsOnly = true) SoundInstance soundInstance) {
return original * ClientTickRateTracker.getForClient(Minecraft.getInstance()).modifySoundPitch(soundInstance);
}
}
Loading