diff --git a/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/ClothingValidationManager.java b/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/ClothingValidationManager.java index ff4e2664..4e470658 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/ClothingValidationManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/ClothingValidationManager.java @@ -2,6 +2,7 @@ package com.eu.habbo.habbohotel.users.clothingvalidation; import com.eu.habbo.habbohotel.users.Habbo; import gnu.trove.TIntCollection; +import gnu.trove.map.hash.THashMap; import gnu.trove.set.hash.TIntHashSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,87 +98,116 @@ public class ClothingValidationManager { String[] newLookParts = look.split(Pattern.quote(".")); ArrayList lookParts = new ArrayList<>(); + THashMap parts = new THashMap<>(); + + // add mandatory settypes for(String lookpart : newLookParts) { - if(lookpart.contains("-")) { - try { - String[] data = lookpart.split(Pattern.quote("-")); - if (data.length > 1) { - FiguredataSettype settype = FIGUREDATA.settypes.get(data[0]); - if (settype == null) { - throw new Exception("Set type " + data[0] + " does not exist"); - } - - FiguredataPalette palette = FIGUREDATA.palettes.get(settype.paletteId); - if (palette == null) { - throw new Exception("Palette " + settype.paletteId + " does not exist"); - } - - int setId; - FiguredataSettypeSet set; - - setId = Integer.parseInt(data[1]); - set = settype.getSet(setId); - if (set == null) - throw new Exception("Set " + setId + " does not exist in SetType"); - - if ((set.club && !isHC) || !set.selectable || (set.sellable && !ownedClothing.contains(set.id))) { - if(gender.equalsIgnoreCase("M") && !isHC && !settype.mandatoryMale0) - continue; - - if(gender.equalsIgnoreCase("F") && !isHC && !settype.mandatoryFemale0) - continue; - - if(gender.equalsIgnoreCase("M") && isHC && !settype.mandatoryMale1) - continue; - - if(gender.equalsIgnoreCase("F") && isHC && !settype.mandatoryFemale1) - continue; - - set = settype.getFirstNonHCSetForGender(gender); - setId = set.id; - } - - ArrayList dataParts = new ArrayList<>(); - - int color1 = -1; - int color2 = -1; - - if (data.length > 2 && set.colorable) { - color1 = Integer.parseInt(data[2]); - FiguredataPaletteColor color = palette.getColor(color1); - if (color == null || (color.club && !isHC)) { - color1 = palette.getFirstNonHCColor().id; - } - } - - if (data.length > 3 && set.colorable) { - color2 = Integer.parseInt(data[3]); - FiguredataPaletteColor color = palette.getColor(color2); - if (color == null || (color.club && !isHC)) { - color2 = palette.getFirstNonHCColor().id; - } - } - - dataParts.add(settype.type); - dataParts.add("" + setId); - - if (color1 > -1) { - dataParts.add("" + color1); - } - - if (color2 > -1) { - dataParts.add("" + color2); - } - - lookParts.add(String.join("-", dataParts)); - } - } - catch (Exception e) { - //habbo.alert(e.getMessage()); + if (lookpart.contains("-")) { + String[] data = lookpart.split(Pattern.quote("-")); + FiguredataSettype settype = FIGUREDATA.settypes.get(data[0]); + if(settype != null) { + parts.put(data[0], data); } } } + FIGUREDATA.settypes.entrySet().stream().filter(x -> !parts.containsKey(x.getKey())).forEach(x -> + { + FiguredataSettype settype = x.getValue(); + + if(gender.equalsIgnoreCase("M") && !isHC && !settype.mandatoryMale0) + return; + + if(gender.equalsIgnoreCase("F") && !isHC && !settype.mandatoryFemale0) + return; + + if(gender.equalsIgnoreCase("M") && isHC && !settype.mandatoryMale1) + return; + + if(gender.equalsIgnoreCase("F") && isHC && !settype.mandatoryFemale1) + return; + + parts.put(x.getKey(), new String[] { x.getKey() }); + }); + + + parts.forEach((key, data) -> { + try { + if (data.length >= 1) { + FiguredataSettype settype = FIGUREDATA.settypes.get(data[0]); + if (settype == null) { + //throw new Exception("Set type " + data[0] + " does not exist"); + return; + } + + FiguredataPalette palette = FIGUREDATA.palettes.get(settype.paletteId); + if (palette == null) { + throw new Exception("Palette " + settype.paletteId + " does not exist"); + } + + int setId; + FiguredataSettypeSet set; + + setId = Integer.parseInt(data.length >= 2 ? data[1] : "-1"); + set = settype.getSet(setId); + + if (set == null || (set.club && !isHC) || !set.selectable || (set.sellable && !ownedClothing.contains(set.id)) || (!set.gender.equalsIgnoreCase("U") && !set.gender.equalsIgnoreCase(gender))) { + if (gender.equalsIgnoreCase("M") && !isHC && !settype.mandatoryMale0) + return; + + if (gender.equalsIgnoreCase("F") && !isHC && !settype.mandatoryFemale0) + return; + + if (gender.equalsIgnoreCase("M") && isHC && !settype.mandatoryMale1) + return; + + if (gender.equalsIgnoreCase("F") && isHC && !settype.mandatoryFemale1) + return; + + set = settype.getFirstNonHCSetForGender(gender); + setId = set.id; + } + + ArrayList dataParts = new ArrayList<>(); + + int color1 = -1; + int color2 = -1; + + if (set.colorable) { + color1 = data.length >= 3 ? Integer.parseInt(data[2]) : -1; + FiguredataPaletteColor color = palette.getColor(color1); + if (color == null || (color.club && !isHC)) { + color1 = palette.getFirstNonHCColor().id; + } + } + + if (data.length >= 4 && set.colorable) { + color2 = Integer.parseInt(data[3]); + FiguredataPaletteColor color = palette.getColor(color2); + if (color == null || (color.club && !isHC)) { + color2 = palette.getFirstNonHCColor().id; + } + } + + dataParts.add(settype.type); + dataParts.add("" + setId); + + if (color1 > -1) { + dataParts.add("" + color1); + } + + if (color2 > -1) { + dataParts.add("" + color2); + } + + lookParts.add(String.join("-", dataParts)); + } + } catch (Exception e) { + //habbo.alert(e.getMessage()); + LOGGER.error("Error in clothing validation", e); + } + }); + return String.join(".", lookParts); } diff --git a/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/FiguredataPalette.java b/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/FiguredataPalette.java index 841fd5d4..4a1c48d5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/FiguredataPalette.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/clothingvalidation/FiguredataPalette.java @@ -20,7 +20,7 @@ public class FiguredataPalette { } public FiguredataPaletteColor getFirstNonHCColor() { - for(FiguredataPaletteColor color : this.colors.descendingMap().values()) { + for(FiguredataPaletteColor color : this.colors.values()) { if(!color.club && color.selectable) return color; }