public void Register(int id, Transform caster, Transform target, int index = 0, bool immediately = false)
        {
            ProjectileData projectileData = ProjectileData.GetProjectileData(id);

            if (projectileData == null || caster == null)
            {
                return;
            }

            Transform emitter = null;

            if (!string.IsNullOrEmpty(projectileData._bone) && "0" != projectileData._bone)
            {
                PeEntity entity = caster.GetComponent <PeEntity>();
                if (null != entity)
                {
                    emitter = entity.GetChild(projectileData._bone);
                }
                else
                {
                    emitter = PETools.PEUtil.GetChild(caster, projectileData._bone);
                }
            }
            ProjectileRequest req = new ProjectileRequest(id, caster, emitter, Vector3.zero, Quaternion.identity, target, Vector3.zero, index);

            if (immediately)
            {
                req.Create(transform);
            }
            else
            {
                m_ReqList.Add(req);
            }
        }
示例#2
0
    protected override void OnUpdate()
    {
        var entityArray  = Group.GetEntityArray();
        var requestArray = Group.GetComponentDataArray <ProjectileRequest>();

        // Copy requests as spawning will invalidate Group
        var requests = new ProjectileRequest[requestArray.Length];

        for (var i = 0; i < requestArray.Length; i++)
        {
            requests[i] = requestArray[i];
            PostUpdateCommands.DestroyEntity(entityArray[i]);
        }

        // Handle requests
        foreach (var request in requests)
        {
            var projectileEntity = m_settings.projectileFactory.Create(EntityManager, -1);

            var projectileData = EntityManager.GetComponentData <ProjectileData>(projectileEntity);

            projectileData.SetupFromRequest(request);
            var projectileRegistry = m_resourceSystem.GetResourceRegistry <ProjectileRegistry>();
            projectileData.Initialize(projectileRegistry);

            PostUpdateCommands.SetComponent(projectileEntity, projectileData);
            PostUpdateCommands.AddComponent(projectileEntity, new UpdateProjectileFlag());
        }
    }
示例#3
0
        public void CreateProjectiles(ProjectileRequest request)
        {
            if (request.SendToServer)
            {
                if (request.FiringObj is Structure)
                {
                    _messageService.SendStructureFireRequest(request.FiringObj.Id, request.FiringRotation, request.GetProjectileIDs(), request.FiringWeaponSlot, request.PctCharge);
                }
                else if (request.FiringObj is Ship)
                {
                    _messageService.SendShipFireRequest(request.FiringObj.Id, request.FiringWeaponSlot, request.GetProjectileIDs(), request.FiringRotation, request.PctCharge, request.ProjectileType);
                }
            }

            if (!Validation.IsMissileType(request.ProjectileType))
            {
                foreach (var pd in request.ProjectileData)
                {
                    CreateProjectile(request.ProjectileType, pd.ProjectilePosition, pd.VelocityOffset, pd.ProjectileRotation, pd.ProjectileID, request.FiringObj, pd.PctCharge, request.FiringWeaponSlot);
                }
            }
            else
            {
                foreach (var pd in request.ProjectileData)
                {
                    CreateMissile(request.ProjectileType, pd.ProjectilePosition, pd.VelocityOffset, pd.ProjectileRotation, pd.ProjectileID, request.FiringObj, true, request.FiringWeaponSlot);
                }
            }
        }
    protected override void OnUpdate()
    {
        // Copy requests as spawning will invalidate Group
        var requests = new ProjectileRequest[Group.requests.Length];

        for (var i = 0; i < Group.requests.Length; i++)
        {
            requests[i] = Group.requests[i];
            PostUpdateCommands.DestroyEntity(Group.entities[i]);
        }

        // Handle requests
        foreach (var request in requests)
        {
            var projectileEntity = m_settings.projectileFactory.Create(EntityManager);

            var projectileData = EntityManager.GetComponentData <ProjectileData>(projectileEntity);

            projectileData.Initialize(request);
            projectileData.LoadSettings(m_resourceSystem);

            PostUpdateCommands.SetComponent(projectileEntity, projectileData);
            PostUpdateCommands.AddComponent(projectileEntity, new ServerEntity());
        }
    }
