missile rendering, fixes

This commit is contained in:
Boblet 2024-01-15 15:51:26 +01:00
parent b76af3cffa
commit 5618be2d63
10 changed files with 417 additions and 319 deletions

View File

@ -8,9 +8,16 @@
## Changed
* There is now a config option to disable the biome change caused by fallout. The config will also determine whether the biomes are registered at all, which prevents them from conflicting with other mods' biomes when disabled.
* Chemical plants now have a timer that starts after loading/unloading fluids using item fluid containers from the input buffers, this creates a delay between switching from loading and unloading, making it possible to retrieve fluids using pipettes.
* In addition to delaying overheats, efficiency upgrades now reduce the cyclotron's coolant demand
* Removed the tooltips from common upgrades, as the info was incomplete and outdated anyway
* Meteorite swords now render their variant glint in first person view
* Meteorite swords are now a lot larger, similar to most other NTM swords
* Non-custom missile items now render in 3D
## Fixed
* Fixed trenchmaster armor not doing most of the armor calculation, making it the worst armor
* Fixed glowing mushrooms not being able to be bonemealed
* Fixed strand caster having one port that does not work with certain rotations
* Fixed fallout being able to replace bedrock
* Fixed the upgrade info of the large mining drill being incorrect
* Fixed cyclotron not having the new upgrade info tooltip

View File

