Skip to content
Draft
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
47 changes: 15 additions & 32 deletions XercaPaintMod/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '1.6-SNAPSHOT'
id 'fabric-loom' version "${loom_version}"
id 'maven-publish'
}

Expand All @@ -23,74 +23,61 @@ repositories {
// for more information about repositories.
}

tasks.register('buildCopy', Copy) {
dependsOn build
from "$buildDir/libs/${archivesBaseName}-${version}.jar"
into "$buildDir/../../builds"
loom {
accessWidenerPath.set(file("src/main/resources/xercapaint.accesswidener"))
}

dependencies {
compileOnly 'com.google.code.findbugs:jsr305:3.0.2'
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
// mappings loom.officialMojangMappings()
mappings loom.layered() {
officialMojangMappings()
parchment("org.parchmentmc.data:parchment-1.21:2024.07.28@zip")
parchment("org.parchmentmc.data:parchment-1.21.4:2025.03.23@zip")
}
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

// Uncomment the following line to enable the deprecated Fabric API modules.
// These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time.

// modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}"
}

processResources {
inputs.property "version", project.version
filteringCharset "UTF-8"

filesMatching("fabric.mod.json") {
expand "version": project.version
expand "version": inputs.properties.version
}
}

def targetJavaVersion = 17
tasks.withType(JavaCompile).configureEach {
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
// If Javadoc is generated, this must be specified in that task too.
it.options.encoding = "UTF-8"
if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) {
it.options.release = targetJavaVersion
}
it.options.release = 21
}

java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
if (JavaVersion.current() < javaVersion) {
toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
}
archivesBaseName = project.archives_base_name
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()

sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

jar {
inputs.property "archivesName", project.base.archivesName

from("LICENSE") {
rename { "${it}_${project.base.archivesName.get()}" }
rename { "${it}_${inputs.properties.archivesName}"}
}
}

