Ver código fonte

Start of the upgrade GUI system

____tbvns____ 5 meses atrás
pai
commit
dbe517ae77

+ 26 - 3
build.gradle

@@ -31,6 +31,19 @@ repositories {
     maven { url 'https://jitpack.io' }
     maven { url 'https://maven.enginehub.org/repo/' }
     maven { url 'https://repo.tbvns.xyz/' }
+    maven { url 'https://maven.wispforest.io' }
+
+    exclusiveContent {
+        forRepository {
+            maven {
+                name = "Modrinth"
+                url = "https://api.modrinth.com/maven"
+            }
+        }
+        filter {
+            includeGroup "maven.modrinth"
+        }
+    }
 }
 
 dependencies {
@@ -40,11 +53,21 @@ dependencies {
     modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
 
     modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
-    modImplementation 'xyz.nucleoid:fantasy:0.6.5+1.21.2'
+    modImplementation 'xyz.nucleoid:fantasy:0.6.4+1.21'
     modImplementation 'com.github.WaterMediaTeam.watermedia:build:2.1.1'
-    modImplementation files('libs/worldedit-fabric-mc1.21.3-7.3.9-SNAPSHOT-dist.jar')
+    modImplementation('com.sk89q.worldedit:worldedit-fabric-mc1.21:7.3.6') {
+        exclude group: 'com.google.guava', module: 'guava'
+        exclude group: 'it.unimi.dsi', module: 'fastutil'
+    }
+    modImplementation "maven.modrinth:aaa-particles:1.21-1.4.7-fabric"
+    modImplementation("io.wispforest:owo-lib:${project.owo_version}") {
+        exclude group: 'com.google.guava', module: 'guava'
+        exclude group: 'it.unimi.dsi', module: 'fastutil'
+    }
+    annotationProcessor "io.wispforest:owo-lib:${project.owo_version}"
 
-    // https://mvnrepository.com/artifact/org.projectlombok/lombok
+    implementation 'org.reflections:reflections:0.10.2'
+    include "io.wispforest:owo-sentinel:${project.owo_version}"
     compileOnly 'org.projectlombok:lombok:1.18.34'
 }
 

+ 6 - 4
gradle.properties

@@ -2,13 +2,15 @@
 org.gradle.jvmargs=-Xmx1G
 # Fabric Properties
 # check these on https://modmuss50.me/fabric.html
-minecraft_version=1.21.2
-yarn_mappings=1.21.2+build.1
-loader_version=0.16.8
+minecraft_version=1.21
+yarn_mappings=1.21+build.9
+loader_version=0.16.9
 # Mod Properties
 mod_version=1.0-SNAPSHOT
 maven_group=xyz.tbvns
 archives_base_name=RogueBlock
 # Dependencies
 # check this on https://modmuss50.me/fabric.html
-fabric_version=0.106.1+1.21.2
+fabric_version=0.102.0+1.21
+# OwO lib
+owo_version=0.12.14-pre.1+1.21

+ 23 - 0
src/client/java/xyz/tbvns/rogue_block/client/Events/ClientTickEvent.java

@@ -0,0 +1,23 @@
+package xyz.tbvns.rogue_block.client.Events;
+
+import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Vec3d;
+import xyz.tbvns.rogue_block.client.Gui.UpgradeScreen;
+
+public class ClientTickEvent implements ClientTickEvents.StartWorldTick {
+    @Override
+    public void onStartTick(ClientWorld clientWorld) {
+        if (clientWorld.getRegistryKey().getValue().equals(Identifier.of("rogue_block:lobby"))) {
+            BlockPos pos = MinecraftClient.getInstance().player.getBlockPos();
+            if (clientWorld.getBlockState(pos).getBlock().equals(Blocks.END_GATEWAY)) {
+                MinecraftClient.getInstance().setScreen(new UpgradeScreen());
+                MinecraftClient.getInstance().cameraEntity.setVelocity(new Vec3d(1.3, 0.7, 0));
+            }
+        }
+    }
+}

+ 82 - 0
src/client/java/xyz/tbvns/rogue_block/client/Gui/UpgradeComponent.java

@@ -0,0 +1,82 @@
+package xyz.tbvns.rogue_block.client.Gui;
+
+import io.wispforest.owo.ui.component.Components;
+import io.wispforest.owo.ui.container.FlowLayout;
+import io.wispforest.owo.ui.container.GridLayout;
+import io.wispforest.owo.ui.core.Component;
+import io.wispforest.owo.ui.core.ParentComponent;
+import io.wispforest.owo.ui.core.Positioning;
+import io.wispforest.owo.ui.core.Sizing;
+import io.wispforest.owo.ui.event.MouseEnter;
+import lombok.AllArgsConstructor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+import xyz.tbvns.rogue_block.Upgrades.UpgradeRarity;
+import xyz.tbvns.rogue_block.Utils;
+
+public class UpgradeComponent {
+    ItemStack stack;
+    UpgradeRarity rarity;
+    double x, y;
+    boolean isHovered = false;
+
+    Component textureComponent;
+    Component itemComponent;
+
+    public UpgradeComponent(ItemStack stack, UpgradeRarity rarity, int posX, int posY) {
+        this.stack = stack;
+        this.rarity = rarity;
+        x = posX; y = posY;
+    }
+
+    public void add(FlowLayout layout) {
+        Component item = Components.item(stack);
+        item.positioning().set(Positioning.absolute((int) x, (int) y));
+        Component component = getTextureComponent(rarity.unobtained, item);
+
+        layout.child(component);
+        layout.child(item);
+
+        textureComponent = component;
+        itemComponent = item;
+    }
+
+    public Component getTextureComponent(Identifier identifier, Component item) {
+        Component component =
+            Components.texture(
+                    identifier,
+                    1, 1, 256, 256
+            ).sizing(
+                    Sizing.fixed(21),
+                    Sizing.fixed(21)
+            );
+        component.positioning().set(Positioning.absolute((int) (x - 2), (int) (y - 2)));
+        UpgradeScreen.update();
+
+        component.mouseEnter().subscribe(() -> {
+            component.sizing(Sizing.fixed(25), Sizing.fixed(25));
+            item.sizing(Sizing.fixed(20), Sizing.fixed(20));
+            isHovered = true;
+
+            UpgradeScreen.update();
+        });
+
+        component.mouseLeave().subscribe(() -> {
+            component.sizing(Sizing.fixed(21), Sizing.fixed(21));
+            item.sizing(Sizing.fixed(16), Sizing.fixed(16));
+            isHovered = false;
+
+            UpgradeScreen.update();
+        });
+
+        component.mouseDown().subscribe((mouseX, mouseY, button) -> {
+            ParentComponent parentComponent = textureComponent.root();
+            textureComponent.remove();
+            FlowLayout layout = (FlowLayout) parentComponent;
+            textureComponent = getTextureComponent(rarity.obtained, item);
+            layout.child(textureComponent);
+            return true;
+        });
+        return component;
+    }
+}

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

@@ -0,0 +1,74 @@
+package xyz.tbvns.rogue_block.client.Gui;
+
+import io.wispforest.owo.ui.base.BaseOwoScreen;
+import io.wispforest.owo.ui.container.Containers;
+import io.wispforest.owo.ui.container.FlowLayout;
+import io.wispforest.owo.ui.container.GridLayout;
+import io.wispforest.owo.ui.container.StackLayout;
+import io.wispforest.owo.ui.core.*;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import org.jetbrains.annotations.NotNull;
+import xyz.tbvns.rogue_block.Upgrades.Upgrade;
+import xyz.tbvns.rogue_block.Upgrades.UpgradesManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UpgradeScreen extends BaseOwoScreen<FlowLayout> {
+    double posX = 0;
+    double posY = 0;
+
+    static List<UpgradeComponent> components = new ArrayList<>();
+
+    @Override
+    protected @NotNull OwoUIAdapter<FlowLayout> createAdapter() {
+        return OwoUIAdapter.create(this, Containers::horizontalFlow);
+    }
+
+    @Override
+    protected void build(FlowLayout rootComponent) {
+        rootComponent.mouseDrag().subscribe((mouseX, mouseY, deltaX, deltaY, button) -> {
+            posX += deltaX;
+            posY += deltaY;
+            for (UpgradeComponent component : components) {
+                component.x += deltaX;
+                component.y += deltaY;
+                component.itemComponent.moveTo((int) component.x, (int) component.y);
+                component.textureComponent.moveTo((int) (component.x - 2), (int) (component.y - 2));
+            }
+
+            return true;
+        });
+        rootComponent.surface(Surface.blur(10, 10))
+                     .horizontalAlignment(HorizontalAlignment.CENTER)
+                     .verticalAlignment(VerticalAlignment.CENTER);
+
+        generateUpgradeComponent(rootComponent);
+    }
+
+    @Override
+    public boolean shouldPause() {
+        return false;
+    }
+
+    public void generateUpgradeComponent(FlowLayout rootComponent) {
+        for (Upgrade upgrade : UpgradesManager.registeredUpgrades) {
+            UpgradeComponent component = new UpgradeComponent(upgrade.itemDisplay(), upgrade.getRarity(), upgrade.getGuiPos()[0], upgrade.getGuiPos()[1]);
+            component.add(rootComponent);
+            components.add(component);
+        }
+    }
+
+    public static void update() {
+        for (UpgradeComponent upgradeComponent : UpgradeScreen.components) {
+            if (!upgradeComponent.isHovered) {
+                upgradeComponent.textureComponent.positioning().set(Positioning.absolute((int) upgradeComponent.x - 2, (int) upgradeComponent.y - 2));
+                upgradeComponent.itemComponent.positioning().set(Positioning.absolute((int) upgradeComponent.x, (int) upgradeComponent.y));
+            } else {
+                upgradeComponent.textureComponent.positioning().set(Positioning.absolute((int) upgradeComponent.x - 4, (int) upgradeComponent.y - 4));
+                upgradeComponent.itemComponent.positioning().set(Positioning.absolute((int) upgradeComponent.x - 2, (int) upgradeComponent.y - 2));
+            }
+        }
+    }
+}

+ 6 - 1
src/client/java/xyz/tbvns/rogue_block/client/Rogue_blockClient.java

@@ -1,15 +1,20 @@
 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.entity.event.v1.ServerPlayerEvents;
 import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
+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.client.Events.ClientTickEvent;
 
 public class Rogue_blockClient implements ClientModInitializer {
 
     @Override
     public void onInitializeClient() {
-
+        ClientTickEvents.START_WORLD_TICK.register(new ClientTickEvent());
     }
 }

+ 1 - 1
src/main/java/xyz/tbvns/rogue_block/Events/WorldLoadEvent.java

@@ -9,7 +9,7 @@ public class WorldLoadEvent implements ServerWorldEvents.Load{
     @Override
     public void onWorldLoad(MinecraftServer minecraftServer, ServerWorld serverWorld) {
         if (serverWorld == minecraftServer.getOverworld()) {
-            serverWorld.setMobSpawnOptions(false);
+            serverWorld.setMobSpawnOptions(false, false);
         }
     }
 }

+ 8 - 17
src/main/java/xyz/tbvns/rogue_block/Managers/WorldManager.java

@@ -60,9 +60,9 @@ public class WorldManager {
     static RuntimeWorldHandle lobbyWorldHandle;
 
     public static void createNewLobbyWorld(MinecraftServer server) {
-        RegistryEntryLookup<Biome> biomeLookup = server.getRegistryManager().getOrThrow(RegistryKeys.BIOME);
-        RegistryEntryLookup<StructureSet> structureSetLookup = server.getRegistryManager().getOrThrow(RegistryKeys.STRUCTURE_SET);
-        RegistryEntryLookup<PlacedFeature> featuresLookup = server.getRegistryManager().getOrThrow(RegistryKeys.PLACED_FEATURE);
+        RegistryEntryLookup<Biome> biomeLookup = server.getRegistryManager().getWrapperOrThrow(RegistryKeys.BIOME);
+        RegistryEntryLookup<StructureSet> structureSetLookup = server.getRegistryManager().getWrapperOrThrow(RegistryKeys.STRUCTURE_SET);
+        RegistryEntryLookup<PlacedFeature> featuresLookup = server.getRegistryManager().getWrapperOrThrow(RegistryKeys.PLACED_FEATURE);
 
         FlatChunkGeneratorConfig config = FlatChunkGeneratorConfig.getDefaultConfig(biomeLookup, structureSetLookup, featuresLookup);
         List<FlatChunkGeneratorLayer> layers = new ArrayList<>() {{
@@ -89,16 +89,15 @@ public class WorldManager {
         lobbyWorldHandle = fantasy.getOrOpenPersistentWorld(Identifier.of(MOD_ID, "lobby"), worldConfig);
 
         ServerWorld world = lobbyWorldHandle.asWorld();
-        world.setMobSpawnOptions(false);
+        world.setMobSpawnOptions(false, false);
         world.setBlockState(new BlockPos(0, 13, 0), Blocks.ACACIA_BUTTON.getDefaultState());
 
         for (Entity entity : world.iterateEntities()) {
-            entity.teleport(world, 0, -999, 0, PositionFlag.VALUES, 0, 0, true);
+            entity.teleport(world, 0, -999, 0, PositionFlag.VALUES, 0, 0);
         }
 
         ClipboardFormat format = ClipboardFormats.findByAlias("schem");
 
-
         try {
             Utils.delay(100, () -> {
                 try {
@@ -144,16 +143,13 @@ public class WorldManager {
             Random random = new Random();
             int x = random.nextInt(-50, 50);
             int z = random.nextInt(-50, 50);
-            entity.teleport(runWorldHandle.asWorld(), x, 255, z, PositionFlag.VALUES, 0, 0, true);
+            entity.teleport(runWorldHandle.asWorld(), x, 255, z, PositionFlag.VALUES, 0, 0);
         }
     }
 
     public static void teleportToLobbyWorld(MinecraftServer server) {
         for (ServerPlayerEntity entity : server.getPlayerManager().getPlayerList()) {
-            Random random = new Random();
-            int x = random.nextInt(-3, 3);
-            int z = random.nextInt(-3, 3);
-            entity.teleport(lobbyWorldHandle.asWorld(), x - entity.getX(), 12 - entity.getY(), z - entity.getZ(), PositionFlag.VALUES, 0, 0, true);
+            teleportToLobbyWorld(entity);
         }
     }
 
@@ -175,7 +171,7 @@ public class WorldManager {
         Random random = new Random();
         int x = random.nextInt(-3, 3);
         int z = random.nextInt(-3, 3);
-        entity.teleport(lobbyWorldHandle.asWorld(), x - entity.getX(), 12 - entity.getY(), z - entity.getZ(), PositionFlag.VALUES, 0, 0, true);
+        entity.teleport(lobbyWorldHandle.asWorld(), x, 12, z, PositionFlag.VALUES, 0, 0);
     }
 
     //This is required to remove every structure
@@ -191,11 +187,6 @@ public class WorldManager {
             return 0;
         }
 
-        @Override
-        public boolean isBound() {
-            return false;
-        }
-
         @Override
         public Either<TagKey<StructureSet>, List<RegistryEntry<StructureSet>>> getStorage() {
             return null;

+ 2 - 0
src/main/java/xyz/tbvns/rogue_block/Rogue_block.java

@@ -8,6 +8,7 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
 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.Upgrades.UpgradesManager;
 
 public class Rogue_block implements ModInitializer {
     public static final String MOD_ID = "rogue_block";
@@ -18,5 +19,6 @@ public class Rogue_block implements ModInitializer {
         UseBlockCallback.EVENT.register(new PlayerStartButtonEvent());
         ServerLifecycleEvents.SERVER_STARTED.register(new ServerStartEvent());
 
+        UpgradesManager.loadUpgrades();
     }
 }

+ 15 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/ActiveUpgrade.java

@@ -0,0 +1,15 @@
+package xyz.tbvns.rogue_block.Upgrades;
+
+import net.minecraft.server.network.ServerPlayerEntity;
+
+public interface ActiveUpgrade extends Upgrade{
+    default void executeOnKeybind(ServerPlayerEntity player) {}
+    default int getCooldown(ServerPlayerEntity player) {
+        return 5;
+    }
+
+    @Override
+    default UpgradeType getType() {
+        return UpgradeType.Keybind;
+    }
+}

+ 10 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/PassiveUpgrade.java

@@ -0,0 +1,10 @@
+package xyz.tbvns.rogue_block.Upgrades;
+
+import net.minecraft.server.network.ServerPlayerEntity;
+
+public interface PassiveUpgrade extends Upgrade{
+    default void setup(ServerPlayerEntity player) {}
+    default void executeOnStart(ServerPlayerEntity player) {}
+    default void executeOnTick(ServerPlayerEntity player) {}
+    default void executeOnEnd(ServerPlayerEntity player) {}
+}

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

@@ -0,0 +1,18 @@
+package xyz.tbvns.rogue_block.Upgrades.RegisteredUpgrades;
+
+import net.minecraft.entity.effect.StatusEffectInstance;
+import net.minecraft.entity.effect.StatusEffects;
+import net.minecraft.server.network.ServerPlayerEntity;
+import xyz.tbvns.rogue_block.Upgrades.PassiveUpgrade;
+
+public class RegenUpgrade implements PassiveUpgrade {
+    @Override
+    public int getCost() {
+        return 10;
+    }
+
+    @Override
+    public void executeOnStart(ServerPlayerEntity player) {
+        player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, StatusEffectInstance.INFINITE));
+    }
+}

+ 30 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/Upgrade.java

@@ -0,0 +1,30 @@
+package xyz.tbvns.rogue_block.Upgrades;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+
+public interface Upgrade {
+    default Class getParent() {
+        return null;
+    }
+
+    default int getCost() {
+        return 0;
+    }
+
+    default UpgradeType getType() {
+        return UpgradeType.Passive;
+    }
+
+    default int[] getGuiPos() {
+        return new int[]{0, 0};
+    }
+
+    default ItemStack itemDisplay() {
+        return Items.BEDROCK.getDefaultStack();
+    }
+
+    default UpgradeRarity getRarity() {
+        return UpgradeRarity.common;
+    }
+}

+ 26 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/UpgradeRarity.java

@@ -0,0 +1,26 @@
+package xyz.tbvns.rogue_block.Upgrades;
+
+import net.minecraft.util.Identifier;
+
+public enum UpgradeRarity {
+    rare(
+            Identifier.of("minecraft:textures/gui/sprites/advancements/challenge_frame_obtained.png"),
+            Identifier.of("minecraft:textures/gui/sprites/advancements/challenge_frame_unobtained.png")
+    ),
+    medium(
+            Identifier.of("minecraft:textures/gui/sprites/advancements/goal_frame_obtained.png"),
+            Identifier.of("minecraft:textures/gui/sprites/advancements/goal_frame_unobtained.png")
+    ),
+    common(
+            Identifier.of("minecraft:textures/gui/sprites/advancements/task_frame_obtained.png"),
+            Identifier.of("minecraft:textures/gui/sprites/advancements/task_frame_unobtained.png")
+    );
+
+    UpgradeRarity(Identifier obtained, Identifier unobtained) {
+        this.obtained = obtained;
+        this.unobtained = unobtained;
+    }
+
+    public Identifier obtained;
+    public Identifier unobtained;
+}

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

@@ -0,0 +1,13 @@
+package xyz.tbvns.rogue_block.Upgrades;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public enum UpgradeType {
+    Passive(),
+    Keybind(),
+    KeybindSecond(),
+    KeybindThird(),
+    KeybindForth(),
+    KeybindFifth();
+}

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

@@ -0,0 +1,38 @@
+package xyz.tbvns.rogue_block.Upgrades;
+
+import lombok.Getter;
+import org.reflections.Reflections;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public class UpgradesManager {
+    public static final List<Upgrade> registeredUpgrades = new ArrayList<>();
+
+    public static void loadUpgrades() {
+        try {
+            Reflections reflections = new Reflections("xyz.tbvns.rogue_block.Upgrades.RegisteredUpgrades");
+
+            Set<Class<? extends PassiveUpgrade>> passiveUpgrade = reflections.getSubTypesOf(PassiveUpgrade.class);
+            for (Class<? extends PassiveUpgrade> element : passiveUpgrade) {
+                registeredUpgrades.add(element.getDeclaredConstructor().newInstance());
+            }
+
+            Set<Class<? extends ActiveUpgrade>> activeUpgrade = reflections.getSubTypesOf(ActiveUpgrade.class);
+            for (Class<? extends ActiveUpgrade> element : activeUpgrade) {
+                registeredUpgrades.add(element.getDeclaredConstructor().newInstance());
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void registerUpgrade(Class<? extends Upgrade> upgrade) {
+        try {
+            registeredUpgrades.add(upgrade.getDeclaredConstructor().newInstance());
+        } catch (Exception e) {
+            throw new RuntimeException();
+        }
+    }
+}