Esempio n. 1
0
 public virtual void LeaveWorld(Entity entity)
 {
     if (entity is Player)
     {
         Player dummy;
         if (!Players.TryRemove(entity.Id, out dummy))
         {
             Log.WarnFormat("Could not remove {0} from world {1}", entity.Name, Name);
         }
         PlayersCollision?.Remove(entity);
     }
     else if (entity is Enemy)
     {
         Enemy dummy;
         Enemies.TryRemove(entity.Id, out dummy);
         EnemiesCollision?.Remove(entity);
         if (entity.ObjectDesc.Quest)
         {
             Quests.TryRemove(entity.Id, out dummy);
         }
     }
     else
     {
         var projectile = entity as Projectile;
         if (projectile != null)
         {
             var p = projectile;
             Projectiles.TryRemove(new Tuple <int, byte>(p.ProjectileOwner.Self.Id, p.ProjectileId), out p);
         }
         else if (entity is GameObject)
         {
             GameObject dummy;
             StaticObjects.TryRemove(entity.Id, out dummy);
             if (entity is Decoy)
             {
                 PlayersCollision?.Remove(entity);
             }
             else
             {
                 EnemiesCollision?.Remove(entity);
             }
         }
     }
     entity.Owner = null;
     entity?.Dispose();
 }
Esempio n. 2
0
 public virtual void LeaveWorld(Entity entity)
 {
     if (entity is Player)
     {
         Player dummy;
         Players.TryRemove(entity.Id, out dummy);
         PlayersCollision.Remove(entity);
     }
     else if (entity is Enemy)
     {
         Enemy dummy;
         Enemies.TryRemove(entity.Id, out dummy);
         EnemiesCollision.Remove(entity);
         if (entity.ObjectDesc.Quest)
         {
             Quests.TryRemove(entity.Id, out dummy);
         }
         if (entity.isPet)
         {
             Entity dummy2;
             Pets.TryRemove(entity.Id, out dummy2);
         }
     }
     else if (entity is Projectile)
     {
         var p = entity as Projectile;
         Projectiles.TryRemove(new Tuple <int, byte>(p.ProjectileOwner.Self.Id, p.ProjectileId), out p);
     }
     else if (entity is StaticObject)
     {
         StaticObject dummy;
         StaticObjects.TryRemove(entity.Id, out dummy);
         if (entity is Decoy)
         {
             PlayersCollision.Remove(entity);
         }
         else
         {
             EnemiesCollision.Remove(entity);
         }
     }
     entity.Owner = null;
     entity.Dispose();
 }
Esempio n. 3
0
        private void TryRemove(Enemy enemy)
        {
            if (enemy.ObjectDesc.Quest)
            {
                if (!Quests.TryRemove(enemy.Id, out Enemy dummy) || !Enemies.TryRemove(enemy.Id, out dummy) || !Entities.TryRemove(enemy.Id, out Entity entity))
                {
                    return;
                }
            }
            else
            {
                if (!Enemies.TryRemove(enemy.Id, out Enemy dummy) || !Entities.TryRemove(enemy.Id, out Entity entity))
                {
                    return;
                }
            }

            EnemiesCollision.Remove(enemy);
        }
Esempio n. 4
0
        public virtual int EnterWorld(Entity entity)
        {
            if (entity is Player player)
            {
                TryAdd(player);
            }
            else
            {
                if (entity is Enemy enemy)
                {
                    TryAdd(enemy);
                }
                else
                {
                    if (entity is Projectile projectile)
                    {
                        TryAdd(projectile);
                    }
                    else
                    {
                        if (entity is GameObject gameObject)
                        {
                            TryAdd(gameObject);

                            if (entity is Decoy)
                            {
                                PlayersCollision.Insert(entity);
                            }
                            else
                            {
                                EnemiesCollision.Insert(entity);
                            }
                        }
                        else
                        {
                            return(entity.Id);
                        }
                    }
                }
            }

            return(entity.Id);
        }
