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