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); }
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); }
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; } } }