Example #1
0
    private void Shoot(double time)
    {
        if (Network.isServer)
        {
            _anim.SetTrigger(_hash.pistolFireTrigger);

            //
            DamageLocation historicalHitLocation = null;
            Vector3        historicalPointOfAim;

            // Rollback world state to match what shooter saw at the time they shot.
            using (new RollbackContext(_syncManager, time))
            {
                historicalPointOfAim = _rangedTarget.transform.position;

                // Get colliders where shot lands
                Collider[] colliders = Physics.OverlapSphere(historicalPointOfAim, 0.001f);

                GameObject hitBodyPart = colliders
                                         .Select(c => c.gameObject)
                                         .FirstOrDefault(go => go.tag == Tags.bodyPart);

                var gos = colliders.Select(c => c.gameObject).ToArray();
                var gox = gos.FirstOrDefault(x => x.tag == Tags.bodyPart);

                if (hitBodyPart != null)
                {
                    // Shot hit a player's body part.
                    historicalHitLocation = hitBodyPart.GetComponent <DamageLocation>();
                }
            }

            _syncManager.RecordShot(networkGuid, historicalPointOfAim, GetMuzzlePosition());

            if (historicalHitLocation != null)
            {
                DamageLocationScaled(historicalHitLocation, 30);
            }
        }
        else
        {
            _anim.SetTrigger(_hash.pistolFireTrigger);
            _syncManager.RenderShot(_rangedTarget.transform.position, GetMuzzlePosition());
        }
    }
Example #2
0
    private void DamageLocationScaled(DamageLocation damageLocation, int damage)
    {
        Player otherPlayer = damageLocation.player.GetComponent <Player>();

        switch (damageLocation.damageLocationType)
        {
        case DamageLocationType.Head:
            otherPlayer.hp -= (int)(damage * 3.34f);
            break;

        case DamageLocationType.Torso:
            otherPlayer.hp -= damage;
            break;

        case DamageLocationType.Legs:
            otherPlayer.hp -= (int)(damage * 0.67f);
            break;

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
Example #3
0
    private void DamageLocationScaled(DamageLocation damageLocation, int damage)
    {
        Player otherPlayer = damageLocation.player.GetComponent<Player>();

        switch (damageLocation.damageLocationType)
        {
            case DamageLocationType.Head:
                otherPlayer.hp -= (int)(damage * 3.34f);
                break;
            case DamageLocationType.Torso:
                otherPlayer.hp -= damage;
                break;
            case DamageLocationType.Legs:
                otherPlayer.hp -= (int)(damage * 0.67f);
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
Example #4
0
 public GameEventDefenderNotification(Session session, string attackerName, DamageType damageType, float percent, uint damage, DamageLocation damageLocation, bool criticalHit, AttackConditions attackConditions)
     : base(GameEventType.DefenderNotification, GameMessageGroup.UIQueue, session)
 {
     Writer.WriteString16L(attackerName);
     Writer.Write((uint)damageType);
     Writer.Write((double)percent);
     Writer.Write(damage);
     Writer.Write((uint)damageLocation);
     Writer.Write(Convert.ToUInt32(criticalHit));
     Writer.Write((UInt64)attackConditions);
     Writer.Align();
 }
Example #5
0
 public DamageEvent(int amount, DamageLocation location, Vector3 position)
 {
     Amount = amount; Location = location; Position = position;
 }
Example #6
0
    protected virtual void Awake()
    {
        _anim = GetComponent <Animator>();

        _hash        = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent <HashIDs>();
        _syncManager = GameObject.FindGameObjectWithTag(Tags.networkController).GetComponent <SyncManager>();
        _modelInfo   = GetComponent <ModelInfo>();

        // Create a marker object for player's ranged target.
        _rangedTarget = InstantiateAsChild(ResourceDirectory.Instance.Creatures["redMarker"], transform) as GameObject;

        // Create IK controller for right arm.
        GameObject rArmIkController = GameObject.Instantiate(Resources.Load("Prefabs/Animation/LimbIkController")) as GameObject;

        rArmIkController.transform.parent = gameObject.transform;
        _rArmIkLimb                    = rArmIkController.GetComponent <IkLimb>();
        _rArmIkLimb.upperArm           = _modelInfo.rArm.transform;
        _rArmIkLimb.forearm            = _modelInfo.rForearm.transform;
        _rArmIkLimb.hand               = _modelInfo.rHand.transform;
        _rArmIkLimb.elbowTarget        = _modelInfo.rArmPistolIkElbowTarget;
        _rArmIkLimb.target             = _modelInfo.rArmPistolIkHandTarget.transform;
        _rArmIkLimb.IsEnabled          = false;
        _rArmIkLimb.debug              = true;
        _rArmIkLimb.transition         = 0.65f;
        _rArmIkLimb.handRotationPolicy = IkLimb.HandRotations.UseTargetRotation;

        // Create IK controller for left arm.
        GameObject lArmIkController = GameObject.Instantiate(Resources.Load("Prefabs/Animation/LimbIkController")) as GameObject;

        lArmIkController.transform.parent = gameObject.transform;
        _lArmIkLimb             = lArmIkController.GetComponent <IkLimb>();
        _lArmIkLimb.upperArm    = _modelInfo.lArm.transform;
        _lArmIkLimb.forearm     = _modelInfo.lForearm.transform;
        _lArmIkLimb.hand        = _modelInfo.lHand.transform;
        _lArmIkLimb.elbowTarget = _modelInfo.lArmPistolIkElbowTarget;
        _lArmIkLimb.target      = _modelInfo.lArmPistolIkHandTarget;
        _lArmIkLimb.IsEnabled   = false;
        _lArmIkLimb.debug       = true;
        _lArmIkLimb.transition  = 0.9f;

        // Add DamageLocation scripts to skeleton.
        DamageLocation headDamageLocation = _modelInfo.head.AddComponent <DamageLocation>();

        headDamageLocation.damageLocationType = DamageLocationType.Head;
        headDamageLocation.player             = this.gameObject;
        DamageLocation torsoDamageLocation = _modelInfo.torso.AddComponent <DamageLocation>();

        torsoDamageLocation.damageLocationType = DamageLocationType.Torso;
        torsoDamageLocation.player             = this.gameObject;
        DamageLocation legsDamageLocation = _modelInfo.legs.AddComponent <DamageLocation>();

        legsDamageLocation.damageLocationType = DamageLocationType.Legs;
        legsDamageLocation.player             = this.gameObject;


        // Create initial NoWeapon object.
        EquipWeaponByName("NoWeapon");

        // Create camera orbiter object.
        MouseOrbit = (GameObject.Instantiate(ResourceDirectory.Instance.Camera["Orbiter"]) as GameObject).GetComponent <MouseOrbit>();
        MouseOrbit.transform.parent = transform;
        MouseOrbit.target           = transform;
    }