From a54bbeb125ae9461f505bf6d01565c693da43c04 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Sun, 10 Sep 2023 03:45:15 -0400
Subject: Rare Drop Special Effect!

---
 .../skyblock/special/SpecialEffects.java           | 100 +++++++++++++++++++++
 1 file changed, 100 insertions(+)
 create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java

(limited to 'src/main/java/me/xmrvizzy/skyblocker/skyblock')

diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
new file mode 100644
index 00000000..d2d26ae2
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
@@ -0,0 +1,100 @@
+package me.xmrvizzy.skyblocker.skyblock.special;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.mojang.blaze3d.systems.RenderSystem;
+
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.utils.Utils;
+import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.enchantment.Enchantments;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.nbt.StringNbtReader;
+import net.minecraft.particle.ParticleTypes;
+import net.minecraft.text.Text;
+
+public class SpecialEffects {
+	private static final Logger LOGGER = LoggerFactory.getLogger(SpecialEffects.class);
+	private static final Pattern DROP_PATTERN = Pattern.compile("(?:\\[[A-Z+]+\\] )?(?<player>[A-Za-z0-9_]+) unlocked (?<item>.+)!");
+
+	public static void init() {
+		ClientReceiveMessageEvents.GAME.register(SpecialEffects::displayRareDropEffect);
+	}
+	
+	private static void displayRareDropEffect(Text message, boolean overlay) {
+		//We don't check if we're in dungeons because that check doesn't work in m7 which defeats the point of this
+		//It might also allow it to work with Croesus
+		if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.specialEffects.rareDungeonDropEffects) {
+			try {
+				String stringForm = message.getString();
+				Matcher matcher = DROP_PATTERN.matcher(stringForm);
+				
+				if (matcher.matches()) {
+					MinecraftClient client = MinecraftClient.getInstance();
+					String player = matcher.group("player");
+					
+					if (player.equals(client.getSession().getUsername())) {
+						ItemStack stack = getStackFromName(matcher.group("item"));
+						
+						if (!stack.isEmpty()) {
+							if (RenderSystem.isOnRenderThread()) {
+								client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30);
+								client.gameRenderer.showFloatingItem(stack);
+							} else {
+								RenderSystem.recordRenderCall(() -> {
+									client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30);
+									client.gameRenderer.showFloatingItem(stack);
+								});
+							}
+						}
+					}
+				}
+			} catch (Exception e) { //Incase there's a regex failure or something else bad happens
+				LOGGER.error("[Skyblocker Special Effects] An unexpected exception was encountered: ", e);
+			}
+		}
+	}
+	
+	private static ItemStack getStackFromName(String itemName) {
+		ItemStack necronHandle = new ItemStack(Items.STICK);
+		necronHandle.addEnchantment(Enchantments.PROTECTION, 1);
+		
+		ItemStack scroll = new ItemStack(Items.WRITABLE_BOOK);
+		scroll.addEnchantment(Enchantments.PROTECTION, 1);
+		
+		ItemStack tier5Skull = ItemStack.EMPTY;
+		ItemStack fifthStar = ItemStack.EMPTY;
+		
+		try {
+			tier5Skull = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-1613868903,-527154034,-1445577520,748807544],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEwZjlmMTA4NWQ0MDcxNDFlYjc3NjE3YTRhYmRhYWEwOGQ4YWYzM2I5NjAyMDBmZThjMTI2YzFkMTQ0NTY4MiJ9fX0=\"}]}}}}"));
+			fifthStar = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1904417095,756174249,-1302927470,1407004198],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzFjODA0MjUyN2Y4MWM4ZTI5M2UyODEwMTEzNDg5ZjQzOTRjYzZlZmUxNWQxYWZhYzQzMTU3MWM3M2I2MmRjNCJ9fX0=\"}]}}}}"));
+		} catch (Exception e) {
+			LOGGER.error("[Skyblocker Special Effects] Failed to parse NBT for a player head!");
+		}
+		
+		return switch (itemName) {
+			//M7
+			case "Necron Dye" -> new ItemStack(Items.ORANGE_DYE);
+			case "Dark Claymore" -> new ItemStack(Items.STONE_SWORD);
+			case "Necron's Handle" -> necronHandle;
+			case "Shiny Necron's Handle" -> necronHandle;
+			case "Enchanted Book (Thunderlord VII)" -> new ItemStack(Items.ENCHANTED_BOOK);
+			case "Master Skull - Tier 5" -> tier5Skull;
+			case "Shadow Warp" -> scroll;
+			case "Wither Shield" -> scroll;
+			case "Implosion" -> scroll;
+			case "Fifth Master Star" -> fifthStar;
+			
+			//M6
+			case "Giant's Sword" -> new ItemStack(Items.IRON_SWORD);
+			
+			default -> ItemStack.EMPTY;
+		};
+	}
+}
-- 
cgit 


From fd8770f38da9cafbdacaa17d1b9f7a071a2b3c4e Mon Sep 17 00:00:00 2001
From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Date: Sun, 10 Sep 2023 12:25:08 -0400
Subject: Refactor SpecialEffects

---
 .../skyblock/special/SpecialEffects.java           | 74 ++++++++++------------
 1 file changed, 35 insertions(+), 39 deletions(-)

(limited to 'src/main/java/me/xmrvizzy/skyblocker/skyblock')

diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
index d2d26ae2..a3d7e5c5 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
@@ -1,13 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.special;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import com.mojang.blaze3d.systems.RenderSystem;
-
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -18,15 +11,37 @@ import net.minecraft.item.Items;
 import net.minecraft.nbt.StringNbtReader;
 import net.minecraft.particle.ParticleTypes;
 import net.minecraft.text.Text;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class SpecialEffects {
 	private static final Logger LOGGER = LoggerFactory.getLogger(SpecialEffects.class);
-	private static final Pattern DROP_PATTERN = Pattern.compile("(?:\\[[A-Z+]+\\] )?(?<player>[A-Za-z0-9_]+) unlocked (?<item>.+)!");
+	private static final Pattern DROP_PATTERN = Pattern.compile("(?:\\[[A-Z+]+] )?(?<player>[A-Za-z0-9_]+) unlocked (?<item>.+)!");
+	private static final ItemStack NECRON_HANDLE = new ItemStack(Items.STICK);
+	private static final ItemStack SCROLL = new ItemStack(Items.WRITABLE_BOOK);
+	private static ItemStack TIER_5_SKULL;
+	private static ItemStack FIFTH_STAR;
+
+	static {
+		NECRON_HANDLE.addEnchantment(Enchantments.PROTECTION, 1);
+		SCROLL.addEnchantment(Enchantments.PROTECTION, 1);
+		try {
+			TIER_5_SKULL = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-1613868903,-527154034,-1445577520,748807544],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEwZjlmMTA4NWQ0MDcxNDFlYjc3NjE3YTRhYmRhYWEwOGQ4YWYzM2I5NjAyMDBmZThjMTI2YzFkMTQ0NTY4MiJ9fX0=\"}]}}}}"));
+			FIFTH_STAR = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1904417095,756174249,-1302927470,1407004198],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzFjODA0MjUyN2Y4MWM4ZTI5M2UyODEwMTEzNDg5ZjQzOTRjYzZlZmUxNWQxYWZhYzQzMTU3MWM3M2I2MmRjNCJ9fX0=\"}]}}}}"));
+		} catch (Exception e) {
+			TIER_5_SKULL = ItemStack.EMPTY;
+			FIFTH_STAR = ItemStack.EMPTY;
+			LOGGER.error("[Skyblocker Special Effects] Failed to parse NBT for a player head!", e);
+		}
+	}
 
 	public static void init() {
 		ClientReceiveMessageEvents.GAME.register(SpecialEffects::displayRareDropEffect);
 	}
