Skip to content

Commit f3a3aab

Browse files
authored
Merge pull request #27 from afamiliarquiet/icon-offset
Add data for shard icons and menu colors + improve permissions
2 parents 85bdd36 + 94129ed commit f3a3aab

17 files changed

+240
-46
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package net.modfest.scatteredshards.api;
2+
3+
import com.google.gson.JsonObject;
4+
import com.mojang.serialization.Codec;
5+
import com.mojang.serialization.JsonOps;
6+
import com.mojang.serialization.codecs.RecordCodecBuilder;
7+
import net.minecraft.network.RegistryByteBuf;
8+
import net.minecraft.network.codec.PacketCodec;
9+
import net.minecraft.network.codec.PacketCodecs;
10+
import net.modfest.scatteredshards.api.impl.ColorCodec;
11+
12+
public class ShardDisplaySettings {
13+
// there's one more color in WMiniShard that seems nonstandard but it doesn't appear to matter?
14+
private boolean drawMiniIcons;
15+
private int libraryColor;
16+
private int librarySetNameColor;
17+
private int viewerTopColor;
18+
private int viewerBottomColor;
19+
20+
public static final Codec<ShardDisplaySettings> CODEC = RecordCodecBuilder.create(instance -> instance.group(
21+
Codec.BOOL.fieldOf("draw_mini_icons").forGetter(ShardDisplaySettings::drawMiniIcons),
22+
ColorCodec.CODEC.fieldOf("library_color").forGetter(ShardDisplaySettings::libraryColor),
23+
ColorCodec.CODEC.fieldOf("library_set_name_color").forGetter(ShardDisplaySettings::librarySetNameColor),
24+
ColorCodec.CODEC.fieldOf("viewer_top_color").forGetter(ShardDisplaySettings::viewerTopColor),
25+
ColorCodec.CODEC.fieldOf("viewer_bottom_color").forGetter(ShardDisplaySettings::viewerBottomColor)
26+
).apply(instance, ShardDisplaySettings::new));
27+
28+
public static final PacketCodec<RegistryByteBuf, ShardDisplaySettings> PACKET_CODEC = PacketCodec.tuple(
29+
PacketCodecs.BOOL, ShardDisplaySettings::drawMiniIcons,
30+
PacketCodecs.INTEGER, ShardDisplaySettings::libraryColor,
31+
PacketCodecs.INTEGER, ShardDisplaySettings::librarySetNameColor,
32+
PacketCodecs.INTEGER, ShardDisplaySettings::viewerTopColor,
33+
PacketCodecs.INTEGER, ShardDisplaySettings::viewerBottomColor,
34+
ShardDisplaySettings::new
35+
);
36+
37+
public ShardDisplaySettings() {
38+
this(true, 0x778888, 0xccffcc, 0x777777, 0x555555);
39+
}
40+
41+
public ShardDisplaySettings(boolean drawMiniIcons, int libraryColor, int librarySetNameColor, int viewerTopColor, int viewerBottomColor) {
42+
this.drawMiniIcons = drawMiniIcons;
43+
this.libraryColor = libraryColor;
44+
this.librarySetNameColor = librarySetNameColor;
45+
this.viewerTopColor = viewerTopColor;
46+
this.viewerBottomColor = viewerBottomColor;
47+
}
48+
49+
public static ShardDisplaySettings fromJson(JsonObject obj) {
50+
return CODEC.parse(JsonOps.INSTANCE, obj).result().orElseThrow();
51+
}
52+
53+
public void copyFrom(ShardDisplaySettings other) {
54+
this.drawMiniIcons = other.drawMiniIcons;
55+
this.libraryColor = other.libraryColor;
56+
this.librarySetNameColor = other.librarySetNameColor;
57+
this.viewerTopColor = other.viewerTopColor;
58+
this.viewerBottomColor = other.viewerBottomColor;
59+
}
60+
61+
public boolean drawMiniIcons() {
62+
return drawMiniIcons;
63+
}
64+
65+
public int libraryColor() {
66+
return libraryColor;
67+
}
68+
69+
public int librarySetNameColor() {
70+
return librarySetNameColor;
71+
}
72+
73+
public int viewerTopColor() {
74+
return viewerTopColor;
75+
}
76+
77+
public int viewerBottomColor() {
78+
return viewerBottomColor;
79+
}
80+
}

