Skip to content

Commit 644c0da

Browse files
committed
Selected highlight & click, keybind, better toast, remember shard
1 parent 37b2f70 commit 644c0da

File tree

16 files changed

+186
-143
lines changed

16 files changed

+186
-143
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ authors=Falkreon, acikek
1717
contributors=Trudle, Tomate0613, afamiliarquiet, FoundationGames, TheEpicBlock, hama
1818
license=MIT
1919
# Mod Version
20-
baseVersion=1.7.2
20+
baseVersion=1.8.0
2121
# Branch Metadata
2222
branch=1.21
2323
tagBranch=1.21

src/main/java/net/modfest/scatteredshards/block/ShardBlock.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ protected ActionResult onUse(BlockState state, World world, BlockPos pos, Player
102102
if (tryCollect(world, player, be)) {
103103
return ActionResult.SUCCESS;
104104
}
105-
player.sendMessage(Text.translatable("block.scattered_shards.shard_block.pickup_fail"), true);
106105
return ActionResult.FAIL;
107106
}
108107

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

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package net.modfest.scatteredshards.client;
22

33
import net.fabricmc.api.ClientModInitializer;
4+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
5+
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
46
import net.minecraft.client.MinecraftClient;
7+
import net.minecraft.client.option.KeyBinding;
58
import net.minecraft.client.sound.PositionedSoundInstance;
69
import net.minecraft.client.toast.SystemToast;
710
import net.minecraft.client.toast.Toast;
@@ -19,17 +22,26 @@
1922
import net.modfest.scatteredshards.networking.ScatteredShardsNetworking;
2023

