Esempio n. 1
0
    void Update()
    {
        speed += info.accel * Time.deltaTime;
        float distance = speed * Time.deltaTime;
        var   posDiff  = dir * distance;
        var   newPos   = iso.pos + posDiff;
        var   hit      = CollisionMap.Raycast(iso.pos, newPos, distance, size: info.size, ignore: originator.gameObject);

        if (hit)
        {
            Character hitCharacter = null;
            if (hit.gameObject != null)
            {
                hitCharacter = hit.gameObject.GetComponent <Character>();
                if (hitCharacter != null)
                {
                    int damage = CalcDamage();
                    hitCharacter.TakeDamage(damage, originator);
                    if (info.progOverlay != null)
                    {
                        Overlay.Create(hitCharacter.gameObject, info.progOverlay);
                    }
                }
            }
            if (info.explosionMissile != null)
            {
                Missile.Create(info.explosionMissile, hit.pos, hit.pos, originator);
            }

            AudioManager.instance.Play(info.hitSound, Iso.MapToWorld(hit.pos));
            AudioManager.instance.Play(SoundInfo.GetHitSound(info.hitClass, hitCharacter), Iso.MapToWorld(hit.pos));

            if (info.clientHitFunc == "14")
            {
                // glacial spike, freezing arrow
                Missile.Create(info.clientHitSubMissileId[0], hit.pos, hit.pos, originator);
                int subMissileCount = Random.Range(3, 5);
                for (int i = 0; i < subMissileCount; ++i)
                {
                    var offset = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));
                    Missile.Create(info.clientHitSubMissileId[1], hit.pos, hit.pos - offset, originator);
                }
            }

            // todo pierce is actually is pierce skill with a chance to pierce
            if ((!info.pierce || hitCharacter == null) && info.collideKill)
            {
                Destroy(gameObject);
            }
        }

        iso.pos = newPos;
    }
Esempio n. 2
0
    static private void Collapse(Node node)
    {
        while (node.parent != null && node.parent.parent != null)
        {
            if (CollisionMap.Raycast(node.pos, node.parent.parent.pos, size: size, ignore: self))
            {
                break;
            }

            node.parent = node.parent.parent;
        }
    }
Esempio n. 3
0
        void Update()
        {
            _lifeTime += Time.deltaTime;
            if (_lifeTime > _info.lifeTime)
            {
                Events.InvokeMissileLifetimeEnd(this);
                Destroy(gameObject);
            }

            _speed += Mathf.Clamp(_info.accel * Time.deltaTime, 0, _info.maxVelocity);
            float distance = _speed * Time.deltaTime;
            var   posDiff  = _dir * distance;
            var   newPos   = _iso.pos + posDiff;
            var   hit      = CollisionMap.Raycast(_iso.pos, newPos, distance, size: _info.size, ignore: _originator.gameObject);

            if (hit)
            {
                Events.InvokeMissileHit(this, hit.pos, hit.gameObject);
            }

            Events.InvokeMissileMoved(this);

            _iso.pos = newPos;
        }
Esempio n. 4
0
        void Update()
        {
            lifeTime += Time.deltaTime;
            if (lifeTime > info.lifeTime)
            {
                if (info.serverHitFunc == "29")
                {
                    Missile.CreateRadially(info.clientHitSubMissileId[0], iso.pos, originator, 16);
                }
                Destroy(gameObject);
            }

            speed += Mathf.Clamp(info.accel * Time.deltaTime, 0, info.maxVelocity);
            float distance = speed * Time.deltaTime;
            var   posDiff  = dir * distance;
            var   newPos   = iso.pos + posDiff;
            var   hit      = CollisionMap.Raycast(iso.pos, newPos, distance, size: info.size, ignore: originator.gameObject);

            if (hit)
            {
                Character hitCharacter = null;
                if (hit.gameObject != null)
                {
                    hitCharacter = hit.gameObject.GetComponent <Character>();
                    if (hitCharacter != null)
                    {
                        int damage = CalcDamage();
                        hitCharacter.TakeDamage(damage, originator);
                        if (info.progOverlay != null)
                        {
                            Overlay.Create(hitCharacter.gameObject, info.progOverlay, false);
                        }
                    }
                }
                if (info.explosionMissile != null)
                {
                    Missile.Create(info.explosionMissile, hit.pos, hit.pos, originator);
                }

                AudioManager.instance.Play(info.hitSound, Iso.MapToWorld(hit.pos));
                AudioManager.instance.Play(SoundInfo.GetHitSound(info.hitClass, hitCharacter), Iso.MapToWorld(hit.pos));

                if (info.clientHitFunc == "14")
                {
                    // glacial spike, freezing arrow
                    Missile.Create(info.clientHitSubMissileId[0], hit.pos, hit.pos, originator);
                    int subMissileCount = Random.Range(3, 5);
                    for (int i = 0; i < subMissileCount; ++i)
                    {
                        var offset = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));
                        Missile.Create(info.clientHitSubMissileId[1], hit.pos, hit.pos - offset, originator);
                    }
                }
                else if (info.serverHitFunc == "29")
                {
                    // Frozen orb
                    Missile.CreateRadially(info.clientHitSubMissileId[0], iso.pos, originator, 16);
                }

                // todo pierce is actually is pierce skill with a chance to pierce
                if ((!info.pierce || hitCharacter == null) && info.collideKill)
                {
                    Destroy(gameObject);
                }
            }

            if (info.serverDoFunc == 15)
            {
                // Frozen orb
                int   frequency          = info.parameters[0].value * 25;
                float spawnPeriod        = 1.0f / frequency;
                float directionIncrement = info.parameters[1].value * 25 * Mathf.PI;
                int   missileToSpawn     = (int)((lifeTime + Time.deltaTime) / spawnPeriod) - (int)(lifeTime / spawnPeriod);
                for (int i = 0; i < missileToSpawn; ++i)
                {
                    var dir    = new Vector2(1, 0);
                    var rot    = Quaternion.AngleAxis(lifeTime * directionIncrement, new Vector3(0, 0, 1));
                    var offset = (Vector2)(rot * dir);
                    Missile.Create(info.clientSubMissileId[0], iso.pos, iso.pos + offset, originator);
                }
            }

            iso.pos = newPos;
        }