src/main/java/net/modfest/scatteredshards/api/ShardLibrary.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public interface ShardLibrary {
2525

2626
SetMultimap<Identifier, Identifier> shardSets();
2727

28+
ShardDisplaySettings shardDisplaySettings();
29+
2830
/**
2931
* Removes all Shards, ShardTypes, and ShardSets in this Library.
3032
*/
@@ -53,6 +55,7 @@ public interface ShardLibrary {
5355
}
5456
).cast(),
5557
ShardLibrary::shardSets,
58+
ShardDisplaySettings.PACKET_CODEC, ShardLibrary::shardDisplaySettings,
5659
ShardLibraryImpl::new
5760
);
5861
}

src/main/java/net/modfest/scatteredshards/api/impl/ShardLibraryImpl.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.common.collect.SetMultimap;
55
import net.minecraft.util.Identifier;
66
import net.modfest.scatteredshards.api.MiniRegistry;
7+
import net.modfest.scatteredshards.api.ShardDisplaySettings;
78
import net.modfest.scatteredshards.api.ShardLibrary;
89
import net.modfest.scatteredshards.api.shard.Shard;
910
import net.modfest.scatteredshards.api.shard.ShardType;
@@ -15,6 +16,7 @@ public class ShardLibraryImpl implements ShardLibrary {
1516
private final MiniRegistry<Shard> shards;
1617
private final MiniRegistry<ShardType> shardTypes;
1718
private final SetMultimap<Identifier, Identifier> shardSets;
19+
private final ShardDisplaySettings shardDisplaySettings;
1820

1921
@Override
2022
public void clearAll() {
@@ -24,13 +26,19 @@ public void clearAll() {
2426
}
2527

2628
public ShardLibraryImpl() {
27-
this(new MiniRegistry<>(Shard.CODEC), new MiniRegistry<>(ShardType.CODEC), MultimapBuilder.hashKeys().hashSetValues(3).build());
29+
this(
30+
new MiniRegistry<>(Shard.CODEC),
31+
new MiniRegistry<>(ShardType.CODEC),
32+
MultimapBuilder.hashKeys().hashSetValues(3).build(),
33+
new ShardDisplaySettings()
34+
);
2835
}
2936

30-
public ShardLibraryImpl(MiniRegistry<Shard> shards, MiniRegistry<ShardType> shardTypes, SetMultimap<Identifier, Identifier> shardSets) {
37+
public ShardLibraryImpl(MiniRegistry<Shard> shards, MiniRegistry<ShardType> shardTypes, SetMultimap<Identifier, Identifier> shardSets, ShardDisplaySettings settings) {
3138
this.shards = shards;
3239
this.shardTypes = shardTypes;
3340
this.shardSets = shardSets;
41+
this.shardDisplaySettings = settings;
3442
}
3543

3644
@Override
@@ -48,6 +56,11 @@ public SetMultimap<Identifier, Identifier> shardSets() {
4856
return shardSets;
4957
}
5058

59+
@Override
60+
public ShardDisplaySettings shardDisplaySettings() {
61+
return shardDisplaySettings;
62+
}
63+
5164
@Override
5265
public Stream<Shard> resolveShardSet(Identifier id) {
5366
return shardSets.get(id).stream()
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package net.modfest.scatteredshards.api.shard;
2+
3+
import com.mojang.serialization.Codec;
4+
import com.mojang.serialization.codecs.RecordCodecBuilder;
5+
import net.minecraft.network.RegistryByteBuf;
6+
import net.minecraft.network.codec.PacketCodec;
7+
import net.minecraft.network.codec.PacketCodecs;
8+
9+
import java.util.Optional;
10+
11+
public record ShardIconOffsets(Optional<Offset> normal, Optional<Offset> mini) {
12+
13+
public static final Codec<ShardIconOffsets> CODEC = RecordCodecBuilder.create(instance -> instance.group(
14+
Codec.optionalField("normal", Offset.CODEC, false).forGetter(ShardIconOffsets::normal),
15+
Codec.optionalField("mini", Offset.CODEC, false).forGetter(ShardIconOffsets::mini)
16+
).apply(instance, ShardIconOffsets::new));
17+
18+
public static final PacketCodec<RegistryByteBuf, ShardIconOffsets> PACKET_CODEC = PacketCodec.tuple(
19+
PacketCodecs.optional(Offset.PACKET_CODEC), ShardIconOffsets::normal,
20+
PacketCodecs.optional(Offset.PACKET_CODEC), ShardIconOffsets::mini,
21+
ShardIconOffsets::new
22+
);
23+
24+
public static final ShardIconOffsets DEFAULT = new ShardIconOffsets(Optional.empty(), Optional.empty());
25+
26+
public record Offset(int up, int left) {
27+
28+
public static final Codec<Offset> CODEC = RecordCodecBuilder.create(instance -> instance.group(
29+
Codec.INT.fieldOf("top").forGetter(Offset::up),
30+
Codec.INT.fieldOf("left").forGetter(Offset::left)
31+
).apply(instance, Offset::new));
32+
33+
public static final PacketCodec<RegistryByteBuf, Offset> PACKET_CODEC = PacketCodec.tuple(
34+
PacketCodecs.INTEGER, Offset::up,
35+
PacketCodecs.INTEGER, Offset::left,
36+
Offset::new
37+
);
38+
39+
public static final Offset DEFAULT = new Offset(4, 4);
40+
public static final Offset DEFAULT_MINI = new Offset(2, 2);
41+
42+
public int down() {
43+
// (32 (card) - 16 (icon)) - up
44+
return 16 - up;
45+
}
46+
47+
public int right() {
48+
// (24 (card) - 16 (icon)) - left
49+
return 8 - left;
50+
}
51+
52+
public int miniDown() {
53+
// (16 (card) - 6 (icon)) - up
54+
return 10 - up;
55+
}
56+
57+
public int miniRight() {
58+
// (12 (card) - 6 (icon)) - left
59+
return 6 - left;
60+
}
61+
}
62+
63+
public Offset getNormal() {
64+
return normal.orElse(Offset.DEFAULT);
65+
}
66+
67+
public Offset getMini() {
68+
return mini.orElse(Offset.DEFAULT_MINI);
69+
}
70+
}

src/main/java/net/modfest/scatteredshards/api/shard/ShardType.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@
2020

2121
import java.util.Optional;
2222

23-
public record ShardType(int textColor, int glowColor, Optional<ParticleType<?>> collectParticle, Optional<SoundEvent> collectSound, int listOrder) {
23+
public record ShardType(int textColor, int glowColor, Optional<ShardIconOffsets> offsets, Optional<ParticleType<?>> collectParticle, Optional<SoundEvent> collectSound, int listOrder) {
2424

2525
public static final Codec<ShardType> CODEC = RecordCodecBuilder.create(instance -> instance.group(
2626
ColorCodec.CODEC.fieldOf("text_color").forGetter(ShardType::textColor),
2727
ColorCodec.CODEC.fieldOf("glow_color").forGetter(ShardType::glowColor),
28+
Codec.optionalField("icon_offsets", ShardIconOffsets.CODEC, false).forGetter(ShardType::offsets),
2829
Codec.optionalField("collect_particle", Registries.PARTICLE_TYPE.getCodec(), false).forGetter(ShardType::collectParticle),
2930
Codec.optionalField("collect_sound", SoundEvent.CODEC, false).forGetter(ShardType::collectSound),
3031
Codec.INT.fieldOf("list_order").forGetter(ShardType::listOrder)
@@ -33,6 +34,7 @@ public record ShardType(int textColor, int glowColor, Optional<ParticleType<?>>
3334
public static final PacketCodec<RegistryByteBuf, ShardType> PACKET_CODEC = PacketCodec.tuple(
3435
PacketCodecs.INTEGER, ShardType::textColor,
3536
PacketCodecs.INTEGER, ShardType::glowColor,
37+
PacketCodecs.optional(ShardIconOffsets.PACKET_CODEC), ShardType::offsets,
3638
PacketCodecs.optional(PacketCodecs.registryCodec(Registries.PARTICLE_TYPE.getCodec())), ShardType::collectParticle,
3739
PacketCodecs.optional(SoundEvent.PACKET_CODEC), ShardType::collectSound,
3840
PacketCodecs.INTEGER, ShardType::listOrder,
@@ -43,7 +45,7 @@ public record ShardType(int textColor, int glowColor, Optional<ParticleType<?>>
4345
public static final SoundEvent COLLECT_CHALLENGE_SOUND = SoundEvent.of(ScatteredShards.id("collect_challenge"));
4446
public static final SoundEvent COLLECT_SECRET_SOUND = SoundEvent.of(ScatteredShards.id("collect_secret"));
4547

46-
public static final ShardType MISSING = new ShardType(0xFFFFFF, 0xFF00FF, Optional.empty(), Optional.empty(), -1);
48+
public static final ShardType MISSING = new ShardType(0xFFFFFF, 0xFF00FF, Optional.empty(), Optional.empty(), Optional.empty(), -1);
4749
public static final Identifier MISSING_ID = ScatteredShards.id("missing");
4850

4951
public static Identifier createModId(Identifier shardTypeId, String modId) {
@@ -74,6 +76,10 @@ public static Text getDescription(Identifier id) {
7476
return Text.translatable(id.toTranslationKey("shard_type", "description"));
7577
}
7678

79+
public ShardIconOffsets getOffsets() {
80+
return this.offsets.orElse(ShardIconOffsets.DEFAULT);
81+
}
82+
7783
public NbtCompound toNbt() {
7884
return (NbtCompound) CODEC.encodeStart(NbtOps.INSTANCE, this).result().orElseThrow();
7985
}

src/main/java/net/modfest/scatteredshards/client/ScatteredShardsClient.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,6 @@
1919
import net.modfest.scatteredshards.networking.ScatteredShardsNetworking;
2020

2121
public class ScatteredShardsClient implements ClientModInitializer {
22-
public static final int ICON_Y_OFFSET = 6;
23-
public static final boolean DRAW_MINI_ICONS = false;
24-
public static final int LEFT = 0xFF_3e2d58;
25-
public static final int RIGHT_TOP = 0xFF_441209;
26-
public static final int RIGHT_BOTTOM = 0xFF_1c0906;
27-
2822
public static final String SHARD_MODIFY_TOAST_KEY = "toast.scattered_shards.shard_mod";
2923

3024
@Override

src/main/java/net/modfest/scatteredshards/client/render/ShardBlockEntityRenderer.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
import net.fabricmc.api.EnvType;
44
import net.fabricmc.api.Environment;
55
import net.minecraft.client.MinecraftClient;
6-
import net.minecraft.client.render.Camera;
7-
import net.minecraft.client.render.LightmapTextureManager;
8-
import net.minecraft.client.render.OverlayTexture;
9-
import net.minecraft.client.render.RenderLayer;
10-
import net.minecraft.client.render.VertexConsumer;
11-
import net.minecraft.client.render.VertexConsumerProvider;
6+
import net.minecraft.client.render.*;
127
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
138
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
149
import net.minecraft.client.render.model.json.ModelTransformationMode;
@@ -19,10 +14,10 @@
1914
import net.minecraft.util.math.RotationAxis;
2015
import net.modfest.scatteredshards.ScatteredShards;
2116
import net.modfest.scatteredshards.api.ScatteredShardsAPI;
17+
import net.modfest.scatteredshards.api.shard.ShardIconOffsets;
2218
import net.modfest.scatteredshards.api.shard.Shard;
2319
import net.modfest.scatteredshards.api.shard.ShardType;
2420
import net.modfest.scatteredshards.block.ShardBlockEntity;
25-
import net.modfest.scatteredshards.client.ScatteredShardsClient;
2621
import org.joml.AxisAngle4f;
2722
import org.joml.Quaternionf;
2823
import org.joml.Vector3f;
@@ -168,8 +163,10 @@ public void render(ShardBlockEntity entity, float tickDelta, MatrixStack matrice
168163
float xpx = 1 / 24f * cardWidth;
169164
float ypx = 1 / 32f * cardHeight;
170165

166+
ShardIconOffsets.Offset offset = shardType.getOffsets().getNormal();
167+
171168
shard.icon().ifLeft(stack -> {
172-
matrices.translate(0, ScatteredShardsClient.ICON_Y_OFFSET * ypx, -0.005f); //extra -0.002 here to prevent full-cubes from zfighting the card
169+
matrices.translate((4 - offset.left()) * xpx, (8 - offset.up()) * ypx, -0.005f); //extra -0.002 here to prevent full-cubes from zfighting the card
173170
matrices.scale(-0.38f, 0.38f, 0.001f /*0.6f*/);
174171

175172

@@ -179,28 +176,28 @@ public void render(ShardBlockEntity entity, float tickDelta, MatrixStack matrice
179176
shard.icon().ifRight(texId -> {
180177
VertexConsumer v = vertexConsumers.getBuffer(RenderLayer.getEntityCutout(texId));
181178

182-
v.vertex(matrices.peek().getPositionMatrix(), dl.x + (4 * xpx), dl.y + (12 * ypx), dl.z - 0.002f)
179+
v.vertex(matrices.peek().getPositionMatrix(), dl.x + (offset.right() * xpx), dl.y + (offset.down() * ypx), dl.z - 0.002f)
183180
.color(0xFF_FFFFFF)
184181
.texture(1, 1)
185182
.overlay(overlay)
186183
.light(actualLight)
187184
.normal(matrices.peek(), revNormal.x(), revNormal.y(), revNormal.z());
188185

189-
v.vertex(matrices.peek().getPositionMatrix(), ul.x + (4 * xpx), ul.y - (4 * ypx), ul.z - 0.002f)
186+
v.vertex(matrices.peek().getPositionMatrix(), ul.x + (offset.right() * xpx), ul.y - (offset.up() * ypx), ul.z - 0.002f)
190187
.color(0xFF_FFFFFF)
191188
.texture(1, 0)
192189
.overlay(overlay)
193190
.light(actualLight)
194191
.normal(matrices.peek(), revNormal.x(), revNormal.y(), revNormal.z());
195192

196-
v.vertex(matrices.peek().getPositionMatrix(), ur.x - (4 * xpx), ur.y - (4 * ypx), ur.z - 0.002f)
193+
v.vertex(matrices.peek().getPositionMatrix(), ur.x - (offset.left() * xpx), ur.y - (offset.up() * ypx), ur.z - 0.002f)
197194
.color(0xFF_FFFFFF)
198195
.texture(0, 0)
199196
.overlay(overlay)
200197
.light(actualLight)
201198
.normal(matrices.peek(), revNormal.x(), revNormal.y(), revNormal.z());
202199

203-
v.vertex(matrices.peek().getPositionMatrix(), dr.x - (4 * xpx), dr.y + (12 * ypx), dr.z - 0.002f)
200+
v.vertex(matrices.peek().getPositionMatrix(), dr.x - (offset.left() * xpx), dr.y + (offset.down() * ypx), dr.z - 0.002f)
204201
.color(0xFF_FFFFFF)
205202
.texture(0, 1)
206203
.overlay(overlay)

src/main/java/net/modfest/scatteredshards/client/screen/ShardTabletGuiDescription.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
import io.github.cottonmc.cotton.gui.widget.WListPanel;
77
import io.github.cottonmc.cotton.gui.widget.WPanelWithInsets;
88
import io.github.cottonmc.cotton.gui.widget.WPlainPanel;
9-
import io.github.cottonmc.cotton.gui.widget.WScrollBar;
10-
import io.github.cottonmc.cotton.gui.widget.data.Axis;
119
import io.github.cottonmc.cotton.gui.widget.data.Insets;
1210
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
1311
import net.minecraft.text.Text;
1412
import net.minecraft.util.Colors;
1513
import net.minecraft.util.Identifier;
14+
import net.modfest.scatteredshards.api.ScatteredShardsAPI;
1615
import net.modfest.scatteredshards.api.ShardCollection;
1716
import net.modfest.scatteredshards.api.ShardLibrary;
1817
import net.modfest.scatteredshards.api.shard.Shard;
@@ -102,7 +101,9 @@ private void configurePanel(Identifier setId, WShardSetPanel panel) {
102101

103102
@Override
104103
public void addPainters() {
105-
selectorPanel.setBackgroundPainter(BackgroundPainter.createColorful(ScatteredShardsClient.LEFT));
104+
selectorPanel.setBackgroundPainter(BackgroundPainter.createColorful(
105+
0xFF_000000 | (ScatteredShardsAPI.getClientLibrary().shardDisplaySettings().libraryColor())
106+
));
106107
}
107108

108109
public static class Screen extends CottonClientScreen {

0 commit comments

Comments
 (0)