fix: GuiMove now works, I dug way more...

This commit is contained in:
əlemi 2023-03-11 18:08:42 +01:00
parent c55013ffcd
commit 2fd25d4709
Signed by: alemi
GPG key ID: A4895B84D311642C

View file

@ -5,44 +5,86 @@ import com.google.auto.service.AutoService;
import ftbsc.bscv.ICommons;
import ftbsc.bscv.api.ILoadable;
import ftbsc.bscv.modules.AbstractModule;
import net.minecraft.client.gui.advancements.AdvancementsScreen;
import net.minecraft.client.gui.screen.CustomizeSkinScreen;
import net.minecraft.client.gui.screen.IngameMenuScreen;
import net.minecraft.client.gui.screen.OptionsScreen;
import net.minecraft.client.gui.screen.OptionsSoundsScreen;
import net.minecraft.client.gui.screen.VideoSettingsScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.client.util.InputMappings;
import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.client.event.InputUpdateEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.client.gui.screen.ModListScreen;
@AutoService(ILoadable.class)
public class GuiMove extends AbstractModule implements ICommons {
private boolean once = false;
private boolean isKeyDown(KeyBinding key) {
return InputMappings.isKeyDown(MC.getWindow().getWindow(), key.getKey().getValue());
}
private KeyBinding[] keys = {
MC.options.keyUp,
MC.options.keyDown,
MC.options.keyLeft,
MC.options.keyRight,
MC.options.keyJump,
};
private Class<?>[] screens = {
ContainerScreen.class,
OptionsScreen.class,
OptionsSoundsScreen.class,
IngameMenuScreen.class,
AdvancementsScreen.class,
ModListScreen.class,
CustomizeSkinScreen.class,
};
private void forceMovementTick() {
// TODO can we patch to make this always happen instead of duplicating code?
MC.player.input.up = this.isKeyDown(MC.options.keyUp);
MC.player.input.down = this.isKeyDown(MC.options.keyDown);
MC.player.input.left = this.isKeyDown(MC.options.keyLeft);
MC.player.input.right = this.isKeyDown(MC.options.keyRight);
MC.player.input.jumping = this.isKeyDown(MC.options.keyJump);
MC.player.input.shiftKeyDown = this.isKeyDown(MC.options.keyShift);
MC.player.input.forwardImpulse = MC.player.input.up == MC.player.input.down ? 0.0F : (MC.player.input.up ? 1.0F : -1.0F);
MC.player.input.leftImpulse = MC.player.input.left == MC.player.input.right ? 0.0F : (MC.player.input.left ? 1.0F : -1.0F);
}
private boolean allowMovementOnThisScreen(Screen screen) {
for (Class<?> clazz : this.screens) {
if (clazz.isInstance(screen)) {
return true;
}
}
return false;
}
@SubscribeEvent
public void onPlayerUpdate(LivingEvent.LivingUpdateEvent event) {
public void onInputUpdate(InputUpdateEvent event) {
if (MC.player == null) return;
if (event.getEntityLiving() != MC.player) return;
KeyBinding[] keys = {
MC.options.keyUp,
MC.options.keyDown,
MC.options.keyLeft,
MC.options.keyRight,
MC.options.keyJump,
};
if (
MC.screen instanceof ContainerScreen
|| MC.screen instanceof OptionsScreen
|| MC.screen instanceof VideoSettingsScreen
|| MC.screen instanceof OptionsSoundsScreen
|| MC.screen instanceof IngameMenuScreen
) {
for (KeyBinding key : keys) {
if (this.allowMovementOnThisScreen(MC.screen)) {
once = true;
for (KeyBinding key : this.keys) {
boolean state = InputMappings.isKeyDown(MC.getWindow().getWindow(), key.getKey().getValue());
KeyBinding.set(key.getKey(), state);
key.setDown(state);
if (state ^ key.isDown()) {
KeyBinding.set(key.getKey(), state);
key.setDown(state);
}
}
this.forceMovementTick();
} else if (once) { // release all keys once we leave the screen
once = false;
KeyBinding.releaseAll(); // TODO maybe only release movement keys?
}
}