public static void OnMapReloaded(IMap map) { for (int i = 0; i < Constants.MAX_MAP_NPCS; i++) { if (!map.IsNpcSlotEmpty(i)) { map.ActiveNpc[i].CalculateOriginalStats(); RefreshCharacterTraits(map.ActiveNpc[i], map, null); } } }
public static void UnlockRoom(Client client, IMap imap) { int remainingEnemies = 0; for (int i = 0; i < Constants.MAX_MAP_NPCS; i++) { if (!imap.IsNpcSlotEmpty(i)) remainingEnemies++; } if (remainingEnemies <= 1) { if (imap.MaxX == 19) { for (int i = 8; i <= 11; i++) { if (imap.Tile[i,1].Type == Enums.TileType.Key) { imap.SetTile(i, 1, 0, 0, 1); imap.SetAttribute(i, 1, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(i, 1, imap); } if (imap.Tile[i,13].Type == Enums.TileType.Key) { imap.SetTile(i, 13, 0, 0, 1); imap.SetAttribute(i, 13, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(i, 13, imap); } } for (int i = 6; i <= 8; i++) { if (imap.Tile[1,i].Type == Enums.TileType.Key) { imap.SetTile(1, i, 0, 0, 1); imap.SetAttribute(1, i, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(1, i, imap); } if (imap.Tile[18,i].Type == Enums.TileType.Key) { imap.SetTile(18,i, 0, 0, 1); imap.SetAttribute(18, i, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(18, i, imap); } } } else if (imap.MaxX == 46) { for (int i = 22; i <= 24; i++) { if (imap.Tile[i,1].Type == Enums.TileType.Key) { imap.SetTile(i, 1, 0, 0, 1); imap.SetAttribute(i, 1, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(i, 1, imap); } if (imap.Tile[i,33].Type == Enums.TileType.Key) { imap.SetTile(i, 33, 0, 0, 1); imap.SetAttribute(i, 33, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(i, 33, imap); } } for (int i = 16; i <= 18; i++) { if (imap.Tile[1,i].Type == Enums.TileType.Key) { imap.SetTile(1, i, 0, 0, 1); imap.SetAttribute(1, i, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(1, i, imap); } if (imap.Tile[45,i].Type == Enums.TileType.Key) { imap.SetTile(45, i, 0, 0, 1); imap.SetAttribute(45, i, Enums.TileType.Walkable, 0, 0, 0, "", "", ""); Messenger.SendTile(45, i, imap); } } } } }
public static void OnMapLoad(Client client, IMap oldMap, IMap map, bool loggedIn) { // Maintenance mode (external program is scheduled to run at this time) TimeSpan start = new TimeSpan(5, 49, 0); //12:49 AM EST TimeSpan end = new TimeSpan(5, 51, 0); //12:51 AM EST TimeSpan now = DateTime.Now.TimeOfDay; if ((now > start) && (now < end)) { if (MaintenanceRestart == false) { MaintenanceRestart = true; Messenger.AdminMsg("[Staff] Automated maintenance process starting...", Text.Red); RestartServer(); } } start = new TimeSpan(6, 0, 0); //6 AM end = new TimeSpan(6, 10, 0); //6:10 AM (it takes about 10 minutes to run) now = DateTime.Now.TimeOfDay; if ((now > start) && (now < end)) { Server.Globals.ServerStatus = "The server is currently in maintenance mode, which may result in slowdowns."; } else { if (Server.Globals.ServerStatus == "The server is currently in maintenance mode, which may result in slowdowns.") { Server.Globals.ServerStatus = ""; } } //restore stats (temporary workaround) if (map.MapID == MapManager.GenerateMapID(Server.Settings.Crossroads)) { for (int i = 0; i < Constants.MAX_ACTIVETEAM; i++) { if (client.Player.Team[i] != null) { if (client.Player.Team[i].InTempMode) { client.Player.RestoreRecruitStats(i); } } } } //remove from party if (oldMap != null && oldMap.Moral == Enums.MapMoral.None && map.Moral != Enums.MapMoral.None && exPlayer.Get(client).FirstMapLoaded == true) { if (client.Player.PartyID != null) { Party party = PartyManager.FindPlayerParty(client); PartyManager.RemoveFromParty(party, client); } if (client.Player.Dead) { ReviveCharacter(client.Player.GetActiveRecruit(), client.Player.Map, false, null); } } //if (!loggedIn) { // if (client.Player.PartyID != null) { // Party party = PartyManager.FindPlayerParty(client); // bool remove = true; // foreach (Client member in party.GetOnlineMemberClients()) { // if (member.Player.Map == client.Player.Map) { // remove = false; // } // } // if (remove) { // PartyManager.RemoveFromParty(party, client); // } // } //} //restore hunger if (!map.HungerEnabled) { for (int i = 0; i < Constants.MAX_ACTIVETEAM; i++) { if (client.Player.Team[i] != null) { if (client.Player.Team[i].MaxBelly > 100) { client.Player.Team[i].MaxBelly = 100; } client.Player.Team[i].RestoreBelly(); } } } if (client.Player.LoggedIn) { AddExclusives(client, map, null); } int heldItemNum = -1; if (client.Player.GetActiveRecruit().HeldItemSlot > -1) { heldItemNum = client.Player.GetActiveRecruit().HeldItem.Num; } //if (client.Player.Helmet > -1) { // helmet = client.Player.Helmet; //} //TODO: restructure for party items switch (heldItemNum) { //case 66: {//x-ray specs // Messenger.PlayerMsg(client, "Pokémon in this area:", Text.Yellow); //substitute the 14 for max NPCs // List<int> Npcs = new List<int>(); // for (int i = 0; i < Constants.MAX_MAP_NPCS; i++) { // if (Npcs.Contains(map.Npc[i].NpcNum) == false && map.Npc[i].NpcNum > 0) { // Npcs.Add(map.Npc[i].NpcNum); // Messenger.PlayerMsg(client, "Lv." + map.ActiveNpc[i].Level + " " + NpcManagerBase.Npcs[map.Npc[i].NpcNum].Name, Text.Yellow); // } // } //} else { //} //if (Npcs.Count == 0) { // Messenger.PlayerMsg(client, "(None)", Text.Yellow); //} //} //break; case 544: {//gaggle specs for (int j = 0; j < 14; j++) { map.ActiveNpc[j].Target = client; } } break; } //Castform stuff if (client.Player.LoggedIn) { //exPlayer.Get(client).TurnsTaken = 0; } //for gen5 egg //bool hasTriggerEvent = false; //for (int i = 0; i < client.Player.TriggerEvents.Count; i++) { // if (client.Player.TriggerEvents[i].Trigger == TriggerEventTrigger.StepCounter && // client.Player.TriggerEvents[i].ID == "MysteryEggStepCounter") { // hasTriggerEvent = true; // break; // } //} //if (client.Player.HasItem(131) > 0 && !hasTriggerEvent) { // StepCounterTriggerEvent triggerEvent = new StepCounterTriggerEvent("MysteryEggStepCounter", TriggerEventAction.RunScript, 2, true, client, 200); // client.Player.AddTriggerEvent(triggerEvent); //Messenger.PlayerMsg(client, "1", Text.BrightRed); //} //CTF issues if (ActiveCTF != null && map.MapID != MapManager.GenerateMapID(CTF.REDMAP) && map.MapID != MapManager.GenerateMapID(CTF.BLUEMAP) && map.MapID != MapManager.GenerateMapID(CTF.HUBMAP)) { ActiveCTF.RemoveFromGame(client); } if (client.Player.CharID == Auction.AuctionMaster && client.Player.MapID != Auction.AUCTION_MAP) { //Auction.EndAuction(client); Auction.State = Auction.AuctionState.NotStarted; Auction.AuctionMaster = null; } // Snowball game cleanup if (exPlayer.Get(client).SnowballGameInstance != null) { SnowballGame snowballGame = exPlayer.Get(client).SnowballGameInstance; if (client.Player.Map != snowballGame.ArenaMap && client.Player.MapID != SnowballGame.WaitingRoomMap) { snowballGame.RemoveFromGame(client); } } if (!loggedIn) { if (client.Player.CurrentChapter == null && BossBattles.IsBossBattleMap(client)) { bool empty = true; for (int i = 0; i < Constants.MAX_MAP_NPCS; i++) { if (!map.IsNpcSlotEmpty(i)) { empty = false; break; } } if (empty) { // TODO: You can completely skip the boss battle if you relog while the intro story // is playing and no NPC has been spawned yet. Disabled until a workaround is // made. // --Enabled until workaround is made. The only thing achieved from getting around a boss is dungeon completion. BossBattles.RunBossBattleCleanup(client, client.Player.Map.Name); } } } }