@ -57,84 +57,6 @@ public class ItemMachineUpgrade extends Item {
}
}
if(this.type == UpgradeType.SPEED) {
list.add(EnumChatFormatting.RED + "Mining Drill:");
list.add("Delay -" + (15 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Laser Miner:");
list.add("Delay ÷" + (1 + this.tier) + " / Consumption +" + (625 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Electric Furnace:");
list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (50 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Assembly Machine:");
list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Chemical Plant:");
list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (300 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Oil Wells:");
list.add("Delay -" + (25 * this.tier) + "% / Consumption +" + (25 * this.tier) + "%");
list.add(EnumChatFormatting.RED + "Crystallizer:");
list.add("Delay -" + (20 * this.tier) + "% / Consumption +" + (1000 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Cyclotron:");
list.add("Speed x" + (1 + this.tier));
list.add(EnumChatFormatting.RED + "Flare Stack:");
list.add("Speed x" + (1 + this.tier));
list.add(EnumChatFormatting.RED + "Maxwell:");
list.add("Damage +" + (0.25 * (double)this.tier) + "dmg/t");
}
if(this.type == UpgradeType.EFFECT) {
list.add(EnumChatFormatting.RED + "Mining Drill:");
list.add("Radius +" + this.tier + "m / Consumption +" + (80 * this.tier) + "HE/t");
list.add(EnumChatFormatting.RED + "Crystallizer:");
list.add("+" + (5 * this.tier) + "% chance of not consuming an item / Acid consumption +" + (1000 * this.tier) + "mB");
list.add(EnumChatFormatting.RED + "Cyclotron:");
list.add("-" + (100 - 100 / (this.tier + 1)) + "% chance of incrementing overheat counter");
list.add(EnumChatFormatting.RED + "Flare Stack:");
list.add("+" + (100 * this.tier / 3) + "% power production");
list.add(EnumChatFormatting.RED + "Maxwell:");
list.add("Range +" + (3 * this.tier) + "m");
}
if(this.type == UpgradeType.POWER) {
list.add(EnumChatFormatting.RED + "Mining Drill:");
list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%");
list.add(EnumChatFormatting.RED + "Electric Furnace:");
list.add("Consumption -" + (15 * this.tier) + "HE/t / Delay +" + (10 * this.tier) + "%");
list.add(EnumChatFormatting.RED + "Assembly Machine:");
list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%");
list.add(EnumChatFormatting.RED + "Chemical Plant:");
list.add("Consumption -" + (30 * this.tier) + "HE/t / Delay +" + (5 * this.tier) + "%");
list.add(EnumChatFormatting.RED + "Oil Wells:");
list.add("Consumption -" + (25 * this.tier) + "% / Delay +" + (10 * this.tier) + "%");
list.add(EnumChatFormatting.RED + "Cyclotron:");
list.add("Consumption -" + (100 * this.tier) + "kHE/t");
list.add(EnumChatFormatting.RED + "Maxwell:");
list.add("Consumption -" + (150 * this.tier) + "HE/t");
list.add("Consumption when firing -" + (1500 * this.tier) + "HE/t");
}
if(this == ModItems.upgrade_fortune_1) {
list.add(EnumChatFormatting.RED + "Mining Drill:");
list.add("Fortune +1 / Delay +15");
}
if(this == ModItems.upgrade_fortune_2) {
list.add(EnumChatFormatting.RED + "Mining Drill:");
list.add("Fortune +2 / Delay +30");
}
if(this == ModItems.upgrade_fortune_3) {
list.add(EnumChatFormatting.RED + "Mining Drill:");
list.add("Fortune +3 / Delay +45");
}
if(this.type == UpgradeType.AFTERBURN) {
list.add(EnumChatFormatting.RED + "Turbofan:");
list.add("Production x" + (this.tier + 1) + " / Consumption x" + (this.tier + 2));
list.add(EnumChatFormatting.RED + "Maxwell:");
list.add("Afterburn +" + (this.tier * 3) + "s");
list.add(EnumChatFormatting.RED + "Oil Wells:");
list.add("Burn " + (this.tier * 10) + "mB of gas for " + (this.tier * 50) + "HE/t");
}
if(this == ModItems.upgrade_radius) {
list.add(EnumChatFormatting.RED + "Forcefield Range Upgrade");
list.add("Radius +16 / Consumption +500");

View File

@ -41,6 +41,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
@ -90,6 +91,7 @@ import com.hbm.render.entity.mob.*;
import com.hbm.render.entity.projectile.*;
import com.hbm.render.entity.rocket.*;
import com.hbm.render.item.*;
import com.hbm.render.item.ItemRenderMissileGeneric.RenderMissileType;
import com.hbm.render.item.block.*;
import com.hbm.render.item.weapon.*;
import com.hbm.render.loader.HmfModelLoader;
@ -415,10 +417,36 @@ public class ClientProxy extends ServerProxy {
MinecraftForgeClient.registerItemRenderer(ModItems.cmb_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir));
MinecraftForgeClient.registerItemRenderer(ModItems.dnt_sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir));
/*for(ItemSwordMeteorite sword : ItemSwordMeteorite.swords) {
MinecraftForgeClient.registerItemRenderer(sword, new ItemRenderTransformer(rtp, ttp_high, stp, rfp, tfp, sfp, rir, tir, sir));
}*/
ItemRenderMissileGeneric.init();
MinecraftForgeClient.registerItemRenderer(ModItems.missile_taint, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_micro, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_bhole, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_schrabidium, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_emp, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER0));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_stealth, new ItemRenderMissileGeneric(RenderMissileType.TYPE_STEALTH));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_generic, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_incendiary, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_buster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_decoy, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER1));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_anti_ballistic, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ABM));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_incendiary_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_cluster_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_buster_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_emp_strong, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER2));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_burst, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_inferno, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_rain, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_drill, new ItemRenderMissileGeneric(RenderMissileType.TYPE_TIER3));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_nuclear_cluster, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_volcano, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_endo, new ItemRenderMissileGeneric(RenderMissileType.TYPE_THERMAL));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_exo, new ItemRenderMissileGeneric(RenderMissileType.TYPE_THERMAL));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday, new ItemRenderMissileGeneric(RenderMissileType.TYPE_DOOMSDAY));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_carrier, new ItemRenderMissileGeneric(RenderMissileType.TYPE_CARRIER));
MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN));
//test crap
MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(ModBlocks.test_bomb_advanced), new ItemRenderTestBombAdvanced());

View File

@ -0,0 +1,192 @@
package com.hbm.render.item;
import java.util.HashMap;
import java.util.function.Consumer;
import org.lwjgl.opengl.GL11;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.items.ModItems;
import com.hbm.main.ResourceManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.model.IModelCustom;
public class ItemRenderMissileGeneric implements IItemRenderer {
public static HashMap<ComparableStack, Consumer<TextureManager>> renderers = new HashMap();
protected RenderMissileType type;
public static enum RenderMissileType {
TYPE_TIER0,
TYPE_TIER1,
TYPE_TIER2,
TYPE_TIER3,
TYPE_STEALTH,
TYPE_ABM,
TYPE_NUCLEAR,
TYPE_THERMAL,
TYPE_DOOMSDAY,
TYPE_CARRIER,
TYPE_ROBIN
}
public ItemRenderMissileGeneric(RenderMissileType type) {
this.type = type;
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
switch(type) {
case EQUIPPED:
case EQUIPPED_FIRST_PERSON:
case ENTITY:
case INVENTORY:
return true;
default: return false;
}
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return helper == ItemRendererHelper.ENTITY_BOBBING || helper == ItemRendererHelper.ENTITY_ROTATION;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
Consumer<TextureManager> renderer = renderers.get(new ComparableStack(item).makeSingular());
if(renderer == null) return;
GL11.glPushMatrix();
double guiScale = 1;
double guiOffset = 0;
switch(this.type) {
case TYPE_TIER0: guiScale = 2.25D; guiOffset = 7.5D; break;
case TYPE_TIER1: guiScale = 2.5D; guiOffset = 8.5D; break;
case TYPE_TIER2: guiScale = 2D; guiOffset = 6.5D; break;
case TYPE_TIER3: guiScale = 1.25D; guiOffset = 1D; break;
case TYPE_STEALTH: guiScale = 1.75D; guiOffset = 4.75D; break;
case TYPE_ABM: guiScale = 2.25D; guiOffset = 7D; break;
case TYPE_NUCLEAR: guiScale = 1.75D; guiOffset = 4D; break;
case TYPE_THERMAL: guiScale = 1.75D; guiOffset = 4.5D; break;
case TYPE_DOOMSDAY: guiScale = 1.5D; guiOffset = 3D; break;
case TYPE_CARRIER: guiScale = 0.625D; guiOffset = -17D; break;
case TYPE_ROBIN: guiScale = 1.25D; guiOffset = 2D; break;
}
switch(type) {
case EQUIPPED:
double s = 0.15;
GL11.glTranslated(0.5, -0.25, 0);
GL11.glScaled(s, s, s);
break;
case EQUIPPED_FIRST_PERSON:
double heldScale = 0.1;
GL11.glTranslated(0.5, 0.25, 0);
GL11.glScaled(heldScale, heldScale, heldScale);
break;
case ENTITY:
double s2 = 0.15;
GL11.glScaled(s2, s2, s2);
break;
case INVENTORY:
RenderHelper.enableGUIStandardItemLighting();
GL11.glScaled(guiScale, guiScale, guiScale);
GL11.glRotated(135, 0, 0, 1);
GL11.glRotatef(System.currentTimeMillis() / 15 % 360, 0, 1, 0);
GL11.glTranslated(0, -16 + guiOffset, 0);
break;
default: break;
}
GL11.glDisable(GL11.GL_CULL_FACE);
renderer.accept(Minecraft.getMinecraft().renderEngine);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPopMatrix();
}
public static Consumer<TextureManager> generateStandard(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 1F); }
public static Consumer<TextureManager> generateLarge(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 1.5F); }
public static Consumer<TextureManager> generateDouble(ResourceLocation texture, IModelCustom model) { return generateWithScale(texture, model, 2F); }
public static Consumer<TextureManager> generateWithScale(ResourceLocation texture, IModelCustom model, float scale) {
return x -> {
GL11.glScalef(scale, scale, scale);
GL11.glShadeModel(GL11.GL_SMOOTH);
x.bindTexture(texture); model.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
};
}
public static void init() {
renderers.put(new ComparableStack(ModItems.missile_taint), generateDouble(ResourceManager.missileTaint_tex, ResourceManager.missileTaint));
renderers.put(new ComparableStack(ModItems.missile_micro), generateDouble(ResourceManager.missileMicro_tex, ResourceManager.missileTaint));
renderers.put(new ComparableStack(ModItems.missile_bhole), generateDouble(ResourceManager.missileMicroBHole_tex, ResourceManager.missileTaint));
renderers.put(new ComparableStack(ModItems.missile_schrabidium), generateDouble(ResourceManager.missileMicroSchrab_tex, ResourceManager.missileTaint));
renderers.put(new ComparableStack(ModItems.missile_emp), generateDouble(ResourceManager.missileMicroEMP_tex, ResourceManager.missileTaint));
renderers.put(new ComparableStack(ModItems.missile_stealth), x -> {
GL11.glShadeModel(GL11.GL_SMOOTH);
x.bindTexture(ResourceManager.missileStealth_tex); ResourceManager.missileStealth.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
});
renderers.put(new ComparableStack(ModItems.missile_generic), generateStandard(ResourceManager.missileV2_HE_tex, ResourceManager.missileV2));
renderers.put(new ComparableStack(ModItems.missile_incendiary), generateStandard(ResourceManager.missileV2_IN_tex, ResourceManager.missileV2));
renderers.put(new ComparableStack(ModItems.missile_cluster), generateStandard(ResourceManager.missileV2_CL_tex, ResourceManager.missileV2));
renderers.put(new ComparableStack(ModItems.missile_buster), generateStandard(ResourceManager.missileV2_BU_tex, ResourceManager.missileV2));
renderers.put(new ComparableStack(ModItems.missile_decoy), generateStandard(ResourceManager.missileV2_decoy_tex, ResourceManager.missileV2));
renderers.put(new ComparableStack(ModItems.missile_anti_ballistic), generateStandard(ResourceManager.missileAA_tex, ResourceManager.missileABM));
renderers.put(new ComparableStack(ModItems.missile_strong), generateLarge(ResourceManager.missileStrong_HE_tex, ResourceManager.missileStrong));
renderers.put(new ComparableStack(ModItems.missile_incendiary_strong), generateLarge(ResourceManager.missileStrong_IN_tex, ResourceManager.missileStrong));
renderers.put(new ComparableStack(ModItems.missile_cluster_strong), generateLarge(ResourceManager.missileStrong_CL_tex, ResourceManager.missileStrong));
renderers.put(new ComparableStack(ModItems.missile_buster_strong), generateLarge(ResourceManager.missileStrong_BU_tex, ResourceManager.missileStrong));
renderers.put(new ComparableStack(ModItems.missile_emp_strong), generateLarge(ResourceManager.missileStrong_EMP_tex, ResourceManager.missileStrong));
renderers.put(new ComparableStack(ModItems.missile_burst), generateStandard(ResourceManager.missileHuge_HE_tex, ResourceManager.missileHuge));
renderers.put(new ComparableStack(ModItems.missile_inferno), generateStandard(ResourceManager.missileHuge_IN_tex, ResourceManager.missileHuge));
renderers.put(new ComparableStack(ModItems.missile_rain), generateStandard(ResourceManager.missileHuge_CL_tex, ResourceManager.missileHuge));
renderers.put(new ComparableStack(ModItems.missile_drill), generateStandard(ResourceManager.missileHuge_BU_tex, ResourceManager.missileHuge));
renderers.put(new ComparableStack(ModItems.missile_nuclear), generateLarge(ResourceManager.missileNuclear_tex, ResourceManager.missileNuclear));
renderers.put(new ComparableStack(ModItems.missile_nuclear_cluster), generateLarge(ResourceManager.missileMIRV_tex, ResourceManager.missileNuclear));
renderers.put(new ComparableStack(ModItems.missile_volcano), generateLarge(ResourceManager.missileVolcano_tex, ResourceManager.missileNuclear));
renderers.put(new ComparableStack(ModItems.missile_endo), generateLarge(ResourceManager.missileEndo_tex, ResourceManager.missileThermo));
renderers.put(new ComparableStack(ModItems.missile_exo), generateLarge(ResourceManager.missileExo_tex, ResourceManager.missileThermo));
renderers.put(new ComparableStack(ModItems.missile_doomsday), generateDouble(ResourceManager.missileDoomsday_tex, ResourceManager.missileDoomsday));
renderers.put(new ComparableStack(ModItems.missile_carrier), x -> {
GL11.glScalef(2F, 2F, 2F);
x.bindTexture(ResourceManager.missileCarrier_tex);
ResourceManager.missileCarrier.renderAll();
GL11.glTranslated(0.0D, 0.5D, 0.0D);
GL11.glTranslated(1.25D, 0.0D, 0.0D);
x.bindTexture(ResourceManager.missileBooster_tex);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(-2.5D, 0.0D, 0.0D);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(1.25D, 0.0D, 0.0D);
GL11.glTranslated(0.0D, 0.0D, 1.25D);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(0.0D, 0.0D, -2.5D);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(0.0D, 0.0D, 1.25D);
});
renderers.put(new ComparableStack(ModItems.missile_shuttle), generateStandard(ResourceManager.missileShuttle_tex, ResourceManager.missileShuttle));
}
}

View File

@ -6,10 +6,14 @@ import com.hbm.render.util.RenderItemStack;
import com.hbm.render.util.RenderMiscEffects;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraftforge.client.IItemRenderer;
public class ItemRendererMeteorSword implements IItemRenderer {
@ -17,16 +21,16 @@ public class ItemRendererMeteorSword implements IItemRenderer {
float r;
float g;
float b;
public ItemRendererMeteorSword(float r, float g, float b) {
this.r = r;
this.g = g;
this.b = b;
}
@Override
public boolean handleRenderType(ItemStack stack, ItemRenderType type) {
return type == ItemRenderType.INVENTORY;
return type != ItemRenderType.ENTITY;
}
@Override
@ -39,56 +43,138 @@ public class ItemRendererMeteorSword implements IItemRenderer {
GL11.glPushMatrix();
RenderHelper.enableGUIStandardItemLighting();
Minecraft mc = Minecraft.getMinecraft();
RenderItemStack.renderItem.renderItemIntoGUI(mc.fontRenderer, mc.renderEngine, item, 0, 0);
switch(type) {
mc.renderEngine.bindTexture(RenderMiscEffects.glint);
case EQUIPPED_FIRST_PERSON:
GL11.glRotated(180, 0, 1, 0);
GL11.glRotated(-90, 0, 0, 1);
GL11.glTranslated(0.5, 0.5, 0);
GL11.glTranslated(-0.5, -0.5, 0);
GL11.glRotated(180, 0, 1, 0);
GL11.glRotated(-90, 0, 0, 1);
GL11.glTranslated(0.5, 0.5, 0);
GL11.glScaled(1.36 * 2, 1.36 * 2, 0.68 * 2);
GL11.glTranslated(-0.5, -0.5, 0.25);
break;
case EQUIPPED:
GL11.glRotated(180, 0, 1, 0);
GL11.glRotated(-90, 0, 0, 1);
GL11.glTranslated(0.2, 0.55, 0);
GL11.glRotated(45, 0, 0, 1);
GL11.glRotated(180, 0, 1, 0);
GL11.glRotated(-45, 0, 0, 1);
GL11.glScaled(1.7, 1.7, 0.85);
break;
case INVENTORY:
break;
default: break;
}
GL11.glDepthFunc(GL11.GL_EQUAL);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDepthMask(false);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_BLEND);
for (int j1 = 0; j1 < 2; ++j1) {
OpenGlHelper.glBlendFunc(772, 1, 0, 0);
float f = 0.00390625F;
float f1 = 0.00390625F;
float f2 = (float)(Minecraft.getSystemTime() % (long)(3000 + j1 * 1873)) / (3000.0F + (float)(j1 * 1873)) * 256.0F;
float f3 = 0.0F;
Tessellator tessellator = Tessellator.instance;
float f4 = 4.0F;
if(data.length > 1 && data[1] instanceof EntityLivingBase) {
EntityLivingBase entity = (EntityLivingBase) data[1];
IIcon iicon = entity.getItemIcon(item, 0);
if (j1 == 1)
{
f4 = -1.0F;
}
float in = 0.36F;
GL11.glColor4f(r * in, g * in, b * in, 1.0F);
int p_77018_2_ = 0;
int p_77018_4_ = 16;
int p_77018_3_ = 0;
int p_77018_5_ = 16;
int zLevel = 0;
if(iicon == null) {
return;
}
tessellator.startDrawingQuads();
tessellator.addVertexWithUV((double)(p_77018_2_ + 0), (double)(p_77018_3_ + p_77018_5_), (double)zLevel, (double)((f2 + (float)p_77018_5_ * f4) * f), (double)((f3 + (float)p_77018_5_) * f1));
tessellator.addVertexWithUV((double)(p_77018_2_ + p_77018_4_), (double)(p_77018_3_ + p_77018_5_), (double)zLevel, (double)((f2 + (float)p_77018_4_ + (float)p_77018_5_ * f4) * f), (double)((f3 + (float)p_77018_5_) * f1));
tessellator.addVertexWithUV((double)(p_77018_2_ + p_77018_4_), (double)(p_77018_3_ + 0), (double)zLevel, (double)((f2 + (float)p_77018_4_) * f), (double)((f3 + 0.0F) * f1));
tessellator.addVertexWithUV((double)(p_77018_2_ + 0), (double)(p_77018_3_ + 0), (double)zLevel, (double)((f2 + 0.0F) * f), (double)((f3 + 0.0F) * f1));
tessellator.draw();
}
Minecraft.getMinecraft().getTextureManager().bindTexture(Minecraft.getMinecraft().getTextureManager().getResourceLocation(item.getItemSpriteNumber()));
TextureUtil.func_152777_a(false, false, 1.0F);
Tessellator tessellator = Tessellator.instance;
ItemRenderer.renderItemIn2D(tessellator, iicon.getMaxU(), iicon.getMinV(), iicon.getMinU(), iicon.getMaxV(), iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F);
renderGlint3D(tessellator, 0.0625F);
} else {
RenderItemStack.renderItemStackNoEffect(0, 0, 0, item);
renderGlintFlat();
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glDepthMask(true);
GL11.glDisable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glPopMatrix();
}
public void renderGlintFlat() {
Minecraft mc = Minecraft.getMinecraft();
mc.renderEngine.bindTexture(RenderMiscEffects.glint);
GL11.glDepthFunc(GL11.GL_EQUAL);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDepthMask(false);
GL11.glEnable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_BLEND);
for(int j1 = 0; j1 < 2; ++j1) {
OpenGlHelper.glBlendFunc(772, 1, 0, 0);
float scaleU = 0.00390625F;
float scaleV = 0.00390625F;
float anim = (float) (Minecraft.getSystemTime() % (long) (3000 + j1 * 1873)) / (3000.0F + (float) (j1 * 1873)) * 256.0F;
float offsetV = 0.0F;
Tessellator tessellator = Tessellator.instance;
float sizeMultU = 4.0F;
if(j1 == 1) {
sizeMultU = -1.0F;
}
float in = 0.36F;
GL11.glColor4f(r * in, g * in, b * in, 1.0F);
int x = 0;
int sizeX = 16;
int y = 0;
int sizeY = 16;
int zLevel = 0;
tessellator.startDrawingQuads();
tessellator.addVertexWithUV(x + 0, y + sizeY, zLevel, (anim + sizeY * sizeMultU) * scaleU, (offsetV + sizeY) * scaleV);
tessellator.addVertexWithUV(x + sizeX, y + sizeY, zLevel, (anim + sizeX + sizeY * sizeMultU) * scaleU, (offsetV + sizeY) * scaleV);
tessellator.addVertexWithUV(x + sizeX, y + 0, zLevel, (anim + sizeX) * scaleU, (offsetV + 0.0F) * scaleV);
tessellator.addVertexWithUV(x + 0, y + 0, zLevel, (anim + 0.0F) * scaleU, (offsetV + 0.0F) * scaleV);
tessellator.draw();
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glDepthMask(true);
GL11.glDisable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_ALPHA_TEST);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDepthFunc(GL11.GL_LEQUAL);
}
public void renderGlint3D(Tessellator tessellator, float depth) {
Minecraft mc = Minecraft.getMinecraft();
mc.renderEngine.bindTexture(RenderMiscEffects.glint);
GL11.glDepthFunc(GL11.GL_EQUAL);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
float in = 0.36F;
GL11.glColor4f(r * in, g * in, b * in, 1.0F);
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glPushMatrix();
float scale = 0.125F;
GL11.glScalef(scale, scale, scale);
float offset = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F;
GL11.glTranslatef(offset, 0.0F, 0.0F);
GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F);
ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, depth);
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glScalef(scale, scale, scale);
offset = (float) (Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F;
GL11.glTranslatef(-offset, 0.0F, 0.0F);
GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F);
ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 255, 255, depth);
GL11.glPopMatrix();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDepthFunc(GL11.GL_LEQUAL);
}
}

View File

@ -1,11 +1,15 @@
package com.hbm.render.tileentity;
import java.util.function.Consumer;
import org.lwjgl.opengl.GL11;
import com.hbm.items.ModItems;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.main.ResourceManager;
import com.hbm.render.item.ItemRenderMissileGeneric;
import com.hbm.tileentity.bomb.TileEntityLaunchPad;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
@ -29,188 +33,8 @@ public class RenderLaunchPadTier1 extends TileEntitySpecialRenderer {
if(toRender != null) {
GL11.glTranslated(0, 1, 0);
//TODO: add a registry for missile rendering to be reused here and for the entity renderer
if(toRender.getItem() == ModItems.missile_generic) {
bindTexture(ResourceManager.missileV2_HE_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileV2.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_decoy) {
bindTexture(ResourceManager.missileV2_decoy_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileV2.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_stealth) {
bindTexture(ResourceManager.missileStealth_tex);
ResourceManager.missileStealth.renderAll();
}
if(toRender.getItem() == ModItems.missile_strong) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileStrong_HE_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileStrong.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_cluster) {
GL11.glScalef(1.0F, 1.0F, 1.0F);
bindTexture(ResourceManager.missileV2_CL_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileV2.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_nuclear) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileNuclear_tex);
ResourceManager.missileNuclear.renderAll();
}
if(toRender.getItem() == ModItems.missile_incendiary) {
GL11.glScalef(1.0F, 1.0F, 1.0F);
bindTexture(ResourceManager.missileV2_IN_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileV2.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_buster) {
GL11.glScalef(1.0F, 1.0F, 1.0F);
bindTexture(ResourceManager.missileV2_BU_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileV2.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_incendiary_strong) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileStrong_IN_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileStrong.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_cluster_strong) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileStrong_CL_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileStrong.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_buster_strong) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileStrong_BU_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileStrong.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_burst) {
bindTexture(ResourceManager.missileHuge_HE_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileHuge.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_inferno) {
bindTexture(ResourceManager.missileHuge_IN_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileHuge.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_rain) {
bindTexture(ResourceManager.missileHuge_CL_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileHuge.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_drill) {
bindTexture(ResourceManager.missileHuge_BU_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileHuge.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_endo) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileEndo_tex);
ResourceManager.missileThermo.renderAll();
}
if(toRender.getItem() == ModItems.missile_exo) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileExo_tex);
ResourceManager.missileThermo.renderAll();
}
if(toRender.getItem() == ModItems.missile_nuclear_cluster) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileMIRV_tex);
ResourceManager.missileNuclear.renderAll();
}
if(toRender.getItem() == ModItems.missile_doomsday) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileDoomsday_tex);
ResourceManager.missileDoomsday.renderAll();
}
if(toRender.getItem() == ModItems.missile_taint) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileTaint_tex);
ResourceManager.missileTaint.renderAll();
}
if(toRender.getItem() == ModItems.missile_micro) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileMicro_tex);
ResourceManager.missileTaint.renderAll();
}
if(toRender.getItem() == ModItems.missile_carrier) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileCarrier_tex);
ResourceManager.missileCarrier.renderAll();
GL11.glTranslated(0.0D, 0.5D, 0.0D);
GL11.glTranslated(1.25D, 0.0D, 0.0D);
bindTexture(ResourceManager.missileBooster_tex);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(-2.5D, 0.0D, 0.0D);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(1.25D, 0.0D, 0.0D);
GL11.glTranslated(0.0D, 0.0D, 1.25D);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(0.0D, 0.0D, -2.5D);
ResourceManager.missileBooster.renderAll();
GL11.glTranslated(0.0D, 0.0D, 1.25D);
}
if(toRender.getItem() == ModItems.missile_anti_ballistic) {
GL11.glScalef(1.0F, 1.0F, 1.0F);
bindTexture(ResourceManager.missileAA_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileABM.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_bhole) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileMicroBHole_tex);
ResourceManager.missileTaint.renderAll();
}
if(toRender.getItem() == ModItems.missile_schrabidium) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileMicroSchrab_tex);
ResourceManager.missileTaint.renderAll();
}
if(toRender.getItem() == ModItems.missile_emp) {
GL11.glScalef(2F, 2F, 2F);
bindTexture(ResourceManager.missileMicroEMP_tex);
ResourceManager.missileTaint.renderAll();
}
if(toRender.getItem() == ModItems.missile_emp_strong) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileStrong_EMP_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
ResourceManager.missileStrong.renderAll();
GL11.glShadeModel(GL11.GL_FLAT);
}
if(toRender.getItem() == ModItems.missile_volcano) {
GL11.glScalef(1.5F, 1.5F, 1.5F);
bindTexture(ResourceManager.missileVolcano_tex);
ResourceManager.missileNuclear.renderAll();
}
if(toRender.getItem() == ModItems.missile_shuttle) {
GL11.glScalef(1.0F, 1.0F, 1.0F);
bindTexture(ResourceManager.missileShuttle_tex);
ResourceManager.missileShuttle.renderAll();
}
Consumer<TextureManager> renderer = ItemRenderMissileGeneric.renderers.get(new ComparableStack(toRender).makeSingular());
renderer.accept(this.field_147501_a.field_147553_e);
}
}

