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);
                }
            }
        }
Example #4
0
    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);
    }
Example #5
0
        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);
        }
Example #6
0
    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);
        }
    }
Example #7
0
    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);
    }
Example #8
0
        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;
            }
        }
Example #10
0
        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;
                }
            });
        }