中化加油站项目
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.
 
 
 
 
 
 

164 lines
7.1 KiB

import { Observable, Observer } from "@babylonjs/core";
import { Game } from "../../game";
import { BuildingType, BuildingData } from "../../model/data/institution/building/building-data";
import { FacilityPosType, ModelData_facility } from "../../model/data/model-data/model-data-facility";
import { ModelEditData } from "../../model/data/model-data/model-edit-data";
import { BuildingInfo } from "../../model/info/building/building-info";
import { GizmoTool } from "../../tool/gizmo-tool";
import { BuildingUIItem } from "../../view/building-window/building-ui-item";
import { BuildingWindow } from "../../view/building-window/building-window";
import { FacilityWindow } from "../../view/facility-window/facility-window";
import { FacilityInfoInSceneWindow } from "../../view/facilityinfoinscene-window/facilityinfoinscene-window";
import { MarkWindow } from "../../view/mark-window/mark-window";
import { ToolbarWindow } from "../../view/toolbar-window/toobar-window";
import { DataManager, ModelChangeType } from "../data-manager";
import { EventManager } from "../event-manager/event-manager";
import { Event_ChangeFacility } from "../event-manager/events/event-change-facility";
import { InfoManager } from "../info-manager";
import { ModeManager, ModeType } from "../mode-manager";
import { SceneManager } from "../scene-manager";
import { UIManager } from "../ui-manager";
import { StatusBase, StatusManager } from "./status-manager";
//建筑物外观模式
export class BuildingStatus extends StatusBase {
buildingWindow: BuildingWindow;
currentBuildingInfo: BuildingInfo; //当前的建筑
onChangeFacilityObserver: Observer<Event_ChangeFacility>;
static changeStatusFromUI: boolean = false;//因为ui而切换
static startEnterObservable: Observable<BuildingUIItem> = new Observable<BuildingUIItem>();//开始切入
static enterSuccessObservable: Observable<BuildingUIItem> = new Observable<BuildingUIItem>();//进入成功的事件
//#region
/**
* 在数据层创建建筑
* @param key 唯一key,来自服务器分配
* @param name 名称,由玩家自定义
* @param buildingType 建筑类型
*/
createOneBuildingInData(key: string, name: string, buildingType: BuildingType): BuildingData {
return DataManager.createBuilding(key, name, buildingType);
}
//#endregion
//#region 生命周期
//初始化
onCreate() {
super.onCreate();
// this.enterSuccessObservable = new Observable<BuildingUIItem>();
GizmoTool.init(SceneManager.Instance.scene, UIManager.Instance.uiRoot, SceneManager.Instance.defaultCamera);
InfoManager.init();
//UIManager.open<InputHintWindow>(InputHintWindow);
UIManager.open<ToolbarWindow>(ToolbarWindow);
}
//进入状态
onEnter() {
super.onEnter();
Game.instance.engine.resize();
//首次进入
if (this.buildingWindow == null) {
SceneManager.s_facilityWindow = UIManager.open<FacilityWindow>(FacilityWindow);
if (ModeManager.currentMode == ModeType.Look) {
//此处应改为由前端调用, 退出编辑状态时应调用hide
// SceneManager.s_markWindow = MarkWindow.openWindow();
}
this.buildingWindow = UIManager.open<BuildingWindow>(BuildingWindow);
SceneManager.s_facilityInfoInSceneWindow = UIManager.open<FacilityInfoInSceneWindow>(FacilityInfoInSceneWindow);
}
else { //从室内返回
UIManager.show<BuildingWindow>(this.buildingWindow);
if (this.buildingWindow.currentBuidngItem != null) {
this.buildingWindow.currentBuidngItem.select();
BuildingStatus.startEnterObservable.notifyObservers(this.buildingWindow.currentBuidngItem);
BuildingStatus.enterSuccessObservable.notifyObservers(this.buildingWindow.currentBuidngItem)
if (MarkWindow.s_cameraData == null) {
this.buildingWindow.currentBuidngItem.lookAt();
}
else {
MarkWindow.s_cameraData.setDataToCamera(SceneManager.Instance.defaultCamera);
MarkWindow.s_cameraData = null;
}
FacilityInfoInSceneWindow.instance.createAllFacilities(this.buildingWindow.currentBuidngItem.buildingInfo.ModelInfo.facilityInfos);
if (ModeManager.currentMode == ModeType.Look) {
FacilityInfoInSceneWindow.instance.showFacilityByType(null, false);
}
}
}
SceneManager.s_facilityWindow.updateAllFacilities(FacilityPosType.Outdoor);
let instance = this;
this.onChangeFacilityObserver = EventManager.addListener<Event_ChangeFacility>(Event_ChangeFacility, ((eventInfo) => {
instance.onChangeFacility(eventInfo);
}));
SceneManager.Instance.sunLight.intensity = 3;
}
//退出状态
onExit() {
UIManager.hide<BuildingWindow>(this.buildingWindow);
// console.log("==退出buildingStatus==");
EventManager.removeListener(Event_ChangeFacility, this.onChangeFacilityObserver);
super.onExit();
}
//#endregion
//改变当前选中的建筑
changeCurrentBuilding(buildingInfo: BuildingInfo) {
if (buildingInfo == this.currentBuildingInfo) {
return;
}
// console.log("改变当前建筑" + buildingInfo.buildingData.normalData.key);
//FacilityInfoInSceneWindow.instance.clearFacilityInfoUIItemes();
if (this.currentBuildingInfo != null) {
// this.buildingWindow.clearFacilityInfos(this.currentBuildingInfo);
//隐藏
this.buildingWindow.showFacilityInfosIcon(this.currentBuildingInfo, false);
}
this.currentBuildingInfo = buildingInfo;
FacilityInfoInSceneWindow.instance.createAllFacilities(buildingInfo.ModelInfo.facilityInfos);
if (this.currentBuildingInfo.ModelInfo.facilityInfos != null && ModeManager.currentMode == ModeType.Edit) {
//判断已经有了就不创建了
// InfoManager.createFacilityInfos(buildingInfo.buildingData.outdoorData, buildingInfo);
//显示
this.buildingWindow.showFacilityInfosIcon(this.currentBuildingInfo, true);
}
}
//模型变化
onChangeFacility(eventInfo: Event_ChangeFacility) {
if (eventInfo.modeleData instanceof ModelData_facility) {
let modelEditData: ModelEditData;
if (StatusManager.s_currentStatus instanceof BuildingStatus) {
modelEditData = this.currentBuildingInfo.buildingData.outdoorData;
}
if (eventInfo.modelChangeType == ModelChangeType.Add) {
modelEditData.addFacility(eventInfo.modeleData);
// console.log("添加设备数据" + eventInfo.modeleData.key);
}
else if (eventInfo.modelChangeType == ModelChangeType.Remove) {
modelEditData.removeFacility(eventInfo.modeleData);
// console.log("移除设备数据" + eventInfo.modeleData.key);
}
}
}
}