示例#1
0
    public static void Create(EntityCommandBuffer commandBuffer, WeakAssetReference assetGuid, Vector3 position, Vector3 velocity, Entity owner, int teamId)
    {
        var data = new GrenadeSpawnRequest();

        data.assetGuid = assetGuid;
        data.position  = position;
        data.velocity  = velocity;
        data.owner     = owner;
        data.teamId    = teamId;

        commandBuffer.AddComponent(commandBuffer.CreateEntity(), data);
    }
示例#2
0
    public static unsafe void Create(EntityCommandBuffer commandBuffer, byte *guid, Vector3 position, Vector3 velocity, Entity owner, int teamId)
    {
        var data = new GrenadeSpawnRequest();

        for (var i = 0; i < 16; i++)
        {
            data.prefabGUID[i] = guid[i];
        }
        data.position = position;
        data.velocity = velocity;
        data.owner    = owner;
        data.teamId   = teamId;

        commandBuffer.CreateEntity();
        commandBuffer.AddComponent(data);
    }
示例#3
0
    protected override void Update(Entity entity, AbilityControl abilityCtrl, Ability_GrenadeLauncher.PredictedState predictedState, Ability_GrenadeLauncher.Settings settings)
    {
        var time = m_world.worldTime;

        switch (predictedState.phase)
        {
        case Ability_GrenadeLauncher.Phase.Idle:
            if (abilityCtrl.active == 1)
            {
                var charAbility        = EntityManager.GetComponentData <CharBehaviour>(entity);
                var charPredictedState = EntityManager.GetComponentData <CharPredictedStateData>(charAbility.character);
                var character          = EntityManager.GetComponentObject <Character>(charAbility.character);

                abilityCtrl.behaviorState = AbilityControl.State.Active;

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

                charPredictedState.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_GrenadeLauncher.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_GrenadeLauncher.InterpolatedState>(entity);
                    var command           = EntityManager.GetComponentObject <UserCommandComponent>(charAbility.character)
                                            .command;

                    var startDir = command.lookDir;
                    var right    = math.cross(new float3(0, 1, 0), startDir);
                    var pitchRot = quaternion.AxisAngle(right,
                                                        -math.radians(settings.grenadePitchAngle));
                    startDir = math.mul(pitchRot, startDir);

                    var velocity = startDir * settings.grenadeVelocity;

                    var muzzle = character.presentations[1].GetComponent <RobotWeaponA>().muzzle;
                    eyePos   = muzzle.transform.position;
                    startDir = muzzle.transform.forward;
                    right    = math.cross(new float3(0, 1, 0), startDir);
                    pitchRot = quaternion.AxisAngle(right,
                                                    -math.radians(settings.grenadePitchAngle));
                    startDir = math.mul(pitchRot, startDir);

                    velocity = startDir * settings.grenadeVelocity;


                    unsafe
                    {
                        GrenadeSpawnRequest.Create(PostUpdateCommands, settings.grenadePrefabGUID, eyePos,
                                                   velocity, charAbility.character, character.teamId);
                    }

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

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

        case Ability_GrenadeLauncher.Phase.Active:
        {
            var phaseDuration = time.DurationSinceTick(predictedState.phaseStartTick);
            if (phaseDuration > settings.activationDuration)
            {
                var charAbility        = EntityManager.GetComponentData <CharBehaviour>(entity);
                var charPredictedState = EntityManager.GetComponentData <CharPredictedStateData>(charAbility.character);

                abilityCtrl.behaviorState = AbilityControl.State.Cooldown;

                predictedState.SetPhase(Ability_GrenadeLauncher.Phase.Cooldown, time.tick);

                charPredictedState.SetAction(CharPredictedStateData.Action.None, time.tick);

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

        case Ability_GrenadeLauncher.Phase.Cooldown:
        {
            var phaseDuration = time.DurationSinceTick(predictedState.phaseStartTick);
            if (phaseDuration > settings.cooldownDuration)
            {
                abilityCtrl.behaviorState = AbilityControl.State.Idle;

                predictedState.SetPhase(Ability_GrenadeLauncher.Phase.Idle, time.tick);

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