25 #include "../clib/clib.h" 26 #include "../clib/clib_MD5.h" 27 #include "../clib/clib_endian.h" 28 #include "../clib/logfacility.h" 29 #include "../clib/rawtypes.h" 30 #include "../plib/systemstate.h" 63 msg->Write<
u8>( reason );
90 unsigned int addr1part, addr2part;
91 struct sockaddr_in* sockin =
reinterpret_cast<struct sockaddr_in*
>( &client->
ipaddr );
100 if ( addr1part == addr2part )
131 bool correct_password =
false;
133 std::string msgpass = msg->
password;
134 std::string acctname = acct->
name();
139 if ( !correct_password )
143 POLLOG.Format(
"Incorrect password for account {} from {}\n" )
163 POLLOG_INFO.Format(
"Account {} logged in from {}\n" )
170 msgA8->Write<
u8>( 0xFFu );
173 unsigned short servcount = 0;
183 gethostbyname( server->
hostname.c_str() );
184 if ( he !=
nullptr && he->h_addr_list[0] )
186 char* addr = he->h_addr_list[0];
187 server->
ip[0] = addr[3];
188 server->
ip[1] = addr[2];
189 server->
ip[2] = addr[1];
190 server->
ip[3] = addr[0];
194 POLLOG.Format(
"gethostbyname(\"{}\") failed for server {}\n" )
203 msgA8->WriteFlipped<
u16>( idx + 1u );
204 msgA8->Write( server->
name.c_str(), 30 );
205 msgA8->WriteFlipped<
u16>( idx + 1u );
207 msgA8->Write( server->
ip, 4 );
210 u16 len = msgA8->offset;
212 msgA8->WriteFlipped<
u16>( len );
214 msgA8->WriteFlipped<
u16>( servcount );
216 msgA8.
Send( client, len );
218 if ( servcount == 0 )
220 POLLOG.Format(
"No applicable servers for client connecting from {}\n" )
254 for (
unsigned i = 0; i <
sizeof( msg->
langcode ) /
sizeof( msg->
langcode[0] ); ++i )
273 rsp->Write<
u8>( svr->
ip[3] );
274 rsp->Write<
u8>( svr->
ip[2] );
275 rsp->Write<
u8>( svr->
ip[1] );
276 rsp->Write<
u8>( svr->
ip[0] );
281 rsp->WriteFlipped<
u16>( svr->
port );
288 unsigned int nseed = 0xFEFE0000 | client->
ClientType;
289 rsp->WriteFlipped<
u32>( nseed );
304 unsigned char char_slots;
305 unsigned char char_count;
307 char_slots =
static_cast<u8>(
317 if ( char_slots > char_count )
318 char_count = char_slots;
322 msg->Write<
u8>( char_count );
324 for ( i = 0; i < char_count; i++ )
326 if ( i < char_slots )
332 msg->Write( chr->
name().c_str(), 30, false );
354 msg->WriteFlipped<
u32>( coord.
x );
355 msg->WriteFlipped<
u32>( coord.
y );
356 msg->WriteFlipped<
s32>( coord.
z );
371 clientflag |= PKTOUT_A9::FLAG_SEND_UO3D_TYPE;
374 if ( char_slots == 7 )
375 clientflag |= PKTOUT_A9::FLAG_UPTO_SEVEN_CHARACTERS;
376 else if ( char_slots == 6 )
377 clientflag |= PKTOUT_A9::FLAG_UPTO_SIX_CHARACTERS;
378 else if ( char_slots == 1 )
381 msg->WriteFlipped<
u32>( clientflag );
382 u16 len = msg->offset;
384 msg->WriteFlipped<
u16>( len );
385 msg.
Send( client, len );
403 if ( acct ==
nullptr )
411 bool correct_password =
false;
414 std::string msgpass = msg->
password;
415 std::string acctname = acct->
name();
420 if ( !correct_password )
424 POLLOG.Format(
"Incorrect password for account {} from {}\n" )
449 POLLOG.Format(
"Account {} logged in from {}\n" )
476 POLLOG.Format(
"Account {} deleting character 0x{:X}\n" ) << acct->
name() << chr->
serial;
bool MD5_Encrypt(const std::string &in, std::string &out)
#define LOGIN_ERROR_WRONG_PASSWORD
void clear_character(int index)
void send_start(Network::Client *client)
void delete_character(Accounts::Account *acct, Mobile::Character *chr, int charidx)
Mobile::Character * get_character(int index)
void handle_delete_character(Network::Client *client, PKTIN_83 *msg)
#define LOGIN_ERROR_NO_ACCOUNT
void call_ondelete_scripts(Mobile::Character *chr)
void loginserver_login(Network::Client *client, PKTIN_80 *msg)
bool has_active_characters()
Returns true if at least one character from this account is already logged in.
void login2(Network::Client *client, PKTIN_91 *msg)
#define LOGIN_ERROR_ACCOUNT_BLOCKED
bool server_applies(Network::Client *client, int i)
const int DELETE_BY_PLAYER
void KR_Verifier_Response(Network::Client *, PKTIN_E4 *)
const std::string password() const
void on_delete_from_account()
bool acct_check(Network::Client *client, int i)
void send_login_error(Network::Client *client, unsigned char reason)
NetworkManager networkManager
void send_feature_enable(Client *client)
void Send(Client *client, int len=-1) const
const char * name() const
void set_password(std::string newpass)
unsigned short uo_feature_enable
virtual void Init(void *pvSeed, int type=typeAuto)=0
const char * AddressToString(struct sockaddr *addr)
const std::string passwordhash() const
bool encrypt_server_stream
void handle_A4(Network::Client *, PKTIN_A4 *)
SettingsManager settingsManager
virtual void destroy() POL_OVERRIDE
Crypt::CCryptBase * cryptengine
u16 video_description[64]
unsigned short listen_port
void setclientinfo(const Core::PKTIN_D9 *msg)
bool MD5_Compare(const std::string &a, const std::string &b)
bool allow_multi_clients_per_account
bool can_delete_character(Mobile::Character *chr, int delete_by)
StartingLocations startlocations
unsigned short character_slots
virtual std::string name() const
void handle_D9(Network::Client *client, PKTIN_D9 *msg)
unsigned char default_cmdlevel() const
#define LOGIN_ERROR_OTHER_CHAR_INUSE
bool is_banned_ip(Client *client)
void select_server(Network::Client *client, PKTIN_A0 *msg)
Account * find_account(const char *acctname)