You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

101 lines
2.3 KiB

import type Viewport from '@/core/engine/Viewport.ts'
/**
* 运行时管理器, 管理运行时的各种数据
*/
export default class RuntimeManager {
private viewport: Viewport
// 临时存储的执行器ID集合
private readonly tmpExecutors = new Set<string>
// 货架ID -> 托盘ID
private readonly storeRackMap = new Map<string, Set<string>>()
init(viewport: Viewport): void {
this.viewport = viewport
}
/**
* 在指定的货架位置添加存储项
* @param rackId 货架ID
* @param itemId 存储项ID
*/
addStoreAt(rackId: string, itemId: string): void {
if (!this.storeRackMap.has(rackId)) {
this.storeRackMap.set(rackId, new Set())
}
this.storeRackMap.get(rackId).add(itemId)
}
/**
* 从指定的货架位置移除存储项
* @param rackId 货架ID
* @param itemId 存储项ID
*/
removeStoreAt(rackId: string, itemId: string): void {
const rack = this.storeRackMap.get(rackId)
if (rack) {
rack.delete(itemId)
if (rack.size === 0) {
this.storeRackMap.delete(rackId)
}
}
}
/**
* 获取指定货架位置的所有存储项
* @param rackId 货架ID
*/
getItemsByRack(rackId: string): Set<string> | undefined {
return this.storeRackMap.get(rackId)
}
/**
* 移除指定货架
* @param rackId 货架ID
*/
removeRack(rackId: string): void {
this.storeRackMap.delete(rackId)
}
/**
* 清空所有存储项
*/
clear() {
for (const id of this.tmpExecutors) {
this.viewport.entityManager.deleteEntityOnlyRuntime(id)
}
this.tmpExecutors.clear()
this.storeRackMap.clear()
}
dispose(): void {
this.viewport = null
this.clear()
}
addEntity(item: ItemJson) {
this.tmpExecutors.add(item.id)
this.viewport.entityManager.createOrUpdateEntityOnlyRuntime(item)
}
removeEntity(itemId: string) {
this.tmpExecutors.delete(itemId)
// 从各个货架中移除
for (const [rackId, items] of this.storeRackMap.entries()) {
if (items.has(itemId)) {
items.delete(itemId)
if (items.size === 0) {
this.storeRackMap.delete(rackId)
}
}
}
this.viewport.entityManager.deleteEntityOnlyRuntime(itemId)
}
has(itemId: string) {
return this.tmpExecutors.has(itemId)
}
}