Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
104 changes: 73 additions & 31 deletions src/main/java/gregtech/api/unification/material/MaterialIconSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,92 @@
import stanhebben.zenscript.annotations.ZenGetter;
import stanhebben.zenscript.annotations.ZenMethod;

import java.util.HashMap;
import java.util.Map;

@ZenClass("mods.gregtech.material.MaterialIconSet")
@ZenRegister
public enum MaterialIconSet {

NONE,
METALLIC,
DULL,
MAGNETIC,
QUARTZ,
DIAMOND,
EMERALD,
SHINY,
SHARDS,
ROUGH,
FINE,
SAND,
FLINT,
RUBY,
LAPIS,
FLUID,
GAS,
LIGNITE,
OPAL,
GLASS,
WOOD,
LEAF,
GEM_HORIZONTAL,
GEM_VERTICAL,
PAPER,
NETHERSTAR;
public class MaterialIconSet {

private static int idCounter = 0;

public static final Map<String, MaterialIconSet> ICON_SETS = new HashMap<>();
public static final MaterialIconSet DULL = new MaterialIconSet("dull", null, true);
public static final MaterialIconSet NONE = new MaterialIconSet("none", DULL);
public static final MaterialIconSet METALLIC = new MaterialIconSet("metallic");
public static final MaterialIconSet MAGNETIC = new MaterialIconSet("magnetic", METALLIC);
public static final MaterialIconSet SHINY = new MaterialIconSet("shiny", METALLIC);
public static final MaterialIconSet DIAMOND = new MaterialIconSet("diamond", SHINY);
public static final MaterialIconSet EMERALD = new MaterialIconSet("emerald", DIAMOND);
public static final MaterialIconSet GEM_HORIZONTAL = new MaterialIconSet("gem_horizontal", EMERALD);
public static final MaterialIconSet GEM_VERTICAL = new MaterialIconSet("gem_vertical", EMERALD);
public static final MaterialIconSet RUBY = new MaterialIconSet("ruby", EMERALD);
public static final MaterialIconSet OPAL = new MaterialIconSet("opal", RUBY);
public static final MaterialIconSet GLASS = new MaterialIconSet("glass", RUBY);
public static final MaterialIconSet NETHERSTAR = new MaterialIconSet("netherstar", GLASS);
public static final MaterialIconSet FINE = new MaterialIconSet("fine");
public static final MaterialIconSet ROUGH = new MaterialIconSet("rough", FINE);
public static final MaterialIconSet SAND = new MaterialIconSet("sand", FINE);
public static final MaterialIconSet WOOD = new MaterialIconSet("wood", FINE);
public static final MaterialIconSet FLINT = new MaterialIconSet("flint", ROUGH);
public static final MaterialIconSet LIGNITE = new MaterialIconSet("lignite", ROUGH);
public static final MaterialIconSet QUARTZ = new MaterialIconSet("quartz", ROUGH);
public static final MaterialIconSet CERTUS = new MaterialIconSet("certus", QUARTZ);
public static final MaterialIconSet LAPIS = new MaterialIconSet("lapis", QUARTZ);
public static final MaterialIconSet FLUID = new MaterialIconSet("fluid");
public static final MaterialIconSet GAS = new MaterialIconSet("gas");
public static final MaterialIconSet PAPER = new MaterialIconSet("paper");
public static final MaterialIconSet LEAF = new MaterialIconSet("leaf");
public static final MaterialIconSet SHARDS = new MaterialIconSet("shards");

public final String name;
public final boolean isRootIconSet;
public final MaterialIconSet parent;
protected final int id;

public MaterialIconSet(String name, MaterialIconSet parent, boolean isRootIconSet) {
this.name = name;
this.parent = parent;
this.isRootIconSet = isRootIconSet;
this.id = idCounter++;
ICON_SETS.put(name.toLowerCase(), this);
}

public MaterialIconSet(String name, MaterialIconSet parent) {
this(name, parent, false);
}

public MaterialIconSet(String name) {
this(name, DULL);
}

@ZenGetter("name")
public String getName() {
return name().toLowerCase();
return this.name;
}

@ZenMethod("isRootIconSet")
public boolean isRoot() {
return isRootIconSet;
}

@ZenGetter("parent")
public MaterialIconSet getParent() {
return parent;
}

public int ordinal() {
return this.id;
}

@ZenMethod("get")
public static MaterialIconSet getByName(String name) {
return valueOf(name.toUpperCase());
return ICON_SETS.get(name.toLowerCase());
}

@Override
@ZenMethod
public String toString() {
return super.toString();
return name;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package gregtech.api.unification.material;

import com.google.common.base.CaseFormat;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Table;
import gregtech.api.GTValues;
import gregtech.api.util.GTUtility;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.jetbrains.annotations.NonBlocking;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nonnull;

public enum MaterialIconType {

Expand Down Expand Up @@ -94,6 +102,9 @@ public enum MaterialIconType {

public static final ImmutableMap<String, MaterialIconType> values;

private static final Table<MaterialIconType, MaterialIconSet, ResourceLocation> ITEM_MODEL_CACHE = HashBasedTable.create();
private static final Table<MaterialIconType, MaterialIconSet, ResourceLocation> BLOCK_TEXTURE_CACHE = HashBasedTable.create();

static {
ImmutableMap.Builder<String, MaterialIconType> builder = ImmutableMap.builder();
for (MaterialIconType value : values()) {
Expand All @@ -102,21 +113,43 @@ public enum MaterialIconType {
values = builder.build();
}

public String getFormattedName() {
return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name());
}

/**
* Finds the location of the asset associated with the iconset using its parent as a fallback
*/
public ResourceLocation getIconSetPath(MaterialIconSet iconSet, Table<MaterialIconType, MaterialIconSet, ResourceLocation> cache, String fullPath, String path, String extension) {
if (cache.contains(this, iconSet)) {
return cache.get(this, iconSet);
}

if (!iconSet.isRootIconSet && FMLCommonHandler.instance().getSide().isClient()) {
ResourceLocation fullLocation = new ResourceLocation(GTValues.MODID, String.format(fullPath, iconSet.name, this.getFormattedName(), extension));
if (!GTUtility.doResourcepacksHaveResource(fullLocation)) {
ResourceLocation iconSetPath = getIconSetPath(iconSet.getParent(), cache, fullPath, path, extension);
cache.put(this, iconSet, iconSetPath);
return iconSetPath;
}
}

ResourceLocation iconSetPath = new ResourceLocation(GTValues.MODID, String.format(path, iconSet.name, this.getFormattedName()));
cache.put(this, iconSet, iconSetPath);
return iconSetPath;
}

public ResourceLocation getBlockPath(MaterialIconSet materialIconSet) {
String iconSet = materialIconSet.name().toLowerCase();
String iconType = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name());
return new ResourceLocation(GTValues.MODID, "blocks/material_sets/" + iconSet + "/" + iconType);
return getIconSetPath(materialIconSet, BLOCK_TEXTURE_CACHE, "textures/blocks/material_sets/%s/%s%s", "blocks/material_sets/%s/%s", ".png");
}

public ResourceLocation getItemModelPath(MaterialIconSet materialIconSet) {
String iconSet = materialIconSet.name().toLowerCase();
String iconType = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name());
return new ResourceLocation(GTValues.MODID, "material_sets/" + iconSet + "/" + iconType);
return getIconSetPath(materialIconSet, ITEM_MODEL_CACHE, "models/item/material_sets/%s/%s%s", "material_sets/%s/%s", ".json");
}

public ResourceLocation getItemOverlayPath(MaterialIconSet materialIconSet) {
String iconSet = materialIconSet.name().toLowerCase();
String iconType = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name());
String iconSet = materialIconSet.getName();
String iconType = getFormattedName();
return new ResourceLocation(GTValues.MODID, "material_sets/" + iconSet + "/" + iconType + "_overlay");
}

Expand Down
Loading