public void AddNewPlayer(string id, string nickname, int x, int y) { Log.Print("Spawn player " + id); string type = "Mystic"; switch (new Random().Next(3)) { case 0: type = "Reaper"; break; case 1: type = "Sniper"; break; } // Если нет аккаунта в базе, то создаем, иначе грузим AccountState accState; int ind = AccountsAll.FindIndex(acc => acc.nickname == nickname); if (ind == -1) { Log.Print("Creating new account: " + nickname, LogType.Info); accState = new AccountState(id, nickname, ServerScene.LocationsDict); AccountsAll.Add(accState); } else { //TODO: Переделать... AccountsAll[ind].SetLocationsDict(ServerScene.LocationsDict); AccountsAll[ind].HeroId = id; accState = AccountsAll[ind]; } var player = new Player(id, type, accState) { PositionX = x, PositionY = y }; ServerScene.GetGameLayer(accState.Location).AddEntity(player); ServerScene.Accounts.Add(accState); accState.RecalcStats(); }
// TODO: сделать в конструкторе /** AccState - если создается игрок, ему передается для связывания... (что плохо :( )*/ public void AddEntity(EntityState es, AccountState accState = null) { Entity entity = null; /* Получаем название объекта по изображению */ string textureName = es.TextureName; textureName = textureName.Replace("\\", "/").Split('/').Last(); /** TODO: можно ли вынести куда-нибудь? можно ли обойтись без этого? скорее всего в Resources, через словарь */ switch (textureName) { case Resources.ClassMystic: case Resources.ClassReaper: case Resources.ClassSniper: entity = new Player(es.Id, textureName, accState); break; case Resources.ItemGold: entity = new GoldStack(es.Id); break; case Resources.ItemGate: entity = new Gate(es.Id); break; case Resources.ItemHealpot: entity = new HealPot(es.Id); break; case Resources.ObjectSmith: entity = new Smith(es.Id); break; case Resources.ProjectileMystic: entity = new MysticProjectile(es.AttackDamage, es.Id); break; case Resources.ProjectileLaser: case Resources.ProjectileCardinalPulse: case Resources.ProjectileCardinalRocket: entity = new EnemyRangeProjectile(es.AttackDamage, textureName, es.Id); break; case Resources.ParticleMeleeSweepAttack: entity = new EnemyMeleeProjectile(es.AttackDamage, textureName, es.Id); break; case Resources.ParticleMeleeSweepStart: entity = new EnemyMeleeProjectileStart(es.AttackDamage, textureName, es.Id); break; case Resources.EnemyMeleeRobot: case Resources.EnemyMagicMelee: case Resources.EnemyPirate: entity = new MeleeEnemy(textureName, es.Id); break; case Resources.EnemyStinger: case Resources.EnemyMagicRange: entity = new RangeEnemy(textureName, es.Id); break; case Resources.BossEmperor: entity = new Emperor(es.Id); break; case Resources.BossCardinal: entity = new Cardinal(es.Id); break; case Resources.BossInteritus: entity = new Interitus(es.Id); break; case Resources.BossMossorus: entity = new Mossorus(es.Id); break; } if (entity != null) { EntityState.AppendStateToEntity(entity, es); AddEntity(entity); } else { Log.Print("Error! Entity isn't created, New entity will not be added. " + textureName, LogType.Error); } }