Skip to content

Commit c8511b6

Browse files
committed
ok materials work
1 parent 72c02ee commit c8511b6

14 files changed

Lines changed: 192 additions & 55 deletions

File tree

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ may appear very similar, as the base concept of what All the Trims does is simil
1414
_Here be dragons_
1515
- There are a parts of this mod incomplete:
1616
- Item Model Trim Tinting
17+
- I can't figure out how to make this dynamic. If anyone knows how to add a texture to a BakedModel or something, _please_ open a pull request.
18+
- For now, items using simple trim materials are displayed in inventories as not having a trim at all. The tooltip remains, however.
1719
- Simple Armor Trim Templates
1820

1921
### Features:
@@ -23,7 +25,7 @@ _Here be dragons_
2325

2426
#### For those who wish to create custom trims using this mod:
2527
- Once the system is functional, I will be creating a wiki on how to use this system.
26-
- Vanilla Packs for armor trims _should_ still work. I plan to write this system to work in parallel to the vanilla one.
28+
- Vanilla Packs for armor trims _should_ still work.
2729

2830
# Credits
29-
- [Benjamin Norton](https://github.com/Benjamin-Norton) for the original project, All the Trims, of which this is heavily inspired and referenced from.
31+
- [Benjamin Norton](https://github.com/Benjamin-Norton) for their mod All the Trims, of which this is heavily inspired and referenced from.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,36 @@
11
package net.diamonddev.simpletrims;
22

33
import net.diamonddev.simpletrims.data.PaletteEncoderDecoder;
4+
import net.diamonddev.simpletrims.network.SendAssetNamesToPalettePaths;
45
import net.diamonddev.simpletrims.network.SendEncodedPalettes;
56
import net.diamonddev.simpletrims.network.SendQuietReload;
7+
import net.diamonddev.simpletrims.network.SendTranslations;
68
import net.fabricmc.api.ClientModInitializer;
79
import net.fabricmc.api.EnvType;
810
import net.fabricmc.api.Environment;
911
import net.minecraft.util.Identifier;
12+
import net.minecraft.util.Language;
1013

1114
import java.util.HashMap;
1215

1316
@Environment(EnvType.CLIENT)
1417
public class SimpleTrimsClient implements ClientModInitializer {
1518

19+
public static HashMap<Identifier, HashMap<String, String>> NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING = new HashMap<>();
20+
public static HashMap<String, String> NETWORKED_ASSETNAME_TO_PATH_HASH = new HashMap<>();
1621
public static HashMap<Identifier, PaletteEncoderDecoder.EncodedPalette> NETWORKED_PALETTES = new HashMap<>();
1722
public static boolean shouldQuietlyReload = false;
1823

1924
@Override
2025
public void onInitializeClient() {
2126
SendEncodedPalettes.registerReceiver();
2227
SendQuietReload.registerReceiver();
28+
SendAssetNamesToPalettePaths.registerReceiver();
29+
SendTranslations.registerReceiver();
30+
}
31+
32+
33+
public static String getMaterialTranslation(Identifier identifier, String langcode, String key) {
34+
return NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING.get(identifier).containsKey(langcode) ? NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING.get(identifier).get(langcode) : NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING.get(identifier).getOrDefault(Language.DEFAULT_LANGUAGE, key);
2335
}
2436
}

src/main/java/net/diamonddev/simpletrims/data/SimpleTrimsDataLoader.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class SimpleTrimsDataLoader implements SimpleSynchronousResourceReloadLis
2323

2424
public static final String ENCODED_PALETTE_CONTAIN_STRING = "simpletrims_encoded_palette";
2525
public static final String NOT_A_TRANSLATION_KEY_LOL = "yeahBroThisIsntATranslationKey";
26-
public static final String REFERABLE_KEY_REGEX_PATTERN = "^[A-Za-z0-9]+\\.[A-Za-z0-9]+\\.simpletrims\\.referable\\.material$";
26+
public static final String REFERABLE_KEY_REGEX_PATTERN = "^[A-Za-z0-9]+\\.[A-Za-z0-9_-]+\\.simpletrims\\.referable\\.material$";
2727

2828
private static final String MATERIAL_PALETTE_FILEPATH = "encodable_palettes";
2929
private static final String MATERIAL_FILEPATH = "simple_trim_material";
@@ -63,7 +63,7 @@ public static class DesciptionBean {
6363
}
6464

6565
@SerializedName(KEY_ENCODED_PALETTE)
66-
public boolean encodedPalette = false;
66+
public boolean encodedPalette = true;
6767

6868
@SerializedName(KEY_ASSET_NAME)
6969
public String assetName = null;
@@ -127,10 +127,6 @@ public HashMap<String, String> getTranslationHashmap() {
127127
return translationHash;
128128
}
129129

130-
public String getTranslation(String langcode) {
131-
return getTranslationHashmap().containsKey(langcode) ? getTranslationHashmap().get(langcode) : getTranslationHashmap().containsKey(Language.DEFAULT_LANGUAGE) ? getTranslationHashmap().get(Language.DEFAULT_LANGUAGE) : getReferrableTranslationKey();
132-
}
133-
134130
public String getNamespace() {
135131
return filepath.getNamespace();
136132
}
@@ -139,6 +135,10 @@ public Identifier getPathToPalette() {
139135
return new Identifier(filepath.getNamespace(), ENCODED_PALETTE_CONTAIN_STRING + "/" + getNamespace() + "/" + getAssetName());
140136
} else return new Identifier(filepath.getNamespace(), "trims/color_palettes/" + getAssetName());
141137
}
138+
139+
public boolean usingTranslationMap() {
140+
return getDescTranslationKey().equals(NOT_A_TRANSLATION_KEY_LOL);
141+
}
142142
}
143143

