Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/main' into main
Browse files Browse the repository at this point in the history
# Conflicts:
#	build.gradle
#	gradle.properties
#	src/main/java/dev/emi/trinkets/SurvivalTrinketSlot.java
#	src/main/java/dev/emi/trinkets/TrinketScreenManager.java
#	src/main/java/dev/emi/trinkets/api/TrinketsApi.java
#	src/main/java/dev/emi/trinkets/mixin/ClickableWidgetMixin.java
#	src/main/java/dev/emi/trinkets/mixin/ClientPlayNetworkHandlerMixin.java
#	src/main/java/dev/emi/trinkets/mixin/CreativeInventoryScreenMixin.java
#	src/main/java/dev/emi/trinkets/mixin/HandledScreenMixin.java
#	src/main/java/dev/emi/trinkets/mixin/InventoryScreenMixin.java
#	src/main/java/dev/emi/trinkets/mixin/LivingEntityMixin.java
#	src/main/java/dev/emi/trinkets/mixin/PlayerScreenHandlerMixin.java
#	src/main/resources/trinkets.mixins.json
  • Loading branch information
Patbox committed Jun 27, 2023
2 parents 066360c + 8e0ad22 commit f8fd416
Show file tree
Hide file tree
Showing 7 changed files with 243 additions and 12 deletions.
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ version = project.mod_version + "+polymerport." + project.port_version
group = project.maven_group



