278 lines
8.3 KiB
TypeScript
278 lines
8.3 KiB
TypeScript
import { IPartColor } from '@nitrots/nitro-renderer';
|
|
import { GetAvatarPalette, GetAvatarRenderManager, GetAvatarSetType, GetClubMemberLevel, GetConfiguration } from '../nitro';
|
|
import { AvatarEditorGridColorItem } from './AvatarEditorGridColorItem';
|
|
import { AvatarEditorGridPartItem } from './AvatarEditorGridPartItem';
|
|
import { CategoryBaseModel } from './CategoryBaseModel';
|
|
import { CategoryData } from './CategoryData';
|
|
import { FigureData } from './FigureData';
|
|
|
|
export class AvatarEditorUtilities
|
|
{
|
|
private static MAX_PALETTES: number = 2;
|
|
|
|
public static CURRENT_FIGURE: FigureData = null;
|
|
public static FIGURE_SET_IDS: number[] = [];
|
|
public static BOUND_FURNITURE_NAMES: string[] = [];
|
|
|
|
public static getGender(gender: string): string
|
|
{
|
|
switch(gender)
|
|
{
|
|
case FigureData.MALE:
|
|
case 'm':
|
|
case 'M':
|
|
gender = FigureData.MALE;
|
|
break;
|
|
case FigureData.FEMALE:
|
|
case 'f':
|
|
case 'F':
|
|
gender = FigureData.FEMALE;
|
|
break;
|
|
default:
|
|
gender = FigureData.MALE;
|
|
}
|
|
|
|
return gender;
|
|
}
|
|
|
|
public static hasFigureSetId(setId: number): boolean
|
|
{
|
|
return (this.FIGURE_SET_IDS.indexOf(setId) >= 0);
|
|
}
|
|
|
|
public static createCategory(model: CategoryBaseModel, name: string): CategoryData
|
|
{
|
|
if(!model || !name || !this.CURRENT_FIGURE) return null;
|
|
|
|
const partItems: AvatarEditorGridPartItem[] = [];
|
|
const colorItems: AvatarEditorGridColorItem[][] = [];
|
|
|
|
let i = 0;
|
|
|
|
while(i < this.MAX_PALETTES)
|
|
{
|
|
colorItems.push([]);
|
|
|
|
i++;
|
|
}
|
|
|
|
const setType = GetAvatarSetType(name);
|
|
|
|
if(!setType) return null;
|
|
|
|
const palette = GetAvatarPalette(setType.paletteID);
|
|
|
|
if(!palette) return null;
|
|
|
|
let colorIds = this.CURRENT_FIGURE.getColorIds(name);
|
|
|
|
if(!colorIds) colorIds = [];
|
|
|
|
const partColors: IPartColor[] = new Array(colorIds.length);
|
|
const clubItemsDimmed = this.clubItemsDimmed;
|
|
const clubMemberLevel = GetClubMemberLevel();
|
|
|
|
for(const partColor of palette.colors.getValues())
|
|
{
|
|
if(partColor.isSelectable && (clubItemsDimmed || (clubMemberLevel >= partColor.clubLevel)))
|
|
{
|
|
let i = 0;
|
|
|
|
while(i < this.MAX_PALETTES)
|
|
{
|
|
const isDisabled = (clubMemberLevel < partColor.clubLevel);
|
|
const colorItem = new AvatarEditorGridColorItem(partColor, isDisabled);
|
|
|
|
colorItems[i].push(colorItem);
|
|
|
|
i++;
|
|
}
|
|
|
|
if(name !== FigureData.FACE)
|
|
{
|
|
let i = 0;
|
|
|
|
while(i < colorIds.length)
|
|
{
|
|
if(partColor.id === colorIds[i]) partColors[i] = partColor;
|
|
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
let mandatorySetIds: string[] = [];
|
|
|
|
if(clubItemsDimmed)
|
|
{
|
|
mandatorySetIds = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(this.CURRENT_FIGURE.gender, 2);
|
|
}
|
|
else
|
|
{
|
|
mandatorySetIds = GetAvatarRenderManager().getMandatoryAvatarPartSetIds(this.CURRENT_FIGURE.gender, clubMemberLevel);
|
|
}
|
|
|
|
const isntMandatorySet = (mandatorySetIds.indexOf(name) === -1);
|
|
|
|
if(isntMandatorySet)
|
|
{
|
|
const partItem = new AvatarEditorGridPartItem(null, null, false);
|
|
|
|
partItem.isClear = true;
|
|
|
|
partItems.push(partItem);
|
|
}
|
|
|
|
const usesColors = (name !== FigureData.FACE);
|
|
const partSets = setType.partSets;
|
|
const totalPartSets = partSets.length;
|
|
|
|
i = (totalPartSets - 1);
|
|
|
|
while(i >= 0)
|
|
{
|
|
const partSet = partSets.getWithIndex(i);
|
|
|
|
let isValidGender = false;
|
|
|
|
if(partSet.gender === FigureData.UNISEX)
|
|
{
|
|
isValidGender = true;
|
|
}
|
|
|
|
else if(partSet.gender === this.CURRENT_FIGURE.gender)
|
|
{
|
|
isValidGender = true;
|
|
}
|
|
|
|
if(partSet.isSelectable && isValidGender && (clubItemsDimmed || (clubMemberLevel >= partSet.clubLevel)))
|
|
{
|
|
const isDisabled = (clubMemberLevel < partSet.clubLevel);
|
|
|
|
let isValid = true;
|
|
|
|
if(partSet.isSellable) isValid = this.hasFigureSetId(partSet.id);
|
|
|
|
if(isValid) partItems.push(new AvatarEditorGridPartItem(partSet, partColors, usesColors, isDisabled));
|
|
}
|
|
|
|
i--;
|
|
}
|
|
|
|
partItems.sort(this.clubItemsFirst ? this.clubSorter : this.noobSorter);
|
|
|
|
// if(this._forceSellableClothingVisibility || GetNitroInstance().getConfiguration<boolean>("avatareditor.support.sellablefurni", false))
|
|
// {
|
|
// _local_31 = (this._manager.windowManager.assets.getAssetByName("camera_zoom_in") as BitmapDataAsset);
|
|
// _local_32 = (_local_31.content as BitmapData).clone();
|
|
// _local_33 = (AvatarEditorView._Str_6802.clone() as IWindowContainer);
|
|
// _local_33.name = AvatarEditorGridView.GET_MORE;
|
|
// _local_7 = new AvatarEditorGridPartItem(_local_33, k, null, null, false);
|
|
// _local_7._Str_3093 = _local_32;
|
|
// _local_3.push(_local_7);
|
|
// }
|
|
|
|
i = 0;
|
|
|
|
while(i < this.MAX_PALETTES)
|
|
{
|
|
colorItems[i].sort(this.colorSorter);
|
|
|
|
i++;
|
|
}
|
|
|
|
return new CategoryData(name, partItems, colorItems);
|
|
}
|
|
|
|
public static clubSorter(a: AvatarEditorGridPartItem, b: AvatarEditorGridPartItem): number
|
|
{
|
|
const clubLevelA = (!a.partSet ? 9999999999 : a.partSet.clubLevel);
|
|
const clubLevelB = (!b.partSet ? 9999999999 : b.partSet.clubLevel);
|
|
const isSellableA = (!a.partSet ? false : a.partSet.isSellable);
|
|
const isSellableB = (!b.partSet ? false : b.partSet.isSellable);
|
|
|
|
if(isSellableA && !isSellableB) return 1;
|
|
|
|
if(isSellableB && !isSellableA) return -1;
|
|
|
|
if(clubLevelA > clubLevelB) return -1;
|
|
|
|
if(clubLevelA < clubLevelB) return 1;
|
|
|
|
if(a.partSet.id > b.partSet.id) return -1;
|
|
|
|
if(a.partSet.id < b.partSet.id) return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static colorSorter(a: AvatarEditorGridColorItem, b: AvatarEditorGridColorItem): number
|
|
{
|
|
const clubLevelA = (!a.partColor ? -1 : a.partColor.clubLevel);
|
|
const clubLevelB = (!b.partColor ? -1 : b.partColor.clubLevel);
|
|
|
|
if(clubLevelA < clubLevelB) return -1;
|
|
|
|
if(clubLevelA > clubLevelB) return 1;
|
|
|
|
if(a.partColor.index < b.partColor.index) return -1;
|
|
|
|
if(a.partColor.index > b.partColor.index) return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static noobSorter(a: AvatarEditorGridPartItem, b: AvatarEditorGridPartItem): number
|
|
{
|
|
const clubLevelA = (!a.partSet ? -1 : a.partSet.clubLevel);
|
|
const clubLevelB = (!b.partSet ? -1 : b.partSet.clubLevel);
|
|
const isSellableA = (!a.partSet ? false : a.partSet.isSellable);
|
|
const isSellableB = (!b.partSet ? false : b.partSet.isSellable);
|
|
|
|
if(isSellableA && !isSellableB) return 1;
|
|
|
|
if(isSellableB && !isSellableA) return -1;
|
|
|
|
if(clubLevelA < clubLevelB) return -1;
|
|
|
|
if(clubLevelA > clubLevelB) return 1;
|
|
|
|
if(a.partSet.id < b.partSet.id) return -1;
|
|
|
|
if(a.partSet.id > b.partSet.id) return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static avatarSetFirstSelectableColor(name: string): number
|
|
{
|
|
const setType = GetAvatarSetType(name);
|
|
|
|
if(!setType) return -1;
|
|
|
|
const palette = GetAvatarPalette(setType.paletteID);
|
|
|
|
if(!palette) return -1;
|
|
|
|
for(const color of palette.colors.getValues())
|
|
{
|
|
if(!color.isSelectable || (GetClubMemberLevel() < color.clubLevel)) continue;
|
|
|
|
return color.id;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public static get clubItemsFirst(): boolean
|
|
{
|
|
return GetConfiguration<boolean>('avatareditor.show.clubitems.first', true);
|
|
}
|
|
|
|
public static get clubItemsDimmed(): boolean
|
|
{
|
|
return GetConfiguration<boolean>('avatareditor.show.clubitems.dimmed', true);
|
|
}
|
|
}
|