/**
* This class was created by <williewillus>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
*/
package vazkii.botania.client.core.handler;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.IntBuffer;
import java.util.Map;
import javax.imageio.ImageIO;
import org.apache.commons.lang3.text.WordUtils;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import com.google.common.collect.Maps;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.launchwrapper.Launch;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.event.entity.player.ArrowLooseEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import vazkii.botania.client.core.helper.IconHelper;
import vazkii.botania.client.model.FloatingFlowerModel;
import vazkii.botania.client.model.GunModel;
import vazkii.botania.client.model.LexiconModel;
import vazkii.botania.client.model.PlatformModel;
import vazkii.botania.common.Botania;
import vazkii.botania.common.item.ItemSparkUpgrade;
import vazkii.botania.common.item.equipment.bauble.ItemFlightTiara;
import vazkii.botania.common.item.relic.ItemKingKey;
public class MiscellaneousIcons {
public static final MiscellaneousIcons INSTANCE = new MiscellaneousIcons();
public TextureAtlasSprite
alfPortalTex,
lightRelayWorldIcon,
lightRelayWorldIconRed,
lightRelayWorldIconGreen,
lightRelayWorldIconPurple,
alchemyCatalystOverlay,
conjurationCatalystOverlay,
enchanterOverlay,
manaVoidOverlay,
manaWater,
terraPlateOverlay,
corporeaWorldIcon,
corporeaWorldIconMaster,
corporeaIconStar,
sparkWorldIcon,
manaDetectorIcon,
runeAltarTriggerIcon,
terrasteelHelmWillIcon;
public TextureAtlasSprite[] sparkUpgradeIcons;
public TextureAtlasSprite[] kingKeyWeaponIcons;
// todo buildcraft public final Map<TriggerManaLevel.State, TextureAtlasSprite> manaLevelTriggerIcons = Maps.newEnumMap(TriggerManaLevel.State.class);
public TextureAtlasSprite[] tiaraWingIcons;
public TextureAtlasSprite[] thirdEyeLayers;
// begin dank_memes
public TextureAtlasSprite tailIcon = null;
public TextureAtlasSprite phiFlowerIcon = null;
public TextureAtlasSprite goldfishIcon = null;
public TextureAtlasSprite nerfBatIcon = null;
// end dank_memes
// Icons for baubles that don't render their own model on the player
public TextureAtlasSprite
bloodPendantChain,
bloodPendantGem,
snowflakePendantGem,
itemFinderGem,
pyroclastGem,
crimsonGem,
cirrusGem,
nimbusGem;
@SubscribeEvent
public void onModelBake(ModelBakeEvent evt) {
// Floating flowers
FloatingFlowerModel model = new FloatingFlowerModel();
evt.getModelRegistry().putObject(new ModelResourceLocation("botania:miniIsland", "normal"), model);
evt.getModelRegistry().putObject(new ModelResourceLocation("botania:miniIsland", "inventory"), model);
evt.getModelRegistry().putObject(new ModelResourceLocation("botania:floatingSpecialFlower", "normal"), model);
evt.getModelRegistry().putObject(new ModelResourceLocation("botania:floatingSpecialFlower", "inventory"), model);
// Platforms
evt.getModelRegistry().putObject(new ModelResourceLocation("botania:platform", "normal"), new PlatformModel());
// Lexicon
evt.getModelRegistry().putObject(new ModelResourceLocation("botania:lexicon", "inventory"), new LexiconModel());
// Mana Blaster
ModelResourceLocation key = new ModelResourceLocation("botania:manaGun", "inventory");
IBakedModel originalModel = evt.getModelRegistry().getObject(key);
evt.getModelRegistry().putObject(key, new GunModel(originalModel));
key = new ModelResourceLocation("botania:manaGunClip", "inventory");
originalModel = evt.getModelRegistry().getObject(key);
evt.getModelRegistry().putObject(key, new GunModel(originalModel));
}
@SubscribeEvent
public void onTextureStitch(TextureStitchEvent.Pre evt) {
alfPortalTex = IconHelper.forName(evt.getMap(), "alfheimPortalInside", "blocks");
lightRelayWorldIcon = IconHelper.forName(evt.getMap(), "lightRelay1", "blocks");
lightRelayWorldIconRed = IconHelper.forName(evt.getMap(), "lightRelay3", "blocks");
lightRelayWorldIconGreen = IconHelper.forName(evt.getMap(), "lightRelay5", "blocks");
lightRelayWorldIconPurple = IconHelper.forName(evt.getMap(), "lightRelay7", "blocks");
alchemyCatalystOverlay = IconHelper.forName(evt.getMap(), "alchemyCatalyst3", "blocks");
conjurationCatalystOverlay = IconHelper.forName(evt.getMap(), "conjurationCatalyst3", "blocks");
enchanterOverlay = IconHelper.forName(evt.getMap(), "enchanterOverlay", "blocks");
manaVoidOverlay = IconHelper.forName(evt.getMap(), "manaVoid1", "blocks");
manaWater = IconHelper.forName(evt.getMap(), "manaWater", "blocks");
terraPlateOverlay = IconHelper.forName(evt.getMap(), "terraPlateOverlay", "blocks");
corporeaWorldIcon = IconHelper.forName(evt.getMap(), "corporeaSpark1", "items");
corporeaWorldIconMaster = IconHelper.forName(evt.getMap(), "corporeaSpark3", "items");
corporeaIconStar = IconHelper.forName(evt.getMap(), "corporeaSparkStar", "items");
sparkWorldIcon = IconHelper.forName(evt.getMap(), "spark1", "items");
sparkUpgradeIcons = new TextureAtlasSprite[ItemSparkUpgrade.VARIANTS];
for(int i = 0; i < ItemSparkUpgrade.VARIANTS; i++) {
sparkUpgradeIcons[i] = IconHelper.forName(evt.getMap(), "sparkUpgradeL" + i, "items");
}
tailIcon = IconHelper.forName(evt.getMap(), "tail", "items");
phiFlowerIcon = IconHelper.forName(evt.getMap(), "phiFlower", "items");
goldfishIcon = IconHelper.forName(evt.getMap(), "goldfish", "items");
nerfBatIcon = IconHelper.forName(evt.getMap(), "nerfBat", "items");
kingKeyWeaponIcons = new TextureAtlasSprite[ItemKingKey.WEAPON_TYPES];
for(int i = 0; i < ItemKingKey.WEAPON_TYPES; i++)
kingKeyWeaponIcons[i] = IconHelper.forName(evt.getMap(), "gateWeapon" + i, "items");
thirdEyeLayers = new TextureAtlasSprite[3];
for(int i = 0; i < 3; i++)
thirdEyeLayers[i] = IconHelper.forName(evt.getMap(), "thirdEye" + i, "items");
manaDetectorIcon = IconHelper.forName(evt.getMap(), "triggers/manaDetector", "items");
runeAltarTriggerIcon = IconHelper.forName(evt.getMap(), "triggers/runeAltarCanCraft", "items");
/*for (TriggerManaLevel.State s : TriggerManaLevel.State.values()) { todo buildcraft
manaLevelTriggerIcons.put(s, IconHelper.forName(evt.getMap(), "triggers/mana" + WordUtils.capitalizeFully(s.name()), "items"));
}*/
tiaraWingIcons = new TextureAtlasSprite[ItemFlightTiara.WING_TYPES];
for (int i = 0; i < tiaraWingIcons.length; i++) {
tiaraWingIcons[i] = IconHelper.forName(evt.getMap(), "flightTiara" + (i + 1), "items");
}
terrasteelHelmWillIcon = IconHelper.forName(evt.getMap(), "willFlame", "items");
bloodPendantChain = IconHelper.forName(evt.getMap(), "bloodPendant2", "items");
bloodPendantGem = IconHelper.forName(evt.getMap(), "bloodPendant3", "items");
snowflakePendantGem = IconHelper.forName(evt.getMap(), "icePendantGem", "items");
itemFinderGem = IconHelper.forName(evt.getMap(), "itemFinderGem", "items");
pyroclastGem = IconHelper.forName(evt.getMap(), "lavaPendantGem", "items");
crimsonGem = IconHelper.forName(evt.getMap(), "superLavaPendantGem", "items");
cirrusGem = IconHelper.forName(evt.getMap(), "cloudPendantGem", "items");
nimbusGem = IconHelper.forName(evt.getMap(), "superCloudPendantGem", "items");
}
@SubscribeEvent
public void dumpAtlas(ArrowLooseEvent evt) {
if (!evt.getEntityPlayer().world.isRemote || !((Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"))
|| !evt.getEntityPlayer().isSneaking())
return;
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
int height = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
Botania.LOGGER.debug("Dumped atlas %d wide by %d tall%n", width, height);
int pixels = width * height;
IntBuffer buffer = BufferUtils.createIntBuffer(pixels);
int[] pixelValues = new int[pixels];
GL11.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buffer);
buffer.get(pixelValues);
BufferedImage bufferedimage = new BufferedImage(width, height, 2);
for (int k = 0; k < height; ++k)
{
for (int l = 0; l < width; ++l)
{
bufferedimage.setRGB(l, k, pixelValues[k * width + l]);
}
}
File mcFolder = Minecraft.getMinecraft().mcDataDir;
File result = new File(mcFolder, "atlas.png");
try {
ImageIO.write(bufferedimage, "png", result);
} catch (IOException e) {
Botania.LOGGER.warn("Failed to dump debug atlas");
}
}
private MiscellaneousIcons() {}
}