示例#5
0
        /// <summary>
        /// Fires the weapon. Used for weapons which are fired by this client. Sends fire request to server. Generates a list of projectileIDs to be sent to the server.
        /// </summary>
        /// <param name="projectileIDs"></param>
        /// <param name="rotation"></param>
        /// <param name="charge"></param>
        public virtual bool Fire_LocalOrigin(float rotation, byte charge, bool changeEnergy)
        {
            if (!Fire(changeEnergy))
            {
                return(false);
            }


            var projectileIDs = new List <int>(Stats.NumProjectiles);

            for (int i = 0; i < Stats.NumProjectiles; i++)
            {
                projectileIDs.Add(Utilities.NextUnique());//Ensures that all IDs are unique
            }

            List <Vector2> projectilePositions  = GeneratePositions(rotation);
            List <float>   projectileRotations  = GenerateRotations(rotation);
            List <Vector2> projectileVelocities = GenerateVelocityOffsets(rotation);

            ProjectileRequest pr = new ProjectileRequest(HoldingObj, rotation, Slot, charge, true, Stats.ProjectileType);

            for (int i = 0; i < projectileIDs.Count; i++)
            {
                ProjectileData d = new ProjectileData(projectilePositions[i], projectileVelocities[i], projectileRotations[i], projectileIDs[i]);
                pr.AddProjectile(d);
            }



            _projectileManager.CreateProjectiles(pr);

            return(true);
        }
示例#6
0
 public void SetupFromRequest(ProjectileRequest request)
 {
     rayQueryId               = -1;
     projectileOwner          = request.owner;
     projectileTypeRegistryId = request.projectileTypeRegistryId;
     startTick = request.startTick;
     startPos  = request.startPosition;
     endPos    = request.endPosition;
     teamId    = request.teamId;
     collisionCheckTickDelay = request.collisionTestTickDelay;
 }
        public void Register(int id, Transform caster, Transform emitter, Transform target, int index = 0, bool immediately = false)
        {
            ProjectileRequest req = new ProjectileRequest(id, caster, emitter, Vector3.zero, Quaternion.identity, target, Vector3.zero, index);

            if (immediately)
            {
                req.Create(transform);
            }
            else
            {
                m_ReqList.Add(req);
            }
        }
        public void Register(int id, Transform caster, Vector3 pos, Quaternion rot, Vector3 targetPosition, int index = 0, bool immediately = false)
        {
            ProjectileRequest req = new ProjectileRequest(id, caster, null, pos, rot, null, targetPosition, index);

            if (immediately)
            {
                req.Create(transform);
            }
            else
            {
                m_ReqList.Add(req);
            }
        }
示例#9
0
    public static void Create(EntityCommandBuffer commandBuffer, int tick, int tickDelay, WeakAssetReference projectileAsset, Entity owner, int teamId, float3 startPosition, float3 endPosition)
    {
        var request = new ProjectileRequest
        {
            projectileAssetGuid = projectileAsset,
            startTick           = tick,
            startPosition       = startPosition,
            endPosition         = endPosition,
            owner = owner,
            collisionTestTickDelay = tickDelay,
            teamId = teamId,
        };

        commandBuffer.AddComponent(commandBuffer.CreateEntity(), request);
    }
