diff --git a/src/engine/objects/PlayerCharacter.java b/src/engine/objects/PlayerCharacter.java index b43de6bf..9203a28a 100644 --- a/src/engine/objects/PlayerCharacter.java +++ b/src/engine/objects/PlayerCharacter.java @@ -866,7 +866,8 @@ public class PlayerCharacter extends AbstractCharacter { int[] characterRunes = msg.getRunes(); - HashSet usedRunesSubType = new HashSet<>(); + HashSet usedRuneIDs = new HashSet<>(); + HashSet usedSubTypeTokens = new HashSet<>(); HashSet usedRunes = new HashSet<>(); // So that all the penalties can be added at the end. @@ -922,24 +923,19 @@ public class PlayerCharacter extends AbstractCharacter { return null; } - int previous_size = usedRunes.size(); - int previous_subtype = usedRunesSubType.size(); - - usedRunes.add(runeBase); - usedRunesSubType.add(runeBase.getSubtype()); - - // Duplicate Rune check - if (usedRunes.size() <= previous_size) { + if (!usedRuneIDs.add(runeBase.getObjectUUID())) { Logger.info("Duplicate RuneBase"); return null; } - // Duplicate Subtype check - if (runeBase.getSubtype() != 0 && usedRunesSubType.size() <= previous_subtype) { + // Creation talents are rank 0, so two of the same sub type block each other (client 0x4695D0) + if (runeBase.getSubTypeToken() != 0 && !usedSubTypeTokens.add(runeBase.getSubTypeToken())) { Logger.info("Duplicate RuneBase Subtype"); return null; } + usedRunes.add(runeBase); + int maxValue = 0; // Every attempt is made to load MIN_NEEDED_ATTRIBUTES first.