ModularPowersuits/src/main/java/net/machinemuse/powersuits/event/ClientTickHandler.java
2018-10-18 15:09:03 -04:00

252 lines
12 KiB
Java

package net.machinemuse.powersuits.event;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.machinemuse.api.ModuleManager;
import net.machinemuse.general.gui.EnergyMeter;
import net.machinemuse.general.gui.HeatMeter;
import net.machinemuse.general.gui.WaterMeter;
import net.machinemuse.general.gui.clickable.ClickableKeybinding;
import net.machinemuse.numina.network.MusePacket;
import net.machinemuse.numina.network.PacketSender;
import net.machinemuse.powersuits.common.Config;
import net.machinemuse.powersuits.control.KeybindManager;
import net.machinemuse.powersuits.control.PlayerInputMap;
import net.machinemuse.powersuits.item.ItemPowerArmorChestplate;
import net.machinemuse.powersuits.item.ItemPowerArmorHelmet;
import net.machinemuse.powersuits.network.packets.MusePacketPlayerUpdate;
import net.machinemuse.powersuits.powermodule.armor.WaterTankModule;
import net.machinemuse.powersuits.powermodule.misc.AutoFeederModule;
import net.machinemuse.powersuits.powermodule.misc.ClockModule;
import net.machinemuse.powersuits.powermodule.misc.CompassModule;
import net.machinemuse.utils.*;
import net.machinemuse.utils.render.MuseRenderer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import java.util.ArrayList;
import java.util.Objects;
/**
* Ported to Java by lehjr on 10/24/16.
*/
public class ClientTickHandler {
/**
* This handler is called before/after the game processes input events and
* updates the gui state mainly. *independent of rendering, so don't do rendering here
* -is also the parent class of KeyBindingHandleryBaseIcon
*
* @author MachineMuse
*/
public ArrayList<String> modules;
private boolean drawWaterMeter = false;
@SubscribeEvent
public void onPreClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.START) {
for (ClickableKeybinding kb : KeybindManager.getKeybindings()) {
kb.doToggleTick();
}
} else {
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
if (player != null && MuseItemUtils.getModularItemsInInventory(player).size() > 0) {
PlayerInputMap inputmap = PlayerInputMap.getInputMapFor(player.getCommandSenderName());
inputmap.forwardKey = Math.signum(player.movementInput.moveForward);
inputmap.strafeKey = Math.signum(player.movementInput.moveStrafe);
inputmap.jumpKey = player.movementInput.jump;
inputmap.sneakKey = player.movementInput.sneak;
inputmap.motionX = player.motionX;
inputmap.motionY = player.motionY;
inputmap.motionZ = player.motionZ;
if (inputmap.hasChanged()) {
inputmap.refresh();
MusePacket inputPacket = new MusePacketPlayerUpdate(player, inputmap);
PacketSender.sendToServer(inputPacket);
}
}
}
}
public void findInstalledModules(EntityPlayer player) {
if (player != null) {
ItemStack tool = player.getCurrentEquippedItem();
// if (tool != null && tool.getItem() instanceof ItemPowerFist) {
// }
ItemStack helmet = player.getCurrentArmor(3);
if (helmet != null && helmet.getItem() instanceof ItemPowerArmorHelmet) {
if (ModuleManager.itemHasActiveModule(helmet, AutoFeederModule.MODULE_AUTO_FEEDER)) {
modules.add(AutoFeederModule.MODULE_AUTO_FEEDER);
}
if (ModuleManager.itemHasActiveModule(helmet, ClockModule.MODULE_CLOCK)) {
modules.add(ClockModule.MODULE_CLOCK);
}
if (ModuleManager.itemHasActiveModule(helmet, CompassModule.MODULE_COMPASS)) {
modules.add(CompassModule.MODULE_COMPASS);
}
}
ItemStack chest = player.getCurrentArmor(2);
if (chest != null && chest.getItem() instanceof ItemPowerArmorChestplate) {
if (ModuleManager.itemHasActiveModule(chest, WaterTankModule.MODULE_WATER_TANK)) {
modules.add(WaterTankModule.MODULE_WATER_TANK);
}
}
}
}
@SideOnly(Side.CLIENT) // MPSA - is this needed or not?
@SubscribeEvent
public void onRenderTickEvent(TickEvent.RenderTickEvent event) {
ItemStack food = new ItemStack(Items.cooked_beef);
ItemStack clock = new ItemStack(Items.clock);
ItemStack compass = new ItemStack(Items.compass);
int yOffsetString = 18;
double yOffsetIcon = 16.0;
String ampm = "";
double yBaseIcon;
int yBaseString;
if (Config.useGraphicalMeters()) {
yBaseIcon = 150.0;
yBaseString = 155;
} else {
yBaseIcon = 26.0;
yBaseString = 32;
}
if (event.phase == TickEvent.Phase.END) {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
modules = new ArrayList<String>();
findInstalledModules(player);
if (player != null && MuseItemUtils.modularItemsEquipped(player).size() > 0 && Minecraft.getMinecraft().currentScreen == null) {
Minecraft mc = Minecraft.getMinecraft();
ScaledResolution screen = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
for (int i = 0; i < modules.size(); i++) {
if (Objects.equals(modules.get(i), AutoFeederModule.MODULE_AUTO_FEEDER)) {
int foodLevel = (int) MuseItemUtils.getFoodLevel(player.getCurrentArmor(3));
String num = MuseStringUtils.formatNumberShort(foodLevel);
if (i == 0) {
MuseRenderer.drawString(num, 17, yBaseString);
MuseRenderer.drawItemAt(-1.0, yBaseIcon, food);
} else {
MuseRenderer.drawString(num, 17, yBaseString + (yOffsetString * i));
MuseRenderer.drawItemAt(-1.0, yBaseIcon + (yOffsetIcon * i), food);
}
} else if(Objects.equals(modules.get(i), ClockModule.MODULE_CLOCK)) {
long time = player.worldObj.provider.getWorldTime();
long hour = ((time % 24000) / 1000);
if (Config.use24hClock()) {
if (hour < 19) {
hour += 6;
} else {
hour -= 18;
}
ampm = "h";
} else {
if (hour < 6) {
hour += 6;
ampm = " AM";
} else if (hour == 6) {
hour = 12;
ampm = " PM";
} else if (hour > 6 && hour < 18) {
hour -= 6;
ampm = " PM";
} else if (hour == 18) {
hour = 12;
ampm = " AM";
} else {
hour -= 18;
ampm = " AM";
}
}
if (i == 0) {
MuseRenderer.drawString(hour + ampm, 17, yBaseString);
MuseRenderer.drawItemAt(-1.0, yBaseIcon, clock);
} else {
MuseRenderer.drawString(hour + ampm, 17, yBaseString + (yOffsetString * i));
MuseRenderer.drawItemAt(-1.0, yBaseIcon + (yOffsetIcon * i), clock);
}
} else if (Objects.equals(modules.get(i), CompassModule.MODULE_COMPASS)) {
if (i == 0) {
MuseRenderer.drawItemAt(-1.0, yBaseIcon, compass);
} else {
MuseRenderer.drawItemAt(-1.0, yBaseIcon + (yOffsetIcon * i), compass);
}
} else if (Objects.equals(modules.get(i), WaterTankModule.MODULE_WATER_TANK)) {
drawWaterMeter = true;
}
}
drawMeters(player, screen);
}
}
}
protected HeatMeter heat = null;
protected HeatMeter energy = null;
protected WaterMeter water = null;
private void drawMeters(EntityPlayer player, ScaledResolution screen) {
double left = screen.getScaledWidth() - 30;
double top = (double)screen.getScaledHeight() / 2.0 - (double)16;
/* Heat Meter ---------------------------------------------------------*/
double currHeat = MuseHeatUtils.getPlayerHeat(player);
double maxHeat = MuseHeatUtils.getMaxHeat(player);
String currHeatStr = MuseStringUtils.formatNumberShort(currHeat);
String maxHeatStr = MuseStringUtils.formatNumberShort(maxHeat);
if (Config.useGraphicalMeters()) {
if (heat == null) {
heat = new HeatMeter();
}
heat.draw(left + (double)8, top, currHeat / maxHeat);
MuseRenderer.drawRightAlignedString(currHeatStr, left - (double)2, top + (double)20);
} else {
MuseRenderer.drawString(currHeatStr + '/' + maxHeatStr + " C", 1, 10);
}
/* Energy Meter ------------------------------------------------------*/
double currWater = AddonWaterUtils.getPlayerWater(player);
double maxWater = AddonWaterUtils.getMaxWater(player);
double currEnergy = ElectricItemUtils.getPlayerEnergy(player);
double maxEnergy = ElectricItemUtils.getMaxEnergy(player);
if (maxEnergy > 0) {
String currEnergyStr = MuseStringUtils.formatNumberShort(currEnergy);
String maxEnergyStr = MuseStringUtils.formatNumberShort(maxEnergy);
if (Config.useGraphicalMeters()) {
if (energy == null) {
energy = new EnergyMeter();
}
energy.draw(left, top, currEnergy / maxEnergy);
MuseRenderer.drawRightAlignedString(currEnergyStr, left - 2, top + 10);
}
else {
MuseRenderer.drawString(currEnergyStr + '/' + maxEnergyStr + " \u1D60", 1, 1);
}
}
/* Water Meter --------------------------------------------------------*/
if (maxWater > 0 && drawWaterMeter ) {
String currWaterStr = MuseStringUtils.formatNumberShort(currWater);
String maxWaterStr = MuseStringUtils.formatNumberShort(maxWater);
if (Config.useGraphicalMeters()) {
if (water == null) {
water = new WaterMeter();
}
water.draw(left + 16, top, currWater / maxWater);
MuseRenderer.drawRightAlignedString(currWaterStr, left - 2, top + 30);
}
else {
MuseRenderer.drawString(currWaterStr + '/' + maxWaterStr + " buckets", 1, 19);
}
}
}
}