144144
public static ArrayList<MaterialBeanWrapper> SIMPLE_TRIM_MATERIALS = new ArrayList<>();
@@ -192,7 +192,7 @@ public static String isolateFileName(Identifier resId) {
192192
return split[split.length-1].split("\\.")[0]; // isolates the filename ("namespace:path/to/file.json" -> "file")
193193
}
194194

195-
public static Identifier convertEncodedPaletteLocToPalettedPermutationIdenfier(Identifier loc) {
195+
public static Identifier convertEncodedPaletteLocToPalettedPermutationIdentifier(Identifier loc) {
196196
return new Identifier(loc.getNamespace(), ENCODED_PALETTE_CONTAIN_STRING + "/" + loc.getNamespace() + "/" + isolateFileName(loc));
197197
}
198198
}

src/main/java/net/diamonddev/simpletrims/mixin/ArmorTrimMaterialMixin.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package net.diamonddev.simpletrims.mixin;
22

33
import net.diamonddev.simpletrims.SimpleTrims;
4+
import net.diamonddev.simpletrims.SimpleTrimsClient;
45
import net.diamonddev.simpletrims.data.SimpleTrimsDataLoader;
56
import net.fabricmc.api.EnvType;
67
import net.fabricmc.api.Environment;
78
import net.minecraft.client.MinecraftClient;
89
import net.minecraft.item.trim.ArmorTrimMaterial;
910
import net.minecraft.text.Text;
11+
import net.minecraft.util.Identifier;
1012
import org.spongepowered.asm.mixin.Final;
1113
import org.spongepowered.asm.mixin.Mixin;
1214
import org.spongepowered.asm.mixin.Shadow;
1315
import org.spongepowered.asm.mixin.injection.At;
1416
import org.spongepowered.asm.mixin.injection.Inject;
1517
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1618