repositories {
maven { url = "https://maven.terraformersmc.com" }
maven { url = "https://maven.nucleoid.xyz" }
Expand Down Expand Up @@ -56,8 +57,8 @@ dependencies {

// Mod dependencies
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
modImplementation include("dev.onyxstudios.cardinal-components-api:cardinal-components-base:${project.cca_version}")
modImplementation include("dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${project.cca_version}")
modApi include("dev.onyxstudios.cardinal-components-api:cardinal-components-base:${project.cca_version}")
modApi include("dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${project.cca_version}")

modImplementation include("eu.pb4:sgui:${project.sgui_version}")
modImplementation include("eu.pb4:polymer-resource-pack:${project.polymer_version}")
Expand Down
12 changes: 6 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx2G

minecraft_version=1.19.4
yarn_mappings=1.19.4+build.1
loader_version=0.14.17
minecraft_version=1.20
yarn_mappings=1.20+build.1
loader_version=0.14.21

mod_version = 3.6.0
mod_version = 3.7.0
maven_group = eu.pb4.polyport
archives_base_name = trinkets

fabric_version=0.76.0+1.19.4
cca_version=5.1.0
fabric_version=0.82.1+1.20
cca_version=5.2.0
mod_menu_version=5.0.2

port_version=1
Expand Down
100 changes: 100 additions & 0 deletions src/main/java/dev/emi/trinkets/mixin/HandledScreenMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package dev.emi.trinkets.mixin;

import com.mojang.blaze3d.systems.RenderSystem;

import dev.emi.trinkets.TrinketScreenManager;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import dev.emi.trinkets.TrinketSlot;
import dev.emi.trinkets.TrinketsClient;
import dev.emi.trinkets.mixin.accessor.CreativeSlotAccessor;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen.CreativeSlot;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.screen.slot.Slot;
import net.minecraft.util.Identifier;

/**
* Draws trinket slot backs, adjusts z location of draw calls, and makes non-trinket slots un-interactable while a trinket slot group is focused
*
* @author Emi
*/
@Mixin(HandledScreen.class)
public abstract class HandledScreenMixin extends Screen {
@Unique
private static final Identifier MORE_SLOTS = new Identifier("trinkets", "textures/gui/more_slots.png");
@Unique
private static final Identifier BLANK_BACK = new Identifier("trinkets", "textures/gui/blank_back.png");

private HandledScreenMixin() {
super(null);
}

@Inject(at = @At("HEAD"), method = "removed")
private void removed(CallbackInfo info) {
if ((Object)this instanceof InventoryScreen) {
TrinketScreenManager.removeSelections();
}
}

@Inject(at = @At(value = "INVOKE", target = "net/minecraft/client/util/math/MatrixStack.translate(FFF)V"),
method = "drawSlot")
private void changeZ(DrawContext context, Slot slot, CallbackInfo info) {
// Items are drawn at z + 150 (normal items are drawn at 250)
// Item tooltips (count, item bar) are drawn at z + 200 (normal itmes are drawn at 300)
// Inventory tooltip is drawn at 400
if (slot instanceof TrinketSlot ts) {
assert this.client != null;
Identifier slotTextureId = ts.getBackgroundIdentifier();

if (!slot.getStack().isEmpty() || slotTextureId == null) {
slotTextureId = BLANK_BACK;
}

RenderSystem.enableDepthTest();

if (ts.isTrinketFocused()) {
// Thus, I need to draw trinket slot backs over normal items at z 300 (310 was chosen)
context.drawTexture(slotTextureId, slot.x, slot.y, 310, 0, 0, 16, 16, 16, 16);
// I also need to draw items in trinket slots *above* 310 but *below* 400, (320 for items and 370 for tooltips was chosen)
context.getMatrices().translate(0, 0, 70);
} else {
context.drawTexture(slotTextureId, slot.x, slot.y, 0, 0, 0, 16, 16, 16, 16);
context.drawTexture(MORE_SLOTS, slot.x - 1, slot.y - 1, 0, 4, 4, 18, 18, 256, 256);
}
}
if (TrinketsClient.activeGroup != null && TrinketsClient.activeGroup.getSlotId() == slot.id) {
context.getMatrices().translate(0, 0, 70);
}

}

@Inject(at = @At("HEAD"), method = "isPointOverSlot", cancellable = true)
private void isPointOverSlot(Slot slot, double pointX, double pointY, CallbackInfoReturnable<Boolean> info) {
if (TrinketsClient.activeGroup != null) {
if (slot instanceof TrinketSlot ts) {
if (!ts.isTrinketFocused()) {
info.setReturnValue(false);
}
} else {
if (slot instanceof CreativeSlot cs) {
if (((CreativeSlotAccessor) cs).getSlot().id != TrinketsClient.activeGroup.getSlotId()) {
info.setReturnValue(false);
}
} else if (slot.id != TrinketsClient.activeGroup.getSlotId()) {
info.setReturnValue(false);
}
}
}
}
}
98 changes: 98 additions & 0 deletions src/main/java/dev/emi/trinkets/mixin/InventoryScreenMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package dev.emi.trinkets.mixin;

import net.minecraft.client.gui.DrawContext;
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 dev.emi.trinkets.Point;
import dev.emi.trinkets.TrinketPlayerScreenHandler;
import dev.emi.trinkets.TrinketScreen;
import dev.emi.trinkets.TrinketScreenManager;
import dev.emi.trinkets.api.SlotGroup;
import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Rect2i;
import net.minecraft.screen.PlayerScreenHandler;
import net.minecraft.screen.slot.Slot;

/**
* Delegates drawing and slot group selection logic
*
* @author Emi
*/
@Mixin(InventoryScreen.class)
public abstract class InventoryScreenMixin extends AbstractInventoryScreen<PlayerScreenHandler> implements RecipeBookProvider, TrinketScreen {

private InventoryScreenMixin() { super(null, null, null); }

@Inject(at = @At("HEAD"), method = "init")
private void init(CallbackInfo info) {
TrinketScreenManager.init(this);
}

@Inject(at = @At("TAIL"), method = "handledScreenTick")
private void tick(CallbackInfo info) {
TrinketScreenManager.tick();
}

@Inject(at = @At("HEAD"), method = "render")
private void render(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo info) {
TrinketScreenManager.update(mouseX, mouseY);
}

@Inject(at = @At("RETURN"), method = "drawBackground")
private void drawBackground(DrawContext context, float delta, int mouseX, int mouseY, CallbackInfo info) {
TrinketScreenManager.drawExtraGroups(context);
}

@Inject(at = @At("TAIL"), method = "drawForeground")
private void drawForeground(DrawContext context, int mouseX, int mouseY, CallbackInfo info) {
TrinketScreenManager.drawActiveGroup(context);
}

@Inject(at = @At("HEAD"), method = "isClickOutsideBounds", cancellable = true)
private void isClickOutsideBounds(double mouseX, double mouseY, int left, int top, int button, CallbackInfoReturnable<Boolean> info) {
if (TrinketScreenManager.isClickInsideTrinketBounds(mouseX, mouseY)) {
info.setReturnValue(false);
}
}

@Override
public TrinketPlayerScreenHandler trinkets$getHandler() {
return (TrinketPlayerScreenHandler) this.handler;
}

@Override
public Rect2i trinkets$getGroupRect(SlotGroup group) {
Point pos = ((TrinketPlayerScreenHandler) handler).trinkets$getGroupPos(group);
if (pos != null) {
return new Rect2i(pos.x() - 1, pos.y() - 1, 17, 17);
}
return new Rect2i(0, 0, 0, 0);
}

@Override
public Slot trinkets$getFocusedSlot() {
return this.focusedSlot;
}

@Override
public int trinkets$getX() {
return this.x;
}

@Override
public int trinkets$getY() {
return this.y;
}

@Override
public boolean trinkets$isRecipeBookOpen() {
return this.getRecipeBookWidget().isOpen();
}
}
6 changes: 3 additions & 3 deletions src/main/java/dev/emi/trinkets/mixin/LivingEntityMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private void canFreeze(CallbackInfoReturnable<Boolean> cir) {
private void dropInventory(CallbackInfo info) {
LivingEntity entity = (LivingEntity) (Object) this;

boolean keepInv = entity.world.getGameRules().getBoolean(GameRules.KEEP_INVENTORY);
boolean keepInv = entity.getWorld().getGameRules().getBoolean(GameRules.KEEP_INVENTORY);
TrinketsApi.getTrinketComponent(entity).ifPresent(trinkets -> trinkets.forEach((ref, stack) -> {
if (stack.isEmpty()) {
return;
Expand Down Expand Up @@ -150,7 +150,7 @@ private void tick(CallbackInfo info) {

if (!ItemStack.areEqual(newStack, oldStack)) {

if (!this.world.isClient) {
if (!this.getWorld().isClient) {
contentUpdates.put(newRef, copy);
UUID uuid = SlotAttributes.getUuid(ref);

Expand Down Expand Up @@ -191,7 +191,7 @@ private void tick(CallbackInfo info) {
}
}

if (!newStack.isItemEqual(oldStack)) {
if (!ItemStack.areItemsEqual(oldStack, newStack)) {
TrinketsApi.getTrinket(oldStack.getItem()).onUnequip(oldStack, ref, entity);
TrinketsApi.getTrinket(newStack.getItem()).onEquip(newStack, ref, entity);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package dev.emi.trinkets.mixin;

import dev.emi.trinkets.TrinketFeatureRenderer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.feature.FeatureRenderer;
import net.minecraft.client.render.entity.model.EntityModel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

/**
* Adds the trinket feature renderer to the list of living entity features
*
* @author C4
* @author powerboat9
*/
@Environment(EnvType.CLIENT)
@Mixin(LivingEntityRenderer.class)
public abstract class LivingEntityRendererMixin {
@Invoker("addFeature")
public abstract boolean invokeAddFeature(FeatureRenderer<?, ?> feature);

@Inject(at = @At("RETURN"), method = "<init>")
public void init(EntityRendererFactory.Context ctx, EntityModel<?> model, float shadowRadius, CallbackInfo info) {
this.invokeAddFeature(new TrinketFeatureRenderer<>((LivingEntityRenderer<?, ?>) (Object) this));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"entities": ["player"],
"entities": ["player", "zombie"],
"slots": [
"hand/glove",
"hand/ring",
Expand Down

0 comments on commit f8fd416

Please sign in to comment.