eeeeeeee macarena!

This commit is contained in:
Bob 2024-02-18 17:52:42 +01:00
parent 65cda2b65b
commit 7ad017ec8e
41 changed files with 1224 additions and 116 deletions

View File

@ -19,6 +19,17 @@
* Halogen floodlights are made with bromine and cast a light beam 32 blocks long
* Lights are on by default and can be toggled with redstone
* Tritium lamps have also been retrofitted with longer range lighting, casting beams in all cardinal directions for 8 blocks
* Launch pad
* The standard launch pad is now a 9x9 platform that changes depending on what missile is loaded
* Missiles now have to be fueled like they would need to be on custom missile launchers
* The old launch pad has been renamed to silo launch pad and has kept the same rough shape
* Launch pads can still receive missiles from hoppers, however they now have a loading delay, making missiles no longer spammable from a single launch pad
* Large launch pads have to physically lift and place the rocket onto the pad, while the silo launch pad has a refueling delay
* Custom missiles are not yet usable on the new launch pad, for now they still require the dedicated custom missile launch pads
* Large silo hatch
* Because the new nuclear missile model is too fat, there's now a larger silo hatch
* Has a 7x7 footprint and a 5x5 opening
* Bedrock ores for neodymium and rare earth chunks
## Changed
* Deco bocks now drop all of the time, but they drop themselves instead of ingots
@ -74,6 +85,13 @@
* Instead of taking up the chestplate slot, it's now an armor mod worn in the insert slot
* The armor no longer gives absorption, instead it adds 25 points to the shield count
* The +25 bypasses the shield limit of 100, meaning that with enough shield infusions, the total maximum is now 125
* The likelihood of uranium ore turning into schrabidium from full-sized nukes is now 10% instead of 1%. Conversion rates for small dirty explosions such as radioactive barrels remain unchanged.
* Fallout layers will no longer affect players in creative mode
* Rare earth chunks are now centrifugable, yielding larger quantities of the elements that are most needed earlier in the game
* Tier 3 missilles no longer need large fuel tanks and thrusters, instead they use two medium fuel tanks and four medium thrusters
* Tier 4s now need three thrusters
* Tier 0 missiles now come pre-fueled with solid fuel as part of their recipe
* Updated the ABM recipe to use the act welder, being made of a tier 0 missile assembly with extra thrusters and loaded with TNT/TATB
## Fixed
* Fixed dupe caused by shift-clicking ashes out of the bricked furnace
@ -91,4 +109,6 @@
* Fixed research reactor OC integration allowing the control rods to be set out of bounds
* Fixed fallout falling faster and overlaying if multiple fallout areas intersect
* Fixed template folder 3D models rendering with weird shading
* HUD elements like jetpack charge and the shield bar should now still render even if Tinker's Construct replaces the health bar renderer
* HUD elements like jetpack charge and the shield bar should now still render even if Tinker's Construct replaces the health bar renderer
* Fixed players glitching into blocks with larger bounding box when standing on top of them and relogging
* Fixed a rare crash caused by doors on chunk borders

View File

@ -608,6 +608,7 @@ public class ModBlocks {
public static Block fire_door;
public static Block transition_seal;
public static Block silo_hatch;
public static Block silo_hatch_large;
// 1.12.2 Doors
public static Block secure_access_door;
@ -2134,6 +2135,7 @@ public class ModBlocks {
fire_door = new BlockDoorGeneric(Material.iron, DoorDecl.FIRE_DOOR).setBlockName("fire_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":fire_door");
transition_seal = new BlockDoorGeneric(Material.iron, DoorDecl.TRANSITION_SEAL).setBlockName("transition_seal").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transition_seal");
silo_hatch = new BlockDoorGeneric(Material.iron, DoorDecl.SILO_HATCH).setBlockName("silo_hatch").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
silo_hatch_large = new BlockDoorGeneric(Material.iron, DoorDecl.SILO_HATCH_LARGE).setBlockName("silo_hatch_large").setHardness(10.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
secure_access_door = new BlockDoorGeneric(Material.iron, DoorDecl.SECURE_ACCESS_DOOR).setBlockName("secure_access_door").setHardness(20.0F).setResistance(2_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
large_vehicle_door = new BlockDoorGeneric(Material.iron, DoorDecl.LARGE_VEHICLE_DOOR).setBlockName("large_vehicle_door").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
qe_containment = new BlockDoorGeneric(Material.iron, DoorDecl.QE_CONTAINMENT).setBlockName("qe_containment").setHardness(10.0F).setResistance(1_000.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel");
@ -3082,6 +3084,7 @@ public class ModBlocks {
GameRegistry.registerBlock(fire_door, fire_door.getUnlocalizedName());
GameRegistry.registerBlock(transition_seal, transition_seal.getUnlocalizedName());
GameRegistry.registerBlock(silo_hatch, silo_hatch.getUnlocalizedName());
GameRegistry.registerBlock(silo_hatch_large, silo_hatch_large.getUnlocalizedName());
GameRegistry.registerBlock(sliding_blast_door, sliding_blast_door.getUnlocalizedName());
//Doors

View File

@ -2,23 +2,33 @@ package com.hbm.blocks.bomb;
import com.hbm.blocks.BlockDummyable;
import com.hbm.interfaces.IBomb;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.bomb.TileEntityLaunchPad;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class LaunchPad extends BlockDummyable implements IBomb {
public LaunchPad(Material mat) {
super(mat);
this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, -1.5D, -0.5D, 1D, -0.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(0.5D, 0D, -1.5D, 1.5D, 1D, -0.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0D, 0.5D, -0.5D, 1D, 1.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(0.5D, 0D, 0.5D, 1.5D, 1D, 1.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(-0.5D, 0.5D, -1.5D, 0.5D, 1D, 1.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(-1.5D, 0.5D, -0.5D, 1.5D, 1D, 0.5D));
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityLaunchPad();
if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid();
return null;
}
@ -71,4 +81,17 @@ public class LaunchPad extends BlockDummyable implements IBomb {
}
super.onNeighborBlockChange( world, x, y, z, blockIn);
}
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x += dir.offsetX * o;
z += dir.offsetZ * o;
this.makeExtra(world, x + 1, y, z + 1);
this.makeExtra(world, x + 1, y, z - 1);
this.makeExtra(world, x - 1, y, z + 1);
this.makeExtra(world, x - 1, y, z - 1);
}
}

View File

@ -2,23 +2,30 @@ package com.hbm.blocks.bomb;
import com.hbm.blocks.BlockDummyable;
import com.hbm.interfaces.IBomb;
import com.hbm.tileentity.TileEntityProxyCombo;
import com.hbm.tileentity.bomb.TileEntityLaunchPadLarge;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class LaunchPadLarge extends BlockDummyable implements IBomb {
public LaunchPadLarge(Material mat) {
super(mat);
this.bounding.add(AxisAlignedBB.getBoundingBox(-4.5D, 0D, -4.5D, 4.5D, 1D, -0.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(-4.5D, 0D, 0.5D, 4.5D, 1D, 4.5D));
this.bounding.add(AxisAlignedBB.getBoundingBox(-4.5D, 0.875D, -0.5D, 4.5D, 1D, 0.5D));
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
if(meta >= 12) return new TileEntityLaunchPadLarge();
if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid();
return null;
}
@ -71,4 +78,21 @@ public class LaunchPadLarge extends BlockDummyable implements IBomb {
}
super.onNeighborBlockChange( world, x, y, z, blockIn);
}
@Override
public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) {
super.fillSpace(world, x, y, z, dir, o);
x += dir.offsetX * o;
z += dir.offsetZ * o;
this.makeExtra(world, x + 4, y, z + 2);
this.makeExtra(world, x + 4, y, z - 2);
this.makeExtra(world, x - 4, y, z + 2);
this.makeExtra(world, x - 4, y, z - 2);
this.makeExtra(world, x + 2, y, z + 4);
this.makeExtra(world, x - 2, y, z + 4);
this.makeExtra(world, x + 2, y, z - 4);
this.makeExtra(world, x - 2, y, z - 4);
}
}

View File

@ -48,6 +48,7 @@ public class BlockFallout extends Block {
public void onEntityWalking(World world, int x, int y, int z, Entity entity) {
if(!world.isRemote && entity instanceof EntityLivingBase) {
if(entity instanceof EntityPlayer && ((EntityPlayer)entity).capabilities.isCreativeMode) return;
PotionEffect effect = new PotionEffect(HbmPotion.radiation.id, 10 * 60 * 20, 0);
effect.setCurativeItems(new ArrayList());
((EntityLivingBase) entity).addPotionEffect(effect);

View File

@ -70,8 +70,8 @@ public class FalloutConfigJSON {
entries.add(new FalloutEntry() .mMa(Material.plants) .prim(new Triplet(Blocks.air, 0, 1)) .max(woodEffectRange));
entries.add(new FalloutEntry() .mMa(Material.vine) .prim(new Triplet(Blocks.air, 0, 1)) .max(woodEffectRange));
entries.add(new FalloutEntry() .mB(ModBlocks.waste_leaves) .prim(new Triplet(Blocks.air, 0, 1)) .max(woodEffectRange));
entries.add(new FalloutEntry() .mB(Blocks.leaves) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange));
entries.add(new FalloutEntry() .mB(Blocks.leaves2) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange));
entries.add(new FalloutEntry() .mB(Blocks.leaves) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange - 5D));
entries.add(new FalloutEntry() .mB(Blocks.leaves2) .prim(new Triplet(ModBlocks.waste_leaves, 0, 1)) .min(woodEffectRange - 5D));
entries.add(new FalloutEntry().mB(Blocks.mossy_cobblestone).prim(new Triplet(Blocks.coal_ore, 0, 1)));
entries.add(new FalloutEntry().mB(ModBlocks.ore_nether_uranium).prim(new Triplet(ModBlocks.ore_nether_schrabidium, 0, 1), new Triplet(ModBlocks.ore_nether_uranium_scorched, 0, 99)));
@ -84,8 +84,8 @@ public class FalloutConfigJSON {
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_diamond, m, 3), new Triplet(ModBlocks.ore_sellafield_emerald, m, 2)) .c(0.5) .max(i * 5).sol(true).mB(Blocks.coal_ore));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_diamond, m, 1)) .c(0.2) .max(i * 5).sol(true).mB(ModBlocks.ore_lignite));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_emerald, m, 1)) .max(i * 5).sol(true).mB(ModBlocks.ore_beryllium));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 99)) .max(i * 5).sol(true).mB(ModBlocks.ore_uranium));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 99)) .max(i * 5).sol(true).mB(ModBlocks.ore_gneiss_uranium));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 9)) .max(i * 5).sol(true).mB(ModBlocks.ore_uranium));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_schrabidium, m, 1), new Triplet(ModBlocks.ore_sellafield_uranium_scorched, m, 9)) .max(i * 5).sol(true).mB(ModBlocks.ore_gneiss_uranium));
entries.add(new FalloutEntry().prim(new Triplet(ModBlocks.ore_sellafield_radgem, m, 1)) .max(i * 5).sol(true).mB(Blocks.diamond_ore));
entries.add(new FalloutEntry() .prim(new Triplet(ModBlocks.sellafield_slaked, m, 1)).max(i * 5).sol(true).mMa(Material.rock));
entries.add(new FalloutEntry() .prim(new Triplet(ModBlocks.sellafield_slaked, m, 1)).max(i * 5).sol(true).mMa(Material.sand));

View File

@ -122,7 +122,7 @@ public class EntityNukeTorex extends Entity {
for(int i = 0; i < 20; i++) {
for(int j = 0; j < 4; j++) {
float angle = (float) (Math.PI * 2 * rand.nextDouble());
Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * (3 + rand.nextDouble()), 0, 0);
Vec3 vec = Vec3.createVectorHelper(torusWidth + rollerSize * (5 + rand.nextDouble()), 0, 0);
vec.rotateAroundZ((float) (Math.PI / 45 * j));
vec.rotateAroundY(angle);
Cloudlet cloud = new Cloudlet(posX + vec.xCoord, posY + coreHeight - 5 + j * s, posZ + vec.zCoord, angle, 0, (int) ((20 + ticksExisted / 10) * (1 + rand.nextDouble() * 0.1)), TorexType.CONDENSATION);

View File

@ -176,17 +176,29 @@ public abstract class EntityMissileBaseNT extends EntityThrowableInterp implemen
}
protected void spawnContrail() {
this.spawnContraolWithOffset(0, 0, 0);
}
protected void spawnContraolWithOffset(double offsetX, double offsetY, double offsetZ) {
Vec3 vec = Vec3.createVectorHelper(this.lastTickPosX - this.posX, this.lastTickPosY - this.posY, this.lastTickPosZ - this.posZ);
double len = vec.lengthVector();
vec = vec.normalize();
Vec3 thrust = Vec3.createVectorHelper(0, 1, 0);
thrust.rotateAroundZ(this.rotationPitch * (float) Math.PI / 180F);
thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F);
for(int i = 0; i < Math.max(Math.min(len, 10), 1); i++) {
int j = i - 1;
double j = i - len;
NBTTagCompound data = new NBTTagCompound();
data.setDouble("posX", posX - vec.xCoord * j);
data.setDouble("posY", posY - vec.yCoord * j);
data.setDouble("posZ", posZ - vec.zCoord * j);
data.setDouble("posX", posX - vec.xCoord * j + offsetX);
data.setDouble("posY", posY - vec.yCoord * j + offsetY);
data.setDouble("posZ", posZ - vec.zCoord * j + offsetZ);
data.setString("type", "missileContrail");
data.setFloat("scale", this.getContrailScale());
data.setDouble("moX", -thrust.xCoord);
data.setDouble("moY", -thrust.yCoord);
data.setDouble("moZ", -thrust.zCoord);
data.setInteger("maxAge", 100 + rand.nextInt(40));
MainRegistry.proxy.effectNT(data);
}
}

View File

@ -8,6 +8,7 @@ import com.hbm.entity.logic.EntityNukeExplosionMK5;
import com.hbm.items.ModItems;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public class EntityMissileDoomsday extends EntityMissileBaseNT {
@ -26,6 +27,26 @@ public class EntityMissileDoomsday extends EntityMissileBaseNT {
EntityNukeTorex.statFac(worldObj, posX, posY, posZ, BombConfig.missileRadius * 2);
}
@Override
protected void spawnContrail() {
byte rot = this.dataWatcher.getWatchableObjectByte(3);
Vec3 thrust = Vec3.createVectorHelper(0, 0, 1);
switch(rot) {
case 2: thrust.rotateAroundY((float) -Math.PI / 2F); break;
case 4: thrust.rotateAroundY((float) -Math.PI); break;
case 3: thrust.rotateAroundY((float) -Math.PI / 2F * 3F); break;
}
thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F);
thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F);
thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F);
this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord);
this.spawnContraolWithOffset(0, 0, 0);
this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord);
}
@Override public List<ItemStack> getDebris() { return null; }
@Override public ItemStack getDebrisRareDrop() { return null; }
@Override public String getUnlocalizedName() { return "radar.target.doomsday"; }

View File

@ -11,6 +11,7 @@ import com.hbm.items.ModItems;
import api.hbm.entity.IRadarDetectableNT;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public abstract class EntityMissileTier3 extends EntityMissileBaseNT {
@ -39,6 +40,20 @@ public abstract class EntityMissileTier3 extends EntityMissileBaseNT {
public int getBlipLevel() {
return IRadarDetectableNT.TIER3;
}
@Override
protected void spawnContrail() {
Vec3 thrust = Vec3.createVectorHelper(0, 0, 0.5);
thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F);
thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F);
thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F);
this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord);
this.spawnContraolWithOffset(-thrust.zCoord, thrust.yCoord, thrust.xCoord);
this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord);
this.spawnContraolWithOffset(thrust.zCoord, -thrust.zCoord, -thrust.xCoord);
}
public static class EntityMissileBurst extends EntityMissileTier3 {
public EntityMissileBurst(World world) { super(world); }

View File

@ -12,6 +12,7 @@ import com.hbm.items.ModItems;
import api.hbm.entity.IRadarDetectableNT;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public abstract class EntityMissileTier4 extends EntityMissileBaseNT {
@ -39,6 +40,26 @@ public abstract class EntityMissileTier4 extends EntityMissileBaseNT {
public int getBlipLevel() {
return IRadarDetectableNT.TIER4;
}
@Override
protected void spawnContrail() {
byte rot = this.dataWatcher.getWatchableObjectByte(3);
Vec3 thrust = Vec3.createVectorHelper(0, 0, 1);
switch(rot) {
case 2: thrust.rotateAroundY((float) -Math.PI / 2F); break;
case 4: thrust.rotateAroundY((float) -Math.PI); break;
case 3: thrust.rotateAroundY((float) -Math.PI / 2F * 3F); break;
}
thrust.rotateAroundY((this.rotationYaw + 90) * (float) Math.PI / 180F);
thrust.rotateAroundX(this.rotationPitch * (float) Math.PI / 180F);
thrust.rotateAroundY(-(this.rotationYaw + 90) * (float) Math.PI / 180F);
this.spawnContraolWithOffset(thrust.xCoord, thrust.yCoord, thrust.zCoord);
this.spawnContraolWithOffset(0, 0, 0);
this.spawnContraolWithOffset(-thrust.xCoord, -thrust.zCoord, -thrust.zCoord);
}
public static class EntityMissileNuclear extends EntityMissileTier4 {
public EntityMissileNuclear(World world) { super(world); }

View File

@ -1,8 +1,12 @@
package com.hbm.inventory.container;
import com.hbm.inventory.FluidContainerRegistry;
import com.hbm.inventory.SlotTakeOnly;
import com.hbm.items.ModItems;
import com.hbm.tileentity.bomb.TileEntityLaunchPadBase;
import api.hbm.energy.IBatteryItem;
import api.hbm.item.IDesignatorItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
@ -42,10 +46,59 @@ public class ContainerLaunchPadLarge extends Container {
this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 212));
}
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int par2) {
return null; //TODO
ItemStack var3 = null;
Slot var4 = (Slot) this.inventorySlots.get(par2);
if(var4 != null && var4.getHasStack()) {
ItemStack var5 = var4.getStack();
var3 = var5.copy();
if(par2 <= 6) {
if(!this.mergeItemStack(var5, 7, this.inventorySlots.size(), true)) {
return null;
}
} else {
if(var3.getItem() instanceof IBatteryItem || var3.getItem() == ModItems.battery_creative) {
if(!this.mergeItemStack(var5, 2, 3, false)) {
return null;
}
} else if(launchpad.isMissileValid(var3)) {
if(!this.mergeItemStack(var5, 0, 1, false)) {
return null;
}
} else if(var3.getItem() == ModItems.fluid_barrel_infinite) {
if(!this.mergeItemStack(var5, 3, 4, false)) if(!this.mergeItemStack(var5, 5, 6, false)) {
return null;
}
} else if(FluidContainerRegistry.getFluidContent(var3, launchpad.tanks[0].getTankType()) > 0) {
if(!this.mergeItemStack(var5, 3, 4, false)) {
return null;
}
} else if(FluidContainerRegistry.getFluidContent(var3, launchpad.tanks[1].getTankType()) > 0) {
if(!this.mergeItemStack(var5, 5, 6, false)) {
return null;
}
} else if(var3.getItem() instanceof IDesignatorItem) {
if(!this.mergeItemStack(var5, 1, 2, false)) {
return null;
}
} else {
return null;
}
}
if(var5.stackSize == 0) {
var4.putStack((ItemStack) null);
} else {
var4.onSlotChanged();
}
}
return var3;
}
@Override

View File

@ -1,5 +1,7 @@
package com.hbm.inventory.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import org.lwjgl.opengl.GL11;
@ -12,12 +14,14 @@ import com.hbm.items.weapon.ItemMissile;
import com.hbm.lib.RefStrings;
import com.hbm.render.item.ItemRenderMissileGeneric;
import com.hbm.tileentity.bomb.TileEntityLaunchPadBase;
import com.hbm.util.I18nUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class GUILaunchPadLarge extends GuiInfoContainer {
@ -40,6 +44,17 @@ public class GUILaunchPadLarge extends GuiInfoContainer {
this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 107, guiTop + 88 - 52, 16, 52, launchpad.power, launchpad.maxPower);
launchpad.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 88 - 52, 16, 52);
launchpad.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 88 - 52, 16, 52);
if(this.mc.thePlayer.inventory.getItemStack() == null && this.isMouseOverSlot(this.inventorySlots.getSlot(1), mouseX, mouseY) && !this.inventorySlots.getSlot(1).getHasStack()) {
ItemStack[] list = new ItemStack[] { new ItemStack(ModItems.designator), new ItemStack(ModItems.designator_range), new ItemStack(ModItems.designator_manual) };
List<Object[]> lines = new ArrayList();
ItemStack selected = list[(int) ((System.currentTimeMillis() % (1000 * list.length)) / 1000)];
selected.stackSize = 0;
lines.add(list);
lines.add(new Object[] {I18nUtil.resolveKey(selected.getDisplayName())});
this.drawStackText(lines, mouseX, mouseY, this.fontRendererObj);
}
}
@Override
@ -109,5 +124,28 @@ public class GUILaunchPadLarge extends GuiInfoContainer {
GL11.glPopMatrix();
}
}
GL11.glPushMatrix();
RenderHelper.disableStandardItemLighting();
GL11.glTranslated(guiLeft + 34, guiTop + 107, 0);
String text = "";
int color = 0xffffff;
if(launchpad.state == launchpad.STATE_MISSING) {
GL11.glScaled(0.5, 0.5, 1);
text = "Not ready";
color = 0xff0000;
}
if(launchpad.state == launchpad.STATE_LOADING) {
GL11.glScaled(0.6, 0.6, 1);
text = "Loading...";
color = 0xff8000;
}
if(launchpad.state == launchpad.STATE_READY) {
GL11.glScaled(0.8, 0.8, 1);
text = "Ready";
color = 0x00ff000;
}
this.fontRendererObj.drawString(text, -this.fontRendererObj.getStringWidth(text) / 2, -this.fontRendererObj.FONT_HEIGHT / 2, color);
GL11.glPopMatrix();
}
}

View File

