package system import ( "fmt" "github.com/yohamta/donburi/component" "github.com/yohamta/donburi/filter" "joylink.club/ecs" sysEvent "joylink.club/rtsssimulation/system/event" "joylink.club/rtsssimulation/umi" ) // EntityIdentity 实体身份定义 type EntityIdentity struct { Id string } // EntityIdentityComponent 实体身份组件 var EntityIdentityComponent = ecs.NewComponentType[EntityIdentity]() func FindEntityById(world ecs.World, id string) *ecs.Entry { query := ecs.NewQuery(filter.Contains(EntityIdentityComponent)) return QueryEntityById(world, query, id) } func QueryEntityById(world ecs.World, q *ecs.Query, id string) *ecs.Entry { var entry *ecs.Entry = nil func() { defer simpleRecover() q.Each(world, func(e *ecs.Entry) { if id == EntityIdentityComponent.Get(e).Id { entry = e panic(fmt.Sprintf("找到实体[%s],结束查找", id)) } }) }() // return entry } var modelStorageQuery = ecs.NewQuery(filter.Contains(ModelStorageComponent)) // FindModelStorage 获取模型仓库 func FindModelStorage(world ecs.World) umi.IModelManager { e, _ := modelStorageQuery.First(world) return ModelStorageComponent.Get(e).ModelManager } // 捕获panic并恢复执行 func simpleRecover() { recover() } ///////////////////////////////////////////////////////// // EntityTag 实体标签 type EntityTag = component.IComponentType type EntityTagHandler struct { Tag EntityTag } func NewTag() EntityTag { return ecs.NewComponentType[struct{}]() } func NewEntityTagHandler() *EntityTagHandler { h := &EntityTagHandler{Tag: NewTag()} return h } var EntityTagHandlerComponent = ecs.NewComponentType[EntityTagHandler]() ///////////////////////////////////////////////////////// // ModelStorageRef 模型仓库引用 // 用于world内使用,查询模型 type ModelStorageRef struct { ModelManager umi.IModelManager } // ModelStorageComponent 模型仓库组件 var ModelStorageComponent = ecs.NewComponentType[ModelStorageRef]() ///////////////////////////////////////////////////////// // DriveRelay 驱动继电器 // circuitModelId-如道岔模型id // relayGroup-继电器组合类型 // relayName-继电器功能名称 // xh-true:吸合,false:落下 func DriveRelay(w ecs.World, circuitModelId string, relayGroup string, relayName string, xh bool) bool { if swModel := FindModelStorage(w).FindById(circuitModelId); swModel != nil { if roler, isCr := swModel.(umi.IRelayCRole); isCr { if relayModel := roler.FindRelayModelByCRole(relayGroup, relayName); relayModel != nil { if deviceModel, isDm := relayModel.(umi.IDeviceModel); isDm { relayId := deviceModel.Id() sysEvent.RelayNeedChangeEventBus.Publish(w, &sysEvent.RelayNeedChangeEvent{Id: relayId, Xh: xh}) return true } } } } // return false } func createRelayNeedChangeEvent(w ecs.World, circuitModelId string, relayGroup string, relayName string, xh bool) (*sysEvent.RelayNeedChangeEvent, bool) { if swModel := FindModelStorage(w).FindById(circuitModelId); swModel != nil { if roler, isCr := swModel.(umi.IRelayCRole); isCr { if relayModel := roler.FindRelayModelByCRole(relayGroup, relayName); relayModel != nil { if deviceModel, isDm := relayModel.(umi.IDeviceModel); isDm { relayId := deviceModel.Id() return &sysEvent.RelayNeedChangeEvent{Id: relayId, Xh: xh}, true } } } } // return nil, false }