5180 fichiers 38.5 Mo 0 téléchargements 424 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / hooks / rooms / widgets / furniture / useFurnitureContextMenuWidget.ts
useFurnitureContextMenuWidget.ts 7.7 Ko Télécharger le fichier
import {
    ContextMenuEnum,
    GetRoomEngine,
    GroupFurniContextMenuInfoMessageEvent,
    GroupFurniContextMenuInfoMessageParser,
    RoomEngineTriggerWidgetEvent,
    RoomObjectCategory,
    RoomObjectVariable
} from '@octane/renderer';
import { useState } from 'react';
import { CreateLinkEvent, IsOwnerOfFurniture, TryJoinGroup, TryVisitRoom } from '../../../../api';
import { useMessageEvent, useOctaneEvent } from '../../../events';
import { useRoom } from '../../useRoom';

export const MONSTERPLANT_SEED_CONFIRMATION: string = 'MONSTERPLANT_SEED_CONFIRMATION';
export const PURCHASABLE_CLOTHING_CONFIRMATION: string = 'PURCHASABLE_CLOTHING_CONFIRMATION';
export const GROUP_FURNITURE: string = 'GROUP_FURNITURE';
export const EFFECTBOX_OPEN: string = 'EFFECTBOX_OPEN';
export const MYSTERYTROPHY_OPEN_DIALOG: string = 'MYSTERYTROPHY_OPEN_DIALOG';

const useFurnitureContextMenuWidgetState = () => {
    const [objectId, setObjectId] = useState(-1);
    const [mode, setMode] = useState<string>(null);
    const [confirmMode, setConfirmMode] = useState<string>(null);
    const [confirmingObjectId, setConfirmingObjectId] = useState(-1);
    const [groupData, setGroupData] = useState<GroupFurniContextMenuInfoMessageParser>(null);
    const [isGroupMember, setIsGroupMember] = useState(false);
    const [objectOwnerId, setObjectOwnerId] = useState(-1);
    const { roomSession = null } = useRoom();

    const onClose = () => {
        setObjectId(-1);
        setGroupData(null);
        setIsGroupMember(false);
        setMode(null);
    };

    const closeConfirm = () => {
        setConfirmMode(null);
        setConfirmingObjectId(-1);
    };

    const processAction = (name: string) => {
        if (name) {
            switch (name) {
                case 'use_friend_furni':
                    roomSession.useMultistateItem(objectId);
                    break;
                case 'use_monsterplant_seed':
                    setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION);
                    setConfirmingObjectId(objectId);
                    break;
                case 'use_random_teleport':
                    GetRoomEngine().useRoomObject(objectId, RoomObjectCategory.FLOOR);
                    break;
                case 'use_purchaseable_clothing':
                    setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION);
                    setConfirmingObjectId(objectId);
                    break;
                case 'use_mystery_box':
                    roomSession.useMultistateItem(objectId);
                    break;
                case 'use_mystery_trophy':
                    setConfirmMode(MYSTERYTROPHY_OPEN_DIALOG);
                    setConfirmingObjectId(objectId);
                    break;
                case 'join_group':
                    TryJoinGroup(groupData.guildId);
                    setIsGroupMember(true);
                    return;
                case 'go_to_group_homeroom':
                    if (groupData) TryVisitRoom(groupData.guildHomeRoomId);
                    break;
                case 'open_forum':
                    // The "Open forum" button on group furni was drawn but did nothing.
                    if (groupData) CreateLinkEvent('groupforum/' + groupData.guildId);
                    break;
            }
        }

        onClose();
    };

    useOctaneEvent<RoomEngineTriggerWidgetEvent>(
        [
            RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU,
            RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU,
            RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG,
            RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG,
            RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG,
            RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG,
            RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG
        ],
        (event) => {
            const object = GetRoomEngine().getRoomObject(roomSession.roomId, event.objectId, event.category);

            if (!object) return;

            setObjectOwnerId(object.model.getValue<number>(RoomObjectVariable.FURNITURE_OWNER_ID));

            switch (event.type) {
                case RoomEngineTriggerWidgetEvent.REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG:
                    if (!IsOwnerOfFurniture(object)) return;

                    setConfirmingObjectId(object.id);
                    setConfirmMode(MONSTERPLANT_SEED_CONFIRMATION);

                    onClose();
                    return;
                case RoomEngineTriggerWidgetEvent.REQUEST_EFFECTBOX_OPEN_DIALOG:
                    if (!IsOwnerOfFurniture(object)) return;

                    setConfirmingObjectId(object.id);
                    setConfirmMode(EFFECTBOX_OPEN);

                    onClose();
                    return;
                case RoomEngineTriggerWidgetEvent.REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG:
                    if (!IsOwnerOfFurniture(object)) return;

                    setConfirmingObjectId(object.id);
                    setConfirmMode(PURCHASABLE_CLOTHING_CONFIRMATION);

                    onClose();
                    return;
                case RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYBOX_OPEN_DIALOG:
                    roomSession.useMultistateItem(object.id);

                    onClose();
                    return;
                case RoomEngineTriggerWidgetEvent.REQUEST_MYSTERYTROPHY_OPEN_DIALOG:
                    if (!IsOwnerOfFurniture(object)) return;

                    setConfirmingObjectId(object.id);
                    setConfirmMode(MYSTERYTROPHY_OPEN_DIALOG);

                    onClose();
                    return;
                case RoomEngineTriggerWidgetEvent.OPEN_FURNI_CONTEXT_MENU:
                    setObjectId(object.id);

                    switch (event.contextMenu) {
                        case ContextMenuEnum.FRIEND_FURNITURE:
                            setMode(ContextMenuEnum.FRIEND_FURNITURE);
                            return;
                        case ContextMenuEnum.MONSTERPLANT_SEED:
                            if (IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MONSTERPLANT_SEED);
                            return;
                        case ContextMenuEnum.MYSTERY_BOX:
                            setMode(ContextMenuEnum.MYSTERY_BOX);
                            return;
                        case ContextMenuEnum.MYSTERY_TROPHY:
                            if (IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.MYSTERY_TROPHY);
                            return;
                        case ContextMenuEnum.RANDOM_TELEPORT:
                            setMode(ContextMenuEnum.RANDOM_TELEPORT);
                            return;
                        case ContextMenuEnum.PURCHASABLE_CLOTHING:
                            if (IsOwnerOfFurniture(object)) setMode(ContextMenuEnum.PURCHASABLE_CLOTHING);
                            return;
                    }

                    return;
                case RoomEngineTriggerWidgetEvent.CLOSE_FURNI_CONTEXT_MENU:
                    if (object.id === objectId) onClose();
                    return;
            }
        }
    );

    useMessageEvent<GroupFurniContextMenuInfoMessageEvent>(GroupFurniContextMenuInfoMessageEvent, (event) => {
        const parser = event.getParser();

        setObjectId(parser.objectId);
        setGroupData(parser);
        setIsGroupMember(parser.userIsMember);
        setMode(GROUP_FURNITURE);
    });

    return { objectId, mode, confirmMode, confirmingObjectId, groupData, isGroupMember, objectOwnerId, closeConfirm, processAction, onClose };
};

export const useFurnitureContextMenuWidget = useFurnitureContextMenuWidgetState;
15Sujets
1Dépôts
20Membres
3En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser