Merge branch 'HbmMods:master' into master

This commit is contained in:
Bufka2011 2025-08-15 11:11:19 -06:00 committed by GitHub
commit 419b207eff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
81 changed files with 1929 additions and 512 deletions

View File

@ -12,6 +12,7 @@ name: Java CI with Gradle
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
jobs:
build:

View File

@ -1,23 +1,17 @@
## Added
* QMAW (quick manual and wiki)
* It's a simple ingame manual that can be found by pressing F1 on items (like the WIAJ presentations)
* Supports text and links and not much else
* Easy to make entries for, the system scans `assets/manual` for valid `.json` format files
* Should also work in resource packs (no recent tests for that, not going to make promises)
* Still WIP, many new info pages are yet to be made
* `/ntmlocate`
* Finds structures
* Only works on the new component structures, the old crusty ones like the factors and powerplant aren't supported
## Changed
* Updated chinese and russian localization
* All the never completed missile parts (20/20 fuselage, 20 warhead, 10 and 15 tec kerosene thrusters) have been removed
* The electric arc furnace now scrapes the vanilla furnace recipe list on server start in addition to postinit, making sure recipes added during postinit after NTM loads (like Thermal's ingots) are covered too
* The shredder's sound will now start immediately when processing instead of with random delay
* The assembly machine can now make nuclear waste into barrels
* Capacitors now have OpenComputers integration
* QMAW now has buttons for returning to previously viewed pages
* QMAW file detection now includes subfolders to `manual`
* OpenComputers integration for the ZIRNOX should now return values in °C and bar instead of unexplained weird internal units
* The sodium and strontium autogen ingots now have their correct hazard tags
* Pattern matchers, like the one used on the automatic crafting table, no longer care about NBT data of an item
* This means that RBMK fuel rods can now be automatically disassembled without the depletion number having to be a 100% match
* Due to the way the RBMK uncrafting handler works, a single autocrafter now correctly supports RBMK fuel of one type of any depletion level, yielding the correct recycling pellets
## Fixed
* Fixed GT6 compatibility watz pellets crashing due to misconfigured recipes
* Removed failed attempt at fixing the gun desync dupe which made things worse
* Fixed a potential crash regarding structure blocks
* Fixed QMAW not working at all
* Potentially fixed a bug where proxy tile entities would reference unloaded core tile entities which would cause bizarre item voiding/duping issues in rare cases
* Fixed fusion reactor automation being able to remove items other than the breeding output slot
* Fixed chunkloading transport drones getting stuck due to off-by-one rounding errors
* Fixed shift-click handling on the electric arc furnace not working with upgrades, and putting electrodes in the wrong slot
* Fixed issue with the load order where custom fluids wouldn't work properly for fluid loading/unloading and in custom recipes
* Fixed balefire bomb not rendering the egg when fully loaded

View File

@ -96,12 +96,16 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z);
if(world.isRemote) {
TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z);
plushie.squishTimer = 11;
return true;
} else {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F);
if(plushie.type == PlushieType.HUNDUN) {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.hunduns_magnificent_howl", 100F, 1F);
} else {
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "hbm:block.squeakyToy", 0.25F, 1F);
}
return true;
}
}
@ -155,7 +159,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti
NONE( "NONE", null),
YOMI( "Yomi", "Hi! Can I be your rabbit friend?"),
NUMBERNINE( "Number Nine", "None of y'all deserve coal."),
POOH( "Winnie the Pooh", "Beloved children's character with no malicious intent.");
HUNDUN( "Hundun", "混沌");
public String label;
public String inscription;

View File

@ -1,14 +0,0 @@
package com.hbm.calc;
public class EasyLocation {
public double posX;
public double posY;
public double posZ;
public EasyLocation(double x, double y, double z) {
posX = x;
posY = y;
posZ = z;
}
}

View File

@ -1,33 +0,0 @@
package com.hbm.calc;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class Location {
public int x;
public int y;
public int z;
public World world;
public Location(World world, int x, int y, int z) {
this.world = world;
this.x = x;
this.y = y;
this.z = z;
}
public Location add(int xa, int ya, int za) {
return new Location(world, x + xa, y + ya, z + za);
}
public Location add(ForgeDirection dir) {
return add(dir.offsetX, dir.offsetY, dir.offsetZ);
}
public TileEntity getTileEntity() {
return world.getTileEntity(x, y, z);
}
}

View File

@ -200,7 +200,7 @@ public class EntityDeliveryDrone extends EntityDroneBase implements IInventory,
}
// This is the lowest padding that worked with my drone waypoint path. if they stop getting loaded crank up paddingSize
for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) this.posX, (int) this.posZ, (int) (this.posX + this.motionX), (int) (this.posZ + this.motionZ), 4)){
for (ChunkCoordIntPair chunk : ChunkShapeHelper.getChunksAlongLineSegment((int) Math.floor(this.posX), (int) Math.floor(this.posZ), (int) Math.floor(this.posX + this.motionX), (int) Math.floor(this.posZ + this.motionZ), 8)){
ForgeChunkManager.forceChunk(loaderTicket, chunk);
}
}

View File

@ -10,8 +10,8 @@ import com.hbm.main.MainRegistry;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
public class EntityBalefire extends EntityExplosionChunkloading {
public class EntityBalefire extends EntityExplosionChunkloading {
public int age = 0;
public int destructionRange = 0;
public ExplosionBalefire exp;
@ -24,13 +24,11 @@ public class EntityBalefire extends EntityExplosionChunkloading {
destructionRange = nbt.getInteger("destructionRange");
speed = nbt.getInteger("speed");
did = nbt.getBoolean("did");
exp = new ExplosionBalefire((int)this.posX, (int)this.posY, (int)this.posZ, this.worldObj, this.destructionRange);
exp = new ExplosionBalefire((int) this.posX, (int) this.posY, (int) this.posZ, this.worldObj, this.destructionRange);
exp.readFromNbt(nbt, "exp_");
this.did = true;
this.did = true;
}
@Override
@ -39,10 +37,10 @@ public class EntityBalefire extends EntityExplosionChunkloading {
nbt.setInteger("destructionRange", destructionRange);
nbt.setInteger("speed", speed);
nbt.setBoolean("did", did);
if(exp != null)
exp.saveToNbt(nbt, "exp_");
}
public EntityBalefire(World p_i1582_1_) {
@ -53,7 +51,8 @@ public class EntityBalefire extends EntityExplosionChunkloading {
public void onUpdate() {
super.onUpdate();
if(!worldObj.isRemote) loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D));
if(!worldObj.isRemote)
loadChunk((int) Math.floor(posX / 16D), (int) Math.floor(posZ / 16D));
if(!this.did) {
if(GeneralConfig.enableExtendedLogging && !worldObj.isRemote)

View File

@ -454,7 +454,7 @@ public class OreDictManager {
* HAZARDS, MISC
*/
LI .hydro(1F) .ingot(lithium) .dustSmall(powder_lithium_tiny) .dust(powder_lithium) .block(block_lithium) .ore(ore_gneiss_lithium);
NA .hydro(1F) .dust(powder_sodium);
NA .hydro(1F) .hazIngot() .dust(powder_sodium);
/*
* PHOSPHORUS
@ -494,7 +494,7 @@ public class OreDictManager {
/*
* FISSION FRAGMENTS
*/
SR .hot(1F) .hydro(1F) .dust(powder_strontium);
SR .hot(1F) .hydro(1F) .hazIngot() .dust(powder_strontium);
SR90 .rad(HazardRegistry.sr90) .hot(1F) .hydro(1F) .dustSmall(powder_sr90_tiny) .dust(powder_sr90) .ingot(ingot_sr90) .billet(billet_sr90) .nugget(nugget_sr90);
I131 .rad(HazardRegistry.i131) .hot(1F) .dustSmall(powder_i131_tiny) .dust(powder_i131);
XE135 .rad(HazardRegistry.xe135) .hot(10F) .dustSmall(powder_xe135_tiny) .dust(powder_xe135);
@ -912,6 +912,21 @@ public class OreDictManager {
for(Block b : blocks) registerStack(tag, new ItemStack(b));
return this;
}
public DictFrame hazIngot() {
hazMult = HazardRegistry.ingot;
return autoRegHazard(INGOT);
}
// TODO: rethink this. currently, keys are only registered on-demand if the dict frame has a valid entry, even though we can maximize compatibility
// by simply registereing all known shapes in the haz reg, whether it exists or not
public DictFrame autoRegHazard(MaterialShapes shape) {
String tag = shape.name();
for(String mat : mats) {
registerHazards(hazards, hazMult, tag + mat);
}
return this;
}
public static void registerHazards(List<HazardEntry> hazards, float hazMult, String dictKey) {

View File

@ -61,9 +61,9 @@ public class ContainerMachineArcFurnaceLarge extends Container {
if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) {
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 3, 4, false)) return null;
} else if(rStack.getItem() == ModItems.arc_electrode) {
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null;
} else if(rStack.getItem() instanceof ItemMachineUpgrade) {
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 0, 3, false)) return null;
} else if(rStack.getItem() instanceof ItemMachineUpgrade) {
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 4, 5, false)) return null;
} else {
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 5, 25, false)) return null;
}

View File

@ -37,7 +37,7 @@ public class LoadingScreenRendererNT extends LoadingScreenRenderer {
}
private String chooseTip() {
if(HTTPHandler.tipOfTheDay.isEmpty()) return "null";
if(HTTPHandler.tipOfTheDay.isEmpty()) return "Explore! There's tons of free stuff to find.";
return HTTPHandler.tipOfTheDay.get(new Random().nextInt(HTTPHandler.tipOfTheDay.size()));
}

View File

@ -40,6 +40,7 @@ import com.hbm.lib.HbmWorld;
import com.hbm.lib.RefStrings;
import com.hbm.packet.PacketDispatcher;
import com.hbm.potion.HbmPotion;
import com.hbm.qmaw.QMAWLoader;
import com.hbm.saveddata.satellites.Satellite;
import com.hbm.tileentity.TileMappings;
import com.hbm.tileentity.bomb.TileEntityLaunchPadBase;
@ -253,6 +254,8 @@ public class MainRegistry {
@EventHandler
public void PreLoad(FMLPreInitializationEvent PreEvent) {
CrashHelper.init();
QMAWLoader.registerModFileURL(FMLCommonHandler.instance().findContainerFor(RefStrings.MODID).getSource());
startupTime = System.currentTimeMillis();
configDir = PreEvent.getModConfigurationDirectory();
@ -848,6 +851,12 @@ public class MainRegistry {
@EventHandler
public static void PostLoad(FMLPostInitializationEvent PostEvent) {
// to make sure that foreign registered fluids are accounted for,
// even when the reload listener is registered too late due to load order
// IMPORTANT: fluids have to load before recipes. weird shit happens if not.
Fluids.reloadFluids();
FluidContainerRegistry.register();
MagicRecipes.register();
LemegetonRecipes.register();
SILEXRecipes.register();
@ -876,7 +885,6 @@ public class MainRegistry {
ArmorUtil.register();
HazmatRegistry.registerHazmats();
DamageResistanceHandler.init();
FluidContainerRegistry.register();
BlockToolConversion.registerRecipes();
AchievementHandler.register();
@ -909,10 +917,6 @@ public class MainRegistry {
SuicideThreadDump.register();
CommandReloadClient.register();
// to make sure that foreign registered fluids are accounted for,
// even when the reload listener is registered too late due to load order
Fluids.reloadFluids();
//ExplosionTests.runTest();
}

View File

@ -114,6 +114,8 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import net.minecraftforge.client.event.sound.PlaySoundEvent17;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.oredict.OreDictionary;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
@ -753,6 +755,9 @@ public class ModEventHandlerClient {
try {
QuickManualAndWiki qmaw = QMAWLoader.triggers.get(comp);
if(qmaw == null) {
qmaw = QMAWLoader.triggers.get(new ComparableStack(comp.item, 1, OreDictionary.WILDCARD_VALUE));
}
if(qmaw != null) {
list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("qmaw.tab", Keyboard.getKeyName(HbmKeybinds.qmaw.getKeyCode())));
lastQMAW = qmaw;

View File

@ -139,8 +139,8 @@ public class ModulePatternMatcher {
}
switch(mode) {
case MODE_EXACT: return input.isItemEqual(filter) && ItemStack.areItemStackTagsEqual(input, filter);
case MODE_WILDCARD: return input.getItem() == filter.getItem() && ItemStack.areItemStackTagsEqual(input, filter);
case MODE_EXACT: return input.isItemEqual(filter)/* && ItemStack.areItemStackTagsEqual(input, filter)*/;
case MODE_WILDCARD: return input.getItem() == filter.getItem()/* && ItemStack.areItemStackTagsEqual(input, filter)*/;
case MODE_BEDROCK:
if(input.getItem() != filter.getItem()) return false;
if(!(input.getItem() instanceof ItemBedrockOreNew)) return false;

View File

@ -3,13 +3,16 @@ package com.hbm.qmaw;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import com.hbm.lib.RefStrings;
import com.hbm.qmaw.components.*;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.LanguageManager;
@ -22,8 +25,12 @@ public class GuiQMAW extends GuiScreen {
protected static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/gui_wiki.png");
public String title;
public String qmawID;
public ItemStack icon;
public List<List<ManualElement>> lines = new ArrayList();
/** History for returning via button */
public List<String> back = new ArrayList();
public List<String> forward = new ArrayList();
protected int xSize = 340;
protected int ySize = 224;
@ -38,6 +45,7 @@ public class GuiQMAW extends GuiScreen {
public static final String EN_US = "en_US";
public GuiQMAW(QuickManualAndWiki qmaw) {
qmawID = qmaw.name;
parseQMAW(qmaw);
}
@ -163,6 +171,43 @@ public class GuiQMAW extends GuiScreen {
this.lastClickX = x;
this.lastClickY = y;
}
if(guiLeft + 3 <= x && guiLeft + 3 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) back();
if(guiLeft + 21 <= x && guiLeft + 21 + 18 > x && guiTop + 3 < y && guiTop + 3 + 18 >= y) forward();
}
public void back() {
if(this.back.isEmpty()) return;
String prev = back.get(back.size() - 1);
QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(prev);
if(qmaw != null) {
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
GuiQMAW screen = new GuiQMAW(qmaw);
screen.back.addAll(back);
screen.back.remove(screen.back.size() - 1);
screen.forward.addAll(forward);
screen.forward.add(qmawID);
FMLCommonHandler.instance().showGuiScreen(screen);
}
}
public void forward() {
if(this.forward.isEmpty()) return;
String next = forward.get(forward.size() - 1);
QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(next);
if(qmaw != null) {
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
GuiQMAW screen = new GuiQMAW(qmaw);
screen.back.addAll(back);
screen.back.add(qmawID);
screen.forward.addAll(forward);
screen.forward.remove(screen.forward.size() - 1);
FMLCommonHandler.instance().showGuiScreen(screen);
}
}
public int getSliderPosition() {
@ -213,7 +258,7 @@ public class GuiQMAW extends GuiScreen {
private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
int x = 7;
int x = 43;
int y = 4;
if(this.icon != null) {
@ -242,7 +287,11 @@ public class GuiQMAW extends GuiScreen {
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, 170, ySize);
drawTexturedModalRect(guiLeft + 170, guiTop, 22, 0, 170, ySize);
drawTexturedModalRect(guiLeft + 170, guiTop, 52, 0, 30, ySize);
drawTexturedModalRect(guiLeft + 200, guiTop, 52, 0, 140, ySize);
if(!back.isEmpty()) drawTexturedModalRect(guiLeft + 3, guiTop + 3, 204, 0, 18, 18);
if(!forward.isEmpty()) drawTexturedModalRect(guiLeft + 21, guiTop + 3, 222, 0, 18, 18);
// scroll bar
drawTexturedModalRect(guiLeft + xSize - 15, guiTop + getSliderPosition(), 192, 0, 12, 16);
@ -273,7 +322,7 @@ public class GuiQMAW extends GuiScreen {
boolean mouseOver = (elementX <= mouseX && elementX + element.getWidth() > mouseX && elementY < mouseY && elementY + element.getHeight() >= mouseY);
element.render(mouseOver, elementX, elementY, mouseX, mouseY);
if(elementX <= lastClickX && elementX + element.getWidth() > lastClickX && elementY < lastClickY && elementY + element.getHeight() >= lastClickY)
element.onClick();
element.onClick(this);
inset += element.getWidth();
}
@ -283,6 +332,9 @@ public class GuiQMAW extends GuiScreen {
@Override
protected void keyTyped(char typedChar, int keyCode) {
if(keyCode == Keyboard.KEY_LEFT) back();
if(keyCode == Keyboard.KEY_RIGHT) forward();
if(keyCode == 1 || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
this.mc.displayGuiScreen((GuiScreen) null);

View File

@ -5,5 +5,5 @@ public abstract class ManualElement {
public abstract int getWidth();
public abstract int getHeight();
public abstract void render(boolean isMouseOver, int x, int y, int mouseX, int mouseY);
public abstract void onClick();
public abstract void onClick(GuiQMAW gui);
}

View File

@ -48,7 +48,7 @@ public class QMAWLoader implements IResourceManagerReloadListener {
MainRegistry.logger.info("[QMAW] Loaded " + qmaw.size() + " manual entries! (" + (System.currentTimeMillis() - timestamp) + "ms)");
}
/** For the like 2 people who might consider making an NTM addon and want to include manual pages */
/** For the like 2 people who might consider making an NTM addon and want to include manual pages. Requires the mod's actual JAR file as the parameter. */
public static void registerModFileURL(File file) {
registeredModFiles.add(file);
}
@ -56,11 +56,14 @@ public class QMAWLoader implements IResourceManagerReloadListener {
/** Searches the asset folder for QMAW format JSON files and adds entries based on that */
public static void init() {
//the mod's file, assuming the mod is a file (not the case in a dev env, fuck!)
/*//the mod's file, assuming the mod is a file (not the case in a dev env, fuck!)
//no fucking null check, if this fails then the entire game will sink along with the ship
String path = QMAWLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath();
// exclude .class in the case of a dev env
if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself
MainRegistry.logger.info("[QMAW] Current running file: " + path);
if(!path.endsWith(".class")) registerModFileURL(new File(path)); // i am going to shit myself*/ // deactivated because it likely doesn't even fucking work
// registering of the mod file now happens in the MainRegistry during preinit
qmaw.clear();
triggers.clear();
@ -76,7 +79,10 @@ public class QMAWLoader implements IResourceManagerReloadListener {
* */
public static void agonyEngine() {
for(File modFile : registeredModFiles) dissectZip(modFile);
for(File modFile : registeredModFiles) {
logJarAttempt(modFile.getName());
dissectZip(modFile);
}
File devEnvManualFolder = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath().replace("/eclipse/.".replace('/', File.separatorChar), "") + "/src/main/resources/assets/hbm/manual".replace('/', File.separatorChar));
if(devEnvManualFolder.exists() && devEnvManualFolder.isDirectory()) {
@ -102,6 +108,7 @@ public class QMAWLoader implements IResourceManagerReloadListener {
}
}
public static void logJarAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting jar " + name); }
public static void logPackAttempt(String name) { MainRegistry.logger.info("[QMAW] Dissecting resource " + name); }
public static void logFoundManual(String name) { MainRegistry.logger.info("[QMAW] Found manual " + name); }
@ -148,7 +155,7 @@ public class QMAWLoader implements IResourceManagerReloadListener {
/** Opens a resource pack folder, skips to the manual folder, then tries to dissect that */
public static void dissectFolder(File folder) {
File manualFolder = new File(folder, "/assets/manual");
File manualFolder = new File(folder, "/assets/hbm/manual");
if(manualFolder.exists() && manualFolder.isDirectory()) dissectManualFolder(manualFolder);
}
@ -167,6 +174,8 @@ public class QMAWLoader implements IResourceManagerReloadListener {
} catch(Exception ex) {
MainRegistry.logger.info("[QMAW] Error reading manual " + name + ": " + ex);
}
} else if(file.isDirectory()) {
dissectManualFolder(file); // scrape subfolders too lmao
}
}
}
@ -175,6 +184,12 @@ public class QMAWLoader implements IResourceManagerReloadListener {
public static void registerJson(String file, JsonObject json) {
String name = json.get("name").getAsString();
if(QMAWLoader.qmaw.containsKey(name)) {
MainRegistry.logger.info("[QMAW] Skipping existing entry " + file);
return;
}
QuickManualAndWiki qmaw = new QuickManualAndWiki(name);
if(json.has("icon")) {

View File

@ -81,11 +81,14 @@ public class QComponentLink extends ManualElement {
font.drawString(text, x, y, isMouseOver ? hoverColor : color);
}
@Override public void onClick() {
@Override public void onClick(GuiQMAW gui) {
QuickManualAndWiki qmaw = QMAWLoader.qmaw.get(link);
if(qmaw != null) {
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
FMLCommonHandler.instance().showGuiScreen(new GuiQMAW(qmaw));
GuiQMAW screen = new GuiQMAW(qmaw);
screen.back.addAll(gui.back);
screen.back.add(gui.qmawID);
FMLCommonHandler.instance().showGuiScreen(screen);
}
}
}

View File

@ -1,5 +1,6 @@
package com.hbm.qmaw.components;
import com.hbm.qmaw.GuiQMAW;
import com.hbm.qmaw.ManualElement;
import net.minecraft.client.Minecraft;
@ -40,5 +41,5 @@ public class QComponentText extends ManualElement {
font.drawString(text, x, y, color);
}
@Override public void onClick() { }
@Override public void onClick(GuiQMAW gui) { }
}

View File

@ -15,50 +15,44 @@ import net.minecraft.util.ResourceLocation;
public class RenderNukeFstbmb extends TileEntitySpecialRenderer {
@Override
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f)
{
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5D, y, z + 0.5D);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_CULL_FACE);
switch(tileEntity.getBlockMetadata())
{
case 2:
GL11.glRotatef(90, 0F, 1F, 0F); break;
case 4:
GL11.glRotatef(180, 0F, 1F, 0F); break;
case 3:
GL11.glRotatef(270, 0F, 1F, 0F); break;
case 5:
GL11.glRotatef(0, 0F, 1F, 0F); break;
@Override
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) {
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5D, y, z + 0.5D);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_CULL_FACE);
switch(tileEntity.getBlockMetadata()) {
case 2: GL11.glRotatef(90, 0F, 1F, 0F); break;
case 4: GL11.glRotatef(180, 0F, 1F, 0F); break;
case 3: GL11.glRotatef(270, 0F, 1F, 0F); break;
case 5: GL11.glRotatef(0, 0F, 1F, 0F); break;
}
GL11.glShadeModel(GL11.GL_SMOOTH);
bindTexture(ResourceManager.fstbmb_tex);
ResourceManager.fstbmb.renderPart("Body");
ResourceManager.fstbmb.renderPart("Balefire");
TileEntityNukeBalefire bf = (TileEntityNukeBalefire)tileEntity;
if(bf.loaded) {
bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/misc/glintBF.png"));
RenderMiscEffects.renderClassicGlint(tileEntity.getWorldObj(), f, ResourceManager.fstbmb, "Balefire", 0.0F, 0.8F, 0.15F, 5, 2F);
FontRenderer font = Minecraft.getMinecraft().fontRenderer;
float f3 = 0.04F;
GL11.glTranslatef(0.815F, 0.9275F, 0.5F);
GL11.glScalef(f3, -f3, f3);
GL11.glNormal3f(0.0F, 0.0F, -1.0F * f3);
GL11.glRotatef(90, 0, 1, 0);
GL11.glDepthMask(false);
GL11.glTranslatef(0, 1, 0);
font.drawString(bf.getMinutes() + ":" + bf.getSeconds(), 0, 0, 0xff0000);
GL11.glDepthMask(true);
}
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glShadeModel(GL11.GL_SMOOTH);
bindTexture(ResourceManager.fstbmb_tex);
ResourceManager.fstbmb.renderPart("Body");
ResourceManager.fstbmb.renderPart("Balefire");
GL11.glPopMatrix();
}
TileEntityNukeBalefire bf = (TileEntityNukeBalefire) tileEntity;
if(bf.loaded) {
bindTexture(new ResourceLocation(RefStrings.MODID + ":textures/misc/glintBF.png"));
RenderMiscEffects.renderClassicGlint(tileEntity.getWorldObj(), f, ResourceManager.fstbmb, "Balefire", 0.0F, 0.8F, 0.15F, 5, 2F);
FontRenderer font = Minecraft.getMinecraft().fontRenderer;
float f3 = 0.04F;
GL11.glTranslatef(0.815F, 0.9275F, 0.5F);
GL11.glScalef(f3, -f3, f3);
GL11.glNormal3f(0.0F, 0.0F, -1.0F * f3);
GL11.glRotatef(90, 0, 1, 0);
GL11.glDepthMask(false);
GL11.glTranslatef(0, 1, 0);
font.drawString(bf.getMinutes() + ":" + bf.getSeconds(), 0, 0, 0xff0000);
GL11.glDepthMask(true);
}
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glPopMatrix();
}
}

View File

@ -30,10 +30,10 @@ import net.minecraftforge.client.model.IModelCustom;
public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRendererProvider {
public static final IModelCustom yomiModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/yomi.obj"), false).asVBO();
public static final IModelCustom poohModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/pooh.obj"), false).asVBO();
public static final IModelCustom hundunModel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/hundun.obj"), false).asVBO();
public static final ResourceLocation yomiTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/yomi.png");
public static final ResourceLocation numbernineTex = new ResourceLocation(RefStrings.MODID, "textures/models/horse/numbernine.png");
public static final ResourceLocation poohTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/pooh.png");
public static final ResourceLocation hundunTex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/hundun.png");
@Override
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) {
@ -53,7 +53,7 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen
case NONE: break;
case YOMI: GL11.glScaled(0.5, 0.5, 0.5); break;
case NUMBERNINE: GL11.glScaled(0.75, 0.75, 0.75); break;
case POOH: GL11.glScaled(0.75, 0.75, 0.75); break;
case HUNDUN: GL11.glScaled(1, 1, 1); break;
}
renderPlushie(te.type);
@ -110,9 +110,9 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen
IIcon icon = stack.getIconIndex();
ItemRenderer.renderItemIn2D(Tessellator.instance, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
break;
case POOH:
Minecraft.getMinecraft().getTextureManager().bindTexture(poohTex);
poohModel.renderAll();
case HUNDUN:
Minecraft.getMinecraft().getTextureManager().bindTexture(hundunTex);
hundunModel.renderPart("goober_posed");
break;
}
}
@ -138,7 +138,7 @@ public class RenderPlushie extends TileEntitySpecialRenderer implements IItemRen
case NONE: break;
case YOMI: GL11.glScaled(1.25, 1.25, 1.25); break;
case NUMBERNINE: GL11.glTranslated(0, 0.25, 0.25); GL11.glScaled(1.25, 1.25, 1.25); break;
case POOH: GL11.glTranslated(0, 0.25, 0); GL11.glScaled(1.5, 1.5, 1.5); break;
case HUNDUN: GL11.glTranslated(0.5, 0.5, 0); GL11.glScaled(1.25, 1.25, 1.25); break;
}
renderPlushie(type);
}};

View File

@ -77,7 +77,7 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy
/** Returns the actual tile entity that represents the core. Only for internal use, and EnergyControl. */
public TileEntity getTile() {
if(tile == null || tile.isInvalid()) {
if(tile == null || tile.isInvalid() || (tile instanceof TileEntityLoadedBase && !((TileEntityLoadedBase) tile).isLoaded)) {
tile = this.getTE();
}
return tile;

View File

@ -40,7 +40,9 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU
if(!worldObj.isRemote) {
if(!this.isLoaded()) {
this.loaded = this.isLoaded();
if(!loaded) {
started = false;
}
@ -89,21 +91,15 @@ public class TileEntityNukeBalefire extends TileEntityMachineBase implements IGU
}
public boolean isLoaded() {
return hasEgg() && hasBattery();
}
public boolean hasEgg() {
if(slots[0] != null && slots[0].getItem() == ModItems.egg_balefire) {
return true;
}
if(slots[0] != null && slots[0].getItem() == ModItems.egg_balefire) return true;
return false;
}
public boolean hasBattery() {
return getBattery() > 0;
}

View File

@ -317,19 +317,19 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyRece
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return true;
public boolean canExtractItem(int slot, ItemStack stack, int side) {
return slot == 2; // only allow removing breeder outputs
}
@Override
public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
public int[] getAccessibleSlotsFromSide(int side) {
return new int[] { 1, 2, 4 };
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
public boolean isItemValidForSlot(int i, ItemStack stack) {
if(i == 1 && BreederRecipes.getOutput(itemStack) != null)
if(i == 1 && BreederRecipes.getOutput(stack) != null)
return true;
return false;

View File

@ -239,7 +239,7 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen
ItemStack valid = slots[i];
if(valid == null) return false; //null? since slots[slot] is not null by now, this other slot needs the item more
if(!(valid.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(valid, stack))) continue; //different item anyway? out with it
if(!(valid.isItemEqual(stack)/* && ItemStack.areItemStackTagsEqual(valid, stack)*/)) continue; //different item anyway? out with it
//if there is another slot that actually does need the same item more, cancel
if(valid.stackSize < size)

View File

@ -468,13 +468,13 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getTemp(Context context, Arguments args) {
return new Object[] {heat};
return new Object[] {Math.round(heat * 1.0E-5D * 780.0D + 20.0D)};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getPressure(Context context, Arguments args) {
return new Object[] {pressure};
return new Object[] {Math.round(pressure * 1.0E-5D * 30.0D)};
}
@Callback(direct = true)
@ -504,7 +504,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getInfo(Context context, Arguments args) {
return new Object[] {heat, pressure, water.getFill(), steam.getFill(), carbonDioxide.getFill(), isOn};
return new Object[] {Math.round(heat * 1.0E-5D * 780.0D + 20.0D), Math.round(pressure * 1.0E-5D * 30.0D), water.getFill(), steam.getFill(), carbonDioxide.getFill(), isOn};
}
@Callback(direct = true, limit = 4)

View File

@ -153,5 +153,4 @@ public class TileEntityRefueler extends TileEntityLoadedBase implements IFluidSt
public FluidTank[] getReceivingTanks() {
return new FluidTank[] { tank };
}
}

View File

@ -2,9 +2,10 @@ package com.hbm.tileentity.network;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonWriter;
import com.hbm.calc.Location;
import com.hbm.tileentity.IConfigurableMachine;
import com.hbm.tileentity.TileEntityLoadedBase;
import com.hbm.util.Compat;
import com.hbm.util.fauxpointtwelve.BlockPos;
import api.hbm.energymk2.IEnergyReceiverMK2;
import cofh.api.energy.EnergyStorage;
@ -41,8 +42,8 @@ public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEn
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir);
Location loc = new Location(worldObj, xCoord, yCoord, zCoord).add(dir);
TileEntity entity = loc.getTileEntity();
BlockPos loc = new BlockPos(xCoord, yCoord, zCoord).offset(dir);
TileEntity entity = Compat.getTileStandard(worldObj, loc.getX(), loc.getY(), loc.getZ());
if (entity != null && entity instanceof IEnergyReceiver) {
IEnergyReceiver receiver = (IEnergyReceiver) entity;

View File

@ -0,0 +1,11 @@
{
"name": "Aluminium",
"icon": ["hbm:item.ingot_aluminium", 1, 0],
"trigger": [["hbm:item.ingot_aluminium"], ["hbm:item.plate_aluminium"], ["hbm:item.powder_aluminium"]],
"title": {
"en_US": "Aluminium"
},
"content": {
"en_US": "Common, lightweight metal. Available early on from smelting cryolite ('aluminium-bearing ore') in a [[combination oven|Combination Oven]]. Can be made later by processing [[bauxite|Bauxite]], and [[electrolyzing|Electrolysis Machine]] the resulting alumina solution.<br><br>Used in piping, general fluid handling, as part of [[gunmetal|Gunmetal]] and missile fuselages."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Cadmium Steel",
"icon": ["hbm:item.ingot_cdalloy", 1, 0],
"trigger": [["hbm:item.ingot_cdalloy"]],
"title": {
"en_US": "Cadmium Steel"
},
"content": {
"en_US": "Corrosion-resistant alloy, made from [[steel|Steel]] and [[cadmium|Cadmium]]. Alternative to [[technetium steel|Technetium Steel]] in most recipes."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Cinnabar",
"icon": ["hbm:item.cinnebar", 1, 0],
"trigger": [["hbm:item.cinnebar"]],
"title": {
"en_US": "Cinnabar"
},
"content": {
"en_US": "Rare ore. Can be [[acidized|Ore Acidizer]] into 375mB worth of [[mercury|Mercury]] drops, or [[combination smelted|Combination Oven]] into 100mB of mercury and some sulfur. Mainly exists as an early means to get mercury for [[desh|Desh]] production."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Coke",
"icon": ["hbm:item.coke", 1, 0],
"trigger": [["hbm:item.coke", 1, 32767]],
"title": {
"en_US": "Coke"
},
"content": {
"en_US": "High-purity carbon, has twice the burn value of coal. Can be pressed into [[graphite|Graphite]], used in various [[steel|Steel]] recipes or as a source of carbon for the [[crucible|Crucible]].<br><br>Coal coke can be made by smelting coal briquettes, or combination smelting coal in its various forms.<br><br>Lignite coke is made from the much cheaper and less powerful lignite in much the same way, despite this it has the same characteristics.<br><br>Petroleum coke is made either from non-coal tars in a [[combination oven|Combination Oven]], or by coking various types of oil in a [[coker|Coking Unit]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Copper",
"icon": ["hbm:item.ingot_copper", 1, 0],
"trigger": [["hbm:item.ingot_copper"], ["hbm:item.plate_copper"], ["hbm:item.powder_copper"]],
"title": {
"en_US": "Copper"
},
"content": {
"en_US": "Common resource. In its raw form, mostly used as a structural material, and in things that handle high temperatures (as a heat conductor). Strongly used in various alloyed forms.<br><br>[[Minecraft grade copper|Minecraft Grade Copper]] is an alloy made from redstone that is used in almost all electrical things.<br><br>[[Advanced alloy|Advanced Alloy]] is a powerful early tool material which surpasses diamond.<br><br>[[Gunmetal]] is a vital component of many guns, as well as casings for ammunition.<br><br>[[Bismuth bronze|Bismuth Bronze]] and [[arsenic bronze|Arsenic Bronze]] are post-[[RBMK]] materials used in many late-game machines.<br><br>[[BSCCO]] is a [[bismuth|Bismuth]]-derived super conductor needed for high-tier quantum circuits and [[particle accelerator|Particle Accelerator]] coils."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Desh",
"icon": ["hbm:item.ingot_desh", 1, 0],
"trigger": [["hbm:item.ingot_desh"], ["hbm:item.powder_desh"]],
"title": {
"en_US": "Desh"
},
"content": {
"en_US": "High-strength working alloy made in a [[chemical plant|Chemical Plant]]. Requires [[light oil|Light oil]] from basic [[oil|Crude Oil]] refining, [[mercury|Mercury]], a byproduct of [[centrifuging|Centrifuge]] redstone ore and desh blend, which is just [[shredded|Shredder]] rare earth ore chunks.<br><br>Used in a variety of things, especially tools and weapons. Desh tools are slow and only iron tier, but are the first available ones to be unbreakable and offer many tool abilities."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Graphite",
"icon": ["hbm:item.ingot_graphite", 1, 0],
"trigger": [["hbm:item.ingot_graphite"]],
"title": {
"en_US": "Graphite"
},
"content": {
"en_US": "Made from pressing coke. Used in nuclear reactors, graphite electrodes for the [[electric arc furnace|Electric Arc Furnace]] or as a source for carbon in various [[crucible|Crucible]] recipes."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Gunmetal",
"icon": ["hbm:item.ingot_gunmetal", 1, 0],
"trigger": [["hbm:item.ingot_gunmetal"], ["hbm:item.plate_gunmetal"]],
"title": {
"en_US": "Gunmetal"
},
"content": {
"en_US": "Alloy of [[aluminium|Aluminium]] and [[copper|Copper]]. Can be made in an anvil, or more efficiently in a [[rotary furnace|Rotary Furnace]]. Used mainly for weapon parts, as well as casings for most ammunition."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "High-Speed Steel",
"icon": ["hbm:item.ingot_dura_steel", 1, 0],
"trigger": [["hbm:item.ingot_dura_steel"], ["hbm:item.powder_dura_steel"], ["hbm:item.plate_dura_steel"]],
"title": {
"en_US": "High-Speed Steel"
},
"content": {
"en_US": "Alloy made from [[steel|Steel]], [[tungsten|Tungsten]] and [[cobalt|Cobalt]] in a [[curcible|Crucible]]. Created as liquid metal, needs to be cast into ingot or plate shape before being usable."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Latex",
"icon": ["hbm:item.ingot_biorubber", 1, 0],
"trigger": [["hbm:item.ingot_biorubber"], ["hbm:item.ball_resin"]],
"title": {
"en_US": "Latex"
},
"content": {
"en_US": "Natural form of rubber, obtainable from dandelions or by pressing jungle wood. Can be replaced in all recipes by [[rubber|Rubber]], but not vice versa."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Lead",
"icon": ["hbm:item.ingot_lead", 1, 0],
"trigger": [["hbm:item.ingot_lead"], ["hbm:item.nugget_lead"], ["hbm:item.powder_lead"]],
"title": {
"en_US": "Lead"
},
"content": {
"en_US": "Common resource. Mainly used for things that involve radiation, as well as ammunition, and as solder for many circuits."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Neptunium",
"icon": ["hbm:item.ingot_neptunium", 1, 0],
"trigger": [["hbm:item.ingot_neptunium"], ["hbm:item.billet_neptunium"], ["hbm:item.nugget_neptunium"], ["hbm:item.powder_neptunium"]],
"title": {
"en_US": "Neptunium"
},
"content": {
"en_US": "Fissile isotope, usually found in spent [[uranium-235|Uranium-235]] fuel. Mostly used for nuclear reactors, either pure as high enriched neptunium fuel, or combined with [[uranium-238|Uranium-238]] as medium enriched neptunium fuel. Usable in the [[PWR]] and [[RBMK]]."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Rubber",
"icon": ["hbm:item.ingot_rubber", 1, 0],
"trigger": [["hbm:item.ingot_rubber"]],
"title": {
"en_US": "Rubber"
},
"content": {
"en_US": "Oil product, derived from [[unsaturated hydrocabons|Unsaturated Hydrocarbons]] and [[sulfur|Sulfur]]. Requires at least a [[cracking tower|Catalytic Cracking Tower]] to make. Can replace [[latex|Latex]] in every recipe."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Sodium",
"icon": ["hbm:item.powder_sodium", 1, 0],
"trigger": [["hbm:item.powder_sodium"]],
"title": {
"en_US": "Sodium"
},
"content": {
"en_US": "Mainly derived from sodalite, a gem which is found as a [[centrifuge|Centrifuge]] byproduct of many ores. Used in liquid form as a powerful [[PWR]] coolant."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Sulfur",
"icon": ["hbm:item.sulfur", 1, 0],
"trigger": [["hbm:item.sulfur"]],
"title": {
"en_US": "Sulfur"
},
"content": {
"en_US": "Common ore, found in even larger numbers in the nether. Used in a variety of things, like [[sulfuric acid|Sulfuric Acid]], [[rubber|Rubber]] and in yellowcake for [[uranium|Uranium]] hexafluoride. Can also make gunpowder, matchsticks, or act as yellow dye."
}
}

View File

@ -0,0 +1,11 @@
{
"name": "Weapon Steel",
"icon": ["hbm:item.ingot_weaponsteel", 1, 0],
"trigger": [["hbm:item.ingot_weaponsteel"], ["hbm:item.plate_weaponsteel"]],
"title": {
"en_US": "Weapon Steel"
},
"content": {
"en_US": "High-purity version of [[steel|Steel]] made in a [[rotary furnace|Rotary Furnace]]. Requires [[coker gas|Coker Gas]], and therefore a [[coker unit|Coker Unit]]. Used in many mid-game weapons, weapon modifications and missile warheads."
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,334 +0,0 @@
# Blender v2.79 (sub 0) OBJ File: 'pooh.blend'
# www.blender.org
o Cube_Cube.001
v -0.250000 0.062500 0.250000
v 0.250000 0.062500 0.250000
v -0.250000 0.062500 -0.250000
v 0.250000 0.062500 -0.250000
v -0.250000 0.437500 0.250000
v 0.250000 0.437500 0.250000
v -0.250000 0.437500 -0.250000
v 0.250000 0.437500 -0.250000
v -0.187500 0.437500 0.187500
v 0.187500 0.437500 0.187500
v -0.187500 0.437500 -0.187500
v 0.187500 0.437500 -0.187500
v -0.187500 0.625000 -0.187500
v -0.187500 0.625000 0.187500
v 0.187500 0.625000 0.187500
v 0.187500 0.625000 -0.187500
v -0.250000 0.625000 0.250000
v 0.250000 0.625000 0.250000
v -0.250000 0.625000 -0.250000
v 0.250000 0.625000 -0.250000
v -0.250000 1.125000 -0.250000
v -0.250000 1.125000 0.250000
v 0.250000 1.125000 0.250000
v 0.250000 1.125000 -0.250000
v -0.125000 0.000000 -0.062500
v 0.500000 0.000000 -0.062500
v -0.125000 0.000000 -0.187500
v 0.500000 0.000000 -0.187500
v -0.125000 0.125000 -0.187500
v -0.125000 0.125000 -0.062500
v 0.500000 0.125000 -0.062500
v 0.500000 0.125000 -0.187500
v -0.125000 0.000000 0.187500
v 0.500000 0.000000 0.187500
v -0.125000 0.000000 0.062500
v 0.500000 0.000000 0.062500
v -0.125000 0.125000 0.062500
v -0.125000 0.125000 0.187500
v 0.500000 0.125000 0.187500
v 0.500000 0.125000 0.062500
v -0.062500 0.606694 -0.169194
v 0.062500 0.606694 -0.169194
v -0.062500 0.518306 -0.080806
v 0.062500 0.518306 -0.080806
v -0.062500 0.253141 -0.345971
v -0.062500 0.341529 -0.434359
v 0.062500 0.341529 -0.434359
v 0.062500 0.253141 -0.345971
v -0.062500 0.606694 0.169194
v 0.062500 0.606694 0.169194
v -0.062500 0.518306 0.080806
v 0.062500 0.518306 0.080806
v -0.062500 0.253141 0.345971
v -0.062500 0.341529 0.434359
v 0.062500 0.341529 0.434359
v 0.062500 0.253141 0.345971
v 0.250000 0.781250 0.031250
v 0.250000 0.718750 0.031250
v 0.250000 0.781250 -0.031250
v 0.250000 0.718750 -0.031250
v 0.312500 0.781250 -0.031250
v 0.312500 0.781250 0.031250
v 0.312500 0.718750 0.031250
v 0.312500 0.718750 -0.031250
v -0.093750 1.062500 -0.125000
v 0.093750 1.062500 -0.125000
v -0.093750 1.062500 -0.312500
v 0.093750 1.062500 -0.312500
v -0.093750 1.250000 -0.312500
v -0.093750 1.250000 -0.125000
v 0.093750 1.250000 -0.125000
v 0.093750 1.250000 -0.312500
v -0.093750 1.062500 0.312500
v 0.093750 1.062500 0.312500
v -0.093750 1.062500 0.125000
v 0.093750 1.062500 0.125000
v -0.093750 1.250000 0.125000
v -0.093750 1.250000 0.312500
v 0.093750 1.250000 0.312500
v 0.093750 1.250000 0.125000
vt 0.400000 -0.000000
vt 0.200000 0.173913
vt 0.200000 -0.000000
vt 0.200000 0.304348
vt 0.400000 0.478261
vt 0.200000 0.478261
vt 0.600000 0.173913
vt 0.400000 0.304348
vt 0.400000 0.173913
vt 0.000000 0.304348
vt 0.000000 0.173913
vt 0.800000 0.173913
vt 0.600000 0.304348
vt 0.700000 0.304348
vt 0.550000 0.369565
vt 0.550000 0.304348
vt 1.000000 0.304348
vt 0.850000 0.369565
vt 0.850000 0.304348
vt 0.700000 0.369565
vt 0.400000 0.369565
vt 0.400000 0.304348
vt 0.400000 0.478261
vt 0.200000 0.652174
vt 0.200000 0.478261
vt 0.200000 0.826087
vt 0.400000 1.000000
vt 0.200000 1.000000
vt 0.600000 0.652174
vt 0.400000 0.826087
vt 0.400000 0.652174
vt -0.000000 0.826087
vt -0.000000 0.652174
vt 0.800000 0.652174
vt 0.600000 0.826087
vt 0.900000 0.260870
vt 0.950000 0.043478
vt 0.950000 0.260870
vt 0.800000 0.043478
vt 0.850000 0.260870
vt 0.800000 0.260870
vt 0.850000 -0.000000
vt 0.800000 0.000000
vt 0.800000 0.304348
vt 0.850000 0.304348
vt 0.850000 0.043478
vt 0.900000 0.043478
vt 1.000000 0.260870
vt 0.900000 0.260870
vt 0.950000 0.043478
vt 0.950000 0.260870
vt 0.800000 0.043478
vt 0.850000 0.260870
vt 0.800000 0.260870
vt 0.850000 -0.000000
vt 0.800000 0.000000
vt 0.800000 0.304348
vt 0.850000 0.304348
vt 0.850000 0.043478
vt 0.900000 0.043478
vt 1.000000 0.260870
vt 0.550000 0.369565
vt 0.475000 0.434783
vt 0.475000 0.369565
vt 0.400000 0.043478
vt 0.450000 0.000000
vt 0.450000 0.043478
vt 0.600000 0.173913
vt 0.550000 0.043478
vt 0.600000 0.043478
vt 0.450000 0.173913
vt 0.500000 0.043478
vt 0.500000 0.173913
vt 0.550000 0.173913
vt 0.400000 0.173913
vt 0.400000 0.000000
vt 0.450000 0.043478
vt 0.400000 0.043478
vt 0.500000 0.173913
vt 0.450000 0.173913
vt 0.550000 0.043478
vt 0.600000 0.173913
vt 0.550000 0.173913
vt 0.500000 0.043478
vt 0.400000 0.173913
vt 0.425000 0.521739
vt 0.450000 0.543478
vt 0.425000 0.543478
vt 0.425000 0.565217
vt 0.450000 0.565217
vt 0.475000 0.543478
vt 0.450000 0.521739
vt 0.475000 0.521739
vt 0.400000 0.521739
vt 0.400000 0.543478
vt 0.450000 0.500000
vt 0.425000 0.500000
vt 0.475000 0.500000
vt 0.550000 0.565217
vt 0.475000 0.565217
vt 0.550000 0.434783
vt 0.700000 0.434783
vt 0.625000 0.500000
vt 0.625000 0.434783
vt 0.550000 0.500000
vt 0.400000 0.500000
vt 0.400000 0.434783
vt 0.550000 0.369565
vt 0.475000 0.434783
vt 0.475000 0.369565
vt 0.475000 0.500000
vt 0.550000 0.565217
vt 0.475000 0.565217
vt 0.550000 0.434783
vt 0.700000 0.434783
vt 0.625000 0.500000
vt 0.625000 0.434783
vt 0.550000 0.500000
vt 0.400000 0.500000
vt 0.400000 0.434783
vt 0.800000 0.304348
vt 1.000000 0.369565
vt 0.800000 0.826087
vt 1.000000 0.043478
vt 1.000000 0.043478
vt 0.400000 0.000000
vt 0.450000 0.000000
vt 0.600000 0.043478
vt 0.700000 0.500000
vt 0.700000 0.500000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -0.7071 -0.7071
vn 0.0000 -0.7071 0.7071
vn 0.0000 0.7071 -0.7071
vn 0.0000 0.7071 0.7071
s off
f 3/1/1 2/2/1 1/3/1
f 6/4/2 7/5/2 5/6/2
f 3/7/3 8/8/3 4/9/3
f 2/2/4 5/10/4 1/11/4
f 4/9/5 6/4/5 2/2/5
f 1/12/6 7/13/6 3/7/6
f 12/14/5 15/15/5 10/16/5
f 9/17/6 13/18/6 11/19/6
f 11/19/3 16/20/3 12/14/3
f 10/16/4 14/21/4 9/22/4
f 19/23/1 18/24/1 17/25/1
f 23/26/2 21/27/2 22/28/2
f 19/29/3 24/30/3 20/31/3
f 18/24/4 22/32/4 17/33/4
f 20/31/5 23/26/5 18/24/5
f 17/34/6 21/35/6 19/29/6
f 27/36/1 26/37/1 25/38/1
f 31/39/2 29/40/2 30/41/2
f 28/42/5 31/39/5 26/43/5
f 25/44/6 29/40/6 27/45/6
f 27/36/3 32/46/3 28/47/3
f 26/37/4 30/48/4 25/38/4
f 35/49/1 34/50/1 33/51/1
f 39/52/2 37/53/2 38/54/2
f 36/55/5 39/52/5 34/56/5
f 33/57/6 37/53/6 35/58/6
f 35/49/3 40/59/3 36/60/3
f 34/50/4 38/61/4 33/51/4
f 67/62/1 66/63/1 65/64/1
f 47/65/7 45/66/7 46/67/7
f 42/68/5 48/69/5 47/70/5
f 41/71/6 45/72/6 43/73/6
f 43/73/8 48/69/8 44/74/8
f 42/75/9 46/67/9 41/71/9
f 53/76/8 55/77/8 54/78/8
f 55/77/5 52/79/5 50/80/5
f 53/81/6 49/82/6 51/83/6
f 56/84/7 51/83/7 52/79/7
f 54/78/10 50/80/10 49/85/10
f 63/86/5 61/87/5 62/88/5
f 57/89/2 61/87/2 59/90/2
f 59/91/3 64/92/3 60/93/3
f 58/94/4 62/88/4 57/95/4
f 60/96/1 63/86/1 58/97/1
f 71/98/2 69/99/2 70/100/2
f 68/101/5 71/98/5 66/63/5
f 65/102/6 69/103/6 67/104/6
f 67/104/3 72/105/3 68/101/3
f 66/63/4 70/106/4 65/107/4
f 75/108/1 74/109/1 73/110/1
f 79/111/2 77/112/2 78/113/2
f 76/114/5 79/111/5 74/109/5
f 73/115/6 77/116/6 75/117/6
f 75/117/3 80/118/3 76/114/3
f 74/109/4 78/119/4 73/120/4
f 3/1/1 4/9/1 2/2/1
f 6/4/2 8/8/2 7/5/2
f 3/7/3 7/13/3 8/8/3
f 2/2/4 6/4/4 5/10/4
f 4/9/5 8/8/5 6/4/5
f 1/12/6 5/121/6 7/13/6
f 12/14/5 16/20/5 15/15/5
f 9/17/6 14/122/6 13/18/6
f 11/19/3 13/18/3 16/20/3
f 10/16/4 15/15/4 14/21/4
f 19/23/1 20/31/1 18/24/1
f 23/26/2 24/30/2 21/27/2
f 19/29/3 21/35/3 24/30/3
f 18/24/4 23/26/4 22/32/4
f 20/31/5 24/30/5 23/26/5
f 17/34/6 22/123/6 21/35/6
f 27/36/1 28/47/1 26/37/1
f 31/39/2 32/46/2 29/40/2
f 28/42/5 32/46/5 31/39/5
f 25/44/6 30/41/6 29/40/6
f 27/36/3 29/40/3 32/46/3
f 26/37/4 31/124/4 30/48/4
f 35/49/1 36/60/1 34/50/1
f 39/52/2 40/59/2 37/53/2
f 36/55/5 40/59/5 39/52/5
f 33/57/6 38/54/6 37/53/6
f 35/49/3 37/53/3 40/59/3
f 34/50/4 39/125/4 38/61/4
f 67/62/1 68/101/1 66/63/1
f 47/65/7 48/126/7 45/66/7
f 42/68/5 44/74/5 48/69/5
f 41/71/6 46/67/6 45/72/6
f 43/73/8 45/72/8 48/69/8
f 42/75/9 47/65/9 46/67/9
f 53/76/8 56/127/8 55/77/8
f 55/77/5 56/84/5 52/79/5
f 53/81/6 54/128/6 49/82/6
f 56/84/7 53/81/7 51/83/7
f 54/78/10 55/77/10 50/80/10
f 63/86/5 64/92/5 61/87/5
f 57/89/2 62/88/2 61/87/2
f 59/91/3 61/87/3 64/92/3
f 58/94/4 63/86/4 62/88/4
f 60/96/1 64/92/1 63/86/1
f 71/98/2 72/105/2 69/99/2
f 68/101/5 72/105/5 71/98/5
f 65/102/6 70/129/6 69/103/6
f 67/104/3 69/103/3 72/105/3
f 66/63/4 71/98/4 70/106/4
f 75/108/1 76/114/1 74/109/1
f 79/111/2 80/118/2 77/112/2
f 76/114/5 80/118/5 79/111/5
f 73/115/6 78/130/6 77/116/6
f 75/117/3 77/116/3 80/118/3
f 74/109/4 79/111/4 78/119/4

View File

@ -64,6 +64,7 @@
"block.fel": {"category": "block", "sounds": [{"name": "block/fel", "stream": false}]},
"block.hephaestusRunning": {"category": "block", "sounds": [{"name": "block/hephaestusRunning", "stream": false}]},
"block.squeakyToy": {"category": "block", "sounds": [{"name": "block/squeakyToy", "stream": false}]},
"block.hunduns_magnificent_howl": {"category": "block", "sounds": [{"name": "block/hunduns_magnificent_howl", "stream": false}]},
"block.pyroOperate": {"category": "block", "sounds": [{"name": "block/pyroOperate", "stream": false}]},
"block.motor": {"category": "block", "sounds": [{"name": "block/motor", "stream": false}]},
"block.engine": {"category": "block", "sounds": [{"name": "block/engine", "stream": false}]},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1017 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 409 B