public void CreateHealthPickupByPos(Vector3 pos) { var exampleEntity = FpsEntityTemplates.HealthPickup(Vector3f.FromUnityVector(pos), 100); var request = new WorldCommands.CreateEntity.Request(exampleEntity); m_CommandSender.SendCreateEntityCommand(request, OnCreateEntityResponse); }
public void OnCreateEntityResponse_should_add_received_responses_to_entity() { var entity = SetupTestEntity(); var emptyRequest = new WorldCommands.CreateEntity.Request(); var context = "Some context"; createEntityStorage.CommandRequestsInFlight.Add(TestCommandRequestId, new CommandRequestStore <WorldCommands.CreateEntity.Request>(entity, emptyRequest, context, TestCommandRequestId)); using (var wrappedOp = WorkerOpFactory.CreateCreateEntityResponseOp(TestCommandRequestId)) { receiveSystem.OnCreateEntityResponse(wrappedOp.Op); Assert.IsTrue(entityManager.HasComponent <WorldCommands.CreateEntity.CommandResponses>(entity)); var responses = entityManager.GetComponentData <WorldCommands.CreateEntity.CommandResponses>(entity); var count = 0; Assert.DoesNotThrow(() => { count = responses.Responses.Count; }); Assert.AreEqual(1, count); var response = responses.Responses[0]; Assert.AreEqual(emptyRequest, response.RequestPayload); Assert.AreEqual(context, response.Context); Assert.AreEqual(TestCommandRequestId, response.RequestId); Assert.AreEqual(wrappedOp.Op.StatusCode, response.StatusCode); Assert.AreEqual(wrappedOp.Op.Message, response.Message); Assert.AreEqual(wrappedOp.Op.EntityId, response.EntityId); } }
public void OnCreateEntityResponse_should_log_if_corresponding_entity_not_found() { var emptyRequest = new WorldCommands.CreateEntity.Request(); createEntityStorage.CommandRequestsInFlight.Add(TestCommandRequestId, new CommandRequestStore <WorldCommands.CreateEntity.Request>(Entity.Null, emptyRequest, null, TestCommandRequestId)); using (var wrappedOp = WorkerOpFactory.CreateCreateEntityResponseOp(TestCommandRequestId)) { using (var expectingScope = logDispatcher.EnterExpectingScope()) { expectingScope.Expect(LogType.Log, LoggingUtils.LoggerName, "Op"); receiveSystem.OnCreateEntityResponse(wrappedOp.Op); } } }
public void LayEgg() { EggTypeEnum eggType = 0; if (Species == SimulationSettings.Dino_Brachio_PrefabName) { eggType = EggTypeEnum.Brachiosaurus; } else if (Species == SimulationSettings.Dino_TRex_PrefabName) { eggType = EggTypeEnum.TRex; } // 恐龙自己下蛋 var exampleEntity = EntityTemplateFactory.CreateEggTemplate(transform.position.ToCoordinates(), attrsWriter.Data.OwnerTokenId, eggType); var request1 = new WorldCommands.CreateEntity.Request(exampleEntity); worldCommandSender.SendCreateEntityCommand(request1, OnCreateEggResponse); //Debug.Log("DinoBehaviour LayEgg! Egg type : "+eggType); }
public void SendCreateEntityCommand(WorldCommands.CreateEntity.Request request, Action <WorldCommands.CreateEntity.ReceivedResponse> callback = null) { var requestId = commandSystem.SendCommand(request, entity); if (callback == null) { return; } Action <WorldCommands.CreateEntity.ReceivedResponse> wrappedCallback = response => { if (IsValid) { callback(response); } }; callbackSystem.RegisterCommandResponseCallback(requestId, wrappedCallback); }
public void HatchOut() { EntityTemplate exampleEntity = null; switch (_eggType) { case EggTypeEnum.Brachiosaurus: exampleEntity = EntityTemplateFactory.CreateDinoBrachioTemplate(transform.position.ToCoordinates(), egg.Data.OwnerTokenId, 0); // 0岁小恐龙 break; case EggTypeEnum.TRex: exampleEntity = EntityTemplateFactory.CreateDinoTRexTemplate(transform.position.ToCoordinates(), egg.Data.OwnerTokenId, 0); // 0岁小恐龙 break; } if (exampleEntity != null) { var request1 = new WorldCommands.CreateEntity.Request(exampleEntity); worldCommandSender.SendCreateEntityCommand(request1, OnCreateDinoResponse); //Debug.Log("EggBehaviour HatchOut! Type:"+_eggType); } }
void OnLayEgg(PlayerAttrs.LayEgg.ReceivedRequest request) { Coordinates coords = request.Payload.EggPosition.ToUnityVector().ToCoordinates(); EggTypeEnum eggType = request.Payload.EggType; long tokenId = request.Payload.OwnerTokenId; // 得到下蛋的能量消耗 int costEnergy = 0; switch (eggType) { case EggTypeEnum.Brachiosaurus: costEnergy = CostEnergyEggBrachio; break; case EggTypeEnum.TRex: costEnergy = CostEnergyEggTRex; break; } if (attrs.Data.Energy < costEnergy) {// 能量不夠不能下蛋 string errMsg = "Energy is not enough. (" + attrs.Data.Energy + "/" + costEnergy + ")"; commandReceiver.SendLayEggFailure(request.RequestId, errMsg); return; } // 更新能量消耗 var update = new PlayerAttrs.Update { Energy = attrs.Data.Energy - costEnergy, }; attrs.SendUpdate(update); // 玩家操作下蛋:发送创建实体消息 var exampleEntity = EntityTemplateFactory.CreateEggTemplate(coords, tokenId, eggType); var request1 = new WorldCommands.CreateEntity.Request(exampleEntity); request1.Context = request.RequestId; worldCommandSender.SendCreateEntityCommand(request1, OnCreateEggResponse); }
private void OnRequestSpawnSoldier(PlayerRes.SpawnSoldier.ReceivedRequest request) { //扣除资源生成士兵,100资源一个 uint needResValue = 100; if (writer.Data.ResValue < needResValue) { return; } uint newvale = writer.Data.ResValue - needResValue; var update = new PlayerRes.Update { ResValue = new Improbable.Gdk.Core.Option <uint>(newvale) }; writer.SendUpdate(update); var exampleEntity = FpsEntityTemplates.Soldier(new Vector3f(request.Payload.X, request.Payload.Y, request.Payload.Z), entityID.Id); var request1 = new WorldCommands.CreateEntity.Request(exampleEntity); worldCommandSender.SendCreateEntityCommand(request1, OnCreateEntityResponse); }
private void FactoryQuery(Unity.Entities.Entity entity, ref UnitFactory.Component factory, ref ResourceComponent.Component resource, ref BaseUnitStatus.Component status, ref Position.Component position, ref StrongholdSight.Component sight, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsBuilding(status.Type) == false) { return; } if (status.Order == OrderType.Idle) { return; } FollowerOrder?f_order = null; SuperiorOrder?s_order = null; TeamOrder? team_order = null; TurretOrder? turret_order = null; FactoryOrderType orderType = FactoryOrderType.None; if (factory.SuperiorOrders.Count > 0) { s_order = factory.SuperiorOrders[0]; orderType = FactoryOrderType.Superior; } else if (factory.FollowerOrders.Count > 0) { f_order = factory.FollowerOrders[0]; orderType = FactoryOrderType.Follower; } else if (factory.TeamOrders.Count > 0) { team_order = factory.TeamOrders[0]; orderType = FactoryOrderType.Team; } else if (factory.TurretOrders.Count > 0) { turret_order = factory.TurretOrders[0]; orderType = FactoryOrderType.Turret; } if (orderType == FactoryOrderType.None) { return; } // calc time cost int resourceCost; float timeCost; if (CalcOrderCost(out resourceCost, out timeCost, f_order, s_order, team_order) == false) { return; } //Debug.LogFormat("ResourceCost:{0} TimeCost:{1}", resourceCost, timeCost); if (factory.CurrentType == FactoryOrderType.None) { if (resource.Resource < resourceCost) { //Debug.LogFormat("ResourcePoor:{0}", resource.Resource); return; } factory.ProductInterval = IntervalCheckerInitializer.InitializedChecker(timeCost); factory.CurrentType = orderType; resource.Resource -= resourceCost; } factoryInter = factory.ProductInterval; if (CheckTime(ref factoryInter) == false) { return; } Coordinates?random = null; if (sight.StrategyVector.Side != UnitSide.None) { random = GetEmptyCoordinates(entityId.EntityId, position.Coords, sight.StrategyVector.Vector, height_buffer, factory.Containers); } if (random == null) { //Debug.LogFormat("There is no Empty"); return; } //Debug.LogFormat("CreateUnit!"); factory.ProductInterval = factoryInter; var coords = random.Value;//GetEmptyCoordinates(entityId.EntityId, position.Coords, height_buffer, factory.Containers); EntityTemplate template = null; bool finished = false; UnitType type = UnitType.None; if (s_order != null) { template = CreateSuperior(factory.SuperiorOrders, coords, out finished); type = UnitType.Commander; } else if (f_order != null) { template = CreateFollower(factory.FollowerOrders, coords, f_order.Value.Customer, out finished); type = UnitType.Soldier; } if (template != null) { var request = new WorldCommands.CreateEntity.Request ( template, context: new ProductOrderContext() { f_order = f_order, s_order = s_order, type = type, strongholdId = entityId.EntityId, container = new UnitContainer(coords.ToFixedPointVector3(), ContainerState.Created) } ); this.CommandSystem.SendCommand(request); } else if (team_order != null) { CreateTeam(factory.TeamOrders, status.Side, entityId.EntityId, coords, out finished); } else if (turret_order != null) { // todo turret } if (finished) { factory.CurrentType = FactoryOrderType.None; } }
void HandleProductUnit() { Entities.With(group).ForEach((Unity.Entities.Entity entity, ref UnitFactory.Component factory, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) => { if (status.State != UnitState.Alive) { return; } if (status.Type != UnitType.Stronghold) { return; } if (status.Order == OrderType.Idle) { return; } FollowerOrder?f_order = null; SuperiorOrder?s_order = null; if (factory.SuperiorOrders.Count > 0) { s_order = factory.SuperiorOrders[0]; } else if (factory.FollowerOrders.Count > 0) { f_order = factory.FollowerOrders[0]; } // calc time cost float cost = 0.0f; if (s_order == null && f_order == null) { return; } var time = Time.time; var inter = factory.Interval; if (inter.CheckTime(time) == false) { return; } factory.Interval = inter; cost = timeCost; if (factory.CurrentType == UnitType.None) { factory.ProductInterval = new IntervalChecker(cost, time + cost, 0, -1); // TODO modify factory.CurrentType = s_order != null ? UnitType.Commander : f_order.Value.Type; } inter = factory.ProductInterval; if (inter.CheckTime(time) == false) { return; } factory.ProductInterval = inter; var trans = EntityManager.GetComponentObject <Transform>(entity); var p = trans.position + RandomLogic.XZRandomCirclePos(range); var pos = p - this.Origin; EntityTemplate template = null; var coords = new Coordinates(pos.x, pos.y + height_buffer, pos.z); bool finished = false; if (s_order != null) { template = CreateSuperior(factory.SuperiorOrders, coords, s_order.Value.HqEntityId, out finished); } else if (f_order != null) { template = CreateFollower(factory.FollowerOrders, coords, f_order.Value.Customer, f_order.Value.HqEntityId, out finished); } EntityId hqId = s_order != null ? s_order.Value.HqEntityId : f_order.Value.HqEntityId; var request = new WorldCommands.CreateEntity.Request ( template, context: new ProductOrderContext() { f_order = f_order, s_order = s_order, type = factory.CurrentType, hqId = hqId } ); this.CommandSystem.SendCommand(request); if (finished) { factory.CurrentType = UnitType.None; } }); }