Skip to content

Commit

Permalink
Fixed crash and shadow food breaking
Browse files Browse the repository at this point in the history
  • Loading branch information
mattymatty97 committed Dec 3, 2023
1 parent 78f91c0 commit 5e7f3df
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 14 deletions.
9 changes: 8 additions & 1 deletion src/main/java/com/carpet_shadow/Globals.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package com.carpet_shadow;

import com.carpet_shadow.interfaces.ShadowItem;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
import com.sun.jna.platform.win32.WinDef;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Globals {

public static final Set<Thread> mergingThreads = new HashSet<>();

public static final Set<Inventory> toUpdate = new HashSet<>();

public static ItemStack getByIdOrNull(String shadow_id) {
Expand All @@ -28,7 +35,7 @@ public static ItemStack getByIdOrAdd(String shadow_id, ItemStack stack) {


public static boolean shadow_merge_check(ItemStack stack1, ItemStack stack2, boolean ret) {
if (CarpetShadowSettings.shadowItemInventoryFragilityFix && ret) {
if (CarpetShadowSettings.shadowItemInventoryFragilityFix && mergingThreads.contains(Thread.currentThread()) && ret) {
String shadow1 = ((ShadowItem) (Object) stack1).carpet_shadow$getShadowId();
String shadow2 = ((ShadowItem) (Object) stack2).carpet_shadow$getShadowId();
if (CarpetShadowSettings.shadowItemPreventCombine) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import net.minecraft.registry.DynamicRegistryManager;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -40,7 +41,7 @@ public boolean matches(RecipeInputInventory inventory, World world) {
for(int i = 0; i < inventory.size(); ++i) {
ItemStack itemStack2 = inventory.getStack(i);
if (!itemStack2.isEmpty()) {
if (itemStack2.getItem().equals(Items.ENDER_CHEST) && itemStack2.getCount() == 1)
if (itemStack2.getItem().equals(Items.ENDER_CHEST))
enderchest = true;
count++;
}
Expand All @@ -58,25 +59,46 @@ public ItemStack craft(RecipeInputInventory inventory, DynamicRegistryManager re
for(int i = 0; i < inventory.size(); ++i) {
ItemStack itemStack2 = inventory.getStack(i);
if (!itemStack2.isEmpty()) {
if (itemStack2.getItem().equals(Items.ENDER_CHEST) && itemStack2.getCount() == 1 && enderchest == null)
if (itemStack2.getItem().equals(Items.ENDER_CHEST)) {
if (enderchest != null)
item = enderchest;
enderchest = itemStack2;
else
}else
item = itemStack2;
}
}
if (item==null || enderchest==null)
return ItemStack.EMPTY;

if (item.getItem().equals(Items.ENDER_CHEST) && item.getCount()==1){
item = enderchest;
}
String id = ((ShadowItem)(Object)item).carpet_shadow$getShadowId();
if (id == null){
id = CarpetShadow.shadow_id_generator.nextString();
}
return Globals.getByIdOrAdd(id, item);
}

@Override
public DefaultedList<ItemStack> getRemainder(RecipeInputInventory inventory) {
ItemStack item = null;
ItemStack enderchest = null;
for(int i = 0; i < inventory.size(); ++i) {
ItemStack itemStack2 = inventory.getStack(i);
if (!itemStack2.isEmpty()) {
if (itemStack2.getItem().equals(Items.ENDER_CHEST)) {
if (enderchest != null)
item = enderchest;
enderchest = itemStack2;
}else
item = itemStack2;
}
}

if (item != null && enderchest != null)
item.setCount(item.getCount() + 1);

return super.getRemainder(inventory);
}

@Override
public boolean fits(int width, int height) {
if (CarpetShadowSettings.shadowItemMode== CarpetShadowSettings.Mode.UNLINK || !CarpetShadowSettings.shadowCraftingGeneration)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
Expand All @@ -29,7 +31,10 @@ private static ItemStack redirect_copy(ItemStack stack, int count, Operation<Ite

@ModifyReturnValue(method = "canMerge(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z", at = @At("RETURN"))
private static boolean canMerge(boolean original, ItemStack stack1, ItemStack stack2) {
return Globals.shadow_merge_check(stack1, stack2, original);
Globals.mergingThreads.add(Thread.currentThread());
boolean ret = Globals.shadow_merge_check(stack1, stack2, original);
Globals.mergingThreads.remove(Thread.currentThread());
return ret;
}

@Inject(method = "onPlayerCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ItemEntity;getStack()Lnet/minecraft/item/ItemStack;", shift = At.Shift.BY, by = 2))
Expand All @@ -42,4 +47,13 @@ public void resetEntityForStack(PlayerEntity player, CallbackInfo ci, @Local(ord
((ItemEntitySlot) (Object) stack).carpet_shadow$setEntity(null);
}

@Inject(method = "onPlayerCollision", at = @At("HEAD"))
private void merging_start(PlayerEntity player, CallbackInfo ci){
Globals.mergingThreads.add(Thread.currentThread());
}
@Inject(method = "onPlayerCollision", at = @At("RETURN"))
private void merging_end(PlayerEntity player, CallbackInfo ci){
Globals.mergingThreads.remove(Thread.currentThread());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.carpet_shadow.interfaces.ShadowItem;
import com.carpet_shadow.interfaces.ShifingItem;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
import net.minecraft.entity.ItemEntity;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,29 @@
import net.minecraft.item.ItemStack;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import org.jetbrains.annotations.Nullable;
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.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ScreenHandler.class)
public abstract class ScreenHandlerMixin {

@Shadow
public static boolean canInsertItemIntoSlot(@Nullable Slot slot, ItemStack stack, boolean allowOverflow) {
return false;
public abstract ItemStack getCursorStack();

@Inject(method = "internalOnSlotClick", at = @At("HEAD"))
public void merging_start(int slotIndex, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci){
Globals.mergingThreads.add(Thread.currentThread());
}

@Shadow
public abstract ItemStack getCursorStack();
@Inject(method = "internalOnSlotClick", at = @At("RETURN"))
public void merging_end(int slotIndex, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci){
Globals.mergingThreads.remove(Thread.currentThread());
}

@WrapOperation(method = "internalOnSlotClick", slice = @Slice(
from = @At(value = "INVOKE", target = "Lnet/minecraft/screen/slot/Slot;canTakeItems(Lnet/minecraft/entity/player/PlayerEntity;)Z", ordinal = 1)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import com.google.common.base.Suppliers;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.ScreenHandler;
import org.spongepowered.asm.mixin.Mixin;
Expand Down
1 change: 0 additions & 1 deletion src/main/resources/carpet-shadow.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
"general.ItemStackMixin",
"general.LootTableMixin",
"general.ScreenHandlerMixin",
"general.SlotMixin",
"hand_update_fix.ServerPlayerInteractionManagerMixin",
"inv_updates.ItemStackMixin",
"inv_updates.MinecraftServerMixin",
Expand Down

0 comments on commit 5e7f3df

Please sign in to comment.