nitro/apps/frontend/src/api/inventory/FurnitureUtilities.ts

152 lines
3.6 KiB
TypeScript

import {FurnitureListItemParser, IObjectData} from "@nitro/renderer";
import {GetRoomEngine} from "../nitro";
import {FurniCategory} from "./FurniCategory";
import {FurnitureItem} from "./FurnitureItem";
import {GroupItem} from "./GroupItem";
export const createGroupItem = (type: number, category: number, stuffData: IObjectData, extra: number = NaN) =>
new GroupItem(type, category, GetRoomEngine(), stuffData, extra);
const addSingleFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => {
const groupItems: GroupItem[] = [];
for (const groupItem of set) {
if (groupItem.type === item.type) groupItems.push(groupItem);
}
for (const groupItem of groupItems) {
if (groupItem.getItemById(item.id)) return groupItem;
}
const groupItem = createGroupItem(item.type, item.category, item.stuffData, item.extra);
groupItem.push(item);
if (unseen) {
groupItem.hasUnseenItems = true;
set.unshift(groupItem);
} else {
set.push(groupItem);
}
return groupItem;
};
const addGroupableFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => {
let existingGroup: GroupItem = null;
for (const groupItem of set) {
if (groupItem.type === item.type && groupItem.isWallItem === item.isWallItem && groupItem.isGroupable) {
if (item.category === FurniCategory.POSTER) {
if (groupItem.stuffData.getLegacyString() === item.stuffData.getLegacyString()) {
existingGroup = groupItem;
break;
}
} else if (
item.category === FurniCategory.GUILD_FURNI ||
item.category === FurniCategory.FLOOR ||
item.category === FurniCategory.WALL_PAPER ||
item.category === FurniCategory.LANDSCAPE
) {
if (item.stuffData.compare(groupItem.stuffData)) {
existingGroup = groupItem;
break;
}
} else {
existingGroup = groupItem;
break;
}
}
}
if (existingGroup) {
existingGroup.push(item);
if (unseen) {
existingGroup.hasUnseenItems = true;
const index = set.indexOf(existingGroup);
if (index >= 0) set.splice(index, 1);
set.unshift(existingGroup);
}
return existingGroup;
}
existingGroup = createGroupItem(item.type, item.category, item.stuffData, item.extra);
existingGroup.push(item);
if (unseen) {
existingGroup.hasUnseenItems = true;
set.unshift(existingGroup);
} else {
set.push(existingGroup);
}
return existingGroup;
};
export const addFurnitureItem = (set: GroupItem[], item: FurnitureItem, unseen: boolean) => {
if (!item.isGroupable) {
addSingleFurnitureItem(set, item, unseen);
} else {
addGroupableFurnitureItem(set, item, unseen);
}
};
export const mergeFurniFragments = (
fragment: Map<number, FurnitureListItemParser>,
totalFragments: number,
fragmentNumber: number,
fragments: Map<number, FurnitureListItemParser>[]
) => {
if (totalFragments === 1) return fragment;
fragments[fragmentNumber] = fragment;
for (const frag of fragments) {
if (!frag) return null;
}
const merged: Map<number, FurnitureListItemParser> = new Map();
for (const frag of fragments) {
for (const [key, value] of frag) merged.set(key, value);
frag.clear();
}
fragments = null;
return merged;
};
export const getAllItemIds = (groupItems: GroupItem[]) => {
const itemIds: number[] = [];
for (const groupItem of groupItems) {
let totalCount = groupItem.getTotalCount();
if (groupItem.category === FurniCategory.POST_IT) totalCount = 1;
let i = 0;
while (i < totalCount) {
itemIds.push(groupItem.getItemByIndex(i).id);
i++;
}
}
return itemIds;
};