Skip to content

Commit 7a7a553

Browse files
committed
新的粗矿系统,允许更好的自定义纹理
以及不会再被cot的meta困住了(
1 parent 23de549 commit 7a7a553

File tree

16 files changed

+645
-19
lines changed

16 files changed

+645
-19
lines changed

src/main/java/github/kasuminova/novaeng/NovaEngineeringCore.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import github.kasuminova.novaeng.common.network.packetprofiler.PktCProfilerReply;
2828
import github.kasuminova.novaeng.common.network.packetprofiler.PktCProfilerRequest;
2929
import github.kasuminova.novaeng.common.profiler.SPacketProfiler;
30+
import net.minecraft.util.ResourceLocation;
3031
import net.minecraft.util.text.TextFormatting;
3132
import net.minecraftforge.fml.common.Mod;
3233
import net.minecraftforge.fml.common.SidedProxy;
@@ -78,6 +79,14 @@ public class NovaEngineeringCore {
7879
public static CommonProxy proxy = null;
7980
public static Logger log = LogManager.getLogger(MOD_ID);
8081

82+
public static ResourceLocation getRL(String path){
83+
return new ResourceLocation(MOD_ID,path);
84+
}
85+
86+
public static String getRLStr(String path){
87+
return MOD_ID + ":" + path;
88+
}
89+
8190
static {
8291
if (NovaEngCoreConfig.CLIENT.enableNovaEngTitle) {
8392
Thread thread = new Thread(() -> {

src/main/java/github/kasuminova/novaeng/client/ClientProxy.java

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
import github.kasuminova.novaeng.client.handler.BlockAngelRendererHandler;
1616
import github.kasuminova.novaeng.client.handler.ClientEventHandler;
1717
import github.kasuminova.novaeng.client.handler.HyperNetClientEventHandler;
18+
import github.kasuminova.novaeng.client.model.raw_ore.RawOreModelLoader;
1819
import github.kasuminova.novaeng.client.util.ExJEI;
1920
import github.kasuminova.novaeng.client.util.TitleUtils;
2021
import github.kasuminova.novaeng.common.CommonProxy;
2122
import github.kasuminova.novaeng.common.command.CommandPacketProfiler;
2223
import github.kasuminova.novaeng.common.command.ExportResearchDataToJson;
2324
import github.kasuminova.novaeng.common.config.NovaEngCoreConfig;
25+
import github.kasuminova.novaeng.common.item.ItemRawOre;
2426
import github.kasuminova.novaeng.common.registry.RegistryBlocks;
2527
import github.kasuminova.novaeng.common.registry.RegistryItems;
2628
import github.kasuminova.novaeng.common.tile.TileHyperNetTerminal;
@@ -32,24 +34,46 @@
3234
import github.kasuminova.novaeng.common.tile.machine.GeocentricDrillController;
3335
import github.kasuminova.novaeng.common.tile.machine.SingularityCore;
3436
import hellfirepvp.modularmachinery.common.base.Mods;
37+
import it.unimi.dsi.fastutil.ints.IntArrayList;
38+
import it.unimi.dsi.fastutil.ints.IntList;
39+
import it.unimi.dsi.fastutil.objects.Object2IntMap;
40+
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
41+
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
42+
import net.minecraft.block.Block;
43+
import net.minecraft.block.state.IBlockState;
44+
import net.minecraft.client.Minecraft;
45+
import net.minecraft.client.renderer.block.model.BakedQuad;
46+
import net.minecraft.client.renderer.color.BlockColors;
47+
import net.minecraft.client.renderer.color.ItemColors;
48+
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
3549
import net.minecraft.entity.player.EntityPlayer;
50+
import net.minecraft.item.Item;
51+
import net.minecraft.item.ItemBlock;
52+
import net.minecraft.item.ItemStack;
3653
import net.minecraft.tileentity.TileEntity;
54+
import net.minecraft.util.EnumFacing;
3755
import net.minecraft.util.math.BlockPos;
3856
import net.minecraft.util.math.MathHelper;
3957
import net.minecraft.world.World;
4058
import net.minecraftforge.client.ClientCommandHandler;
4159
import net.minecraftforge.client.event.ModelRegistryEvent;
60+
import net.minecraftforge.client.model.ModelLoaderRegistry;
61+
import net.minecraftforge.client.resource.VanillaResourceType;
4262
import net.minecraftforge.common.MinecraftForge;
4363
import net.minecraftforge.common.config.Config;
4464
import net.minecraftforge.common.config.ConfigManager;
65+
import net.minecraftforge.fml.client.FMLClientHandler;
4566
import net.minecraftforge.fml.client.registry.ClientRegistry;
4667
import net.minecraftforge.fml.common.Loader;
4768
import net.minecraftforge.fml.common.Mod;
4869
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
4970
import net.minecraftforge.fml.relauncher.Side;
71+
import net.minecraftforge.oredict.OreDictionary;
5072
import slimeknights.tconstruct.library.book.TinkerBook;
5173

5274
import javax.annotation.Nullable;
75+
import java.awt.Color;
76+
import java.util.List;
5377

5478
import static github.kasuminova.novaeng.mixin.NovaEngCoreEarlyMixinLoader.checkJavaVersion;
5579
import static github.kasuminova.novaeng.mixin.NovaEngCoreEarlyMixinLoader.isCleanroomLoader;
@@ -58,12 +82,24 @@
5882
@Mod.EventBusSubscriber(Side.CLIENT)
5983
public class ClientProxy extends CommonProxy {
6084

85+
public static List<Item> items = new ObjectArrayList<>();
86+
public static List<Block> blocks = new ObjectArrayList<>();
87+
private static final Object2IntMap<String> colorCache = new Object2IntOpenHashMap<>();
88+
89+
static {
90+
colorCache.defaultReturnValue(-1);
91+
}
92+
93+
public void setColor(String od, int color) {
94+
colorCache.put(od, color);
95+
}
96+
6197
public ClientProxy() {
6298
MinecraftForge.EVENT_BUS.register(this);
6399
}
64100

65101
@Override
66-
public boolean isClient(){
102+
public boolean isClient() {
67103
return true;
68104
}
69105

@@ -74,7 +110,7 @@ public void construction() {
74110
ConfigManager.sync(NovaEngineeringCore.MOD_ID, Config.Type.INSTANCE);
75111

76112
if (NovaEngCoreConfig.javaCheck) {
77-
if (!isCleanroomLoader()){
113+
if (!isCleanroomLoader()) {
78114
checkJavaVersion();
79115
}
80116
}
@@ -116,11 +152,34 @@ public void postInit() {
116152

117153
TitleUtils.setRandomTitle("*PostInit*");
118154

155+
Minecraft mc = Minecraft.getMinecraft();
156+
BlockColors blockColors = mc.getBlockColors();
157+
ItemColors itemColors = mc.getItemColors();
158+
159+
itemColors.registerItemColorHandler((stack, i) -> {
160+
var item = stack.getItem();
161+
if (item instanceof ItemRawOre r) {
162+
return getColorForODFirst(r.getPartOD());
163+
}
164+
if (item instanceof ItemRawOre.BlockRawOre.ItemBLockRawOre r) {
165+
return getColorForODFirst(r.getPartOD());
166+
}
167+
return Color.WHITE.getRGB();
168+
}, items.toArray(new Item[0]));
169+
170+
blockColors.registerBlockColorHandler((state, worldIn, pos, i) -> {
171+
if (state.getBlock() instanceof ItemRawOre.BlockRawOre blockRawOre) {
172+
return getColorForODFirst(blockRawOre.getPartOD());
173+
}
174+
return Color.WHITE.getRGB();
175+
}, blocks.toArray(new Block[0]));
176+
119177
if (Loader.isModLoaded("ic2") && Loader.isModLoaded("randomtweaker")) {
120178
ExJEI.jeiRecipeRegister();
121179
}
122180

123181
TinkerBook.INSTANCE.addTransformer(BookTransformerAppendModifiers.INSTANCE_FALSE);
182+
FMLClientHandler.instance().refreshResources(VanillaResourceType.TEXTURES, VanillaResourceType.MODELS);
124183
}
125184

126185
@Override
@@ -134,6 +193,7 @@ public void loadComplete() {
134193
public void onModelRegister(ModelRegistryEvent event) {
135194
RegistryBlocks.registerBlockModels();
136195
RegistryItems.registerItemModels();
196+
ModelLoaderRegistry.registerLoader(new RawOreModelLoader());
137197
}
138198

139199
@Nullable
@@ -165,4 +225,47 @@ public Object getClientGuiElement(final int ID, final EntityPlayer player, final
165225
};
166226
}
167227

168-
}
228+
public static int getColorForODFirst(String odName) {
229+
var color = colorCache.getInt(odName);
230+
if (color < 0) {
231+
var od = OreDictionary.getOres(odName);
232+
if (!od.isEmpty()) {
233+
var stack = od.get(0);
234+
var item = stack.getItem();
235+
color = getColorForItemStack(od.get(0)).getRGB();
236+
} else {
237+
color = Color.WHITE.getRGB();
238+
}
239+
colorCache.put(odName, color);
240+
}
241+
return color;
242+
}
243+
244+
public static Color getColorForItemStack(ItemStack stack) {
245+
try {
246+
TextureAtlasSprite sprite;
247+
if (stack.getItem() instanceof ItemBlock) {
248+
Minecraft mc = Minecraft.getMinecraft();
249+
IBlockState state = ((ItemBlock) stack.getItem()).getBlock().getStateForPlacement(mc.world,
250+
new BlockPos(0, 0, 0), EnumFacing.UP, 0, 0, 0, stack.getMetadata(), mc.player);
251+
List<BakedQuad> quads = mc.getBlockRendererDispatcher().getModelForState(state).getQuads(state, EnumFacing.NORTH, 0);
252+
if (quads.isEmpty()) return Color.WHITE;
253+
sprite = quads.get(0).getSprite();
254+
} else sprite = Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(stack, null, null)
255+
.getQuads(null, null, 0).get(0).getSprite();
256+
IntList colours = new IntArrayList();
257+
for (int[] rows : sprite.getFrameTextureData(0))
258+
for (int colour : rows) if ((colour & 0xFF) > 0) colours.add(colour);
259+
long r = 0, g = 0, b = 0;
260+
for (int colour : colours) {
261+
r += (colour >> 16) & 0xFF;
262+
g += (colour >> 8) & 0xFF;
263+
b += colour & 0xFF;
264+
}
265+
return new Color((int) r / colours.size(), (int) g / colours.size(), (int) b / colours.size(), 255);
266+
} catch (Exception e) {
267+
return Color.WHITE;
268+
}
269+
}
270+
271+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package github.kasuminova.novaeng.client.model.raw_ore;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableMap;
5+
import github.kasuminova.novaeng.NovaEngineeringCore;
6+
import github.kasuminova.novaeng.client.ClientProxy;
7+
import github.kasuminova.novaeng.common.item.ItemRawOre;
8+
import net.minecraft.client.Minecraft;
9+
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
10+
import net.minecraft.client.resources.IResourceManager;
11+
import net.minecraft.item.Item;
12+
import net.minecraft.util.ResourceLocation;
13+
import net.minecraftforge.client.model.ICustomModelLoader;
14+
import net.minecraftforge.client.model.IModel;
15+
import net.minecraftforge.client.model.ItemLayerModel;
16+
import net.minecraftforge.client.model.ModelLoader;
17+
import net.minecraftforge.client.model.ModelLoaderRegistry;
18+
import org.jetbrains.annotations.NotNull;
19+
20+
public class RawOreModelLoader implements ICustomModelLoader {
21+
22+
final RawOreOverrideList overrideList = new RawOreOverrideList();
23+
24+
@Override
25+
public boolean accepts(ResourceLocation modelLocation) {
26+
if (modelLocation.getNamespace().equals(NovaEngineeringCore.MOD_ID)) {
27+
var path = modelLocation.getPath();
28+
return path.contains("raw_") && !path.endsWith("_block") && !path.endsWith("_ore");
29+
}
30+
return false;
31+
}
32+
33+
@Override
34+
public @NotNull IModel loadModel(@NotNull ResourceLocation location) {
35+
IResourceManager mngr = Minecraft.getMinecraft().getResourceManager();
36+
try {
37+
final boolean isBlock = location.getPath().contains("block");
38+
final String[] split = location.getPath().split("\\.")[0].split("/");
39+
final var s = split[split.length - 1].split("_",
40+
isBlock ? 3 : split[split.length - 1].contains("gem") ? 4 : 3);
41+
final String id = s[s.length - 1];
42+
final ItemRawOre.BlockRawOre block = ItemRawOre.getRawBlock(id);
43+
final ItemRawOre.Type type;
44+
final Item item;
45+
if (block != null) {
46+
if (isBlock) {
47+
type = ItemRawOre.Type.BLOCK;
48+
item = block.getItem();
49+
} else {
50+
ItemRawOre i = ItemRawOre.getRawOre(id);
51+
type = i.getType();
52+
item = i;
53+
}
54+
} else {
55+
return ModelLoaderRegistry.getMissingModel();
56+
}
57+
String name = isBlock ? "blocks/raw_block/" + split[split.length - 1] : "items/raw_ore/" + split[split.length - 1];
58+
try {
59+
mngr.getAllResources(NovaEngineeringCore.getRL("textures/" + name + ".png"));
60+
ModelResourceLocation itemLoc = new ModelResourceLocation(NovaEngineeringCore.getRLStr(name));
61+
ModelLoader.setCustomModelResourceLocation(item, 0, itemLoc);
62+
} catch (Exception e) {
63+
name = type.getDefR();
64+
ClientProxy.items.add(item);
65+
if (isBlock) ClientProxy.blocks.add(block);
66+
}
67+
if (isBlock) {
68+
return ModelLoaderRegistry.getModel(NovaEngineeringCore.getRL("block/raw_block/raw_block")).retexture(ImmutableMap.of("all", NovaEngineeringCore.getRL(name).toString()));
69+
} else {
70+
return new ItemLayerModel(ImmutableList.of(NovaEngineeringCore.getRL(name)), overrideList);
71+
}
72+
} catch (Exception e) {
73+
return ModelLoaderRegistry.getMissingModel();
74+
}
75+
}
76+
77+
@Override
78+
public void onResourceManagerReload(@NotNull IResourceManager resourceManager) {
79+
80+
}
81+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package github.kasuminova.novaeng.client.model.raw_ore;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableMap;
5+
import it.unimi.dsi.fastutil.objects.ObjectLists;
6+
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
7+
import net.minecraft.client.renderer.block.model.BakedQuad;
8+
import net.minecraft.client.renderer.block.model.IBakedModel;
9+
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
10+
import net.minecraft.client.renderer.block.model.ItemOverrideList;
11+
import net.minecraft.entity.EntityLivingBase;
12+
import net.minecraft.item.Item;
13+
import net.minecraft.item.ItemStack;
14+
import net.minecraft.world.World;
15+
import net.minecraftforge.client.model.BakedItemModel;
16+
import net.minecraftforge.common.model.TRSRTransformation;
17+
import org.jetbrains.annotations.NotNull;
18+
19+
import javax.annotation.Nullable;
20+
import javax.vecmath.Vector3f;
21+
import java.util.Map;
22+
23+
/**
24+
* <a href="https://github.com/SmileycorpMC/dynaores/blob/main/src/main/java/net/smileycorp/dynaores/client/OreModelOverrides.java">...</a>
25+
* class incorporates code from this location and retains the original license terms.
26+
*/
27+
public class RawOreOverrideList extends ItemOverrideList {
28+
29+
private final Map<Item, IBakedModel> cache = new Reference2ObjectOpenHashMap<>();
30+
31+
public RawOreOverrideList() {
32+
super(ObjectLists.emptyList());
33+
}
34+
35+
private static ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> itemTransforms() {
36+
TRSRTransformation thirdperson = get(0, 3, 1, 0, 0, 0, 0.55f);
37+
TRSRTransformation firstperson = get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f);
38+
ImmutableMap.Builder<ItemCameraTransforms.TransformType, TRSRTransformation> builder = ImmutableMap.builder();
39+
builder.put(ItemCameraTransforms.TransformType.GROUND, get(0, 2, 0, 0, 0, 0, 0.5f));
40+
builder.put(ItemCameraTransforms.TransformType.HEAD, get(0, 13, 7, 0, 180, 0, 1));
41+
builder.put(ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND, thirdperson);
42+
builder.put(ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND, leftify(thirdperson));
43+
builder.put(ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND, firstperson);
44+
builder.put(ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND, leftify(firstperson));
45+
return builder.build();
46+
}
47+
48+
private static final TRSRTransformation flipX = new TRSRTransformation(null, null, new Vector3f(-1, 1, 1), null);
49+
50+
private static TRSRTransformation leftify(TRSRTransformation transform) {
51+
return TRSRTransformation.blockCenterToCorner(
52+
flipX.compose(TRSRTransformation.blockCornerToCenter(transform)).compose(flipX));
53+
}
54+
55+
private static TRSRTransformation get(float tx, float ty, float tz, float ax, float ay, float az, float s) {
56+
return TRSRTransformation.blockCenterToCorner(new TRSRTransformation(
57+
new Vector3f(tx / 16, ty / 16, tz / 16),
58+
TRSRTransformation.quatFromXYZDegrees(new Vector3f(ax, ay, az)), new Vector3f(s, s, s), null));
59+
}
60+
61+
@NotNull
62+
@Override
63+
public IBakedModel handleItemState(@NotNull IBakedModel base, @NotNull ItemStack stack, @Nullable World world, @Nullable EntityLivingBase entity) {
64+
var out = cache.get(stack.getItem());
65+
if (out != null) {
66+
return out;
67+
}
68+
out = new BakedItemModel(
69+
(ImmutableList<BakedQuad>) base.getQuads(null, null, 0),
70+
base.getParticleTexture(),
71+
itemTransforms(),
72+
ItemOverrideList.NONE,
73+
true
74+
);
75+
synchronized (cache) {
76+
cache.put(stack.getItem(), out);
77+
}
78+
return out;
79+
}
80+
81+
}

0 commit comments

Comments
 (0)