internal void UnloadMonsters(ushort Zone) { if (Zone == 0xffff) { foreach (var g in _fortressGates) { g.monster.Active = true; SetGateState(g.monster, true); } } else { MonsterIA.DelGroup(_baseGroup + Zone); } }
void Awake() { _animator = GetComponent <Animator>(); _controller = GetComponent <CharacterController2D>(); _ia = GetComponent <MonsterIA>(); _aSource = GetComponent <AudioSource>(); _player = GameObject.Find("Player").GetComponent <PlayerBehavior>(); _nextHit = Time.realtimeSinceStartup; // listen to some events for illustration purposes _controller.onControllerCollidedEvent += onControllerCollider; _controller.onTriggerEnterEvent += onTriggerEnterEvent; _controller.onTriggerExitEvent += onTriggerExitEvent; _controller.onTriggerStayEvent += onTriggerStayEvent; }
public override void OnTransition(KanturuBattleOfNightmareState NextState) { _manager.SendAll(new SKanturuStateChange { State = _manager._state, btDetailState = (byte)NextState }); switch (NextState) { case KanturuBattleOfNightmareState.None: break; case KanturuBattleOfNightmareState.Idle: _manager.WarpAllTo(134); Trigger(KanturuBattleOfNightmareState.Notify, TimeSpan.FromSeconds(5)); break; case KanturuBattleOfNightmareState.Notify: Trigger(KanturuBattleOfNightmareState.Start, TimeSpan.FromSeconds(10)); _manager.SendAll(new SNotice(NoticeType.Gold, ServerMessages.GetMessage(Messages.Kanturu_NightmareNotify))); break; case KanturuBattleOfNightmareState.Start: { _manager.LoadScene(2); MonsterIA.InitGroup(23, DieMonster); var mob = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 361); _nightmare = new PatternManager(mob, Program.XMLConfiguration.Files.NightmarePatterns); _nightmare.UseSkill += _nightmare_UseSkill; _manager.FailState = true; Trigger(KanturuBattleOfNightmareState.End, TimeSpan.FromSeconds(1200)); _manager.SendAll(new SKanturuBattleTime { BattleTime = (int)TimeLeft.TotalSeconds }); } break; case KanturuBattleOfNightmareState.End: _nightmare = null; MonsterIA.DelGroup(23); _logger.Information("Battle result:{0}", _manager.FailState?"Fail":"Win"); _manager.SendAll(new SKanturuBattleResult { Result = (byte)(_manager.FailState ? 0 : 1) }); Trigger(KanturuBattleOfNightmareState.EndCycle, TimeSpan.FromSeconds(5)); break; case KanturuBattleOfNightmareState.EndCycle: if (_manager.FailState) { _manager.Clear(); } else { _manager._towerOfRefinement.Initialize(); _manager.Trigger(EventState.Closed); } Trigger(KanturuBattleOfNightmareState.None); break; } }
public override void OnTransition(KanturuBattleOfMayaState NextState) { _manager.SendAll(new SKanturuStateChange { State = _manager._state, btDetailState = (byte)NextState }); if (NextState == KanturuBattleOfMayaState.EndCycle1 || NextState == KanturuBattleOfMayaState.EndCycle2 || NextState == KanturuBattleOfMayaState.EndCycle3) { var str = ServerMessages.GetMessage(Messages.Kanturu_NextBattle); Program.MapAnoucement(Maps.Kantru1, str).Wait(); Program.MapAnoucement(Maps.Kantru2, str).Wait(); Program.MapAnoucement(Maps.Kantru3, str).Wait(); } switch (NextState) { // Battle Stage 1 case KanturuBattleOfMayaState.StandBy1: Trigger(KanturuBattleOfMayaState.Notify1, TimeSpan.FromSeconds(120)); break; case KanturuBattleOfMayaState.Notify1: if (!_manager.CanRun()) { _manager.FailState = true; Trigger(KanturuBattleOfMayaState.End); return; } Trigger(KanturuBattleOfMayaState.Start1, TimeSpan.FromSeconds(15)); break; case KanturuBattleOfMayaState.Start1: _manager.LoadScene(0); Trigger(KanturuBattleOfMayaState.End1, TimeSpan.FromSeconds(900)); _manager.SendAll(new SKanturuBattleTime { BattleTime = (int)TimeLeft.TotalMilliseconds }); break; case KanturuBattleOfMayaState.Maya1: { _LeftHand = false; _RightHand = false; _manager.LoadScene(3); MonsterIA.InitGroup(20, DieMonster); var h1 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 363 || x.Info.Monster == 362); _hand1 = new PatternManager(h1, Program.XMLConfiguration.Files.MayaLeftHandPatterns); _hand1.UseSkill += _hand_UseSkill; } break; case KanturuBattleOfMayaState.End1: _hand1.UseSkill -= _hand_UseSkill; _hand1 = null; MonsterIA.DelGroup(20); if (_manager.MonsterCount() > 1 || !_LeftHand) { _manager.FailState = true; Trigger(KanturuBattleOfMayaState.End); return; } Trigger(KanturuBattleOfMayaState.EndCycle1, TimeSpan.FromSeconds(5)); break; case KanturuBattleOfMayaState.EndCycle1: { Trigger(KanturuBattleOfMayaState.StandBy2, TimeSpan.FromSeconds(3)); } break; // Battle Stage 2 case KanturuBattleOfMayaState.StandBy2: Trigger(KanturuBattleOfMayaState.Start2, TimeSpan.FromSeconds(60)); break; case KanturuBattleOfMayaState.Start2: _manager.LoadScene(0); Trigger(KanturuBattleOfMayaState.End2, TimeSpan.FromSeconds(900)); _manager.SendAll(new SKanturuBattleTime { BattleTime = (int)TimeLeft.TotalMilliseconds }); break; case KanturuBattleOfMayaState.Maya2: { _LeftHand = false; _RightHand = false; MonsterIA.InitGroup(21, DieMonster); _manager.LoadScene(4); var h1 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 363 || x.Info.Monster == 362); _hand2 = new PatternManager(h1, Program.XMLConfiguration.Files.MayaRightHandPatterns); _hand2.UseSkill += _hand_UseSkill; } break; case KanturuBattleOfMayaState.End2: _hand2.UseSkill -= _hand_UseSkill; _hand2 = null; MonsterIA.DelGroup(21); if (_manager.MonsterCount() > 1 || !_RightHand) { _manager.FailState = true; Trigger(KanturuBattleOfMayaState.End); return; } Trigger(KanturuBattleOfMayaState.EndCycle2, TimeSpan.FromSeconds(5)); break; case KanturuBattleOfMayaState.EndCycle2: Trigger(KanturuBattleOfMayaState.StandBy3, TimeSpan.FromSeconds(3)); break; // Battle Stage 3 case KanturuBattleOfMayaState.StandBy3: Trigger(KanturuBattleOfMayaState.Start3, TimeSpan.FromSeconds(60)); break; case KanturuBattleOfMayaState.Start3: _manager.LoadScene(1); Trigger(KanturuBattleOfMayaState.End3, TimeSpan.FromSeconds(900)); _manager.SendAll(new SKanturuBattleTime { BattleTime = (int)TimeLeft.TotalMilliseconds }); break; case KanturuBattleOfMayaState.Maya3: { _LeftHand = false; _RightHand = false; MonsterIA.InitGroup(22, DieMonster); _manager.LoadScene(5); var h1 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 362); var h2 = MonstersMng.Instance.Monsters.FirstOrDefault(x => x.Info.Monster == 363); _hand1 = new PatternManager(h1, Program.XMLConfiguration.Files.MayaLeftHandPatterns); _hand2 = new PatternManager(h2, Program.XMLConfiguration.Files.MayaRightHandPatterns); _hand1.UseSkill += _hand_UseSkill; _hand2.UseSkill += _hand_UseSkill; } break; case KanturuBattleOfMayaState.End3: _hand1.UseSkill -= _hand_UseSkill; _hand2.UseSkill -= _hand_UseSkill; _hand1 = null; _hand2 = null; MonsterIA.DelGroup(22); if (_manager.MonsterCount() > 1 || !_LeftHand || !_RightHand) { _manager.FailState = true; Trigger(KanturuBattleOfMayaState.End); return; } Trigger(KanturuBattleOfMayaState.EndCycle3, TimeSpan.FromSeconds(5)); break; case KanturuBattleOfMayaState.EndCycle3: Trigger(KanturuBattleOfMayaState.End, TimeSpan.FromSeconds(3)); break; case KanturuBattleOfMayaState.End: Trigger(KanturuBattleOfMayaState.EndCycle, TimeSpan.FromSeconds(3)); if (_manager.FailState) { _manager.SendAll(new SNotice(NoticeType.Gold, ServerMessages.GetMessage(Messages.Kanturu_Fail))); } break; case KanturuBattleOfMayaState.EndCycle: if (!_manager.FailState) { _manager._battleOfNightmare.Initialize(); } else { _manager.Trigger(EventState.Open); } Trigger(KanturuBattleOfMayaState.None); break; } }
internal void LoadMonsters(ushort Zone) { _activeMobs = MonsterIA.InitGroup(_baseGroup + Zone, OnMonsterDead); StandBy(Zone, false); }
public override void Update() { base.Update(); switch (CurrentState) { case EventState.Open: if (_players.Where(x => x.Eventer).Count() <= 0) { break; } Trigger(EventState.Playing); break; case EventState.Playing: if (_players.Where(x => x.Eventer).Count() == 0) { Trigger(EventState.Open); return; } switch (_subState) { case FortressSubState.Phaze1: case FortressSubState.Phaze2: case FortressSubState.Phaze3: case FortressSubState.Phaze4: var ts = _subStateEnd - DateTime.Now; if (_lastNotify != (int)ts.TotalMinutes) { _lastNotify = (int)ts.TotalMinutes; _ = Program.MapAnoucement((Maps)_map.Map, $"Portal will be closed after {_lastNotify} minutes"); _ = _map.SendAsync(_eventState); } foreach (var t in _traps) { foreach (var p in _players.Where(x => x.Eventer)) { if (t.Position.Substract(p.Player.Character.Position).LengthSquared() <= 5) { DamageType dmg; Spell spell; var att = t.MonsterAttack(out dmg, out spell); _ = p.Player.Character.GetAttacked(t.Index, t.Direction, 120, att, dmg, spell); } } } break; } if (_subStateEnd <= DateTime.Now) { if (_subState == FortressSubState.End) { _subState = FortressSubState.None; Trigger(EventState.Open); return; } _logger.Information("Fortress state {0}->{1}", _subState++, _subState); switch (_subState) { case FortressSubState.None: _subStateEnd = DateTime.Now; break; case FortressSubState.StandBy1: _subStateEnd = DateTime.Now.AddMinutes(1); foreach (var g in _fortressGates) { g.monster.Active = true; } _eventState.State = 1; break; case FortressSubState.Phaze1: _subStateEnd = DateTime.Now.AddMinutes(10); _fortressGates[0].monster.Type = ObjectType.Gate; _activeMobs = MonsterIA.Group(_baseGroup, true, OnMonsterDead); break; case FortressSubState.Standby2: _subStateEnd = DateTime.Now.AddMinutes(3); MonsterIA.Group(_baseGroup, false, OnMonsterDead); _eventState.State = 2; break; case FortressSubState.Phaze2: _subStateEnd = DateTime.Now.AddMinutes(10); _fortressGates[3].monster.Type = ObjectType.Gate; _activeMobs = MonsterIA.Group(_baseGroup + 1, true, OnMonsterDead); break; case FortressSubState.StandBy3: _subStateEnd = DateTime.Now.AddMinutes(3); MonsterIA.Group(_baseGroup + 1, false, OnMonsterDead); _eventState.State = 3; break; case FortressSubState.Phaze3: _subStateEnd = DateTime.Now.AddMinutes(10); _fortressGates[6].monster.Type = ObjectType.Gate; _activeMobs = MonsterIA.Group(_baseGroup + 2, true, OnMonsterDead); break; case FortressSubState.StandBy4: if (_eventDay != (DayOfWeek)7) { _subState = FortressSubState.End; } _subStateEnd = DateTime.Now.AddMinutes(3); MonsterIA.Group(_baseGroup + 2, false, OnMonsterDead); _eventState.State = 4; break; case FortressSubState.Phaze4: _subStateEnd = DateTime.Now.AddMinutes(10); _fortressGates[9].monster.Type = ObjectType.Gate; _activeMobs = MonsterIA.Group(_baseGroup + 3, true, OnMonsterDead); break; case FortressSubState.End: _subStateEnd = DateTime.Now.AddMinutes(3); MonsterIA.Group(_baseGroup + 2, false, OnMonsterDead); MonsterIA.Group(_baseGroup + 3, false, OnMonsterDead); break; } _ = _map.SendAsync(_eventState); } break; } }
static void Main(string[] args) { Predicate <GSSession> MustNotBeLoggedIn = session => session.Player.Status == LoginStatus.NotLogged; Predicate <GSSession> MustBeLoggedIn = session => session.Player.Status == LoginStatus.Logged; Predicate <GSSession> MustBePlaying = session => session.Player.Status == LoginStatus.Playing; Predicate <GSSession> MustBeLoggedOrPlaying = session => session.Player.Status == LoginStatus.Logged || session.Player.Status == LoginStatus.Playing; Predicate <GSSession> MustBeGameMaster = session => (session.Player.Character.CtlCode & ControlCode.GameMaster) != 0; string output = "{Timestamp: HH:mm:ss} [{Level} {SourceContext}][{AID}:{AUser}] {Message}{NewLine}{Exception}"; Log.Logger = new LoggerConfiguration() .Destructure.ByTransforming <IPEndPoint>(endPoint => endPoint.ToString()) .Destructure.ByTransforming <EndPoint>(endPoint => endPoint.ToString()) .WriteTo.File("GameServer_.txt", outputTemplate: output, rollingInterval: RollingInterval.Day) .WriteTo.Console(outputTemplate: output) .MinimumLevel.Debug() .CreateLogger(); ServerMessages = new ServerMessages(); ServerMessages.LoadMessages("./Data/Lang/ServerMessages(es).xml"); if (!File.Exists("./Server.xml")) { Log.Logger.Error(ServerMessages.GetMessage(Messages.Server_Cfg)); ResourceLoader.XmlSaver("./Server.xml", new ServerInfoDto()); Task.Delay(10000); return; } var xml = ResourceLoader.XmlLoader <ServerInfoDto>("./Server.xml"); ServerMessages.LoadMessages($"./Data/Lang/ServerMessages({xml.Lang}).xml"); Console.Title = ServerMessages.GetMessage(Messages.Server_Title, xml.Code, xml.Name, xml.Version, xml.Serial, xml.DataBase); ConnectionString = $"Server={xml.DBIp};port=3306;Database={xml.DataBase};user={xml.BDUser};password={xml.DBPassword};Convert Zero Datetime=True;"; SimpleModulus.LoadDecryptionKey("./Data/Dec1.dat"); SimpleModulus.LoadEncryptionKey("./Data/Enc2.dat"); byte[] key = { 0x44, 0x9D, 0x0F, 0xD0, 0x37, 0x22, 0x8F, 0xCB, 0xED, 0x0D, 0x37, 0x04, 0xDE, 0x78, 0x00, 0xE4, 0x33, 0x86, 0x20, 0xC2, 0x79, 0x35, 0x92, 0x26, 0xD4, 0x37, 0x37, 0x30, 0x98, 0xEF, 0xA4, 0xDE }; PacketEncrypt.Initialize(key); var ip = new IPEndPoint(IPAddress.Parse(xml.IP), xml.Port); var csIP = new IPEndPoint(IPAddress.Parse(xml.ConnectServerIP), 44405); AutoRegistre = xml.AutoRegistre; ServerCode = (ushort)xml.Code; Experience = xml.Experience; Zen = xml.Zen; DropRate = xml.DropRate; Season = xml.Season; var mh = new MessageHandler[] { new FilteredMessageHandler <GSSession>() .AddHandler(new AuthServices()) .AddHandler(new GlobalServices()) .AddHandler(new GameServices()) .AddHandler(new CashShopServices()) .AddHandler(new EventServices()) .AddHandler(new QuestSystemServices()) .AddHandler(new GuildServices()) .AddHandler(new AntiHackServices()) .AddHandler(new PCPShopServices()) .AddHandler(new GensServices()) .RegisterRule <CIDAndPass>(MustNotBeLoggedIn) .RegisterRule <CCharacterList>(MustBeLoggedIn) .RegisterRule <CCharacterMapJoin>(MustBeLoggedIn) .RegisterRule <CCharacterMapJoin2>(MustBeLoggedIn) .RegisterRule <CCloseWindow>(MustBePlaying) .RegisterRule <CDataLoadOK>(MustBePlaying) .RegisterRule <CAction>(MustBePlaying) .RegisterRule <SSkillKey>(MustBePlaying) }; var mf = new MessageFactory[] { new AuthMessageFactory(), new GlobalMessageFactory(), new GameMessageFactory(), new CashShopMessageFactory(), new EventMessageFactory(), new QuestSystemMessageFactory(), new GuildMessageFactory(), new AntiHackMessageFactory(), new PCPShopMessageFactory(), new GensMessageFactory(), }; server = new WZGameServer(ip, mh, mf, xml.Rijndael); server.ClientVersion = xml.Version; server.ClientSerial = xml.Serial; var cmh = new MessageHandler[] { new FilteredMessageHandler <CSClient>() .AddHandler(new CSServices()) }; var cmf = new MessageFactory[] { new CSMessageFactory() }; try { ResourceCache.Initialize(".\\Data"); // Event Config EventConfig(xml); MonstersMng.Initialize(); MonstersMng.Instance.LoadMonster("./Data/Monsters/Monster"); MonsterIA.Initialize("./Data/Monsters/"); EventInitialize(); MapServerManager.Initialize("./Data/MapServer.xml"); MonstersMng.Instance.LoadSetBase("./Data/" + xml.MonsterSetBase); GuildManager.Initialize(); PartyManager.Initialzie(400); DuelSystem.Initialize(); SubSystem.Initialize(); Marlon.Initialize(); }catch (MySql.Data.MySqlClient.MySqlException ex) { Log.Error(ex, ServerMessages.GetMessage(Messages.Server_MySQL_Error)); //Migrate(null, new EventArgs()); //Log.Information("Server needs restart to reload all changes"); Task.Delay(10000); } catch (Exception ex) { Log.Error(ex, ServerMessages.GetMessage(Messages.Server_Error)); } try { client = new CSClient(csIP, cmh, cmf, (ushort)xml.Code, server, (byte)xml.Show, xml.APIKey); }catch (Exception) { Log.Error(ServerMessages.GetMessage(Messages.Server_CSServer_Error)); } Log.Information(ServerMessages.GetMessage(Messages.Server_Disconnecting_Accounts)); try { using (var db = new GameContext()) { var accs = from acc in db.Accounts where acc.IsConnected && acc.ServerCode == xml.Code select acc; foreach (var acc in accs) { acc.IsConnected = false; } db.Accounts.UpdateRange(accs); db.SaveChanges(); } }catch (Exception) { Log.Error("MySQL unavailable. please use \"db create\" or \"db migrate\" command"); Task.Delay(15000); } Log.Information(ServerMessages.GetMessage(Messages.Server_Ready)); Handler.AddCommand(new Command <GSSession>("exit", Close, autority: MustBeGameMaster)) .AddCommand(new Command <GSSession>("quit", Close, autority: MustBeGameMaster)) .AddCommand(new Command <GSSession>("stop", Close, autority: MustBeGameMaster)) .AddCommand(new Command <GSSession>("reload", autority: MustBeGameMaster) .AddCommand(new Command <GSSession>("shops", (object a, CommandEventArgs b) => ResourceCache.Instance.ReloadShops())) .AddCommand(new Command <GSSession>("gates", (object a, CommandEventArgs b) => ResourceCache.Instance.ReloadGates()))) .AddCommand(new Command <GSSession>("create", autority: MustBeGameMaster) .AddCommand(new Command <GSSession>("movereq", DumpMoveReq))) .AddCommand(new Command <GSSession>("db", autority: MustBeGameMaster) .AddCommand(new Command <GSSession>("migrate", Migrate)) .AddCommand(new Command <GSSession>("create", Create)) .AddCommand(new Command <GSSession>("delete", Delete))) .AddCommand(new Command <GSSession>("!", (object a, CommandEventArgs b) => GlobalAnoucement(b.Argument).Wait(), MustBeGameMaster).SetPartial()) .AddCommand(new Command <GSSession>("/").SetPartial() .AddCommand(new Command <GSSession>("add").SetPartial() .AddCommand(new Command <GSSession>("str", Character.AddStr)) .AddCommand(new Command <GSSession>("agi", Character.AddAgi)) .AddCommand(new Command <GSSession>("vit", Character.AddVit)) .AddCommand(new Command <GSSession>("ene", Character.AddEne)) .AddCommand(new Command <GSSession>("cmd", Character.AddCmd))) .AddCommand(new Command <GSSession>("set", autority: MustBeGameMaster) .AddCommand(new Command <GSSession>("hp", (object a, CommandEventArgs b) => ((GSSession)a).Player.Character.Health = float.Parse(b.Argument))) .AddCommand(new Command <GSSession>("zen", (object a, CommandEventArgs b) => ((GSSession)a).Player.Character.Money = uint.Parse(b.Argument)) .AddCommand(new Command <GSSession>("exp", (object a, CommandEventArgs b) => ((GSSession)a).Player.Character.Experience = uint.Parse(b.Argument))))) .AddCommand(new Command <GSSession>("levelup", LevelUp, MustBeGameMaster))) .AddCommand(new Command <GSSession>("#", PostCommand).SetPartial()) //Post //.AddCommand(new Command<GSSession>("~").SetPartial()) /*.AddCommand(new Command<GSSession>("]").SetPartial())*/; while (true) { var input = Console.ReadLine(); if (input == null) { break; } Handler.ProcessCommands(null, input); } }