示例#10
0
    void EnterFiringPhase(Entity abilityEntity, ref AbilityControl abilityCtrl
                          , ref Ability_Chaingun.PredictedState predictedState, ref Ability_Chaingun.Settings settings, int tick)
    {
//        GameDebug.Log("Chaingun.EnterFiringPhase");

        var charAbility        = EntityManager.GetComponentData <CharBehaviour>(abilityEntity);
        var charPredictedState = EntityManager.GetComponentData <CharPredictedStateData>(charAbility.character);
        var character          = EntityManager.GetComponentObject <Character>(charAbility.character);

        abilityCtrl.behaviorState = AbilityControl.State.Active;
        predictedState.SetPhase(Ability_Chaingun.Action.Fire, tick);
        predictedState.ammoInClip -= 1;
        charPredictedState.SetAction(CharPredictedStateData.Action.PrimaryFire, tick);

        // Only fire shot once for each tick (so it does not fire again when re-predicting)
        var localState = EntityManager.GetComponentData <Ability_Chaingun.LocalState>(abilityEntity);

        if (tick > localState.lastFireTick)
        {
            localState.lastFireTick = tick;

            var command = EntityManager.GetComponentObject <UserCommandComponent>(charAbility.character).command;
            var eyePos  = charPredictedState.position + Vector3.up * character.eyeHeight;
            var endPos  = eyePos + command.lookDir * settings.projectileRange;

            Debug.Log($"character is {character} and item is {character.presentations[1].GetComponent<RobotWeaponA>()}");
            var muzzle = character.presentations[1].GetComponent <RobotWeaponA>().muzzle;
            eyePos = muzzle.transform.position;
            endPos = eyePos + muzzle.transform.forward * settings.projectileRange;
            Debug.Log($"shot from Chaingun, char is {character.name}. Eye Pos is {eyePos} and direction is {endPos}");


            //GameDebug.Log("Request Projectile. Tick:" + tick);
            ProjectileRequest.Create(PostUpdateCommands, tick, tick - command.renderTick,
                                     settings.projectileRegistryId, charAbility.character, character.teamId, eyePos, endPos);

            //
            var interpolatedState = EntityManager.GetComponentData <Ability_Chaingun.InterpolatedState>(abilityEntity);
            interpolatedState.fireTick = tick;

            EntityManager.SetComponentData(abilityEntity, interpolatedState);
            EntityManager.SetComponentData(abilityEntity, localState);
        }

        EntityManager.SetComponentData(abilityEntity, abilityCtrl);
        EntityManager.SetComponentData(abilityEntity, predictedState);
        EntityManager.SetComponentData(charAbility.character, charPredictedState);
    }
    public static void Create(EntityCommandBuffer commandBuffer, int tick, int tickDelay, int projectileRegistryId, Entity owner, int teamId, float3 startPosition, float3 endPosition)
    {
        var request = new ProjectileRequest
        {
            projectileTypeRegistryId = projectileRegistryId,
            startTick              = tick,
            startPosition          = startPosition,
            endPosition            = endPosition,
            owner                  = owner,
            collisionTestTickDelay = tickDelay,
            teamId                 = teamId,
        };

        commandBuffer.CreateEntity();
        commandBuffer.AddComponent(request);
    }
        void LateUpdate()
        {
            if (m_ReqList.Count > 0)
            {
                m_Reqs.Clear();
                m_Reqs.AddRange(m_ReqList);

                for (int i = m_Reqs.Count - 1; i >= 0; i--)
                {
                    ProjectileRequest req = m_ReqList[i];

                    req.Create(transform);

                    m_ReqList.Remove(req);
                }
            }
        }
示例#13
0
    void EnterFiringPhase(Entity abilityEntity, ref AbilityControl abilityCtrl
                          , ref Ability_Chaingun.PredictedState predictedState, ref Ability_Chaingun.Settings settings, int tick)
    {
//        GameDebug.Log("Chaingun.EnterFiringPhase");

        var charAbility        = EntityManager.GetComponentData <CharBehaviour>(abilityEntity);
        var charPredictedState = EntityManager.GetComponentData <CharacterPredictedData>(charAbility.character);
        var character          = EntityManager.GetComponentObject <Character>(charAbility.character);

        abilityCtrl.behaviorState = AbilityControl.State.Active;
        predictedState.SetPhase(Ability_Chaingun.State.Fire, tick);
        predictedState.ammoInClip -= 1;
        charPredictedState.SetAction(CharacterPredictedData.Action.PrimaryFire, tick);

        // Only fire shot once for each tick (so it does not fire again when re-predicting)
        var localState = EntityManager.GetComponentData <Ability_Chaingun.LocalState>(abilityEntity);

        if (tick > localState.lastFireTick)
        {
            localState.lastFireTick = tick;

            var command = EntityManager.GetComponentData <UserCommandComponentData>(charAbility.character).command;
            var eyePos  = charPredictedState.position + Vector3.up * character.eyeHeight;
            var endPos  = eyePos + command.lookDir * settings.projectileRange;

            //GameDebug.Log("Request Projectile. Tick:" + tick);
            ProjectileRequest.Create(PostUpdateCommands, tick, tick - command.renderTick,
                                     settings.projectileAssetGuid, charAbility.character, character.teamId, eyePos, endPos);

            //
            var interpolatedState = EntityManager.GetComponentData <Ability_Chaingun.InterpolatedState>(abilityEntity);
            interpolatedState.fireTick = tick;

            EntityManager.SetComponentData(abilityEntity, interpolatedState);
            EntityManager.SetComponentData(abilityEntity, localState);
        }

        EntityManager.SetComponentData(abilityEntity, abilityCtrl);
        EntityManager.SetComponentData(abilityEntity, predictedState);
        EntityManager.SetComponentData(charAbility.character, charPredictedState);
    }
    protected override void OnUpdate()
    {
        var entityArray  = Group.ToEntityArray(Allocator.Persistent);
        var requestArray = Group.ToComponentDataArray <ProjectileRequest>(Allocator.Persistent);

        // Copy requests as spawning will invalidate Group
        var requests = new ProjectileRequest[requestArray.Length];

        for (var i = 0; i < requestArray.Length; i++)
        {
            requests[i] = requestArray[i];
            PostUpdateCommands.DestroyEntity(entityArray[i]);
        }

        // Handle requests
        var projectileRegistry = m_resourceSystem.GetResourceRegistry <ProjectileRegistry>();

        foreach (var request in requests)
        {
            var registryIndex = projectileRegistry.FindIndex(request.projectileAssetGuid);
            if (registryIndex == -1)
            {
                GameDebug.LogError("Cant find asset guid in registry");
                continue;
            }

            var projectileEntity = m_settings.projectileFactory.Create(EntityManager, m_resourceSystem, null, 0);

            var projectileData = EntityManager.GetComponentData <ProjectileData>(projectileEntity);
            projectileData.SetupFromRequest(request, registryIndex);
            projectileData.Initialize(projectileRegistry);

            PostUpdateCommands.SetComponent(projectileEntity, projectileData);
            PostUpdateCommands.AddComponent(projectileEntity, new UpdateProjectileFlag());
        }
        entityArray.Dispose();
        requestArray.Dispose();
    }
示例#15
0
        /// <summary>
        /// Fires the weapon. Used for weapons which are fired by other clients, with data received from the server.
        /// </summary>
        /// <param name="projectileIDs"></param>
        /// <param name="rotation"></param>
        /// <param name="charge"></param>
        /// <returns></returns>
        public virtual bool Fire_ServerOrigin(List <int> projectileIDs, float rotation, byte charge, bool changeEnergy)
        {
            if (!Fire(changeEnergy))
            {
                return(false);
            }

            List <Vector2> projectilePositions  = GeneratePositions(rotation);
            List <float>   projectileRotations  = GenerateRotations(rotation);
            List <Vector2> projectileVelocities = GenerateVelocityOffsets(rotation);

            ProjectileRequest pr = new ProjectileRequest(HoldingObj, rotation, Slot, charge, false, Stats.ProjectileType);

            for (int i = 0; i < projectileIDs.Count; i++)
            {
                ProjectileData d = new ProjectileData(projectilePositions[i], projectileVelocities[i], projectileRotations[i], projectileIDs[i]);
                pr.AddProjectile(d);
            }

            _projectileManager.CreateProjectiles(pr);

            return(true);
        }
    protected override void Update(Entity entity, AbilityControl abilityCtrl, Ability_ProjectileLauncher.PredictedState predictedState, Ability_ProjectileLauncher.Settings settings)
    {
        Profiler.BeginSample("ProjectileLauncher_Update");

        var time = m_world.worldTime;

        switch (predictedState.phase)
        {
        case Ability_ProjectileLauncher.Phase.Idle:
            if (abilityCtrl.activeAllowed == 1)
            {
                var charAbility        = EntityManager.GetComponentData <CharacterAbility>(entity);
                var character          = EntityManager.GetComponentObject <Character>(charAbility.character);
                var charPredictedState = EntityManager.GetComponentObject <CharacterPredictedState>(charAbility.character);

                predictedState.SetPhase(Ability_ProjectileLauncher.Phase.Active, time.tick);

                charPredictedState.State.SetAction(settings.fireAction, time.tick);

                // Only spawn once for each tick (so it does not fire again when re-predicting)
                var localState = EntityManager.GetComponentData <Ability_ProjectileLauncher.LocalState>(entity);
                if (time.tick > localState.lastFireTick)
                {
                    localState.lastFireTick = time.tick;
                    EntityManager.SetComponentData(entity, localState);

                    var eyePos            = charPredictedState.State.position + Vector3.up * character.eyeHeight;
                    var interpolatedState = EntityManager.GetComponentData <Ability_ProjectileLauncher.InterpolatedState>(entity);
                    var command           = EntityManager.GetComponentObject <UserCommandComponent>(charAbility.character)
                                            .command;

                    var endPos = eyePos + command.lookDir * settings.projectileRange;
                    ProjectileRequest.Create(PostUpdateCommands, time.tick, time.tick - command.renderTick,
                                             settings.projectileRegistryId, charAbility.character, charPredictedState.teamId, eyePos, endPos);

                    interpolatedState.fireTick = time.tick;
                    EntityManager.SetComponentData(entity, interpolatedState);
                }
            }
            break;

        case Ability_ProjectileLauncher.Phase.Active:
        {
            var phaseDuration = time.DurationSinceTick(predictedState.phaseStartTick);
            if (phaseDuration > settings.activationDuration)
            {
                var charAbility = EntityManager.GetComponentData <CharacterAbility>(entity);
                var character   = EntityManager.GetComponentObject <CharacterPredictedState>(charAbility.character);

                predictedState.SetPhase(Ability_ProjectileLauncher.Phase.Cooldown, time.tick);
                character.State.SetAction(CharacterPredictedState.StateData.Action.None, time.tick);
            }
            break;
        }

        case Ability_ProjectileLauncher.Phase.Cooldown:
        {
            var phaseDuration = time.DurationSinceTick(predictedState.phaseStartTick);
            if (phaseDuration > settings.cooldownDuration)
            {
                predictedState.SetPhase(Ability_ProjectileLauncher.Phase.Idle, time.tick);
            }
            break;
        }
        }

        EntityManager.SetComponentData(entity, predictedState);

        Profiler.EndSample();
    }
    protected override void Update(Entity entity, AbilityControl abilityCtrl, Ability_ProjectileLauncher.PredictedState predictedState, Ability_ProjectileLauncher.Settings state)
    {
        var time = m_world.worldTime;

        switch (abilityCtrl.behaviorState)
        {
        case AbilityControl.State.Idle:
            if (abilityCtrl.active == 1)
            {
                var charAbility        = EntityManager.GetComponentData <CharBehaviour>(entity);
                var character          = EntityManager.GetComponentObject <Character>(charAbility.character);
                var charPredictedState = EntityManager.GetComponentData <CharPredictedStateData>(charAbility.character);

                abilityCtrl.behaviorState = AbilityControl.State.Active;
                predictedState.activeTick = time.tick;

//                    GameDebug.Log("Ability_ProjectileLauncher SetAction:" + state.fireAction + " tick:" + time.tick);
                charPredictedState.SetAction(state.fireAction, time.tick);

                // Only spawn once for each tick (so it does not fire again when re-predicting)
                var localState = EntityManager.GetComponentData <Ability_ProjectileLauncher.LocalState>(entity);
                if (time.tick > localState.lastFireTick)
                {
                    localState.lastFireTick = time.tick;
                    EntityManager.SetComponentData(entity, localState);

                    var eyePos            = charPredictedState.position + Vector3.up * character.eyeHeight;
                    var interpolatedState = EntityManager.GetComponentData <Ability_ProjectileLauncher.InterpolatedState>(entity);
                    var command           = EntityManager.GetComponentObject <UserCommandComponent>(charAbility.character)
                                            .command;

                    var endPos = eyePos + command.lookDir * state.projectileRange;
                    ProjectileRequest.Create(PostUpdateCommands, time.tick, time.tick - command.renderTick,
                                             state.projectileRegistryId, charAbility.character, character.teamId, eyePos, endPos);

                    interpolatedState.fireTick = time.tick;
                    EntityManager.SetComponentData(entity, interpolatedState);
                }

                EntityManager.SetComponentData(entity, abilityCtrl);
                EntityManager.SetComponentData(entity, predictedState);
                EntityManager.SetComponentData(charAbility.character, charPredictedState);
            }
            break;

        case AbilityControl.State.Active:
        {
            var phaseDuration = time.DurationSinceTick(predictedState.activeTick);
            if (phaseDuration > state.activationDuration)
            {
                var charAbility        = EntityManager.GetComponentData <CharBehaviour>(entity);
                var charPredictedState = EntityManager.GetComponentData <CharPredictedStateData>(charAbility.character);

                abilityCtrl.behaviorState = AbilityControl.State.Cooldown;

//                    GameDebug.Log("Ability_ProjectileLauncher SetAction:" + CharPredictedStateData.Action.None + " tick:" + time.tick);
                charPredictedState.SetAction(CharPredictedStateData.Action.None, time.tick);

                EntityManager.SetComponentData(entity, abilityCtrl);
                EntityManager.SetComponentData(charAbility.character, charPredictedState);
            }
            break;
        }

        case AbilityControl.State.Cooldown:
        {
            var phaseDuration = time.DurationSinceTick(predictedState.activeTick);
            if (phaseDuration > state.cooldownDuration)
            {
                abilityCtrl.behaviorState = AbilityControl.State.Idle;
                EntityManager.SetComponentData(entity, abilityCtrl);
            }
            break;
        }
        }
    }