@ -19,11 +19,11 @@ import net.minecraft.util.ResourceLocation;
public class GUIMachineHydrotreater extends GuiInfoContainer {
private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_hydrotreater.png");
private TileEntityMachineHydrotreater refinery;
private TileEntityMachineHydrotreater hydrotreater;
public GUIMachineHydrotreater(InventoryPlayer invPlayer, TileEntityMachineHydrotreater tedf) {
super(new ContainerMachineHydrotreater(invPlayer, tedf));
refinery = tedf;
hydrotreater = tedf;
this.xSize = 176;
this.ySize = 238;
@ -33,11 +33,11 @@ public class GUIMachineHydrotreater extends GuiInfoContainer {
public void drawScreen(int mouseX, int mouseY, float f) {
super.drawScreen(mouseX, mouseY, f);
refinery.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 35, guiTop + 70 - 52, 16, 52);
refinery.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 70 - 52, 16, 52);
refinery.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 70 - 52, 16, 52);
refinery.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 70 - 52, 16, 52);
this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 70 - 52, 16, 52, refinery.power, refinery.maxPower);
hydrotreater.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 35, guiTop + 70 - 52, 16, 52);
hydrotreater.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 70 - 52, 16, 52);
hydrotreater.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 70 - 52, 16, 52);
hydrotreater.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 70 - 52, 16, 52);
this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 70 - 52, 16, 52, hydrotreater.power, hydrotreater.maxPower);
if(this.mc.thePlayer.inventory.getItemStack() == null && this.isMouseOverSlot(this.inventorySlots.getSlot(10), mouseX, mouseY) && !this.inventorySlots.getSlot(10).getHasStack()) {
List<Object[]> lines = new ArrayList();
@ -50,7 +50,7 @@ public class GUIMachineHydrotreater extends GuiInfoContainer {
@Override
protected void drawGuiContainerForegroundLayer(int i, int j) {
String name = this.refinery.hasCustomInventoryName() ? this.refinery.getInventoryName() : I18n.format(this.refinery.getInventoryName());
String name = this.hydrotreater.hasCustomInventoryName() ? this.hydrotreater.getInventoryName() : I18n.format(this.hydrotreater.getInventoryName());
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 0xffffff);
this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
@ -62,12 +62,12 @@ public class GUIMachineHydrotreater extends GuiInfoContainer {
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
int j = (int) (refinery.power * 54 / refinery.maxPower);
int j = (int) (hydrotreater.power * 54 / hydrotreater.maxPower);
drawTexturedModalRect(guiLeft + 17, guiTop + 70 - j, 176, 52 - j, 16, j);
refinery.tanks[0].renderTank(guiLeft + 35, guiTop + 70, this.zLevel, 16, 52);
refinery.tanks[1].renderTank(guiLeft + 53, guiTop + 70, this.zLevel, 16, 52);
refinery.tanks[2].renderTank(guiLeft + 125, guiTop + 70, this.zLevel, 16, 52);
refinery.tanks[3].renderTank(guiLeft + 143, guiTop + 70, this.zLevel, 16, 52);
hydrotreater.tanks[0].renderTank(guiLeft + 35, guiTop + 70, this.zLevel, 16, 52);
hydrotreater.tanks[1].renderTank(guiLeft + 53, guiTop + 70, this.zLevel, 16, 52);
hydrotreater.tanks[2].renderTank(guiLeft + 125, guiTop + 70, this.zLevel, 16, 52);
hydrotreater.tanks[3].renderTank(guiLeft + 143, guiTop + 70, this.zLevel, 16, 52);
}
}

View File

@ -97,7 +97,7 @@ public class Mats {
public static final NTMMaterial MAT_TITANIUM = makeSmeltable(2200, TI, 0xF7F3F2, 0x4F4C4B, 0xA99E79).setShapes(INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT);
public static final NTMMaterial MAT_COPPER = makeSmeltable(2900, CU, 0xFDCA88, 0x601E0D, 0xC18336).setShapes(WIRE, INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT);
public static final NTMMaterial MAT_TUNGSTEN = makeSmeltable(7400, W, 0x868686, 0x000000, 0x977474).setShapes(WIRE, BOLT, INGOT, DUST, DENSEWIRE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT);
public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT);
public static final NTMMaterial MAT_ALUMINIUM = makeSmeltable(1300, AL, 0xFFFFFF, 0x344550, 0xD0B8EB).setShapes(WIRE, INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK, HEAVY_COMPONENT);
public static final NTMMaterial MAT_LEAD = makeSmeltable(8200, PB, 0xA6A6B2, 0x03030F, 0x646470).setShapes(NUGGET, INGOT, DUST, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT);
public static final NTMMaterial MAT_BISMUTH = makeSmeltable(8300, BI, 0xB200FF).setShapes(NUGGET, BILLET, INGOT, DUST, BLOCK);
public static final NTMMaterial MAT_ARSENIC = makeSmeltable(3300, AS, 0x6CBABA, 0x242525, 0x558080).setShapes(NUGGET, INGOT);

View File

@ -69,6 +69,8 @@ public class ArcWelderRecipes extends SerializableRecipe {
//mid-game PWR
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.plate_welded, 1, Mats.MAT_ZIRCONIUM.id), 600, 10_000L,
new OreDictStack(ZR.plateCast(), 2)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.plate_welded, 1, Mats.MAT_ALUMINIUM.id), 300, 10_000L,
new OreDictStack(AL.plateCast(), 2)));
//late-game fusion
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.plate_welded, 1, Mats.MAT_TCALLOY.id), 1_200, 1_000_000L, new FluidStack(Fluids.OXYGEN, 1_000),
new OreDictStack(TCALLOY.plateCast(), 2)));
@ -83,11 +85,11 @@ public class ArcWelderRecipes extends SerializableRecipe {
//Missile Parts
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_small), 60, 1_000L, new OreDictStack(STEEL.plate(), 4), new ComparableStack(ModItems.wire_aluminium, 4), new OreDictStack(CU.plate(), 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_medium), 100, 2_000L, new OreDictStack(STEEL.plate(), 8), new ComparableStack(ModItems.motor, 1), new OreDictStack(GRAPHITE.ingot(), 8)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_large), 200, 5_000L, new OreDictStack(DURA.ingot(), 12), new ComparableStack(ModItems.motor, 2), new OreDictStack(OreDictManager.getReflector(), 16)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.thruster_large), 200, 5_000L, new OreDictStack(DURA.ingot(), 10), new ComparableStack(ModItems.motor, 1), new OreDictStack(OreDictManager.getReflector(), 12)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_small), 60, 1_000L, new OreDictStack(Fluids.ETHANOL.getDict(1_000), 6), new OreDictStack(AL.plate(), 6), new OreDictStack(STEEL.plate(), 2)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_medium), 100, 2_000L, new OreDictStack(Fluids.KEROSENE.getDict(1_000), 8), new OreDictStack(TI.plate(), 12), new OreDictStack(STEEL.plate(), 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_large), 200, 5_000L, new OreDictStack(Fluids.KEROSENE.getDict(1_000), 12), new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plateCast(), 3)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_small), 60, 1_000L, new OreDictStack(AL.plate(), 6), new OreDictStack(CU.plate(), 4), new ComparableStack(ModBlocks.steel_scaffold, 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_medium), 100, 2_000L, new OreDictStack(AL.plateCast(), 4), new OreDictStack(TI.plate(), 8), new ComparableStack(ModBlocks.steel_scaffold, 12)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.fuel_tank_large), 200, 5_000L, new OreDictStack(AL.plateWelded(), 8), new OreDictStack(BIGMT.plate(), 12), new ComparableStack(ModBlocks.steel_scaffold, 16)));
//Missiles
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_anti_ballistic), 100, 5_000L, new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new ComparableStack(ModItems.missile_assembly), new ComparableStack(ModItems.thruster_small, 4)));
@ -103,14 +105,14 @@ public class ArcWelderRecipes extends SerializableRecipe {
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_buster_strong), 200, 10_000L, new ComparableStack(ModItems.warhead_buster_medium), new ComparableStack(ModItems.fuel_tank_medium), new ComparableStack(ModItems.thruster_medium)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_emp_strong), 200, 10_000L, new ComparableStack(ModBlocks.emp_bomb, 3), new ComparableStack(ModItems.fuel_tank_medium), new ComparableStack(ModItems.thruster_medium)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_burst), 300, 25_000L, new ComparableStack(ModItems.warhead_generic_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_inferno), 300, 25_000L, new ComparableStack(ModItems.warhead_incendiary_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_rain), 300, 25_000L, new ComparableStack(ModItems.warhead_cluster_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_drill), 300, 25_000L, new ComparableStack(ModItems.warhead_buster_large), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_burst), 300, 25_000L, new ComparableStack(ModItems.warhead_generic_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_inferno), 300, 25_000L, new ComparableStack(ModItems.warhead_incendiary_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_rain), 300, 25_000L, new ComparableStack(ModItems.warhead_cluster_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_drill), 300, 25_000L, new ComparableStack(ModItems.warhead_buster_large), new ComparableStack(ModItems.fuel_tank_medium, 2), new ComparableStack(ModItems.thruster_medium, 4)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear), 600, 50_000L, new ComparableStack(ModItems.warhead_nuclear), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear_cluster), 600, 50_000L, new ComparableStack(ModItems.warhead_mirv), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_volcano), 600, 50_000L, new ComparableStack(ModItems.warhead_volcano), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear), 600, 50_000L, new ComparableStack(ModItems.warhead_nuclear), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large, 3)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_nuclear_cluster), 600, 50_000L, new ComparableStack(ModItems.warhead_mirv), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large, 3)));
recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.missile_volcano), 600, 50_000L, new ComparableStack(ModItems.warhead_volcano), new ComparableStack(ModItems.fuel_tank_large), new ComparableStack(ModItems.thruster_large, 3)));
}
public static HashMap getRecipes() {

View File

@ -314,7 +314,6 @@ public class AssemblerRecipes {
makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.levitation_unit, 1), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.wire_gold, 6), },250);
makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit_gold, 1), new ComparableStack(ModItems.coil_gold, 4), },250);
makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit_gold, 1), new ComparableStack(ModItems.coil_gold, 4), },250);
makeRecipe(new ComparableStack(ModBlocks.launch_pad, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.machine_battery, 1), new ComparableStack(ModItems.circuit_gold, 2), },250);
makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300);
makeRecipe(new ComparableStack(ModItems.gun_defabricator, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(IRON.plate(), 5), new ComparableStack(ModItems.mechanism_special, 3), new ComparableStack(Items.diamond, 1), new ComparableStack(ModItems.plate_dalekanium, 3), },200);
makeRecipe(new ComparableStack(ModItems.gun_osipr_ammo, 24), new AStack[] {new OreDictStack(STEEL.plate(), 2), new OreDictStack(REDSTONE.dust(), 1), new ComparableStack(Items.glowstone_dust, 1), },50);
@ -1027,6 +1026,21 @@ public class AssemblerRecipes {
new ComparableStack(ModBlocks.glass_quartz, 16)
}, 200);
makeRecipe(new ComparableStack(ModBlocks.launch_pad_large, 1), new AStack[] {
new OreDictStack(STEEL.plateCast(), 6),
new OreDictStack(ANY_CONCRETE.any(), 64),
new OreDictStack(ANY_PLASTIC.ingot(), 16),
new ComparableStack(ModBlocks.steel_scaffold, 24),
new ComparableStack(ModItems.circuit_red_copper, 3)
}, 200);
makeRecipe(new ComparableStack(ModBlocks.launch_pad, 1), new AStack[] {
new OreDictStack(STEEL.plateWelded(), 8),
new OreDictStack(ANY_CONCRETE.any(), 8),
new OreDictStack(ANY_HARDPLASTIC.ingot(), 16),
new ComparableStack(ModItems.circuit_gold, 1)
}, 400);
makeRecipe(new ComparableStack(ModItems.euphemium_capacitor, 1), new AStack[]
{
new OreDictStack(NB.ingot(), 4),
@ -1226,6 +1240,7 @@ public class AssemblerRecipes {
makeRecipe(new ComparableStack(ModBlocks.secure_access_door, 1), new AStack[]{new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 16), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack("dyeRed", 8)}, 4000);
makeRecipe(new ComparableStack(ModBlocks.sliding_seal_door, 1), new AStack[]{new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack("dyeWhite", 2)}, 200);
makeRecipe(new ComparableStack(ModBlocks.silo_hatch, 1), new AStack[]{new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4)}, 200);
makeRecipe(new ComparableStack(ModBlocks.silo_hatch_large, 1), new AStack[]{new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8)}, 200);
if(Loader.isModLoaded("Mekanism")) {

View File

@ -47,8 +47,9 @@ public class CrystallizerRecipes extends SerializableRecipe {
@Override
public void registerDefaults() {
int baseTime = 600;
int utilityTime = 100;
final int baseTime = 600;
final int utilityTime = 100;
final int mixingTime = 20;
FluidStack sulfur = new FluidStack(Fluids.SULFURIC_ACID, 500);
registerRecipe(COAL.ore(), new CrystallizerRecipe(ModItems.crystal_coal, baseTime));
@ -93,8 +94,8 @@ public class CrystallizerRecipes extends SerializableRecipe {
registerRecipe(new ComparableStack(Items.rotten_flesh), new CrystallizerRecipe(Items.leather, utilityTime));
registerRecipe(new ComparableStack(ModItems.coal_infernal), new CrystallizerRecipe(ModItems.solid_fuel, utilityTime));
registerRecipe(new ComparableStack(ModBlocks.stone_gneiss), new CrystallizerRecipe(ModItems.powder_lithium, utilityTime));
registerRecipe(new ComparableStack(Items.dye, 1, 15), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 4), 20), new FluidStack(Fluids.SULFURIC_ACID, 250));
registerRecipe(new ComparableStack(Items.bone), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 16), 20), new FluidStack(Fluids.SULFURIC_ACID, 1_000));
registerRecipe(new ComparableStack(Items.dye, 1, 15), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 4), mixingTime), new FluidStack(Fluids.SULFURIC_ACID, 250));
registerRecipe(new ComparableStack(Items.bone), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 16), mixingTime), new FluidStack(Fluids.SULFURIC_ACID, 1_000));
registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.MUSTARDWILLOW)), new CrystallizerRecipe(new ItemStack(ModItems.powder_cadmium), 100).setReq(10), new FluidStack(Fluids.RADIOSOLVENT, 250));
registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.powder_ash, EnumAshType.FULLERENE)), new CrystallizerRecipe(new ItemStack(ModItems.ingot_cft), baseTime).setReq(4), new FluidStack(Fluids.XYLENE, 1_000));
@ -105,6 +106,7 @@ public class CrystallizerRecipes extends SerializableRecipe {
registerRecipe(new ComparableStack(ModItems.powder_desh_ready), new CrystallizerRecipe(ModItems.ingot_desh, baseTime));
registerRecipe(new ComparableStack(ModItems.powder_meteorite), new CrystallizerRecipe(ModItems.fragment_meteorite, utilityTime));
registerRecipe(CD.dust(), new CrystallizerRecipe(ModItems.ingot_rubber, baseTime), new FluidStack(Fluids.FISHOIL, 250));
registerRecipe(new ComparableStack(ModItems.powder_sawdust), new CrystallizerRecipe(ModItems.cordite, mixingTime), new FluidStack(Fluids.NITROGLYCERIN, 250));
registerRecipe(new ComparableStack(ModItems.meteorite_sword_treated), new CrystallizerRecipe(ModItems.meteorite_sword_etched, baseTime));
registerRecipe(new ComparableStack(ModItems.powder_impure_osmiridium), new CrystallizerRecipe(ModItems.crystal_osmiridium, baseTime), new FluidStack(Fluids.SCHRABIDIC, 1_000));
@ -131,12 +133,12 @@ public class CrystallizerRecipes extends SerializableRecipe {
FluidStack[] dyes = new FluidStack[] {new FluidStack(Fluids.WOODOIL, 100), new FluidStack(Fluids.FISHOIL, 100)};
for(FluidStack dye : dyes) {
registerRecipe(COAL.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLACK, 4), 20), dye);
registerRecipe(TI.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.WHITE, 4), 20), dye);
registerRecipe(IRON.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.RED, 4), 20), dye);
registerRecipe(W.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.YELLOW, 4), 20), dye);
registerRecipe(CU.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.GREEN, 4), 20), dye);
registerRecipe(CO.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLUE, 4), 20), dye);
registerRecipe(COAL.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLACK, 4), mixingTime), dye);
registerRecipe(TI.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.WHITE, 4), mixingTime), dye);
registerRecipe(IRON.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.RED, 4), mixingTime), dye);
registerRecipe(W.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.YELLOW, 4), mixingTime), dye);
registerRecipe(CU.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.GREEN, 4), mixingTime), dye);
registerRecipe(CO.dust(), new CrystallizerRecipe(DictFrame.fromOne(ModItems.chemical_dye, EnumChemDye.BLUE, 4), mixingTime), dye);
}
registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.oil_tar, EnumTarType.CRUDE)), new CrystallizerRecipe(DictFrame.fromOne(ModItems.oil_tar, EnumTarType.WAX), 20), new FluidStack(Fluids.CHLORINE, 250));

View File

@ -934,7 +934,7 @@ public class ClientProxy extends ServerProxy {
Minecraft.getMinecraft().effectRenderer.addEffect(contrail);
}
if("exKerosene".equals(type)) {
ParticleContrail contrail = new ParticleContrail(man, world, x, y, z);
ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0F, 0F, 0F, 1F);
Minecraft.getMinecraft().effectRenderer.addEffect(contrail);
}
if("exSolid".equals(type)) {
@ -973,9 +973,26 @@ public class ClientProxy extends ServerProxy {
double z = data.getDouble("posZ");
if("missileContrail".equals(type)) {
if(Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector() > 350) return;
float scale = data.hasKey("scale") ? data.getFloat("scale") : 1F;
ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0, 0, 0, scale);
Minecraft.getMinecraft().effectRenderer.addEffect(contrail);
double mX = data.getDouble("moX");
double mY = data.getDouble("moY");
double mZ = data.getDouble("moZ");
/*ParticleContrail contrail = new ParticleContrail(man, world, x, y, z, 0, 0, 0, scale);
contrail.motionX = mX;
contrail.motionY = mY;
contrail.motionZ = mZ;
Minecraft.getMinecraft().effectRenderer.addEffect(contrail);*/
ParticleRocketFlame fx = new ParticleRocketFlame(man, world, x, y, z).setScale(scale);
fx.motionX = mX;
fx.motionY = mY;
fx.motionZ = mZ;
if(data.hasKey("maxAge")) fx.setMaxAge(data.getInteger("maxAge"));
Minecraft.getMinecraft().effectRenderer.addEffect(fx);
}
if("smoke".equals(type)) {

View File

@ -351,6 +351,8 @@ public class ResourceManager {
public static final ResourceLocation silo_hatch_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch.png");
public static WavefrontObjDisplayList silo_hatch = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch.obj")));
public static final ResourceLocation silo_hatch_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/silo_hatch_large.png");
public static WavefrontObjDisplayList silo_hatch_large = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch_large.obj")));
//Lights

View File

@ -21,8 +21,20 @@ public class ParticleRocketFlame extends EntityFX {
super(p_i1218_1_, p_i1218_2_, p_i1218_4_, p_i1218_6_);
particleIcon = ModEventHandlerClient.particleBase;
maxAge = 300 + rand.nextInt(50);
this.particleScale = 1F;
}
public ParticleRocketFlame setScale(float scale) {
this.particleScale = scale;
return this;
}
public ParticleRocketFlame setMaxAge(int maxAge) {
this.maxAge = maxAge;
return this;
}
@Override
public void onUpdate() {
this.prevPosX = this.posX;
this.prevPosY = this.posY;
@ -30,51 +42,54 @@ public class ParticleRocketFlame extends EntityFX {
this.age++;
if (this.age == this.maxAge) {
if(this.age == this.maxAge) {
this.setDead();
}
this.motionX *= 0.9099999785423279D;
this.motionY *= 0.9099999785423279D;
this.motionZ *= 0.9099999785423279D;
this.motionX *= 0.91D;
this.motionY *= 0.91D;
this.motionZ *= 0.91D;
this.moveEntity(this.motionX, this.motionY, this.motionZ);
this.moveEntity(this.motionX, this.motionY, this.motionZ);
}
@Override
public int getFXLayer() {
return 1;
}
public void renderParticle(Tessellator p_70539_1_, float p_70539_2_, float p_70539_3_, float p_70539_4_, float p_70539_5_, float p_70539_6_, float p_70539_7_) {
Random urandom = new Random(this.getEntityId());
for(int i = 0; i < 10; i++) {
float add = urandom.nextFloat() * 0.3F;
float dark = 1 - Math.min(((float)(age) / (float)(maxAge * 0.25F)), 1);
this.particleRed = 1 * dark + add;
this.particleGreen = 0.6F * dark + add;
this.particleBlue = 0 + add;
this.particleAlpha = (float) Math.pow(1 - Math.min(((float)(age) / (float)(maxAge)), 1), 0.5);
p_70539_1_.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha * 0.75F);
p_70539_1_.setNormal(0.0F, 1.0F, 0.0F);
p_70539_1_.setBrightness(240);
float spread = (float) Math.pow(((float)(age) / (float)maxAge) * 4F, 1.5) + 1F;
float scale = urandom.nextFloat() * 0.5F + 0.1F + ((float)(age) / (float)maxAge) * 2F;
float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double)p_70539_2_ - interpPosX) + (urandom.nextGaussian() - 1D) * 0.2F * spread);
float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double)p_70539_2_ - interpPosY) + (urandom.nextGaussian() - 1D) * 0.5F * spread);
float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double)p_70539_2_ - interpPosZ) + (urandom.nextGaussian() - 1D) * 0.2F * spread);
p_70539_1_.addVertexWithUV((double)(pX - p_70539_3_ * scale - p_70539_6_ * scale), (double)(pY - p_70539_4_ * scale), (double)(pZ - p_70539_5_ * scale - p_70539_7_ * scale), particleIcon.getMaxU(), particleIcon.getMaxV());
p_70539_1_.addVertexWithUV((double)(pX - p_70539_3_ * scale + p_70539_6_ * scale), (double)(pY + p_70539_4_ * scale), (double)(pZ - p_70539_5_ * scale + p_70539_7_ * scale), particleIcon.getMaxU(), particleIcon.getMinV());
p_70539_1_.addVertexWithUV((double)(pX + p_70539_3_ * scale + p_70539_6_ * scale), (double)(pY + p_70539_4_ * scale), (double)(pZ + p_70539_5_ * scale + p_70539_7_ * scale), particleIcon.getMinU(), particleIcon.getMinV());
p_70539_1_.addVertexWithUV((double)(pX + p_70539_3_ * scale - p_70539_6_ * scale), (double)(pY - p_70539_4_ * scale), (double)(pZ + p_70539_5_ * scale - p_70539_7_ * scale), particleIcon.getMinU(), particleIcon.getMaxV());
}
}
return 1;
}
@Override
public void renderParticle(Tessellator p_70539_1_, float interp, float sX, float sY, float sZ, float dX, float dZ) {
Random urandom = new Random(this.getEntityId());
for(int i = 0; i < 10; i++) {
float add = urandom.nextFloat() * 0.3F;
float dark = 1 - Math.min(((float) (age) / (float) (maxAge * 0.25F)), 1);
this.particleRed = 1 * dark + add;
this.particleGreen = 0.6F * dark + add;
this.particleBlue = 0 + add;
this.particleAlpha = (float) Math.pow(1 - Math.min(((float) (age) / (float) (maxAge)), 1), 0.5);
p_70539_1_.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha * 0.75F);
p_70539_1_.setNormal(0.0F, 1.0F, 0.0F);
p_70539_1_.setBrightness(240);
float spread = (float) Math.pow(((float) (age) / (float) maxAge) * 4F, 1.5) + 1F;
spread *= this.particleScale;
float scale = (urandom.nextFloat() * 0.5F + 0.1F + ((float) (age) / (float) maxAge) * 2F) * particleScale;
float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) interp - interpPosX) + (urandom.nextGaussian() - 1D) * 0.2F * spread);
float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) interp - interpPosY) + (urandom.nextGaussian() - 1D) * 0.5F * spread);
float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) interp - interpPosZ) + (urandom.nextGaussian() - 1D) * 0.2F * spread);
p_70539_1_.addVertexWithUV((double) (pX - sX * scale - dX * scale), (double) (pY - sY * scale), (double) (pZ - sZ * scale - dZ * scale), particleIcon.getMaxU(), particleIcon.getMaxV());
p_70539_1_.addVertexWithUV((double) (pX - sX * scale + dX * scale), (double) (pY + sY * scale), (double) (pZ - sZ * scale + dZ * scale), particleIcon.getMaxU(), particleIcon.getMinV());
p_70539_1_.addVertexWithUV((double) (pX + sX * scale + dX * scale), (double) (pY + sY * scale), (double) (pZ + sZ * scale + dZ * scale), particleIcon.getMinU(), particleIcon.getMinV());
p_70539_1_.addVertexWithUV((double) (pX + sX * scale - dX * scale), (double) (pY - sY * scale), (double) (pZ + sZ * scale - dZ * scale), particleIcon.getMinU(), particleIcon.getMaxV());
}
}
}

View File

@ -30,7 +30,8 @@ public class ParticleSmokePlume extends EntityFX {
public ParticleSmokePlume(TextureManager p_i1213_1_, World p_i1218_1_, double p_i1218_2_, double p_i1218_4_, double p_i1218_6_) {
super(p_i1218_1_, p_i1218_2_, p_i1218_4_, p_i1218_6_);
theRenderEngine = p_i1213_1_;
maxAge = 100 + rand.nextInt(40);
maxAge = 80 + rand.nextInt(20);
this.particleScale = 0.25F;
}
public void onUpdate() {
@ -39,6 +40,8 @@ public class ParticleSmokePlume extends EntityFX {
this.prevPosZ = this.posZ;
particleAlpha = 1 - ((float) age / (float) maxAge);
float prevScale = this.particleScale;
this.particleScale = 0.25F + ((float) age / (float) maxAge) * 2;
++this.age;
@ -48,9 +51,9 @@ public class ParticleSmokePlume extends EntityFX {
double bak = Vec3.createVectorHelper(motionX, motionY, motionZ).lengthVector();
this.moveEntity(this.motionX, this.motionY, this.motionZ);
this.moveEntity(this.motionX, this.motionY + (this.particleScale - prevScale), this.motionZ);
if(Math.abs(motionX) < 0.025 && Math.abs(motionZ) < 0.025) {
if(this.isCollidedVertically) {
motionY = bak;
}
@ -85,16 +88,16 @@ public class ParticleSmokePlume extends EntityFX {
p_70539_1_.startDrawingQuads();
this.particleRed = this.particleGreen = this.particleBlue = urandom.nextFloat() * 0.7F + 0.2F;
this.particleRed = this.particleGreen = this.particleBlue = urandom.nextFloat() * 0.75F + 0.1F;
p_70539_1_.setColorRGBA_F(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha);
p_70539_1_.setNormal(0.0F, 1.0F, 0.0F);
p_70539_1_.setBrightness(240);
float scale = 0.5F;
float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) p_70539_2_ - dX) + urandom.nextGaussian() * 0.5);
float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) p_70539_2_ - dY) + urandom.nextGaussian() * 0.5);
float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) p_70539_2_ - dZ) + urandom.nextGaussian() * 0.5);
float scale = this.particleScale;
float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) p_70539_2_ - dX) + urandom.nextGaussian() * 0.5 * scale);
float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) p_70539_2_ - dY) + urandom.nextGaussian() * 0.5 * scale);
float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) p_70539_2_ - dZ) + urandom.nextGaussian() * 0.5 * scale);
p_70539_1_.addVertexWithUV((double) (pX - p_70539_3_ * scale - p_70539_6_ * scale), (double) (pY - p_70539_4_ * scale), (double) (pZ - p_70539_5_ * scale - p_70539_7_ * scale), 1, 1);
p_70539_1_.addVertexWithUV((double) (pX - p_70539_3_ * scale + p_70539_6_ * scale), (double) (pY + p_70539_4_ * scale), (double) (pZ - p_70539_5_ * scale + p_70539_7_ * scale), 1, 0);

View File

@ -743,10 +743,30 @@ public class ItemRenderLibrary {
GL11.glTranslated(0, 0.875, -1.875);
GL11.glRotated(-120, 1, 0, 0);
GL11.glTranslated(0, -0.875, 1.875);
GL11.glTranslated(0, 0.25, 0);
ResourceManager.silo_hatch.renderPart("Hatch");
GL11.glShadeModel(GL11.GL_FLAT);
}
});
renderers.put(Item.getItemFromBlock(ModBlocks.silo_hatch_large), new ItemRenderBase(){
public void renderInventory() {
GL11.glTranslated(0, -2, 0);
GL11.glScaled(1.5, 1.5, 1.5);
}
public void renderCommon() {
bindTexture(ResourceManager.silo_hatch_large_tex);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glTranslated(1, 0, 0);
GL11.glRotated(90, 0, 1, 0);
ResourceManager.silo_hatch_large.renderPart("Frame");
GL11.glTranslated(0, 0.875, -2.875);
GL11.glRotated(-120, 1, 0, 0);
GL11.glTranslated(0, -0.875, 2.875);
GL11.glTranslated(0, 0.25, 0);
ResourceManager.silo_hatch_large.renderPart("Hatch");
GL11.glShadeModel(GL11.GL_FLAT);
}
});
renderers.put(Item.getItemFromBlock(ModBlocks.qe_containment), new ItemRenderBase(){
public void renderInventory() {
GL11.glTranslated(0, -3.5, 0);

View File

@ -5,18 +5,23 @@ import java.util.function.Consumer;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.BlockDummyable;
import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.items.weapon.ItemMissile;
import com.hbm.items.weapon.ItemMissile.MissileFormFactor;
import com.hbm.main.ResourceManager;
import com.hbm.render.item.ItemRenderBase;
import com.hbm.render.item.ItemRenderMissileGeneric;
import com.hbm.tileentity.bomb.TileEntityLaunchPadLarge;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.client.IItemRenderer;
public class RenderLaunchPadLarge extends TileEntitySpecialRenderer {
public class RenderLaunchPadLarge extends TileEntitySpecialRenderer implements IItemRendererProvider {
@Override
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) {
@ -97,4 +102,30 @@ public class RenderLaunchPadLarge extends TileEntitySpecialRenderer {
GL11.glPopMatrix();
}
@Override
public Item getItemForRenderer() {
return Item.getItemFromBlock(ModBlocks.launch_pad_large);
}
@Override
public IItemRenderer getRenderer() {
return new ItemRenderBase( ) {
public void renderInventory() {
GL11.glTranslated(0, -3.75, 0);
GL11.glScaled(1.625, 1.625, 1.625);
}
public void renderCommonWithStack(ItemStack item) {
GL11.glScaled(0.5, 0.5, 0.5);
GL11.glRotatef(90, 0F, 1F, 0F);
GL11.glShadeModel(GL11.GL_SMOOTH);
bindTexture(ResourceManager.missile_erector_tex);
ResourceManager.missile_erector.renderPart("Pad");
bindTexture(ResourceManager.missile_erector_atlas_tex);
ResourceManager.missile_erector.renderPart("Atlas_Pad");
ResourceManager.missile_erector.renderPart("Atlas_Erector");
ResourceManager.missile_erector.renderPart("Atlas_Pivot");
GL11.glShadeModel(GL11.GL_FLAT);
}};
}
}

View File

@ -922,6 +922,66 @@ public abstract class DoorDecl {
};
public static final DoorDecl SILO_HATCH_LARGE = new DoorDecl() {
@Override public String getOpenSoundEnd() { return "hbm:door.wgh_big_stop"; };
@Override public String getOpenSoundLoop() { return "hbm:door.wgh_big_start"; };
@Override public String getOpenSoundStart() { return null; };
@Override public String getCloseSoundStart() { return null; };
@Override public String getCloseSoundEnd() { return "hbm:door.wgh_big_stop"; };
@Override public float getSoundVolume() { return 2; }
@Override public boolean remoteControllable() { return true; }
@Override
@SideOnly(Side.CLIENT)
public void getTranslation(String partName, float openTicks, boolean child, float[] trans) {
if("Hatch".equals(partName)) {
set(trans, 0, 0.25F * Library.smoothstep(getNormTime(openTicks, 0, 10), 0, 1), 0);
} else {
set(trans, 0, 0, 0);
}
};
@Override
@SideOnly(Side.CLIENT)
public void getOrigin(String partName, float[] orig) {
if("Hatch".equals(partName)) {
set(orig, 0F, 0.875F, -2.875F);
return;
}
set(orig, 0, 0, 0);
super.getOrigin(partName, orig);
};
@Override
@SideOnly(Side.CLIENT)
public void getRotation(String partName, float openTicks, float[] rot) {
if("Hatch".equals(partName)) {
set(rot, Library.smoothstep(getNormTime(openTicks, 20, 100), 0, 1) * -240, 0, 0);
return;
}
super.getRotation(partName, openTicks, rot);
};
@Override
@SideOnly(Side.CLIENT)
public boolean doesRender(String partName, boolean child) {
return true;
};
@Override public int timeToOpen() { return 60; };
@Override public int[][] getDoorOpenRanges() { return new int[][] { { 2, 0, 1, -3, 3, 0 }, { 1, 0, 2, -5, 3, 0 }, { 0, 0, 2, -5, 3, 0 }, { -1, 0, 2, -5, 3, 0 }, { -2, 0, 1, -3, 3, 0 } }; }
@Override public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks, 20, 20); };
@Override public int getBlockOffset() { return 3; }
@Override public int[] getDimensions() { return new int[] { 0, 0, 3, 3, 3, 3 }; }
@Override @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { return ResourceManager.silo_hatch_large_tex; }
@Override public ResourceLocation getTextureForPart(int skinIndex, String partName) { return ResourceManager.silo_hatch_large_tex; }
@Override @SideOnly(Side.CLIENT) public WavefrontObjDisplayList getModel() { return ResourceManager.silo_hatch_large; }
};
public static final DoorDecl LARGE_VEHICLE_DOOR = new DoorDecl() {
@Override

View File

@ -167,7 +167,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn
public DoorDecl getDoorType(){
if(this.doorType == null)
if(this.doorType == null && this.getBlockType() instanceof BlockDoorGeneric)
this.doorType = ((BlockDoorGeneric)this.getBlockType()).type;
return this.doorType;

View File

@ -1,16 +1,24 @@
package com.hbm.tileentity.bomb;
import java.util.List;
import com.hbm.entity.missile.EntityMissileBaseNT;
import com.hbm.lib.Library;
import com.hbm.main.MainRegistry;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energy.IEnergyUser;
import api.hbm.fluid.IFluidStandardReceiver;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityLaunchPad extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver {
@Override public boolean isReadyForLaunch() { return delay <= 0; }
@Override public double getLaunchOffset() { return 2D; }
@Override public double getLaunchOffset() { return 1D; }
public int delay = 0;
@ -24,11 +32,52 @@ public class TileEntityLaunchPad extends TileEntityLaunchPadBase implements IEne
if(!this.isMissileValid() || !this.hasFuel()) {
this.delay = 100;
}
if(!this.hasFuel() || !this.isMissileValid()) {
this.state = this.STATE_MISSING;
} else {
if(this.delay > 0) {
this.state = this.STATE_LOADING;
} else {
this.state = this.STATE_READY;
}
}
} else {
List<EntityMissileBaseNT> entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5));
if(!entities.isEmpty()) {
for(int i = 0; i < 15; i++) {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
if(worldObj.rand.nextBoolean()) dir = dir.getOpposite();
if(worldObj.rand.nextBoolean()) dir = dir.getRotation(ForgeDirection.UP);
float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX;
float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ;
MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ});
}
}
}
super.updateEntity();
}
@Override
public DirPos[] getConPos() {
return new DirPos[] {
new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X),
new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X),
new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X),
new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X),
new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z),
new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z),
new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z),
new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z)
};
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);

View File

@ -48,7 +48,9 @@ import com.hbm.main.MainRegistry;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.IRadarCommandReceiver;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.TrackerUtil;
import com.hbm.util.fauxpointtwelve.BlockPos;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energy.IEnergyUser;
import api.hbm.fluid.IFluidStandardReceiver;
@ -66,6 +68,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver {
@ -116,6 +119,11 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
public int redstonePower;
public Set<BlockPos> activatedBlocks = new HashSet<>(4);
public int state = 0;
public static final int STATE_MISSING = 0;
public static final int STATE_LOADING = 1;
public static final int STATE_READY = 2;
public FluidTank[] tanks;
public TileEntityLaunchPadBase() {
@ -129,12 +137,37 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
public String getName() {
return "container.launchPad";
}
@Override
public boolean canExtractItem(int slot, ItemStack itemStack, int side) {
return false;
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
return new int[] { 0 };
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
return slot == 0 && this.isMissileValid(stack);
}
public abstract DirPos[] getConPos();
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
if(worldObj.getTotalWorldTime() % 20 == 0) {
for(DirPos pos : getConPos()) {
this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
if(tanks[0].getTankType() != Fluids.NONE) this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
if(tanks[1].getTankType() != Fluids.NONE) this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
}
}
if(this.redstonePower > 0 && this.prevRedstonePower == 0) {
this.launchFromDesignator();
}
@ -161,6 +194,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
super.serialize(buf);
buf.writeLong(this.power);
buf.writeInt(this.state);
tanks[0].serialize(buf);
tanks[1].serialize(buf);
@ -178,6 +212,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
super.deserialize(buf);
this.power = buf.readLong();
this.state = buf.readInt();
tanks[0].deserialize(buf);
tanks[1].deserialize(buf);
@ -248,6 +283,10 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
@Override public long getMaxPower() { return maxPower; }
@Override public FluidTank[] getAllTanks() { return this.tanks; }
@Override public FluidTank[] getReceivingTanks() { return this.tanks; }
@Override public boolean canConnect(ForgeDirection dir) {
return dir != ForgeDirection.UP && dir != ForgeDirection.DOWN;
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
@ -284,7 +323,11 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
/** Requires the missile slot to be non-null and he item to be compatible */
public boolean isMissileValid() {
return slots[0] != null && slots[0].getItem() instanceof ItemMissile;
return slots[0] != null && isMissileValid(slots[0]);
}
public boolean isMissileValid(ItemStack stack) {
return stack.getItem() instanceof ItemMissile;
}
public boolean hasFuel() {
@ -329,6 +372,7 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl
public void finalizeLaunch(Entity missile) {
worldObj.spawnEntityInWorld(missile);
TrackerUtil.setTrackingRange(worldObj, missile, 500);
worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "hbm:weapon.missileTakeOff", 2.0F, 1.0F);
this.power -= 75_000;

View File

@ -1,11 +1,15 @@
package com.hbm.tileentity.bomb;
import java.util.List;
import com.hbm.entity.missile.EntityMissileBaseNT;
import com.hbm.items.weapon.ItemMissile;
import com.hbm.items.weapon.ItemMissile.MissileFormFactor;
import com.hbm.lib.Library;
import com.hbm.main.MainRegistry;
import com.hbm.sound.AudioWrapper;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.IRadarCommandReceiver;
import com.hbm.util.fauxpointtwelve.DirPos;
import api.hbm.energy.IEnergyUser;
import api.hbm.fluid.IFluidStandardReceiver;
@ -14,8 +18,9 @@ import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver {
public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver, IRadarCommandReceiver {
public int formFactor = -1;
/** Whether the missile has already been placed on the launchpad. Missile will render statically on the pad if true */
@ -105,6 +110,8 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements
//only extend if the erector isn't up yet and the missile can be loaded
if(!erected && readyToLoad) {
this.state = this.STATE_LOADING;
//first, rotate the erector
if(erector != 0F) {
erector = Math.max(erector - erectorSpeed, 0F);
@ -135,6 +142,9 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements
}
}
}
if(!this.hasFuel() || !this.isMissileValid()) this.state = this.STATE_MISSING;
if(this.erected && this.canLaunch()) this.state = this.STATE_READY;
boolean prevLiftMoving = this.liftMoving;
boolean prevErectorMoving = this.erectorMoving;
@ -200,6 +210,20 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements
data.setFloat("strafe", 0.05F);
for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data);
}
List<EntityMissileBaseNT> entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5));
if(!entities.isEmpty()) {
for(int i = 0; i < 15; i++) {
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
if(worldObj.rand.nextBoolean()) dir = dir.getOpposite();
float moX = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetX;
float moZ = (float) (worldObj.rand.nextGaussian() * 0.15F + 0.75) * dir.offsetZ;
MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] {moX, 0, moZ});
}
}
}
super.updateEntity();
@ -257,6 +281,20 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements
nbt.setInteger("formFactor", formFactor);
}
@Override
public DirPos[] getConPos() {
return new DirPos[] {
new DirPos(xCoord + 5, yCoord, zCoord - 2, Library.POS_X),
new DirPos(xCoord + 5, yCoord, zCoord + 2, Library.POS_X),
new DirPos(xCoord - 5, yCoord, zCoord - 2, Library.NEG_X),
new DirPos(xCoord - 5, yCoord, zCoord + 2, Library.NEG_X),
new DirPos(xCoord - 2, yCoord, zCoord + 5, Library.POS_Z),
new DirPos(xCoord + 2, yCoord, zCoord + 5, Library.POS_Z),
new DirPos(xCoord - 2, yCoord, zCoord - 5, Library.NEG_Z),
new DirPos(xCoord + 2, yCoord, zCoord - 5, Library.NEG_Z)
};
}
AxisAlignedBB bb = null;
@Override

View File

@ -84,22 +84,17 @@ public class TileEntityMachineReactorBreeding extends TileEntityMachineBase impl
for(byte d = 2; d < 6; d++) {
ForgeDirection dir = ForgeDirection.getOrientation(d);
Block b = worldObj.getBlock(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ);
TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ);
if(b == ModBlocks.reactor_research) {
int[] pos = ((ReactorResearch) ModBlocks.reactor_research).findCore(worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ);
if(pos != null) {
TileEntity tile = worldObj.getTileEntity(pos[0], pos[1], pos[2]);
if(tile instanceof TileEntityReactorResearch) {
TileEntityReactorResearch reactor = (TileEntityReactorResearch) tile;
this.flux += reactor.totalFlux;
}
}

View File

@ -164,12 +164,12 @@ public class TileEntityPWRController extends TileEntityMachineBase implements IG
int chunkX = xCoord >> 4;
int chunkZ = zCoord >> 4;
//since fluid sources are often not within 1 chunk, we just do 3 chunks distance and call it a day
//since fluid sources are often not within 1 chunk, we just do 2 chunks distance and call it a day
if(!worldObj.getChunkProvider().chunkExists(chunkX, chunkZ) ||
!worldObj.getChunkProvider().chunkExists(chunkX + 3, chunkZ + 3) ||
!worldObj.getChunkProvider().chunkExists(chunkX + 3, chunkZ - 3) ||
!worldObj.getChunkProvider().chunkExists(chunkX - 3, chunkZ + 3) ||
!worldObj.getChunkProvider().chunkExists(chunkX - 3, chunkZ - 3)) {
!worldObj.getChunkProvider().chunkExists(chunkX + 2, chunkZ + 2) ||
!worldObj.getChunkProvider().chunkExists(chunkX + 2, chunkZ - 2) ||
!worldObj.getChunkProvider().chunkExists(chunkX - 2, chunkZ + 2) ||
!worldObj.getChunkProvider().chunkExists(chunkX - 2, chunkZ - 2)) {
this.unloadDelay = 60;
}

View File

@ -82,12 +82,14 @@ public class TileEntityMachineHydrotreater extends TileEntityMachineBase impleme
@Override
public void serialize(ByteBuf buf) {
super.serialize(buf);
buf.writeLong(power);
for(int i = 0; i < 4; i++) tanks[i].serialize(buf);
}
@Override
public void deserialize(ByteBuf buf) {
super.deserialize(buf);
this.power = buf.readLong();
for(int i = 0; i < 4; i++) tanks[i].deserialize(buf);
}

View File

@ -240,6 +240,8 @@ public class TileEntityTurretArty extends TileEntityTurretBaseArtillery implemen
}
this.lastRotationPitch = this.rotationPitch;
this.lastRotationYaw = this.rotationYaw;
this.rotationPitch = this.syncRotationPitch;
this.rotationYaw = this.syncRotationYaw;
}
if(!worldObj.isRemote) {

View File

@ -139,6 +139,8 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem
this.lastRotationPitch = this.rotationPitch;
this.lastRotationYaw = this.rotationYaw;
this.lastCrane = this.crane;
this.rotationPitch = this.syncRotationPitch;
this.rotationYaw = this.syncRotationYaw;
}
if(!worldObj.isRemote) {

View File

@ -83,7 +83,7 @@ public class WorldInAJar implements IBlockAccess {
}
//always render fullbright, if the situation requires it we could add a very rudimentary system that
//darkens blocks id there is a solid one above
//darkens blocks if there is a solid one above
@Override
@SideOnly(Side.CLIENT)
public int getLightBrightnessForSkyBlocks(int x, int y, int z, int blockBrightness) {

View File

@ -4505,6 +4505,7 @@ tile.sellafield_core.name=Sellafit-Corium
tile.sellafield_slaked.name=Gelöschtes Sellafit
tile.semtex.name=Semtex
tile.silo_hatch.name=Siloluke
tile.silo_hatch_large.name=Große Siloluke
tile.sliding_blast_door.name=Sprengtür
tile.solar_mirror.name=Heliostatspiegel
tile.soyuz_capsule.name=Landekapsel

View File

@ -5518,6 +5518,7 @@ tile.sellafield.5.name=Sellafite-Corium
tile.sellafield_slaked.name=Slaked Sellafite
tile.semtex.name=Semtex
tile.silo_hatch.name=Silo Hatch
tile.silo_hatch_large.name=Large Silo Hatch
tile.sliding_blast_door.name=Sliding Blast Door
tile.solar_mirror.name=Heliostat Mirror
tile.soyuz_capsule.name=Cargo Landing Capsule

View File

@ -0,0 +1,576 @@
# Blender v2.79 (sub 0) OBJ File: 'silo_hatch_large.blend'
# www.blender.org
o Hatch
v 2.750000 0.750000 -1.750000
v 1.750000 0.750000 -2.750000
v -2.750000 0.750000 -1.750000
v -1.750000 0.750000 -2.750000
v -2.750000 0.750000 1.750000
v -1.750000 0.750000 2.750000
v -2.750000 1.000000 -1.750000
v -2.750000 1.000000 1.750000
v 2.750000 1.000000 -1.750000
v 2.750000 1.000000 1.750000
v 1.750000 1.000000 2.750000
v -1.750000 1.000000 2.750000
v 2.750000 0.750000 1.750000
v 1.750000 0.750000 2.750000
v 1.750000 1.000000 -2.750000
v -1.750000 1.000000 -2.750000
v -1.250000 0.750000 -2.500000
v 1.250000 0.750000 -2.500000
v -1.250000 0.750000 -3.000000
v 1.250000 0.750000 -3.000000
v -1.250000 0.500000 -3.000000
v -1.250000 0.500000 -2.500000
v 1.250000 0.500000 -2.500000
v 1.250000 0.500000 -3.000000
v -1.500000 0.750000 -2.500000
v 1.500000 0.750000 -2.500000
v -1.500000 0.750000 2.500000
v 1.500000 0.750000 2.500000
v 2.500000 0.750000 1.500000
v 2.500000 0.750000 -1.500000
v -2.500000 0.750000 -1.500000
v -2.500000 0.750000 1.500000
v 1.500000 0.500000 -2.500000
v 2.500000 0.500000 -1.500000
v 2.500000 0.500000 1.500000
v -1.500000 0.500000 2.500000
v 1.500000 0.500000 2.500000
v -2.500000 0.500000 -1.500000
v -2.500000 0.500000 1.500000
v -1.500000 0.500000 -2.500000
vt 0.918367 0.620690
vt 1.000000 0.603448
vt 1.000000 0.620690
vt 0.918367 0.620690
vt 1.000000 0.603448
vt 1.000000 0.620690
vt 0.632653 0.620690
vt 0.918367 0.603448
vt 0.918367 0.620690
vt 0.632653 0.620690
vt 0.918367 0.603448
vt 0.632653 0.620690
vt 0.918367 0.603448
vt 1.000000 0.603448
vt 1.000000 0.620690
vt 0.918367 0.620690
vt 1.000000 0.603448
vt 1.000000 0.620690
vt 0.632653 0.620690
vt 0.918367 0.603448
vt 0.653061 0.586207
vt 0.897959 0.586207
vt 0.918367 1.000000
vt 0.551020 0.931035
vt 0.816327 0.224138
vt 0.612245 0.189655
vt 0.816327 0.189655
vt 0.612245 0.172414
vt 0.816327 0.137931
vt 0.816327 0.172414
vt 0.571429 0.189655
vt 0.857143 0.172414
vt 0.857143 0.189655
vt 1.000000 0.586207
vt 0.653061 0.586207
vt 0.897959 0.586207
vt 1.000000 0.586207
vt 0.918367 0.586207
vt 1.000000 0.586207
vt 0.653061 0.586207
vt 0.897959 0.586207
vt 1.000000 0.586207
vt 0.918367 0.586207
vt 0.632653 0.603448
vt 0.897959 0.586207
vt 0.918367 0.586207
vt 1.000000 0.568965
vt 0.653061 0.568965
vt 0.571429 0.293103
vt 0.897959 0.224138
vt 0.897959 0.568965
vt 0.653061 0.586207
vt 0.897959 0.568965
vt 1.000000 0.568965
vt 1.000000 0.568965
vt 0.897959 0.568965
vt 0.918367 0.586207
vt 1.000000 0.568965
vt 0.897959 0.568965
vt 0.632653 0.603448
vt 0.632653 0.603448
vt 0.632653 0.603448
vt 1.000000 0.689655
vt 1.000000 0.931035
vt 0.632653 1.000000
vt 0.551020 0.689655
vt 0.612245 0.224138
vt 0.612245 0.137931
vt 0.571429 0.172414
vt 0.918367 0.568965
vt 0.979592 0.293103
vt 0.979592 0.500000
vt 0.571429 0.500000
vt 0.653061 0.224138
vt 0.653061 0.568965
vt 0.918367 0.568965
vt 0.918367 0.568965
vt 0.653061 0.568965
vt 0.918367 0.568965
vt 0.653061 0.568965
vn 0.7071 0.0000 0.7071
vn -0.7071 0.0000 -0.7071
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 0.0000 -1.0000
vn -0.7071 0.0000 0.7071
vn 0.7071 0.0000 -0.7071
vn 1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
s off
f 11/1/1 13/2/1 10/3/1
f 16/4/2 3/5/2 7/6/2
f 7/7/3 5/8/3 8/9/3
f 12/10/4 14/11/4 11/1/4
f 15/12/5 4/13/5 16/4/5
f 8/9/6 6/14/6 12/15/6
f 9/16/7 2/17/7 15/18/7
f 10/19/8 1/20/8 9/16/8
f 14/11/9 27/21/9 28/22/9
f 15/23/10 7/24/10 12/10/10
f 17/25/10 20/26/10 19/27/10
f 24/28/9 22/29/9 21/30/9
f 18/31/8 24/28/8 20/26/8
f 20/26/5 21/30/5 19/27/5
f 19/27/3 22/32/3 17/33/3
f 14/11/9 29/34/9 13/2/9
f 1/20/9 29/35/9 30/36/9
f 26/37/9 1/20/9 30/38/9
f 5/8/9 27/39/9 6/14/9
f 5/8/9 31/40/9 32/41/9
f 31/42/9 4/13/9 25/43/9
f 2/44/9 25/45/9 4/13/9
f 28/46/1 35/47/1 29/34/1
f 36/48/9 38/49/9 33/50/9
f 27/21/4 37/51/4 28/22/4
f 26/52/5 40/53/5 25/45/5
f 25/43/2 38/54/2 31/42/2
f 30/38/7 33/55/7 26/37/7
f 31/40/3 39/56/3 32/41/3
f 32/57/6 36/58/6 27/39/6
f 29/35/8 34/59/8 30/36/8
f 11/1/1 14/11/1 13/2/1
f 16/4/2 4/13/2 3/5/2
f 7/7/3 3/60/3 5/8/3
f 12/10/4 6/61/4 14/11/4
f 15/12/5 2/44/5 4/13/5
f 8/9/6 5/8/6 6/14/6
f 9/16/7 1/20/7 2/17/7
f 10/19/8 13/62/8 1/20/8
f 14/11/9 6/61/9 27/21/9
f 12/10/10 11/1/10 10/63/10
f 10/63/10 9/64/10 15/23/10
f 15/23/10 16/65/10 7/24/10
f 7/24/10 8/66/10 12/10/10
f 12/10/10 10/63/10 15/23/10
f 17/25/10 18/67/10 20/26/10
f 24/28/9 23/68/9 22/29/9
f 18/31/8 23/69/8 24/28/8
f 20/26/5 24/28/5 21/30/5
f 19/27/3 21/30/3 22/32/3
f 14/11/9 28/46/9 29/34/9
f 1/20/9 13/62/9 29/35/9
f 26/37/9 2/17/9 1/20/9
f 5/8/9 32/57/9 27/39/9
f 5/8/9 3/60/9 31/40/9
f 31/42/9 3/5/9 4/13/9
f 2/44/9 26/52/9 25/45/9
f 28/46/1 37/70/1 35/47/1
f 33/50/9 34/71/9 35/72/9
f 35/72/9 37/51/9 36/48/9
f 36/48/9 39/73/9 38/49/9
f 38/49/9 40/74/9 33/50/9
f 33/50/9 35/72/9 36/48/9
f 27/21/4 36/48/4 37/51/4
f 26/52/5 33/75/5 40/53/5
f 25/43/2 40/76/2 38/54/2
f 30/38/7 34/77/7 33/55/7
f 31/40/3 38/78/3 39/56/3
f 32/57/6 39/79/6 36/58/6
f 29/35/8 35/80/8 34/59/8
o Frame
v -2.500000 0.000000 1.500000
v -2.500000 0.000000 -3.500000
v 2.500000 0.000000 -3.500000
v -3.250000 1.000000 -2.250000
v -2.500000 0.250000 -3.500000
v 2.500000 0.250000 -3.500000
v -3.250000 1.000000 2.250000
v -2.250000 1.000000 -3.250000
v 2.250000 1.000000 -3.250000
v -3.500000 0.250000 -2.500000
v -1.500000 0.000000 -2.500000
v 1.500000 0.000000 -2.500000
v -1.500000 0.750000 -2.500000
v -3.500000 0.250000 2.500000
v 1.500000 0.750000 -2.500000
v -3.500000 0.000000 -2.500000
v -1.750000 0.750000 -2.750000
v 1.750000 0.750000 -2.750000
v -3.500000 0.000000 2.500000
v -1.750000 1.000000 -2.750000
v 1.750000 1.000000 -2.750000
v -1.250000 0.750000 -2.750000
v 1.250000 0.750000 -2.750000
v 1.250000 0.500000 -2.500000
v -1.250000 0.500000 -2.500000
v -1.250000 1.000000 -2.750000
v 1.250000 1.000000 -2.750000
v -1.250000 1.000000 -3.000000
v 1.250000 1.000000 -3.000000
v -1.250000 0.500000 -3.000000
v 1.250000 0.500000 -3.000000
v -1.250000 0.750000 -2.500000
v 1.250000 0.750000 -2.500000
v -2.500000 0.000000 3.500000
v 2.500000 0.000000 3.500000
v -2.500000 0.250000 3.500000
v 2.500000 0.250000 3.500000
v -2.250000 1.000000 3.250000
v 2.250000 1.000000 3.250000
v -1.500000 0.000000 2.500000
v 1.500000 0.000000 2.500000
v -1.500000 0.750000 2.500000
v 1.500000 0.750000 2.500000
v -1.750000 0.750000 2.750000
v 1.750000 0.750000 2.750000
v -1.750000 1.000000 2.750000
v 1.750000 1.000000 2.750000
v 3.500000 0.000000 2.500000
v 3.500000 0.000000 -2.500000
v 3.500000 0.250000 2.500000
v 3.500000 0.250000 -2.500000
v 3.250000 1.000000 2.250000
v 3.250000 1.000000 -2.250000
v 2.500000 0.000000 1.500000
v 2.500000 0.000000 -1.500000
v 2.500000 0.750000 1.500000
v 2.500000 0.750000 -1.500000
v 2.750000 0.750000 1.750000
v 2.750000 0.750000 -1.750000
v 2.750000 1.000000 1.750000
v 2.750000 1.000000 -1.750000
v -2.500000 0.000000 -1.500000
v -2.500000 0.750000 -1.500000
v -2.500000 0.750000 1.500000
v -2.750000 0.750000 1.750000
v -2.750000 0.750000 -1.750000
v -2.750000 1.000000 1.750000
v -2.750000 1.000000 -1.750000
vt 0.122449 0.827586
vt 0.367347 0.827586
vt 0.142857 0.862069
vt 0.061224 0.655172
vt 0.020408 0.931035
vt 0.020408 0.620690
vt 0.510204 0.896552
vt 0.551020 0.620690
vt 0.551020 0.931035
vt 0.387755 0.896552
vt 0.102041 0.913793
vt 0.102041 0.896552
vt 0.489796 0.482759
vt 0.081633 0.500000
vt 0.081633 0.482759
vt 0.387755 0.896552
vt 0.102041 0.913793
vt 0.102041 0.896552
vt 0.489796 0.500000
vt 0.102041 0.551724
vt 0.367347 0.879310
vt 0.122449 0.879310
vt 0.571429 0.413793
vt 0.489796 0.137931
vt 0.571429 0.068966
vt 0.367347 0.879310
vt 0.122449 0.879310
vt 0.122449 0.827586
vt 0.367347 0.827586
vt 0.489796 -0.000000
vt 0.163265 0.068966
vt 0.081633 -0.000000
vt 0.122449 0.827586
vt 0.367347 0.827586
vt 0.000000 0.068966
vt 0.081633 0.344828
vt 0.000000 0.413793
vt 0.142857 0.896552
vt 0.122449 0.879310
vt 0.142857 0.879310
vt 0.489796 0.482759
vt 0.081633 0.500000
vt 0.081633 0.482759
vt 0.489796 0.500000
vt 0.102041 0.551724
vt 0.081633 0.500000
vt 0.489796 0.500000
vt 0.102041 0.551724
vt 0.489796 0.482759
vt 0.081633 0.482759
vt 0.183673 0.948276
vt 0.387755 0.982759
vt 0.183673 0.982759
vt 0.183673 0.913793
vt 0.387755 0.948276
vt 0.142857 0.948276
vt 0.142857 0.931035
vt 0.163265 0.931035
vt 0.142857 0.913793
vt 0.102041 0.896552
vt 0.387755 0.896552
vt 0.346939 0.913793
vt 0.346939 0.896552
vt 0.102041 1.000000
vt 0.469388 1.000000
vt 0.367347 0.879310
vt 0.346939 0.879310
vt 0.408163 0.931035
vt 0.428571 0.948276
vt 0.489796 0.482759
vt 0.081633 0.500000
vt 0.081633 0.482759
vt 0.408163 0.413793
vt 0.489796 0.500000
vt 0.102041 0.551724
vt 0.367347 0.879310
vt 0.122449 0.827586
vt 0.367347 0.827586
vt 0.102041 0.896552
vt 0.122449 0.879310
vt 0.387755 0.896552
vt 0.102041 0.913793
vt 0.428571 0.586207
vt 0.469388 0.551724
vt 0.408163 0.068966
vt 0.469388 0.827586
vt 0.387755 0.879310
vt 0.387755 0.827586
vt 0.469388 0.896552
vt 0.469388 0.913793
vt 0.387755 0.913793
vt 0.433673 0.965517
vt 0.571429 0.551724
vt 0.489796 0.551724
vt 0.571429 0.482759
vt 0.571429 0.500000
vt 0.081633 0.137931
vt 0.387755 0.827586
vt 0.469388 0.879310
vt 0.387755 0.879310
vt 0.469388 0.896552
vt 0.469388 0.913793
vt 0.061224 0.896552
vt 0.142857 0.965517
vt 0.571429 0.500000
vt 0.489796 0.551724
vt 0.571429 0.482759
vt 0.163265 0.413793
vt 0.469388 0.879310
vt 0.387755 0.827586
vt 0.469388 0.827586
vt 0.387755 0.879310
vt 0.469388 0.896552
vt 0.469388 0.913793
vt 0.387755 0.913793
vt 0.142857 0.586207
vt 0.571429 0.551724
vt 0.489796 0.551724
vt 0.571429 0.482759
vt 0.489796 0.344828
vt 0.387755 0.879310
vt 0.469388 0.827586
vt 0.469388 0.879310
vt 0.469388 0.896552
vt 0.469388 0.913793
vt 0.510204 0.655172
vt 0.571429 0.551724
vt 0.571429 0.500000
vt 0.571429 0.482759
vt 0.346939 0.862069
vt 0.387755 0.913793
vt 0.387755 0.913793
vt 0.469388 0.551724
vt 0.469388 0.551724
vt 0.469388 0.551724
vt 0.387755 0.913793
vt 0.163265 0.913793
vt 0.102041 0.913793
vt 0.183673 0.965517
vt 0.387755 0.965517
vt 0.408163 0.913793
vt 0.428571 0.931035
vt 0.469388 0.879310
vt 0.469388 0.827586
vt 0.571429 0.551724
vt 0.571429 0.500000
vt 0.387755 0.827586
vt 0.489796 0.551724
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.3162 -0.9487
vn 0.0000 -1.0000 0.0000
vn -0.9487 0.3162 0.0000
vn 0.9487 0.3162 0.0000
vn 0.0000 0.3162 0.9487
vn -0.7071 0.0000 0.7071
vn 0.6396 0.4264 -0.6396
vn 0.7071 0.0000 -0.7071
vn 0.7071 0.0000 0.7071
vn -0.6396 0.4264 -0.6396
vn -0.7071 0.0000 -0.7071
vn -0.6396 0.4264 0.6396
vn 0.6396 0.4264 0.6396
s off
f 51/81/11 52/82/11 65/83/11
f 107/84/12 44/85/12 47/86/12
f 101/87/12 92/88/12 93/89/12
f 106/90/13 107/91/13 105/92/13
f 42/93/14 46/94/14 43/95/14
f 98/96/15 101/97/15 99/98/15
f 45/99/16 49/100/16 46/94/16
f 96/101/12 99/98/12 97/102/12
f 88/103/17 95/104/17 89/105/17
f 103/106/12 105/92/12 104/107/12
f 103/106/13 41/108/13 102/109/13
f 43/110/17 51/111/17 42/112/17
f 96/101/15 95/113/15 94/114/15
f 56/115/17 41/116/17 59/117/17
f 62/118/12 53/119/12 72/120/12
f 89/121/13 90/122/13 88/123/13
f 54/124/18 44/125/18 50/126/18
f 91/127/19 92/128/19 90/122/19
f 59/129/15 50/126/15 56/130/15
f 70/131/11 69/132/11 68/133/11
f 65/134/12 71/135/12 70/131/12
f 68/136/13 66/137/13 62/138/13
f 66/139/11 57/140/11 62/118/11
f 58/141/11 67/142/11 63/143/11
f 48/144/12 69/132/12 49/145/12
f 55/146/12 63/143/12 73/147/12
f 63/148/15 69/149/15 71/135/15
f 75/150/11 76/151/11 74/152/11
f 74/152/17 81/153/17 75/150/17
f 77/154/20 78/155/20 76/151/20
f 82/156/14 81/157/14 80/158/14
f 82/156/12 85/159/12 83/160/12
f 84/161/14 87/162/14 85/159/14
f 87/163/12 78/155/12 79/164/12
f 43/110/17 95/104/17 52/165/17
f 95/166/21 55/167/21 52/168/21
f 55/167/12 99/169/12 58/141/12
f 58/141/21 101/170/21 61/171/21
f 101/87/12 49/145/12 61/172/12
f 91/127/22 49/173/22 93/174/22
f 91/127/23 43/175/23 46/176/23
f 56/115/17 51/111/17 102/177/17
f 102/178/24 53/179/24 103/180/24
f 106/90/12 53/179/12 57/181/12
f 60/182/24 106/90/24 57/181/24
f 48/144/12 108/183/12 60/184/12
f 50/185/25 48/186/25 45/99/25
f 56/187/26 45/99/26 42/93/26
f 80/188/17 59/117/17 41/116/17
f 104/189/23 80/190/23 41/191/23
f 82/192/12 105/193/12 84/161/12
f 84/161/23 107/194/23 86/195/23
f 107/84/12 78/155/12 86/196/12
f 54/124/27 78/197/27 47/198/27
f 74/199/21 54/124/21 59/129/21
f 94/200/17 75/150/17 81/153/17
f 96/201/26 81/202/26 83/203/26
f 98/96/12 83/203/12 85/204/12
f 87/205/26 98/96/26 85/204/26
f 79/164/12 100/206/12 87/163/12
f 92/207/28 77/154/28 90/208/28
f 77/154/24 88/209/24 90/208/24
f 72/120/11 53/119/11 65/83/11
f 53/119/11 51/81/11 65/83/11
f 52/82/11 55/146/11 64/210/11
f 55/146/11 73/147/11 64/210/11
f 52/82/11 64/210/11 65/83/11
f 107/84/12 108/183/12 44/85/12
f 101/87/12 100/206/12 92/88/12
f 106/90/13 108/211/13 107/91/13
f 42/93/14 45/99/14 46/94/14
f 98/96/15 100/212/15 101/97/15
f 45/99/16 48/213/16 49/100/16
f 96/101/12 98/96/12 99/98/12
f 88/103/17 94/200/17 95/104/17
f 103/106/12 106/90/12 105/92/12
f 103/106/13 104/107/13 41/108/13
f 43/110/17 52/165/17 51/111/17
f 96/101/15 97/102/15 95/113/15
f 56/115/17 102/177/17 41/116/17
f 62/118/12 57/140/12 53/119/12
f 89/121/13 91/127/13 90/122/13
f 54/124/18 47/214/18 44/125/18
f 91/127/19 93/215/19 92/128/19
f 59/129/15 54/124/15 50/126/15
f 70/131/11 71/135/11 69/132/11
f 65/134/12 64/216/12 71/135/12
f 72/217/13 65/134/13 62/138/13
f 65/134/13 70/131/13 62/138/13
f 70/131/13 68/136/13 62/138/13
f 66/139/11 60/218/11 57/140/11
f 58/141/11 61/171/11 67/142/11
f 48/144/12 60/184/12 68/133/12
f 60/184/12 66/219/12 68/133/12
f 67/220/12 61/172/12 69/132/12
f 61/172/12 49/145/12 69/132/12
f 48/144/12 68/133/12 69/132/12
f 55/146/12 58/141/12 63/143/12
f 64/216/15 73/221/15 63/148/15
f 63/148/15 67/222/15 69/149/15
f 71/135/15 64/216/15 63/148/15
f 75/150/11 77/154/11 76/151/11
f 74/152/17 80/188/17 81/153/17
f 77/154/20 79/164/20 78/155/20
f 82/156/14 83/160/14 81/157/14
f 82/156/12 84/161/12 85/159/12
f 84/161/14 86/195/14 87/162/14
f 87/163/12 86/196/12 78/155/12
f 43/110/17 89/105/17 95/104/17
f 95/166/21 97/223/21 55/167/21
f 55/167/12 97/223/12 99/169/12
f 58/141/21 99/169/21 101/170/21
f 101/87/12 93/89/12 49/145/12
f 91/127/22 46/176/22 49/173/22
f 91/127/23 89/121/23 43/175/23
f 56/115/17 42/112/17 51/111/17
f 102/178/24 51/224/24 53/179/24
f 106/90/12 103/180/12 53/179/12
f 60/182/24 108/211/24 106/90/24
f 48/144/12 44/85/12 108/183/12
f 50/185/25 44/225/25 48/186/25
f 56/187/26 50/185/26 45/99/26
f 80/188/17 74/152/17 59/117/17
f 104/189/23 82/192/23 80/190/23
f 82/192/12 104/189/12 105/193/12
f 84/161/23 105/193/23 107/194/23
f 107/84/12 47/86/12 78/155/12
f 54/124/27 76/226/27 78/197/27
f 74/199/21 76/226/21 54/124/21
f 94/200/17 88/103/17 75/150/17
f 96/201/26 94/227/26 81/202/26
f 98/96/12 96/201/12 83/203/12
f 87/205/26 100/212/26 98/96/26
f 79/164/12 92/88/12 100/206/12
f 92/207/28 79/228/28 77/154/28
f 77/154/24 75/150/24 88/209/24

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB