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(); }
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(); }
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); }
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); }
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); }
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; }
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); } } }
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); }
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); } }
//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); }
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); }
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(); }
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(); }
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(); }
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); } }
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); }