From 1a5e4dfaaf7607c302c9e23f7cbb6d4949c93d45 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Fri, 17 Oct 2025 18:26:20 -0400 Subject: [PATCH 01/14] =?UTF-8?q?Set=20gradlew=E2=80=99s=20executable=20bi?= =?UTF-8?q?t=20for=20Linux=20and=20macOS=20developers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From d64b218915e39542ff9a251172716e478dd179de Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 19 Oct 2025 15:09:54 -0400 Subject: [PATCH 02/14] SkillItemTier: make fields final --- .../mine_and_slash/mmorpg/MMORPG.java | 1 + .../com/robertx22/temp/SkillItemTier.java | 20 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java b/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java index 1e12af2a3..5c2869a9f 100644 --- a/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java +++ b/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java @@ -1,5 +1,6 @@ package com.robertx22.mine_and_slash.mmorpg; +import com.google.gson.Gson; import com.robertx22.addons.dungeon_realm.DungeonAddonEvents; import com.robertx22.addons.orbs_of_crafting.currency.reworked.addon.OrbAddonEvents; import com.robertx22.library_of_exile.events.base.EventConsumer; diff --git a/src/main/java/com/robertx22/temp/SkillItemTier.java b/src/main/java/com/robertx22/temp/SkillItemTier.java index fd4d11804..1b5eb2950 100644 --- a/src/main/java/com/robertx22/temp/SkillItemTier.java +++ b/src/main/java/com/robertx22/temp/SkillItemTier.java @@ -117,15 +117,15 @@ public SkillItemTier higherTier() { } - public LevelRange levelRange; - public float lvl_req; - public String word; - public String rar; - public int tier; - public float statMulti; - public ChatFormatting format; - public int durationSeconds; - public int repairDurab; - public float percent_healed; + public final LevelRange levelRange; + public final float lvl_req; + public final String word; + public final String rar; + public final int tier; + public final float statMulti; + public final ChatFormatting format; + public final int durationSeconds; + public final int repairDurab; + public final float percent_healed; } \ No newline at end of file From d0895892091eeb1f6eeab827c3e2d95991e50285 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 19 Oct 2025 15:16:20 -0400 Subject: [PATCH 03/14] Use EnumMap for mapping between `SkillItemTier` and `RegObj` --- .../database/data/profession/all/ProfessionMatItems.java | 7 ++++--- .../database/data/profession/all/Professions.java | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java index 3816c48bc..6d9fd226d 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java @@ -11,19 +11,20 @@ import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.world.item.Item; +import java.util.EnumMap; import java.util.HashMap; import java.util.Map; public class ProfessionMatItems { - public static HashMap>> TIERED_MAIN_MATS = new HashMap<>(); + public static Map>> TIERED_MAIN_MATS = new HashMap<>(); public static void init() { for (String prof : Professions.ALL) { - TIERED_MAIN_MATS.put(prof, new HashMap<>()); + TIERED_MAIN_MATS.put(prof, new EnumMap<>(SkillItemTier.class)); } for (SkillItemTier tier : SkillItemTier.values()) { @@ -37,7 +38,7 @@ public static void init() { } public static void addDownRankRecipes() { - for (Map.Entry>> en : TIERED_MAIN_MATS.entrySet()) { + for (Map.Entry>> en : TIERED_MAIN_MATS.entrySet()) { for (Map.Entry> e : en.getValue().entrySet()) { if (e.getKey().tier != SkillItemTier.TIER0.tier) { diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/Professions.java b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/Professions.java index 295edb732..7a860b406 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/Professions.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/Professions.java @@ -205,7 +205,7 @@ public Builder blockTag(SkillItemTier tier, int exp, TagKey... blocks) { return this; } - public Builder dropTiered(HashMap> map, float chancemulti) { + public Builder dropTiered(Map> map, float chancemulti) { for (Map.Entry> en : map.entrySet()) { Item item = en.getValue().get(); From d598404cf479d36889544dad470167fa6905bf47 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 19 Oct 2025 15:18:27 -0400 Subject: [PATCH 04/14] ProfessionMatItems#init: hoist map lookups outside of loop --- .../data/profession/all/ProfessionMatItems.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java index 6d9fd226d..bda9a40cd 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/all/ProfessionMatItems.java @@ -27,12 +27,17 @@ public static void init() { TIERED_MAIN_MATS.put(prof, new EnumMap<>(SkillItemTier.class)); } + var mining = TIERED_MAIN_MATS.get(Professions.MINING); + var farming = TIERED_MAIN_MATS.get(Professions.FARMING); + var husbandry = TIERED_MAIN_MATS.get(Professions.HUSBANDRY); + var fishing = TIERED_MAIN_MATS.get(Professions.FISHING); + for (SkillItemTier tier : SkillItemTier.values()) { - TIERED_MAIN_MATS.get(Professions.MINING).put(tier, Def.item("material/mining/" + tier.tier, () -> new ProfTierMatItem(Professions.MINING, tier, "Ore"))); - TIERED_MAIN_MATS.get(Professions.FARMING).put(tier, Def.item("material/farming/" + tier.tier, () -> new ProfTierMatItem(Professions.FARMING, tier, "Produce"))); - TIERED_MAIN_MATS.get(Professions.HUSBANDRY).put(tier, Def.item("material/meat/" + tier.tier, () -> new ProfTierMatItem(Professions.HUSBANDRY, tier, "Raw Meat"))); - TIERED_MAIN_MATS.get(Professions.FISHING).put(tier, Def.item("material/fishing/" + tier.tier, () -> new ProfTierMatItem(Professions.FISHING, tier, "Raw Fish"))); + mining.put(tier, Def.item("material/mining/" + tier.tier, () -> new ProfTierMatItem(Professions.MINING, tier, "Ore"))); + farming.put(tier, Def.item("material/farming/" + tier.tier, () -> new ProfTierMatItem(Professions.FARMING, tier, "Produce"))); + husbandry.put(tier, Def.item("material/meat/" + tier.tier, () -> new ProfTierMatItem(Professions.HUSBANDRY, tier, "Raw Meat"))); + fishing.put(tier, Def.item("material/fishing/" + tier.tier, () -> new ProfTierMatItem(Professions.FISHING, tier, "Raw Fish"))); } } From e1492c29742000c80c40bf443e435dfbdc553c2b Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 19 Oct 2025 15:21:09 -0400 Subject: [PATCH 05/14] Remove stray import --- src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java b/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java index 5c2869a9f..1e12af2a3 100644 --- a/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java +++ b/src/main/java/com/robertx22/mine_and_slash/mmorpg/MMORPG.java @@ -1,6 +1,5 @@ package com.robertx22.mine_and_slash.mmorpg; -import com.google.gson.Gson; import com.robertx22.addons.dungeon_realm.DungeonAddonEvents; import com.robertx22.addons.orbs_of_crafting.currency.reworked.addon.OrbAddonEvents; import com.robertx22.library_of_exile.events.base.EventConsumer; From 8ee9c9b41bf0ea560d662f450012a806e1f8d0a8 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Fri, 24 Oct 2025 01:56:59 -0400 Subject: [PATCH 06/14] BaseGearType: generify tags field --- .../database/data/gear_types/bases/BaseGearType.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/gear_types/bases/BaseGearType.java b/src/main/java/com/robertx22/mine_and_slash/database/data/gear_types/bases/BaseGearType.java index 987a46c95..8174c00e9 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/gear_types/bases/BaseGearType.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/gear_types/bases/BaseGearType.java @@ -17,6 +17,7 @@ import com.robertx22.mine_and_slash.saveclasses.gearitem.gear_bases.StatRequirement; import com.robertx22.mine_and_slash.tags.TagList; import com.robertx22.mine_and_slash.tags.all.SlotTags; +import com.robertx22.mine_and_slash.tags.imp.SlotTag; import com.robertx22.mine_and_slash.uncommon.enumclasses.PlayStyle; import com.robertx22.mine_and_slash.uncommon.enumclasses.WeaponTypes; import com.robertx22.mine_and_slash.uncommon.interfaces.IAutoLocName; @@ -45,7 +46,7 @@ public final class BaseGearType implements IAutoLocName, JsonExileRegistry base_stats = new ArrayList<>(); public String weapon_type = WeaponTypes.none.id; - public TagList tags = new TagList(); + public TagList tags = new TagList<>(); public List possible_items = new ArrayList<>(); @@ -94,7 +95,7 @@ public WeaponTypes weaponType() { return ExileDB.WeaponTypes().get(weapon_type); } - public TagList getTags() { + public TagList getTags() { return tags; } From 27f27b58b894bfca5a5dd362c3a6dc321cfc3579 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 26 Oct 2025 13:55:21 -0400 Subject: [PATCH 07/14] AllyOrEnemy: avoid serializing entity data in NoAI check --- .../uncommon/utilityclasses/AllyOrEnemy.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java b/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java index 0e0d0f6b7..8b7ea75e2 100644 --- a/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java +++ b/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java @@ -3,10 +3,7 @@ import com.robertx22.mine_and_slash.config.forge.ServerContainer; import com.robertx22.mine_and_slash.database.data.spells.summons.entity.SummonEntity; import com.robertx22.mine_and_slash.uncommon.datasaving.Load; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.NeutralMob; -import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; import java.util.List; @@ -197,7 +194,7 @@ public boolean is(Entity caster, LivingEntity target) { if (EntityFinder.isTamedByAlly(p, target)) { return false; } - if (target.serializeNBT().contains("NoAI")) { + if (target instanceof Mob mob && mob.isNoAi()) { return false; } // Check for villagers and other NPCs From 74751ca2d25a805f9d7ee1aa06332be47c45fe72 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 26 Oct 2025 14:00:07 -0400 Subject: [PATCH 08/14] AllyOrEnemy: use pattern matching to avoid casts --- .../uncommon/utilityclasses/AllyOrEnemy.java | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java b/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java index 8b7ea75e2..aab0bfd5d 100644 --- a/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java +++ b/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java @@ -67,7 +67,7 @@ public List getMatchingEntities(List list, Entity @Override public boolean is(Entity caster, LivingEntity target) { - return enemies.is(caster, target) == false; + return !enemies.is(caster, target); } @Override @@ -143,19 +143,15 @@ public boolean includesCaster() { @Override public boolean is(Entity caster, LivingEntity target) { - if (caster instanceof Player p) { - if (EntityFinder.isTamedByAlly(p, target)) { + if (caster instanceof Player casterPlayer) { + if (EntityFinder.isTamedByAlly(casterPlayer, target)) { return false; } - if (target instanceof Player) { + if (target instanceof Player targetPlayer) { if (!caster.level().getServer().isPvpAllowed()) { return false; } - if (target == caster || TeamUtils.areOnSameTeam((Player) caster, (Player) target, false)) { - return false; - } else { - return true; - } + return target != caster && !TeamUtils.areOnSameTeam(casterPlayer, targetPlayer, false); } } else { @@ -190,8 +186,8 @@ public boolean includesCaster() { @Override public boolean is(Entity caster, LivingEntity target) { - if (caster instanceof Player p) { - if (EntityFinder.isTamedByAlly(p, target)) { + if (caster instanceof Player casterPlayer) { + if (EntityFinder.isTamedByAlly(casterPlayer, target)) { return false; } if (target instanceof Mob mob && mob.isNoAi()) { @@ -205,15 +201,11 @@ public boolean is(Entity caster, LivingEntity target) { if (target instanceof net.minecraft.world.entity.npc.AbstractVillager) { return false; }*/ - if (target instanceof Player) { + if (target instanceof Player targetPlayer) { if (!caster.level().getServer().isPvpAllowed()) { return false; } - if (target == caster || TeamUtils.areOnSameTeam((Player) caster, (Player) target, false)) { - return false; - } else { - return true; - } + return target != caster && !TeamUtils.areOnSameTeam(casterPlayer, targetPlayer, false); } } else { @@ -263,6 +255,9 @@ public boolean includesCaster() { public abstract List getMatchingEntities(List list, Entity caster); + /** + * @return whether {@code target} is an appropriate target for this target type for the caster {@code caster} + */ public abstract boolean is(Entity caster, LivingEntity target); public abstract boolean includesCaster(); From fa7352d760efb7ae32f139934f6290cab8b52d59 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 26 Oct 2025 14:04:49 -0400 Subject: [PATCH 09/14] Add default implementation for `AllyOrEnemy#getMatchingEntities` --- .../uncommon/utilityclasses/AllyOrEnemy.java | 56 ++++--------------- 1 file changed, 10 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java b/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java index aab0bfd5d..d1aaf63a3 100644 --- a/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java +++ b/src/main/java/com/robertx22/mine_and_slash/uncommon/utilityclasses/AllyOrEnemy.java @@ -14,13 +14,6 @@ public enum AllyOrEnemy { summonShouldAttack() { - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream() - .filter(x -> is(caster, x)) - .collect(Collectors.toList()); - } - @Override public boolean is(Entity caster, LivingEntity target) { @@ -60,11 +53,6 @@ public boolean includesCaster() { allies() { - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream().filter(x -> is(caster, x)).collect(Collectors.toList()); - } - @Override public boolean is(Entity caster, LivingEntity target) { return !enemies.is(caster, target); @@ -75,12 +63,8 @@ public boolean includesCaster() { return true; } }, - allies_not_self() { - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream().filter(x -> is(caster, x)).collect(Collectors.toList()); - } + allies_not_self() { @Override public boolean is(Entity caster, LivingEntity target) { return allies.is(caster, target); @@ -91,14 +75,8 @@ public boolean includesCaster() { return false; } }, - pets() { - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream() - .filter(x -> is(caster, x)) - .collect(Collectors.toList()); - } + pets() { @Override public boolean is(Entity caster, LivingEntity target) { if (caster instanceof Player p) { @@ -114,14 +92,8 @@ public boolean includesCaster() { return false; } }, - casters_summons() { - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream() - .filter(x -> is(caster, x)) - .collect(Collectors.toList()); - } + casters_summons() { @Override public boolean is(Entity caster, LivingEntity target) { if (caster instanceof Player p) { @@ -139,6 +111,7 @@ public boolean includesCaster() { return false; } }, + enemies { @Override public boolean is(Entity caster, LivingEntity target) { @@ -170,18 +143,12 @@ public boolean is(Entity caster, LivingEntity target) { return true; } - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream() - .filter(x -> is(caster, x)) - .collect(Collectors.toList()); - } - @Override public boolean includesCaster() { return false; } }, + non_ai_enemies { @Override public boolean is(Entity caster, LivingEntity target) { @@ -224,13 +191,6 @@ public boolean is(Entity caster, LivingEntity target) { return true; } - @Override - public List getMatchingEntities(List list, Entity caster) { - return list.stream() - .filter(x -> is(caster, x)) - .collect(Collectors.toList()); - } - @Override public boolean includesCaster() { return false; @@ -253,7 +213,11 @@ public boolean includesCaster() { } }; - public abstract List getMatchingEntities(List list, Entity caster); + public List getMatchingEntities(List list, Entity caster) { + return list.stream() + .filter(x -> is(caster, x)) + .collect(Collectors.toList()); + } /** * @return whether {@code target} is an appropriate target for this target type for the caster {@code caster} From 3f7e75d31e0ae40bbda90f82305e094923fe48e0 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Mon, 27 Oct 2025 23:59:56 -0400 Subject: [PATCH 10/14] ComponentPart#tryAcivate: simplify filtering by predicate --- .../database/data/spells/components/ComponentPart.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/ComponentPart.java b/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/ComponentPart.java index a882c79be..b05e9c094 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/ComponentPart.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/ComponentPart.java @@ -116,10 +116,10 @@ public void tryActivate(SpellCtx ctx) { EffectCondition pred = EffectCondition.MAP.get(entityPredicate.type); if (pred != null) { - selected = selected.stream().filter(targetEntity -> { + selected.removeIf(targetEntity -> { SpellCtx chainedCtx = SpellCtx.onEntityHit(ctx, targetEntity); - return pred.can(chainedCtx, entityPredicate); - }).collect(Collectors.toList()); + return !pred.can(chainedCtx, entityPredicate); + }); } } list.addAll(selected); From defd2ce106937dad8d3bba3d9f19bf35717ddadc Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Tue, 28 Oct 2025 01:19:19 -0400 Subject: [PATCH 11/14] CooldownsData: optimize ticking methods --- .../capability/entity/CooldownsData.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/capability/entity/CooldownsData.java b/src/main/java/com/robertx22/mine_and_slash/capability/entity/CooldownsData.java index 7d9de9ed4..a2fe69a39 100644 --- a/src/main/java/com/robertx22/mine_and_slash/capability/entity/CooldownsData.java +++ b/src/main/java/com/robertx22/mine_and_slash/capability/entity/CooldownsData.java @@ -27,13 +27,15 @@ public Data(int ticks, int need) { } public void tickSpellCooldowns(int ticks) { - getAllSpellsOnCooldown().forEach(x -> tickDownCooldown(x, ticks)); + map.values().removeIf(data -> { + data.ticks -= ticks; + return data.ticks < 1; + }); } public void tickDownCooldown(String id, int ticks) { - - if (map.containsKey(id)) { - Data data = map.get(id); + Data data = map.get(id); + if (data != null) { data.ticks -= ticks; if (data.ticks < 1) { @@ -43,13 +45,10 @@ public void tickDownCooldown(String id, int ticks) { } public void onTicksPass(int ticks) { - if (map.isEmpty()) { - return; - } - new HashMap<>(map).entrySet() - .forEach(x -> { - tickDownCooldown(x.getKey(), ticks); - }); + map.values().removeIf(data -> { + data.ticks -= ticks; + return data.ticks < 1; + }); } public List getAllSpellsOnCooldown() { From 9f639217f6065a6e812e623649e42059fc0f9e24 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Tue, 28 Oct 2025 19:06:54 -0400 Subject: [PATCH 12/14] ParticleRadiusAction: avoid dupilcate lookup of area multi --- .../components/actions/vanity/ParticleInRadiusAction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/vanity/ParticleInRadiusAction.java b/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/vanity/ParticleInRadiusAction.java index 5cb00e0cc..0ac43a5ba 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/vanity/ParticleInRadiusAction.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/vanity/ParticleInRadiusAction.java @@ -34,12 +34,12 @@ public void tryActivate(Collection targets, SpellCtx ctx, MapHolde //SimpleParticleType particle = data.getParticle(); float radius = data.get(RADIUS).floatValue(); - - radius *= ctx.calculatedSpellData.data.getNumber(EventData.AREA_MULTI, 1F).number; - float height = data.getOrDefault(HEIGHT, 0D).floatValue(); int amount = data.get(PARTICLE_COUNT).intValue(); - amount *= ctx.calculatedSpellData.data.getNumber(EventData.AREA_MULTI, 1F).number; + + float areaMulti = ctx.calculatedSpellData.data.getNumber(EventData.AREA_MULTI, 1F).number; + radius *= areaMulti; + amount = (int) (amount * areaMulti); ParticleMotion motion = null; From 22cf685cd5852ad36d798846236ca0f77e11024c Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Wed, 29 Oct 2025 22:14:33 -0400 Subject: [PATCH 13/14] `PotionAction`: optimize `REMOVE_NEGATIVE` mode This avoids building a new list for every effect stack to remove. We do have to build a list once to avoid a CME, but we also limit its length to `count`. --- .../components/actions/PotionAction.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/PotionAction.java b/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/PotionAction.java index b12036096..62a088dfe 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/PotionAction.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/spells/components/actions/PotionAction.java @@ -44,18 +44,12 @@ public void tryActivate(Collection targets, SpellCtx ctx, MapHolde } else if (action == GiveOrTake.REMOVE_NEGATIVE) { int count = data.getOrDefault(COUNT, 1D).intValue(); - for (int i = 0; i < count; i++) { - - List opt = t.getActiveEffects() - .stream() - .filter(x -> x.getEffect().getCategory() == MobEffectCategory.HARMFUL) - .collect(Collectors.toList()); - - if (!opt.isEmpty()) { - t.removeEffect(opt.get(0).getEffect()); - } - } - + List effectsToRemove = t.getActiveEffects() + .stream() + .filter(x -> x.getEffect().getCategory() == MobEffectCategory.HARMFUL) + .limit(count) + .toList(); + effectsToRemove.forEach(effect -> t.removeEffect(effect.getEffect())); } } From a7794dca86847543195e7d6a6288ed23fc959310 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Sun, 9 Nov 2025 22:34:45 -0500 Subject: [PATCH 14/14] Profession#getAllDrops: avoid duplicate lookup into tiered_drops --- .../mine_and_slash/database/data/profession/Profession.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/Profession.java b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/Profession.java index 81515f5ea..73ae27fe0 100644 --- a/src/main/java/com/robertx22/mine_and_slash/database/data/profession/Profession.java +++ b/src/main/java/com/robertx22/mine_and_slash/database/data/profession/Profession.java @@ -78,8 +78,9 @@ public List getAllDrops(Player p, int lvl, int recipelvl, float dropC List ALLDROPS = new ArrayList<>(); - if (tiered_drops.containsKey(tier)) { - ALLDROPS.addAll(tiered_drops.get(tier)); + List tieredDrop = tiered_drops.get(tier); + if (tieredDrop != null) { + ALLDROPS.addAll(tieredDrop); } ALLDROPS.addAll(chance_drops);