From 0f0ce482329e201dddfe36a1dfa5c751764eabe6 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 18 Jun 2021 04:55:31 -0400 Subject: [PATCH] Add pet info event --- .../RoomWidgetUpdateInfostandPetEvent.ts | 36 ++++++ .../room/handlers/RoomWidgetHandlerManager.ts | 2 +- .../handlers/RoomWidgetInfostandHandler.ts | 116 +++++++++++++++++- src/views/room/widgets/RoomWidgetsView.tsx | 3 +- .../widgets/infostand/InfoStandWidgetView.tsx | 8 +- 5 files changed, 156 insertions(+), 9 deletions(-) diff --git a/src/views/room/events/RoomWidgetUpdateInfostandPetEvent.ts b/src/views/room/events/RoomWidgetUpdateInfostandPetEvent.ts index 45d65407..5dbdc2ef 100644 --- a/src/views/room/events/RoomWidgetUpdateInfostandPetEvent.ts +++ b/src/views/room/events/RoomWidgetUpdateInfostandPetEvent.ts @@ -2,4 +2,40 @@ import { RoomWidgetUpdateInfostandEvent } from './RoomWidgetUpdateInfostandEvent export class RoomWidgetUpdateInfostandPetEvent extends RoomWidgetUpdateInfostandEvent { + public static PET_INFO: string = 'RWUIPE_PET_INFO'; + + public level: number = 0; + public maximumLevel: number = 0; + public experience: number = 0; + public levelExperienceGoal: number = 0; + public energy: number = 0; + public maximumEnergy: number = 0; + public happyness: number = 0; + public maximumHappyness: number = 0; + public respectsPetLeft: number = 0; + public respect: number = 0; + public age: number = 0; + public name: string = ''; + public id: number = -1; + public image: HTMLImageElement = null; + public petType: number = 0; + public petBreed: number = 0; + public isOwner: boolean = false; + public ownerId: number = -1; + public ownerName: string = ''; + public canRemovePet: boolean = false; + public roomIndex: number = 0; + public unknownRarityLevel: number = 0; + public saddle: boolean = false; + public rider: boolean = false; + public breedable: boolean = false; + public Str_4460: number[] = []; + public publiclyRideable: number = 0; + public fullyGrown: boolean = false; + public dead: boolean = false; + public rarityLevel: number = 0; + public maximumTimeToLive: number = 0; + public remainingTimeToLive: number = 0; + public remainingGrowTime: number = 0; + public publiclyBreedable: boolean = false; } diff --git a/src/views/room/handlers/RoomWidgetHandlerManager.ts b/src/views/room/handlers/RoomWidgetHandlerManager.ts index 9648c9f1..4d83be33 100644 --- a/src/views/room/handlers/RoomWidgetHandlerManager.ts +++ b/src/views/room/handlers/RoomWidgetHandlerManager.ts @@ -70,7 +70,7 @@ export class RoomWidgetHandlerManager implements IRoomWidgetHandlerManager public processEvent(event: NitroEvent): void { - const handlers = this._messageMap.get(event.type); + const handlers = this._eventMap.get(event.type); if(!handlers || !handlers.length) return null; diff --git a/src/views/room/handlers/RoomWidgetInfostandHandler.ts b/src/views/room/handlers/RoomWidgetInfostandHandler.ts index d525253d..50c85062 100644 --- a/src/views/room/handlers/RoomWidgetInfostandHandler.ts +++ b/src/views/room/handlers/RoomWidgetInfostandHandler.ts @@ -1,7 +1,7 @@ -import { IFurnitureData, Nitro, NitroEvent, ObjectDataFactory, RoomControllerLevel, RoomModerationParser, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomTradingLevelEnum, RoomUserData, RoomWidgetEnumItemExtradataParameter, Vector3d } from 'nitro-renderer'; +import { IFurnitureData, Nitro, NitroEvent, ObjectDataFactory, PetType, RoomControllerLevel, RoomModerationParser, RoomObjectCategory, RoomObjectType, RoomObjectVariable, RoomSessionPetInfoUpdateEvent, RoomTradingLevelEnum, RoomUserData, RoomWidgetEnumItemExtradataParameter, Vector3d } from 'nitro-renderer'; import { GetRoomEngine, GetSessionDataManager, IsOwnerOfFurniture } from '../../../api'; import { LocalizeText } from '../../../utils/LocalizeText'; -import { RoomWidgetObjectNameEvent, RoomWidgetUpdateEvent, RoomWidgetUpdateInfostandFurniEvent, RoomWidgetUpdateInfostandRentableBotEvent, RoomWidgetUpdateInfostandUserEvent } from '../events'; +import { RoomWidgetObjectNameEvent, RoomWidgetUpdateEvent, RoomWidgetUpdateInfostandFurniEvent, RoomWidgetUpdateInfostandPetEvent, RoomWidgetUpdateInfostandRentableBotEvent, RoomWidgetUpdateInfostandUserEvent } from '../events'; import { RoomWidgetChangeMottoMessage, RoomWidgetFurniActionMessage, RoomWidgetMessage, RoomWidgetRoomObjectMessage, RoomWidgetUserActionMessage } from '../messages'; import { RoomWidgetHandler } from './RoomWidgetHandler'; @@ -9,7 +9,13 @@ export class RoomWidgetInfostandHandler extends RoomWidgetHandler { public processEvent(event: NitroEvent): void { - return; + switch(event.type) + { + case RoomSessionPetInfoUpdateEvent.PET_INFO: + this.processPetInfoEvent((event as RoomSessionPetInfoUpdateEvent)); + return; + + } } public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent @@ -62,7 +68,6 @@ export class RoomWidgetInfostandHandler extends RoomWidgetHandler return this.processObjectNameMessage((message as RoomWidgetRoomObjectMessage)); case RoomWidgetRoomObjectMessage.GET_OBJECT_INFO: return this.processObjectInfoMessage((message as RoomWidgetRoomObjectMessage)); - } return null; @@ -431,6 +436,86 @@ export class RoomWidgetInfostandHandler extends RoomWidgetHandler this.eventDispatcher.dispatchEvent(event); } + private processPetInfoEvent(event: RoomSessionPetInfoUpdateEvent): void + { + const petData = event._Str_24727; + + if(!petData) return; + + const roomPetData = this.roomSession.userDataManager.getPetData(petData.id); + + if(!roomPetData) return; + + const figure = roomPetData.figure; + + const petType = this.getPetType(figure); + const petBreed = this.getPetBreed(figure); + + let posture: string = null; + + if(petType === PetType.MONSTERPLANT) + { + if(petData.level >= petData._Str_20651) posture = 'std'; + else posture = ('grw' + petData.level); + } + + // var _local_8:String = (_local_4 + ((_local_7 != null) ? ("/posture=" + _local_7) : "")); + // var _local_9:BitmapData = (this._cachedPetImages.getValue(_local_8) as BitmapData); + // if (_local_9 == null) + // { + // _local_9 = this._Str_2641(_local_4, _local_7); + // this._cachedPetImages.add(_local_8, _local_9); + // } + + const isOwner = (petData.ownerId === GetSessionDataManager().userId); + const infostandEvent = new RoomWidgetUpdateInfostandPetEvent(RoomWidgetUpdateInfostandPetEvent.PET_INFO); + + infostandEvent.name = roomPetData.name; + infostandEvent.id = petData.id; + infostandEvent.ownerId = petData.ownerId; + infostandEvent.ownerName = petData.ownerName; + infostandEvent.rarityLevel = petData.rarityLevel; + infostandEvent.petType = petType; + infostandEvent.petBreed = petBreed; + infostandEvent.isOwner = isOwner; + infostandEvent.roomIndex = roomPetData.roomIndex; + infostandEvent.level = petData.level; + infostandEvent.maximumLevel = petData.maximumLevel; + infostandEvent.experience = petData.experience; + infostandEvent.levelExperienceGoal = petData.levelExperienceGoal; + infostandEvent.energy = petData.energy; + infostandEvent.maximumEnergy = petData.maximumEnergy; + infostandEvent.happyness = petData.happyness; + infostandEvent.maximumHappyness = petData.maximumHappyness; + infostandEvent.respect = petData.respect; + infostandEvent.respectsPetLeft = GetSessionDataManager().respectsPetLeft; + infostandEvent.age = petData.age; + infostandEvent.saddle = petData.saddle; + infostandEvent.rider = petData.rider; + infostandEvent.breedable = petData.breedable; + infostandEvent.fullyGrown = petData.fullyGrown; + infostandEvent.dead = petData.dead; + infostandEvent.rarityLevel = petData.rarityLevel; + infostandEvent.Str_4460 = petData._Str_3307; + infostandEvent.canRemovePet = false; + infostandEvent.publiclyRideable = petData.publiclyRideable; + infostandEvent.maximumTimeToLive = petData.maximumTimeToLive; + infostandEvent.remainingTimeToLive = petData.remainingTimeToLive; + infostandEvent.remainingGrowTime = petData.remainingGrowTime; + infostandEvent.publiclyBreedable = petData.publiclyBreedable; + + if(isOwner) + { + infostandEvent.canRemovePet = true; + } + else + { + if(this.roomSession.isRoomOwner || GetSessionDataManager().isModerator || (this.roomSession.controllerLevel >= RoomControllerLevel.GUEST)) infostandEvent.canRemovePet = true; + } + + this.eventDispatcher.dispatchEvent(infostandEvent); + } + private checkGuildSetting(event: RoomWidgetUpdateInfostandUserEvent): boolean { if(event.isGuildRoom) return (event.roomControllerLevel >= RoomControllerLevel.GUILD_ADMIN); @@ -501,10 +586,31 @@ export class RoomWidgetInfostandHandler extends RoomWidgetHandler return (flag && (event.roomControllerLevel < RoomControllerLevel.ROOM_OWNER)); } + private getPetType(figure: string): number + { + return this.getPetFigurePart(figure, 0); + } + + private getPetBreed(figure: string): number + { + return this.getPetFigurePart(figure, 1); + } + + private getPetFigurePart(figure: string, index: number): number + { + if(!figure || !figure.length) return -1; + + const parts = figure.split(' '); + + if(parts.length > 0) return parseInt(parts[index]); + + return -1; + } + public get eventTypes(): string[] { return [ - + RoomSessionPetInfoUpdateEvent.PET_INFO ]; } diff --git a/src/views/room/widgets/RoomWidgetsView.tsx b/src/views/room/widgets/RoomWidgetsView.tsx index f27f1fe4..913efa23 100644 --- a/src/views/room/widgets/RoomWidgetsView.tsx +++ b/src/views/room/widgets/RoomWidgetsView.tsx @@ -1,4 +1,4 @@ -import { RoomSessionChatEvent, RoomSessionDanceEvent, RoomSessionDimmerPresetsEvent, RoomSessionDoorbellEvent, RoomSessionErrorMessageEvent, RoomSessionEvent, RoomSessionFriendRequestEvent, RoomSessionPresentEvent, RoomSessionUserBadgesEvent } from 'nitro-renderer'; +import { RoomSessionChatEvent, RoomSessionDanceEvent, RoomSessionDimmerPresetsEvent, RoomSessionDoorbellEvent, RoomSessionErrorMessageEvent, RoomSessionEvent, RoomSessionFriendRequestEvent, RoomSessionPetInfoUpdateEvent, RoomSessionPresentEvent, RoomSessionUserBadgesEvent } from 'nitro-renderer'; import { FC, useCallback } from 'react'; import { useRoomSessionManagerEvent } from '../../../hooks/events'; import { LocalizeText } from '../../../utils/LocalizeText'; @@ -32,6 +32,7 @@ export const RoomWidgetsView: FC = props => useRoomSessionManagerEvent(RoomSessionDimmerPresetsEvent.RSDPE_PRESETS, onRoomSessionEvent); useRoomSessionManagerEvent(RoomSessionFriendRequestEvent.RSFRE_FRIEND_REQUEST, onRoomSessionEvent); useRoomSessionManagerEvent(RoomSessionPresentEvent.RSPE_PRESENT_OPENED, onRoomSessionEvent); + useRoomSessionManagerEvent(RoomSessionPetInfoUpdateEvent.PET_INFO, onRoomSessionEvent); const onRoomErrorEvent = useCallback((event: RoomSessionEvent) => { diff --git a/src/views/room/widgets/infostand/InfoStandWidgetView.tsx b/src/views/room/widgets/infostand/InfoStandWidgetView.tsx index 6234eceb..9cfbfd2b 100644 --- a/src/views/room/widgets/infostand/InfoStandWidgetView.tsx +++ b/src/views/room/widgets/infostand/InfoStandWidgetView.tsx @@ -70,8 +70,11 @@ export const InfoStandWidgetView: FC = props => case RoomWidgetUpdateInfostandUserEvent.OWN_USER: case RoomWidgetUpdateInfostandUserEvent.PEER: case RoomWidgetUpdateInfostandUserEvent.BOT: - case RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT: { - const infostandEvent = (event as RoomWidgetUpdateInfostandFurniEvent); + case RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT: + case RoomWidgetUpdateInfostandPetEvent.PET_INFO: { + const infostandEvent = (event as RoomWidgetUpdateInfostandEvent); + + console.log(infostandEvent); setInfoStandEvent(infostandEvent); return; @@ -91,6 +94,7 @@ export const InfoStandWidgetView: FC = props => CreateEventDispatcherHook(RoomWidgetUpdateInfostandUserEvent.PEER, eventDispatcher, onRoomWidgetUpdateEvent); CreateEventDispatcherHook(RoomWidgetUpdateInfostandUserEvent.BOT, eventDispatcher, onRoomWidgetUpdateEvent); CreateEventDispatcherHook(RoomWidgetUpdateInfostandRentableBotEvent.RENTABLE_BOT, eventDispatcher, onRoomWidgetUpdateEvent); + CreateEventDispatcherHook(RoomWidgetUpdateInfostandPetEvent.PET_INFO, eventDispatcher, onRoomWidgetUpdateEvent); const getInfostandView = useCallback(() => {