Explorar o código

Save bought upgrades

____tbvns____ hai 5 meses
pai
achega
203c71ac38

+ 32 - 10
src/client/java/xyz/tbvns/rogue_block/client/Gui/UpgradeComponent.java

@@ -6,6 +6,8 @@ import io.wispforest.owo.ui.container.GridLayout;
 import io.wispforest.owo.ui.core.*;
 import io.wispforest.owo.ui.event.MouseEnter;
 import lombok.AllArgsConstructor;
+import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
+import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
 import net.kyori.adventure.platform.fabric.FabricAudiences;
 import net.kyori.adventure.platform.fabric.FabricServerAudiences;
 import net.minecraft.client.gui.DrawContext;
@@ -13,9 +15,11 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.text.OrderedText;
 import net.minecraft.text.Text;
 import net.minecraft.util.Identifier;
+import xyz.tbvns.rogue_block.Packets.registeredPackets.BuyUpgradePacket;
 import xyz.tbvns.rogue_block.Upgrades.Upgrade;
 import xyz.tbvns.rogue_block.Upgrades.UpgradeRarity;
 import xyz.tbvns.rogue_block.Utils;
+import xyz.tbvns.rogue_block.client.Networking.NetworkManager;
 import xyz.tbvns.rogue_block.client.Rogue_blockClient;
 
 import java.util.List;
@@ -24,6 +28,7 @@ public class UpgradeComponent {
     Upgrade upgrade;
     boolean isHovered = false;
     double x, y;
+    public boolean isOwned;
 
     Component textureComponent;
     Component itemComponent;
@@ -37,13 +42,18 @@ public class UpgradeComponent {
     public void add(FlowLayout layout) {
         Component item = Components.item(upgrade.itemDisplay());
         item.positioning().set(Positioning.absolute((int) x, (int) y));
-        Component component = getTextureComponent(upgrade.getRarity().unobtained, item);
 
-        layout.child(component);
-        layout.child(item);
+        if (isOwned) {
+            textureComponent = getTextureComponent(upgrade.getRarity().obtained, item);
+            layout.child(textureComponent);
+        } else {
+            textureComponent = getTextureComponent(upgrade.getRarity().unobtained, item);
+            layout.child(textureComponent);
+        }
 
-        textureComponent = component;
+        layout.child(item);
         itemComponent = item;
+
     }
 
     public void drawLine(DrawContext context) {
@@ -101,13 +111,25 @@ public class UpgradeComponent {
         });
 
         component.mouseDown().subscribe((mouseX, mouseY, button) -> {
-            ParentComponent parentComponent = textureComponent.root();
-            textureComponent.remove();
-            FlowLayout layout = (FlowLayout) parentComponent;
-            textureComponent = getTextureComponent(upgrade.getRarity().obtained, item);
-            layout.child(textureComponent);
-            return true;
+            if (buy()) {
+                ParentComponent parentComponent = textureComponent.root();
+                textureComponent.remove();
+                FlowLayout layout = (FlowLayout) parentComponent;
+                textureComponent = getTextureComponent(upgrade.getRarity().obtained, item);
+                layout.child(textureComponent);
+                return true;
+            }
+            return false;
         });
         return component;
     }
+
+    public boolean buy() {
+        if (NetworkManager.playerData.getPoints() >= upgrade.getCost() && !isOwned) {
+            ClientPlayNetworking.send(new BuyUpgradePacket(upgrade.getId().asString()));
+            isOwned = true;
+            return true;
+        }
+        return false;
+    }
 }

+ 3 - 0
src/client/java/xyz/tbvns/rogue_block/client/Gui/UpgradeScreen.java

@@ -80,8 +80,11 @@ public class UpgradeScreen extends BaseOwoScreen<FlowLayout> {
     public void generateUpgradeComponent(FlowLayout rootComponent) {
         for (Upgrade upgrade : UpgradesManager.registeredUpgrades) {
             UpgradeComponent component = new UpgradeComponent(upgrade);
+            if (NetworkManager.playerData.getUpgrades().contains(upgrade.getClass()))
+                component.isOwned = true;
             component.add(rootComponent);
             components.add(component);
+            System.out.println(NetworkManager.playerData.getUpgrades());
         }
     }
 

+ 3 - 3
src/client/java/xyz/tbvns/rogue_block/client/Networking/NetworkManager.java

@@ -3,14 +3,14 @@ package xyz.tbvns.rogue_block.client.Networking;
 import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
 import xyz.tbvns.rogue_block.Managers.registeredSavable.PlayerData;
 import xyz.tbvns.rogue_block.Packets.PacketManager;
-import xyz.tbvns.rogue_block.Packets.registeredPackets.BytesPacket;
+import xyz.tbvns.rogue_block.Packets.registeredPackets.PlayerDataPacket;
 
 public class NetworkManager {
     public static PlayerData playerData;
     public static void setup() {
-        ClientPlayNetworking.registerGlobalReceiver(BytesPacket.ID, (payload, context) -> {
+        ClientPlayNetworking.registerGlobalReceiver(PlayerDataPacket.PlayerDataPacketID, (payload, context) -> {
             context.client().execute(() -> {
-                BytesPacket packet = (BytesPacket) payload;
+                PlayerDataPacket packet = (PlayerDataPacket) payload;
                 playerData = PacketManager.readPlayerData(packet.getBytes());
             });
         });

+ 0 - 13
src/client/java/xyz/tbvns/rogue_block/client/Rogue_blockClient.java

@@ -1,25 +1,12 @@
 package xyz.tbvns.rogue_block.client;
 
 import net.fabricmc.api.ClientModInitializer;
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents;
 import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
-import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
-import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents;
-import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
-import net.kyori.adventure.audience.Audience;
-import net.kyori.adventure.platform.fabric.FabricAudiences;
 import net.kyori.adventure.platform.fabric.FabricClientAudiences;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.world.CreateWorldScreen;
-import net.minecraft.world.gen.chunk.FlatChunkGenerator;
-import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig;
 import xyz.tbvns.rogue_block.Packets.PacketManager;
-import xyz.tbvns.rogue_block.Packets.registeredPackets.BytesPacket;
 import xyz.tbvns.rogue_block.client.Events.ClientTickEvent;
 import xyz.tbvns.rogue_block.client.Networking.NetworkManager;
 
-import java.util.Arrays;
-
 public class Rogue_blockClient implements ClientModInitializer {
 
     public static final FabricClientAudiences audiences =  FabricClientAudiences.builder().build();

+ 10 - 0
src/main/java/xyz/tbvns/rogue_block/Managers/registeredSavable/PlayerData.java

@@ -25,6 +25,16 @@ public class PlayerData implements Savable {
         return points;
     }
 
+    public void addUpgrade(ServerPlayerEntity entity, Class<? extends Upgrade> upgrade) {
+        upgrades.add(upgrade);
+        syncWithClient(entity);
+    }
+
+    public void removeUpgrade(ServerPlayerEntity entity, Class<? extends Upgrade> upgrade) {
+        upgrades.remove(upgrade);
+        syncWithClient(entity);
+    }
+
     //TODO: replace that with lombok
     public List<Class<? extends Upgrade>> getUpgrades() {
         return upgrades;

+ 37 - 0
src/main/java/xyz/tbvns/rogue_block/Network/ServerNetworkManager.java

@@ -0,0 +1,37 @@
+package xyz.tbvns.rogue_block.Network;
+
+import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import xyz.tbvns.rogue_block.Managers.DataManager;
+import xyz.tbvns.rogue_block.Managers.registeredSavable.PlayerData;
+import xyz.tbvns.rogue_block.Packets.registeredPackets.BuyUpgradePacket;
+import xyz.tbvns.rogue_block.Upgrades.Upgrade;
+import xyz.tbvns.rogue_block.Upgrades.UpgradesManager;
+
+public class ServerNetworkManager {
+    private static final Logger log = LoggerFactory.getLogger(ServerNetworkManager.class);
+
+    public static void setup() {
+        ServerPlayNetworking.registerGlobalReceiver(BuyUpgradePacket.ID, (payload, context) -> {
+            BuyUpgradePacket packet = (BuyUpgradePacket) payload;
+            Upgrade upgrade = UpgradesManager.getUpgradeById(Identifier.of(packet.getUpgrade()));
+            if (upgrade == null) {
+                context.player().networkHandler.disconnect(Text.of("Invalid upgrade"));
+                log.error("Player {} tried to buy an upgrade that doesn't exist !", context.player().getName());
+                return;
+            }
+            PlayerData data = DataManager.getPlayerState(context.player());
+            if (data.getPoints() < upgrade.getCost()) {
+                context.player().networkHandler.disconnect(Text.of("Invalid packet (desync ?)"));
+                log.error("Player {} tried to buy an upgrade without enough money !", context.player().getName());
+                return;
+            }
+            data.addPoints(context.player(), -upgrade.getCost());
+            data.addUpgrade(context.player(), upgrade.getClass());
+            log.info("Player {} bought the upgrade {}.", context.player().getName(), upgrade.getName());
+        });
+    }
+}

+ 2 - 2
src/main/java/xyz/tbvns/rogue_block/Packets/PacketManager.java

@@ -6,7 +6,7 @@ import com.esotericsoftware.kryo.kryo5.io.Output;
 import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
 import net.minecraft.server.network.ServerPlayerEntity;
 import xyz.tbvns.rogue_block.Managers.registeredSavable.PlayerData;
-import xyz.tbvns.rogue_block.Packets.registeredPackets.BytesPacket;
+import xyz.tbvns.rogue_block.Packets.registeredPackets.PlayerDataPacket;
 
 import java.nio.ByteBuffer;
 
@@ -35,7 +35,7 @@ public class PacketManager {
     }
 
     public static void sendUpgradePacket(ServerPlayerEntity entity, PlayerData data) {
-        BytesPacket packet = new BytesPacket(writeUpgradePacket(data).array());
+        PlayerDataPacket packet = new PlayerDataPacket(writeUpgradePacket(data).array());
         entity.server.execute(() -> {
             ServerPlayNetworking.send(entity, packet);
         });

+ 23 - 0
src/main/java/xyz/tbvns/rogue_block/Packets/registeredPackets/BuyUpgradePacket.java

@@ -0,0 +1,23 @@
+package xyz.tbvns.rogue_block.Packets.registeredPackets;
+
+import net.minecraft.network.RegistryByteBuf;
+import net.minecraft.network.codec.PacketCodec;
+import net.minecraft.network.codec.PacketCodecs;
+import net.minecraft.network.packet.CustomPayload;
+import net.minecraft.util.Identifier;
+import xyz.tbvns.rogue_block.Rogue_block;
+
+//TODO: replace that with @Data and @AllArgsConstructor
+public record BuyUpgradePacket(String upgrade) implements CustomPayload {
+    public static final Id ID = new Id<BuyUpgradePacket>(Identifier.of(Rogue_block.MOD_ID, "buy_upgrade"));
+    public static final PacketCodec<RegistryByteBuf, BuyUpgradePacket> CODEC = PacketCodec.tuple(PacketCodecs.STRING, BuyUpgradePacket::getUpgrade, BuyUpgradePacket::new);
+
+    public String getUpgrade() {
+        return upgrade;
+    }
+
+    @Override
+    public Id<? extends CustomPayload> getId() {
+        return new Id<BuyUpgradePacket>(Identifier.of(Rogue_block.MOD_ID, "buy_upgrade"));
+    }
+}

+ 4 - 4
src/main/java/xyz/tbvns/rogue_block/Packets/registeredPackets/BytesPacket.java → src/main/java/xyz/tbvns/rogue_block/Packets/registeredPackets/PlayerDataPacket.java

@@ -8,9 +8,9 @@ import net.minecraft.util.Identifier;
 import xyz.tbvns.rogue_block.Rogue_block;
 
 //TODO: replace that with @Data and @AllArgsConstructor
-public record BytesPacket(byte[] bytes) implements CustomPayload {
-    public static final Id ID = new Id<BytesPacket>(Identifier.of(Rogue_block.MOD_ID, "upgrade_packet"));
-    public static final PacketCodec<RegistryByteBuf, BytesPacket> CODEC = PacketCodec.tuple(PacketCodecs.BYTE_ARRAY, BytesPacket::getBytes, BytesPacket::new);
+public record PlayerDataPacket(byte[] bytes) implements CustomPayload {
+    public static final Id PlayerDataPacketID = new Id<PlayerDataPacket>(Identifier.of(Rogue_block.MOD_ID, "player_data_packet"));
+    public static final PacketCodec<RegistryByteBuf, PlayerDataPacket> CODEC = PacketCodec.tuple(PacketCodecs.BYTE_ARRAY, PlayerDataPacket::getBytes, PlayerDataPacket::new);
 
     public byte[] getBytes() {
         return bytes;
@@ -18,6 +18,6 @@ public record BytesPacket(byte[] bytes) implements CustomPayload {
 
     @Override
     public Id<? extends CustomPayload> getId() {
-        return new Id<BytesPacket>(Identifier.of(Rogue_block.MOD_ID, "upgrade_packet"));
+        return new Id<PlayerDataPacket>(Identifier.of(Rogue_block.MOD_ID, "player_data_packet"));
     }
 }

+ 7 - 3
src/main/java/xyz/tbvns/rogue_block/Rogue_block.java

@@ -1,17 +1,19 @@
 package xyz.tbvns.rogue_block;
 
 import net.fabricmc.api.ModInitializer;
-import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents;
 import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
 import net.fabricmc.fabric.api.event.player.UseBlockCallback;
 import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
 import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
+import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
 import xyz.tbvns.rogue_block.Events.PlayerJoinEvents;
 import xyz.tbvns.rogue_block.Events.PlayerStartButtonEvent;
 import xyz.tbvns.rogue_block.Events.ServerStartEvent;
 import xyz.tbvns.rogue_block.Managers.DataManager;
+import xyz.tbvns.rogue_block.Network.ServerNetworkManager;
 import xyz.tbvns.rogue_block.Packets.PacketManager;
-import xyz.tbvns.rogue_block.Packets.registeredPackets.BytesPacket;
+import xyz.tbvns.rogue_block.Packets.registeredPackets.BuyUpgradePacket;
+import xyz.tbvns.rogue_block.Packets.registeredPackets.PlayerDataPacket;
 import xyz.tbvns.rogue_block.Upgrades.UpgradesManager;
 
 public class Rogue_block implements ModInitializer {
@@ -23,10 +25,12 @@ public class Rogue_block implements ModInitializer {
         UseBlockCallback.EVENT.register(new PlayerStartButtonEvent());
         ServerLifecycleEvents.SERVER_STARTED.register(new ServerStartEvent());
 
-        PayloadTypeRegistry.playS2C().register(BytesPacket.ID, BytesPacket.CODEC);
+        PayloadTypeRegistry.playS2C().register(PlayerDataPacket.PlayerDataPacketID, PlayerDataPacket.CODEC);
+        PayloadTypeRegistry.playC2S().register(BuyUpgradePacket.ID, BuyUpgradePacket.CODEC);
 
         UpgradesManager.loadUpgrades();
         PacketManager.setup();
         DataManager.setup();
+        ServerNetworkManager.setup();
     }
 }

+ 8 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/RegisteredUpgrades/RegenUpgrade.java

@@ -5,9 +5,12 @@ import net.minecraft.entity.effect.StatusEffects;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.Identifier;
 import xyz.tbvns.rogue_block.Upgrades.PassiveUpgrade;
 import xyz.tbvns.rogue_block.Upgrades.UpgradeRarity;
 
+import static xyz.tbvns.rogue_block.Rogue_block.MOD_ID;
+
 public class RegenUpgrade implements PassiveUpgrade {
     @Override
     public int getCost() {
@@ -43,4 +46,9 @@ public class RegenUpgrade implements PassiveUpgrade {
     public UpgradeRarity getRarity() {
         return UpgradeRarity.common;
     }
+
+    @Override
+    public Identifier getId() {
+        return Identifier.of(MOD_ID, "regen");
+    }
 }

+ 9 - 1
src/main/java/xyz/tbvns/rogue_block/Upgrades/RegisteredUpgrades/RegenUpgrade2.java

@@ -5,10 +5,13 @@ import net.minecraft.entity.effect.StatusEffects;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.Identifier;
 import xyz.tbvns.rogue_block.Upgrades.PassiveUpgrade;
 import xyz.tbvns.rogue_block.Upgrades.Upgrade;
 import xyz.tbvns.rogue_block.Upgrades.UpgradeRarity;
 
+import static xyz.tbvns.rogue_block.Rogue_block.MOD_ID;
+
 public class RegenUpgrade2 implements PassiveUpgrade {
     @Override
     public int getCost() {
@@ -17,7 +20,7 @@ public class RegenUpgrade2 implements PassiveUpgrade {
 
     @Override
     public void executeOnStart(ServerPlayerEntity player) {
-        player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, StatusEffectInstance.INFINITE));
+        player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, StatusEffectInstance.INFINITE, 1));
     }
 
     @Override
@@ -49,4 +52,9 @@ public class RegenUpgrade2 implements PassiveUpgrade {
     public Class getParent() {
         return RegenUpgrade.class;
     }
+
+    @Override
+    public Identifier getId() {
+        return Identifier.of(MOD_ID, "regen2");
+    }
 }

+ 9 - 1
src/main/java/xyz/tbvns/rogue_block/Upgrades/RegisteredUpgrades/RegenUpgrade3.java

@@ -5,9 +5,12 @@ import net.minecraft.entity.effect.StatusEffects;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.Identifier;
 import xyz.tbvns.rogue_block.Upgrades.PassiveUpgrade;
 import xyz.tbvns.rogue_block.Upgrades.UpgradeRarity;
 
+import static xyz.tbvns.rogue_block.Rogue_block.MOD_ID;
+
 public class RegenUpgrade3 implements PassiveUpgrade {
     @Override
     public int getCost() {
@@ -16,7 +19,7 @@ public class RegenUpgrade3 implements PassiveUpgrade {
 
     @Override
     public void executeOnStart(ServerPlayerEntity player) {
-        player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, StatusEffectInstance.INFINITE));
+        player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, StatusEffectInstance.INFINITE, 2));
     }
 
     @Override
@@ -48,4 +51,9 @@ public class RegenUpgrade3 implements PassiveUpgrade {
     public Class getParent() {
         return RegenUpgrade.class;
     }
+
+    @Override
+    public Identifier getId() {
+        return Identifier.of(MOD_ID, "regen3");
+    }
 }

+ 6 - 3
src/main/java/xyz/tbvns/rogue_block/Upgrades/Upgrade.java

@@ -11,6 +11,7 @@ import net.minecraft.item.Items;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.text.OrderedText;
 import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
 import xyz.tbvns.rogue_block.Managers.DataManager;
 
 import java.util.ArrayList;
@@ -33,9 +34,7 @@ public interface Upgrade {
         return 0;
     }
 
-    default void onBought(ServerPlayerEntity entity) {
-        DataManager.getPlayerState(entity).getUpgrades().add(this.getClass());
-    }
+    default void onBought(ServerPlayerEntity entity) {}
 
     default UpgradeType getType() {
         return UpgradeType.Passive;
@@ -53,6 +52,10 @@ public interface Upgrade {
         return UpgradeRarity.common;
     }
 
+    default Identifier getId() {
+        return Identifier.of("rogue_block:default");
+    }
+
     default Component generateTooltip() {
         Component component;
 

+ 13 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/UpgradesManager.java

@@ -1,8 +1,10 @@
 package xyz.tbvns.rogue_block.Upgrades;
 
 import lombok.Getter;
+import net.minecraft.util.Identifier;
 import org.reflections.Reflections;
 
+import javax.annotation.Nullable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -35,4 +37,15 @@ public class UpgradesManager {
             throw new RuntimeException();
         }
     }
+    
+    @Nullable
+    public static Upgrade getUpgradeById(Identifier id) {
+        Upgrade upgrade = null;
+        for (Upgrade u : registeredUpgrades) {
+            if (u.getId().equals(id)) {
+                upgrade = u;
+            }
+        }
+        return upgrade;
+    }
 }