// configure the maven publication
publishing {
publications {
mavenJava(MavenPublication) {
create("mavenJava", MavenPublication) {
artifactId = project.archives_base_name
from components.java
}
}
Expand All @@ -102,8 +89,4 @@ publishing {
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
}
}

loom {
accessWidenerPath.set(file("src/main/resources/xercapaint.accesswidener"))
}
10 changes: 6 additions & 4 deletions XercaPaintMod/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx1G
org.gradle.parallel=true

# Fabric Properties
# check these on https://modmuss50.me/fabric.html
minecraft_version=1.21.1
loader_version=0.16.7
minecraft_version=1.21.4
loader_version=0.16.14
loom_version=1.10-SNAPSHOT

# Fabric API
fabric_version=0.106.0+1.21.1
fabric_version=0.119.3+1.21.4

# Mod Properties
mod_version=1.21.1-1.0.1
mod_version=1.21.4-1.0.1
maven_group=xerca
archives_base_name=xercapaint
5 changes: 3 additions & 2 deletions XercaPaintMod/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
validateDistributionUrl=true
41 changes: 41 additions & 0 deletions XercaPaintMod/src/main/java/xerca/xercapaint/BlitUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package xerca.xercapaint;

import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.NotNull;

public class BlitUtil {

public static void blit(@NotNull GuiGraphics internalGuiGraphics, ResourceLocation sprite, int x, int y, int uOffset, int vOffset, int uWidth, int vHeight) {
internalGuiGraphics.blit(
RenderType::guiTextured,
sprite,
x,
y,
uOffset,
vOffset,
uWidth,
vHeight,
256,
256
);
}

public static void blit(@NotNull GuiGraphics internalGuiGraphics, ResourceLocation sprite, int x, int y, float uOffset, float vOffset, int width, int height, int texWidth, int texHeight) {
internalGuiGraphics.blit(
RenderType::guiTextured,
sprite,
x,
y,
uOffset,
vOffset,
width,
height,
width,
height,
texWidth,
texHeight
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,19 @@
import net.minecraft.ChatFormatting;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.CustomModelData;
import xerca.xercapaint.item.ItemCanvas;
import xerca.xercapaint.item.ItemPalette;
import xerca.xercapaint.item.Items;
import xerca.xercapaint.packets.ImportPaintingPacket;

import java.util.Arrays;
import java.util.List;

public class CommandImport {
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
Expand Down Expand Up @@ -130,6 +133,7 @@ public static void doImport(CompoundTag tag, ServerPlayer player){
itemStack.set(Items.CANVAS_VERSION, tag.getInt("v"));
itemStack.set(Items.CANVAS_ID, canvasId);
itemStack.set(Items.CANVAS_PIXELS, Arrays.stream(tag.getIntArray("pixels")).boxed().toList());
itemStack.set(DataComponents.CUSTOM_MODEL_DATA, new CustomModelData(List.of(), List.of(), List.of("drawn"), List.of()));
itemStack.set(Items.CANVAS_GENERATION, tag.getInt("generation"));
if (tag.contains("title", 8) && tag.contains("author", 8)) {
itemStack.set(Items.CANVAS_TITLE, tag.getString("title"));
Expand Down
12 changes: 6 additions & 6 deletions XercaPaintMod/src/main/java/xerca/xercapaint/SoundEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ public class SoundEvents {
public final static SoundEvent WATER_DROP = SoundEvent.createVariableRangeEvent(Mod.id("water_drop"));

public static void registerSoundEvents() {
Registry.register(SOUND_EVENT, STROKE_LOOP.getLocation(), STROKE_LOOP);
Registry.register(SOUND_EVENT, MIX.getLocation(), MIX);
Registry.register(SOUND_EVENT, COLOR_PICKER.getLocation(), COLOR_PICKER);
Registry.register(SOUND_EVENT, COLOR_PICKER_SUCK.getLocation(), COLOR_PICKER_SUCK);
Registry.register(SOUND_EVENT, WATER.getLocation(), WATER);
Registry.register(SOUND_EVENT, WATER_DROP.getLocation(), WATER_DROP);
Registry.register(SOUND_EVENT, STROKE_LOOP.location(), STROKE_LOOP);
Registry.register(SOUND_EVENT, MIX.location(), MIX);
Registry.register(SOUND_EVENT, COLOR_PICKER.location(), COLOR_PICKER);
Registry.register(SOUND_EVENT, COLOR_PICKER_SUCK.location(), COLOR_PICKER_SUCK);
Registry.register(SOUND_EVENT, WATER.location(), WATER);
Registry.register(SOUND_EVENT, WATER_DROP.location(), WATER_DROP);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.client.resources.sounds.SoundInstance;
import net.minecraft.network.chat.Component;
Expand All @@ -13,6 +14,7 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec2;
import org.jetbrains.annotations.NotNull;
import xerca.xercapaint.BlitUtil;
import xerca.xercapaint.Mod;
import xerca.xercapaint.PaletteUtil;
import xerca.xercapaint.SoundEvents;
Expand Down Expand Up @@ -157,7 +159,7 @@ public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, flo
guiGraphics.fill(x - r, y - r, x + r + 1, y + r + 1, basicColors[i].rgbVal());

RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
guiGraphics.blit(paletteTextures, x - 8, y - 8, dyeSpriteX, i * dyeSpriteSize, dyeSpriteSize, dyeSpriteSize);
BlitUtil.blit(guiGraphics, paletteTextures, x - 8, y - 8, dyeSpriteX, i * dyeSpriteSize, dyeSpriteSize, dyeSpriteSize);
} else {
guiGraphics.fill(x - r, y - r, x + r + 1, y + r + 1, emptinessColor.rgbVal());
}
Expand All @@ -171,11 +173,11 @@ public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, flo
}

RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
guiGraphics.blit(paletteTextures, (int) paletteX, (int) paletteY, 0, 0, paletteWidth, paletteHeight);
BlitUtil.blit(guiGraphics,paletteTextures, (int) paletteX, (int) paletteY, 0, 0, paletteWidth, paletteHeight);

// Draw color picker
if (paletteComplete) {
guiGraphics.blit(paletteTextures, (int) paletteX + colorPickerPosX, (int) paletteY + colorPickerPosY, colorPickerSpriteX, colorPickerSpriteY, colorPickerSize, colorPickerSize);
BlitUtil.blit(guiGraphics,paletteTextures, (int) paletteX + colorPickerPosX, (int) paletteY + colorPickerPosY, colorPickerSpriteX, colorPickerSpriteY, colorPickerSize, colorPickerSize);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,31 @@
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry;
import com.mojang.serialization.MapCodec;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.entity.ItemEntityRenderer;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.special.SpecialModelRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import xerca.xercapaint.Mod;
import xerca.xercapaint.item.ItemCanvas;
import xerca.xercapaint.item.Items;

import javax.annotation.ParametersAreNonnullByDefault;

@ParametersAreNonnullByDefault
public class CanvasItemRenderer extends BlockEntityWithoutLevelRenderer implements BuiltinItemRendererRegistry.DynamicItemRenderer
{
public class CanvasItemRenderer implements SpecialModelRenderer<ItemStack> {
private static final ResourceLocation backLocation = ResourceLocation.fromNamespaceAndPath("minecraft", "textures/block/birch_planks.png");
private static final ResourceLocation emptyCanvasLocation = Mod.id("textures/block/empty.png");

public CanvasItemRenderer(BlockEntityRenderDispatcher dispatcher, EntityModelSet entityModelSet) {
super(dispatcher, entityModelSet);
}

@Override
public void renderByItem(ItemStack stack, ItemDisplayContext displayContext, PoseStack matrixStack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) {
if (stack.getItem() instanceof ItemCanvas itemCanvas) {
boolean rendered = false;
Expand Down Expand Up @@ -128,7 +123,26 @@ private void renderEmptyCanvas(PoseStack ms, MultiBufferSource buffer, float wid
}

@Override
public void render(ItemStack stack, ItemDisplayContext displayContext, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) {
public void render(@Nullable ItemStack stack, ItemDisplayContext displayContext, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay, boolean bl) {
renderByItem(stack, displayContext, matrices, vertexConsumers, light, overlay);
}

@Override
public @Nullable ItemStack extractArgument(ItemStack itemStack) {
return itemStack;
}

public static class Unbaked implements SpecialModelRenderer.Unbaked {
public static final MapCodec<Unbaked> MAP_CODEC = MapCodec.unit(Unbaked::new);

@Override
public SpecialModelRenderer<ItemStack> bake(EntityModelSet entityModels) {
return new CanvasItemRenderer();
}

@Override
public MapCodec<? extends SpecialModelRenderer.Unbaked> type() {
return MAP_CODEC;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
import xerca.xercapaint.entity.EntityEasel;
import xerca.xercapaint.item.ItemCanvas;

public class EaselCanvasLayer extends RenderLayer<EntityEasel, EaselModel> {
public EaselCanvasLayer(RenderLayerParent<EntityEasel, EaselModel> p_117183_) {
public class EaselCanvasLayer extends RenderLayer<EntityEasel.RenderState, EaselModel> {
public EaselCanvasLayer(RenderLayerParent<EntityEasel.RenderState, EaselModel> p_117183_) {
super(p_117183_);
}

@Override
public void render(@NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int i, EntityEasel entity, float v, float v1, float v2, float v3, float v4, float v5) {
ItemStack itemstack = entity.getItem();
public void render(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, EntityEasel.RenderState entityRenderState, float f, float g) {
ItemStack itemstack = entityRenderState.getItem();
if (itemstack.getItem() instanceof ItemCanvas itemCanvas) {
poseStack.pushPose();

Expand Down Expand Up @@ -55,7 +55,7 @@ public void render(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buff
}
}

ModClient.CANVAS_ITEM_RENDERER.renderByItem(itemstack, ItemDisplayContext.FIXED, poseStack, bufferSource, i, 0);
ModClient.CANVAS_ITEM_RENDERER.renderByItem(itemstack, ItemDisplayContext.FIXED, poseStack, bufferSource, packedLight, 0);

poseStack.popPose();
}
Expand Down
Loading