Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
86be99e
Restore mob spawn modifier configuration in neoforge biome modifier
crabsatellite Jan 2, 2026
de065fa
Update biome entries in CitadelBiomeDefinitions for consistency and a…
crabsatellite Jan 2, 2026
ca7f021
Add ItemBlockRenderTypesMixin to client mixins for enhanced rendering
crabsatellite Jan 5, 2026
a7b08f2
Refactor CitadelLecternBlock use method to specify InteractionHand an…
crabsatellite Jan 5, 2026
cc76490
Refactor CitadelItemstackRenderer to utilize DataComponents for item …
crabsatellite Jan 5, 2026
3b4b787
Refactor CitadelItemstackRenderer and GuiBasicBook to utilize DataCom…
crabsatellite Jan 5, 2026
9df6a44
Refactor CitadelItemstackRenderer to improve buffer handling and ligh…
crabsatellite Jan 5, 2026
0e47119
Merge upstream/1.21: adopt proper DataComponent system for custom ite…
crabsatellite Jan 7, 2026
84a656f
Refactor GuiBasicBook and ItemRenderData to utilize components for it…
crabsatellite Jan 7, 2026
0b1217a
Refactor ItemRenderData to use Holder for item references and update …
crabsatellite Jan 11, 2026
5bb6016
Merge upstream/1.21 - adopt upstream book data changes
crabsatellite Jan 11, 2026
acd14a4
Refactor serialization for BookPage and EntityLinkData to use Codec.e…
crabsatellite Jan 11, 2026
2fbf298
Enhance title field handling in BookPage to support both "title_local…
crabsatellite Jan 11, 2026
d1ed850
Refactor NoiseGeneratorSettingsMixin to improve surface rule merging …
crabsatellite Jan 12, 2026
dea678f
Add HumanoidModelMixin to client mixins for enhanced rendering support
crabsatellite Jan 13, 2026
9edab61
Refactor mixin configuration to improve organization and enhance clie…
crabsatellite Jan 13, 2026
ad02123
Refactor MinecraftServerMixin to utilize ServerTickRateManager for dy…
crabsatellite Jan 13, 2026
14ecd32
Add shader programs and configurations for blur and bumpy effects
crabsatellite Jan 13, 2026
b6f2bf8
Refactor GuiBasicBook to use pattern matching for LivingEntity and re…
crabsatellite Jan 14, 2026
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 @@ -62,17 +62,22 @@ public record BookPage(
.optionalFieldOf("images", Collections.emptyList())
.forGetter(BookPage::images),

// Support both "title_locale" (string -> translatable) and "title" (string or Component)
Codec.mapEither(
Codec.STRING
.flatComapMap(Component::translatable, component -> {
.xmap(Component::translatable, component -> {
if (component.getContents() instanceof TranslatableContents translatableContents) {
return DataResult.success(translatableContents.getKey());
return translatableContents.getKey();
} else {
return DataResult.error(() -> "Component is not translatable!");
return component.getString();
}
})
.fieldOf("title_locale"),
ComponentSerialization.CODEC
Codec.either(
Codec.STRING.xmap(Component::translatable, c -> c.getString()),
ComponentSerialization.CODEC
)
.xmap(Either::unwrap, Either::right)
.fieldOf("title")
)
.xmap(Either::unwrap, Either::right)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,17 @@ public void drawEntityOnScreen(GuiGraphics guiGraphics, MultiBufferSource buffer
quaternion1.conjugate();
entityrenderdispatcher.overrideCameraOrientation(quaternion1);
entityrenderdispatcher.setRenderShadow(false);
RenderSystem.runAsFancy(() -> entityrenderdispatcher.render(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, guiGraphics.pose(), bufferSource, 240));
RenderSystem.runAsFancy(() -> entityrenderdispatcher.render(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, guiGraphics.pose(), bufferSource, 15728880));
entityrenderdispatcher.setRenderShadow(true);
entity.setYRot(0);
entity.setXRot(0);
if (entity instanceof LivingEntity) {
((LivingEntity) entity).yBodyRot = 0;
((LivingEntity) entity).yHeadRotO = 0;
((LivingEntity) entity).yHeadRot = 0;
entity.xRotO = 0;
entity.yRotO = 0;
if (entity instanceof LivingEntity livingEntity) {
livingEntity.yBodyRot = 0;
livingEntity.yBodyRotO = 0;
livingEntity.yHeadRot = 0;
livingEntity.yHeadRotO = 0;
}

guiGraphics.flush();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.alexthe666.citadel.client.gui.data;

import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.registries.BuiltInRegistries;
Expand Down Expand Up @@ -28,19 +29,23 @@ public record EntityLinkData(
Codec.INT
.fieldOf("y")
.forGetter(EntityLinkData::y),
Codec.DOUBLE
.optionalFieldOf("entity_scale", 1.0)
.forGetter(EntityLinkData::entityScale),
Codec.DOUBLE
.optionalFieldOf("scale", 1.0)
.forGetter(EntityLinkData::scale),
Codec.DOUBLE
.optionalFieldOf("entity_scale", 1.0)
.forGetter(EntityLinkData::entityScale),
Codec.INT
.optionalFieldOf("page", 0)
.forGetter(EntityLinkData::page),
Codec.STRING
.fieldOf("linked_page")
.forGetter(EntityLinkData::linkedPage),
ComponentSerialization.CODEC
Codec.either(
Codec.STRING.xmap(Component::translatable, c -> c.getString()),
ComponentSerialization.CODEC
)
.xmap(Either::unwrap, Either::right)
.fieldOf("hover_text")
.forGetter(EntityLinkData::hoverText),
Codec.FLOAT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
public class CitadelBiomeDefinitions {

public static final SpawnBiomeData TEST = new SpawnBiomeData()
.addBiomeEntry(BiomeEntryType.BIOME_DICT, false, "overworld", 0)
.addBiomeEntry(BiomeEntryType.BIOME_DICT, true, "water", 0)
.addBiomeEntry(BiomeEntryType.BIOME_TAG, false, "minecraft:is_overworld", 0)
.addBiomeEntry(BiomeEntryType.BIOME_TAG, true, "minecraft:is_ocean", 0)
.addBiomeEntry(BiomeEntryType.REGISTRY_NAME, false, "minecraft:nether_wastes", 1);

public static final SpawnBiomeData TERRALITH_TEST = new SpawnBiomeData()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,32 @@
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;
import org.spongepowered.asm.mixin.Unique;
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.CallbackInfo;

/**
* 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.
*/
@Mixin(MinecraftServer.class)
public abstract class MinecraftServerMixin implements ModifiableTickRateServer {

@Shadow @Final private ServerTickRateManager tickRateManager;

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

@Inject(
method = "runServer",
Expand All @@ -29,21 +43,32 @@ protected void citadel_beforeServerTick(CallbackInfo ci) {
masterTick();
}

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

@ModifyConstant(
method = "runServer",
constant = @Constant(longValue = 50L),
expect = 4)
private long citadel_serverMsPerTick(long value) {
return modifiedMsPerTick == -1 ? value : modifiedMsPerTick;
}

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

if (msPerTick == -1) {
// Reset to original tick rate (20 TPS = 50ms per tick)
if (hasStoredOriginalTickRate) {
tickRateManager.setTickRate(originalTickRate);
} else {
tickRateManager.setTickRate(20.0F);
}
} else {
// Store original tick rate before modifying
if (!hasStoredOriginalTickRate) {
originalTickRate = tickRateManager.tickrate();
hasStoredOriginalTickRate = true;
}
// Convert ms per tick to ticks per second: TPS = 1000 / msPerTick
float newTickRate = 1000.0F / msPerTick;
tickRateManager.setTickRate(newTickRate);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,33 @@
import net.minecraft.world.level.levelgen.SurfaceRules;
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.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(value = NoiseGeneratorSettings.class, priority = 500)
public class NoiseGeneratorSettingsMixin {
@Mutable
@Final

@Shadow
@Final
private SurfaceRules.RuleSource surfaceRule;

private boolean mergedSurfaceRules = false;
@Unique
private SurfaceRules.RuleSource citadel$mergedSurfaceRule = null;

@Inject(method = "surfaceRule", at = @At("HEAD"))
private void surfaceRule(CallbackInfoReturnable<SurfaceRules.RuleSource> cir) {
if (!this.mergedSurfaceRules) {
this.surfaceRule = SurfaceRulesManager.mergeOverworldRules(surfaceRule);
this.mergedSurfaceRules = true;
//not replacing the return result for compatibility with TerraBlender
@Unique
private boolean citadel$hasMerged = false;

@Inject(method = "surfaceRule", at = @At("HEAD"), cancellable = true)
private void citadel$surfaceRule(CallbackInfoReturnable<SurfaceRules.RuleSource> cir) {
if (!this.citadel$hasMerged) {
this.citadel$mergedSurfaceRule = SurfaceRulesManager.mergeOverworldRules(this.surfaceRule);
this.citadel$hasMerged = true;
}
if (this.citadel$mergedSurfaceRule != null) {
cir.setReturnValue(this.citadel$mergedSurfaceRule);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,16 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState blockState) {
return new CitadelLecternBlockEntity(pos, blockState);
}

public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
BlockEntity blockEntity = level.getBlockEntity(pos);
if (level.isClientSide && blockEntity instanceof CitadelLecternBlockEntity lecternBlockEntity && lecternBlockEntity.hasBook()) {
ItemStack book = lecternBlockEntity.getBook();
if (!book.isEmpty() && !player.getCooldowns().isOnCooldown(book.getItem())) {
book.use(level, player, hand);
book.use(level, player, InteractionHand.MAIN_HAND);
Comment thread
crabsatellite marked this conversation as resolved.
}
}
return InteractionResult.sidedSuccess(level.isClientSide);

}


Expand Down
21 changes: 9 additions & 12 deletions src/main/resources/assets/citadel/shaders/post/rainbow_aura.json
Original file line number Diff line number Diff line change
@@ -1,46 +1,43 @@
{
"targets": [
"swap",
"final"
],
"targets": ["swap", "final"],
"passes": [
{
"name": "blur",
"name": "citadel:blur",
"intarget": "final",
"outtarget": "swap",
"uniforms": [
{
"name": "BlurDir",
"values": [ 0.0, 1.0 ]
"values": [0.0, 1.0]
},
{
"name": "Radius",
"values": [ 2.0 ]
"values": [2.0]
}
]
},
{
"name": "blur",
"name": "citadel:blur",
"intarget": "swap",
"outtarget": "final",
"uniforms": [
{
"name": "BlurDir",
"values": [ 1.0, 0.0 ]
"values": [1.0, 0.0]
},
{
"name": "Radius",
"values": [ 2.0 ]
"values": [2.0]
}
]
},
{
"name": "bumpy",
"name": "citadel:bumpy",
"intarget": "final",
"outtarget": "swap"
},
{
"name": "blit",
"name": "citadel:blit",
"intarget": "swap",
"outtarget": "final"
}
Expand Down
14 changes: 14 additions & 0 deletions src/main/resources/assets/citadel/shaders/program/blit.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#version 150

uniform sampler2D DiffuseSampler;

in vec2 texCoord;

uniform vec4 ColorModulate;

out vec4 fragColor;

void main() {
vec4 color = texture(DiffuseSampler, texCoord);
fragColor = color * ColorModulate;
}
30 changes: 30 additions & 0 deletions src/main/resources/assets/citadel/shaders/program/blit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"blend": {
"func": "add",
"srcrgb": "one",
"dstrgb": "zero"
},
"vertex": "citadel:blit",
"fragment": "citadel:blit",
"attributes": ["Position"],
"samplers": [{ "name": "DiffuseSampler" }],
"uniforms": [
{
"name": "ProjMat",
"type": "matrix4x4",
"count": 16,
"values": [
1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
0.0, 1.0
]
},
{ "name": "InSize", "type": "float", "count": 2, "values": [1.0, 1.0] },
{ "name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0] },
{
"name": "ColorModulate",
"type": "float",
"count": 4,
"values": [1.0, 1.0, 1.0, 1.0]
}
]
}
15 changes: 15 additions & 0 deletions src/main/resources/assets/citadel/shaders/program/blit.vsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#version 150

in vec4 Position;

uniform mat4 ProjMat;
uniform vec2 InSize;

out vec2 texCoord;

void main() {
vec4 outPos = ProjMat * vec4(Position.xy, 0.0, 1.0);
gl_Position = vec4(outPos.xy, 0.2, 1.0);

texCoord = Position.xy / InSize;
}
34 changes: 34 additions & 0 deletions src/main/resources/assets/citadel/shaders/program/blur.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#version 150

uniform sampler2D DiffuseSampler;

in vec2 texCoord;
in vec2 oneTexel;

uniform vec2 InSize;
uniform vec2 OutSize;
uniform vec2 BlurDir;
uniform float Radius;

out vec4 fragColor;

void main() {
vec4 blurred = vec4(0.0);
float totalStrength = 0.0;
float totalAlpha = 0.0;
float totalSamples = 0.0;
float rad = Radius;

for(float r = -rad; r <= rad; r += 1.0) {
vec4 sampleValue = texture(DiffuseSampler, texCoord + oneTexel * r * BlurDir);

// Gaussian weighting
float strength = 1.0 - abs(r / rad);
totalStrength += strength;
blurred.rgb += sampleValue.rgb * strength;
totalAlpha += sampleValue.a;
totalSamples += 1.0;
}

fragColor = vec4(blurred.rgb / totalStrength, totalAlpha / totalSamples);
}
Loading