nitro-v36-with-renderer-v36
/
src /
components /
room /
widgets /
avatar-info /
menu /
AvatarInfoWidgetOwnPetView.tsx
AvatarInfoWidgetOwnPetView.tsx 11.8 Ko
Télécharger le fichier
import {
CreateLinkEvent,
PetRespectComposer,
PetType,
RoomObjectCategory,
RoomObjectType,
RoomObjectVariable,
RoomUnitGiveHandItemPetComposer
} from '@octane/renderer';
import { FC, useEffect, useMemo, useState } from 'react';
import { AvatarInfoPet, GetConfigurationValue, GetConfigurationRecord, GetOwnRoomObject, LocalizeText, SendMessageComposer } from '../../../../../api';
import { useRoom, useSessionInfo } from '../../../../../hooks';
import { ContextMenuHeaderView } from '../../context-menu/ContextMenuHeaderView';
import { ContextMenuListItemView } from '../../context-menu/ContextMenuListItemView';
import { ContextMenuView } from '../../context-menu/ContextMenuView';
import { Checkbox } from '../../../../../common/Checkbox';
import { NativeTextTree } from '../../../../../common/native-text/NativeTextTree';
interface AvatarInfoWidgetOwnPetViewProps {
avatarInfo: AvatarInfoPet;
onClose: () => void;
}
const MODE_NORMAL: number = 0;
const MODE_SADDLED_UP: number = 1;
const MODE_RIDING: number = 2;
const MODE_MONSTER_PLANT: number = 3;
export const AvatarInfoWidgetOwnPetView: FC<AvatarInfoWidgetOwnPetViewProps> = (props) => {
const { avatarInfo = null, onClose = null } = props;
const [mode, setMode] = useState(MODE_NORMAL);
const { roomSession = null } = useRoom();
const { petRespectRemaining = 0, respectPet = null, chatStyleId = 0 } = useSessionInfo();
// AIR PetMenuView / OwnPetMenuView: only handitem.give.pet.enabled, not the room's hand-item flag.
const canGiveHandItem = useMemo(() => {
if (!GetConfigurationValue('handitem.give.pet.enabled', true)) return false;
let flag = false;
const roomObject = GetOwnRoomObject();
if (roomObject) {
const carryId = roomObject.model.getValue<number>(RoomObjectVariable.FIGURE_CARRY_OBJECT);
if (carryId > 0 && carryId < 999999) flag = true;
}
return flag;
}, []);
const processAction = (name: string) => {
let hideMenu = true;
if (name) {
switch (name) {
case 'respect':
respectPet(avatarInfo.id);
if (petRespectRemaining - 1 >= 1) hideMenu = false;
break;
case 'treat':
SendMessageComposer(new PetRespectComposer(avatarInfo.id));
break;
case 'pass_handitem':
SendMessageComposer(new RoomUnitGiveHandItemPetComposer(avatarInfo.id));
break;
case 'train':
roomSession.requestPetCommands(avatarInfo.id);
break;
case 'pick_up':
roomSession.pickupPet(avatarInfo.id);
break;
case 'mount':
roomSession.mountPet(avatarInfo.id);
break;
case 'toggle_riding_permission':
roomSession.togglePetRiding(avatarInfo.id);
break;
case 'toggle_breeding_permission':
roomSession.togglePetBreeding(avatarInfo.id);
break;
case 'dismount':
roomSession.dismountPet(avatarInfo.id);
break;
case 'saddle_off':
roomSession.removePetSaddle(avatarInfo.id);
break;
case 'breed':
if (mode === MODE_NORMAL) {
// Like Habbo: the breed command (46) sends the pet to a free breeding nest.
roomSession.sendChatMessage(`${avatarInfo.name} ${LocalizeText('pet.command.46')}`, chatStyleId);
} else if (mode === MODE_MONSTER_PLANT) {
// Official REQUEST_BREED_PET: mark the plants this one can breed with.
CreateLinkEvent(`monsterplant-breeding/request/${avatarInfo.roomIndex}`);
}
break;
case 'harvest':
roomSession.harvestPet(avatarInfo.id);
break;
case 'revive':
//
break;
case 'compost':
roomSession.compostPlant(avatarInfo.id);
break;
case 'buy_saddle':
CreateLinkEvent('catalog/open/' + GetConfigurationRecord('catalog.links')['pets.buy_saddle']);
break;
}
}
if (hideMenu) onClose();
};
useEffect(() => {
setMode((prevValue) => {
if (avatarInfo.petType === PetType.MONSTERPLANT) return MODE_MONSTER_PLANT;
else if (avatarInfo.saddle && !avatarInfo.rider) return MODE_SADDLED_UP;
else if (avatarInfo.rider) return MODE_RIDING;
return MODE_NORMAL;
});
}, [avatarInfo]);
return (
<NativeTextTree>
<ContextMenuView
category={RoomObjectCategory.UNIT}
classNames={['octane-avatar-action-menu', 'octane-avatar-action-menu--own']}
collapsable={true}
freezePositionOnHover={true}
objectId={avatarInfo.roomIndex}
showCaretIcon={false}
userType={RoomObjectType.PET}
onClose={onClose}
>
<ContextMenuHeaderView>{avatarInfo.name}</ContextMenuHeaderView>
<div className="air-avatar-menu-buttons">
{mode === MODE_NORMAL && (
<>
{petRespectRemaining > 0 && (
<ContextMenuListItemView onClick={(event) => processAction('respect')}>
{LocalizeText('infostand.button.petrespect', ['count'], [petRespectRemaining.toString()])}
</ContextMenuListItemView>
)}
<ContextMenuListItemView onClick={(event) => processAction('train')}>{LocalizeText('infostand.button.train')}</ContextMenuListItemView>
<ContextMenuListItemView onClick={(event) => processAction('pick_up')}>{LocalizeText('infostand.button.pickup')}</ContextMenuListItemView>
{avatarInfo.petType === PetType.HORSE && (
<ContextMenuListItemView onClick={(event) => processAction('buy_saddle')}>
{LocalizeText('infostand.button.buy_saddle')}
</ContextMenuListItemView>
)}
{[PetType.BEAR, PetType.TERRIER, PetType.CAT, PetType.DOG, PetType.PIG].indexOf(avatarInfo.petType) > -1 && (
<ContextMenuListItemView onClick={(event) => processAction('breed')}>{LocalizeText('infostand.button.breed')}</ContextMenuListItemView>
)}
</>
)}
{mode === MODE_SADDLED_UP && (
<>
<ContextMenuListItemView onClick={(event) => processAction('mount')}>{LocalizeText('infostand.button.mount')}</ContextMenuListItemView>
<ContextMenuListItemView gap={1} onClick={(event) => processAction('toggle_riding_permission')}>
<Checkbox checked={!!avatarInfo.publiclyRideable} readOnly={true} />
{LocalizeText('infostand.button.toggle_riding_permission')}
</ContextMenuListItemView>
{petRespectRemaining > 0 && (
<ContextMenuListItemView onClick={(event) => processAction('respect')}>
{LocalizeText('infostand.button.petrespect', ['count'], [petRespectRemaining.toString()])}
</ContextMenuListItemView>
)}
<ContextMenuListItemView onClick={(event) => processAction('train')}>{LocalizeText('infostand.button.train')}</ContextMenuListItemView>
<ContextMenuListItemView onClick={(event) => processAction('pick_up')}>{LocalizeText('infostand.button.pickup')}</ContextMenuListItemView>
<ContextMenuListItemView onClick={(event) => processAction('saddle_off')}>
{LocalizeText('infostand.button.saddleoff')}
</ContextMenuListItemView>
</>
)}
{mode === MODE_RIDING && (
<>
<ContextMenuListItemView onClick={(event) => processAction('dismount')}>
{LocalizeText('infostand.button.dismount')}
</ContextMenuListItemView>
{petRespectRemaining > 0 && (
<ContextMenuListItemView onClick={(event) => processAction('respect')}>
{LocalizeText('infostand.button.petrespect', ['count'], [petRespectRemaining.toString()])}
</ContextMenuListItemView>
)}
</>
)}
{mode === MODE_MONSTER_PLANT && (
<>
<ContextMenuListItemView onClick={(event) => processAction('pick_up')}>{LocalizeText('infostand.button.pickup')}</ContextMenuListItemView>
{avatarInfo.dead && (
<ContextMenuListItemView onClick={(event) => processAction('revive')}>
{LocalizeText('infostand.button.revive')}
</ContextMenuListItemView>
)}
{roomSession.isRoomOwner && (
<ContextMenuListItemView onClick={(event) => processAction('compost')}>
{LocalizeText('infostand.button.compost')}
</ContextMenuListItemView>
)}
{!avatarInfo.dead && avatarInfo.energy / avatarInfo.maximumEnergy < 0.98 && (
<ContextMenuListItemView onClick={(event) => processAction('treat')}>
{LocalizeText('infostand.button.pettreat')}
</ContextMenuListItemView>
)}
{!avatarInfo.dead && avatarInfo.level === avatarInfo.maximumLevel && avatarInfo.breedable && (
<>
<ContextMenuListItemView gap={1} onClick={(event) => processAction('toggle_breeding_permission')}>
<Checkbox checked={avatarInfo.publiclyBreedable} readOnly={true} />
{LocalizeText('infostand.button.toggle_breeding_permission')}
</ContextMenuListItemView>
<ContextMenuListItemView onClick={(event) => processAction('breed')}>
{LocalizeText('infostand.button.breed')}
</ContextMenuListItemView>
</>
)}
</>
)}
{canGiveHandItem && (
<ContextMenuListItemView onClick={(event) => processAction('pass_hand_item')}>
{LocalizeText('infostand.button.pass_hand_item')}
</ContextMenuListItemView>
)}
</div>
</ContextMenuView>
</NativeTextTree>
);
};
