diff --git a/src/views/room/handlers/RoomWidgetChatInputHandler.ts b/src/views/room/handlers/RoomWidgetChatInputHandler.ts index 20f054e6..18b0b2b9 100644 --- a/src/views/room/handlers/RoomWidgetChatInputHandler.ts +++ b/src/views/room/handlers/RoomWidgetChatInputHandler.ts @@ -1,5 +1,6 @@ import { AvatarExpressionEnum, HabboClubLevelEnum, NitroEvent, RoomControllerLevel, RoomSessionChatEvent, RoomSettingsComposer, RoomZoomEvent } from 'nitro-renderer'; -import { GetConnection, GetRoomEngine, GetSessionDataManager } from '../../../api'; +import { GetRoomEngine, GetSessionDataManager } from '../../../api'; +import { SendMessageHook } from '../../../hooks/messages'; import { RoomWidgetFloodControlEvent, RoomWidgetUpdateEvent } from '../events'; import { RoomWidgetChatMessage, RoomWidgetChatSelectAvatarMessage, RoomWidgetChatTypingMessage, RoomWidgetMessage, RoomWidgetRequestWidgetMessage } from '../messages'; import { RoomWidgetHandler } from './RoomWidgetHandler'; @@ -148,7 +149,7 @@ export class RoomWidgetChatInputHandler extends RoomWidgetHandler case ':settings': if(this.container.roomSession.isRoomOwner || GetSessionDataManager().isModerator) { - GetConnection().send(new RoomSettingsComposer(this.container.roomSession.roomId)); + SendMessageHook(new RoomSettingsComposer(this.container.roomSession.roomId)); } return null; diff --git a/src/views/room/widgets/avatar-info/utils/PetSupplementEnum.ts b/src/views/room/widgets/avatar-info/utils/PetSupplementEnum.ts new file mode 100644 index 00000000..eb236875 --- /dev/null +++ b/src/views/room/widgets/avatar-info/utils/PetSupplementEnum.ts @@ -0,0 +1,5 @@ +export class PetSupplementEnum +{ + public static WATER: number = 0; + public static LIGHT: number = 1; +} diff --git a/src/views/room/widgets/avatar-info/views/avatar/AvatarInfoWidgetAvatarView.tsx b/src/views/room/widgets/avatar-info/views/avatar/AvatarInfoWidgetAvatarView.tsx index d2f3bff6..9f6d5415 100644 --- a/src/views/room/widgets/avatar-info/views/avatar/AvatarInfoWidgetAvatarView.tsx +++ b/src/views/room/widgets/avatar-info/views/avatar/AvatarInfoWidgetAvatarView.tsx @@ -103,8 +103,6 @@ export const AvatarInfoWidgetAvatarView: FC = p return newRespectsLeft; }); - //userData.respectLeft--; - messageType = RoomWidgetUserActionMessage.RESPECT_USER; if(newRespectsLeft > 0) hideMenu = false; diff --git a/src/views/room/widgets/avatar-info/views/own-pet/AvatarInfoWidgetOwnPetView.tsx b/src/views/room/widgets/avatar-info/views/own-pet/AvatarInfoWidgetOwnPetView.tsx index b95e6c30..bcc54ac7 100644 --- a/src/views/room/widgets/avatar-info/views/own-pet/AvatarInfoWidgetOwnPetView.tsx +++ b/src/views/room/widgets/avatar-info/views/own-pet/AvatarInfoWidgetOwnPetView.tsx @@ -1,9 +1,235 @@ -import { FC } from 'react'; +import { PetType, RoomObjectCategory, RoomObjectVariable } from 'nitro-renderer'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { GetOwnRoomObject } from '../../../../../../api'; +import { LocalizeText } from '../../../../../../utils/LocalizeText'; +import { useRoomContext } from '../../../../context/RoomContext'; +import { RoomWidgetMessage, RoomWidgetUserActionMessage } from '../../../../messages'; +import { ContextMenuView } from '../../../context-menu/ContextMenuView'; +import { ContextMenuHeaderView } from '../../../context-menu/views/header/ContextMenuHeaderView'; +import { ContextMenuListItemView } from '../../../context-menu/views/list-item/ContextMenuListItemView'; import { AvatarInfoWidgetOwnPetViewProps } from './AvatarInfoWidgetOwnPetView.types'; +const _Str_2906: number = 0; +const _Str_5818: number = 1; +const _Str_5938: number = 2; +const _Str_10946: number = 3; + export const AvatarInfoWidgetOwnPetView: FC = props => { - const { petData = null } = props; - - return null; + const { petData = null, close = null } = props; + const [ mode, setMode ] = useState(_Str_2906); + const [ respectsLeft, setRespectsLeft ] = useState(0); + const { roomSession = null, widgetHandler = null } = useRoomContext(); + + useEffect(() => + { + setMode(prevValue => + { + if(petData.petType === PetType.MONSTERPLANT) return _Str_10946; + else if(petData.saddle && !petData.rider) return _Str_5818; + else if(petData.rider) return _Str_5938; + + return _Str_2906; + }); + + setRespectsLeft(petData.respectsPetLeft); + }, [ petData ]) + + const processAction = useCallback((name: string) => + { + let messageType: string = null; + let message: RoomWidgetMessage = null; + let hideMenu = true; + + if(name) + { + switch(name) + { + case 'respect': + let newRespectsLeft = 0; + + setRespectsLeft(prevValue => + { + newRespectsLeft = (prevValue - 1); + + return newRespectsLeft; + }); + + messageType = RoomWidgetUserActionMessage.RESPECT_PET; + + if(newRespectsLeft > 0) hideMenu = false; + break; + case 'treat': + messageType = RoomWidgetUserActionMessage.TREAT_PET; + break; + case 'pass_handitem': + messageType = RoomWidgetUserActionMessage.GIVE_CARRY_ITEM_TO_PET; + break; + case 'train': + //this.widget._Str_23877(); + break; + case 'pick_up': + messageType = RoomWidgetUserActionMessage.PICKUP_PET; + //this.widget._Str_25401(); + break; + case 'mount': + messageType = RoomWidgetUserActionMessage.MOUNT_PET; + break; + case 'toggle_riding_permission': + messageType = RoomWidgetUserActionMessage.TOGGLE_PET_RIDING_PERMISSION; + // update riding checkbox + break; + case 'toggle_breeding_permission': + messageType = RoomWidgetUserActionMessage.TOGGLE_PET_BREEDING_PERMISSION + // update breeding checkbox; + break; + case 'dismount': + messageType = RoomWidgetUserActionMessage.DISMOUNT_PET; + break; + case 'saddle_off': + messageType = RoomWidgetUserActionMessage.SADDLE_OFF; + break; + case 'breed': + if(mode === _Str_2906) + { + // _local_7 = RoomWidgetPetCommandMessage._Str_16282; + // _local_8 = ("pet.command." + _local_7); + // _local_9 = _Str_2268.catalog.localization.getLocalization(_local_8); + // _local_4 = new RoomWidgetPetCommandMessage(RoomWidgetPetCommandMessage.RWPCM_PET_COMMAND, this._Str_594.id, ((this._Str_594.name + " ") + _local_9)); + } + + else if(mode === _Str_10946) + { + messageType = RoomWidgetUserActionMessage.REQUEST_BREED_PET; + } + break; + case 'harvest': + messageType = RoomWidgetUserActionMessage.HARVEST_PET; + break; + case 'revive': + messageType = RoomWidgetUserActionMessage.REVIVE_PET; + break; + case 'compost': + messageType = RoomWidgetUserActionMessage.COMPOST_PLANT; + break; + case 'buy_saddle': + //this.openCatalogPage(this._Str_11220); + break; + } + + if(messageType) message = new RoomWidgetUserActionMessage(messageType, petData.id); + + if(message) widgetHandler.processWidgetMessage(message); + } + + if(hideMenu) close(); + }, [ widgetHandler, petData, mode, close ]); + + const canGiveHandItem = useMemo(() => + { + let flag = false; + + const roomObject = GetOwnRoomObject(); + + if(roomObject) + { + const carryId = roomObject.model.getValue(RoomObjectVariable.FIGURE_CARRY_OBJECT); + + if((carryId > 0) && (carryId < 999999)) flag = true; + } + + return flag; + }, []); + + return ( + + + { petData.name } + + { (mode === _Str_2906) && + <> + { (respectsLeft > 0) && + processAction('respect') }> + { LocalizeText('infostand.button.petrespect', [ 'count' ], [ respectsLeft.toString() ]) } + } + processAction('train') }> + { LocalizeText('infostand.button.train') } + + processAction('pick_up') }> + { LocalizeText('infostand.button.pickup') } + + { (petData.petType === PetType.HORSE) && + processAction('buy_saddle') }> + { LocalizeText('infostand.button.buy_saddle') } + } + { ([ PetType.BEAR, PetType.TERRIER, PetType.CAT, PetType.DOG, PetType.PIG].indexOf(petData.petType) > -1) && + processAction('breed') }> + { LocalizeText('infostand.button.breed') } + } + } + { (mode === _Str_5818) && + <> + processAction('mount') }> + { LocalizeText('infostand.button.mount') } + + processAction('toggle_riding_permission') }> + { LocalizeText('infostand.button.toggle_riding_permission') } + + { (respectsLeft > 0) && + processAction('respect') }> + { LocalizeText('infostand.button.petrespect', [ 'count' ], [ respectsLeft.toString() ]) } + } + processAction('train') }> + { LocalizeText('infostand.button.train') } + + processAction('pick_up') }> + { LocalizeText('infostand.button.pickup') } + + processAction('saddle_off') }> + { LocalizeText('infostand.button.saddle_off') } + + } + { (mode === _Str_5938) && + <> + processAction('dismount') }> + { LocalizeText('infostand.button.dismount') } + + { (respectsLeft > 0) && + processAction('respect') }> + { LocalizeText('infostand.button.petrespect', [ 'count' ], [ respectsLeft.toString() ]) } + } + } + { (mode === _Str_10946) && + <> + processAction('pick_up') }> + { LocalizeText('infostand.button.pickup') } + + { petData.dead && + processAction('revive') }> + { LocalizeText('infostand.button.revive') } + } + { roomSession.isRoomOwner && + processAction('compost') }> + { LocalizeText('infostand.button.compost') } + } + { !petData.dead && ((petData.energy / petData.maximumEnergy) < 0.98) && + processAction('treat') }> + { LocalizeText('infostand.button.treat') } + } + { !petData.dead && (petData.level === petData.maximumLevel) && petData.breedable && + <> + processAction('toggle_breeding_permission') }> + { LocalizeText('infostand.button.toggle_breeding_permission') } + + processAction('breed') }> + { LocalizeText('infostand.button.breed') } + + } + } + { canGiveHandItem && + processAction('pass_hand_item') }> + { LocalizeText('infostand.button.pass_hand_item') } + } + + ); } diff --git a/src/views/room/widgets/avatar-info/views/rentable-bot/AvatarInfoWidgetRentableBotView.tsx b/src/views/room/widgets/avatar-info/views/rentable-bot/AvatarInfoWidgetRentableBotView.tsx index 13caa8df..ed82968a 100644 --- a/src/views/room/widgets/avatar-info/views/rentable-bot/AvatarInfoWidgetRentableBotView.tsx +++ b/src/views/room/widgets/avatar-info/views/rentable-bot/AvatarInfoWidgetRentableBotView.tsx @@ -1,7 +1,6 @@ import { BotCommandConfigurationEvent, BotRemoveComposer, BotSkillSaveComposer, Nitro, RequestBotCommandConfigurationComposer, RoomObjectCategory } from 'nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { GetConnection } from '../../../../../../api'; -import { CreateMessageHook } from '../../../../../../hooks/messages'; +import { CreateMessageHook, SendMessageHook } from '../../../../../../hooks/messages'; import { LocalizeText } from '../../../../../../utils/LocalizeText'; import { useRoomContext } from '../../../../context/RoomContext'; import { RoomWidgetUpdateRentableBotChatEvent } from '../../../../events'; @@ -73,7 +72,7 @@ export const AvatarInfoWidgetRentableBotView: FC { - GetConnection().send(new RequestBotCommandConfigurationComposer(rentableBotData.webID, skillType)); + SendMessageHook(new RequestBotCommandConfigurationComposer(rentableBotData.webID, skillType)); }, [ rentableBotData ]); const processAction = useCallback((name: string) => @@ -86,45 +85,45 @@ export const AvatarInfoWidgetRentableBotView: FC = props => if(!bounds || !elementRef.current) return; let left = Math.round((bounds.left + (bounds.width / 2)) - (elementRef.current.offsetWidth / 2)); - let top = Math.round((bounds.top - elementRef.current.offsetHeight) + 20); + let top = Math.round((bounds.top - elementRef.current.offsetHeight)); const maxLeft = ((Nitro.instance.width - elementRef.current.offsetWidth) - SPACE_AROUND_EDGES); const maxTop = ((Nitro.instance.height - elementRef.current.offsetHeight) - SPACE_AROUND_EDGES); diff --git a/src/views/room/widgets/infostand/views/rentable-bot/InfoStandWidgetRentableBotView.tsx b/src/views/room/widgets/infostand/views/rentable-bot/InfoStandWidgetRentableBotView.tsx index a25fc8d3..c4d79504 100644 --- a/src/views/room/widgets/infostand/views/rentable-bot/InfoStandWidgetRentableBotView.tsx +++ b/src/views/room/widgets/infostand/views/rentable-bot/InfoStandWidgetRentableBotView.tsx @@ -1,6 +1,6 @@ import { BotRemoveComposer } from 'nitro-renderer'; import { FC, useCallback, useMemo } from 'react'; -import { GetConnection } from '../../../../../../api'; +import { SendMessageHook } from '../../../../../../hooks/messages'; import { LocalizeText } from '../../../../../../utils/LocalizeText'; import { AvatarImageView } from '../../../../../shared/avatar-image/AvatarImageView'; import { BadgeImageView } from '../../../../../shared/badge-image/BadgeImageView'; @@ -23,7 +23,7 @@ export const InfoStandWidgetRentableBotView: FC { - GetConnection().send(new BotRemoveComposer(rentableBotData.webID)); + SendMessageHook(new BotRemoveComposer(rentableBotData.webID)); }, [ rentableBotData ]); if(!rentableBotData) return;