44 GetWardrobeMessageComposer ,
55 IAvatarFigureContainer ,
66 ILinkEventTracker ,
7+ SetClothingChangeDataMessageComposer ,
78 UserFigureComposer ,
89 UserWardrobePageEvent ,
910} from "@nitro/renderer" ;
@@ -47,6 +48,8 @@ import {AvatarEditorWardrobeView} from "./views/AvatarEditorWardrobeView";
4748
4849const DEFAULT_MALE_FIGURE : string = "hr-100.hd-180-7.ch-215-66.lg-270-79.sh-305-62.ha-1002-70.wa-2007" ;
4950const DEFAULT_FEMALE_FIGURE : string = "hr-515-33.hd-600-1.ch-635-70.lg-716-66-62.sh-735-68" ;
51+ const DEFAULT_MALE_FOOTBALL_GATE : string = "ch-3109-92-1408.lg-3116-82-1408.sh-3115-1408-1408" ;
52+ const DEFAULT_FEMALE_FOOTBALL_GATE : string = "ch-3112-1408-1408.lg-3116-71-1408.sh-3115-1408-1408" ;
5053
5154export const AvatarEditorView : FC < { } > = props => {
5255 const [ isVisible , setIsVisible ] = useState ( false ) ;
@@ -62,9 +65,17 @@ export const AvatarEditorView: FC<{}> = props => {
6265 const [ lastGender , setLastGender ] = useState < string > ( null ) ;
6366 const [ needsReset , setNeedsReset ] = useState ( true ) ;
6467 const [ isInitalized , setIsInitalized ] = useState ( false ) ;
68+ const [ genderFootballGate , setGenderFootballGate ] = useState < string > ( null ) ;
69+ const [ objectFootballGate , setObjectFootballGate ] = useState < number > ( null ) ;
6570
6671 const maxWardrobeSlots = useMemo ( ( ) => GetConfiguration < number > ( "avatar.wardrobe.max.slots" , 10 ) , [ ] ) ;
6772
73+ const onClose = ( ) => {
74+ setGenderFootballGate ( null ) ;
75+ setObjectFootballGate ( null ) ;
76+ setIsVisible ( false ) ;
77+ } ;
78+
6879 useMessageEvent < FigureSetIdsMessageEvent > ( FigureSetIdsMessageEvent , event => {
6980 const parser = event . getParser ( ) ;
7081
@@ -105,13 +116,18 @@ export const AvatarEditorView: FC<{}> = props => {
105116 const resetCategories = useCallback ( ( ) => {
106117 const categories = new Map ( ) ;
107118
108- categories . set ( AvatarEditorFigureCategory . GENERIC , new BodyModel ( ) ) ;
109- categories . set ( AvatarEditorFigureCategory . HEAD , new HeadModel ( ) ) ;
110- categories . set ( AvatarEditorFigureCategory . TORSO , new TorsoModel ( ) ) ;
111- categories . set ( AvatarEditorFigureCategory . LEGS , new LegModel ( ) ) ;
119+ if ( ! genderFootballGate ) {
120+ categories . set ( AvatarEditorFigureCategory . GENERIC , new BodyModel ( ) ) ;
121+ categories . set ( AvatarEditorFigureCategory . HEAD , new HeadModel ( ) ) ;
122+ categories . set ( AvatarEditorFigureCategory . TORSO , new TorsoModel ( ) ) ;
123+ categories . set ( AvatarEditorFigureCategory . LEGS , new LegModel ( ) ) ;
124+ } else {
125+ categories . set ( AvatarEditorFigureCategory . TORSO , new TorsoModel ( ) ) ;
126+ categories . set ( AvatarEditorFigureCategory . LEGS , new LegModel ( ) ) ;
127+ }
112128
113129 setCategories ( categories ) ;
114- } , [ ] ) ;
130+ } , [ genderFootballGate ] ) ;
115131
116132 const setupFigures = useCallback ( ( ) => {
117133 const figures : Map < string , FigureData > = new Map ( ) ;
@@ -167,12 +183,14 @@ export const AvatarEditorView: FC<{}> = props => {
167183 resetCategories ( ) ;
168184 return ;
169185 case AvatarEditorAction . ACTION_SAVE :
170- SendMessageComposer ( new UserFigureComposer ( figureData . gender , figureData . getFigureString ( ) ) ) ;
171- setIsVisible ( false ) ;
186+ ! genderFootballGate
187+ ? SendMessageComposer ( new UserFigureComposer ( figureData . gender , figureData . getFigureString ( ) ) )
188+ : SendMessageComposer ( new SetClothingChangeDataMessageComposer ( objectFootballGate , genderFootballGate , figureData . getFigureString ( ) ) ) ;
189+ onClose ( ) ;
172190 return ;
173191 }
174192 } ,
175- [ figureData , lastFigure , lastGender , figureSetIds , loadAvatarInEditor , resetCategories ]
193+ [ loadAvatarInEditor , figureData , resetCategories , lastFigure , lastGender , figureSetIds , genderFootballGate , objectFootballGate ]
176194 ) ;
177195
178196 const setGender = useCallback (
@@ -189,6 +207,9 @@ export const AvatarEditorView: FC<{}> = props => {
189207 linkReceived : ( url : string ) => {
190208 const parts = url . split ( "/" ) ;
191209
210+ setGenderFootballGate ( parts [ 2 ] ? parts [ 2 ] : null ) ;
211+ setObjectFootballGate ( parts [ 3 ] ? Number ( parts [ 3 ] ) : null ) ;
212+
192213 if ( parts . length < 2 ) return ;
193214
194215 switch ( parts [ 1 ] ) {
@@ -231,8 +252,8 @@ export const AvatarEditorView: FC<{}> = props => {
231252 useEffect ( ( ) => {
232253 if ( ! categories ) return ;
233254
234- selectCategory ( AvatarEditorFigureCategory . GENERIC ) ;
235- } , [ categories , selectCategory ] ) ;
255+ selectCategory ( ! genderFootballGate ? AvatarEditorFigureCategory . GENERIC : AvatarEditorFigureCategory . TORSO ) ;
256+ } , [ categories , genderFootballGate , selectCategory ] ) ;
236257
237258 useEffect ( ( ) => {
238259 if ( ! figureData ) return ;
@@ -271,9 +292,22 @@ export const AvatarEditorView: FC<{}> = props => {
271292 useEffect ( ( ) => {
272293 if ( ! isVisible || ! isInitalized || ! needsReset ) return ;
273294
274- loadAvatarInEditor ( GetSessionDataManager ( ) . figure , GetSessionDataManager ( ) . gender ) ;
295+ loadAvatarInEditor (
296+ ! genderFootballGate ? GetSessionDataManager ( ) . figure : genderFootballGate === FigureData . MALE ? DEFAULT_MALE_FOOTBALL_GATE : DEFAULT_FEMALE_FOOTBALL_GATE ,
297+ ! genderFootballGate ? GetSessionDataManager ( ) . gender : genderFootballGate
298+ ) ;
275299 setNeedsReset ( false ) ;
276- } , [ isVisible , isInitalized , needsReset , loadAvatarInEditor ] ) ;
300+ } , [ isVisible , isInitalized , needsReset , loadAvatarInEditor , genderFootballGate ] ) ;
301+
302+ useEffect ( ( ) =>
303+ // This is so when you have the look editor open and you change the mode to Boy or Girl
304+ {
305+ if ( ! isVisible ) return ;
306+
307+ return ( ) => {
308+ setNeedsReset ( true ) ;
309+ } ;
310+ } , [ isVisible , genderFootballGate ] ) ;
277311
278312 useEffect ( ( ) => {
279313 if ( isVisible ) return ;
@@ -287,7 +321,10 @@ export const AvatarEditorView: FC<{}> = props => {
287321
288322 return (
289323 < NitroCardView uniqueKey = "avatar-editor" className = "nitro-avatar-editor" >
290- < NitroCardHeaderView headerText = { LocalizeText ( "avatareditor.title" ) } onCloseClick = { event => setIsVisible ( false ) } />
324+ < NitroCardHeaderView
325+ headerText = { ! genderFootballGate ? LocalizeText ( "avatareditor.title" ) : LocalizeText ( "widget.furni.clothingchange.editor.title" ) }
326+ onCloseClick = { onClose }
327+ />
291328 < NitroCardTabsView >
292329 { categories &&
293330 categories . size > 0 &&
@@ -300,14 +337,23 @@ export const AvatarEditorView: FC<{}> = props => {
300337 </ NitroCardTabsItemView >
301338 ) ;
302339 } ) }
303- < NitroCardTabsItemView isActive = { isWardrobeVisible } onClick = { event => setIsWardrobeVisible ( true ) } >
304- { LocalizeText ( "avatareditor.category.wardrobe" ) }
305- </ NitroCardTabsItemView >
340+ { ! genderFootballGate && (
341+ < NitroCardTabsItemView isActive = { isWardrobeVisible } onClick = { event => setIsWardrobeVisible ( true ) } >
342+ { LocalizeText ( "avatareditor.category.wardrobe" ) }
343+ </ NitroCardTabsItemView >
344+ ) }
306345 </ NitroCardTabsView >
307346 < NitroCardContentView >
308347 < Grid >
309348 < Column size = { 9 } overflow = "hidden" >
310- { activeCategory && ! isWardrobeVisible && < AvatarEditorModelView model = { activeCategory } gender = { figureData . gender } setGender = { setGender } /> }
349+ { activeCategory && ! isWardrobeVisible && (
350+ < AvatarEditorModelView
351+ model = { activeCategory }
352+ gender = { figureData . gender }
353+ isFromFootballGate = { ! genderFootballGate ? false : true }
354+ setGender = { setGender }
355+ />
356+ ) }
311357 { isWardrobeVisible && (
312358 < AvatarEditorWardrobeView
313359 figureData = { figureData }
@@ -320,17 +366,19 @@ export const AvatarEditorView: FC<{}> = props => {
320366 < Column size = { 3 } overflow = "hidden" >
321367 < AvatarEditorFigurePreviewView figureData = { figureData } />
322368 < Column grow gap = { 1 } >
323- < ButtonGroup >
324- < Button variant = "secondary" onClick = { event => processAction ( AvatarEditorAction . ACTION_RESET ) } >
325- < FaUndo className = "fa-icon" />
326- </ Button >
327- < Button variant = "secondary" onClick = { event => processAction ( AvatarEditorAction . ACTION_CLEAR ) } >
328- < FaTrash className = "fa-icon" />
329- </ Button >
330- < Button variant = "secondary" onClick = { event => processAction ( AvatarEditorAction . ACTION_RANDOMIZE ) } >
331- < FaDice className = "fa-icon" />
332- </ Button >
333- </ ButtonGroup >
369+ { ! genderFootballGate && (
370+ < ButtonGroup >
371+ < Button variant = "secondary" onClick = { event => processAction ( AvatarEditorAction . ACTION_RESET ) } >
372+ < FaUndo className = "fa-icon" />
373+ </ Button >
374+ < Button variant = "secondary" onClick = { event => processAction ( AvatarEditorAction . ACTION_CLEAR ) } >
375+ < FaTrash className = "fa-icon" />
376+ </ Button >
377+ < Button variant = "secondary" onClick = { event => processAction ( AvatarEditorAction . ACTION_RANDOMIZE ) } >
378+ < FaDice className = "fa-icon" />
379+ </ Button >
380+ </ ButtonGroup >
381+ ) }
334382 < Button className = "w-100" variant = "success" onClick = { event => processAction ( AvatarEditorAction . ACTION_SAVE ) } >
335383 { LocalizeText ( "avatareditor.save" ) }
336384 </ Button >
@@ -341,3 +389,4 @@ export const AvatarEditorView: FC<{}> = props => {
341389 </ NitroCardView >
342390 ) ;
343391} ;
392+
0 commit comments