More changes

This commit is contained in:
Bill 2022-03-30 12:42:04 -04:00
parent da1b0c508d
commit afb8b8b48b
12 changed files with 199 additions and 179 deletions

View File

@ -281,8 +281,8 @@ export class GroupItem
while(index < items.length) while(index < items.length)
{ {
const item = items[index]; const item = items[index];
const locked = (itemIds.indexOf(item.ref) >= 0); const locked = (itemIds.indexOf(item.ref) >= 0);
if(item.locked !== locked) if(item.locked !== locked)
{ {

View File

@ -6,10 +6,9 @@ export class TradeUserData
constructor( constructor(
public userId: number = -1, public userId: number = -1,
public userName: string = '', public userName: string = '',
public userItems: AdvancedMap<string, GroupItem> = null, public userItems: AdvancedMap<string, GroupItem> = new AdvancedMap(),
public itemCount: number = 0, public itemCount: number = 0,
public creditsCount: number = 0, public creditsCount: number = 0,
public accepts: boolean = false, public accepts: boolean = false,
public canTrade: boolean = false, public canTrade: boolean = false) {}
public items: AdvancedMap<string, GroupItem> = new AdvancedMap()) {}
} }

View File

@ -1,10 +1,6 @@
import { FC } from 'react'; import { FC } from 'react';
import { LocalizeText } from '../../../../../api'; import { LocalizeText } from '../../../../../api';
import { Base } from '../../../../../common/Base'; import { Base, Column, Flex, Grid, Text } from '../../../../../common';
import { Column } from '../../../../../common/Column';
import { Flex } from '../../../../../common/Flex';
import { Grid } from '../../../../../common/Grid';
import { Text } from '../../../../../common/Text';
import { useCatalogContext } from '../../../CatalogContext'; import { useCatalogContext } from '../../../CatalogContext';
import { CatalogBadgeSelectorWidgetView } from '../widgets/CatalogBadgeSelectorWidgetView'; import { CatalogBadgeSelectorWidgetView } from '../widgets/CatalogBadgeSelectorWidgetView';
import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView'; import { CatalogFirstProductSelectorWidgetView } from '../widgets/CatalogFirstProductSelectorWidgetView';

View File

@ -1,6 +1,5 @@
import { StringDataType } from '@nitrots/nitro-renderer'; import { StringDataType } from '@nitrots/nitro-renderer';
import { FC, useEffect, useMemo, useState } from 'react'; import { FC, useEffect, useMemo, useState } from 'react';
import { IBadgeItem } from '../../../../../api';
import { AutoGrid, AutoGridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../../../common'; import { AutoGrid, AutoGridProps, LayoutBadgeImageView, LayoutGridItem } from '../../../../../common';
import { useSharedInventoryBadges } from '../../../../../hooks'; import { useSharedInventoryBadges } from '../../../../../hooks';
import { useCatalogContext } from '../../../CatalogContext'; import { useCatalogContext } from '../../../CatalogContext';
@ -15,20 +14,20 @@ interface CatalogBadgeSelectorWidgetViewProps extends AutoGridProps
export const CatalogBadgeSelectorWidgetView: FC<CatalogBadgeSelectorWidgetViewProps> = props => export const CatalogBadgeSelectorWidgetView: FC<CatalogBadgeSelectorWidgetViewProps> = props =>
{ {
const { columnCount = 5, ...rest } = props; const { columnCount = 5, ...rest } = props;
const [ currentBadge, setCurrentBadge ] = useState<IBadgeItem>(null); const [ currentBadgeCode, setCurrentBadgeCode ] = useState<string>(null);
const { currentOffer = null, setPurchaseOptions = null } = useCatalogContext(); const { currentOffer = null, setPurchaseOptions = null } = useCatalogContext();
const { badges = [] } = useSharedInventoryBadges(); const { badgeCodes = [] } = useSharedInventoryBadges();
const previewStuffData = useMemo(() => const previewStuffData = useMemo(() =>
{ {
if(!currentBadge) return null; if(!currentBadgeCode) return null;
const stuffData = new StringDataType(); const stuffData = new StringDataType();
stuffData.setValue([ '0', currentBadge.badgeCode, '', '' ]); stuffData.setValue([ '0', currentBadgeCode, '', '' ]);
return stuffData; return stuffData;
}, [ currentBadge ]); }, [ currentBadgeCode ]);
useEffect(() => useEffect(() =>
{ {
@ -48,11 +47,11 @@ export const CatalogBadgeSelectorWidgetView: FC<CatalogBadgeSelectorWidgetViewPr
return ( return (
<AutoGrid columnCount={ columnCount } { ...rest }> <AutoGrid columnCount={ columnCount } { ...rest }>
{ badges && (badges.length > 0) && badges.map((badge, index) => { badgeCodes && (badgeCodes.length > 0) && badgeCodes.map((badgeCode, index) =>
{ {
return ( return (
<LayoutGridItem key={ index } itemActive={ (currentBadge === badge) } onClick={ event => setCurrentBadge(badge) }> <LayoutGridItem key={ index } itemActive={ (currentBadgeCode === badgeCode) } onClick={ event => setCurrentBadgeCode(badgeCode) }>
<LayoutBadgeImageView badgeCode={ badge.badgeCode } /> <LayoutBadgeImageView badgeCode={ badgeCode } />
</LayoutGridItem> </LayoutGridItem>
); );
}) } }) }

View File

@ -1,10 +1,9 @@
import { BadgePointLimitsEvent, ILinkEventTracker, IRoomSession, RoomEngineObjectEvent, RoomEngineObjectPlacedEvent, RoomPreviewer, RoomSessionEvent, TradingOpenComposer } from '@nitrots/nitro-renderer'; import { BadgePointLimitsEvent, ILinkEventTracker, IRoomSession, RoomEngineObjectEvent, RoomEngineObjectPlacedEvent, RoomPreviewer, RoomSessionEvent } from '@nitrots/nitro-renderer';
import { FC, useCallback, useEffect, useState } from 'react'; import { FC, useCallback, useEffect, useState } from 'react';
import { AddEventLinkTracker, GetLocalization, GetRoomEngine, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, UnseenItemCategory } from '../../api'; import { AddEventLinkTracker, GetLocalization, GetRoomEngine, LocalizeText, RemoveLinkEventTracker, UnseenItemCategory } from '../../api';
import { isObjectMoverRequested, setObjectMoverRequested } from '../../api/inventory/InventoryUtilities'; import { isObjectMoverRequested, setObjectMoverRequested } from '../../api/inventory/InventoryUtilities';
import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common';
import { InventoryTradeRequestEvent } from '../../events'; import { UseMessageEventHook, UseRoomEngineEvent, UseRoomSessionManagerEvent, useSharedInventoryTrade, useSharedInventoryUnseenTracker } from '../../hooks';
import { UseMessageEventHook, UseRoomEngineEvent, UseRoomSessionManagerEvent, useSharedInventoryUnseenTracker, UseUiEvent } from '../../hooks';
import { InventoryBadgeView } from './views/InventoryBadgeView'; import { InventoryBadgeView } from './views/InventoryBadgeView';
import { InventoryBotView } from './views/InventoryBotView'; import { InventoryBotView } from './views/InventoryBotView';
import { InventoryFurnitureView } from './views/InventoryFurnitureView'; import { InventoryFurnitureView } from './views/InventoryFurnitureView';
@ -24,40 +23,15 @@ export const InventoryView: FC<{}> = props =>
const [ currentTab, setCurrentTab ] = useState<string>(TABS[0]); const [ currentTab, setCurrentTab ] = useState<string>(TABS[0]);
const [ roomSession, setRoomSession ] = useState<IRoomSession>(null); const [ roomSession, setRoomSession ] = useState<IRoomSession>(null);
const [ roomPreviewer, setRoomPreviewer ] = useState<RoomPreviewer>(null); const [ roomPreviewer, setRoomPreviewer ] = useState<RoomPreviewer>(null);
const { isTrading = false, stopTrading = null } = useSharedInventoryTrade();
const { getCount = null, resetCategory = null } = useSharedInventoryUnseenTracker(); const { getCount = null, resetCategory = null } = useSharedInventoryUnseenTracker();
const close = useCallback(() => const close = () =>
{ {
// close the trade if(isTrading) stopTrading();
// if(furnitureState.tradeData)
// {
// switch(furnitureState.tradeData.state)
// {
// case TradeState.TRADING_STATE_RUNNING:
// SendMessageComposer(new TradingCloseComposer());
// return;
// default:
// SendMessageComposer(new TradingCancelComposer());
// return;
// }
// }
setIsVisible(false); setIsVisible(false);
}, []); }
const onInventoryTradeRequestEvent = useCallback((event: InventoryTradeRequestEvent) =>
{
switch(event.type)
{
case InventoryTradeRequestEvent.REQUEST_TRADE: {
const tradeEvent = (event as InventoryTradeRequestEvent);
SendMessageComposer(new TradingOpenComposer(tradeEvent.objectId));
}
}
}, []);
UseUiEvent(InventoryTradeRequestEvent.REQUEST_TRADE, onInventoryTradeRequestEvent);
const onRoomEngineObjectPlacedEvent = useCallback((event: RoomEngineObjectPlacedEvent) => const onRoomEngineObjectPlacedEvent = useCallback((event: RoomEngineObjectPlacedEvent) =>
{ {
@ -143,13 +117,8 @@ export const InventoryView: FC<{}> = props =>
useEffect(() => useEffect(() =>
{ {
if(!isVisible) if(!isVisible && isTrading) setIsVisible(true);
{ }, [ isVisible, isTrading ]);
// if trading show it
}
}, [ isVisible ]);
const isTrading = false;
if(!isVisible) return null; if(!isVisible) return null;

View File

@ -1,16 +1,16 @@
import { FC, useEffect } from 'react'; import { FC, useEffect } from 'react';
import { IBadgeItem, LocalizeBadgeName, LocalizeText, UnseenItemCategory } from '../../../api'; import { LocalizeBadgeName, LocalizeText, UnseenItemCategory } from '../../../api';
import { AutoGrid, Button, Column, Flex, Grid, LayoutBadgeImageView, LayoutGridItem, Text } from '../../../common'; import { AutoGrid, Button, Column, Flex, Grid, LayoutBadgeImageView, LayoutGridItem, Text } from '../../../common';
import { useSharedInventoryBadges, useSharedInventoryUnseenTracker } from '../../../hooks'; import { useSharedInventoryBadges, useSharedInventoryUnseenTracker } from '../../../hooks';
export const InventoryBadgeView: FC<{}> = props => export const InventoryBadgeView: FC<{}> = props =>
{ {
const { badges = [], activeBadges = [], selectedBadge = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, selectBadge = null } = useSharedInventoryBadges(); const { badgeCodes = [], activeBadgeCodes = [], selectedBadgeCode = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, selectBadge = null, getBadgeId = null } = useSharedInventoryBadges();
const { getCount = null, resetCategory = null, isUnseen = null, removeUnseen = null } = useSharedInventoryUnseenTracker(); const { getCount = null, resetCategory = null, isUnseen = null, removeUnseen = null } = useSharedInventoryUnseenTracker();
useEffect(() => useEffect(() =>
{ {
if(!badges || !badges.length) return; if(!badgeCodes || !badgeCodes.length) return;
return () => return () =>
{ {
@ -20,23 +20,24 @@ export const InventoryBadgeView: FC<{}> = props =>
resetCategory(UnseenItemCategory.BADGE); resetCategory(UnseenItemCategory.BADGE);
} }
}, [ badges, getCount, resetCategory ]); }, [ badgeCodes, getCount, resetCategory ]);
const InventoryBadgeItemView: FC<{ badge: IBadgeItem }> = props => const InventoryBadgeItemView: FC<{ badgeCode: string }> = props =>
{ {
const { badge = null, children = null, ...rest } = props; const { badgeCode = null, children = null, ...rest } = props;
const unseen = isUnseen(UnseenItemCategory.BADGE, badge.id); const badgeId = getBadgeId(badgeCode);
const unseen = isUnseen(UnseenItemCategory.BADGE, badgeId);
const select = () => const select = () =>
{ {
selectBadge(badge); selectBadge(badgeCode);
if(unseen) removeUnseen(UnseenItemCategory.BADGE, badge.id); if(unseen) removeUnseen(UnseenItemCategory.BADGE, badgeId);
} }
return ( return (
<LayoutGridItem itemActive={ (selectedBadge === badge) } itemUnseen={ unseen } onMouseDown={ select } { ...rest }> <LayoutGridItem itemActive={ (selectedBadgeCode === badgeCode) } itemUnseen={ unseen } onMouseDown={ select } { ...rest }>
<LayoutBadgeImageView badgeCode={ badge.badgeCode } /> <LayoutBadgeImageView badgeCode={ badgeCode } />
{ children } { children }
</LayoutGridItem> </LayoutGridItem>
); );
@ -46,11 +47,11 @@ export const InventoryBadgeView: FC<{}> = props =>
<Grid> <Grid>
<Column size={ 7 } overflow="hidden"> <Column size={ 7 } overflow="hidden">
<AutoGrid columnCount={ 4 }> <AutoGrid columnCount={ 4 }>
{ badges && (badges.length > 0) && badges.map((badge, index) => { badgeCodes && (badgeCodes.length > 0) && badgeCodes.map((badgeCode, index) =>
{ {
if(activeBadges.indexOf(badge) >= 0) return null; if(activeBadgeCodes.indexOf(badgeCode) >= 0) return null;
return <InventoryBadgeItemView key={ index } badge={ badge } /> return <InventoryBadgeItemView key={ index } badgeCode={ badgeCode } />
}) } }) }
</AutoGrid> </AutoGrid>
</Column> </Column>
@ -58,16 +59,16 @@ export const InventoryBadgeView: FC<{}> = props =>
<Column overflow="hidden" gap={ 2 }> <Column overflow="hidden" gap={ 2 }>
<Text>{ LocalizeText('inventory.badges.activebadges') }</Text> <Text>{ LocalizeText('inventory.badges.activebadges') }</Text>
<AutoGrid columnCount={ 3 }> <AutoGrid columnCount={ 3 }>
{ activeBadges && (activeBadges.length > 0) && activeBadges.map((badge, index) => <InventoryBadgeItemView key={ index } badge={ badge } />) } { activeBadgeCodes && (activeBadgeCodes.length > 0) && activeBadgeCodes.map((badgeCode, index) => <InventoryBadgeItemView key={ index } badgeCode={ badgeCode } />) }
</AutoGrid> </AutoGrid>
</Column> </Column>
{ !!selectedBadge && { !!selectedBadgeCode &&
<Column grow justifyContent="end" gap={ 2 }> <Column grow justifyContent="end" gap={ 2 }>
<Flex alignItems="center" gap={ 2 }> <Flex alignItems="center" gap={ 2 }>
<LayoutBadgeImageView shrink badgeCode={ selectedBadge.badgeCode } /> <LayoutBadgeImageView shrink badgeCode={ selectedBadgeCode } />
<Text>{ LocalizeBadgeName(selectedBadge.badgeCode) }</Text> <Text>{ LocalizeBadgeName(selectedBadgeCode) }</Text>
</Flex> </Flex>
<Button variant={ (isWearingBadge(selectedBadge) ? 'danger' : 'success') } disabled={ !isWearingBadge(selectedBadge) && !canWearBadges() } onClick={ event => toggleBadge(selectedBadge) }>{ LocalizeText(isWearingBadge(selectedBadge) ? 'inventory.badges.clearbadge' : 'inventory.badges.wearbadge') }</Button> <Button variant={ (isWearingBadge(selectedBadgeCode) ? 'danger' : 'success') } disabled={ !isWearingBadge(selectedBadgeCode) && !canWearBadges() } onClick={ event => toggleBadge(selectedBadgeCode) }>{ LocalizeText(isWearingBadge(selectedBadgeCode) ? 'inventory.badges.clearbadge' : 'inventory.badges.wearbadge') }</Button>
</Column> } </Column> }
</Column> </Column>
</Grid> </Grid>

View File

@ -26,9 +26,9 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
const canTradeItem = (isWallItem: boolean, spriteId: number, category: number, groupable: boolean, stuffData: IObjectData) => const canTradeItem = (isWallItem: boolean, spriteId: number, category: number, groupable: boolean, stuffData: IObjectData) =>
{ {
if(!ownUser || ownUser.accepts || !ownUser.items) return false; if(!ownUser || ownUser.accepts || !ownUser.userItems) return false;
if(ownUser.items.length < MAX_ITEMS_TO_TRADE) return true; if(ownUser.userItems.length < MAX_ITEMS_TO_TRADE) return true;
if(!groupable) return false; if(!groupable) return false;
@ -50,7 +50,7 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
} }
} }
return !!ownUser.items.getValue(type); return !!ownUser.userItems.getValue(type);
} }
const attemptItemOffer = (count: number) => const attemptItemOffer = (count: number) =>
@ -71,7 +71,7 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
if(!coreItem) coreItem = item; if(!coreItem) coreItem = item;
} }
const ownItemCount = ownUser.items.length; const ownItemCount = ownUser.userItems.length;
if((ownItemCount + itemIds.length) <= 1500) if((ownItemCount + itemIds.length) <= 1500)
{ {
@ -130,12 +130,7 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
{ {
const newValue = (prevValue - 1); const newValue = (prevValue - 1);
if(newValue === 0) if(newValue === 0) clearInterval(interval);
{
setTradeState(TradeState.TRADING_STATE_CONFIRMING);
clearInterval(interval);
}
return newValue; return newValue;
}); });
@ -144,6 +139,15 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
return () => clearInterval(interval); return () => clearInterval(interval);
}, [ tradeState, setTradeState ]); }, [ tradeState, setTradeState ]);
useEffect(() =>
{
if(countdownTick !== 0) return;
setTradeState(TradeState.TRADING_STATE_CONFIRMING);
}, [ countdownTick, setTradeState ]);
if((tradeState === TradeState.TRADING_STATE_READY) || !ownUser || !otherUser) return null;
return ( return (
<Grid> <Grid>
<Column size={ 4 } overflow="hidden"> <Column size={ 4 } overflow="hidden">
@ -179,7 +183,7 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
<AutoGrid columnCount={ 3 }> <AutoGrid columnCount={ 3 }>
{ Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) => { Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) =>
{ {
const item = (ownUser.items.getWithIndex(i) || null); const item = (ownUser.userItems.getWithIndex(i) || null);
if(!item) return <LayoutGridItem key={ i } />; if(!item) return <LayoutGridItem key={ i } />;
@ -205,7 +209,7 @@ export const InventoryTradeView: FC<InventoryTradeViewProps> = props =>
<AutoGrid columnCount={ 3 }> <AutoGrid columnCount={ 3 }>
{ Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) => { Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) =>
{ {
const item = (otherUser.items.getWithIndex(i) || null); const item = (otherUser.userItems.getWithIndex(i) || null);
if(!item) return <LayoutGridItem key={ i } />; if(!item) return <LayoutGridItem key={ i } />;

View File

@ -9,40 +9,41 @@ export const parseTradeItems = (items: ItemDataStructure[]) =>
const existingItems = new AdvancedMap<string, GroupItem>(); const existingItems = new AdvancedMap<string, GroupItem>();
const totalItems = items.length; const totalItems = items.length;
if(!totalItems) return null; if(totalItems)
for(const item of items)
{ {
const spriteId = item.spriteId; for(const item of items)
const category = item.category;
let name = (item.furniType + spriteId);
if(!item.isGroupable || isExternalImage(spriteId))
{ {
name = ('itemid' + item.itemId); const spriteId = item.spriteId;
const category = item.category;
let name = (item.furniType + spriteId);
if(!item.isGroupable || isExternalImage(spriteId))
{
name = ('itemid' + item.itemId);
}
if(item.category === FurniCategory.POSTER)
{
name = (item.itemId + 'poster' + item.stuffData.getLegacyString());
}
else if(item.category === FurniCategory.GUILD_FURNI)
{
name = '';
}
let groupItem = ((item.isGroupable && !isExternalImage(item.spriteId)) ? existingItems.getValue(name) : null);
if(!groupItem)
{
groupItem = createGroupItem(spriteId, category, item.stuffData);
existingItems.add(name, groupItem);
}
groupItem.push(new FurnitureItem(item));
} }
if(item.category === FurniCategory.POSTER)
{
name = (item.itemId + 'poster' + item.stuffData.getLegacyString());
}
else if(item.category === FurniCategory.GUILD_FURNI)
{
name = '';
}
let groupItem = ((item.isGroupable && !isExternalImage(item.spriteId)) ? existingItems.getValue(name) : null);
if(!groupItem)
{
groupItem = createGroupItem(spriteId, category, item.stuffData);
existingItems.add(name, groupItem);
}
groupItem.push(new FurnitureItem(item));
} }
return existingItems; return existingItems;

View File

@ -2,34 +2,35 @@ import { BadgeReceivedEvent, BadgesEvent, RequestBadgesComposer, SetActivatedBad
import { useCallback, useEffect, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import { useBetween } from 'use-between'; import { useBetween } from 'use-between';
import { BatchUpdates, UseMessageEventHook } from '..'; import { BatchUpdates, UseMessageEventHook } from '..';
import { GetConfiguration, IBadgeItem, SendMessageComposer } from '../../api'; import { GetConfiguration, SendMessageComposer } from '../../api';
import { useSharedVisibility } from '../useSharedVisibility'; import { useSharedVisibility } from '../useSharedVisibility';
const useInventoryBadges = () => const useInventoryBadges = () =>
{ {
const [ isVisible, setIsVisible ] = useState(false); const [ isVisible, setIsVisible ] = useState(false);
const [ needsUpdate, setNeedsUpdate ] = useState(true); const [ needsUpdate, setNeedsUpdate ] = useState(true);
const [ badges, setBadges ] = useState<IBadgeItem[]>([]); const [ badgeCodes, setBadgeCodes ] = useState<string[]>([]);
const [ activeBadges, setActiveBadges ] = useState<IBadgeItem[]>([]); const [ badgeIds, setBadgeIds ] = useState<number[]>([]);
const [ selectedBadge, setSelectedBadge ] = useState<IBadgeItem>(null); const [ activeBadgeCodes, setActiveBadgeCodes ] = useState<string[]>([]);
const [ selectedBadgeCode, setSelectedBadgeCode ] = useState<string>(null);
const maxBadgeCount = GetConfiguration<number>('user.badges.max.slots', 5); const maxBadgeCount = GetConfiguration<number>('user.badges.max.slots', 5);
const isWearingBadge = (badge: IBadgeItem) => (activeBadges.indexOf(badge) >= 0); const isWearingBadge = (badgeCode: string) => (activeBadgeCodes.indexOf(badgeCode) >= 0);
const canWearBadges = () => (activeBadges.length < maxBadgeCount); const canWearBadges = () => (activeBadgeCodes.length < maxBadgeCount);
const toggleBadge = (badge: IBadgeItem) => const toggleBadge = (badgeCode: string) =>
{ {
setActiveBadges(prevValue => setActiveBadgeCodes(prevValue =>
{ {
const newValue = [ ...prevValue ]; const newValue = [ ...prevValue ];
const index = newValue.indexOf(badge); const index = newValue.indexOf(badgeCode);
if(index === -1) if(index === -1)
{ {
if(!canWearBadges()) return prevValue; if(!canWearBadges()) return prevValue;
newValue.push(badge); newValue.push(badgeCode);
} }
else else
{ {
@ -38,7 +39,7 @@ const useInventoryBadges = () =>
const composer = new SetActivatedBadgesComposer(); const composer = new SetActivatedBadgesComposer();
for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge((newValue[i] && newValue[i].badgeCode) || null); for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null);
SendMessageComposer(composer); SendMessageComposer(composer);
@ -46,11 +47,20 @@ const useInventoryBadges = () =>
}); });
} }
const selectBadge = (badge: IBadgeItem) => const selectBadge = (badgeCode: string) =>
{ {
if(badges.indexOf(badge) === -1) return; if(badgeCodes.indexOf(badgeCode) === -1) return;
setSelectedBadge(badge); setSelectedBadgeCode(badgeCode);
}
const getBadgeId = (badgeCode: string) =>
{
const index = badgeCodes.indexOf(badgeCode);
if(index === -1) return 0;
return (badgeIds[index] || 0);
} }
const onBadgesEvent = useCallback((event: BadgesEvent) => const onBadgesEvent = useCallback((event: BadgesEvent) =>
@ -59,25 +69,14 @@ const useInventoryBadges = () =>
BatchUpdates(() => BatchUpdates(() =>
{ {
setBadges(prevValue => const newBadgeCodes = parser.getAllBadgeCodes();
{ const newBadgeIds: number[] = [];
const newValue: IBadgeItem[] = [];
const badgeCodes = parser.getAllBadgeCodes();
for(const badgeCode of badgeCodes) newValue.push({ id: parser.getBadgeId(badgeCode), badgeCode }); for(const newBadgeCode of newBadgeCodes) newBadgeIds.push(parser.getBadgeId(newBadgeCode));
return newValue; setBadgeCodes(newBadgeCodes);
}); setBadgeIds(newBadgeIds);
setActiveBadgeCodes(parser.getActiveBadgeCodes());
setActiveBadges(prevValue =>
{
const newValue: IBadgeItem[] = [];
const badgeCodes = parser.getActiveBadgeCodes();
for(const badgeCode of badgeCodes) newValue.push({ id: parser.getBadgeId(badgeCode), badgeCode });
return newValue;
});
}); });
}, []); }, []);
@ -87,33 +86,45 @@ const useInventoryBadges = () =>
{ {
const parser = event.getParser(); const parser = event.getParser();
setBadges(prevValue => BatchUpdates(() =>
{ {
const newValue = [ ...prevValue ]; setBadgeCodes(prevValue =>
{
const newValue = [ ...prevValue ];
newValue.push({ id: parser.badgeId, badgeCode: parser.badgeCode }); newValue.push(parser.badgeCode);
return newValue; return newValue;
}); });
setBadgeIds(prevValue =>
{
const newValue = [ ...prevValue ];
newValue.push(parser.badgeId);
return newValue;
})
});
}, []); }, []);
UseMessageEventHook(BadgeReceivedEvent, onBadgeReceivedEvent); UseMessageEventHook(BadgeReceivedEvent, onBadgeReceivedEvent);
useEffect(() => useEffect(() =>
{ {
if(!badges || !badges.length) return; if(!badgeCodes || !badgeCodes.length) return;
setSelectedBadge(prevValue => setSelectedBadgeCode(prevValue =>
{ {
let newValue = prevValue; let newValue = prevValue;
if(newValue && (badges.indexOf(newValue) === -1)) newValue = null; if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null;
if(!newValue) newValue = badges[0]; if(!newValue) newValue = badgeCodes[0];
return newValue; return newValue;
}); });
}, [ badges ]); }, [ badgeCodes ]);
useEffect(() => useEffect(() =>
{ {
@ -124,7 +135,7 @@ const useInventoryBadges = () =>
setNeedsUpdate(false); setNeedsUpdate(false);
}, [ isVisible, needsUpdate ]); }, [ isVisible, needsUpdate ]);
return { badges, activeBadges, selectedBadge, isWearingBadge, canWearBadges, toggleBadge, selectBadge, setIsVisible }; return { badgeCodes, activeBadgeCodes, selectedBadgeCode, isWearingBadge, canWearBadges, toggleBadge, selectBadge, getBadgeId, setIsVisible };
} }
export const useSharedInventoryBadges = () => export const useSharedInventoryBadges = () =>

View File

@ -116,7 +116,12 @@ const useInventoryFurni = () =>
const group = newValue[index]; const group = newValue[index];
const item = group.remove(existingId); const item = group.remove(existingId);
if(!item) index++; if(!item)
{
index++;
continue;
}
if(getPlacingItemId() === item.ref) if(getPlacingItemId() === item.ref)
{ {
@ -183,7 +188,12 @@ const useInventoryFurni = () =>
const group = newValue[index]; const group = newValue[index];
const item = group.remove(parser.itemId); const item = group.remove(parser.itemId);
if(!item) index++; if(!item)
{
index++;
continue;
}
if(getPlacingItemId() === item.ref) if(getPlacingItemId() === item.ref)
{ {

View File

@ -1,9 +1,11 @@
import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenEvent, TradingOpenFailedEvent, TradingOpenFailedParser, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer'; import { AdvancedMap, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCloseParser, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListItemEvent, TradingListItemRemoveComposer, TradingNotOpenEvent, TradingOpenComposer, TradingOpenEvent, TradingOpenFailedEvent, TradingOpenFailedParser, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent } from '@nitrots/nitro-renderer';
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
import { useBetween } from 'use-between'; import { useBetween } from 'use-between';
import { useSharedInventoryFurni } from '.'; import { useSharedInventoryFurni } from '.';
import { BatchUpdates, UseMessageEventHook } from '..'; import { BatchUpdates, UseMessageEventHook } from '..';
import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, NotificationUtilities, SendMessageComposer, TradeState, TradeUserData, TradingNotificationMessage, TradingNotificationType } from '../../api'; import { CloneObject, GetRoomSession, GetSessionDataManager, GroupItem, LocalizeText, NotificationUtilities, SendMessageComposer, TradeState, TradeUserData, TradingNotificationMessage, TradingNotificationType } from '../../api';
import { InventoryTradeRequestEvent } from '../../events';
import { UseUiEvent } from '../events';
import { parseTradeItems } from './common'; import { parseTradeItems } from './common';
const useInventoryTrade = () => const useInventoryTrade = () =>
@ -12,6 +14,7 @@ const useInventoryTrade = () =>
const [ otherUser, setOtherUser ] = useState<TradeUserData>(null); const [ otherUser, setOtherUser ] = useState<TradeUserData>(null);
const [ tradeState, setTradeState ] = useState(TradeState.TRADING_STATE_READY); const [ tradeState, setTradeState ] = useState(TradeState.TRADING_STATE_READY);
const { groupItems = [], setGroupItems = null } = useSharedInventoryFurni(); const { groupItems = [], setGroupItems = null } = useSharedInventoryFurni();
const isTrading = (tradeState >= TradeState.TRADING_STATE_RUNNING);
const progressTrade = () => const progressTrade = () =>
{ {
@ -49,6 +52,35 @@ const useInventoryTrade = () =>
SendMessageComposer(new TradingListItemRemoveComposer(item.id)); SendMessageComposer(new TradingListItemRemoveComposer(item.id));
} }
const stopTrading = () =>
{
if(!isTrading) return;
switch(tradeState)
{
case TradeState.TRADING_STATE_RUNNING:
SendMessageComposer(new TradingCloseComposer());
return;
default:
SendMessageComposer(new TradingCancelComposer());
return;
}
}
const onInventoryTradeRequestEvent = useCallback((event: InventoryTradeRequestEvent) =>
{
switch(event.type)
{
case InventoryTradeRequestEvent.REQUEST_TRADE: {
const tradeEvent = (event as InventoryTradeRequestEvent);
SendMessageComposer(new TradingOpenComposer(tradeEvent.objectId));
}
}
}, []);
UseUiEvent(InventoryTradeRequestEvent.REQUEST_TRADE, onInventoryTradeRequestEvent);
const onTradingAcceptEvent = useCallback((event: TradingAcceptEvent) => const onTradingAcceptEvent = useCallback((event: TradingAcceptEvent) =>
{ {
const parser = event.getParser(); const parser = event.getParser();
@ -102,6 +134,7 @@ const useInventoryTrade = () =>
{ {
setOwnUser(null); setOwnUser(null);
setOtherUser(null); setOtherUser(null);
setTradeState(TradeState.TRADING_STATE_READY);
}); });
}, [ ownUser ]); }, [ ownUser ]);
@ -115,6 +148,7 @@ const useInventoryTrade = () =>
{ {
setOwnUser(null); setOwnUser(null);
setOtherUser(null); setOtherUser(null);
setTradeState(TradeState.TRADING_STATE_READY);
}); });
}, []); }, []);
@ -143,18 +177,18 @@ const useInventoryTrade = () =>
{ {
newValue.creditsCount = parser.firstUserNumCredits; newValue.creditsCount = parser.firstUserNumCredits;
newValue.itemCount = parser.firstUserNumItems; newValue.itemCount = parser.firstUserNumItems;
newValue.items = firstUserItems; newValue.userItems = firstUserItems;
} }
else else
{ {
newValue.creditsCount = parser.secondUserNumCredits; newValue.creditsCount = parser.secondUserNumCredits;
newValue.itemCount = parser.secondUserNumItems; newValue.itemCount = parser.secondUserNumItems;
newValue.items = secondUserItems; newValue.userItems = secondUserItems;
} }
const tradeIds: number[] = []; const tradeIds: number[] = [];
for(const groupItem of newValue.items.getValues()) for(const groupItem of newValue.userItems.getValues())
{ {
let i = 0; let i = 0;
@ -188,13 +222,13 @@ const useInventoryTrade = () =>
{ {
newValue.creditsCount = parser.firstUserNumCredits; newValue.creditsCount = parser.firstUserNumCredits;
newValue.itemCount = parser.firstUserNumItems; newValue.itemCount = parser.firstUserNumItems;
newValue.items = firstUserItems; newValue.userItems = firstUserItems;
} }
else else
{ {
newValue.creditsCount = parser.secondUserNumCredits; newValue.creditsCount = parser.secondUserNumCredits;
newValue.itemCount = parser.secondUserNumItems; newValue.itemCount = parser.secondUserNumItems;
newValue.items = secondUserItems; newValue.userItems = secondUserItems;
} }
return newValue; return newValue;
@ -206,8 +240,6 @@ const useInventoryTrade = () =>
const onTradingNotOpenEvent = useCallback((event: TradingNotOpenEvent) => const onTradingNotOpenEvent = useCallback((event: TradingNotOpenEvent) =>
{ {
const parser = event.getParser(); const parser = event.getParser();
console.log(parser);
}, []); }, []);
UseMessageEventHook(TradingNotOpenEvent, onTradingNotOpenEvent); UseMessageEventHook(TradingNotOpenEvent, onTradingNotOpenEvent);
@ -287,7 +319,7 @@ const useInventoryTrade = () =>
UseMessageEventHook(TradingYouAreNotAllowedEvent, onTradingYouAreNotAllowedEvent); UseMessageEventHook(TradingYouAreNotAllowedEvent, onTradingYouAreNotAllowedEvent);
return { ownUser, otherUser, tradeState, setTradeState, groupItems, progressTrade, removeItem }; return { ownUser, otherUser, tradeState, setTradeState, isTrading, groupItems, progressTrade, removeItem, stopTrading };
} }
export const useSharedInventoryTrade = () => useBetween(useInventoryTrade); export const useSharedInventoryTrade = () => useBetween(useInventoryTrade);

View File

@ -109,8 +109,6 @@ const useInventoryUnseenTracker = () =>
{ {
const parser = event.getParser(); const parser = event.getParser();
console.log(parser);
setUnseenItems(prevValue => setUnseenItems(prevValue =>
{ {
const newValue = new Map(prevValue); const newValue = new Map(prevValue);