Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/events/MinecraftTicker.java

442 lines
11 KiB
Java
Executable File

package eu.crushedpixel.replaymod.events;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiChat;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.crash.CrashReport;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.play.client.C16PacketClientStatus;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ReportedException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import eu.crushedpixel.replaymod.entities.CameraEntity;
import eu.crushedpixel.replaymod.reflection.MCPNames;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
public class MinecraftTicker {
private static Field debugCrashKeyPressTime, rightClickDelayTimer, systemTime, leftClickCounter;
private static Method getSystemTime, updateDebugProfilerName,
clickMouse, middleClickMouse, rightClickMouse, sendClickBlockToController;
private static Minecraft mc = Minecraft.getMinecraft();
private static float camPitch, camYaw, smoothCamPartialTicks,
smoothCamFilterX, smoothCamFilterY;
static {
try {
debugCrashKeyPressTime = Minecraft.class.getDeclaredField(MCPNames.field("field_83002_am"));
debugCrashKeyPressTime.setAccessible(true);
rightClickDelayTimer = Minecraft.class.getDeclaredField(MCPNames.field("field_71467_ac"));
rightClickDelayTimer.setAccessible(true);
systemTime = Minecraft.class.getDeclaredField(MCPNames.field("field_71423_H"));
systemTime.setAccessible(true);
leftClickCounter = Minecraft.class.getDeclaredField(MCPNames.field("field_71429_W"));
leftClickCounter.setAccessible(true);
getSystemTime = Minecraft.class.getDeclaredMethod(MCPNames.method("func_71386_F"));
getSystemTime.setAccessible(true);
updateDebugProfilerName = Minecraft.class.getDeclaredMethod(MCPNames.method("func_71383_b"), int.class);
updateDebugProfilerName.setAccessible(true);
clickMouse = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147116_af"));
clickMouse.setAccessible(true);
rightClickMouse = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147121_ag"));
rightClickMouse.setAccessible(true);
middleClickMouse = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147112_ai"));
middleClickMouse.setAccessible(true);
sendClickBlockToController = Minecraft.class.getDeclaredMethod(MCPNames.method("func_147115_a"), boolean.class);
sendClickBlockToController.setAccessible(true);
} catch(Exception e) {
e.printStackTrace();
}
}
public static void runMouseKeyboardTick(Minecraft mc) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
if(mc.thePlayer == null) return;
try {
mc.mcProfiler.endStartSection("mouse");
int i;
while(Mouse.next()) {
i = Mouse.getEventButton();
KeyBinding.setKeyBindState(i - 100, Mouse.getEventButtonState());
if (Mouse.getEventButtonState())
{
if (mc.thePlayer.isSpectator() && i == 2)
{
mc.ingameGUI.func_175187_g().func_175261_b();
}
else
{
KeyBinding.onTick(i - 100);
}
}
long k = (Long)getSystemTime.invoke(mc) - (Long)systemTime.get(mc);
if (k <= 200L)
{
int j = Mouse.getEventDWheel();
if (j != 0)
{
if (mc.thePlayer.isSpectator())
{
j = j < 0 ? -1 : 1;
if (mc.ingameGUI.func_175187_g().func_175262_a())
{
mc.ingameGUI.func_175187_g().func_175259_b(-j);
}
else
{
float f = MathHelper.clamp_float(mc.thePlayer.capabilities.getFlySpeed() + (float)j * 0.005F, 0.0F, 0.2F);
mc.thePlayer.capabilities.setFlySpeed(f);
}
}
else
{
mc.thePlayer.inventory.changeCurrentItem(j);
}
}
if (mc.currentScreen == null)
{
if (!mc.inGameHasFocus && Mouse.getEventButtonState())
{
mc.setIngameFocus();
}
}
else
{
mc.currentScreen.handleMouseInput();
}
}
net.minecraftforge.fml.common.FMLCommonHandler.instance().fireMouseInput();
}
if ((Integer)leftClickCounter.get(mc) > 0)
{
leftClickCounter.set(mc, (Integer)leftClickCounter.get(mc) - 1);
}
mc.mcProfiler.endStartSection("keyboard");
while (Keyboard.next())
{
i = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
KeyBinding.setKeyBindState(i, Keyboard.getEventKeyState());
if (Keyboard.getEventKeyState())
{
KeyBinding.onTick(i);
}
if ((Long)debugCrashKeyPressTime.get(mc) > 0L)
{
if ((Long)getSystemTime.invoke(mc) - (Long)debugCrashKeyPressTime.get(mc) >= 6000L)
{
throw new ReportedException(new CrashReport("Manually triggered debug crash", new Throwable()));
}
if (!Keyboard.isKeyDown(46) || !Keyboard.isKeyDown(61))
{
debugCrashKeyPressTime.set(mc, -1);
}
}
else if (Keyboard.isKeyDown(46) && Keyboard.isKeyDown(61))
{
debugCrashKeyPressTime.set(mc, getSystemTime.invoke(mc));
}
mc.dispatchKeypresses();
if (Keyboard.getEventKeyState())
{
if (i == 62 && mc.entityRenderer != null)
{
mc.entityRenderer.switchUseShader();
}
if (mc.currentScreen != null)
{
mc.currentScreen.handleKeyboardInput();
}
else
{
if (i == 1)
{
mc.displayInGameMenu();
}
if (i == 32 && Keyboard.isKeyDown(61) && mc.ingameGUI != null)
{
mc.ingameGUI.getChatGUI().clearChatMessages();
}
if (i == 31 && Keyboard.isKeyDown(61))
{
mc.refreshResources();
}
if (i == 17 && Keyboard.isKeyDown(61))
{
;
}
if (i == 18 && Keyboard.isKeyDown(61))
{
;
}
if (i == 47 && Keyboard.isKeyDown(61))
{
;
}
if (i == 38 && Keyboard.isKeyDown(61))
{
;
}
if (i == 22 && Keyboard.isKeyDown(61))
{
;
}
if (i == 20 && Keyboard.isKeyDown(61))
{
mc.refreshResources();
}
if (i == 33 && Keyboard.isKeyDown(61))
{
boolean flag1 = Keyboard.isKeyDown(42) | Keyboard.isKeyDown(54);
mc.gameSettings.setOptionValue(GameSettings.Options.RENDER_DISTANCE, flag1 ? -1 : 1);
}
if (i == 30 && Keyboard.isKeyDown(61))
{
mc.renderGlobal.loadRenderers();
}
if (i == 35 && Keyboard.isKeyDown(61))
{
mc.gameSettings.advancedItemTooltips = !mc.gameSettings.advancedItemTooltips;
mc.gameSettings.saveOptions();
}
if (i == 48 && Keyboard.isKeyDown(61))
{
mc.getRenderManager().setDebugBoundingBox(!mc.getRenderManager().isDebugBoundingBox());
}
if (i == 25 && Keyboard.isKeyDown(61))
{
mc.gameSettings.pauseOnLostFocus = !mc.gameSettings.pauseOnLostFocus;
mc.gameSettings.saveOptions();
}
if (i == 59)
{
mc.gameSettings.hideGUI = !mc.gameSettings.hideGUI;
}
if (i == 61)
{
mc.gameSettings.showDebugInfo = !mc.gameSettings.showDebugInfo;
mc.gameSettings.showDebugProfilerChart = GuiScreen.isShiftKeyDown();
}
if (mc.gameSettings.keyBindTogglePerspective.isPressed())
{
++mc.gameSettings.thirdPersonView;
if (mc.gameSettings.thirdPersonView > 2)
{
mc.gameSettings.thirdPersonView = 0;
}
if (mc.gameSettings.thirdPersonView == 0)
{
mc.entityRenderer.loadEntityShader(mc.getRenderViewEntity());
}
else if (mc.gameSettings.thirdPersonView == 1)
{
mc.entityRenderer.loadEntityShader((Entity)null);
}
}
if (mc.gameSettings.keyBindSmoothCamera.isPressed())
{
mc.gameSettings.smoothCamera = !mc.gameSettings.smoothCamera;
}
}
if (mc.gameSettings.showDebugInfo && mc.gameSettings.showDebugProfilerChart)
{
if (i == 11)
{
updateDebugProfilerName.invoke(mc, 0);
}
for (int l = 0; l < 9; ++l)
{
if (i == 2 + l)
{
updateDebugProfilerName.invoke(mc, l+1);
}
}
}
}
net.minecraftforge.fml.common.FMLCommonHandler.instance().fireKeyInput();
}
for (i = 0; i < 9; ++i)
{
if (mc.gameSettings.keyBindsHotbar[i].isPressed())
{
if (mc.thePlayer.isSpectator())
{
mc.ingameGUI.func_175187_g().func_175260_a(i);
}
else
{
mc.thePlayer.inventory.currentItem = i;
}
}
}
boolean flag = mc.gameSettings.chatVisibility != EntityPlayer.EnumChatVisibility.HIDDEN;
while (mc.gameSettings.keyBindInventory.isPressed())
{
if (mc.playerController.isRidingHorse())
{
mc.thePlayer.sendHorseInventory();
}
else
{
mc.getNetHandler().addToSendQueue(new C16PacketClientStatus(C16PacketClientStatus.EnumState.OPEN_INVENTORY_ACHIEVEMENT));
mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
}
}
while (mc.gameSettings.keyBindDrop.isPressed())
{
if (!mc.thePlayer.isSpectator())
{
mc.thePlayer.dropOneItem(GuiScreen.isCtrlKeyDown());
}
}
while (mc.gameSettings.keyBindChat.isPressed() && flag)
{
mc.displayGuiScreen(new GuiChat());
}
if (mc.currentScreen == null && mc.gameSettings.keyBindCommand.isPressed() && flag)
{
mc.displayGuiScreen(new GuiChat("/"));
}
if (mc.thePlayer != null && mc.thePlayer.isUsingItem())
{
if (!mc.gameSettings.keyBindUseItem.isKeyDown())
{
mc.playerController.onStoppedUsingItem(mc.thePlayer);
}
label435:
while (true)
{
if (!mc.gameSettings.keyBindAttack.isPressed())
{
while (mc.gameSettings.keyBindUseItem.isPressed())
{
;
}
while (true)
{
if (mc.gameSettings.keyBindPickBlock.isPressed())
{
continue;
}
break label435;
}
}
}
}
else
{
while (mc.gameSettings.keyBindAttack.isPressed())
{
if(mc != null)
try {
clickMouse.invoke(mc);
} catch(Exception e) {}
}
while (mc.gameSettings.keyBindUseItem.isPressed())
{
if(mc != null)
try {
rightClickMouse.invoke(mc);
} catch(Exception e) {}
}
while (mc.gameSettings.keyBindPickBlock.isPressed())
{
if(mc != null)
try {
middleClickMouse.invoke(mc);
} catch(Exception e) {}
}
}
if (mc.gameSettings.keyBindUseItem.isKeyDown() && (Integer)rightClickDelayTimer.get(mc) == 0 && !mc.thePlayer.isUsingItem())
{
if(mc != null)
try {
rightClickMouse.invoke(mc);
} catch(Exception e) {}
}
if(mc != null)
try {
sendClickBlockToController.invoke(mc, mc.currentScreen == null && mc.gameSettings.keyBindAttack.isKeyDown() && mc.inGameHasFocus);
} catch(Exception e) {}
if(mc != null)
systemTime.set(mc, getSystemTime.invoke(mc));
} catch(Exception e) {}
}
}