void FireBullet()
    {
        Ray        ray = new Ray(Muzzle.position, Muzzle.forward);
        RaycastHit hit;

        Physics.Raycast(ray, out hit);

        flashLine.positionCount = 2;

        flashLine.SetPosition(0, Muzzle.position);
        flashLine.SetPosition(1, hit.point);
        flashStay         = FlashStayTime;
        flashLine.enabled = true;

        if (hit.collider)
        {
            UnitHealth  hitBody     = hit.collider.gameObject.GetComponent <UnitHealth>();
            HitCollider hitCollider = hit.collider.gameObject.GetComponent <HitCollider>();

            if (!hitBody && hitCollider && hitCollider.ColliderType == HitCollider.Type.Receive)
            {
                hitBody = hitCollider.GetOwner();
            }

            if (hitBody)
            {
                hitBody.Damage(DamagePerBullet);
            }
        }
    }
Beispiel #2
0
    void OnTriggerEnter(Collider other)
    {
        if (mAttackActionInfo == null)
        {
            return;
        }

        if (other.gameObject == mOwner.gameObject)
        {
            return;
        }

        HitCollider hitObj = other.gameObject.GetComponent <HitCollider>();

        if (hitObj == null)
        {
            return;
        }

        CharacterProperty character = hitObj.mOwner;

        if (character)
        {
            float hitTime = Time.time - t;

            character.Hit(mOwner, mAttackActionInfo.value);
            //character.HitRate
            GameObject hitEffect = Instantiate(Resources.Load("Effects/Hits/SimpleHitFlash"), CheckCollider.ClosestPointOnBounds(other.transform.position), Quaternion.identity) as GameObject;
            Destroy(hitEffect, 3.0f);

            mAttackActionInfo     = null;
            CheckCollider.enabled = false;
        }
    }
Beispiel #3
0
    void OnTriggerEnter2D(Collider2D other)
    {
        var nearProps = Physics2D.OverlapCircleAll(transform.position, HitRadius, HitLayerMask);

        HitCollider?.Invoke(nearProps, other.transform, transform.position);

        gameObject.SetActive(false);
        Instantiate(OnDestroyedVFX, transform.position - new Vector3(0, 0, .3f), OnDestroyedVFX.transform.rotation);
        AudioManager.Instance.PlaySFX(OnHitClips[Random.Range(0, OnHitClips.Length)], 0.5f, Random.Range(1, 1.1f));
    }
 public void OnHitColliderContact(HitCollider self, HitCollider other)
 {
     if (self.ColliderType != other.ColliderType)
     {
         if (self.ColliderType == global::HitCollider.Type.Inflict)
         {
             OnInflictHit?.Invoke(self, other);
         }
         else if (self.ColliderType == global::HitCollider.Type.Receive)
         {
             OnReceiveHit?.Invoke(self, other);
         }
     }
 }
Beispiel #5
0
    private List <InteractTile> GetTiles(InteractTile center)
    {
        List <InteractTile> ret = new List <InteractTile>();

        Collider[] HitColliders = Physics.OverlapCapsule(center.transform.position, center.transform.position + InteractComponent.singleton.GetDirection() * World.singleton.Size.magnitude, Radius, 1 << 8);
        foreach (Collider HitCollider in HitColliders)
        {
            InteractTile TileComponent = HitCollider.GetComponent <InteractTile>();
            if (TileComponent)
            {
                ret.Add(TileComponent);
            }
        }
        return(ret);
    }
Beispiel #6
0
    private List <InteractTile> GetTiles(InteractTile center)
    {
        List <InteractTile> ret = new List <InteractTile>();

        Collider[] HitColliders = Physics.OverlapSphere(center.transform.position, Radius, 1 << 8);
        foreach (Collider HitCollider in HitColliders)
        {
            InteractTile TileComponent = HitCollider.GetComponent <InteractTile>();
            if (TileComponent)
            {
                ret.Add(TileComponent);
            }
        }
        return(ret);
    }
 void Start()
 {
     m_networkManager = NetworkManager.singleton;
     m_controller     = GetComponent <CharacterController>();
     Camera.main.GetComponent <CameraController>().m_target = transform;
     if (gameObject.tag == "Player")
     {
         gameObject.layer = 8;
     }
     else if (gameObject.tag == "Enemy")
     {
         gameObject.layer = 9;
     }
     m_animController    = GetComponent <Animator>();
     m_hitColliderScript = GetComponent <HitCollider>();
 }
Beispiel #8
0
    protected void OnTriggerEnter2D(Collider2D other)
    {
        if (attackableMask == (attackableMask | (1 << other.gameObject.layer)))
        {
            HitCollider target = other.GetComponent <HitCollider>();
            if (target != null)
            {
                target.character.DoDamage(owner.gameObject, this.damage);
            }
        }

        Debug.Log(other.gameObject.name);

        if (destructionMask == (destructionMask | (1 << other.gameObject.layer)))
        {
            Destroy(gameObject);
        }
    }
Beispiel #9
0
 void Update()
 {
     if (Random.Range(0.0f, 1.0f) < RandomFireStartChance)
     {
         for (int i = 0; i < Random.Range(0, RandomFireStartMaxCount); i++)
         {
             Collider[] HitColliders = Physics.OverlapSphere(GetRandomTile().transform.position, Random.Range(0.0f, RandomFireStartRadius), 1 << 8);
             foreach (Collider HitCollider in HitColliders)
             {
                 InteractTile TileComponent = HitCollider.GetComponent <InteractTile>();
                 if (TileComponent)
                 {
                     TileComponent.SetFireState(true);
                 }
             }
         }
     }
 }
Beispiel #10
0
    private List <InteractTile> GetTiles(InteractTile center)
    {
        List <InteractTile> ret = new List <InteractTile>();
        bool HasWater           = false;

        Collider[] HitColliders = Physics.OverlapCapsule(center.transform.position, center.transform.position + InteractComponent.singleton.GetDirection() * Range, Radius, 1 << 8);
        foreach (Collider HitCollider in HitColliders)
        {
            InteractTile TileComponent = HitCollider.GetComponent <InteractTile>();
            if (TileComponent)
            {
                if (TileComponent.type == TileType.Water)
                {
                    HasWater = true;
                }
                ret.Add(TileComponent);
            }
        }
        return(HasWater ? ret : new List <InteractTile>());
    }
    // on receive  hit play damage animation
    // and face towards enemy if attacked from the front
    void OnReceiveHit(HitCollider self, HitCollider other)
    {
        UnitHealth attacker = other.GetOwner();
        float      angle    = Mathf.Abs(Vector3.SignedAngle(transform.forward, (attacker.transform.position - transform.position).normalized, Vector3.up));

        lastDamageAngle = angle;

        if (angle < 90)
        {
            transform.LookAt(attacker.transform, Vector3.up);
        }

        if (unitHealth.Health > 0)
        {
            animator.SetTrigger("Hit");
        }
        alertTimer = AlertTime;

        AlertAlliesInRadius(AllyAlertRange);
    }
Beispiel #12
0
    // initiate attack routine on button press
    public void OnAttackInputDown()
    {
        // do attack
        if (playerCanMove)
        {
            if (!playerAttacking)
            {
                playerAttacking = true;
                Debug.Log("playerAttacking = true");

                // Create an invisible collider in front of the player to check for collision with another interactable object
                GameObject  newHitBox = Instantiate(playerAttackHitBox, new Vector3(attackHitBoxPos.x, attackHitBoxPos.y), transform.rotation);
                HitCollider hitBox    = newHitBox.GetComponent <HitCollider>();

                hitBox.hitBoxOwner = gameObject;
                hitBox.hitBoxDir   = playerController.collisions.facingDir;

                attackTimer = defaultAttackTimer;
            }
        }
    }
Beispiel #13
0
 public override void Use(InteractTile tile)
 {
     if (!Currency.singleton.Pay(Price))
     {
         return;
     }
     InteractComponent.singleton.RainFade();
     if (selectedTiles == null)
     {
         Debug.LogError("NO TILES WERE FOUND!");
     }
     foreach (InteractTile selectedTile in selectedTiles)
     {
         selectedTile.SetFireState(false);
     }
     if (Random.Range(0.0f, 1.0f) < LightningstrikeChance)
     {
         InteractComponent.singleton.ThunderFade();
         SoundHandler.singleton.CardSource.PlayOneShot(LightningClip[Random.Range(0, LightningClip.Length)]);
         InteractTile lightningTile = selectedTiles[Random.Range(0, selectedTiles.Count)];
         Destroy(Instantiate(World.singleton.LightningModel, lightningTile.transform.position + new Vector3(0, 1f, 0), Quaternion.Euler(0, 45, 0)).gameObject, 1);
         Collider[] HitColliders = Physics.OverlapSphere(lightningTile.transform.position, Random.Range(0.0f, LightningStrikeRadius), 1 << 8);
         foreach (Collider HitCollider in HitColliders)
         {
             InteractTile hitTile = HitCollider.GetComponent <InteractTile>();
             if (hitTile)
             {
                 hitTile.SetFireState(true);
             }
         }
     }
     else
     {
         GameObject rain = Instantiate(World.singleton.RainModel, tile.transform.position + new Vector3(0, 1f, 0), Quaternion.Euler(0, 45, 0)).gameObject;
         rain.transform.localScale *= 1.2f;
         Destroy(rain, 1);
         SoundHandler.singleton.CardSource.PlayOneShot(UseSound[Random.Range(0, UseSound.Length)]);
     }
 }
Beispiel #14
0
    public void ReceiveAttack(HitCollider hitCollider, AttackProperties attack)
    {
        bool  blocked  = false;
        Moves nextMove = Moves.None;

        switch (playerState.CheckBlocking(attack.angle))
        {
        case true:
            nextMove = Moves.Blocking;
            blocked  = true;
            break;

        case false:
            nextMove = Moves.BeingHit;
            blocked  = false;
            playerHealth.TakeDamage(attack.damage);
            particle.Play();
            break;
        }
        playerState.SetStateTimer(nextMove, attack.hitStun, attack.blockStun, attack.angle);
        hitCollider.ReceiveAttackFeedback(attack, blocked);
    }
Beispiel #15
0
    void OnAttackHit(HitCollider self, HitCollider other)
    {
        if (activeHit)
        {
            if (attackIsHit)
            {
                self.enabled = false;
                return;
            }

            UnitHealth owner = other.GetOwner();

            float angle = Mathf.Abs(Vector3.SignedAngle(owner.transform.forward, (transform.position - owner.transform.position).normalized, Vector3.up));

            // attacks from the back deal triple the damage
            if (angle > 90)
            {
                owner.Damage(100);
            }
            else
            {
                owner.Damage(36);
            }

            if (other.GetOwner().IsDead())
            {
                Transform chest = other.GetOwner().GetComponent <Animator>().GetBoneTransform(HumanBodyBones.Chest);
                Vector3   force = (chest.position - transform.position);
                force.y  = 0;
                force    = force.normalized;
                force.y += 0.8f;
                force    = force.normalized;
                force   *= 200;
                chest.GetComponent <Rigidbody>().AddForce(force, ForceMode.Impulse);
            }

            attackIsHit = true;
        }
    }
Beispiel #16
0
    private void FixedUpdate()
    {
        if (Time.time > ExplosionTriggerTime)
        {
            if (Time.time > ExplosionEndTime)
            {
                Destroy(this);
            }

            float ExplosionTime = Time.time - ExplosionTriggerTime;
            float Radius        = ExplosionRadius.Evaluate(ExplosionTime);
            float Force         = ExplosionForce.Evaluate(ExplosionTime);

            if (Radius <= 0)
            {
                return;
            }

            Collider[] HitColliders = Physics.OverlapSphere(transform.position, Radius);

            foreach (Collider HitCollider in HitColliders)
            {
                if (HitCollider.gameObject == this.gameObject)
                {
                    continue;
                }
                Rigidbody Body = HitCollider.GetComponent <Rigidbody>();
                if (Body == null)
                {
                    continue;
                }
                float BodyDistance = Vector3.Distance(Body.transform.position, transform.position);

                Body.AddExplosionForce(Force * ForceFalloff.Evaluate(BodyDistance / Radius), ExplosionLocation, 0.0f, 0.0f, ForceMode.Force);
            }
        }
    }
    void OnHitContact(Collider other)
    {
        if (unitHealth == null)
        {
            return;
        }
        if (!this.enabled)
        {
            return;
        }

        HitCollider otherHitCollider = other.GetComponent <HitCollider>();

        if (otherHitCollider == null || !otherHitCollider.enabled)
        {
            return;
        }
        if (unitHealth == otherHitCollider.unitHealth)
        {
            return;
        }

        unitHealth.OnHitColliderContact(this, otherHitCollider);
    }
Beispiel #18
0
    void Start()
    {
        this.TreesPlaced = new List <InteractTile>();

        //Places tiles
        tiles = new InteractTile[(int)Size.x, (int)Size.y];
        for (int x = 0; x < (int)Size.x; x++)
        {
            for (int y = 0; y < (int)Size.y; y++)
            {
                tiles[x, y]   = Instantiate(TilePrefab, new Vector3(x, 0, y), Quaternion.Euler(0, Random.Range(0, 3) * 90, 0), WorldParent).GetComponent <InteractTile>();
                tiles[x, y].x = x;
                tiles[x, y].y = y;
            }
        }

        //River water tiles
        Vector2 currPos   = Vector2.zero;
        Vector2 direction = Vector2.zero;
        Vector2 tangent   = Vector2.zero;

        switch (Random.Range(0, 4))
        {
        case 0:
            currPos   = new Vector2(Mathf.Cos(Random.Range(0, Mathf.PI / 2)) * (Size.x - 1), 0);
            direction = new Vector2(0, 1);
            tangent   = new Vector2(1, 0);
            break;

        case 1:
            currPos   = new Vector2(Mathf.Cos(Random.Range(0, Mathf.PI / 2)) * (Size.x - 1), Size.y - 1);
            direction = new Vector2(0, -1);
            tangent   = new Vector2(1, 0);
            break;

        case 2:
            currPos   = new Vector2(0, Mathf.Cos(Random.Range(0, Mathf.PI / 2)) * (Size.y - 1));
            direction = new Vector2(1, 0);
            tangent   = new Vector2(0, 1);
            break;

        case 3:
            currPos   = new Vector2(Size.x, Mathf.Cos(Random.Range(0, Mathf.PI / 2)) * (Size.y - 1));
            direction = new Vector2(1, 0);
            tangent   = new Vector2(0, 1);
            break;
        }

        do
        {
            Collider[] HitColliders = Physics.OverlapSphere(new Vector3(currPos.x, 0, currPos.y), RiverStepDistance, 1 << 8);
            foreach (Collider HitCollider in HitColliders)
            {
                InteractTile TileComponent = HitCollider.GetComponent <InteractTile>();
                if (TileComponent)
                {
                    if (TileComponent.SetType(TileType.Water))
                    {
                        if (Random.Range(0, 2) == 0)
                        {
                            TreesToPlace--;
                        }
                        else
                        {
                            GrassToPlace--;
                        }
                    }
                }
            }

            currPos   += direction * RiverStepDistance;
            direction += tangent * Random.Range(-1.0f, 1.0f) * RiverTurnStrength;
            direction.Normalize();
        }while(currPos.x > 0 && currPos.y > 0 && currPos.x < Size.x && currPos.y < Size.y);

        //Border water tiles
        for (int x = (int)(-Size.x * 0.5f) - 1; x < Size.x * 1.5 + 3; x++)
        {
            float test = (x < Size.x / 2?(int)(Size.y) + x:(Size.y - x + Size.x / 2));
            for (int y = (int)(x < Size.x / 2 ? -x : -Size.y + x) - 1; y < (x < Size.x / 2?(int)(Size.y) + x:(Size.y - x + Size.x)) + 3; y++)
            {
                if (x >= -2 && y >= -2 && x < Size.x + 2 && y < Size.y + 2)
                {
                    if (x >= 0 && y >= 0 && x < Size.x && y < Size.y)
                    {
                        continue;
                    }
                    Instantiate(TilePrefab, new Vector3(x, 0, y), Quaternion.Euler(0, Random.Range(0, 3) * 90, 0), WorldParent).GetComponent <InteractTile>().SetType(TileType.Water);
                    continue;
                }
                Instantiate(WaterTilePrefab, new Vector3(x, -0.9f, y), Quaternion.Euler(0, Random.Range(0, 3) * 90, 0), WorldParent);
            }
        }
        //Spreads random trees from 4 random locations
        for (int i = 0; i < 4;)
        {
            InteractTile tile = GetRandomTile();
            if (tile.type == TileType.Dirt)
            {
                tile.SetType(TileType.Tree);
                TreesPlaced.Add(tile);
                i++;
            }
        }
        for (int i = 0; i < TreesToPlace * 100 && TreesPlaced.Count < TreesToPlace - 4; i++)
        {
            InteractTile tile = GetTile(TreesPlaced[Random.Range(0, TreesPlaced.Count)].GetDirection(Random.Range(0, 4)));
            if (tile && tile.type == TileType.Dirt)
            {
                tile.SetType(TileType.Tree);
                TreesPlaced.Add(tile);
            }
        }

        TreesAmount = TreesPlaced.Count;

        //Spreads random grass
        List <InteractTile> grassPlaced = new List <InteractTile>();

        for (int i = 0; i < 4;)
        {
            InteractTile tile = GetRandomTile();
            if (tile.type == TileType.Dirt)
            {
                tile.SetType(TileType.Grass);
                grassPlaced.Add(tile);
                i++;
            }
        }
        for (int i = 0; i < GrassToPlace * 100 && grassPlaced.Count < GrassToPlace; i++)
        {
            InteractTile tile = GetTile(grassPlaced[Random.Range(0, grassPlaced.Count)].GetDirection(Random.Range(0, 4)));
            if (tile && tile.type == TileType.Dirt)
            {
                tile.SetType(TileType.Grass);
                grassPlaced.Add(tile);
            }
        }

        //Places random houses
        int HousesToPlace = Random.Range(0, 10);
        int HousesPlaced  = 0;

        while (HousesPlaced < HousesToPlace)
        {
            InteractTile tile = GetRandomTile();
            if (tile && tile.type == TileType.Dirt)
            {
                tile.Child = Instantiate(HouseModel, tile.transform.position + new Vector3(0, 0.5f, 0), Quaternion.Euler(0, Random.Range(0, 4) * 90, 0));
                tile.type  = TileType.House;
                HousesPlaced++;
            }
        }
    }