Esempio n. 5
0
 public virtual int EnterWorld(Entity entity)
 {
     if (entity is Player)
     {
         entity.Id = GetNextEntityId();
         entity.Init(this);
         Players.TryAdd(entity.Id, entity as Player);
         PlayersCollision.Insert(entity);
         Interlocked.Increment(ref _totalConnects);
     }
     else if (entity is Enemy)
     {
         entity.Id = GetNextEntityId();
         entity.Init(this);
         Enemies.TryAdd(entity.Id, entity as Enemy);
         EnemiesCollision.Insert(entity);
         if (entity.ObjectDesc.Quest)
         {
             Quests.TryAdd(entity.Id, entity as Enemy);
         }
     }
     else if (entity is Projectile)
     {
         entity.Init(this);
         var prj = entity as Projectile;
         Projectiles[new Tuple <int, byte>(prj.ProjectileOwner.Self.Id, prj.ProjectileId)] = prj;
     }
     else if (entity is StaticObject)
     {
         entity.Id = GetNextEntityId();
         entity.Init(this);
         StaticObjects.TryAdd(entity.Id, entity as StaticObject);
         if (entity is Decoy)
         {
             PlayersCollision.Insert(entity);
         }
         else
         {
             EnemiesCollision.Insert(entity);
         }
     }
     return(entity.Id);
 }
Esempio n. 6
0
        public virtual void LeaveWorld(Entity entity)
        {
            if (entity is Player)
            {
                TryRemove(entity as Player);
            }
            else
            {
                if (entity is Enemy)
                {
                    TryRemove(entity as Enemy);
                }
                else
                {
                    if (entity is Projectile)
                    {
                        TryRemove(entity as Projectile);
                    }
                    else
                    {
                        if (entity is GameObject)
                        {
                            TryRemove(entity as GameObject);

                            if (entity is Decoy)
                            {
                                PlayersCollision.Remove(entity);
                            }
                            else
                            {
                                EnemiesCollision.Remove(entity);
                            }
                        }
                    }
                }
            }

            entity.Dispose();

            entity = null;
        }
Esempio n. 7
0
        public void TickLogic(RealmTime time)
        {
            using (TimedLock.Lock(_deleteLock))
            {
                if (Deleted)
                {
                    return;
                }

                if (EnemiesCollision != null)
                {
                    foreach (var i in EnemiesCollision.GetActiveChunks(PlayersCollision))
                    {
                        i.Tick(time);
                    }
                    foreach (var i in StaticObjects.Where(x => x.Value is Decoy))
                    {
                        i.Value.Tick(time);
                    }
                }
                else
                {
                    foreach (var i in Enemies)
                    {
                        i.Value.Tick(time);
                    }
                    foreach (var i in StaticObjects)
                    {
                        i.Value.Tick(time);
                    }
                }

                foreach (var i in Pets)
                {
                    i.Value.Tick(time);
                }
            }
        }
Esempio n. 8
0
        private void TryAdd(Enemy enemy)
        {
            enemy.Id = GetNextEntityId();

            if (enemy.ObjectDesc.Quest)
            {
                if (!Quests.TryAdd(enemy.Id, enemy) || !Enemies.TryAdd(enemy.Id, enemy) || !Entities.TryAdd(enemy.Id, enemy))
                {
                    return;
                }
            }
            else
            {
                if (!Enemies.TryAdd(enemy.Id, enemy) || !Entities.TryAdd(enemy.Id, enemy))
                {
                    return;
                }
            }

            enemy.Init(this);

            EnemiesCollision.Insert(enemy);
        }
Esempio n. 9
0
        public virtual void Tick(RealmTime time)
        {
            try
            {
                if (IsLimbo)
                {
                    return;
                }

                for (var i = 0; i < Timers.Count; i++)
                {
                    try
                    {
                        if (Timers[i] == null)
                        {
                            continue;
                        }
                        if (!Timers[i].Tick(this, time))
                        {
                            continue;
                        }
                        Timers.RemoveAt(i);
                        i--;
                    }
                    catch
                    {
                        // ignored
                    }
                }

                foreach (var i in Players)
                {
                    i.Value.Tick(time);
                }

                foreach (var i in Pets)
                {
                    i.Value.Tick(time);
                }

                if (EnemiesCollision != null)
                {
                    foreach (var i in EnemiesCollision.GetActiveChunks(PlayersCollision))
                    {
                        i.Tick(time);
                    }
                    foreach (var i in StaticObjects.Where(x => x.Value is Decoy))
                    {
                        i.Value.Tick(time);
                    }
                }
                else
                {
                    foreach (var i in Enemies)
                    {
                        i.Value.Tick(time);
                    }
                    foreach (var i in StaticObjects)
                    {
                        i.Value.Tick(time);
                    }
                }
                foreach (var i in Projectiles)
                {
                    i.Value.Tick(time);
                }

                if (Players.Count != 0 || !canBeClosed || !IsDungeon())
                {
                    return;
                }
                var vault = this as Vault;
                if (vault != null)
                {
                    Manager.RemoveVault(vault.AccountId);
                }
                Manager.RemoveWorld(this);
            }
            catch (Exception e)
            {
                Log.Error("World: " + Name + "\n" + e);
            }
        }
Esempio n. 10
0
        //public void FromJsonMap(string file)
        //{
        //    if (File.Exists(file))
        //    {
        //        var wmap = Json2Wmap.Convert(File.ReadAllText(file));

        //        FromWorldMap(new MemoryStream(wmap));
        //    }
        //    else
        //    {
        //        throw new FileNotFoundException("Json file not found!", file);
        //    }
        //}

        //public void FromJsonStream(Stream dat)
        //{
        //    byte[] data = { };
        //    dat.Read(data, 0, (int)dat.Length);
        //    var json = Encoding.ASCII.GetString(data);
        //    var wmap = Json2Wmap.Convert(json);
        //    FromWorldMap(new MemoryStream(wmap));
        //} //not working

        public virtual int EnterWorld(Entity entity)
        {
            var player = entity as Player;

            if (player != null)
            {
                try
                {
                    player.Id = GetNextEntityId();
                    entity.Init(this);
                    Players.TryAdd(player.Id, player);
                    PlayersCollision.Insert(player);
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
            }
            else
            {
                var enemy = entity as Enemy;
                if (enemy != null)
                {
                    enemy.Id = GetNextEntityId();
                    entity.Init(this);
                    Enemies.TryAdd(enemy.Id, enemy);
                    EnemiesCollision.Insert(enemy);
                    if (enemy.ObjectDesc.Quest)
                    {
                        Quests.TryAdd(enemy.Id, enemy);
                    }
                }
                else
                {
                    var projectile = entity as Projectile;
                    if (projectile != null)
                    {
                        projectile.Init(this);
                        var prj = projectile;
                        Projectiles[new Tuple <int, byte>(prj.ProjectileOwner.Self.Id, prj.ProjectileId)] = prj;
                    }
                    else
                    {
                        var staticObject = entity as StaticObject;
                        if (staticObject != null)
                        {
                            staticObject.Id = GetNextEntityId();
                            staticObject.Init(this);
                            StaticObjects.TryAdd(staticObject.Id, staticObject);
                            if (entity is Decoy)
                            {
                                PlayersCollision.Insert(staticObject);
                            }
                            else
                            {
                                EnemiesCollision.Insert(staticObject);
                            }
                        }
                        else
                        {
                            var pet = entity as Pet;
                            if (pet == null)
                            {
                                return(entity.Id);
                            }
                            if (pet.IsPet)
                            {
                                pet.Id = GetNextEntityId();
                                pet.Init(this);
                                if (!Pets.TryAdd(pet.Id, pet))
                                {
                                    Log.Error("Failed to add pet!");
                                }

                                PlayersCollision.Insert(pet);
                            }
                            else
                            {
                                Log.WarnFormat("This is not a real pet! {0}", pet.Name);
                            }
                        }
                    }
                }
            }
            return(entity.Id);
        }
Esempio n. 11
0
        public virtual void Tick(RealmTime time)
        {
            if (IsLimbo)
            {
                return;
            }

            for (int i = 0; i < Timers.Count; i++)
            {
                if (Timers[i] == null)
                {
                    Console.Write("Timer is null\n");
                    Timers.RemoveAt(i);
                    continue;
                }

                if (Timers[i].Tick(this, time))
                {
                    Timers.RemoveAt(i);
                    i--;
                }
            }

            foreach (var i in Players)
            {
                if (i.Value == null)
                {
                    Console.Write("Player is null\n");
                }
                i.Value.Tick(time);
            }

            if (EnemiesCollision != null)
            {
                foreach (Entity i in EnemiesCollision.GetActiveChunks(PlayersCollision))
                {
                    if (i == null)
                    {
                        Console.Write("Entity is null\n");
                    }
                    i.Tick(time);
                }

                foreach (var i in StaticObjects.Where(x => x.Value is Decoy))
                {
                    if (i.Value == null)
                    {
                        Console.Write("StaticObject:Decoy is null\n");
                    }
                    i.Value.Tick(time);
                }
            }
            else
            {
                foreach (var i in Enemies)
                {
                    if (i.Value == null)
                    {
                        Console.Write("Enemy is null\n");
                    }
                    i.Value.Tick(time);
                }
            }
            foreach (var i in Projectiles)
            {
                if (i.Value == null)
                {
                    Console.Write("Projectile is null\n");
                }
                i.Value.Tick(time);
            }

            //if (Players.Count == 0 && canBeClosed && IsDungeon())
            //     Manager.RemoveWorld(this);
        }
Esempio n. 12
0
        public virtual void LeaveWorld(Entity entity)
        {
            if (entity is Player)
            {
                Player dummy;
                if (!Players.TryRemove(entity.Id, out dummy))
                {
                    Log.WarnFormat("Could not remove {0} from world {1}", entity.Name, Name);
                }
                PlayersCollision.Remove(entity);
            }
            else if (entity is Enemy)
            {
                Enemy dummy;
                Enemies.TryRemove(entity.Id, out dummy);
                EnemiesCollision.Remove(entity);
                if (entity.ObjectDesc.Quest)
                {
                    Quests.TryRemove(entity.Id, out dummy);
                }
                foreach (var i in (entity as Enemy).DamageCounter.GetPlayerData())
                {
                    if (i.Item1 != null)
                    {
                        var player = i.Item1;
                        var enemy  = (entity as Enemy);
                        switch (enemy.Name)
                        {
                        case "Archdemon Malphas":
                            player.playerQuestManager.ProcessQuestAction(1);
                            break;

                        case "Septavius the Ghost God":
                            player.playerQuestManager.ProcessQuestAction(2);
                            break;

                        case "Oryx the Mad God 2":
                            player.playerQuestManager.ProcessQuestAction(3);     // quest id
                            break;
                        }
                    }
                }
            }
            else
            {
                var projectile = entity as Projectile;
                if (projectile != null)
                {
                    var p = projectile;
                    Projectiles.TryRemove(new Tuple <int, byte>(p.ProjectileOwner.Self.Id, p.ProjectileId), out p);
                }
                else if (entity is StaticObject)
                {
                    StaticObject dummy;
                    StaticObjects.TryRemove(entity.Id, out dummy);
                    if (entity is Decoy)
                    {
                        PlayersCollision.Remove(entity);
                    }
                    else
                    {
                        EnemiesCollision.Remove(entity);
                    }
                }
                else if (entity is Pet)
                {
                    if (entity.IsPet)
                    {
                        Pet dummy2;
                        Pets.TryRemove(entity.Id, out dummy2);
                        PlayersCollision.Remove(entity);
                    }
                }
            }
            entity.Owner = null;
            entity.Dispose();
        }
Esempio n. 13
0
        public virtual void LeaveWorld(Entity entity)
        {
            if (entity is Player)
            {
                Player dummy;
                Players.TryRemove(entity.Id, out dummy);
                PlayersCollision.Remove(entity);

                // if in trade, cancel it...
                if (dummy.tradeTarget != null)
                {
                    dummy.CancelTrade();
                }

                if (dummy.Pet != null)
                {
                    LeaveWorld(dummy.Pet);
                }
            }
            else if (entity is Enemy)
            {
                Enemy dummy;
                Enemies.TryRemove(entity.Id, out dummy);
                EnemiesCollision.Remove(entity);
                if (entity.ObjectDesc.Quest)
                {
                    Quests.TryRemove(entity.Id, out dummy);
                }
            }
            else if (entity is Projectile)
            {
                var p = entity as Projectile;
                Projectiles.TryRemove(new Tuple <int, byte>(p.ProjectileOwner.Self.Id, p.ProjectileId), out p);
            }
            else if (entity is StaticObject)
            {
                StaticObject dummy;
                StaticObjects.TryRemove(entity.Id, out dummy);

                if (entity.ObjectDesc?.BlocksSight == true)
                {
                    if (Blocking == 3)
                    {
                        Sight.UpdateRegion(Map, (int)entity.X, (int)entity.Y);
                    }

                    foreach (var plr in Players.Values
                             .Where(p => MathsUtils.DistSqr(p.X, p.Y, entity.X, entity.Y) < Player.RadiusSqr))
                    {
                        plr.Sight.UpdateCount++;
                    }
                }

                if (entity is Decoy)
                {
                    PlayersCollision.Remove(entity);
                }
                else
                {
                    EnemiesCollision.Remove(entity);
                }
            }
            else if (entity is Pet)
            {
                Pet dummy;
                Pets.TryRemove(entity.Id, out dummy);
                PlayersCollision.Remove(entity);
            }

            entity.Dispose();
        }
Esempio n. 14
0
 public virtual void LeaveWorld(Entity entity)
 {
     if (!(entity is Pet || entity is Portal))
     {
         if (entity is Wall && entity.ObjectDesc != null && entity.ObjectDesc.FullOccupy || entity.ObjectDesc.OccupySquare || entity.ObjectDesc.EnemyOccupySquare)
         {
             WmapTile tile = Map[(int)entity.X, (int)entity.Y].Clone();
             tile.TileId     = Map[(int)entity.X, (int)entity.Y].TileId;
             tile.ObjType    = 0;
             tile.ObjectDesc = null;
             Map[(int)entity.X, (int)entity.Y] = tile;
         }
     }
     if (entity is Player)
     {
         Player dummy;
         if (!Players.TryRemove(entity.Id, out dummy))
         {
             Console.WriteLine("Could not remove {0} from world {1}", entity.Name, Name);
         }
         PlayersCollision.Remove(entity);
     }
     else if (entity is Enemy)
     {
         Enemy dummy;
         Enemies.TryRemove(entity.Id, out dummy);
         EnemiesCollision.Remove(entity);
         if (entity.ObjectDesc.Quest)
         {
             Quests.TryRemove(entity.Id, out dummy);
         }
     }
     else
     {
         var projectile = entity as Projectile;
         if (projectile != null)
         {
             var p = projectile;
             Projectiles.TryRemove(new Tuple <int, byte>(p.ProjectileOwner.Self.Id, p.ProjectileId), out p);
         }
         else if (entity is StaticObject)
         {
             StaticObject dummy;
             StaticObjects.TryRemove(entity.Id, out dummy);
             if (entity is Decoy)
             {
                 PlayersCollision.Remove(entity);
             }
             else
             {
                 EnemiesCollision.Remove(entity);
             }
         }
         else if (entity is Pet)
         {
             if (entity.IsPet)
             {
                 Pet dummy2;
                 Pets.TryRemove(entity.Id, out dummy2);
                 PlayersCollision.Remove(entity);
             }
         }
     }
     entity.Owner = null;
     entity.Dispose();
 }
Esempio n. 15
0
        public virtual void Tick(RealmTime time)
        {
            if (IsLimbo)
            {
                return;
            }

            if (disposable)
            {
                if (Players.Count <= 0 && !isDisposing)
                {
                    isDisposing = true;
                    if (RemovalMS < 25000)
                    {
                        //    log.WarnFormat("World \"{0}\" does not have a valid RemovalMS: {1}! Please allow at least 25 seconds. Default: 25000 ms", Name, RemovalMS);
                        RemovalMS = 25000;
                    }
                    //  log.InfoFormat("World {0}, ID:{1} is unused and will dispose in {2}MS.", Name, Id, RemovalMS);
                    WorldTimer timer = new WorldTimer(RemovalMS, (w, t) =>
                    {
                        manager.RemoveWorld(w);
                    });
                    Timers.Add(timer);
                }
                else if (isDisposing && Players.Count >= 1)
                {
                    isDisposing = false;
                    //      log.InfoFormat("World {0}, ID:{1} is in use and has cancelled disposal.", Name, Id);
                }
            }

            if (Timers != null && Timers.Count > 0)
            {
                for (int i = 0; i < Timers.Count; i++)
                {
                    if (Timers[i].Tick(this, time) && Timers.Count > 0)
                    {
                        Timers.RemoveAt(i);
                        i--;
                    }
                }
            }

            try //entity ticking now, possible huge range of issues that i can't yet remove the try catch - jade
            {
                foreach (var i in Players)
                {
                    i.Value.Tick(time);
                }

                if (isDisposing)
                {
                    return;
                }

                if (EnemiesCollision != null)
                {
                    foreach (Entity i in EnemiesCollision.GetActiveChunks(PlayersCollision))
                    {
                        i.Tick(time);
                    }
                    foreach (var i in StaticObjects.Where(x => x.Value is Decoy))
                    {
                        i.Value.Tick(time);
                    }
                }
                else
                {
                    foreach (var i in Enemies)
                    {
                        i.Value.Tick(time);
                    }
                    foreach (var i in StaticObjects)
                    {
                        i.Value.Tick(time);
                    }
                }
                foreach (var i in Projectiles)
                {
                    i.Value.Tick(time);
                }
            }
            catch (Exception e)
            {
                log.Error(e);
            }
        }
Esempio n. 16
0
        public virtual int EnterWorld(Entity entity)
        {
            if (entity is Player)
            {
                entity.Id = GetNextEntityId();
                entity.Init(this);
                Players.TryAdd(entity.Id, entity as Player);
                PlayersCollision.Insert(entity);
                SpawnEntity(entity);
                if (entity.Owner.PvP)
                {
                    (entity as Player).PvP = true;
                    (entity as Player).SendHelp("You have entered a PvP world!");
                }
                else
                {
                    (entity as Player).PvP = false;
                }
                if (entity.Owner.Petless)
                {
                    (entity as Player).SendInfo("This dungeon does not allow Pet. Enjoy!");
                }
            }
            else if (entity is Enemy)
            {
                entity.Id = GetNextEntityId();
                entity.Init(this);
                Enemies.TryAdd(entity.Id, entity as Enemy);
                EnemiesCollision.Insert(entity);
                if (entity.ObjectDesc.Quest)
                {
                    Quests.TryAdd(entity.Id, entity as Enemy);
                }

                if (entity.isPet && !Petless)
                {
                    Pets.TryAdd(entity.Id, entity);
                    SpawnEntity(entity);
                }
            }
            else if (entity is Projectile)
            {
                entity.Init(this);
                var prj = entity as Projectile;
                Projectiles[new Tuple <int, byte>(prj.ProjectileOwner.Self.Id, prj.ProjectileId)] = prj;
            }
            else if (entity is StaticObject)
            {
                entity.Id = GetNextEntityId();
                entity.Init(this);
                StaticObjects.TryAdd(entity.Id, entity as StaticObject);
                if (entity is Decoy)
                {
                    PlayersCollision.Insert(entity);
                }
                else
                {
                    EnemiesCollision.Insert(entity);
                }
            }
            return(entity.Id);
        }