Skip to content

Commit

Permalink
Add Steal Screens
Browse files Browse the repository at this point in the history
  • Loading branch information
hexadecimal233 authored and arlomcwalter committed Jan 28, 2023
1 parent a5cf719 commit 62b5880
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public DefaultSettingsWidgetFactory(GuiTheme theme) {
factories.put(StatusEffectAmplifierMapSetting.class, (table, setting) -> statusEffectAmplifierMapW(table, (StatusEffectAmplifierMapSetting) setting));
factories.put(StatusEffectListSetting.class, (table, setting) -> statusEffectListW(table, (StatusEffectListSetting) setting));
factories.put(StorageBlockListSetting.class, (table, setting) -> storageBlockListW(table, (StorageBlockListSetting) setting));
factories.put(ScreenHandlerListSetting.class, (table, setting) -> screenHandlerListW(table, (ScreenHandlerListSetting) setting));
factories.put(BlockDataSetting.class, (table, setting) -> blockDataW(table, (BlockDataSetting<?>) setting));
factories.put(PotionSetting.class, (table, setting) -> potionW(table, (PotionSetting) setting));
factories.put(StringListSetting.class, (table, setting) -> stringListW(table, (StringListSetting) setting));
Expand Down Expand Up @@ -325,6 +326,10 @@ private void storageBlockListW(WTable table, StorageBlockListSetting setting) {
selectW(table, setting, () -> mc.setScreen(new StorageBlockListSettingScreen(theme, setting)));
}

private void screenHandlerListW(WTable table, ScreenHandlerListSetting setting) {
selectW(table, setting, () -> mc.setScreen(new ScreenHandlerSettingScreen(theme, setting)));
}

private void blockDataW(WTable table, BlockDataSetting<?> setting) {
WButton button = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().widget();
button.action = () -> mc.setScreen(new BlockDataSettingScreen(theme, setting));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.gui.screens.settings;

import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.widgets.WWidget;
import meteordevelopment.meteorclient.settings.Setting;
import net.minecraft.registry.Registries;
import net.minecraft.screen.ScreenHandlerType;

import java.util.List;

public class ScreenHandlerSettingScreen extends LeftRightListSettingScreen<ScreenHandlerType<?>> {
public ScreenHandlerSettingScreen(GuiTheme theme, Setting<List<ScreenHandlerType<?>>> setting) {
super(theme, "Select Screen Handlers", setting, setting.get(), Registries.SCREEN_HANDLER);
}

@Override
protected WWidget getValueWidget(ScreenHandlerType<?> value) {
return theme.label(getValueName(value));
}

@Override
protected String getValueName(ScreenHandlerType<?> type) {
return Registries.SCREEN_HANDLER.getId(type).toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import org.lwjgl.glfw.GLFW;
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;
Expand Down Expand Up @@ -58,7 +57,7 @@ public HandledScreenMixin(Text title) {
private void onInit(CallbackInfo info) {
InventoryTweaks invTweaks = Modules.get().get(InventoryTweaks.class);

if (invTweaks.isActive() && invTweaks.showButtons()) {
if (invTweaks.canSteal(getScreenHandler())&& invTweaks.isActive() && invTweaks.showButtons()) {
addDrawableChild(
new ButtonWidget.Builder(Text.literal("Steal"), button -> invTweaks.steal(getScreenHandler()))
.position(width / 2 - 40, 3)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.settings;

import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import net.minecraft.nbt.NbtString;
import net.minecraft.registry.Registries;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.util.Identifier;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ScreenHandlerListSetting extends Setting<List<ScreenHandlerType<?>>> {
public ScreenHandlerListSetting(String name, String description, List<ScreenHandlerType<?>> defaultValue, Consumer<List<ScreenHandlerType<?>>> onChanged, Consumer<Setting<List<ScreenHandlerType<?>>>> onModuleActivated, IVisible visible) {
super(name, description, defaultValue, onChanged, onModuleActivated, visible);
}

@Override
public void resetImpl() {
value = new ArrayList<>(defaultValue);
}

@Override
protected List<ScreenHandlerType<?>> parseImpl(String str) {
String[] values = str.split(",");
List<ScreenHandlerType<?>> handlers = new ArrayList<>(values.length);

try {
for (String value : values) {
ScreenHandlerType<?> handler = parseId(Registries.SCREEN_HANDLER, value);
if (handler != null) handlers.add(handler);
}
} catch (Exception ignored) {
}

return handlers;
}

@Override
protected boolean isValueValid(List<ScreenHandlerType<?>> value) {
return true;
}

@Override
public Iterable<Identifier> getIdentifierSuggestions() {
return Registries.SCREEN_HANDLER.getIds();
}

@Override
public NbtCompound save(NbtCompound tag) {
NbtList valueTag = new NbtList();
for (ScreenHandlerType<?> type : get()) {
Identifier id = Registries.SCREEN_HANDLER.getId(type);
if (id != null) valueTag.add(NbtString.of(id.toString()));
}
tag.put("value", valueTag);

return tag;
}

@Override
public List<ScreenHandlerType<?>> load(NbtCompound tag) {
get().clear();

NbtList valueTag = tag.getList("value", 8);
for (NbtElement tagI : valueTag) {
ScreenHandlerType<?> type = Registries.SCREEN_HANDLER.get(new Identifier(tagI.asString()));
if (type != null) get().add(type);
}

return get();
}

public static class Builder extends SettingBuilder<Builder, List<ScreenHandlerType<?>>, ScreenHandlerListSetting> {
public Builder() {
super(new ArrayList<>(0));
}

public Builder defaultValue(ScreenHandlerType<?>... defaults) {
return defaultValue(defaults != null ? Arrays.asList(defaults) : new ArrayList<>());
}

@Override
public ScreenHandlerListSetting build() {
return new ScreenHandlerListSetting(name, description, defaultValue, onChanged, onModuleActivated, visible);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@
import net.minecraft.item.Wearable;
import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import org.lwjgl.glfw.GLFW;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

Expand Down Expand Up @@ -140,6 +142,13 @@ public class InventoryTweaks extends Module {

// Steal & Dump

public final Setting<List<ScreenHandlerType<?>>> stealScreens = sgStealDump.add(new ScreenHandlerListSetting.Builder()
.name("steal-screens")
.description("Select the screens to display buttons and auto steal.")
.defaultValue(Arrays.asList(ScreenHandlerType.GENERIC_9X3, ScreenHandlerType.GENERIC_9X6))
.build()
);

private final Setting<Boolean> buttons = sgStealDump.add(new BoolSetting.Builder()
.name("inventory-buttons")
.description("Shows steal and dump buttons in container guis.")
Expand Down Expand Up @@ -429,11 +438,11 @@ private void moveSlots(ScreenHandler handler, int start, int end, boolean steal)
}

public void steal(ScreenHandler handler) {
MeteorExecutor.execute(() -> moveSlots(handler, 0, SlotUtils.indexToId(SlotUtils.MAIN_START, handler), true));
MeteorExecutor.execute(() -> moveSlots(handler, 0, SlotUtils.indexToId(SlotUtils.MAIN_START), true));
}

public void dump(ScreenHandler handler) {
int playerInvOffset = SlotUtils.indexToId(SlotUtils.MAIN_START, handler);
int playerInvOffset = SlotUtils.indexToId(SlotUtils.MAIN_START);
MeteorExecutor.execute(() -> moveSlots(handler, playerInvOffset, playerInvOffset + 4 * 9, false));
}

Expand All @@ -453,10 +462,18 @@ public boolean armorSwap() {
return isActive() && armorSwap.get();
}

public boolean canSteal(ScreenHandler handler) {
try {
return (stealScreens.get().contains(handler.getType()));
} catch (UnsupportedClassVersionError e) {
return false;
}
}

@EventHandler
private void onInventory(InventoryEvent event) {
ScreenHandler handler = mc.player.currentScreenHandler;
if (event.packet.getSyncId() == handler.syncId) {
if (canSteal(handler) && event.packet.getSyncId() == handler.syncId) {
if (autoSteal.get()) {
steal(handler);
} else if (autoDump.get()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,8 @@ public class SlotUtils {

public static int indexToId(int i) {
if (mc.player == null) return -1;
return indexToId(i, mc.player.currentScreenHandler);
}
ScreenHandler handler = mc.player.currentScreenHandler;

public static int indexToId(int i, ScreenHandler handler) {
if (handler instanceof PlayerScreenHandler) return survivalInventory(i);
else if (handler instanceof CreativeInventoryScreen.CreativeScreenHandler) return creativeInventory(i);
else if (handler instanceof GenericContainerScreenHandler) return genericContainer(i, ((GenericContainerScreenHandler) handler).getRows());
Expand Down

0 comments on commit 62b5880

Please sign in to comment.