mirror of
https://github.com/GTNewHorizons/Chisel.git
synced 2026-11-12 16:27:45 +00:00
All devs and contributors should use the provided formatter settings. If your IDE does not support the format, the rules are simple, it is the default java formatting rules, with 200char line lengths and 1 extra line after class definitions.
398 lines
13 KiB
Java
398 lines
13 KiB
Java
package com.cricketcraft.chisel.carving;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockPane;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.client.renderer.texture.IIconRegister;
|
|
import net.minecraft.creativetab.CreativeTabs;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.IIcon;
|
|
import net.minecraft.world.IBlockAccess;
|
|
|
|
import com.cricketcraft.chisel.Chisel;
|
|
import com.cricketcraft.chisel.Configurations;
|
|
import com.cricketcraft.chisel.block.BlockMarbleSlab;
|
|
import com.cricketcraft.chisel.carving.CarvableVariation.CarvableVariationCTM;
|
|
import com.cricketcraft.chisel.client.render.CTM;
|
|
import com.cricketcraft.chisel.client.render.TextureSubmap;
|
|
import com.cricketcraft.chisel.item.ItemCarvable;
|
|
import com.cricketcraft.chisel.utils.GeneralClient;
|
|
|
|
import cpw.mods.fml.common.registry.GameRegistry;
|
|
|
|
public class CarvableHelper {
|
|
|
|
public static final ArrayList<Block> chiselBlocks = new ArrayList<Block>();
|
|
|
|
public static final int NORMAL = 0;
|
|
public static final int TOPSIDE = 1;
|
|
public static final int TOPBOTSIDE = 2;
|
|
public static final int CTM3 = 3;
|
|
public static final int CTMV = 4;
|
|
public static final int CTMH = 5;
|
|
public static final int V9 = 6;
|
|
public static final int V4 = 7;
|
|
public static final int CTMX = 8;
|
|
|
|
public CarvableHelper() {
|
|
}
|
|
|
|
public ArrayList<CarvableVariation> variations = new ArrayList<CarvableVariation>();
|
|
CarvableVariation[] map = new CarvableVariation[16];
|
|
public boolean forbidChiseling = false;
|
|
public String blockName;
|
|
|
|
public void addVariation(String description, int metadata, Block bb) {
|
|
addVariation(description, metadata, null, bb, 0);
|
|
}
|
|
|
|
public void addVariation(String description, int metadata, Block bb, int blockMeta) {
|
|
addVariation(description, metadata, null, bb, blockMeta);
|
|
}
|
|
|
|
public void addVariation(String description, int metadata, Block bb, int blockMeta, Material material) {
|
|
addVariation(description, metadata, null, bb, blockMeta);
|
|
}
|
|
|
|
public void addVariation(String description, int metadata, String texture) {
|
|
addVariation(description, metadata, texture, null, 0);
|
|
}
|
|
|
|
public void addVariation(String description, int metadata, String texture, Block block, int blockMeta) {
|
|
if (variations.size() >= 16)
|
|
return;
|
|
|
|
if (blockName == null && block != null)
|
|
blockName = block.getLocalizedName();
|
|
else if (blockName == null && description != null)
|
|
blockName = description;
|
|
|
|
CarvableVariation variation = new CarvableVariation();
|
|
variation.description = description;
|
|
variation.metadata = metadata;
|
|
variation.blockName = blockName;
|
|
|
|
if (texture != null) {
|
|
variation.texture = texture;
|
|
|
|
String path = "/assets/" + Chisel.MOD_ID + "/textures/blocks/" + variation.texture;
|
|
|
|
boolean any = Chisel.class.getResource(path + ".png") != null;
|
|
boolean ctm3 = Chisel.class.getResource(path + "-ctm1.png") != null && Chisel.class.getResource(path + "-ctm2.png") != null && Chisel.class.getResource(path + "-ctm3.png") != null;
|
|
boolean ctmv = Chisel.class.getResource(path + "-ctmv.png") != null;
|
|
boolean ctmh = Chisel.class.getResource(path + "-ctmh.png") != null;
|
|
boolean side = Chisel.class.getResource(path + "-side.png") != null;
|
|
boolean top = Chisel.class.getResource(path + "-top.png") != null;
|
|
boolean bot = Chisel.class.getResource(path + "-bottom.png") != null;
|
|
boolean v9 = Chisel.class.getResource(path + "-v9.png") != null;
|
|
boolean v4 = Chisel.class.getResource(path + "-v4.png") != null;
|
|
boolean ctmx = Chisel.class.getResource(path + "-ctm.png") != null;
|
|
|
|
if (ctm3) {
|
|
variation.kind = 3;
|
|
} else if (ctmh && top) {
|
|
variation.kind = 5;
|
|
} else if (ctmv && top) {
|
|
variation.kind = CTMV;
|
|
} else if (bot && top && side) {
|
|
variation.kind = 2;
|
|
} else if (top && side) {
|
|
variation.kind = 1;
|
|
} else if (v9) {
|
|
variation.kind = V9;
|
|
} else if (v4) {
|
|
variation.kind = V4;
|
|
} else if (any && ctmx && !Configurations.disableCTM) {
|
|
variation.kind = CTMX;
|
|
} else if (any) {
|
|
variation.kind = 0;
|
|
} else {
|
|
throw new RuntimeException("No valid textures found for chisel block variation '" + description + "' (" + variation.texture + ")");
|
|
}
|
|
} else {
|
|
variation.block = block;
|
|
variation.kind = 2;
|
|
variation.blockMeta = blockMeta;
|
|
}
|
|
|
|
variations.add(variation);
|
|
map[metadata] = variation;
|
|
}
|
|
|
|
public CarvableVariation getVariation(int metadata) {
|
|
if (metadata < 0 || metadata > 15)
|
|
metadata = 0;
|
|
|
|
CarvableVariation variation = map[metadata];
|
|
if (variation == null)
|
|
return null;
|
|
|
|
return variation;
|
|
}
|
|
|
|
public IIcon getIcon(int side, int metadata) {
|
|
if (metadata < 0 || metadata > 15)
|
|
metadata = 0;
|
|
|
|
CarvableVariation variation = map[metadata];
|
|
if (variation == null)
|
|
return GeneralClient.getMissingIcon();
|
|
|
|
switch (variation.kind) {
|
|
case 0:
|
|
return variation.icon;
|
|
case 1:
|
|
if (side == 0 || side == 1)
|
|
return variation.iconTop;
|
|
else
|
|
return variation.icon;
|
|
case 2:
|
|
if (side == 1)
|
|
return variation.iconTop;
|
|
else if (side == 0)
|
|
return variation.iconBot;
|
|
else
|
|
return variation.icon;
|
|
case 3:
|
|
return variation.ctm.seams[0].icons[0];
|
|
case 4:
|
|
if (side < 2)
|
|
return variation.iconTop;
|
|
else
|
|
return variation.seamsCtmVert.icons[0];
|
|
case 5:
|
|
if (side < 2)
|
|
return variation.iconTop;
|
|
else
|
|
return variation.seamsCtmVert.icons[0];
|
|
case V9:
|
|
return variation.variations9.icons[4];
|
|
case V4:
|
|
return variation.variations9.icons[0];
|
|
case CTMX:
|
|
return variation.icon;
|
|
}
|
|
|
|
return GeneralClient.getMissingIcon();
|
|
}
|
|
|
|
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
|
|
int metadata = world.getBlockMetadata(x, y, z);
|
|
|
|
if (metadata < 0 || metadata > 15)
|
|
metadata = 0;
|
|
|
|
CarvableVariation variation = map[metadata];
|
|
if (variation == null)
|
|
return GeneralClient.getMissingIcon();
|
|
|
|
switch (variation.kind) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
return getIcon(side, metadata);
|
|
case 3:
|
|
int tex = CTM.getTexture(world, x, y, z, side);
|
|
|
|
int row = tex / 16;
|
|
int col = tex % 16;
|
|
|
|
return variation.ctm.seams[col / 4].icons[col % 4 + row * 4];
|
|
case 4: {
|
|
if (side < 2)
|
|
return variation.iconTop;
|
|
|
|
Block block = world.getBlock(x, y, z);
|
|
boolean topConnected = block.equals(CTM.getBlockOrFacade(world, x, y + 1, z, side)) && metadata == CTM.getBlockOrFacadeMetadata(world, x, y + 1, z, side);
|
|
boolean botConnected = block.equals(CTM.getBlockOrFacade(world, x, y - 1, z, side)) && metadata == CTM.getBlockOrFacadeMetadata(world, x, y - 1, z, side);
|
|
|
|
if (topConnected && botConnected)
|
|
return variation.seamsCtmVert.icons[2];
|
|
if (topConnected && !botConnected)
|
|
return variation.seamsCtmVert.icons[3];
|
|
if (!topConnected && botConnected)
|
|
return variation.seamsCtmVert.icons[1];
|
|
return variation.seamsCtmVert.icons[0];
|
|
}
|
|
case 5:
|
|
if (side < 2)
|
|
return variation.iconTop;
|
|
|
|
Block block = CTM.getBlockOrFacade(world, x, y, z, side);
|
|
|
|
boolean p;
|
|
boolean n;
|
|
boolean reverse = side == 2 || side == 4;
|
|
|
|
if (side < 4) {
|
|
p = isSame(world, x - 1, y, z, block, metadata, side);
|
|
n = isSame(world, x + 1, y, z, block, metadata, side);
|
|
} else {
|
|
p = isSame(world, x, y, z + 1, block, metadata, side);
|
|
n = isSame(world, x, y, z - 1, block, metadata, side);
|
|
}
|
|
|
|
if (p && n)
|
|
return variation.seamsCtmVert.icons[1];
|
|
else if (p)
|
|
return variation.seamsCtmVert.icons[reverse ? 2 : 3];
|
|
else if (n)
|
|
return variation.seamsCtmVert.icons[reverse ? 3 : 2];
|
|
return variation.seamsCtmVert.icons[0];
|
|
case V9:
|
|
case V4:
|
|
int index = x + y * 606731 + z * 571163 + side * 555491;
|
|
if (index < 0)
|
|
index = -index;
|
|
|
|
return variation.variations9.icons[index % ((variation.kind == V9) ? 9 : 4)];
|
|
case CTMX:
|
|
return variation.icon;
|
|
}
|
|
|
|
return GeneralClient.getMissingIcon();
|
|
}
|
|
|
|
public void register(Block block, String name) {
|
|
register(block, name, ItemCarvable.class);
|
|
}
|
|
|
|
public void registerBlock(Block block, String name) {
|
|
registerBlock(block, name, ItemCarvable.class);
|
|
}
|
|
|
|
void registerBlock(Block block, String name, Class<? extends ItemCarvable> cl) {
|
|
block.setBlockName(name);
|
|
GameRegistry.registerBlock(block, cl, name);
|
|
chiselBlocks.add(block);
|
|
}
|
|
|
|
public void register(Block block, String name, Class<? extends ItemCarvable> cl) {
|
|
registerBlock(block, name, cl);
|
|
|
|
if (block instanceof BlockMarbleSlab) {
|
|
BlockMarbleSlab slab = (BlockMarbleSlab) block;
|
|
}
|
|
|
|
for (CarvableVariation variation : variations) {
|
|
registerVariation(name, variation, block, variation.metadata);
|
|
|
|
if (block instanceof BlockMarbleSlab && ((BlockMarbleSlab) block).isBottom) {
|
|
BlockMarbleSlab slab = (BlockMarbleSlab) block;
|
|
|
|
if (!forbidChiseling) {
|
|
Carving.chisel.addVariation(name + ".top", slab.top, variation.metadata, 0);
|
|
Carving.chisel.setGroupClass(name + ".top", name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void registerVariation(String name, CarvableVariation variation, Block block, int blockMeta) {
|
|
if (forbidChiseling)
|
|
return;
|
|
|
|
if (variation.block == null) {
|
|
Carving.chisel.addVariation(name, block, blockMeta, variation.metadata);
|
|
} else {
|
|
Carving.chisel.addVariation(name, variation.block, variation.blockMeta, variation.metadata);
|
|
}
|
|
}
|
|
|
|
public void registerBlockIcons(String modName, Block block, IIconRegister register) {
|
|
for (CarvableVariation variation : variations) {
|
|
if (variation.block != null) {
|
|
variation.block.registerBlockIcons(register);
|
|
|
|
if (variation.block instanceof BlockPane) {
|
|
variation.icon = variation.block.getBlockTextureFromSide(2);
|
|
variation.iconTop = ((BlockPane) variation.block).getBlockTextureFromSide(0);
|
|
variation.iconBot = ((BlockPane) variation.block).getBlockTextureFromSide(0);
|
|
|
|
} else {
|
|
switch (variation.kind) {
|
|
case 0:
|
|
variation.icon = variation.block.getIcon(2, variation.blockMeta);
|
|
break;
|
|
case 1:
|
|
variation.icon = variation.block.getIcon(2, variation.blockMeta);
|
|
variation.iconTop = variation.block.getIcon(0, variation.blockMeta);
|
|
break;
|
|
case 2:
|
|
variation.icon = variation.block.getIcon(2, variation.blockMeta);
|
|
variation.iconTop = variation.block.getIcon(1, variation.blockMeta);
|
|
variation.iconBot = variation.block.getIcon(0, variation.blockMeta);
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
switch (variation.kind) {
|
|
case 0:
|
|
variation.icon = register.registerIcon(modName + ":" + variation.texture);
|
|
break;
|
|
case 1:
|
|
variation.icon = register.registerIcon(modName + ":" + variation.texture + "-side");
|
|
variation.iconTop = register.registerIcon(modName + ":" + variation.texture + "-top");
|
|
break;
|
|
case 2:
|
|
variation.icon = register.registerIcon(modName + ":" + variation.texture + "-side");
|
|
variation.iconTop = register.registerIcon(modName + ":" + variation.texture + "-top");
|
|
variation.iconBot = register.registerIcon(modName + ":" + variation.texture + "-bottom");
|
|
break;
|
|
case 3:
|
|
CarvableVariationCTM ctm = new CarvableVariationCTM();
|
|
ctm.seams[0] = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctm1"), 4, 4);
|
|
ctm.seams[1] = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctm2"), 4, 4);
|
|
ctm.seams[2] = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctm3"), 4, 4);
|
|
variation.ctm = ctm;
|
|
break;
|
|
case 4:
|
|
variation.seamsCtmVert = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctmv"), 2, 2);
|
|
variation.iconTop = register.registerIcon(modName + ":" + variation.texture + "-top");
|
|
break;
|
|
case 5:
|
|
variation.seamsCtmVert = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctmh"), 2, 2);
|
|
variation.iconTop = register.registerIcon(modName + ":" + variation.texture + "-top");
|
|
break;
|
|
case V9:
|
|
variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-v9"), 3, 3);
|
|
break;
|
|
case V4:
|
|
variation.variations9 = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-v4"), 2, 2);
|
|
break;
|
|
case CTMX:
|
|
variation.icon = register.registerIcon(modName + ":" + variation.texture);
|
|
variation.submap = new TextureSubmap(register.registerIcon(modName + ":" + variation.texture + "-ctm"), 4, 4);
|
|
variation.submapSmall = new TextureSubmap(variation.icon, 2, 2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void registerSubBlocks(Block block, CreativeTabs tabs, List<ItemStack> list) {
|
|
for (CarvableVariation variation : variations) {
|
|
list.add(new ItemStack(block, 1, variation.metadata));
|
|
}
|
|
}
|
|
|
|
private boolean isSame(IBlockAccess world, int x, int y, int z, Block block, int meta, int side) {
|
|
return CTM.getBlockOrFacade(world, x, y, z, side).equals(block) && CTM.getBlockOrFacadeMetadata(world, x, y, z, side) == meta;
|
|
}
|
|
|
|
public void setChiselBlockName(String name) {
|
|
blockName = name;
|
|
}
|
|
|
|
public static Set<Block> getChiselBlockSet() {
|
|
HashSet<Block> tools = new HashSet<Block>();
|
|
tools.addAll(CarvableHelper.chiselBlocks);
|
|
return tools;
|
|
}
|
|
}
|