From 6f4f062dc89fe1b2cefcc08e7c3b15c40ea0347d Mon Sep 17 00:00:00 2001 From: MobiusDevelopment Date: Thu, 20 Feb 2025 14:07:33 +0200 Subject: [PATCH] Fixed AltSubclassEverywhere configuration. Contributed by binary. --- .../model/actor/instance/VillageMaster.java | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/VillageMaster.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/VillageMaster.java index 350c3c2439..27ad5416dc 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/VillageMaster.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/VillageMaster.java @@ -740,46 +740,48 @@ public class VillageMaster extends Folk private Set getAvailableSubclasses(Player player) { - Set availSubs = getSubclasses(player, player.getBaseClass()); + final Set availSubs = getSubclasses(player, player.getBaseClass()); final Race npcRace = getVillageMasterRace(); final ClassType npcTeachType = getVillageMasterTeachType(); boolean everywhereEnabled = Config.ALT_GAME_SUBCLASS_EVERYWHERE; if (availSubs != null) { - // Create a copy of the set to avoid ConcurrentModificationException - Set copySubs = new HashSet<>(availSubs); + // Create a copy of the set to avoid ConcurrentModificationException. + final Set copySubs = new HashSet<>(availSubs); for (ClassId availSub : copySubs) { - // Check if subclass restrictions based on race should be applied everywhere + // Remove subclasses already chosen by the player. + for (SubClassHolder subClass : player.getSubClasses().values()) + { + if (subClass.getClassId() == availSub.ordinal()) + { + availSubs.remove(availSub); + break; + } + } + + // Remove subclasses unavailable due to previous choices or base class. + final Iterator subListIterator = iterSubClasses(player); + while (subListIterator.hasNext()) + { + final SubClassHolder prevSubClass = subListIterator.next(); + int subClassId = prevSubClass.getClassId(); + if (subClassId >= 88) + { + subClassId = ClassId.getClassId(subClassId).getParent().getId(); + } + if ((availSub.ordinal() == subClassId) || (availSub.ordinal() == player.getBaseClass())) + { + availSubs.remove(availSub); + break; + } + } + + // Check if subclass restrictions based on race should be applied everywhere. if (!everywhereEnabled) { - // Remove subclasses already chosen by the player - for (SubClassHolder subClass : player.getSubClasses().values()) - { - if (subClass.getClassId() == availSub.ordinal()) - { - availSubs.remove(availSub); - break; - } - } - // Remove subclasses unavailable due to previous choices or base class - Iterator subListIterator = iterSubClasses(player); - while (subListIterator.hasNext()) - { - SubClassHolder prevSubClass = subListIterator.next(); - int subClassId = prevSubClass.getClassId(); - if (subClassId >= 88) - { - subClassId = ClassId.getClassId(subClassId).getParent().getId(); - } - if ((availSub.ordinal() == subClassId) || (availSub.ordinal() == player.getBaseClass())) - { - availSubs.remove(availSub); - break; - } - } - // Apply race restrictions based on the village master's race + // Apply race restrictions based on the village master's race. if (((npcRace == Race.HUMAN) || (npcRace == Race.ELF))) { // If the master is human or light elf, ensure that fighter-type masters only teach fighter classes, and priest-type masters only teach priest classes etc. @@ -796,6 +798,7 @@ public class VillageMaster extends Folk } } } + return availSubs; }