From c0ffa818843719554fb4f6e34fc40fe6f3c1ae38 Mon Sep 17 00:00:00 2001 From: Julienraptor01 Date: Fri, 14 Jul 2023 14:46:08 +0200 Subject: rewrite of the ItemFixerUpper thanks @AzureAaron, @ExternalTime, and @Futuremappermydud for helping me debug/enhance the code --- .../skyblock/itemlist/ItemFixerUpper.java | 407 +++++++++++++-------- 1 file changed, 248 insertions(+), 159 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java index d8ad3a89..3e1c67ec 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -1,39 +1,45 @@ package me.xmrvizzy.skyblocker.skyblock.itemlist; -import net.minecraft.item.Items; -// import net.minecraft.registry.Registry; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; import java.util.Map; public class ItemFixerUpper { - private final static Map MAPPING = Map.ofEntries( - Map.entry("minecraft:golden_rail", "minecraft:powered_rail"), - Map.entry("minecraft:lit_pumpkin", "minecraft:jack_o_lantern"), - Map.entry("minecraft:snow_layer", "minecraft:snow"), - Map.entry("minecraft:hardened_clay", "minecraft:terracotta"), - Map.entry("minecraft:speckled_melon", "minecraft:glistering_melon_slice"), - Map.entry("minecraft:mob_spawner", "minecraft:spawner"), - Map.entry("minecraft:brick_block", "minecraft:bricks"), - Map.entry("minecraft:deadbush", "minecraft:dead_bush"), - Map.entry("minecraft:slime", "minecraft:slime_block"), - Map.entry("minecraft:melon_block", "minecraft:melon"), - Map.entry("minecraft:reeds", "minecraft:sugar_cane"), - Map.entry("minecraft:yellow_flower", "minecraft:dandelion"), - Map.entry("minecraft:firework_charge", "minecraft:firework_star"), - Map.entry("minecraft:noteblock", "minecraft:note_block"), - Map.entry("minecraft:web", "minecraft:cobweb"), - Map.entry("minecraft:fireworks", "minecraft:firework_rocket"), - Map.entry("minecraft:netherbrick", "minecraft:nether_brick"), - Map.entry("minecraft:stained_hardened_clay", "minecraft:terracotta"), - Map.entry("minecraft:quartz_ore", "minecraft:nether_quartz_ore"), - Map.entry("minecraft:tallgrass", "minecraft:grass"), - Map.entry("minecraft:stone_slab2", "minecraft:red_sandstone_slab"), - Map.entry("minecraft:waterlily", "minecraft:lily_pad"), - Map.entry("minecraft:stone_stairs", "minecraft:cobblestone_stairs") - ); + private final static String[] ANVIL_VARIANTS = { + "minecraft:anvil", + "minecraft:chipped_anvil", + "minecraft:damaged_anvil" + }; + + private final static String[] COAL_VARIANTS = { + "minecraft:coal", + "minecraft:charcoal" + }; - private final static String[] DYE_COLORS = { + private final static String[] COBBLESTONE_WALL_VARIANTS = { + "minecraft:cobblestone_wall", + "minecraft:mossy_cobblestone_wall" + }; + + private final static String[] COOKED_FISH_VARIANTS = { + "minecraft:cooked_cod", + "minecraft:cooked_salmon" + }; + + private final static String[] DIRT_VARIANTS = { + "minecraft:dirt", + "minecraft:coarse_dirt", + "minecraft:podzol" + }; + + private final static String[] DOUBLE_PLANT_VARIANTS = { + "minecraft:sunflower", + "minecraft:lilac", + "minecraft:tall_grass", + "minecraft:large_fern", + "minecraft:rose_bush", + "minecraft:peony" + }; + + private final static String[] DYE_VARIANTS = { "minecraft:ink_sac", "minecraft:red_dye", "minecraft:green_dye", @@ -52,39 +58,55 @@ public class ItemFixerUpper { "minecraft:bone_meal" }; - private final static String[] BLOCK_COLORS = { - "white_", - "orange_", - "magenta_", - "light_blue_", - "yellow_", - "lime_", - "pink_", - "gray_", - "light_gray_", - "cyan_", - "purple_", - "blue_", - "brown_", - "green_", - "red_", - "black_" - }; - - private final static String[] TREE_VARIANTS = { - "oak_", - "spruce_", - "birch_", - "jungle_", - "acacia_", - "dark_oak_" - }; - - private final static String[] STONE_BRICK_VARIANTS = { - "minecraft:stone_bricks", - "minecraft:mossy_stone_bricks", - "minecraft:cracked_stone_bricks", - "minecraft:chiseled_stone_bricks" + private final static String[] FISH_VARIANTS = { + "minecraft:cod", + "minecraft:salmon", + "minecraft:tropical_fish", + "minecraft:pufferfish" + }; + + private final static String[] GOLDEN_APPLE_VARIANTS = { + "minecraft:golden_apple", + "minecraft:enchanted_golden_apple" + }; + + private final static String[] LOG_VARIANTS = { + "minecraft:oak_log", + "minecraft:spruce_log", + "minecraft:birch_log", + "minecraft:jungle_log", + "minecraft:oak_wood", + "minecraft:spruce_wood", + "minecraft:birch_wood", + "minecraft:jungle_wood", + }; + + private final static String[] LOG2_VARIANTS = { + "minecraft:acacia_log", + "minecraft:dark_oak_log", + "minecraft:acacia_wood", + "minecraft:dark_oak_wood" + }; + + private final static String[] MONSTER_EGG_VARIANTS = { + "minecraft:infested_stone", + "minecraft:infested_cobblestone", + "minecraft:infested_stone_bricks", + "minecraft:infested_mossy_stone_bricks", + "minecraft:infested_cracked_stone_bricks", + "minecraft:infested_chiseled_stone_bricks" + }; + + private final static String[] PRISMARINE_VARIANTS = { + "minecraft:prismarine", + "minecraft:prismarine_bricks", + "minecraft:dark_prismarine" + }; + + private final static String[] QUARTZ_BLOCK_VARIANTS = { + "minecraft:quartz_block", + "minecraft:chiseled_quartz_block", + "minecraft:quartz_pillar" }; private final static String[] RED_FLOWER_VARIANTS = { @@ -99,45 +121,11 @@ public class ItemFixerUpper { "minecraft:oxeye_daisy" }; - private final static String[] DOUBLE_PLANT_VARIANTS = { - "minecraft:sunflower", - "minecraft:lilac", - "minecraft:tall_grass", - "minecraft:large_fern", - "minecraft:rose_bush", - "minecraft:peony" + private final static String[] SAND_VARIANTS = { + "minecraft:sand", + "minecraft:red_sand" }; - private final static Map SPAWN_EGG_VARIANTS = Map.ofEntries( - Map.entry(50, "minecraft:creeper_spawn_egg"), - Map.entry(51, "minecraft:skeleton_spawn_egg"), - Map.entry(52, "minecraft:spider_spawn_egg"), - Map.entry(54, "minecraft:zombie_spawn_egg"), - Map.entry(55, "minecraft:slime_spawn_egg"), - Map.entry(56, "minecraft:ghast_spawn_egg"), - Map.entry(57, "minecraft:zombified_piglin_spawn_egg"), - Map.entry(58, "minecraft:enderman_spawn_egg"), - Map.entry(59, "minecraft:cave_spider_spawn_egg"), - Map.entry(60, "minecraft:silverfish_spawn_egg"), - Map.entry(61, "minecraft:blaze_spawn_egg"), - Map.entry(62, "minecraft:magma_cube_spawn_egg"), - Map.entry(65, "minecraft:bat_spawn_egg"), - Map.entry(66, "minecraft:witch_spawn_egg"), - Map.entry(67, "minecraft:endermite_spawn_egg"), - Map.entry(68, "minecraft:guardian_spawn_egg"), - Map.entry(90, "minecraft:pig_spawn_egg"), - Map.entry(91, "minecraft:sheep_spawn_egg"), - Map.entry(92, "minecraft:cow_spawn_egg"), - Map.entry(93, "minecraft:chicken_spawn_egg"), - Map.entry(94, "minecraft:squid_spawn_egg"), - Map.entry(95, "minecraft:wolf_spawn_egg"), - Map.entry(96, "minecraft:mooshroom_spawn_egg"), - Map.entry(98, "minecraft:ocelot_spawn_egg"), - Map.entry(100, "minecraft:horse_spawn_egg"), - Map.entry(101, "minecraft:rabbit_spawn_egg"), - Map.entry(120, "minecraft:villager_spawn_egg") - ); - private final static String[] SKULL_VARIANTS = { "minecraft:skeleton_skull", "minecraft:wither_skeleton_skull", @@ -146,16 +134,9 @@ public class ItemFixerUpper { "minecraft:creeper_head" }; - private final static String[] FISH_VARIANTS = { - "minecraft:cod", - "minecraft:salmon", - "minecraft:tropical_fish", - "minecraft:pufferfish" - }; - - private final static String[] COOKED_FISH_VARIANTS = { - "minecraft:cooked_cod", - "minecraft:cooked_salmon" + private final static String[] SPONGE_VARIANTS = { + "minecraft:sponge", + "minecraft:wet_sponge" }; private final static String[] STONE_VARIANTS = { @@ -171,7 +152,7 @@ public class ItemFixerUpper { private final static String[] STONE_SLAB_VARIANTS = { "minecraft:smooth_stone_slab", "minecraft:sandstone_slab", - "minecraft:barrier", // doesn't exist + "minecraft:petrified_oak_slab", "minecraft:cobblestone_slab", "minecraft:brick_slab", "minecraft:stone_brick_slab", @@ -179,63 +160,171 @@ public class ItemFixerUpper { "minecraft:quartz_slab" }; - private final static String[] COBBLESTONE_WALL_VARIANTS = { - "minecraft:cobblestone_wall", - "minecraft:mossy_cobblestone_wall" + private final static String[] STONEBRICK_VARIANTS = { + "minecraft:stone_bricks", + "minecraft:mossy_stone_bricks", + "minecraft:cracked_stone_bricks", + "minecraft:chiseled_stone_bricks" }; - private final static String[] DIRT_VARIANTS = { - "minecraft:dirt", - "minecraft:coarse_dirt", - "minecraft:podzol" + private final static String[] TALLGRASS_VARIANTS = { + "minecraft:dead_bush", + "minecraft:grass", + "minecraft:fern" }; - private final static String[] SPONGE_VARIANTS = { - "minecraft:sponge", - "minecraft:wet_sponge" + private final static Map SPAWN_EGG_VARIANTS = Map.ofEntries( + Map.entry(0, "minecraft:polar_bear_spawn_egg"), + Map.entry(50, "minecraft:creeper_spawn_egg"), + Map.entry(51, "minecraft:skeleton_spawn_egg"), + Map.entry(52, "minecraft:spider_spawn_egg"), + Map.entry(54, "minecraft:zombie_spawn_egg"), + Map.entry(55, "minecraft:slime_spawn_egg"), + Map.entry(56, "minecraft:ghast_spawn_egg"), + Map.entry(57, "minecraft:zombified_piglin_spawn_egg"), + Map.entry(58, "minecraft:enderman_spawn_egg"), + Map.entry(59, "minecraft:cave_spider_spawn_egg"), + Map.entry(60, "minecraft:silverfish_spawn_egg"), + Map.entry(61, "minecraft:blaze_spawn_egg"), + Map.entry(62, "minecraft:magma_cube_spawn_egg"), + Map.entry(65, "minecraft:bat_spawn_egg"), + Map.entry(66, "minecraft:witch_spawn_egg"), + Map.entry(67, "minecraft:endermite_spawn_egg"), + Map.entry(68, "minecraft:guardian_spawn_egg"), + Map.entry(90, "minecraft:pig_spawn_egg"), + Map.entry(91, "minecraft:sheep_spawn_egg"), + Map.entry(92, "minecraft:cow_spawn_egg"), + Map.entry(93, "minecraft:chicken_spawn_egg"), + Map.entry(94, "minecraft:squid_spawn_egg"), + Map.entry(95, "minecraft:wolf_spawn_egg"), + Map.entry(96, "minecraft:mooshroom_spawn_egg"), + Map.entry(98, "minecraft:ocelot_spawn_egg"), + Map.entry(100, "minecraft:horse_spawn_egg"), + Map.entry(101, "minecraft:rabbit_spawn_egg"), + Map.entry(120, "minecraft:villager_spawn_egg") + ); + + private final static String[] SANDSTONE_VARIANTS = { + ":", + ":chiseled_", + ":cut_" }; - private final static String[] PRISMARINE_VARIANTS = { - "minecraft:prismarine", - "minecraft:prismarine_bricks", - "minecraft:dark_prismarine" + private final static String[] COLOR_VARIANTS = { + ":white_", + ":orange_", + ":magenta_", + ":light_blue_", + ":yellow_", + ":lime_", + ":pink_", + ":gray_", + ":light_gray_", + ":cyan_", + ":purple_", + ":blue_", + ":brown_", + ":green_", + ":red_", + ":black_" + }; + + private final static String[] WOOD_VARIANTS = { + ":oak_", + ":spruce_", + ":birch_", + ":jungle_", + ":acacia_", + ":dark_oak_" }; - // TODO: map potions to their correct colors + private final static Map RENAMED = Map.ofEntries( + Map.entry("minecraft:bed", "minecraft:red_bed"), + Map.entry("minecraft:boat", "minecraft:oak_boat"), + Map.entry("minecraft:brick_block", "minecraft:bricks"), + Map.entry("minecraft:deadbush", "minecraft:dead_bush"), + Map.entry("minecraft:fence_gate", "minecraft:oak_fence_gate"), + Map.entry("minecraft:fence", "minecraft:oak_fence"), + Map.entry("minecraft:firework_charge", "minecraft:firework_star"), + Map.entry("minecraft:fireworks", "minecraft:firework_rocket"), + Map.entry("minecraft:golden_rail", "minecraft:powered_rail"), + Map.entry("minecraft:grass", "minecraft:grass_block"), + Map.entry("minecraft:hardened_clay", "minecraft:terracotta"), + Map.entry("minecraft:lit_pumpkin", "minecraft:jack_o_lantern"), + Map.entry("minecraft:melon_block", "minecraft:melon"), + Map.entry("minecraft:melon", "minecraft:melon_slice"), + Map.entry("minecraft:mob_spawner", "minecraft:spawner"), + Map.entry("minecraft:nether_brick", "minecraft:nether_bricks"), + Map.entry("minecraft:netherbrick", "minecraft:nether_brick"), + Map.entry("minecraft:noteblock", "minecraft:note_block"), + Map.entry("minecraft:piston_extension", "minecraft:moving_piston"), + Map.entry("minecraft:portal", "minecraft:nether_portal"), + Map.entry("minecraft:pumpkin", "minecraft:carved_pumpkin"), + Map.entry("minecraft:quartz_ore", "minecraft:nether_quartz_ore"), + Map.entry("minecraft:record_11", "minecraft:music_disc_11"), + Map.entry("minecraft:record_13", "minecraft:music_disc_13"), + Map.entry("minecraft:record_blocks", "minecraft:music_disc_blocks"), + Map.entry("minecraft:record_cat", "minecraft:music_disc_cat"), + Map.entry("minecraft:record_chirp", "minecraft:music_disc_chirp"), + Map.entry("minecraft:record_far", "minecraft:music_disc_far"), + Map.entry("minecraft:record_mall", "minecraft:music_disc_mall"), + Map.entry("minecraft:record_mellohi", "minecraft:music_disc_mellohi"), + Map.entry("minecraft:record_stal", "minecraft:music_disc_stal"), + Map.entry("minecraft:record_strad", "minecraft:music_disc_strad"), + Map.entry("minecraft:record_wait", "minecraft:music_disc_wait"), + Map.entry("minecraft:record_ward", "minecraft:music_disc_ward"), + Map.entry("minecraft:red_nether_brick", "minecraft:red_nether_bricks"), + Map.entry("minecraft:reeds", "minecraft:sugar_cane"), + Map.entry("minecraft:sign", "minecraft:oak_sign"), + Map.entry("minecraft:slime", "minecraft:slime_block"), + Map.entry("minecraft:snow_layer", "minecraft:snow"), + Map.entry("minecraft:snow", "minecraft:snow_block"), + Map.entry("minecraft:speckled_melon", "minecraft:glistering_melon_slice"), + Map.entry("minecraft:stone_slab2", "minecraft:red_sandstone_slab"), + Map.entry("minecraft:stone_stairs", "minecraft:cobblestone_stairs"), + Map.entry("minecraft:trapdoor", "minecraft:oak_trapdoor"), + Map.entry("minecraft:waterlily", "minecraft:lily_pad"), + Map.entry("minecraft:web", "minecraft:cobweb"), + Map.entry("minecraft:wooden_button", "minecraft:oak_button"), + Map.entry("minecraft:wooden_door", "minecraft:oak_door"), + Map.entry("minecraft:wooden_pressure_plate", "minecraft:oak_pressure_plate"), + Map.entry("minecraft:yellow_flower", "minecraft:dandelion") + ); + + //TODO : Add mushroom block variants public static String convertItemId(String id, int damage) { - if (id.equals("minecraft:dye")) return DYE_COLORS[damage]; - if (id.equals("minecraft:log2")) return "minecraft:" + TREE_VARIANTS[damage + 4] + "log"; - if (id.equals("minecraft:leaves2")) return "minecraft:" + TREE_VARIANTS[damage + 4] + "leaves"; - if (id.equals("minecraft:stonebrick")) return STONE_BRICK_VARIANTS[damage]; - if (id.equals("minecraft:red_flower")) return RED_FLOWER_VARIANTS[damage]; - if (id.equals("minecraft:double_plant")) return DOUBLE_PLANT_VARIANTS[damage]; - if (id.equals("minecraft:spawn_egg")) return SPAWN_EGG_VARIANTS.getOrDefault(damage, "minecraft:ghast_spawn_egg"); - if (id.equals("minecraft:banner")) return "minecraft:" + BLOCK_COLORS[15 - damage] + "banner"; - if (id.equals("minecraft:skull")) return SKULL_VARIANTS[damage]; - if (id.equals("minecraft:fish")) return FISH_VARIANTS[damage]; - if (id.equals("minecraft:cooked_fish")) return COOKED_FISH_VARIANTS[damage]; - if (id.equals("minecraft:stone")) return STONE_VARIANTS[damage]; - if (id.equals("minecraft:stone_slab")) return STONE_SLAB_VARIANTS[damage]; - if (id.equals("minecraft:cobblestone_wall")) return COBBLESTONE_WALL_VARIANTS[damage]; - if (id.equals("minecraft:dirt")) return DIRT_VARIANTS[damage]; - if (id.equals("minecraft:sponge")) return SPONGE_VARIANTS[damage]; - if (id.equals("minecraft:prismarine")) return PRISMARINE_VARIANTS[damage]; - - id = MAPPING.getOrDefault(id, id); - // if (Registry.ITEM.get(new Identifier(id)).equals(Items.AIR)) { - if (Registries.ITEM.get(new Identifier(id)).equals(Items.AIR)) { - String shortId = id.split(":")[1]; - // if (damage < BLOCK_COLORS.length && !Registry.ITEM.get(new Identifier("minecraft:" + BLOCK_COLORS[damage] + shortId)).equals(Items.AIR)) - if (damage < BLOCK_COLORS.length && !Registries.ITEM.get(new Identifier("minecraft:" + BLOCK_COLORS[damage] + shortId)).equals(Items.AIR)) - return "minecraft:" + BLOCK_COLORS[damage] + shortId; - // if (damage < TREE_VARIANTS.length && !Registry.ITEM.get(new Identifier("minecraft:" + TREE_VARIANTS[damage] + shortId)).equals(Items.AIR)) - if (damage < TREE_VARIANTS.length && !Registries.ITEM.get(new Identifier("minecraft:" + TREE_VARIANTS[damage] + shortId)).equals(Items.AIR)) - return "minecraft:" + TREE_VARIANTS[damage] + shortId; - - if (id.contains("wooden_")) return id.replaceFirst("wooden_", TREE_VARIANTS[damage]); - if (id.contains("minecraft:record")) return id.replaceFirst("minecraft:record", "minecraft:music_disc"); - } - return id; + return switch (id) { + case "minecraft:anvil" -> ANVIL_VARIANTS[damage]; + case "minecraft:coal" -> COAL_VARIANTS[damage]; + case "minecraft:cobblestone_wall" -> COBBLESTONE_WALL_VARIANTS[damage]; + case "minecraft:cooked_fish" -> COOKED_FISH_VARIANTS[damage]; + case "minecraft:dirt" -> DIRT_VARIANTS[damage]; + case "minecraft:double_plant" -> DOUBLE_PLANT_VARIANTS[damage]; + case "minecraft:dye" -> DYE_VARIANTS[damage]; + case "minecraft:fish" -> FISH_VARIANTS[damage]; + case "minecraft:golden_apple" -> GOLDEN_APPLE_VARIANTS[damage]; + case "minecraft:log" -> LOG_VARIANTS[damage]; + case "minecraft:log2" -> LOG2_VARIANTS[damage]; + case "minecraft:monster_egg" -> MONSTER_EGG_VARIANTS[damage]; + case "minecraft:prismarine" -> PRISMARINE_VARIANTS[damage]; + case "minecraft:quartz_block" -> QUARTZ_BLOCK_VARIANTS[damage]; + case "minecraft:red_flower" -> RED_FLOWER_VARIANTS[damage]; + case "minecraft:sand" -> SAND_VARIANTS[damage]; + case "minecraft:skull" -> SKULL_VARIANTS[damage]; + case "minecraft:sponge" -> SPONGE_VARIANTS[damage]; + case "minecraft:stone" -> STONE_VARIANTS[damage]; + case "minecraft:stone_slab" -> STONE_SLAB_VARIANTS[damage]; + case "minecraft:stonebrick" -> STONEBRICK_VARIANTS[damage]; + case "minecraft:tallgrass" -> TALLGRASS_VARIANTS[damage]; + case "minecraft:spawn_egg" -> SPAWN_EGG_VARIANTS.get(damage); + case "minecraft:sandstone", "minecraft:red_sandstone" -> id.replaceFirst(":", SANDSTONE_VARIANTS[damage]); + case "minecraft:banner" -> id.replaceFirst(":", COLOR_VARIANTS[15 - damage]); + case "minecraft:carpet", "minecraft:stained_glass", "minecraft:stained_glass_pane", "minecraft:wool" -> id.replaceFirst(":", COLOR_VARIANTS[damage]); + case "minecraft:stained_hardened_clay" -> id.replaceFirst(":", COLOR_VARIANTS[damage]).replaceFirst("stained_hardened_clay", "terracotta"); + case "minecraft:leaves", "minecraft:planks", "minecraft:sapling", "minecraft:wooden_slab" -> id.replaceFirst(":", WOOD_VARIANTS[damage]).replaceFirst("wooden_", ""); + case "minecraft:leaves2" -> id.replaceFirst(":", WOOD_VARIANTS[damage + 4]).replaceFirst("2", ""); + default -> RENAMED.getOrDefault(id, id); + }; } } -- cgit From cba602c9c46ba07808aaf84759b61b33d25e9620 Mon Sep 17 00:00:00 2001 From: Julienraptor01 Date: Fri, 14 Jul 2023 15:32:24 +0200 Subject: add comments and enhance leaves2 replacement --- .../skyblocker/skyblock/itemlist/ItemFixerUpper.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/main/java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java index 3e1c67ec..68aa42e2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -174,6 +174,7 @@ public class ItemFixerUpper { }; private final static Map SPAWN_EGG_VARIANTS = Map.ofEntries( + //This entry 0 is technically not right but Hypixel decided to make it polar bear so well we use that Map.entry(0, "minecraft:polar_bear_spawn_egg"), Map.entry(50, "minecraft:creeper_spawn_egg"), Map.entry(51, "minecraft:skeleton_spawn_egg"), @@ -238,6 +239,7 @@ public class ItemFixerUpper { ":dark_oak_" }; + //this is the map of all renames private final static Map RENAMED = Map.ofEntries( Map.entry("minecraft:bed", "minecraft:red_bed"), Map.entry("minecraft:boat", "minecraft:oak_boat"), @@ -292,9 +294,11 @@ public class ItemFixerUpper { ); //TODO : Add mushroom block variants + //i'll do it later because it isn't used and unlike the other, it's not just a rename or a separate, it's a separate and a merge public static String convertItemId(String id, int damage) { return switch (id) { + //all the case are simple separate case "minecraft:anvil" -> ANVIL_VARIANTS[damage]; case "minecraft:coal" -> COAL_VARIANTS[damage]; case "minecraft:cobblestone_wall" -> COBBLESTONE_WALL_VARIANTS[damage]; @@ -317,13 +321,20 @@ public class ItemFixerUpper { case "minecraft:stone_slab" -> STONE_SLAB_VARIANTS[damage]; case "minecraft:stonebrick" -> STONEBRICK_VARIANTS[damage]; case "minecraft:tallgrass" -> TALLGRASS_VARIANTS[damage]; + //we use a Map from int to str instead of an array because numbers are not consecutive case "minecraft:spawn_egg" -> SPAWN_EGG_VARIANTS.get(damage); + //when we use the generalized variant we need to replaceFirst case "minecraft:sandstone", "minecraft:red_sandstone" -> id.replaceFirst(":", SANDSTONE_VARIANTS[damage]); + //to use the general color variants we need to reverse the order because Minecraft decided so for some reason case "minecraft:banner" -> id.replaceFirst(":", COLOR_VARIANTS[15 - damage]); case "minecraft:carpet", "minecraft:stained_glass", "minecraft:stained_glass_pane", "minecraft:wool" -> id.replaceFirst(":", COLOR_VARIANTS[damage]); + //for the terracotta we need to replace the "stained_hardened_clay" with "terracotta" as well as doing the color separation case "minecraft:stained_hardened_clay" -> id.replaceFirst(":", COLOR_VARIANTS[damage]).replaceFirst("stained_hardened_clay", "terracotta"); + //for the wooden slab we need to remove the "wooden_" prefix, but otherwise it's the same, so I just combined them anyway case "minecraft:leaves", "minecraft:planks", "minecraft:sapling", "minecraft:wooden_slab" -> id.replaceFirst(":", WOOD_VARIANTS[damage]).replaceFirst("wooden_", ""); - case "minecraft:leaves2" -> id.replaceFirst(":", WOOD_VARIANTS[damage + 4]).replaceFirst("2", ""); + //here we strip the last character which is 2 because we need leaves2 to be leaves + case "minecraft:leaves2" -> id.replaceFirst(":", WOOD_VARIANTS[damage + 4]).substring(0, id.length() - 1); + //the default case is just a rename or no change default -> RENAMED.getOrDefault(id, id); }; } -- cgit From c366ee6db411d67ff6ad5ef5c1dcde00a88a6818 Mon Sep 17 00:00:00 2001 From: Julienraptor01 Date: Fri, 14 Jul 2023 16:34:22 +0200 Subject: fix leaves2 and enhance terracotta and wooden_slab --- .../xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java index 68aa42e2..cc7b216c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemFixerUpper.java @@ -328,12 +328,12 @@ public class ItemFixerUpper { //to use the general color variants we need to reverse the order because Minecraft decided so for some reason case "minecraft:banner" -> id.replaceFirst(":", COLOR_VARIANTS[15 - damage]); case "minecraft:carpet", "minecraft:stained_glass", "minecraft:stained_glass_pane", "minecraft:wool" -> id.replaceFirst(":", COLOR_VARIANTS[damage]); - //for the terracotta we need to replace the "stained_hardened_clay" with "terracotta" as well as doing the color separation - case "minecraft:stained_hardened_clay" -> id.replaceFirst(":", COLOR_VARIANTS[damage]).replaceFirst("stained_hardened_clay", "terracotta"); + //for the terracotta we replace the whole name by the color and append "terracotta" at the end + case "minecraft:stained_hardened_clay" -> id.replaceFirst(":stained_hardened_clay", COLOR_VARIANTS[damage]) + "terracotta"; //for the wooden slab we need to remove the "wooden_" prefix, but otherwise it's the same, so I just combined them anyway - case "minecraft:leaves", "minecraft:planks", "minecraft:sapling", "minecraft:wooden_slab" -> id.replaceFirst(":", WOOD_VARIANTS[damage]).replaceFirst("wooden_", ""); - //here we strip the last character which is 2 because we need leaves2 to be leaves - case "minecraft:leaves2" -> id.replaceFirst(":", WOOD_VARIANTS[damage + 4]).substring(0, id.length() - 1); + case "minecraft:leaves", "minecraft:planks", "minecraft:sapling", "minecraft:wooden_slab" -> id.replaceFirst(":(?:wooden_)?", WOOD_VARIANTS[damage]); + //here we replace the 2 by nothing to remove it as it's not needed anymore + case "minecraft:leaves2" -> id.replaceFirst(":", WOOD_VARIANTS[damage + 4]).replaceFirst("2", ""); //the default case is just a rename or no change default -> RENAMED.getOrDefault(id, id); }; -- cgit From f05ef4128f4b0bcb9d0bf1a691ce17037f1bc765 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 16 Jul 2023 04:04:42 -0400 Subject: Rendering Improvements, Fixes + Occlusion Culling --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 + .../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 45 ++++++++++++++------ .../me/xmrvizzy/skyblocker/utils/RenderUtils.java | 2 +- .../skyblocker/utils/culling/OcclusionCulling.java | 48 ++++++++++++++++++++++ .../skyblocker/utils/culling/WorldProvider.java | 29 +++++++++++++ .../skyblocker/utils/culling/package-info.java | 4 ++ 6 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java (limited to 'src/main/java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index cc712405..3692db1b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -19,6 +19,7 @@ import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.*; +import me.xmrvizzy.skyblocker.utils.culling.OcclusionCulling; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; @@ -83,6 +84,7 @@ public class SkyblockerMod implements ClientModInitializer { DungeonMap.init(); TheRift.init(); TitleContainer.init(); + OcclusionCulling.init(); containerSolverManager.init(); scheduler.scheduleCyclic(Utils::update, 20); scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java index 6fa93735..a1221549 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java @@ -2,22 +2,29 @@ package me.xmrvizzy.skyblocker.utils; import me.x150.renderer.render.Renderer3d; import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; +import me.xmrvizzy.skyblocker.utils.culling.OcclusionCulling; import me.xmrvizzy.skyblocker.utils.title.Title; import me.xmrvizzy.skyblocker.utils.title.TitleContainer; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvent; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; - import java.awt.*; +import com.mojang.blaze3d.systems.RenderSystem; + public class RenderHelper { private static final Vec3d ONE = new Vec3d(1, 1, 1); + private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319; public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { renderFilledThroughWalls(context, pos, colorComponents, alpha); @@ -25,26 +32,40 @@ public class RenderHelper { } public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - Renderer3d.renderThroughWalls(); - renderFilled(context, pos, colorComponents, alpha); - Renderer3d.stopRenderThroughWalls(); + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + Renderer3d.renderThroughWalls(); + renderFilled(context, pos, colorComponents, alpha); + Renderer3d.stopRenderThroughWalls(); + } } public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { - if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { + if (OcclusionCulling.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) { renderFilled(context, pos, colorComponents, alpha); } } - public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { + private static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) { Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), ONE); } - public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { - context.matrixStack().push(); - context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z); - BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents); - context.matrixStack().pop(); + private static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) { + if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, MAX_OVERWORLD_BUILD_HEIGHT, pos.getZ() + 1)) { + MatrixStack matrices = context.matrixStack(); + Vec3d camera = context.camera().getPos(); + + matrices.push(); + matrices.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); + + Tessellator tessellator = RenderSystem.renderThreadTesselator(); + BufferBuilder buffer = tessellator.getBuffer(); + VertexConsumerProvider.Immediate consumer = VertexConsumerProvider.immediate(buffer); + + BeaconBlockEntityRendererInvoker.renderBeam(matrices, consumer, context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents); + + consumer.draw(); + matrices.pop(); + } } public static void displayTitleAndPlaySound(int stayTicks, int fadeOutTicks, String titleKey, Formatting formatting) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java index 73ad468f..61f79ae1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java @@ -82,7 +82,7 @@ public class RenderUtils { e.getZ() - MathHelper.lerp(tickDelta, e.lastRenderZ, e.getZ())); } - public static Boolean pointExistsInArea(int x, int y, int x1, int y1, int x2, int y2) { + public static boolean pointExistsInArea(int x, int y, int x1, int y1, int x2, int y2) { return x >= x1 && x <= x2 && y >= y1 && y <= y2; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java new file mode 100644 index 00000000..e9a25fc3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java @@ -0,0 +1,48 @@ +package me.xmrvizzy.skyblocker.utils.culling; + +import com.logisticscraft.occlusionculling.OcclusionCullingInstance; +import com.logisticscraft.occlusionculling.cache.ArrayOcclusionCache; +import com.logisticscraft.occlusionculling.util.Vec3d; + +import me.xmrvizzy.skyblocker.utils.FrustumUtils; +import net.minecraft.client.MinecraftClient; + +public class OcclusionCulling { + private static final int TRACING_DISTANCE = 128; + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static OcclusionCullingInstance instance = null; + + // Reused objects to reduce allocation overhead + private static Vec3d cameraPos = new Vec3d(0, 0, 0); + private static Vec3d min = new Vec3d(0, 0, 0); + private static Vec3d max = new Vec3d(0, 0, 0); + + /** + * Initializes the occlusion culling instance + */ + public static void init() { + instance = new OcclusionCullingInstance(TRACING_DISTANCE, new WorldProvider(), new ArrayOcclusionCache(TRACING_DISTANCE), 2); + } + + private static void updateCameraPos() { + var camera = CLIENT.gameRenderer.getCamera().getPos(); + cameraPos.set(camera.x, camera.y, camera.z); + } + + /** + * This first checks checks if the bounding box is within the camera's FOV, if + * it is then it checks for whether it's occluded or not. + * + * @return A boolean representing whether the bounding box is fully visible or + * not. + */ + public static boolean isVisible(double x1, double y1, double z1, double x2, double y2, double z2) { + if (!FrustumUtils.isVisible(x1, y1, z1, x2, y2, z2)) return false; + + updateCameraPos(); + min.set(x1, y1, z1); + max.set(x2, y2, z2); + + return instance.isAABBVisible(min, max, cameraPos); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java new file mode 100644 index 00000000..47d92c1f --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java @@ -0,0 +1,29 @@ +package me.xmrvizzy.skyblocker.utils.culling; + +import com.logisticscraft.occlusionculling.DataProvider; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.math.BlockPos; + +public class WorldProvider implements DataProvider { + private final static MinecraftClient CLIENT = MinecraftClient.getInstance(); + private ClientWorld world = null; + + @Override + public boolean prepareChunk(int chunkX, int chunkZ) { + this.world = CLIENT.world; + return this.world != null; + } + + @Override + public boolean isOpaqueFullCube(int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + return this.world.getBlockState(pos).isOpaqueFullCube(this.world, pos); + } + + @Override + public void cleanup() { + this.world = null; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java new file mode 100644 index 00000000..c25e7f7a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java @@ -0,0 +1,4 @@ +/** + * Package dedicated to occlusion culling utilities + */ +package me.xmrvizzy.skyblocker.utils.culling; \ No newline at end of file -- cgit From 57328808e6cd8c2140f5a71b4c2605ac71e1b553 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:15:58 +0800 Subject: Add Shortcuts --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 2 + .../skyblocker/config/SkyblockerConfig.java | 13 ++ .../skyblocker/mixin/accessor/FrustumInvoker.java | 7 +- .../skyblocker/skyblock/shortcut/Shortcuts.java | 166 +++++++++++++++++++++ .../me/xmrvizzy/skyblocker/utils/FrustumUtils.java | 2 +- .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 37 +++-- 6 files changed, 213 insertions(+), 14 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java (limited to 'src/main/java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 3692db1b..0263f20c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -16,6 +16,7 @@ import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.skyblock.quicknav.QuickNav; import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; +import me.xmrvizzy.skyblocker.skyblock.shortcut.Shortcuts; import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr; import me.xmrvizzy.skyblocker.utils.*; @@ -76,6 +77,7 @@ public class SkyblockerMod implements ClientModInitializer { QuickNav.init(); DwarvenHud.init(); ChatMessageListener.init(); + Shortcuts.init(); DiscordRPCManager.init(); LividColor.init(); FishingHelper.init(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 04cfaea3..8c7d2f71 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -161,6 +161,10 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject() public FairySouls fairySouls = new FairySouls(); + @ConfigEntry.Category("shortcuts") + @ConfigEntry.Gui.CollapsibleObject() + public Shortcuts shortcuts = new Shortcuts(); + @ConfigEntry.Category("itemList") @ConfigEntry.Gui.CollapsibleObject() public ItemList itemList = new ItemList(); @@ -264,6 +268,15 @@ public class SkyblockerConfig implements ConfigData { public boolean enableFairySoulsHelper = false; } + public static class Shortcuts { + @ConfigEntry.Gui.Tooltip() + public boolean enableShortcuts = true; + @ConfigEntry.Gui.Tooltip() + public boolean enableCommandShortcuts = true; + @ConfigEntry.Gui.Tooltip() + public boolean enableCommandArgShortcuts = true; + } + public static class Hitbox { public boolean oldFarmlandHitbox = true; public boolean oldLeverHitbox = false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java index 108a7344..3cde115e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/accessor/FrustumInvoker.java @@ -1,15 +1,14 @@ package me.xmrvizzy.skyblocker.mixin.accessor; -import me.xmrvizzy.skyblocker.utils.FrustumUtils; import net.minecraft.client.render.Frustum; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; /** - * Use {@link FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! + * Use {@link me.xmrvizzy.skyblocker.utils.FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! */ @Mixin(Frustum.class) public interface FrustumInvoker { - @Invoker("isVisible") - boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); + @Invoker + boolean invokeIsVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java new file mode 100644 index 00000000..dcd98e79 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java @@ -0,0 +1,166 @@ +package me.xmrvizzy.skyblocker.skyblock.shortcut; + +import com.mojang.brigadier.Command; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents; +import net.minecraft.text.Text; + +import java.util.HashMap; +import java.util.Map; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class Shortcuts { + public static final Map commands = new HashMap<>(); + public static final Map commandArgs = new HashMap<>(); + + public static void init() { + commands.put("/s", "/skyblock"); + commands.put("/sk", "/skyblock"); + commands.put("/sky", "/skyblock"); + commands.put("/i", "/is"); + commands.put("/h", "/hub"); + commands.put("/hu", "/hub"); + + commands.put("/d", "/warp dungeon_hub"); + commands.put("/dn", "/warp dungeon_hub"); + commands.put("/dun", "/warp dungeon_hub"); + commands.put("/dungeon", "/warp dungeon_hub"); + + commands.put("/bl", "/warp nether"); + commands.put("/blazing", "/warp nether"); + commands.put("/fortress", "/warp nether"); + commands.put("/crimson", "/warp nether"); + commands.put("/isles", "/warp nether"); + commands.put("/ci", "/warp nether"); + commands.put("/crimson isles", "/warp nether"); + commands.put("/n", "/warp nether"); + commands.put("/nether", "/warp nether"); + + commands.put("/deep", "/warp deep"); + commands.put("/cavern", "/warp deep"); + commands.put("/caverns", "/warp deep"); + + commands.put("/dw", "/warp mines"); + commands.put("/dwarven", "/warp mines"); + commands.put("/mi", "/warp mines"); + commands.put("/mines", "/warp mines"); + + commands.put("/fo", "/warp forge"); + commands.put("/for", "/warp forge"); + commands.put("/forge", "/warp forge"); + + commands.put("/cry", "/warp crystals"); + commands.put("/crystal", "/warp crystals"); + commands.put("/ho", "/warp crystals"); + commands.put("/hollows", "/warp crystals"); + commands.put("/ch", "/warp crystals"); + commands.put("/crystal hollows", "/warp crystals"); + + commands.put("/ga", "/warp garden"); + commands.put("/garden", "/warp garden"); + commands.put("/go", "/warp gold"); + commands.put("/gold", "/warp gold"); + + commands.put("/des", "/warp desert"); + commands.put("/desert", "/warp desert"); + commands.put("/mu", "/warp desert"); + commands.put("/mushroom", "/warp desert"); + + commands.put("/sp", "/warp spider"); + commands.put("/spider", "/warp spider"); + commands.put("/spiders", "/warp spider"); + + commands.put("/ba", "/warp barn"); + commands.put("/barn", "/warp barn"); + + commands.put("/e", "/warp end"); + commands.put("/end", "/warp end"); + + commands.put("/park", "/warp park"); + + commands.put("/castle", "/warp castle"); + commands.put("/museum", "/warp museum"); + commands.put("/da", "/warp da"); + commands.put("/dark", "/warp da"); + commands.put("/crypt", "/warp crypt"); + commands.put("/crypts", "/warp crypt"); + commands.put("/nest", "/warp nest"); + commands.put("/magma", "/warp magma"); + commands.put("/void", "/warp void"); + commands.put("/drag", "/warp drag"); + commands.put("/dragon", "/warp drag"); + commands.put("/jungle", "/warp jungle"); + commands.put("/howl", "/warp howl"); + + commands.put("/ca", "/chat all"); + commands.put("/cp", "/chat party"); + commands.put("/cg", "/chat guild"); + commands.put("/co", "/chat officer"); + commands.put("/cc", "/chat coop"); + + commandArgs.put("/m", "/msg"); + + commandArgs.put("/pa", "/p accept"); + commands.put("/pv", "/p leave"); + commands.put("/pd", "/p disband"); + commands.put("/rp", "/reparty"); + commands.put("/pr", "/reparty"); + + commandArgs.put("/v", "/visit"); + commands.put("/vp", "/visit portalhub"); + commands.put("/visit p", "/visit portalhub"); + + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { + for (String key : commands.keySet()) { + if (key.startsWith("/")) { + dispatcher.register(literal(key.substring(1))); + } + } + for (String key : commandArgs.keySet()) { + if (key.startsWith("/")) { + dispatcher.register(literal(key.substring(1))); + } + } + dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("help").executes(context -> { + FabricClientCommandSource source = context.getSource(); + String status = SkyblockerConfig.get().general.shortcuts.enableShortcuts && SkyblockerConfig.get().general.shortcuts.enableCommandShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)"; + source.sendFeedback(Text.of("§e§lSkyblocker §fCommand Shortcuts" + status)); + for (Map.Entry command : commands.entrySet()) { + source.sendFeedback(Text.of("§7" + command.getKey() + " §f→ §7" + command.getValue())); + } + status = SkyblockerConfig.get().general.shortcuts.enableShortcuts && SkyblockerConfig.get().general.shortcuts.enableCommandArgShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)"; + source.sendFeedback(Text.of("§e§lSkyblocker §fCommand Argument Shortcuts" + status)); + for (Map.Entry commandArg : commandArgs.entrySet()) { + source.sendFeedback(Text.of("§7" + commandArg.getKey() + " §f→ §7" + commandArg.getValue())); + } + source.sendFeedback(Text.of("§e§lSkyblocker §fCommands")); + for (String command : dispatcher.getSmartUsage(dispatcher.getRoot().getChild(SkyblockerMod.NAMESPACE), source).values()) { + source.sendFeedback(Text.of("§7/" + SkyblockerMod.NAMESPACE + " " + command)); + } + return Command.SINGLE_SUCCESS; + }))); + }); + ClientSendMessageEvents.MODIFY_COMMAND.register(command -> { + if (Utils.isOnHypixel() && SkyblockerConfig.get().general.shortcuts.enableShortcuts) { + command = '/' + command; + if (SkyblockerConfig.get().general.shortcuts.enableCommandShortcuts) { + command = commands.getOrDefault(command, command); + } + if (SkyblockerConfig.get().general.shortcuts.enableCommandArgShortcuts) { + String[] messageArgs = command.split(" "); + for (int i = 0; i < messageArgs.length; i++) { + messageArgs[i] = commandArgs.getOrDefault(messageArgs[i], messageArgs[i]); + } + command = String.join(" ", messageArgs); + } + return command.substring(1); + } + return command; + }); + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java index 9ea90c16..565bd7a8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java @@ -17,6 +17,6 @@ public class FrustumUtils { } public static boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { - return ((FrustumInvoker) getFrustum()).isVisible(minX, minY, minZ, maxX, maxY, maxZ); + return ((FrustumInvoker) getFrustum()).invokeIsVisible(minX, minY, minZ, maxX, maxY, maxZ); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 35dfd368..71e3b44f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -29,6 +29,7 @@ import java.util.List; */ public class Utils { private static final String PROFILE_PREFIX = "Profile: "; + private static boolean isOnHypixel = false; private static boolean isOnSkyblock = false; private static boolean isInDungeons = false; private static boolean isInjected = false; @@ -45,6 +46,10 @@ public class Utils { private static boolean sentLocRaw = false; private static long lastLocRaw = 0; + public static boolean isOnHypixel() { + return isOnHypixel; + } + public static boolean isOnSkyblock() { return isOnSkyblock; } @@ -126,21 +131,35 @@ public class Utils { String string = sidebar.toString(); if (sidebar.isEmpty()) return; - if (sidebar.get(0).contains("SKYBLOCK") || sidebar.get(0).contains("SKIBLOCK")) { - if (!isOnSkyblock) { - if (!isInjected) { - isInjected = true; - ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); + if (sidebar.get(sidebar.size() - 1).equals("www.hypixel.net")) { + if (!isOnHypixel) { + isOnHypixel = true; + } + if (sidebar.get(0).contains("SKYBLOCK") || sidebar.get(0).contains("SKIBLOCK")) { + if (!isOnSkyblock) { + if (!isInjected) { + isInjected = true; + ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); + } + isOnSkyblock = true; + SkyblockEvents.JOIN.invoker().onSkyblockJoin(); } - isOnSkyblock = true; - SkyblockEvents.JOIN.invoker().onSkyblockJoin(); + } else { + leaveSkyblock(); } - } else if (isOnSkyblock) { + isInDungeons = isOnSkyblock && string.contains("The Catacombs"); + } else if (isOnHypixel) { + isOnHypixel = false; + leaveSkyblock(); + } + } + + private static void leaveSkyblock() { + if (isOnSkyblock) { isOnSkyblock = false; isInDungeons = false; SkyblockEvents.LEAVE.invoker().onSkyblockLeave(); } - isInDungeons = isOnSkyblock && string.contains("The Catacombs"); } public static String getLocation() { -- cgit From 931ea3749ba94d1b7de4577722246df1a4e9cced Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Thu, 29 Jun 2023 20:47:50 +0800 Subject: Add shortcuts loading and saving --- .../skyblocker/skyblock/shortcut/Shortcuts.java | 143 ++++++++++++++------- 1 file changed, 100 insertions(+), 43 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java index dcd98e79..f6483e52 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java @@ -1,24 +1,60 @@ package me.xmrvizzy.skyblocker.skyblock.shortcut; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.command.CommandRegistryAccess; import net.minecraft.text.Text; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.*; +import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.CompletableFuture; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; public class Shortcuts { + private static final Logger LOGGER = LoggerFactory.getLogger(Shortcuts.class); + private static final File SHORTCUTS_FILE = SkyblockerMod.CONFIG_DIR.resolve("shortcuts.json").toFile(); + private static CompletableFuture shortcutsLoaded; public static final Map commands = new HashMap<>(); public static final Map commandArgs = new HashMap<>(); public static void init() { + shortcutsLoaded = CompletableFuture.runAsync(Shortcuts::loadShortcuts); + ClientLifecycleEvents.CLIENT_STOPPING.register(Shortcuts::saveShortcuts); + ClientCommandRegistrationCallback.EVENT.register(Shortcuts::registerCommands); + ClientSendMessageEvents.MODIFY_COMMAND.register(Shortcuts::modifyCommand); + } + + private static void loadShortcuts() { + try (BufferedReader reader = new BufferedReader(new FileReader(SHORTCUTS_FILE))) { + Type shortcutsType = new TypeToken>>() {}.getType(); + Map> shortcuts = SkyblockerMod.GSON.fromJson(reader, shortcutsType); + commands.putAll(shortcuts.get("commands")); + commandArgs.putAll(shortcuts.get("commandArgs")); + LOGGER.info("[Skyblocker] Loaded {} command shortcuts and {} command argument shortcuts", commands.size(), commandArgs.size()); + } catch (FileNotFoundException e) { + registerDefaultShortcuts(); + LOGGER.warn("[Skyblocker] Shortcuts file not found, using default shortcuts. This is normal when using for the first time.", e); + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to load shortcuts file", e); + } + } + + private static void registerDefaultShortcuts() { commands.put("/s", "/skyblock"); commands.put("/sk", "/skyblock"); commands.put("/sky", "/skyblock"); @@ -114,53 +150,74 @@ public class Shortcuts { commandArgs.put("/v", "/visit"); commands.put("/vp", "/visit portalhub"); commands.put("/visit p", "/visit portalhub"); + } - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { - for (String key : commands.keySet()) { - if (key.startsWith("/")) { - dispatcher.register(literal(key.substring(1))); - } + private static void saveShortcuts(MinecraftClient client) { + JsonObject shortcutsJson = new JsonObject(); + shortcutsJson.add("commands", SkyblockerMod.GSON.toJsonTree(commands)); + shortcutsJson.add("commandArgs", SkyblockerMod.GSON.toJsonTree(commandArgs)); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(SHORTCUTS_FILE))) { + SkyblockerMod.GSON.toJson(shortcutsJson, writer); + LOGGER.info("[Skyblocker] Saved {} command shortcuts and {} command argument shortcuts", commands.size(), commandArgs.size()); + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to save shortcuts file", e); + } + } + + private static void registerCommands(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { + for (String key : commands.keySet()) { + if (key.startsWith("/")) { + dispatcher.register(literal(key.substring(1))); } - for (String key : commandArgs.keySet()) { - if (key.startsWith("/")) { - dispatcher.register(literal(key.substring(1))); - } + } + for (String key : commandArgs.keySet()) { + if (key.startsWith("/")) { + dispatcher.register(literal(key.substring(1))); } - dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("help").executes(context -> { - FabricClientCommandSource source = context.getSource(); - String status = SkyblockerConfig.get().general.shortcuts.enableShortcuts && SkyblockerConfig.get().general.shortcuts.enableCommandShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)"; - source.sendFeedback(Text.of("§e§lSkyblocker §fCommand Shortcuts" + status)); - for (Map.Entry command : commands.entrySet()) { - source.sendFeedback(Text.of("§7" + command.getKey() + " §f→ §7" + command.getValue())); - } - status = SkyblockerConfig.get().general.shortcuts.enableShortcuts && SkyblockerConfig.get().general.shortcuts.enableCommandArgShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)"; - source.sendFeedback(Text.of("§e§lSkyblocker §fCommand Argument Shortcuts" + status)); - for (Map.Entry commandArg : commandArgs.entrySet()) { - source.sendFeedback(Text.of("§7" + commandArg.getKey() + " §f→ §7" + commandArg.getValue())); - } - source.sendFeedback(Text.of("§e§lSkyblocker §fCommands")); - for (String command : dispatcher.getSmartUsage(dispatcher.getRoot().getChild(SkyblockerMod.NAMESPACE), source).values()) { - source.sendFeedback(Text.of("§7/" + SkyblockerMod.NAMESPACE + " " + command)); - } - return Command.SINGLE_SUCCESS; - }))); - }); - ClientSendMessageEvents.MODIFY_COMMAND.register(command -> { - if (Utils.isOnHypixel() && SkyblockerConfig.get().general.shortcuts.enableShortcuts) { - command = '/' + command; - if (SkyblockerConfig.get().general.shortcuts.enableCommandShortcuts) { - command = commands.getOrDefault(command, command); - } - if (SkyblockerConfig.get().general.shortcuts.enableCommandArgShortcuts) { - String[] messageArgs = command.split(" "); - for (int