diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java index 9ebf671a..7285c95a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/TraitDiscovery.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.network.Channel; +import com.minelittlepony.unicopia.network.MsgMarkTraitRead; import com.minelittlepony.unicopia.network.MsgUnlockTraits; import com.minelittlepony.unicopia.util.NbtSerialisable; @@ -48,9 +49,15 @@ public class TraitDiscovery implements NbtSerialisable { pony.setDirty(); } - public void markRead() { - unreadTraits.clear(); - pony.setDirty(); + @Environment(EnvType.CLIENT) + public void markRead(Trait trait) { + Channel.MARK_TRAIT_READ.send(new MsgMarkTraitRead(Set.of(trait))); + } + + public void markRead(Set traits) { + if (unreadTraits.removeAll(traits)) { + pony.setDirty(); + } } public void unlock(Item item) { diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java index 2c74946c..c1113e5e 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java @@ -238,6 +238,8 @@ public class SpellbookScreen extends HandledScreen { .append("\n") .append(new TranslatableText("gui.unicopia.trait.corruption", ItemStack.MODIFIER_FORMAT.format(trait.getGroup().getCorruption())).formatted(Formatting.ITALIC, corruptionColor))) , 200)); + + onClick(sender -> Pony.of(client.player).getDiscoveries().markRead(trait)); } @Override @@ -249,7 +251,14 @@ public class SpellbookScreen extends HandledScreen { RenderSystem.setShaderTexture(0, TEXTURE); RenderSystem.enableBlend(); drawTexture(matrices, x - 2, y - 8, 204, 219, 22, 32, 512, 256); - drawTexture(matrices, x - 2, y - 1, 74, 223, 18, 18, 512, 256); + + if (!active) { + drawTexture(matrices, x - 2, y - 1, 74, 223, 18, 18, 512, 256); + } + + if (discoveries.isUnread(trait)) { + drawTexture(matrices, x - 8, y - 8, 225, 219, 35, 32, 512, 256); + } super.renderButton(matrices, mouseX, mouseY, partialTicks); hovered &= active; diff --git a/src/main/java/com/minelittlepony/unicopia/network/Channel.java b/src/main/java/com/minelittlepony/unicopia/network/Channel.java index e5fab51f..c3efbdaa 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/Channel.java +++ b/src/main/java/com/minelittlepony/unicopia/network/Channel.java @@ -12,6 +12,7 @@ import net.minecraft.util.Identifier; public interface Channel { C2SPacketType> CLIENT_PLAYER_ABILITY = SimpleNetworking.clientToServer(new Identifier("unicopia", "player_ability"), MsgPlayerAbility::new); C2SPacketType CLIENT_REQUEST_SPECIES_CHANGE = SimpleNetworking.clientToServer(new Identifier("unicopia", "request_capabilities"), MsgRequestSpeciesChange::new); + C2SPacketType MARK_TRAIT_READ = SimpleNetworking.clientToServer(new Identifier("unicopia", "mark_trait_read"), MsgMarkTraitRead::new); S2CPacketType SERVER_PLAYER_CAPABILITIES = SimpleNetworking.serverToClient(new Identifier("unicopia", "player_capabilities"), MsgPlayerCapabilities::new); S2CPacketType SERVER_SPAWN_PROJECTILE = SimpleNetworking.serverToClient(new Identifier("unicopia", "projectile_entity"), MsgSpawnProjectile::new); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java b/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java new file mode 100644 index 00000000..9374bdca --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java @@ -0,0 +1,38 @@ +package com.minelittlepony.unicopia.network; + +import java.util.HashSet; +import java.util.Set; + +import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.network.Packet; + +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.network.ServerPlayerEntity; + +public class MsgMarkTraitRead implements Packet { + + public final Set traits = new HashSet<>(); + + MsgMarkTraitRead(PacketByteBuf buffer) { + int length = buffer.readInt(); + for (int i = 0; i < length; i++) { + Trait.fromId(buffer.readIdentifier()).ifPresent(traits::add); + } + } + + public MsgMarkTraitRead(Set traits) { + this.traits.addAll(traits); + } + + @Override + public void toBuffer(PacketByteBuf buffer) { + buffer.writeInt(traits.size()); + traits.forEach(trait -> buffer.writeIdentifier(trait.getId())); + } + + @Override + public void handle(ServerPlayerEntity sender) { + Pony.of(sender).getDiscoveries().markRead(traits); + } +} diff --git a/src/main/resources/assets/unicopia/textures/gui/container/book.png b/src/main/resources/assets/unicopia/textures/gui/container/book.png index f8a73d99..509c651f 100644 Binary files a/src/main/resources/assets/unicopia/textures/gui/container/book.png and b/src/main/resources/assets/unicopia/textures/gui/container/book.png differ