mirror of
https://github.com/TibiNonEst/cauldron-dyeing.git
synced 2025-08-09 04:03:57 -05:00
Initial commit
This commit is contained in:
commit
5bd7750177
24 changed files with 1627 additions and 0 deletions
|
@ -0,0 +1,22 @@
|
|||
package me.tibinonest.mods.cauldron_dyeing.mixin;
|
||||
|
||||
import me.tibinonest.mods.cauldron_dyeing.block.WaterCauldronBlockEntity;
|
||||
import net.minecraft.client.color.world.BiomeColors;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.BlockRenderView;
|
||||
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(BiomeColors.class)
|
||||
public class BiomeColorsMixin {
|
||||
@Inject(method = "getWaterColor", at = @At("RETURN"), cancellable = true)
|
||||
private static void modifyWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable<Integer> cir) {
|
||||
var blockEntity = world.getBlockEntity(pos);
|
||||
|
||||
if (blockEntity instanceof WaterCauldronBlockEntity waterCauldron && waterCauldron.getColor() != -1) {
|
||||
cir.setReturnValue(waterCauldron.getColor());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package me.tibinonest.mods.cauldron_dyeing.mixin;
|
||||
|
||||
import me.tibinonest.mods.cauldron_dyeing.block.WaterCauldronBlock;
|
||||
import net.minecraft.block.AbstractBlock;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.cauldron.CauldronBehavior;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@Mixin(Blocks.class)
|
||||
public class BlocksMixin {
|
||||
@Redirect(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Blocks;register(Ljava/lang/String;Lnet/minecraft/block/Block;)Lnet/minecraft/block/Block;", ordinal = 271))
|
||||
private static Block redirectWaterCauldron(String id, Block block) {
|
||||
return Registry.register(Registry.BLOCK, id, new WaterCauldronBlock(AbstractBlock.Settings.copy(Blocks.CAULDRON), WaterCauldronBlock.RAIN_PREDICATE, CauldronBehavior.WATER_CAULDRON_BEHAVIOR));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
package me.tibinonest.mods.cauldron_dyeing.mixin;
|
||||
|
||||
import me.tibinonest.mods.cauldron_dyeing.block.CauldronBehaviorExtended;
|
||||
import me.tibinonest.mods.cauldron_dyeing.block.WaterCauldronBlockEntity;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.LeveledCauldronBlock;
|
||||
import net.minecraft.block.cauldron.CauldronBehavior;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.DyeItem;
|
||||
import net.minecraft.item.DyeableItem;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.stat.Stats;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.DyeColor;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
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.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
import org.spongepowered.tools.obfuscation.SuppressedBy;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Mixin(CauldronBehavior.class)
|
||||
public interface CauldronBehaviorMixin {
|
||||
@Inject(method = "method_32209", at = @At("HEAD"), cancellable = true)
|
||||
private static void injectCleanDyeableItem(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, ItemStack stack, CallbackInfoReturnable<ActionResult> cir) {
|
||||
var blockEntity = world.getBlockEntity(pos);
|
||||
var item = stack.getItem();
|
||||
|
||||
if (item instanceof DyeableItem dyeableItem && blockEntity instanceof WaterCauldronBlockEntity waterCauldron && waterCauldron.getColor() != -1) {
|
||||
dyeableItem.setColor(stack, waterCauldron.getColor());
|
||||
if (!world.isClient) {
|
||||
player.incrementStat(Stats.USE_CAULDRON);
|
||||
LeveledCauldronBlock.decrementFluidLevel(state, world, pos);
|
||||
}
|
||||
|
||||
cir.setReturnValue(ActionResult.success(world.isClient));
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "method_32217", at = @At(value = "TAIL"))
|
||||
private static void injectFillWithWater(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, ItemStack stack, CallbackInfoReturnable<ActionResult> cir) {
|
||||
var blockEntity = world.getBlockEntity(pos);
|
||||
if (blockEntity instanceof WaterCauldronBlockEntity waterCauldron) {
|
||||
waterCauldron.resetColor();
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "registerBehavior", at = @At("TAIL"))
|
||||
private static void injectRegisterBehavior(CallbackInfo ci) {
|
||||
var dyeMap = DyeItemAccessor.getDyeMap();
|
||||
for (Map.Entry<DyeColor, DyeItem> dyeItem : dyeMap.entrySet()) {
|
||||
CauldronBehavior.WATER_CAULDRON_BEHAVIOR.put(dyeItem.getValue(), CauldronBehaviorExtended.DYE_WATER);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package me.tibinonest.mods.cauldron_dyeing.mixin;
|
||||
|
||||
import net.minecraft.item.DyeItem;
|
||||
import net.minecraft.util.DyeColor;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Mixin(DyeItem.class)
|
||||
public interface DyeItemAccessor {
|
||||
@Accessor("DYES")
|
||||
static Map<DyeColor, DyeItem> getDyeMap() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package me.tibinonest.mods.cauldron_dyeing.mixin.sodium;
|
||||
|
||||
import me.jellysquid.mods.sodium.client.model.quad.ModelQuadColorProvider;
|
||||
import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView;
|
||||
import me.jellysquid.mods.sodium.client.model.quad.blender.BiomeColorBlender;
|
||||
import me.jellysquid.mods.sodium.client.model.quad.blender.FlatBiomeColorBlender;
|
||||
import me.jellysquid.mods.sodium.client.render.pipeline.BlockRenderer;
|
||||
import me.tibinonest.mods.cauldron_dyeing.block.WaterCauldronBlockEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.BlockRenderView;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
@Mixin(BlockRenderer.class)
|
||||
public class SodiumBlockRendererMixin {
|
||||
@Redirect(method = "renderQuad", at=@At(value = "INVOKE", target="Lme/jellysquid/mods/sodium/client/model/quad/blender/BiomeColorBlender;getColors(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/util/math/BlockPos;Lme/jellysquid/mods/sodium/client/model/quad/ModelQuadView;Lme/jellysquid/mods/sodium/client/model/quad/ModelQuadColorProvider;Ljava/lang/Object;)[I"))
|
||||
private <T> int[] redirectGetColors(BiomeColorBlender instance, BlockRenderView world, BlockPos pos, ModelQuadView quad, ModelQuadColorProvider<T> handler, T fluidState) {
|
||||
var blockEntity = world.getBlockEntity(pos);
|
||||
|
||||
if (blockEntity instanceof WaterCauldronBlockEntity) {
|
||||
var flatBiomeColorBlender = new FlatBiomeColorBlender();
|
||||
return flatBiomeColorBlender.getColors(world, pos, quad, handler, fluidState);
|
||||
}
|
||||
|
||||
return instance.getColors(world, pos, quad, handler, fluidState);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue