from construct import *
from construct.protocols.layer3.ipv4 import IpAddress
import mapserv
import stats
from protocol import *
from utils import *
from common import *
from loggers import netlog
server = None
def smsg_ignore(data):
pass
@extendable
def smsg_char_login(data):
netlog.info("SMSG_CHAR_LOGIN {}".format(data))
char_slot = -1
for c in data.chars:
if c.name == server.char_name:
char_slot = c.slot
mapserv.player_money = c.money
mapserv.player_stats[stats.EXP] = c.exp
mapserv.player_stats[stats.MONEY] = c.money
mapserv.player_stats[stats.JOB] = c.job
mapserv.player_stats[stats.CHAR_POINTS] = c.charpoints
mapserv.player_stats[stats.HP] = c.hp
mapserv.player_stats[stats.MAX_HP] = c.max_hp
mapserv.player_stats[stats.MP] = c.mp
mapserv.player_stats[stats.MAX_MP] = c.max_mp
mapserv.player_stats[stats.WALK_SPEED] = c.speed
mapserv.player_stats[stats.LEVEL] = c.level
mapserv.player_stats[stats.SKILL_POINTS] = c.skillpoints
break
if char_slot < 0:
err_msg = "CharName {} not found".format(server.char_name)
netlog.error(err_msg)
server.close()
raise Exception(err_msg)
else:
cmsg_char_select(char_slot)
@extendable
def smsg_char_login_error(data):
err_msg = "SMSG_CHAR_LOGIN_ERROR (code={})".format(data.code)
netlog.error(err_msg)
server.close()
raise Exception(err_msg)
@extendable
def smsg_char_map_info(data):
netlog.info("SMSG_CHAR_MAP_INFO CID={} map={} address={} port={}".format(
data.char_id, data.map_name, data.address, data.port))
server.close()
mapserv.connect(data.address, data.port)
mapserv.server.char_name = server.char_name
mapserv.server.char_id = data.char_id
mapserv.player_pos['map'] = data.map_name
mapserv.cmsg_map_server_connect(server.account, data.char_id,
server.session1, server.session2,
server.gender)
protodef = {
0x8000 : (smsg_ignore, Field("data", 2)),
0x006b : (smsg_char_login,
Struct("data",
ULInt16("length"),
ULInt16("slots"),
Byte("version"),
# Probe("debug", show_stream=False, show_stack=False),
Padding(17),
Array(lambda ctx: (ctx["length"] - 24) / 106,
Struct("chars",
ULInt32("id"),
ULInt32("exp"),
ULInt32("money"),
ULInt32("job"),
ULInt32("job_level"),
Padding(20),
ULInt16("charpoints"),
ULInt16("hp"),
ULInt16("max_hp"),
ULInt16("mp"),
ULInt16("max_mp"),
ULInt16("speed"),
Padding(6),
ULInt16("level"),
ULInt16("skillpoints"),
Padding(12),
StringZ("name", 24),
Padding(6),
Byte("slot"),
Padding(1))))),
0x006c : (smsg_char_login_error,
Struct("data", Byte("code"))),
0x0071 : (smsg_char_map_info,
Struct("data",
ULInt32("char_id"),
StringZ("map_name", 16),
IpAddress("address"),
ULInt16("port"))),
0x0081 : (mapserv.smsg_connection_problem,
Struct("data", Byte("code"))),
}
def cmsg_char_server_connect(account, session1, session2, proto, gender):
netlog.info(("CMSG_CHAR_SERVER_CONNECT account={} session1={} "
"session2={} proto={} gender={}").format(
account, session1, session2, proto, gender))
# save session data
server.account = account
server.session1 = session1
server.session2 = session2
server.gender = gender
send_packet(server, CMSG_CHAR_SERVER_CONNECT,
(ULInt32("account"), account),
(ULInt32("session1"), session1),
(ULInt32("session2"), session2),
(ULInt16("proto"), proto),
(Gender("gender"), gender))
def cmsg_char_select(slot):
netlog.info("CMSG_CHAR_SELECT slot={}".format(slot))
send_packet(server, CMSG_CHAR_SELECT, (Byte("slot"), slot))
def connect(host, port):
global server
#server = SocketWrapper(host=host, port=port, protodef=protodef)
server = SocketWrapper(host="52.174.196.146", port=port, protodef=protodef)