-	
+
 	private static void displayRareDropEffect(Text message, boolean overlay) {
 		//We don't check if we're in dungeons because that check doesn't work in m7 which defeats the point of this
 		//It might also allow it to work with Croesus
@@ -34,14 +49,14 @@ public class SpecialEffects {
 			try {
 				String stringForm = message.getString();
 				Matcher matcher = DROP_PATTERN.matcher(stringForm);
-				
+
 				if (matcher.matches()) {
 					MinecraftClient client = MinecraftClient.getInstance();
 					String player = matcher.group("player");
-					
+
 					if (player.equals(client.getSession().getUsername())) {
 						ItemStack stack = getStackFromName(matcher.group("item"));
-						
+
 						if (!stack.isEmpty()) {
 							if (RenderSystem.isOnRenderThread()) {
 								client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30);
@@ -55,45 +70,26 @@ public class SpecialEffects {
 						}
 					}
 				}
-			} catch (Exception e) { //Incase there's a regex failure or something else bad happens
+			} catch (Exception e) { //In case there's a regex failure or something else bad happens
 				LOGGER.error("[Skyblocker Special Effects] An unexpected exception was encountered: ", e);
 			}
 		}
 	}
-	
+
 	private static ItemStack getStackFromName(String itemName) {
-		ItemStack necronHandle = new ItemStack(Items.STICK);
-		necronHandle.addEnchantment(Enchantments.PROTECTION, 1);
-		
-		ItemStack scroll = new ItemStack(Items.WRITABLE_BOOK);
-		scroll.addEnchantment(Enchantments.PROTECTION, 1);
-		
-		ItemStack tier5Skull = ItemStack.EMPTY;
-		ItemStack fifthStar = ItemStack.EMPTY;
-		
-		try {
-			tier5Skull = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-1613868903,-527154034,-1445577520,748807544],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEwZjlmMTA4NWQ0MDcxNDFlYjc3NjE3YTRhYmRhYWEwOGQ4YWYzM2I5NjAyMDBmZThjMTI2YzFkMTQ0NTY4MiJ9fX0=\"}]}}}}"));
-			fifthStar = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1904417095,756174249,-1302927470,1407004198],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzFjODA0MjUyN2Y4MWM4ZTI5M2UyODEwMTEzNDg5ZjQzOTRjYzZlZmUxNWQxYWZhYzQzMTU3MWM3M2I2MmRjNCJ9fX0=\"}]}}}}"));
-		} catch (Exception e) {
-			LOGGER.error("[Skyblocker Special Effects] Failed to parse NBT for a player head!");
-		}
-		
 		return switch (itemName) {
 			//M7
 			case "Necron Dye" -> new ItemStack(Items.ORANGE_DYE);
 			case "Dark Claymore" -> new ItemStack(Items.STONE_SWORD);
-			case "Necron's Handle" -> necronHandle;
-			case "Shiny Necron's Handle" -> necronHandle;
+			case "Necron's Handle", "Shiny Necron's Handle" -> NECRON_HANDLE;
 			case "Enchanted Book (Thunderlord VII)" -> new ItemStack(Items.ENCHANTED_BOOK);
-			case "Master Skull - Tier 5" -> tier5Skull;
-			case "Shadow Warp" -> scroll;
-			case "Wither Shield" -> scroll;
-			case "Implosion" -> scroll;
-			case "Fifth Master Star" -> fifthStar;
-			
+			case "Master Skull - Tier 5" -> TIER_5_SKULL;
+			case "Shadow Warp", "Wither Shield", "Implosion" -> SCROLL;
+			case "Fifth Master Star" -> FIFTH_STAR;
+
 			//M6
 			case "Giant's Sword" -> new ItemStack(Items.IRON_SWORD);
-			
+
 			default -> ItemStack.EMPTY;
 		};
 	}
-- 
cgit