19+
import java.util.HashMap;
20+
1721
@Mixin(ArmorTrimMaterial.class)
1822
public class ArmorTrimMaterialMixin {
1923
@Shadow @Final private Text description;
@@ -23,18 +27,20 @@ public class ArmorTrimMaterialMixin {
2327
private void simpletrims$replaceDescriptionWithDataTranslationKeys(CallbackInfoReturnable<Text> cir) {
2428
if (SimpleTrims.testRegex(this.description.getString(), SimpleTrimsDataLoader.REFERABLE_KEY_REGEX_PATTERN)) {
2529
String[] key = this.description.getString().split("\\.");
26-
SimpleTrimsDataLoader.MaterialBeanWrapper bean = null;
27-
for (var tb : SimpleTrimsDataLoader.SIMPLE_TRIM_MATERIALS) {
28-
if (tb.getNamespace().equals(key[0]) && tb.getAssetName().equals(key[1])) {
29-
bean = tb;
30+
Identifier id = null;
31+
HashMap<String, String> langhash = null;
32+
for (var entry : SimpleTrimsClient.NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING.entrySet()) {
33+
if (entry.getKey().getNamespace().matches(key[0]) && entry.getKey().getPath().matches(key[1])) {
34+
id = entry.getKey();
35+
langhash = entry.getValue();
3036
break;
3137
}
3238
}
3339

34-
if (bean == null) {
40+
if (langhash == null) {
3541
cir.setReturnValue(this.description);
3642
} else {
37-
cir.setReturnValue(Text.literal(bean.getTranslation(MinecraftClient.getInstance().options.language)).fillStyle(this.description.getStyle()));
43+
cir.setReturnValue(Text.literal(SimpleTrimsClient.getMaterialTranslation(id, MinecraftClient.getInstance().options.language, this.description.getString())).fillStyle(this.description.getStyle()));
3844
}
3945
}
4046
}

src/main/java/net/diamonddev/simpletrims/mixin/PalettedPermutationsAtlasSourceMixin.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public abstract class PalettedPermutationsAtlasSourceMixin {
3535
if (paletteKey.equals(TRIM_MATERIAL_PALETTE_KEY)) {
3636
HashMap<String, Identifier> mutablePermutations = new HashMap<>(permutations);
3737

38-
for (var bean : SimpleTrimsDataLoader.SIMPLE_TRIM_MATERIALS) {
39-
mutablePermutations.put(bean.getAssetName(), bean.getPathToPalette());
38+
for (var entry : SimpleTrimsClient.NETWORKED_ASSETNAME_TO_PATH_HASH.entrySet()) {
39+
mutablePermutations.put(entry.getKey(), new Identifier(entry.getValue()));
4040
}
4141

4242
this.permutations = Collections.unmodifiableMap(mutablePermutations);
@@ -45,7 +45,9 @@ public abstract class PalettedPermutationsAtlasSourceMixin {
4545

4646
@Inject(method = "method_48486", at = @At("HEAD"), cancellable = true)
4747
private static void simpletrims$overrideLoadingLocationForEncodedPaletteResources(ResourceManager resourceManager, Identifier identifier, CallbackInfoReturnable<int[]> cir) {
48+
4849
if (identifier.getPath().contains(SimpleTrimsDataLoader.ENCODED_PALETTE_CONTAIN_STRING)) {
50+
4951
PaletteEncoderDecoder.EncodedPalette palette = SimpleTrimsClient.NETWORKED_PALETTES.get(identifier);
5052
try (NativeImage image = PaletteEncoderDecoder.openDecode(palette)) {
5153
int[] colors = image.copyPixelsRgba();
Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,69 @@
11
package net.diamonddev.simpletrims.mixin;
22

3+
import net.diamonddev.simpletrims.SimpleTrims;
34
import net.diamonddev.simpletrims.data.PaletteEncoderDecoder;
45
import net.diamonddev.simpletrims.data.SimpleTrimsDataLoader;
6+
import net.diamonddev.simpletrims.network.SendAssetNamesToPalettePaths;
57
import net.diamonddev.simpletrims.network.SendEncodedPalettes;
68
import net.diamonddev.simpletrims.network.SendQuietReload;
9+
import net.diamonddev.simpletrims.network.SendTranslations;
710
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
811
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
912
import net.minecraft.network.ClientConnection;
1013
import net.minecraft.network.PacketByteBuf;
11-
import net.minecraft.server.MinecraftServer;
1214
import net.minecraft.server.PlayerManager;
1315
import net.minecraft.server.network.ServerPlayerEntity;
14-
import org.spongepowered.asm.mixin.Final;
16+
import net.minecraft.util.Identifier;
1517
import org.spongepowered.asm.mixin.Mixin;
16-
import org.spongepowered.asm.mixin.Shadow;
1718
import org.spongepowered.asm.mixin.injection.At;
1819
import org.spongepowered.asm.mixin.injection.Inject;
1920
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2021

22+
import java.util.HashMap;
23+
2124
@Mixin(PlayerManager.class)
2225
public class PlayerManagerMixin {
23-
@Shadow @Final private MinecraftServer server;
2426

2527
@Inject(method = "onPlayerConnect", at = @At("TAIL"))
2628
private void simpletrims$onPlayerConnectToServer(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) {
29+
String playername = player.getGameProfile().getName();
30+
31+
// Asset Names to Palette Paths
32+
HashMap<String, String> assetsToPaths = new HashMap<>();
33+
for (var bean : SimpleTrimsDataLoader.SIMPLE_TRIM_MATERIALS) {
34+
assetsToPaths.put(bean.getAssetName(), bean.getPathToPalette().toString());
35+
}
36+
SimpleTrims.LOGGER.info("Sending user {} Material Asset-to-Path hashmap.. [Size: {}]", playername, assetsToPaths.size());
37+
ServerPlayNetworking.send(player, SendAssetNamesToPalettePaths.SEND_ASSETS, SendAssetNamesToPalettePaths.write(assetsToPaths));
38+
39+
// Encoded Palettes
2740
PacketByteBuf[] bufs = SendEncodedPalettes.write(SimpleTrimsDataLoader.ENCODED_PALETTES.toArray(new PaletteEncoderDecoder.EncodedPalette[0]));
41+
SimpleTrims.LOGGER.info("Sending user {} {} packet(s) of EncodedPalettes.. [{} total palette(s)]", playername, bufs.length, SimpleTrimsDataLoader.ENCODED_PALETTES.size());
2842
for (var buf : bufs) {
2943
ServerPlayNetworking.send(player, SendEncodedPalettes.SEND_ENCODED_PALETTES, buf);
3044
}
3145

32-
ServerPlayNetworking.send(player, SendQuietReload.SEND_QUIET_RELOAD, PacketByteBufs.create());
46+
// Translations
47+
HashMap<Identifier, HashMap<String, String>> translations = new HashMap<>();
48+
int translationCount = 0, materialCount = 0;
49+
for (var bean : SimpleTrimsDataLoader.SIMPLE_TRIM_MATERIALS) {
50+
if (bean.usingTranslationMap()) {
51+
var hash = bean.getTranslationHashmap();
52+
var id = new Identifier(bean.getNamespace(), bean.getAssetName());
53+
translations.put(id, hash);
54+
materialCount += 1;
55+
translationCount += hash.size();
56+
}
57+
}
58+
SimpleTrims.LOGGER.info("Sending user {} {} translations for {} materials..", playername, translationCount, materialCount);
59+
ServerPlayNetworking.send(player, SendTranslations.SEND_TRANSLATIONS, SendTranslations.write(translations));
60+
61+
// Quiet Reload Request
62+
SimpleTrims.LOGGER.info("Telling user {}'s client to quietly reload..", playername);
63+
ServerPlayNetworking.send(player, SendQuietReload.SEND_QUIET_RELOAD, PacketByteBufs.empty());
64+
65+
66+
// finish
67+
SimpleTrims.LOGGER.info("Sent {} all necessary packets!", playername);
3368
}
3469
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package net.diamonddev.simpletrims.network;
2+
3+
import net.diamonddev.simpletrims.SimpleTrims;
4+
import net.diamonddev.simpletrims.SimpleTrimsClient;
5+
import net.diamonddev.simpletrims.data.PaletteEncoderDecoder;
6+
import net.diamonddev.simpletrims.data.SimpleTrimsDataLoader;
7+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
8+
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
9+
import net.minecraft.network.PacketByteBuf;
10+
import net.minecraft.util.Identifier;
11+
12+
import java.util.ArrayList;
13+
import java.util.HashMap;
14+
15+
public class SendAssetNamesToPalettePaths {
16+
public static Identifier SEND_ASSETS = SimpleTrims.id("net_send_assets");
17+
18+
public static PacketByteBuf write(HashMap<String, String> hash) {
19+
PacketByteBuf buf = PacketByteBufs.create();
20+
buf.writeInt(hash.size());
21+
hash.forEach((asset, path) -> {
22+
buf.writeString(asset);
23+
buf.writeString(path);
24+
});
25+
return buf;
26+
}
27+
28+
public static HashMap<String, String> read(PacketByteBuf buf) {
29+
HashMap<String, String> hash = new HashMap<>();
30+
int size = buf.readInt();
31+
while (size > 0) {
32+
String asset = buf.readString();
33+
String path = buf.readString();
34+
hash.put(asset, path);
35+
size--;
36+
}
37+
return hash;
38+
}
39+
40+
public static void registerReceiver() {
41+
ClientPlayNetworking.registerGlobalReceiver(SEND_ASSETS, (client, handler, buf, responseSender) -> {
42+
SimpleTrimsClient.NETWORKED_ASSETNAME_TO_PATH_HASH = read(buf);
43+
SimpleTrims.LOGGER.info("Received a packet containing {} Assets-to-Paths from the server", SimpleTrimsClient.NETWORKED_ASSETNAME_TO_PATH_HASH.size());
44+
});
45+
}
46+
}

src/main/java/net/diamonddev/simpletrims/network/SendEncodedPalettes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public static void registerReceiver() {
7373
SimpleTrims.LOGGER.info("Received a packet containing {} Encoded Palettes from the server", palettes.length);
7474

7575
for (var palette : palettes) {
76-
Identifier id = SimpleTrimsDataLoader.convertEncodedPaletteLocToPalettedPermutationIdenfier(palette.loc);
76+
Identifier id = SimpleTrimsDataLoader.convertEncodedPaletteLocToPalettedPermutationIdentifier(palette.loc);
7777
SimpleTrimsClient.NETWORKED_PALETTES.put(id, palette);
7878
}
7979
});

src/main/java/net/diamonddev/simpletrims/network/SendQuietReload.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class SendQuietReload {
1313

1414
public static void registerReceiver() {
1515
ClientPlayNetworking.registerGlobalReceiver(SEND_QUIET_RELOAD, (client, handler, buf, responseSender) -> {
16+
SimpleTrims.LOGGER.info("Received request to quietly reload resources from server");
1617
quietlyReload(client);
1718
});
1819
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package net.diamonddev.simpletrims.network;
2+
3+
import net.diamonddev.simpletrims.SimpleTrims;
4+
import net.diamonddev.simpletrims.SimpleTrimsClient;
5+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
6+
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
7+
import net.minecraft.network.PacketByteBuf;
8+
import net.minecraft.util.Identifier;
9+
10+
import java.util.HashMap;
11+
12+
public class SendTranslations {
13+
public static Identifier SEND_TRANSLATIONS = SimpleTrims.id("net_send_translations");
14+
15+
public static PacketByteBuf write(HashMap<Identifier, HashMap<String, String>> hash) {
16+
PacketByteBuf buf = PacketByteBufs.create();
17+
18+
buf.writeInt(hash.size()); // size
19+
for (var entry : hash.entrySet()) {
20+
buf.writeIdentifier(entry.getKey()); // write identifier of material
21+
writeSingle(buf, entry.getValue()); // write translations
22+
}
23+
24+
return buf;
25+
}
26+
public static HashMap<Identifier, HashMap<String, String>> read(PacketByteBuf buf) {
27+
HashMap<Identifier, HashMap<String, String>> hash = new HashMap<>();
28+
29+
int size = buf.readInt();
30+
while (size > 0) {
31+
Identifier mat = buf.readIdentifier();
32+
HashMap<String, String> translations = readSingle(buf);
33+
hash.put(mat, translations);
34+
size--;
35+
}
36+
37+
return hash;
38+
}
39+
40+
public static void writeSingle(PacketByteBuf buf, HashMap<String, String> hash) {
41+
buf.writeInt(hash.size());
42+
hash.forEach((lang, str) -> {
43+
buf.writeString(lang);
44+
buf.writeString(str);
45+
});
46+
}
47+
public static HashMap<String, String> readSingle(PacketByteBuf buf) {
48+
HashMap<String, String> hash = new HashMap<>();
49+
int size = buf.readInt();
50+
while (size > 0) {
51+
String lang = buf.readString();
52+
String str = buf.readString();
53+
hash.put(lang, str);
54+
size--;
55+
}
56+
return hash;
57+
}
58+
59+
public static void registerReceiver() {
60+
ClientPlayNetworking.registerGlobalReceiver(SEND_TRANSLATIONS, (client, handler, buf, responseSender) -> {
61+
SimpleTrimsClient.NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING = read(buf);
62+
SimpleTrims.LOGGER.info("Received {} material translations from server", SimpleTrimsClient.NETWORKED_MATERIAL_TRANSLATION_CODE_TO_STRING.values().size());
63+
});
64+
}
65+
}

0 commit comments

Comments
 (0)