mirror of
https://github.com/duckietm/Nitro-V3.git
synced 2026-06-20 07:26:19 +00:00
236 lines
8.8 KiB
TypeScript
236 lines
8.8 KiB
TypeScript
import { GetRoomEngine, GetSessionDataManager, IFurnitureData, IGetImageListener, PetFigureData, RoomEngineTriggerWidgetEvent, RoomObjectCategory, RoomObjectVariable, RoomSessionPresentEvent, TextureUtils, Vector3d } from '@nitrots/nitro-renderer';
|
|
import { useMemo, useState } from 'react';
|
|
import { IsOwnerOfFurniture, LocalizeText, ProductTypeEnum } from '../../../../api';
|
|
import { useNitroEvent } from '../../../events';
|
|
import { useFurniRemovedEvent } from '../../engine';
|
|
import { useRoom } from '../../useRoom';
|
|
|
|
const FLOOR: string = 'floor';
|
|
const WALLPAPER: string = 'wallpaper';
|
|
const LANDSCAPE: string = 'landscape';
|
|
const POSTER: string = 'poster';
|
|
|
|
const useFurniturePresentWidgetState = () =>
|
|
{
|
|
const [ objectId, setObjectId ] = useState(-1);
|
|
const [ classId, setClassId ] = useState(-1);
|
|
const [ itemType, setItemType ] = useState<string>(null);
|
|
const [ text, setText ] = useState<string>(null);
|
|
const [ isOwnerOfFurniture, setIsOwnerOfFurniture ] = useState(false);
|
|
const [ senderName, setSenderName ] = useState<string>(null);
|
|
const [ senderFigure, setSenderFigure ] = useState<string>(null);
|
|
const [ placedItemId, setPlacedItemId ] = useState(-1);
|
|
const [ placedItemType, setPlacedItemType ] = useState<string>(null);
|
|
const [ placedInRoom, setPlacedInRoom ] = useState(false);
|
|
const [ imageUrl, setImageUrl ] = useState<string>(null);
|
|
const { roomSession = null } = useRoom();
|
|
|
|
const onClose = () =>
|
|
{
|
|
setObjectId(-1);
|
|
setClassId(-1);
|
|
setItemType(null);
|
|
setText(null);
|
|
setIsOwnerOfFurniture(false);
|
|
setSenderName(null);
|
|
setSenderFigure(null);
|
|
setPlacedItemId(-1);
|
|
setPlacedItemType(null);
|
|
setPlacedInRoom(false);
|
|
setImageUrl(null);
|
|
};
|
|
|
|
const openPresent = () =>
|
|
{
|
|
if(objectId === -1) return;
|
|
|
|
roomSession.openGift(objectId);
|
|
|
|
GetRoomEngine().changeObjectModelData(GetRoomEngine().activeRoomId, objectId, RoomObjectCategory.FLOOR, RoomObjectVariable.FURNITURE_DISABLE_PICKING_ANIMATION, 1);
|
|
};
|
|
|
|
const imageListener: IGetImageListener = useMemo(() =>
|
|
{
|
|
// async fix image
|
|
return {
|
|
imageReady: (id, texture, image) =>
|
|
{
|
|
(async () =>
|
|
{
|
|
if(!image && texture)
|
|
{
|
|
image = await TextureUtils.generateImage(texture);
|
|
}
|
|
|
|
setImageUrl(image.src);
|
|
})();
|
|
},
|
|
imageFailed: null
|
|
};
|
|
}, []);
|
|
|
|
useNitroEvent<RoomSessionPresentEvent>(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, event =>
|
|
{
|
|
let furniData: IFurnitureData = null;
|
|
|
|
if(event.itemType === ProductTypeEnum.FLOOR)
|
|
{
|
|
furniData = GetSessionDataManager().getFloorItemData(event.classId);
|
|
}
|
|
else if(event.itemType === ProductTypeEnum.WALL)
|
|
{
|
|
furniData = GetSessionDataManager().getWallItemData(event.classId);
|
|
}
|
|
|
|
let isOwnerOfFurni = false;
|
|
|
|
if(event.placedInRoom)
|
|
{
|
|
const roomObject = GetRoomEngine().getRoomObject(roomSession.roomId, event.placedItemId, RoomObjectCategory.FLOOR);
|
|
|
|
if(roomObject) isOwnerOfFurni = IsOwnerOfFurniture(roomObject);
|
|
}
|
|
|
|
let giftImage: string = null;
|
|
|
|
switch(event.itemType)
|
|
{
|
|
case ProductTypeEnum.WALL: {
|
|
if(furniData)
|
|
{
|
|
switch(furniData.className)
|
|
{
|
|
case FLOOR:
|
|
case LANDSCAPE:
|
|
case WALLPAPER:
|
|
let imageType = null;
|
|
let message = null;
|
|
|
|
if(furniData.className === FLOOR)
|
|
{
|
|
imageType = 'packagecard_icon_floor';
|
|
message = LocalizeText('inventory.furni.item.floor.name');
|
|
}
|
|
|
|
else if(furniData.className === LANDSCAPE)
|
|
{
|
|
imageType = 'packagecard_icon_landscape';
|
|
message = LocalizeText('inventory.furni.item.landscape.name');
|
|
}
|
|
|
|
else
|
|
{
|
|
imageType = 'packagecard_icon_wallpaper';
|
|
message = LocalizeText('inventory.furni.item.wallpaper.name');
|
|
}
|
|
|
|
setText(message);
|
|
//setImageUrl(getGiftImageUrl(imageType));
|
|
break;
|
|
case POSTER: {
|
|
const productCode = event.productCode;
|
|
|
|
let extras: string = null;
|
|
|
|
if(productCode.indexOf('poster') === 0) extras = productCode.replace('poster', '');
|
|
|
|
const productData = GetSessionDataManager().getProductData(productCode);
|
|
|
|
let name: string = null;
|
|
|
|
if(productData) name = productData.name;
|
|
else if(furniData) name = furniData.name;
|
|
|
|
setText(name);
|
|
setImageUrl(GetRoomEngine().getFurnitureWallIconUrl(event.classId, extras));
|
|
|
|
break;
|
|
}
|
|
default: {
|
|
setText(furniData.name || null);
|
|
setImageUrl(GetRoomEngine().getFurnitureWallIconUrl(event.classId));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case ProductTypeEnum.HABBO_CLUB:
|
|
setText(LocalizeText('widget.furni.present.hc'));
|
|
//setImageUrl(getGiftImageUrl('packagecard_icon_hc'));
|
|
break;
|
|
default: {
|
|
if(event.placedItemType === ProductTypeEnum.PET)
|
|
{
|
|
const petfigureString = event.petFigureString;
|
|
|
|
if(petfigureString && petfigureString.length)
|
|
{
|
|
const petFigureData = new PetFigureData(petfigureString);
|
|
|
|
(async () =>
|
|
{
|
|
const petImage = GetRoomEngine().getRoomObjectPetImage(petFigureData.typeId, petFigureData.paletteId, petFigureData.color, new Vector3d(90), 64, imageListener, true, 0, petFigureData.customParts);
|
|
|
|
if(petImage) setImageUrl((await petImage.getImage()).src);
|
|
})();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
(async () =>
|
|
{
|
|
const furniImage = GetRoomEngine().getFurnitureFloorImage(event.classId, new Vector3d(90), 64, imageListener);
|
|
|
|
if(furniImage) setImageUrl((await furniImage.getImage()).src);
|
|
})();
|
|
}
|
|
|
|
const productData = GetSessionDataManager().getProductData(event.productCode);
|
|
|
|
setText((productData && productData.name) || furniData.name);
|
|
break;
|
|
}
|
|
}
|
|
|
|
setObjectId(0);
|
|
setClassId(event.classId);
|
|
setItemType(event.itemType);
|
|
setIsOwnerOfFurniture(isOwnerOfFurni);
|
|
setPlacedItemId(event.placedItemId);
|
|
setPlacedItemType(event.placedItemType);
|
|
setPlacedInRoom(event.placedInRoom);
|
|
});
|
|
|
|
useNitroEvent<RoomEngineTriggerWidgetEvent>(RoomEngineTriggerWidgetEvent.REQUEST_PRESENT, event =>
|
|
{
|
|
const roomObject = GetRoomEngine().getRoomObject(event.roomId, event.objectId, event.category);
|
|
|
|
if(!roomObject) return null;
|
|
|
|
onClose();
|
|
|
|
setObjectId(event.objectId);
|
|
setClassId(-1);
|
|
setText((roomObject.model.getValue<string>(RoomObjectVariable.FURNITURE_DATA) || ''));
|
|
setIsOwnerOfFurniture(IsOwnerOfFurniture(roomObject));
|
|
setSenderName((roomObject.model.getValue<string>(RoomObjectVariable.FURNITURE_PURCHASER_NAME) || null));
|
|
setSenderFigure((roomObject.model.getValue<string>(RoomObjectVariable.FURNITURE_PURCHASER_FIGURE) || null));
|
|
});
|
|
|
|
useFurniRemovedEvent((objectId !== -1), event =>
|
|
{
|
|
if(event.id === objectId) onClose();
|
|
|
|
if(event.id === placedItemId)
|
|
{
|
|
if(placedInRoom) setPlacedInRoom(false);
|
|
}
|
|
});
|
|
|
|
return { objectId, classId, itemType, text, isOwnerOfFurniture, senderName, senderFigure, placedItemId, placedItemType, placedInRoom, imageUrl, openPresent, onClose };
|
|
};
|
|
|
|
export const useFurniturePresentWidget = useFurniturePresentWidgetState;
|