bool TickCore(long elapsedTicks, RealmTime time) { Position pos = GetPosition(elapsedTicks); Move(pos.X, pos.Y); if (pos.X < 0 || pos.X > Owner.Map.Width) { Destroy(true); return(false); } else if (pos.Y < 0 || pos.Y > Owner.Map.Height) { Destroy(true); return(false); } else if (Owner.Map[(int)pos.X, (int)pos.Y].TileId == 0xff) { Destroy(true); return(false); } else { bool penetrateObsta = Descriptor.PassesCover; bool penetrateEnemy = Descriptor.MultiHit; var objId = Owner.Map[(int)pos.X, (int)pos.Y].ObjType; if (objId != 0 && XmlDatas.ObjectDescs[objId].OccupySquare && !penetrateObsta) { Destroy(true); return(false); } double nearestRadius = double.MaxValue; Entity entity = null; foreach (var i in collisionMap.HitTest(pos.X, pos.Y, 2)) { if (i == ProjectileOwner.Self) { continue; } if (i is Container) { continue; } if (hitted.Contains(i)) { continue; } double xSide = (i.X - pos.X) * (i.X - pos.X); double ySide = (i.Y - pos.Y) * (i.Y - pos.Y); if (xSide <= 0.5 * 0.5 && ySide <= 0.5 * 0.5 && xSide + ySide <= nearestRadius) { nearestRadius = xSide + ySide; entity = i; } } if (entity != null && entity.HitByProjectile(this, time)) { if ((entity is Enemy && penetrateEnemy) || (entity is StaticObject && (entity as StaticObject).Static && !(entity is Wall) && penetrateObsta)) { hitted.Add(entity); } else { Destroy(true); return(false); } ProjectileOwner.Self.ProjectileHit(this, entity); } } return(true); }