Example #1
0
        public override void SimulateController()
        {
            // If player is "dead" ignore inputs
            if (state.Health <= 0)
            {
                return;
            }

            var cmd = MoveAndShootMoveCommand.Create();

            cmd.Direction = _input.Dir;
            cmd.Yaw       = _input.Angle;

            entity.QueueInput(cmd);

            if (_input.Fired.HasValue)
            {
                var fireCommandInput = MoveAndShootFireCommand.Create();
                fireCommandInput.Type = _input.Fired.Value;

                entity.QueueInput(fireCommandInput);

                // reset fire input
                _input.Fired = null;
            }
        }
Example #2
0
        private void HandleFireCommand(MoveAndShootFireCommand fireCommand, bool reset)
        {
            if (reset)
            {
                SetState(fireCommand.Result.Position, fireCommand.Result.Velocity, fireCommand.Result.Yaw);
            }
            else if (fireCommand.IsFirstExecution)
            {
                var inputType = fireCommand.Input.Type;
                var weapon    = inputType ? weaponDamage : weaponHeal;

                if (weapon.NextFireFrame <= BoltNetwork.ServerFrame)
                {
                    weapon.NextFireFrame = BoltNetwork.ServerFrame + weapon.fireRate;

                    if (weapon.TriggerState != null)
                    {
                        weapon.TriggerState.Invoke();
                    }

                    if (entity.IsOwner)
                    {
                        var     fireOrigin        = weapon.fx.transform;
                        var     fireOriginForward = fireOrigin.forward;
                        Vector3 pos = fireOrigin.position + (fireOriginForward * 0.5f);

                        Ray ray = new Ray(pos, fireOriginForward);
                        using (var hits = BoltNetwork.RaycastAll(ray, fireCommand.ServerFrame))
                        {
                            for (int i = 0; i < hits.count; ++i)
                            {
                                var hit = hits.GetHit(i);

                                // Check if weapon can effect at that distance based on the weapon range
                                if (hit.distance <= weapon.maxEffectRange)
                                {
                                    var serializer = hit.body.GetComponent <MoveAndShoot_PlayerController>();

                                    if (serializer != null)
                                    {
                                        // Hit Point
                                        HitHandler(serializer.entity, weapon.amount, weapon.type, ray.GetPoint(hit.distance));
                                    }
                                }
                            }
                        }
                    }
                }

                fireCommand.Result.Velocity = _cc.velocity;
                fireCommand.Result.Position = transform.localPosition;
                fireCommand.Result.Yaw      = transform.localRotation.eulerAngles.y;
            }
        }