Package tconstruct.armor

Source Code of tconstruct.armor.ArmorProxyClient

package tconstruct.armor;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import mantle.lib.client.MantleClientRegistry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.IAttributeInstance;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.GuiIngameForge;
import net.minecraftforge.client.event.FOVUpdateEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.common.MinecraftForge;
import tconstruct.armor.gui.ArmorExtendedGui;
import tconstruct.armor.gui.KnapsackGui;
import tconstruct.armor.items.TravelGear;
import tconstruct.armor.model.BeltModel;
import tconstruct.armor.model.BootBump;
import tconstruct.armor.model.HiddenPlayerModel;
import tconstruct.armor.model.WingModel;
import tconstruct.armor.player.ArmorExtended;
import tconstruct.armor.player.KnapsackInventory;
import tconstruct.client.ArmorControls;
import tconstruct.client.tabs.InventoryTabArmorExtended;
import tconstruct.client.tabs.InventoryTabKnapsack;
import tconstruct.client.tabs.InventoryTabVanilla;
import tconstruct.client.tabs.TabRegistry;
import tconstruct.common.TProxyCommon;
import tconstruct.library.accessory.IAccessoryModel;
import tconstruct.library.client.TConstructClientRegistry;
import tconstruct.library.crafting.ModifyBuilder;
import tconstruct.tools.TinkerTools;
import tconstruct.world.TinkerWorld;

import java.util.Random;

public class ArmorProxyClient extends ArmorProxyCommon {
  public static WingModel wings = new WingModel();
  public static BootBump bootbump = new BootBump();
  public static HiddenPlayerModel glove = new HiddenPlayerModel(0.25F, 4);
  public static HiddenPlayerModel vest = new HiddenPlayerModel(0.25f, 1);
  public static BeltModel belt = new BeltModel();

  public static KnapsackInventory knapsack = new KnapsackInventory();
  public static ArmorExtended armorExtended = new ArmorExtended();

  @Override
  public void preInit() {
    controlInstance = new ArmorControls();
    FMLCommonHandler.instance().bus().register(controlInstance);
    MinecraftForge.EVENT_BUS.register(controlInstance);
    MinecraftForge.EVENT_BUS.register(new TabRegistry());
  }

  @Override
  public void initialize() {
    registerGuiHandler();
    registerKeys();
    registerManualIcons();
    registerManualRecipes();
    MinecraftForge.EVENT_BUS.register(this);
    FMLCommonHandler.instance().bus().register(new ArmorAbilitiesClient(mc, controlInstance));
  }

  private void registerManualIcons() {
    MantleClientRegistry
        .registerManualIcon("travelgoggles", TinkerArmor.travelGoggles.getDefaultItem());
    MantleClientRegistry
        .registerManualIcon("travelvest", TinkerArmor.travelVest.getDefaultItem());
    MantleClientRegistry
        .registerManualIcon("travelwings", TinkerArmor.travelWings.getDefaultItem());
    MantleClientRegistry
        .registerManualIcon("travelboots", TinkerArmor.travelBoots.getDefaultItem());
    MantleClientRegistry
        .registerManualIcon("travelbelt", TinkerArmor.travelBelt.getDefaultItem());
    MantleClientRegistry
        .registerManualIcon("travelglove", TinkerArmor.travelGlove.getDefaultItem());
  }

  private void registerManualRecipes() {
    ItemStack feather = new ItemStack(Items.feather);
    ItemStack redstone = new ItemStack(Items.redstone);
    ItemStack goggles = TinkerArmor.travelGoggles.getDefaultItem();

    TConstructClientRegistry.registerManualModifier("nightvision", goggles.copy(),
        new ItemStack(Items.flint_and_steel), new ItemStack(Items.potionitem, 1, 8198),
        new ItemStack(Items.golden_carrot), null);

    ItemStack vest = TinkerArmor.travelVest.getDefaultItem();
    TConstructClientRegistry
        .registerManualModifier("dodge", vest.copy(), new ItemStack(Items.ender_eye),
            new ItemStack(Items.ender_pearl), new ItemStack(Items.sugar), null);
    TConstructClientRegistry.registerManualModifier("stealth", vest.copy(),
        new ItemStack(Items.fermented_spider_eye), new ItemStack(Items.ender_eye),
        new ItemStack(Items.potionitem, 1, 8206), new ItemStack(Items.golden_carrot));

    ItemStack wings = TinkerArmor.travelWings.getDefaultItem();
    TConstructClientRegistry.registerManualModifier("doublejumpwings", wings.copy(),
        new ItemStack(Items.ghast_tear), new ItemStack(TinkerWorld.slimeGel, 1, 0),
        new ItemStack(Blocks.piston), null);

    ItemStack[] recipe = new ItemStack[] { new ItemStack(TinkerWorld.slimeGel, 1, 0),
        new ItemStack(Items.ender_pearl), feather, feather, feather, feather, feather,
        feather
    };
    ItemStack modWings = ModifyBuilder.instance.modifyItem(wings, recipe);
    MantleClientRegistry.registerManualLargeRecipe("featherfall", modWings.copy(), feather,
        new ItemStack(TinkerWorld.slimeGel, 1, 0), feather, feather, wings.copy(), feather,
        feather, new ItemStack(Items.ender_pearl), feather);

    ItemStack boots = TinkerArmor.travelBoots.getDefaultItem();
    TConstructClientRegistry.registerManualModifier("doublejumpboots", boots.copy(),
        new ItemStack(Items.ghast_tear), new ItemStack(TinkerWorld.slimeGel, 1, 1),
        new ItemStack(Blocks.piston), null);
    TConstructClientRegistry
        .registerManualModifier("waterwalk", boots.copy(), new ItemStack(Blocks.waterlily),
            new ItemStack(Blocks.waterlily));
    TConstructClientRegistry.registerManualModifier("leadboots", boots.copy(),
        new ItemStack(Blocks.iron_block));
    TConstructClientRegistry.registerManualModifier("slimysoles", boots.copy(),
        new ItemStack(TinkerWorld.slimePad, 1, 0),
        new ItemStack(TinkerWorld.slimePad, 1, 0));

    ItemStack gloves = TinkerArmor.travelGlove.getDefaultItem();
    TConstructClientRegistry.registerManualModifier("glovehaste", gloves.copy(), redstone,
        new ItemStack(Blocks.redstone_block));
    //MantleClientRegistry.registerManualSmallRecipe("gloveclimb", gloves.copy(), new ItemStack(Items.slime_ball), new ItemStack(Blocks.web), new ItemStack(TinkerTools.materials, 1, 25), null);
    TConstructClientRegistry
        .registerManualModifier("gloveknuckles", gloves.copy(), new ItemStack(Items.quartz),
            new ItemStack(Blocks.quartz_block, 1, Short.MAX_VALUE));

    // moss
    ItemStack moss = new ItemStack(TinkerTools.materials, 1, 6);
    TConstructClientRegistry.registerManualModifier("mossgoggles", goggles.copy(), moss.copy());
    TConstructClientRegistry.registerManualModifier("mossvest", vest.copy(), moss.copy());
    TConstructClientRegistry.registerManualModifier("mosswings", wings.copy(), moss.copy());
    TConstructClientRegistry.registerManualModifier("mossboots", boots.copy(), moss.copy());
  }

  @Override
  protected void registerGuiHandler() {
    super.registerGuiHandler();
    TProxyCommon.registerClientGuiHandler(inventoryGui, this);
    TProxyCommon.registerClientGuiHandler(armorGuiID, this);
    TProxyCommon.registerClientGuiHandler(knapsackGuiID, this);
  }