View File

@ -22,8 +22,10 @@ public interface IUpgradeInfoProvider {
public static final String KEY_ACID = "upgrade.acid";
public static final String KEY_BURN = "upgrade.burn";
public static final String KEY_CONSUMPTION = "upgrade.consumption";
public static final String KEY_COOLANT_CONSUMPTION = "upgrade.coolantConsumption";
public static final String KEY_DELAY = "upgrade.delay";
public static final String KEY_EFFICIENCY = "upgrade.efficiency";
public static final String KEY_FORTUNE = "upgrade.fortune";
public static final String KEY_OVERHEAT_CHANCE = "upgrade.overheatChance";
public static final String KEY_RANGE = "upgrade.range";
}

View File

@ -3,6 +3,7 @@ package com.hbm.tileentity.machine;
import java.util.List;
import java.util.Map.Entry;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.BombConfig;
import com.hbm.entity.effect.EntityBlackHole;
import com.hbm.entity.logic.EntityBalefire;
@ -21,12 +22,15 @@ import com.hbm.inventory.gui.GUIMachineCyclotron;
import com.hbm.inventory.recipes.CyclotronRecipes;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemMachineUpgrade;
import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType;
import com.hbm.lib.Library;
import com.hbm.packet.AuxParticlePacketNT;
import com.hbm.packet.PacketDispatcher;
import com.hbm.tileentity.IConditionalInvAccess;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.IUpgradeInfoProvider;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.I18nUtil;
import com.hbm.util.Tuple.Pair;
import com.hbm.util.fauxpointtwelve.DirPos;
@ -42,14 +46,15 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess {
public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider {
public long power;
public static final long maxPower = 100000000;
public int consumption = 1000000;
public int consumption = 1_000_000;
public boolean isOn;
@ -98,7 +103,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements
if(isOn) {
int defConsumption = consumption - 100000 * getConsumption();
int defConsumption = consumption - 100_000 * getConsumption();
if(canProcess() && power >= defConsumption) {
@ -111,14 +116,16 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements
this.markDirty();
}
int safety = this.getSafety();
if(coolant.getFill() > 0) {
countdown = 0;
if(worldObj.rand.nextInt(3) == 0)
if(worldObj.rand.nextInt(3 * safety) == 0)
coolant.setFill(coolant.getFill() - 1);
} else if(worldObj.rand.nextInt(this.getSafety()) == 0) {
} else if(worldObj.rand.nextInt(safety) == 0) {
countdown++;
@ -576,4 +583,32 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements
return new int[] {6, 7, 8};
}
@Override
public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) {
return type == UpgradeType.SPEED || type == UpgradeType.POWER || type == UpgradeType.EFFECT;
}
@Override
public void provideInfo(UpgradeType type, int level, List<String> info, boolean extendedInfo) {
info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_cyclotron));
if(type == UpgradeType.SPEED) {
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 100 / (level + 1)) + "%"));
}
if(type == UpgradeType.POWER) {
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "-" + (level * 10) + "%"));
}
if(type == UpgradeType.EFFECT) {
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_COOLANT_CONSUMPTION, "-" + (100 - 100 / (level + 1)) + "%"));
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_OVERHEAT_CHANCE, "-" + (100 - 100 / (level + 1)) + "%"));
}
}
@Override
public int getMaxLevel(UpgradeType type) {
if(type == UpgradeType.SPEED) return 3;
if(type == UpgradeType.POWER) return 3;
if(type == UpgradeType.EFFECT) return 3;
return 0;
}
}

View File

@ -852,7 +852,7 @@ public class TileEntityMachineExcavator extends TileEntityMachineBase implements
public void provideInfo(UpgradeType type, int level, List<String> info, boolean extendedInfo) {
info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_excavator));
if(type == UpgradeType.SPEED) {
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 100 / (level / 2 + 1)) + "%"));
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (100 - 200 / (level + 2)) + "%"));
info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%"));
}
if(type == UpgradeType.POWER) {

View File

@ -5668,9 +5668,11 @@ turret.players=Target Players: %s
upgrade.acid=Acid required %s
upgrade.burn=Burn %smb/t for %sHE
upgrade.consumption=Consumption %s
upgrade.coolantConsumption=Coolant Consumption %s
upgrade.delay=Process time %s
upgrade.efficiency=Efficiency %s
upgrade.fortune=Fortune %s
upgrade.overheatChance=Overheat chance %s
upgrade.range=Range %s
upgrade.gui.title=§lAcceptable Upgrades:§r