Merge branch 'master' into future

This commit is contained in:
gnembon committed 2022-01-12 22:53:45 +01:00
commit 74f6e57edc
12 files changed
+931 -5

No files matched your search

@@ -0,0 +1,19 @@
package carpet.mixins;
import carpet.fakes.ScreenHandlerInterface;
import net.minecraft.recipe.Recipe;
import net.minecraft.screen.AbstractRecipeScreenHandler;
import net.minecraft.server.network.ServerPlayerEntity;
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;
@Mixin(AbstractRecipeScreenHandler.class)
public class AbstractRecipeScreenHandler_scarpetMixin {
@Inject(method = "fillInputSlots",at = @At("HEAD"), cancellable = true)
private void selectRecipeCallback(boolean craftAll, Recipe<?> recipe, ServerPlayerEntity player, CallbackInfo ci) {
if(((ScreenHandlerInterface) this).callSelectRecipeListener(player,recipe,craftAll))
ci.cancel();
}
}
@@ -0,0 +1,29 @@
package carpet.mixins;
import carpet.fakes.ScreenHandlerInterface;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.screen.EnchantmentScreenHandler;
import net.minecraft.screen.LecternScreenHandler;
import net.minecraft.screen.LoomScreenHandler;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.StonecutterScreenHandler;
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;
//classes that override onButtonClick
@Mixin({EnchantmentScreenHandler.class, LecternScreenHandler.class, LoomScreenHandler.class, StonecutterScreenHandler.class})
public abstract class ScreenHandlerSubclasses_scarpetMixin extends ScreenHandler {
protected ScreenHandlerSubclasses_scarpetMixin(ScreenHandlerType<?> type, int syncId) {
super(type, syncId);
}
@Inject(method = "onButtonClick", at = @At("HEAD"), cancellable = true)
private void buttonClickCallback(PlayerEntity player, int id, CallbackInfoReturnable<Boolean> cir) {
if(((ScreenHandlerInterface) this).callButtonClickListener(id,player))
cir.cancel();
}
}
@@ -0,0 +1,79 @@
package carpet.mixins;
import carpet.fakes.ScreenHandlerInterface;
import carpet.script.value.ScreenValue;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.recipe.Recipe;
import net.minecraft.screen.Property;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ScreenHandlerListener;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.server.network.ServerPlayerEntity;
import org.spongepowered.asm.mixin.Final;
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.callback.CallbackInfo;
import java.util.List;
@Mixin(ScreenHandler.class)
public abstract class ScreenHandler_scarpetMixin implements ScreenHandlerInterface
{
@Shadow @Final private List<ScreenHandlerListener> listeners;
@Shadow public abstract void syncState();
@Shadow @Final private List<Property> properties;
@Inject(method = "internalOnSlotClick", at = @At("HEAD"), cancellable = true)
private void callSlotClickListener(int slotIndex, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo ci) {
if(!(player instanceof ServerPlayerEntity serverPlayerEntity)) return;
for(ScreenHandlerListener screenHandlerListener : this.listeners) {
if(screenHandlerListener instanceof ScreenValue.ScarpetScreenHandlerListener scarpetScreenHandlerListener) {
if(scarpetScreenHandlerListener.onSlotClick(serverPlayerEntity, actionType, slotIndex, button)) {
ci.cancel();
syncState();
}
}
}
}
@Inject(method = "close", at = @At("HEAD"), cancellable = true)
private void callCloseListener(PlayerEntity player, CallbackInfo ci) {
if(!(player instanceof ServerPlayerEntity serverPlayerEntity)) return;
for(ScreenHandlerListener screenHandlerListener : this.listeners) {
if(screenHandlerListener instanceof ScreenValue.ScarpetScreenHandlerListener scarpetScreenHandlerListener) {
scarpetScreenHandlerListener.onClose(serverPlayerEntity);
}
}
}
@Override
public boolean callButtonClickListener(int button, PlayerEntity player) {
if(!(player instanceof ServerPlayerEntity serverPlayerEntity)) return false;
for(ScreenHandlerListener screenHandlerListener : listeners) {
if(screenHandlerListener instanceof ScreenValue.ScarpetScreenHandlerListener scarpetScreenHandlerListener) {
if(scarpetScreenHandlerListener.onButtonClick(serverPlayerEntity, button))
return true;
}
}
return false;
}
@Override
public boolean callSelectRecipeListener(ServerPlayerEntity player, Recipe<?> recipe, boolean craftAll) {
for(ScreenHandlerListener screenHandlerListener : listeners) {
if(screenHandlerListener instanceof ScreenValue.ScarpetScreenHandlerListener scarpetScreenHandlerListener) {
if(scarpetScreenHandlerListener.onSelectRecipe(player, recipe, craftAll))
return true;
}
}
return false;
}
@Override
public Property getProperty(int index) {
return this.properties.get(index);
}
}