1 /*
2  *  The ManaPlus Client
3  *  Copyright (C) 2009  The Mana World Development Team
4  *  Copyright (C) 2009-2010  The Mana Developers
5  *  Copyright (C) 2011-2019  The ManaPlus Developers
6  *  Copyright (C) 2019-2021  Andrei Karas
7  *
8  *  This file is part of The ManaPlus Client.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #include "net/net.h"
25 
26 #include "configuration.h"
27 
28 #include "net/loginhandler.h"
29 
30 #ifdef TMWA_SUPPORT
31 #include "net/tmwa/generalhandler.h"
32 #endif  // TMWA_SUPPORT
33 
34 #include "net/eathena/generalhandler.h"
35 
36 #include "utils/delete2.h"
37 
38 #include "debug.h"
39 
40 int evolPacketOffset = 0;
41 
42 namespace Net
43 {
44     class AuctionHandler;
45     class AchievementHandler;
46     class AttendanceHandler;
47     class BankHandler;
48     class BarterHandler;
49     class BattleGroundHandler;
50     class BuyingStoreHandler;
51     class CashShopHandler;
52     class ElementalHandler;
53     class FamilyHandler;
54     class FriendsHandler;
55     class HomunculusHandler;
56     class Mail2Handler;
57     class MailHandler;
58     class MapHandler;
59     class MarketHandler;
60     class MercenaryHandler;
61     class SearchStoreHandler;
62     class RefineHandler;
63     class RouletteHandler;
64     class VendingHandler;
65     class AdminHandler;
66     class BeingHandler;
67     class BuySellHandler;
68     class CharServerHandler;
69     class ChatHandler;
70     class ClanHandler;
71     class GameHandler;
72     class GuildHandler;
73     class InventoryHandler;
74     class NpcHandler;
75     class PartyHandler;
76     class PetHandler;
77     class PlayerHandler;
78     class QuestHandler;
79     class ServerFeatures;
80     class SkillHandler;
81     class TradeHandler;
82 }  // namespace Net
83 
84 Net::AdminHandler *adminHandler = nullptr;
85 Net::CharServerHandler *charServerHandler = nullptr;
86 Net::ChatHandler *chatHandler = nullptr;
87 Net::ClanHandler *clanHandler = nullptr;
88 Net::GeneralHandler *generalHandler = nullptr;
89 Net::InventoryHandler *inventoryHandler = nullptr;
90 Net::LoginHandler *loginHandler = nullptr;
91 Net::GameHandler *gameHandler = nullptr;
92 Net::GuildHandler *guildHandler = nullptr;
93 Net::NpcHandler *npcHandler = nullptr;
94 Net::PartyHandler *partyHandler = nullptr;
95 Net::PetHandler *petHandler = nullptr;
96 Net::PlayerHandler *playerHandler = nullptr;
97 Net::SkillHandler *skillHandler = nullptr;
98 Net::TradeHandler *tradeHandler = nullptr;
99 Net::BeingHandler *beingHandler = nullptr;
100 Net::BuySellHandler *buySellHandler = nullptr;
101 Net::ServerFeatures *serverFeatures = nullptr;
102 Net::AuctionHandler *auctionHandler = nullptr;
103 Net::AchievementHandler *achievementHandler = nullptr;
104 Net::AttendanceHandler *attendanceHandler = nullptr;
105 Net::BankHandler *bankHandler = nullptr;
106 Net::BattleGroundHandler *battleGroundHandler = nullptr;
107 Net::BuyingStoreHandler *buyingStoreHandler = nullptr;
108 Net::CashShopHandler *cashShopHandler = nullptr;
109 Net::ElementalHandler *elementalHandler = nullptr;
110 Net::FamilyHandler *familyHandler = nullptr;
111 Net::FriendsHandler *friendsHandler = nullptr;
112 Net::HomunculusHandler *homunculusHandler = nullptr;
113 Net::Mail2Handler *mail2Handler = nullptr;
114 Net::MailHandler *mailHandler = nullptr;
115 Net::MapHandler *mapHandler = nullptr;
116 Net::MarketHandler *marketHandler = nullptr;
117 Net::BarterHandler *barterHandler = nullptr;
118 Net::MercenaryHandler *mercenaryHandler = nullptr;
119 Net::RefineHandler *refineHandler = nullptr;
120 Net::RouletteHandler *rouletteHandler = nullptr;
121 Net::SearchStoreHandler *searchStoreHandler = nullptr;
122 Net::VendingHandler *vendingHandler = nullptr;
123 Net::QuestHandler *questHandler = nullptr;
124 
125 namespace Net
126 {
127 ServerTypeT networkType = ServerType::UNKNOWN;
128 std::set<int> ignorePackets;
129 
connectToServer(const ServerInfo & server)130 void connectToServer(const ServerInfo &server)
131 {
132     BLOCK_START("Net::connectToServer")
133     if (networkType == server.type &&
134         generalHandler != nullptr)
135     {
136         generalHandler->reload();
137     }
138     else
139     {
140         if (networkType != ServerType::UNKNOWN &&
141             generalHandler != nullptr)
142         {
143             generalHandler->unload();
144             delete2(generalHandler)
145         }
146 
147         switch (server.type)
148         {
149             case ServerType::EATHENA:
150             case ServerType::EVOL2:
151                 new EAthena::GeneralHandler;
152                 break;
153             case ServerType::TMWATHENA:
154             case ServerType::UNKNOWN:
155             default:
156 #ifdef TMWA_SUPPORT
157                 new TmwAthena::GeneralHandler;
158 #else  // TMWA_SUPPORT
159 
160                 new EAthena::GeneralHandler;
161 #endif  // TMWA_SUPPORT
162 
163                 break;
164         }
165 
166         if (generalHandler != nullptr)
167             generalHandler->load();
168 
169         networkType = server.type;
170     }
171 
172     if (loginHandler != nullptr)
173     {
174         loginHandler->setServer(server);
175         loginHandler->connect();
176     }
177     BLOCK_END("Net::connectToServer")
178 }
179 
unload()180 void unload()
181 {
182     const GeneralHandler *const handler = generalHandler;
183     if (handler != nullptr)
184         handler->unload();
185     ignorePackets.clear();
186     delete2(generalHandler)
187 }
188 
getNetworkType()189 ServerTypeT getNetworkType()
190 {
191     return networkType;
192 }
193 
loadIgnorePackets()194 void loadIgnorePackets()
195 {
196     const std::string str = config.getStringValue("ignorelogpackets");
197     splitToIntSet(ignorePackets, str, ',');
198 }
199 
isIgnorePacket(const int id)200 bool isIgnorePacket(const int id)
201 {
202     return ignorePackets.find(id) != ignorePackets.end();
203 }
204 
205 }  // namespace Net
206