2124
public class ScatteredShardsClient implements ClientModInitializer {
22-
public static final String SHARD_MODIFY_TOAST_KEY = "toast.scattered_shards.shard_mod";
25+
public static final KeyBinding VIEW_COLLECTION = KeyBindingHelper.registerKeyBinding(new KeyBinding(
26+
"key.scattered_shards.collection",
27+
InputUtil.GLFW_KEY_J,
28+
"key.categories.scattered_shards"
29+
));
2330

2431
@Override
2532
public void onInitializeClient() {
2633
ClientShardCommand.register();
2734
ScatteredShardsNetworking.registerClient();
2835
ScatteredShardsContent.registerClient();
2936
ScatteredShardsAPI.initClient();
37+
ClientTickEvents.END_CLIENT_TICK.register(c -> {
38+
if (VIEW_COLLECTION.wasPressed()) {
39+
openShardTablet();
40+
}
41+
});
3042
}
3143

32-
public static void triggerShardCollectAnimation(Identifier shardId) {
44+
public static void onShardCollected(Identifier shardId) {
3345
var library = ScatteredShardsAPI.getClientLibrary();
3446
var collection = ScatteredShardsAPI.getClientCollection();
3547

@@ -39,6 +51,9 @@ public static void triggerShardCollectAnimation(Identifier shardId) {
3951
return;
4052
}
4153

54+
ShardTabletGuiDescription.INITIAL_SHARD = shardId;
55+
ShardTabletGuiDescription.INITIAL_SCROLL_POSITION = -1;
56+
4257
collection.add(shardId);
4358
ScatteredShards.LOGGER.info("Collected shard '{}'!", shardId.toString());
4459

@@ -47,15 +62,15 @@ public static void triggerShardCollectAnimation(Identifier shardId) {
4762
.flatMap(ShardType::collectSound)
4863
.ifPresent((sound) -> MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(sound, 1.0F, 0.8F)));
4964

50-
Toast toast = new ShardToast(shard);
65+
Toast toast = new ShardCollectedToast(shard);
5166
MinecraftClient.getInstance().getToastManager().add(toast);
5267
}
5368

5469
public static void triggerShardModificationToast(Identifier shardId, boolean success) {
5570
var toast = new SystemToast(
5671
SystemToast.Type.PERIODIC_NOTIFICATION,
57-
Text.translatable(SHARD_MODIFY_TOAST_KEY + ".title"),
58-
Text.stringifiedTranslatable(SHARD_MODIFY_TOAST_KEY + "." + (success ? "success" : "fail"), shardId)
72+
Text.translatable("toast.scattered_shards.shard_mod.title"),
73+
Text.stringifiedTranslatable(success ? "toast.scattered_shards.shard_mod.success" : "toast.scattered_shards.shard_mod.success.fail", shardId)
5974
);
6075
MinecraftClient.getInstance().getToastManager().add(toast);
6176
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package net.modfest.scatteredshards.client;
2+
3+
import com.mojang.datafixers.util.Either;
4+
import io.github.cottonmc.cotton.gui.client.ScreenDrawing;
5+
import net.minecraft.client.MinecraftClient;
6+
import net.minecraft.client.font.TextRenderer;
7+
import net.minecraft.client.gui.DrawContext;
8+
import net.minecraft.client.toast.Toast;
9+
import net.minecraft.client.toast.ToastManager;
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.text.OrderedText;
12+
import net.minecraft.text.Text;
13+
import net.minecraft.util.Formatting;
14+
import net.minecraft.util.Identifier;
15+
import net.modfest.scatteredshards.api.ScatteredShardsAPI;
16+
import net.modfest.scatteredshards.api.shard.Shard;
17+
import net.modfest.scatteredshards.api.shard.ShardType;
18+
import net.modfest.scatteredshards.util.ModMetaUtil;
19+
20+
import java.util.ArrayList;
21+
import java.util.List;
22+
23+
public class ShardCollectedToast implements Toast {
24+
public static final int TITLE_COLOR = 0xFF_FFFF00;
25+
public static final Text TITLE = Text.translatable("toast.scattered_shards.collected");
26+
public static final Text HINT = Text.translatable("toast.scattered_shards.collected.prompt", Text.keybind(ScatteredShardsClient.VIEW_COLLECTION.getTranslationKey()).formatted(Formatting.GOLD).formatted(Formatting.BOLD));
27+
private static final Identifier TEXTURE = Identifier.ofVanilla("toast/advancement");
28+
public static final int DURATION = 5000;
29+
30+
Either<ItemStack, Identifier> icon;
31+
List<OrderedText> descLines;
32+
List<OrderedText> hintLines;
33+
private final int height;
34+
35+
public ShardCollectedToast(Shard shard) {
36+
this.icon = shard.icon();
37+
this.descLines = wrap(List.of(shard.name().copy().withColor(ScatteredShardsAPI.getClientLibrary().shardTypes().get(shard.shardTypeId()).orElse(ShardType.MISSING).textColor())));
38+
this.hintLines = wrap(List.of(HINT));
39+
this.height = 32 + Math.max(0, Math.max(this.descLines.size(), this.hintLines.size()) - 1) * 11;
40+
icon.ifRight(ModMetaUtil::touchIconTexture);
41+
}
42+
43+
@Override
44+
public Visibility draw(DrawContext graphics, ToastManager manager, long startTime) {
45+
graphics.drawGuiTexture(TEXTURE, 0, 0, this.getWidth(), this.getHeight());
46+
TextRenderer textRenderer = manager.getClient().textRenderer;
47+
48+
graphics.drawText(
49+
textRenderer,
50+
TITLE, 32, 7, TITLE_COLOR,
51+
false
52+
);
53+
54+
double time = DURATION * manager.getNotificationDisplayTimeMultiplier();
55+
56+
List<OrderedText> body = startTime >= (time / 2) && !hintLines.isEmpty() ? hintLines : descLines;
57+
58+
for (int i = 0; i < body.size(); i++) {
59+
graphics.drawText(textRenderer, body.get(i), 32, 18 + i * 11, 0xFF_FFFFFF, false);
60+
}
61+
62+
icon.ifLeft(it -> graphics.drawItemWithoutEntity(it, 8, 8));
63+
icon.ifRight(it -> ScreenDrawing.texturedRect(graphics, 8, 8, 16, 16, it, 0xFF_FFFFFF));
64+
return startTime >= time ? Toast.Visibility.HIDE : Toast.Visibility.SHOW;
65+
}
66+
67+
private List<OrderedText> wrap(List<Text> messages) {
68+
List<OrderedText> list = new ArrayList<>();
69+
messages.forEach(text -> list.addAll(MinecraftClient.getInstance().textRenderer.wrapLines(text, getWidth() - 40)));
70+
return list;
71+
}
72+
73+
@Override
74+
public int getHeight() {
75+
return height;
76+
}
77+
}

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

Lines changed: 0 additions & 57 deletions
This file was deleted.

src/main/java/net/modfest/scatteredshards/client/command/ClientShardCommand.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,12 @@
2727

2828
public class ClientShardCommand {
2929

30-
private static DynamicCommandExceptionType createInvalidException(String item) {
31-
return new DynamicCommandExceptionType(
32-
obj -> Text.stringifiedTranslatable("error.scattered_shards.invalid_" + item, obj)
33-
);
34-
}
35-
36-
private static final DynamicCommandExceptionType INVALID_SET_ID = createInvalidException("set_id");
37-
private static final DynamicCommandExceptionType INVALID_SHARD_ID = createInvalidException("shard_id");
30+
private static final DynamicCommandExceptionType INVALID_SET_ID = new DynamicCommandExceptionType(
31+
obj -> Text.stringifiedTranslatable("error.scattered_shards.invalid_set_id", obj)
32+
);
33+
private static final DynamicCommandExceptionType INVALID_SHARD_ID = new DynamicCommandExceptionType(
34+
obj -> Text.stringifiedTranslatable("error.scattered_shards.invalid_shard_id", obj)
35+
);
3836

3937
public static int view(CommandContext<FabricClientCommandSource> context) throws CommandSyntaxException {
4038
Identifier id = context.getArgument("set_id", Identifier.class);

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,17 @@
3636
import java.util.Objects;
3737

3838
public class ShardCreatorGuiDescription extends LightweightGuiDescription {
39-
public static final String BASE_KEY = "gui.scattered_shards.creator.";
40-
public static final Text TITLE_TEXT = Text.translatable(BASE_KEY + "title");
41-
public static final Text NAME_TEXT = Text.translatable(BASE_KEY + "field.name");
42-
public static final Text LORE_TEXT = Text.translatable(BASE_KEY + "field.lore");
43-
public static final Text HINT_TEXT = Text.translatable(BASE_KEY + "field.hint");
44-
public static final Text TEXTURE_TEXT = Text.translatable(BASE_KEY + "field.texture");
45-
public static final Text ICON_TEXTURE_TEXT = Text.translatable(BASE_KEY + "icon.texture");
46-
public static final Text ICON_ITEM_TEXT = Text.translatable(BASE_KEY + "icon.item");
47-
public static final Text ITEM_TEXT = Text.translatable(BASE_KEY + "field.item.id");
48-
public static final Text NBT_TEXT = Text.translatable(BASE_KEY + "field.item.nbt");
49-
public static final Text USE_MOD_ICON_TEXT = Text.translatable(BASE_KEY + "toggle.mod_icon");
50-
public static final Text SAVE_TEXT = Text.translatable(BASE_KEY + "button.save");
39+
public static final Text TITLE_TEXT = Text.translatable("gui.scattered_shards.creator.title");
40+
public static final Text NAME_TEXT = Text.translatable("gui.scattered_shards.creator.field.name");
41+
public static final Text LORE_TEXT = Text.translatable("gui.scattered_shards.creator.field.lore");
42+
public static final Text HINT_TEXT = Text.translatable("gui.scattered_shards.creator.field.hint");
43+
public static final Text TEXTURE_TEXT = Text.translatable("gui.scattered_shards.creator.field.texture");
44+
public static final Text ICON_TEXTURE_TEXT = Text.translatable("gui.scattered_shards.creator.icon.texture");
45+
public static final Text ICON_ITEM_TEXT = Text.translatable("gui.scattered_shards.creator.icon.item");
46+
public static final Text ITEM_TEXT = Text.translatable("gui.scattered_shards.creator.field.item.id");
47+
public static final Text NBT_TEXT = Text.translatable("gui.scattered_shards.creator.field.item.nbt");
48+
public static final Text USE_MOD_ICON_TEXT = Text.translatable("gui.scattered_shards.creator.toggle.mod_icon");
49+
public static final Text SAVE_TEXT = Text.translatable("gui.scattered_shards.creator.button.save");
5150

5251
private static final Gson GSON = new Gson();
5352

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.modfest.scatteredshards.api.ShardCollection;
1616
import net.modfest.scatteredshards.api.ShardLibrary;
1717
import net.modfest.scatteredshards.api.shard.Shard;
18+
import net.modfest.scatteredshards.api.shard.ShardType;
1819
import net.modfest.scatteredshards.client.ScatteredShardsClient;
1920
import net.modfest.scatteredshards.client.screen.widget.WLeftRightPanel;
2021
import net.modfest.scatteredshards.client.screen.widget.WShardPanel;
@@ -28,6 +29,9 @@
2829
import java.util.List;
2930

3031
public class ShardTabletGuiDescription extends LightweightGuiDescription {
32+
public static int INITIAL_SCROLL_POSITION = 0;
33+
public static Identifier INITIAL_SHARD = ShardType.MISSING_ID;
34+
3135
protected final ShardCollection collection;
3236
protected final ShardLibrary library;
3337

@@ -39,8 +43,7 @@ public ShardTabletGuiDescription(ShardCollection collection, ShardLibrary librar
3943
this.collection = collection;
4044
this.library = library;
4145

42-
shardPanel.setShard(Shard.MISSING_SHARD);
43-
shardPanel.setHidden(true);
46+
shardPanel.setShard(library.shards().get(INITIAL_SHARD).orElse(Shard.MISSING_SHARD));
4447

4548
List<Identifier> ids = new ArrayList<>(this.library.shardSets().keySet());
4649
ids.sort(Comparator.comparing(Identifier::getNamespace));
@@ -84,6 +87,17 @@ public ShardTabletGuiDescription(ShardCollection collection, ShardLibrary librar
8487
this.setRootPanel(root);
8588

8689
root.validate(this);
90+
91+
if (shardPanel.getShard() == Shard.MISSING_SHARD && INITIAL_SCROLL_POSITION >= 0) { // Only reload scrolling without a selected shard
92+
shardSelector.getScrollBar().setValue(INITIAL_SCROLL_POSITION);
93+
} else if (shardPanel.getShard() != Shard.MISSING_SHARD) { // Try scroll to relevant shard set
94+
for (int i = 0; i < ids.size(); i++) {
95+
if (library.shardSets().get(ids.get(i)).contains(INITIAL_SHARD)) {
96+
shardSelector.getScrollBar().setValue(i - 3); // 7 rows on screen, so center by -3
97+
break;
98+
}
99+
}
100+
}
87101
}
88102

89103
private int getLayoutWidth(WPanelWithInsets panel) {
@@ -111,5 +125,14 @@ public static class Screen extends CottonClientScreen {
111125
public Screen(ShardCollection collection, ShardLibrary library) {
112126
super(new ShardTabletGuiDescription(collection, library));
113127
}
128+
129+
@Override
130+
public void close() {
131+
if (description instanceof ShardTabletGuiDescription desc) { // Silly, but description has no onClose.
132+
INITIAL_SCROLL_POSITION = desc.shardSelector.getScrollBar().getValue();
133+
INITIAL_SHARD = desc.library.shards().get(desc.shardPanel.getShard()).orElse(ShardType.MISSING_ID);
134+
}
135+
super.close();
136+
}
114137
}
115138
}

src/main/java/net/modfest/scatteredshards/client/screen/widget/WMiniShard.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import io.github.cottonmc.cotton.gui.widget.data.InputResult;
88
import net.fabricmc.api.EnvType;
99
import net.fabricmc.api.Environment;
10+
import net.minecraft.client.MinecraftClient;
1011
import net.minecraft.client.gui.DrawContext;
12+
import net.minecraft.client.sound.PositionedSoundInstance;
13+
import net.minecraft.sound.SoundEvents;
1114
import net.minecraft.text.Text;
1215
import net.minecraft.util.Formatting;
1316
import net.minecraft.util.Identifier;
@@ -17,12 +20,14 @@
1720
import net.modfest.scatteredshards.api.shard.ShardIconOffsets;
1821
import net.modfest.scatteredshards.api.shard.ShardType;
1922
import net.modfest.scatteredshards.client.ScatteredShardsClient;
23+
import net.modfest.scatteredshards.client.screen.ShardTabletGuiDescription;
2024
import net.modfest.scatteredshards.util.ModMetaUtil;
2125

2226
import java.util.function.Consumer;
2327

2428
public class WMiniShard extends WWidget {
2529
private static final Identifier MINI_OUTLINE = ScatteredShards.id("textures/gui/shards/mini_outline.png");
30+
private static final Identifier MINI_OUTLINE_SLIGHT = ScatteredShards.id("textures/gui/shards/mini_outline_slight.png");
2631

2732
protected Shard shard = null;
2833
protected ShardType shardType = null;
@@ -77,8 +82,14 @@ public void paint(DrawContext context, int x, int y, int mouseX, int mouseY) {
7782
ScreenDrawing.texturedRect(context, x - 2, y - 2, 16, 20, MINI_OUTLINE, 0, 0, 1, 1, 0xFF_FFFFFF);
7883

7984
renderTooltip(context, x, y, mouseX, mouseY);
85+
} else if ( // Awful bullshit write real code later
86+
MinecraftClient.getInstance().currentScreen instanceof ShardTabletGuiDescription.Screen stgds
87+
&& stgds.getDescription().getRootPanel() instanceof WLeftRightPanel wlrp
88+
&& wlrp.rightPanel instanceof WShardPanel wsp
89+
&& wsp.getShard() == shard
90+
) {
91+
ScreenDrawing.texturedRect(context, x - 2, y - 2, 16, 20, MINI_OUTLINE_SLIGHT, 0, 0, 1, 1, 0xFF_FFFFFF);
8092
}
81-
8293
}
8394

8495
@Override
@@ -101,6 +112,7 @@ public void addTooltip(TooltipBuilder tooltip) {
101112
@Override
102113
public InputResult onClick(int x, int y, int button) {
103114
if (button == 0) {
115+
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK.value(), 1.0f, 0.25f));
104116
shardConsumer.accept(shard);
105117
return InputResult.PROCESSED;
106118
} else {
@@ -117,9 +129,4 @@ public int getWidth() {
117129
public int getHeight() {
118130
return 16;
119131
}
120-
121-
@Override
122-
public boolean canResize() {
123-
return false;
124-
}
125132
}

0 commit comments

Comments
 (0)