  @Override
  public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y,
      int z) {
    if (ID == ArmorProxyCommon.inventoryGui) {
      GuiInventory inventory = new GuiInventory(player);
      return inventory;
    }
    if (ID == ArmorProxyCommon.armorGuiID) {
      ArmorProxyClient.armorExtended.init(Minecraft.getMinecraft().thePlayer);
      return new ArmorExtendedGui(player.inventory, ArmorProxyClient.armorExtended);
    }
    if (ID == ArmorProxyCommon.knapsackGuiID) {
      ArmorProxyClient.knapsack.init(Minecraft.getMinecraft().thePlayer);
      return new KnapsackGui(player.inventory, ArmorProxyClient.knapsack);
    }
    return null;
  }

  @Override
  public void registerTickHandler() {
    FMLCommonHandler.instance().bus().register(new ArmorTickHandler());
  }

  /* Keybindings */
  public static ArmorControls controlInstance;

  @Override
  public void registerKeys() {
    controlInstance.registerKeys();

    TabRegistry.registerTab(new InventoryTabVanilla());
    TabRegistry.registerTab(new InventoryTabArmorExtended());
    TabRegistry.registerTab(new InventoryTabKnapsack());
  }

  Minecraft mc = Minecraft.getMinecraft();

  private static final ResourceLocation hearts = new ResourceLocation("tinker",
      "textures/gui/newhearts.png");
  private static final ResourceLocation icons = new ResourceLocation("textures/gui/icons.png");
  // public static int left_height = 39;
  // public static int right_height = 39;
  Random rand = new Random();
  int updateCounter = 0;

  GameSettings gs = Minecraft.getMinecraft().gameSettings;

  @SubscribeEvent
  public void goggleZoom(FOVUpdateEvent event) {
    if (ArmorControls.zoom) {
      ItemStack helmet = event.entity.getCurrentArmor(3);
      if (helmet != null && helmet.getItem() instanceof TravelGear) {
        event.newfov = 0.3f;
      }
    }
    //ItemStack feet = player.getCurrentArmor(0);
    //event.newfov = 1.0f;
  }

  /* HUD */
  @SubscribeEvent
  public void renderHealthbar(RenderGameOverlayEvent.Pre event) {
    if (Loader.isModLoaded(
        "rpghud")) // uses different display, displays health correctly by itself.
      return;

    if (!Loader.isModLoaded("tukmc_Vz") || Loader
        .isModLoaded("borderlands"))// Loader check to avoid conflicting
    // with a GUI mod (thanks Vazkii!)
    {
      if (event.type == ElementType.HEALTH) {
        updateCounter++;

        ScaledResolution scaledresolution = new ScaledResolution(this.mc,
            this.mc.displayWidth, this.mc.displayHeight);
        int scaledWidth = scaledresolution.getScaledWidth();
        int scaledHeight = scaledresolution.getScaledHeight();
        int xBasePos = scaledWidth / 2 - 91;
        int yBasePos = scaledHeight - 39;

        boolean highlight = mc.thePlayer.hurtResistantTime / 3 % 2 == 1;

        if (mc.thePlayer.hurtResistantTime < 10) {
          highlight = false;
        }

        IAttributeInstance attrMaxHealth = this.mc.thePlayer
            .getEntityAttribute(SharedMonsterAttributes.maxHealth);
        int health = MathHelper.ceiling_float_int(mc.thePlayer.getHealth());
        int healthLast = MathHelper.ceiling_float_int(mc.thePlayer.prevHealth);
        float healthMax = (float) attrMaxHealth.getAttributeValue();
        if (healthMax > 20)
          healthMax = 20;
        float absorb = this.mc.thePlayer.getAbsorptionAmount();

        int healthRows = MathHelper.ceiling_float_int((healthMax + absorb) / 2.0F / 10.0F);
        int rowHeight = Math.max(10 - (healthRows - 2), 3);

        this.rand.setSeed((long) (updateCounter * 312871));

        int left = scaledWidth / 2 - 91;
        int top = scaledHeight - GuiIngameForge.left_height;

        if (!GuiIngameForge.renderExperiance) {
          top += 7;
          yBasePos += 7;
        }

        int regen = -1;
        if (mc.thePlayer.isPotionActive(Potion.regeneration)) {
          regen = updateCounter % 25;
        }

        final int TOP = 9 * (mc.theWorld.getWorldInfo().isHardcoreModeEnabled() ? 5 : 0);
        final int BACKGROUND = (highlight ? 25 : 16);
        int MARGIN = 16;
        if (mc.thePlayer.isPotionActive(Potion.poison))
          MARGIN += 36;
        else if (mc.thePlayer.isPotionActive(Potion.wither))
          MARGIN += 72;
        float absorbRemaining = absorb;

        for (int i = MathHelper.ceiling_float_int((healthMax + absorb) / 2.0F) - 1;
           i >= 0; --i) {
          int b0 = (highlight ? 1 : 0);
          int row = MathHelper.ceiling_float_int((float) (i + 1) / 10.0F) - 1;
          int x = left + i % 10 * 8;
          int y = top - row * rowHeight;

          if (health <= 4)
            y += rand.nextInt(2);
          if (i == regen)
            y -= 2;

          drawTexturedModalRect(x, y, BACKGROUND, TOP, 9, 9);

          if (highlight) {
            if (i * 2 + 1 < healthLast)
              drawTexturedModalRect(x, y, MARGIN + 54, TOP, 9, 9); // 6
            else if (i * 2 + 1 == healthLast)
              drawTexturedModalRect(x, y, MARGIN + 63, TOP, 9, 9); // 7
          }

          if (absorbRemaining > 0.0F) {
            if (absorbRemaining == absorb && absorb % 2.0F == 1.0F)
              drawTexturedModalRect(x, y, MARGIN + 153, TOP, 9, 9); // 17
            else
              drawTexturedModalRect(x, y, MARGIN + 144, TOP, 9, 9); // 16
            absorbRemaining -= 2.0F;
          }
          else {
            if (i * 2 + 1 < health)
              drawTexturedModalRect(x, y, MARGIN + 36, TOP, 9, 9); // 4
            else if (i * 2 + 1 == health)
              drawTexturedModalRect(x, y, MARGIN + 45, TOP, 9, 9); // 5
          }
        }

        int potionOffset = 0;
        PotionEffect potion = mc.thePlayer.getActivePotionEffect(Potion.wither);
        if (potion != null)
          potionOffset = 18;
        potion = mc.thePlayer.getActivePotionEffect(Potion.poison);
        if (potion != null)
          potionOffset = 9;
        if (mc.theWorld.getWorldInfo().isHardcoreModeEnabled())
          potionOffset += 27;

        // Extra hearts
        this.mc.getTextureManager().bindTexture(hearts);

        int hp = MathHelper.ceiling_float_int(this.mc.thePlayer.getHealth());
        for (int iter = 0; iter < hp / 20; iter++) {
          int renderHearts = (hp - 20 * (iter + 1)) / 2;
          if (renderHearts > 10)
            renderHearts = 10;
          for (int i = 0; i < renderHearts; i++) {
            int y = 0;
            if (i == regen)
              y -= 2;
            this.drawTexturedModalRect(xBasePos + 8 * i, yBasePos + y, 0 + 18 * iter,
                potionOffset, 9, 9);
          }
          if (hp % 2 == 1 && renderHearts < 10) {
            this.drawTexturedModalRect(xBasePos + 8 * renderHearts, yBasePos,
                9 + 18 * iter, potionOffset, 9, 9);
          }
        }

        this.mc.getTextureManager().bindTexture(icons);
        GuiIngameForge.left_height += 10;
        if (absorb > 0)
          GuiIngameForge.left_height += 10;

        event.setCanceled(true);
        if (event.type == ElementType.CROSSHAIRS && gs.thirdPersonView != 0) {
          event.setCanceled(true);
        }
      }
    }
  }

  public void drawTexturedModalRect(int par1, int par2, int par3, int par4, int par5, int par6) {
    float f = 0.00390625F;
    float f1 = 0.00390625F;
    Tessellator tessellator = Tessellator.instance;
    tessellator.startDrawingQuads();
    tessellator
        .addVertexWithUV((double) (par1 + 0), (double) (par2 + par6), (double) this.zLevel,
            (double) ((float) (par3 + 0) * f), (double) ((float) (par4 + par6) * f1));
    tessellator.addVertexWithUV((double) (par1 + par5), (double) (par2 + par6),
        (double) this.zLevel, (double) ((float) (par3 + par5) * f),
        (double) ((float) (par4 + par6) * f1));
    tessellator
        .addVertexWithUV((double) (par1 + par5), (double) (par2 + 0), (double) this.zLevel,
            (double) ((float) (par3 + par5) * f), (double) ((float) (par4 + 0) * f1));
    tessellator.addVertexWithUV((double) (par1 + 0), (double) (par2 + 0), (double) this.zLevel,
        (double) ((float) (par3 + 0) * f), (double) ((float) (par4 + 0) * f1));
    tessellator.draw();
  }

  double zLevel = 0;

  /* Armor rendering */
  @SubscribeEvent
  public void adjustArmor(RenderPlayerEvent.SetArmorModel event) {
    switch (event.slot) {
      case 1:
        ArmorProxyClient.vest.onGround = event.renderer.modelBipedMain.onGround;
        ArmorProxyClient.vest.isRiding = event.renderer.modelBipedMain.isRiding;
        ArmorProxyClient.vest.isChild = event.renderer.modelBipedMain.isChild;
        ArmorProxyClient.vest.isSneak = event.renderer.modelBipedMain.isSneak;
      case 2:
        ArmorProxyClient.wings.onGround = event.renderer.modelBipedMain.onGround;
        ArmorProxyClient.wings.isRiding = event.renderer.modelBipedMain.isRiding;
        ArmorProxyClient.wings.isChild = event.renderer.modelBipedMain.isChild;
        ArmorProxyClient.wings.isSneak = event.renderer.modelBipedMain.isSneak;

        ArmorProxyClient.glove.onGround = event.renderer.modelBipedMain.onGround;
        ArmorProxyClient.glove.isRiding = event.renderer.modelBipedMain.isRiding;
        ArmorProxyClient.glove.isChild = event.renderer.modelBipedMain.isChild;
        ArmorProxyClient.glove.isSneak = event.renderer.modelBipedMain.isSneak;
        ArmorProxyClient.glove.heldItemLeft = event.renderer.modelBipedMain.heldItemLeft;
        ArmorProxyClient.glove.heldItemRight = event.renderer.modelBipedMain.heldItemRight;

        ArmorProxyClient.belt.onGround = event.renderer.modelBipedMain.onGround;
        ArmorProxyClient.belt.isRiding = event.renderer.modelBipedMain.isRiding;
        ArmorProxyClient.belt.isChild = event.renderer.modelBipedMain.isChild;
        ArmorProxyClient.belt.isSneak = event.renderer.modelBipedMain.isSneak;

        renderArmorExtras(event);

        break;
      case 3:
        ArmorProxyClient.bootbump.onGround = event.renderer.modelBipedMain.onGround;
        ArmorProxyClient.bootbump.isRiding = event.renderer.modelBipedMain.isRiding;
        ArmorProxyClient.bootbump.isChild = event.renderer.modelBipedMain.isChild;
        ArmorProxyClient.bootbump.isSneak = event.renderer.modelBipedMain.isSneak;
        break;
    }
  }

  void renderArmorExtras(RenderPlayerEvent.SetArmorModel event) {
    float partialTick = event.partialRenderTick;

    EntityPlayer player = event.entityPlayer;

    // todo: synchronize extra armor with other clients. Until then, only draw locally
    if (player != Minecraft.getMinecraft().thePlayer)
      return;

    float posX = (float) (player.lastTickPosX
        + (player.posX - player.lastTickPosX) * partialTick);
    float posY = (float) (player.lastTickPosY
        + (player.posY - player.lastTickPosY) * partialTick);
    float posZ = (float) (player.lastTickPosZ
        + (player.posZ - player.lastTickPosZ) * partialTick);

    float yawOffset = this
        .interpolateRotation(player.prevRenderYawOffset, player.renderYawOffset,
            partialTick);
    float yawRotation = this
        .interpolateRotation(player.prevRotationYawHead, player.rotationYawHead,
            partialTick);
    float pitch;
    final float zeropointsixtwofive = 0.0625F;

    if (player.isRiding() && player.ridingEntity instanceof EntityLivingBase) {
      EntityLivingBase entitylivingbase1 = (EntityLivingBase) player.ridingEntity;
      yawOffset = this.interpolateRotation(entitylivingbase1.prevRenderYawOffset,
          entitylivingbase1.renderYawOffset, partialTick);
      pitch = MathHelper.wrapAngleTo180_float(yawRotation - yawOffset);

      if (pitch < -85.0F) {
        pitch = -85.0F;
      }

      if (pitch >= 85.0F) {
        pitch = 85.0F;
      }

      yawOffset = yawRotation - pitch;

      if (pitch * pitch > 2500.0F) {
        yawOffset += pitch * 0.2F;
      }
    }

    pitch = this.handleRotationFloat(player, partialTick);
    float bodyRotation = player.prevRotationPitch
        + (player.rotationPitch - player.prevRotationPitch) * partialTick;
    float limbSwing = player.prevLimbSwingAmount
        + (player.limbSwingAmount - player.prevLimbSwingAmount) * partialTick;
    float limbSwingMod = player.limbSwing - player.limbSwingAmount * (1.0F - partialTick);
    //TPlayerStats stats = TPlayerStats.get(player);
    ArmorExtended armor = ArmorProxyClient.armorExtended; //TODO: Do this for every player, not just the client
    if (armor.inventory[1] != null) {
      Item item = armor.inventory[1].getItem();
      ModelBiped model = item.getArmorModel(player, armor.inventory[1], 4);

      if (item instanceof IAccessoryModel) {
        this.mc.getTextureManager().bindTexture(
            ((IAccessoryModel) item).getWearbleTexture(player, armor.inventory[1], 1));
        model.setLivingAnimations(player, limbSwingMod, limbSwing, partialTick);
        model.render(player, limbSwingMod, limbSwing, pitch, yawRotation - yawOffset,
            bodyRotation, zeropointsixtwofive);
      }
    }

    if (armor.inventory[3] != null) {
      Item item = armor.inventory[3].getItem();
      ModelBiped model = item.getArmorModel(player, armor.inventory[3], 5);

      if (item instanceof IAccessoryModel) {
        this.mc.getTextureManager().bindTexture(
            ((IAccessoryModel) item).getWearbleTexture(player, armor.inventory[1], 1));
        model.setLivingAnimations(player, limbSwingMod, limbSwing, partialTick);
        model.render(player, limbSwingMod, limbSwing, pitch, yawRotation - yawOffset,
            bodyRotation, zeropointsixtwofive);
      }
    }
  }

  private float interpolateRotation(float par1, float par2, float par3) {
    float f3;

    for (f3 = par2 - par1; f3 < -180.0F; f3 += 360.0F) {
      ;
    }

    while (f3 >= 180.0F) {
      f3 -= 360.0F;
    }

    return par1 + par3 * f3;
  }

  protected float handleRotationFloat(EntityLivingBase par1EntityLivingBase, float par2) {
    return (float) par1EntityLivingBase.ticksExisted + par2;
  }

}
TOP

Related Classes of tconstruct.armor.ArmorProxyClient

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.