forked from metin2/client
1
0
Fork 0

remove: OpenID

This commit is contained in:
WildEgo 2024-06-01 16:54:08 +01:00
parent fe2f7cddb3
commit a2bac7a5f3
10 changed files with 229 additions and 465 deletions

View File

@ -262,10 +262,6 @@ class LoginWindow(ui.ScriptWindow):
else: else:
connectingIP = self.stream.GetConnectAddr() connectingIP = self.stream.GetConnectAddr()
if connectingIP: if connectingIP:
if app.USE_OPENID and not app.OPENID_TEST :
self.__RefreshServerList()
self.__OpenServerBoard()
else:
self.__OpenLoginBoard() self.__OpenLoginBoard()
if IsFullBackImage(): if IsFullBackImage():
self.GetChild("bg1").Hide() self.GetChild("bg1").Hide()
@ -287,13 +283,13 @@ class LoginWindow(ui.ScriptWindow):
print "---------------------------------------------------------------------------- CLOSE LOGIN WINDOW " print "---------------------------------------------------------------------------- CLOSE LOGIN WINDOW "
# #
# selectMusic이 없으면 BGM이 끊기므로 두개 다 체크한다. # selectMusic<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BGM<47><4D> <20><><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ΰ<EFBFBD> <20><> üũ<C3BC>Ѵ<EFBFBD>.
# #
if musicInfo.loginMusic != "" and musicInfo.selectMusic != "": if musicInfo.loginMusic != "" and musicInfo.selectMusic != "":
snd.FadeOutMusic("BGM/"+musicInfo.loginMusic) snd.FadeOutMusic("BGM/"+musicInfo.loginMusic)
## NOTE : idEditLine와 pwdEditLine은 이벤트가 서로 연결 되어있어서 ## NOTE : idEditLine<EFBFBD><EFBFBD> pwdEditLine<6E><65> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>־
## Event를 강제로 초기화 해주어야만 합니다 - [levites] ## Event<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD>־<EFBFBD>߸<EFBFBD> <20>մϴ<D5B4> - [levites]
self.idEditLine.SetTabEvent(0) self.idEditLine.SetTabEvent(0)
self.idEditLine.SetReturnEvent(0) self.idEditLine.SetReturnEvent(0)
self.pwdEditLine.SetReturnEvent(0) self.pwdEditLine.SetReturnEvent(0)
@ -393,11 +389,11 @@ class LoginWindow(ui.ScriptWindow):
def SetPasswordEditLineFocus(self): def SetPasswordEditLineFocus(self):
if localeInfo.IsEUROPE(): if localeInfo.IsEUROPE():
if self.idEditLine != None: #0000862: [M2EU] 로그인창 팝업 에러: 종료시 먼저 None 설정됨 if self.idEditLine != None: #0000862: [M2EU] <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>â <20>˾<EFBFBD> <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> None <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.idEditLine.SetText("") self.idEditLine.SetText("")
self.idEditLine.SetFocus() #0000685: [M2EU] 아이디/비밀번호 유추 가능 버그 수정: 무조건 아이디로 포커스가 가게 만든다 self.idEditLine.SetFocus() #0000685: [M2EU] <EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>/<2F><>й<EFBFBD>ȣ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5> <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if self.pwdEditLine != None: #0000862: [M2EU] 로그인창 팝업 에러: 종료시 먼저 None 설정됨 if self.pwdEditLine != None: #0000862: [M2EU] <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>â <20>˾<EFBFBD> <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> None <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
self.pwdEditLine.SetText("") self.pwdEditLine.SetText("")
else: else:
if self.pwdEditLine != None: if self.pwdEditLine != None:
@ -455,7 +451,7 @@ class LoginWindow(ui.ScriptWindow):
loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN + error loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN + error
#0000685: [M2EU] 아이디/비밀번호 유추 가능 버그 수정: 무조건 패스워드로 포커스가 가게 만든다 #0000685: [M2EU] <EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>/<2F><>й<EFBFBD>ȣ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
loginFailureFunc=self.loginFailureFuncDict.get(error, self.SetPasswordEditLineFocus) loginFailureFunc=self.loginFailureFuncDict.get(error, self.SetPasswordEditLineFocus)
if app.loggined: if app.loggined:
@ -703,18 +699,18 @@ class LoginWindow(ui.ScriptWindow):
execfile(loginInfoFileName, loginInfo) execfile(loginInfoFileName, loginInfo)
except IOError: except IOError:
print(\ print(\
"자동 로그인을 하시려면" + loginInfoFileName + "파일을 작성해주세요\n"\ "<EFBFBD>ڵ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>Ͻ÷<CFBD><C3B7><EFBFBD>" + loginInfoFileName + "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>\n"\
"\n"\ "\n"\
"내용:\n"\ "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:\n"\
"================================================================\n"\ "================================================================\n"\
"addr=주소\n"\ "addr=<EFBFBD>ּ<EFBFBD>\n"\
"port=포트\n"\ "port=<EFBFBD><EFBFBD>Ʈ\n"\
"id=아이디\n"\ "id=<EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>\n"\
"pwd=비밀번호\n"\ "pwd=<EFBFBD><EFBFBD>й<EFBFBD>ȣ\n"\
"slot=캐릭터 선택 인덱스 (없거나 -1이면 자동 선택 안함)\n"\ "slot=ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> (<28><><EFBFBD>ų<EFBFBD> -1<≯<EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)\n"\
"autoLogin=자동 접속 여부\n" "autoLogin=<EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>\n"
"autoSelect=자동 접속 여부\n" "autoSelect=<EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>\n"
"locale=(ymir) LC_Ymir 일경우 ymir로 작동. 지정하지 않으면 korea로 작동\n" "locale=(ymir) LC_Ymir <EFBFBD>ϰ<EFBFBD><EFBFBD> ymir<69><72> <20>۵<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> korea<65><61> <20>۵<EFBFBD>\n"
); );
id=loginInfo.get("id", "") id=loginInfo.get("id", "")
@ -738,7 +734,7 @@ class LoginWindow(ui.ScriptWindow):
self.__SetServerInfo(locale.CHANNEL_TEST_SERVER) self.__SetServerInfo(locale.CHANNEL_TEST_SERVER)
except: except:
import exception import exception
exception.Abort("LoginWindow.__LoadLoginInfo - 테스트서버 주소가 없습니다") exception.Abort("LoginWindow.__LoadLoginInfo - <EFBFBD>׽<EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּҰ<D6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>")
else: else:
addr=loginInfo.get("addr", "") addr=loginInfo.get("addr", "")
@ -752,7 +748,7 @@ class LoginWindow(ui.ScriptWindow):
net.SetMarkServer(addr, port) net.SetMarkServer(addr, port)
if locale == "ymir" : if locale == "ymir" :
net.SetServerInfo("천마 서버") net.SetServerInfo("õ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>")
self.serverInfo.SetText("Y:"+addr+":"+str(port)) self.serverInfo.SetText("Y:"+addr+":"+str(port))
else: else:
net.SetServerInfo(addr+":"+str(port)) net.SetServerInfo(addr+":"+str(port))
@ -783,7 +779,7 @@ class LoginWindow(ui.ScriptWindow):
self.Connect(id, pwd) self.Connect(id, pwd)
print "==================================================================================" print "=================================================================================="
print "자동 로그인: %s - %s:%d %s" % (loginInfoFileName, addr, port, id) print "<EFBFBD>ڵ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>: %s - %s:%d %s" % (loginInfoFileName, addr, port, id)
print "==================================================================================" print "=================================================================================="
@ -902,9 +898,9 @@ class LoginWindow(ui.ScriptWindow):
self.stream.popupWindow.Close() self.stream.popupWindow.Close()
# CHINA_MATRIX_CARD_BUG_FIX # CHINA_MATRIX_CARD_BUG_FIX
## A~Z 까지 26 이내의 값이 들어있어야만 한다. ## A~Z <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 26 <20>̳<EFBFBD><CCB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>־<EFBFBD>߸<EFBFBD> <20>Ѵ<EFBFBD>.
## Python Exception Log 에서 그 이상의 값이 들어있어서 에러 방지 ## Python Exception Log <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>־ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
## 헌데 왜 한국쪽 로그에서 이게 활용되는지는 모르겠음 ## <EFBFBD><20><> <20>ѱ<EFBFBD><D1B1><EFBFBD> <20>α׿<CEB1><D7BF><EFBFBD> <20>̰<EFBFBD> Ȱ<><C8B0>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD> <20>𸣰<EFBFBD><F0B8A3B0><EFBFBD>
row1 = min(30, row1) row1 = min(30, row1)
row2 = min(30, row2) row2 = min(30, row2)
row3 = min(30, row3) row3 = min(30, row3)
@ -1031,7 +1027,7 @@ class LoginWindow(ui.ScriptWindow):
if channelIndex >= 0: if channelIndex >= 0:
self.channelList.SelectItem(channelIndex) self.channelList.SelectItem(channelIndex)
## Show/Hide 코드에 문제가 있어서 임시 - [levites] ## Show/Hide <EFBFBD>ڵ忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־ <20>ӽ<EFBFBD> - [levites]
self.serverBoard.SetPosition(self.xServerBoard, self.yServerBoard) self.serverBoard.SetPosition(self.xServerBoard, self.yServerBoard)
self.serverBoard.Show() self.serverBoard.Show()
self.connectBoard.Hide() self.connectBoard.Hide()
@ -1265,7 +1261,7 @@ class LoginWindow(ui.ScriptWindow):
self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_CHANNEL) self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_CHANNEL)
return return
# 상태가 FULL 과 같으면 진입 금지 # <EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> FULL <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if state == serverInfo.STATE_DICT[3]: if state == serverInfo.STATE_DICT[3]:
self.PopupNotifyMessage(localeInfo.CHANNEL_NOTIFY_FULL) self.PopupNotifyMessage(localeInfo.CHANNEL_NOTIFY_FULL)
return return
@ -1277,9 +1273,9 @@ class LoginWindow(ui.ScriptWindow):
channelName = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["name"] channelName = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["name"]
addrKey = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["key"] addrKey = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["key"]
if "천마 서버" == serverName: if "õ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" == serverName:
app.ForceSetLocale("ymir", "locale/ymir") app.ForceSetLocale("ymir", "locale/ymir")
elif "쾌도 서버" == serverName: elif "<EFBFBD><20><><EFBFBD><EFBFBD>" == serverName:
app.ForceSetLocale("we_korea", "locale/we_korea") app.ForceSetLocale("we_korea", "locale/we_korea")
except: except:
@ -1294,7 +1290,7 @@ class LoginWindow(ui.ScriptWindow):
tcp_port = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["tcp_port"] tcp_port = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["tcp_port"]
except: except:
import exception import exception
exception.Abort("LoginWindow.__OnClickSelectServerButton - 서버 선택 실패") exception.Abort("LoginWindow.__OnClickSelectServerButton - <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>")
try: try:
account_ip = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["ip"] account_ip = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["ip"]
@ -1314,20 +1310,11 @@ class LoginWindow(ui.ScriptWindow):
except: except:
import exception import exception
exception.Abort("LoginWindow.__OnClickSelectServerButton - 마크 정보 없음") exception.Abort("LoginWindow.__OnClickSelectServerButton - <EFBFBD><EFBFBD>ũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>")
if app.USE_OPENID and not app.OPENID_TEST :
## 2012.07.19 OpenID : 김용욱
# 채널 선택 화면에서 "확인"(SelectServerButton) 을 눌렀을때,
# 로그인 화면으로 넘어가지 않고 바로 서버에 OpenID 인증키를 보내도록 수정
self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port)
self.Connect(0, 0)
else :
self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port) self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port)
self.__OpenLoginBoard() self.__OpenLoginBoard()
def __OnClickSelectConnectButton(self): def __OnClickSelectConnectButton(self):
if IsFullBackImage(): if IsFullBackImage():
self.GetChild("bg1").Show() self.GetChild("bg1").Show()

View File

@ -521,7 +521,6 @@ const char * GetRecvHeaderName(BYTE header)
stringList[135] = "HEADER_GC_DAMAGE_INFO"; stringList[135] = "HEADER_GC_DAMAGE_INFO";
stringList[136] = "HEADER_GC_CHAR_ADDITIONAL_INFO"; stringList[136] = "HEADER_GC_CHAR_ADDITIONAL_INFO";
stringList[150] = "HEADER_GC_AUTH_SUCCESS"; stringList[150] = "HEADER_GC_AUTH_SUCCESS";
stringList[154] = "HEADER_GC_AUTH_SUCCESS_OPENID";
stringList[0xfc] = "HEADER_GC_HANDSHAKE_OK"; stringList[0xfc] = "HEADER_GC_HANDSHAKE_OK";
stringList[0xfd] = "HEADER_GC_PHASE"; stringList[0xfd] = "HEADER_GC_PHASE";
stringList[0xfe] = "HEADER_GC_BINDUDP"; stringList[0xfe] = "HEADER_GC_BINDUDP";

View File

@ -10,10 +10,6 @@ extern DWORD g_adwEncryptKey[4];
extern DWORD g_adwDecryptKey[4]; extern DWORD g_adwDecryptKey[4];
// END_OF_CHINA_CRYPT_KEY // END_OF_CHINA_CRYPT_KEY
#ifdef USE_OPENID
extern int openid_test;
#endif
void CAccountConnector::SetHandler(PyObject* poHandler) void CAccountConnector::SetHandler(PyObject* poHandler)
{ {
m_poHandler = poHandler; m_poHandler = poHandler;
@ -141,7 +137,7 @@ bool CAccountConnector::__HandshakeState_Process()
if (!__AnalyzePacket(HEADER_GC_PING, sizeof(TPacketGCPing), &CAccountConnector::__AuthState_RecvPing)) if (!__AnalyzePacket(HEADER_GC_PING, sizeof(TPacketGCPing), &CAccountConnector::__AuthState_RecvPing))
return false; return false;
// TODO : 차후 서버와 동일하게 가변길이 data serialize & deserialize 작업해야 한다. // TODO : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> data serialize & deserialize <20>۾<EFBFBD><DBBE>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_KEYS, &CAccountConnector::__AuthState_RecvHybridCryptKeys)) if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_KEYS, &CAccountConnector::__AuthState_RecvHybridCryptKeys))
return false; return false;
@ -165,11 +161,6 @@ bool CAccountConnector::__AuthState_Process()
if (!__AnalyzePacket(HEADER_GC_AUTH_SUCCESS, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthSuccess)) if (!__AnalyzePacket(HEADER_GC_AUTH_SUCCESS, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthSuccess))
return true; return true;
#ifdef USE_OPENID
if (!__AnalyzePacket(HEADER_GC_AUTH_SUCCESS_OPENID, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthSuccess_OpenID))
return true;
#endif /* USE_OPENID */
if (!__AnalyzePacket(HEADER_GC_LOGIN_FAILURE, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthFailure)) if (!__AnalyzePacket(HEADER_GC_LOGIN_FAILURE, sizeof(TPacketGCAuthSuccess), &CAccountConnector::__AuthState_RecvAuthFailure))
return true; return true;
@ -188,7 +179,7 @@ bool CAccountConnector::__AuthState_Process()
if (!__AnalyzePacket(HEADER_GC_PANAMA_PACK, sizeof(TPacketGCPanamaPack), &CAccountConnector::__AuthState_RecvPanamaPack)) if (!__AnalyzePacket(HEADER_GC_PANAMA_PACK, sizeof(TPacketGCPanamaPack), &CAccountConnector::__AuthState_RecvPanamaPack))
return false; return false;
// TODO : 차후 서버와 동일하게 가변길이 data serialize & deserialize 작업해야 한다. // TODO : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> data serialize & deserialize <20>۾<EFBFBD><DBBE>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_KEYS, &CAccountConnector::__AuthState_RecvHybridCryptKeys)) if (!__AnalyzeVarSizePacket(HEADER_GC_HYBRIDCRYPT_KEYS, &CAccountConnector::__AuthState_RecvHybridCryptKeys))
return false; return false;
@ -217,37 +208,6 @@ bool CAccountConnector::__AuthState_RecvPhase()
} }
else if (kPacketPhase.phase == PHASE_AUTH) else if (kPacketPhase.phase == PHASE_AUTH)
{ {
#ifdef USE_OPENID
if (!openid_test)
{
//2012.07.19 OpenID : 김용욱
//Ongoing : 오픈 아이디 경우-> TPacketCGLogin5
//클라가 가지고 있는 인증키만을 서버에 보내도록.
//const char* tempAuthKey = "d4025bc1f752b64fe5d51ae575ec4730"; //하드코딩 길이 32
TPacketCGLogin5 LoginPacket;
LoginPacket.header = HEADER_CG_LOGIN5_OPENID;
strncpy(LoginPacket.authKey, LocaleService_GetOpenIDAuthKey(), OPENID_AUTHKEY_LEN);
LoginPacket.authKey[OPENID_AUTHKEY_LEN] = '\0';
for (DWORD i = 0; i < 4; ++i)
LoginPacket.adwClientKey[i] = g_adwEncryptKey[i];
if (!Send(sizeof(LoginPacket), &LoginPacket))
{
Tracen(" CAccountConnector::__AuthState_RecvPhase - SendLogin5 Error");
return false;
}
if (!SendSequence())
{
return false;
}
}
else
{
TPacketCGLogin3 LoginPacket; TPacketCGLogin3 LoginPacket;
LoginPacket.header = HEADER_CG_LOGIN3; LoginPacket.header = HEADER_CG_LOGIN3;
@ -256,7 +216,7 @@ bool CAccountConnector::__AuthState_RecvPhase()
LoginPacket.name[ID_MAX_NUM] = '\0'; LoginPacket.name[ID_MAX_NUM] = '\0';
LoginPacket.pwd[PASS_MAX_NUM] = '\0'; LoginPacket.pwd[PASS_MAX_NUM] = '\0';
// 비밀번호를 메모리에 계속 갖고 있는 문제가 있어서, 사용 즉시 날리는 것으로 변경 // <20><>й<EFBFBD>ȣ<EFBFBD><C8A3> <20>޸𸮿<DEB8> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־, <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ClearLoginInfo(); ClearLoginInfo();
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.ClearLoginInfo(); rkNetStream.ClearLoginInfo();
@ -276,38 +236,6 @@ bool CAccountConnector::__AuthState_RecvPhase()
{ {
return false; return false;
} }
}
#else /* USE_OPENID */
TPacketCGLogin3 LoginPacket;
LoginPacket.header = HEADER_CG_LOGIN3;
strncpy(LoginPacket.name, m_strID.c_str(), ID_MAX_NUM);
strncpy(LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM);
LoginPacket.name[ID_MAX_NUM] = '\0';
LoginPacket.pwd[PASS_MAX_NUM] = '\0';
// 비밀번호를 메모리에 계속 갖고 있는 문제가 있어서, 사용 즉시 날리는 것으로 변경
ClearLoginInfo();
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.ClearLoginInfo();
m_strPassword = "";
for (DWORD i = 0; i < 4; ++i)
LoginPacket.adwClientKey[i] = g_adwEncryptKey[i];
if (!Send(sizeof(LoginPacket), &LoginPacket))
{
Tracen(" CAccountConnector::__AuthState_RecvPhase - SendLogin3 Error");
return false;
}
if (!SendSequence())
{
return false;
}
#endif /* USE_OPENID */
__AuthState_Set(); __AuthState_Set();
} }
@ -437,37 +365,6 @@ bool CAccountConnector::__AuthState_RecvAuthSuccess()
return true; return true;
} }
#ifdef USE_OPENID
bool CAccountConnector::__AuthState_RecvAuthSuccess_OpenID()
{
TPacketGCAuthSuccessOpenID kAuthSuccessOpenIDPacket;
if (!Recv(sizeof(kAuthSuccessOpenIDPacket), &kAuthSuccessOpenIDPacket))
return false;
if (!kAuthSuccessOpenIDPacket.bResult)
{
if (m_poHandler)
PyCallClassMemberFunc(m_poHandler, "OnLoginFailure", Py_BuildValue("(s)", "BESAMEKEY"));
}
else
{
DWORD dwPanamaKey = kAuthSuccessOpenIDPacket.dwLoginKey ^ g_adwEncryptKey[0] ^ g_adwEncryptKey[1] ^ g_adwEncryptKey[2] ^ g_adwEncryptKey[3];
CEterPackManager::instance().DecryptPackIV(dwPanamaKey);
CPythonNetworkStream & rkNet = CPythonNetworkStream::Instance();
rkNet.SetLoginInfo(kAuthSuccessOpenIDPacket.login, "0000"); //OpenID 인증 과정에서 비밀번호는 사용되지 않는다.
rkNet.SetLoginKey(kAuthSuccessOpenIDPacket.dwLoginKey);
rkNet.Connect(m_strAddr.c_str(), m_iPort);
}
Disconnect();
__OfflineState_Set();
return true;
}
#endif /* USE_OPENID */
bool CAccountConnector::__AuthState_RecvAuthFailure() bool CAccountConnector::__AuthState_RecvAuthFailure()
{ {
TPacketGCLoginFailure packet_failure; TPacketGCLoginFailure packet_failure;
@ -593,7 +490,7 @@ void CAccountConnector::OnConnectSuccess()
void CAccountConnector::OnRemoteDisconnect() void CAccountConnector::OnRemoteDisconnect()
{ {
// Matrix Card Number 를 보내 놓았는데 close 되면 프로그램을 종료 한다. // Matrix Card Number <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ҵµ<D2B4> close <20>Ǹ<EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if (m_isWaitKey) if (m_isWaitKey)
{ {
if (m_poHandler) if (m_poHandler)

View File

@ -52,9 +52,6 @@ class CAccountConnector : public CNetworkStream, public CSingleton<CAccountConne
bool __AuthState_RecvPing(); bool __AuthState_RecvPing();
bool __AuthState_SendPong(); bool __AuthState_SendPong();
bool __AuthState_RecvAuthSuccess(); bool __AuthState_RecvAuthSuccess();
#ifdef USE_OPENID
bool __AuthState_RecvAuthSuccess_OpenID();
#endif /* USE_OPENID */
bool __AuthState_RecvAuthFailure(); bool __AuthState_RecvAuthFailure();
bool __AuthState_RecvChinaMatrixCard(); bool __AuthState_RecvChinaMatrixCard();
bool __AuthState_RecvRunupMatrixQuiz(); bool __AuthState_RecvRunupMatrixQuiz();
@ -64,8 +61,8 @@ class CAccountConnector : public CNetworkStream, public CSingleton<CAccountConne
bool __AuthState_RecvHybridCryptSDB(int VarSize); bool __AuthState_RecvHybridCryptSDB(int VarSize);
bool __AnalyzePacket(UINT uHeader, UINT uPacketSize, bool (CAccountConnector::*pfnDispatchPacket)()); bool __AnalyzePacket(UINT uHeader, UINT uPacketSize, bool (CAccountConnector::*pfnDispatchPacket)());
// TODO: 지금 현재는 임시다. header뒤에 size 4byte가 무조건 온다는 가정임. // TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>ӽô<D3BD>. header<65>ڿ<EFBFBD> size 4byte<74><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´ٴ<C2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 제대로 하려면 Packet System Refactoring해야 한다. // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> Packet System Refactoring<6E>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
bool __AnalyzeVarSizePacket(UINT uHeader, bool (CAccountConnector::*pfnDispatchPacket)(int)); bool __AnalyzeVarSizePacket(UINT uHeader, bool (CAccountConnector::*pfnDispatchPacket)(int));
protected: protected:

View File

@ -399,23 +399,3 @@ int LocaleService_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, si
return strnicmp( szStringLeft, szStringRight, sizeLength ); return strnicmp( szStringLeft, szStringRight, sizeLength );
} }
#endif #endif
#ifdef USE_OPENID
std::string __OPENID_AUTH_KEY_STRING__;
int openid_test = 0;
void LocaleService_SetOpenIDAuthKey(const char *authKey)
{
__OPENID_AUTH_KEY_STRING__ = authKey;
return;
}
const char* LocaleService_GetOpenIDAuthKey()
{
return __OPENID_AUTH_KEY_STRING__.c_str();
}
#endif /* USE_OPENID */

View File

@ -33,8 +33,3 @@ int LocaleService_GetSkillPower(unsigned level);
void LocaleService_SetCHEONMA(bool isEnable); void LocaleService_SetCHEONMA(bool isEnable);
bool LocaleService_IsCHEONMA(); bool LocaleService_IsCHEONMA();
// END_OF_CHEONMA // END_OF_CHEONMA
#ifdef USE_OPENID
void LocaleService_SetOpenIDAuthKey(const char *authKey);
const char* LocaleService_GetOpenIDAuthKey();
#endif

View File

@ -4,18 +4,18 @@
#include "Hackshield.h" #include "Hackshield.h"
#include METIN2HS_INCLUDE_ANTICPXSVR #include METIN2HS_INCLUDE_ANTICPXSVR
#else #else
#pragma pack(push) //기존 alignment 저장 #pragma pack(push) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> alignment <20><><EFBFBD><EFBFBD>
#pragma pack(8) #pragma pack(8)
#define ANTICPX_TRANS_BUFFER_MAX 400 #define ANTICPX_TRANS_BUFFER_MAX 400
typedef struct _AHNHS_TRANS_BUFFER typedef struct _AHNHS_TRANS_BUFFER
{ {
unsigned char byBuffer[ANTICPX_TRANS_BUFFER_MAX/* 송수신 패킷의 최대 크기 */]; unsigned char byBuffer[ANTICPX_TRANS_BUFFER_MAX/* <EFBFBD>ۼ<EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ִ<EFBFBD> ũ<><C5A9> */];
unsigned short nLength; unsigned short nLength;
} AHNHS_TRANS_BUFFER, *PAHNHS_TRANS_BUFFER; } AHNHS_TRANS_BUFFER, *PAHNHS_TRANS_BUFFER;
#pragma pack(pop) // 기존 alignment 복구. #pragma pack(pop) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> alignment <20><><EFBFBD><EFBFBD>.
#endif /* !USE_AHNLAB_HACKSHIELD */ #endif /* !USE_AHNLAB_HACKSHIELD */
#include "../gamelib/RaceData.h" #include "../gamelib/RaceData.h"
@ -30,8 +30,8 @@ enum
HEADER_CG_LOGIN = 1, HEADER_CG_LOGIN = 1,
HEADER_CG_ATTACK = 2, HEADER_CG_ATTACK = 2,
HEADER_CG_CHAT = 3, HEADER_CG_CHAT = 3,
HEADER_CG_PLAYER_CREATE = 4, // 새로운 플래이어를 생성 HEADER_CG_PLAYER_CREATE = 4, // <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20><><EFBFBD><EFBFBD>
HEADER_CG_PLAYER_DESTROY = 5, // 플래이어를 삭제. HEADER_CG_PLAYER_DESTROY = 5, // <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD>.
HEADER_CG_PLAYER_SELECT = 6, HEADER_CG_PLAYER_SELECT = 6,
HEADER_CG_CHARACTER_MOVE = 7, HEADER_CG_CHARACTER_MOVE = 7,
HEADER_CG_SYNC_POSITION = 8, HEADER_CG_SYNC_POSITION = 8,
@ -95,8 +95,8 @@ enum
HEADER_CG_MESSENGER = 67, HEADER_CG_MESSENGER = 67,
//HEADER_BLANK68 = 68, //HEADER_BLANK68 = 68,
HEADER_CG_MALL_CHECKOUT = 69, HEADER_CG_MALL_CHECKOUT = 69,
HEADER_CG_SAFEBOX_CHECKIN = 70, // 아이템을 창고에 넣는다. HEADER_CG_SAFEBOX_CHECKIN = 70, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
HEADER_CG_SAFEBOX_CHECKOUT = 71, // 아이템을 창고로 부터 빼온다. HEADER_CG_SAFEBOX_CHECKOUT = 71, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
HEADER_CG_PARTY_INVITE = 72, HEADER_CG_PARTY_INVITE = 72,
HEADER_CG_PARTY_INVITE_ANSWER = 73, HEADER_CG_PARTY_INVITE_ANSWER = 73,
HEADER_CG_PARTY_REMOVE = 74, HEADER_CG_PARTY_REMOVE = 74,
@ -144,7 +144,6 @@ enum
HEADER_CG_GUILD_SYMBOL_CRC = 113, HEADER_CG_GUILD_SYMBOL_CRC = 113,
HEADER_CG_SCRIPT_SELECT_ITEM = 114, HEADER_CG_SCRIPT_SELECT_ITEM = 114,
HEADER_CG_LOGIN4 = 115, HEADER_CG_LOGIN4 = 115,
HEADER_CG_LOGIN5_OPENID = 116, //OpenID : 실행시 받은 인증키를 서버에 보냄.
HEADER_CG_RUNUP_MATRIX_ANSWER = 201, HEADER_CG_RUNUP_MATRIX_ANSWER = 201,
HEADER_CG_NEWCIBN_PASSPOD_ANSWER = 202, HEADER_CG_NEWCIBN_PASSPOD_ANSWER = 202,
@ -188,17 +187,17 @@ enum
HEADER_GC_CHANGE_SPEED = 18, HEADER_GC_CHANGE_SPEED = 18,
HEADER_GC_CHARACTER_UPDATE = 19, HEADER_GC_CHARACTER_UPDATE = 19,
#if defined(GAIDEN) #if defined(GAIDEN)
HEADER_GC_ITEM_DEL = 20, // 아이템 창에 추가 HEADER_GC_ITEM_DEL = 20, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20>߰<EFBFBD>
HEADER_GC_ITEM_SET = 21, // 아이템 창에 추가 HEADER_GC_ITEM_SET = 21, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20>߰<EFBFBD>
#else #else
HEADER_GC_ITEM_SET = 20, // 아이템 창에 추가 HEADER_GC_ITEM_SET = 20, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20>߰<EFBFBD>
HEADER_GC_ITEM_SET2 = 21, // 아이템 창에 추가 HEADER_GC_ITEM_SET2 = 21, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20>߰<EFBFBD>
#endif #endif
HEADER_GC_ITEM_USE = 22, // 아이템 사용 (주위 사람들에게 보여주기 위해) HEADER_GC_ITEM_USE = 22, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E9BFA1> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD>)
HEADER_GC_ITEM_DROP = 23, // 아이템 버리기 HEADER_GC_ITEM_DROP = 23, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HEADER_GC_ITEM_UPDATE = 25, // 아이템 수치 업데이트 HEADER_GC_ITEM_UPDATE = 25, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
HEADER_GC_ITEM_GROUND_ADD = 26, // 바닥에 아이템 추가 HEADER_GC_ITEM_GROUND_ADD = 26, // <EFBFBD>ٴڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
HEADER_GC_ITEM_GROUND_DEL = 27, // 바닥에서 아이템 삭제 HEADER_GC_ITEM_GROUND_DEL = 27, // <EFBFBD>ٴڿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_GC_QUICKSLOT_ADD = 28, HEADER_GC_QUICKSLOT_ADD = 28,
HEADER_GC_QUICKSLOT_DEL = 29, HEADER_GC_QUICKSLOT_DEL = 29,
HEADER_GC_QUICKSLOT_SWAP = 30, HEADER_GC_QUICKSLOT_SWAP = 30,
@ -331,8 +330,6 @@ enum
HEADER_GC_HYBRIDCRYPT_SDB = 153, // SDB means Supplmentary Data Blocks HEADER_GC_HYBRIDCRYPT_SDB = 153, // SDB means Supplmentary Data Blocks
//HYBRID CRYPT //HYBRID CRYPT
HEADER_GC_AUTH_SUCCESS_OPENID = 154,
HEADER_GC_RUNUP_MATRIX_QUIZ = 201, HEADER_GC_RUNUP_MATRIX_QUIZ = 201,
HEADER_GC_NEWCIBN_PASSPOD_REQUEST = 202, HEADER_GC_NEWCIBN_PASSPOD_REQUEST = 202,
HEADER_GC_NEWCIBN_PASSPOD_FAILURE = 203, HEADER_GC_NEWCIBN_PASSPOD_FAILURE = 203,
@ -386,13 +383,13 @@ enum
PLAYER_PER_ACCOUNT3 = 3, PLAYER_PER_ACCOUNT3 = 3,
PLAYER_PER_ACCOUNT4 = 4, PLAYER_PER_ACCOUNT4 = 4,
PLAYER_ITEM_SLOT_MAX_NUM = 20, // 플래이어의 슬롯당 들어가는 갯수. PLAYER_ITEM_SLOT_MAX_NUM = 20, // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Դ<EFBFBD> <20><><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD>.
QUICKSLOT_MAX_LINE = 4, QUICKSLOT_MAX_LINE = 4,
QUICKSLOT_MAX_COUNT_PER_LINE = 8, // 클라이언트 임의 결정값 QUICKSLOT_MAX_COUNT_PER_LINE = 8, // Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QUICKSLOT_MAX_COUNT = QUICKSLOT_MAX_LINE * QUICKSLOT_MAX_COUNT_PER_LINE, QUICKSLOT_MAX_COUNT = QUICKSLOT_MAX_LINE * QUICKSLOT_MAX_COUNT_PER_LINE,
QUICKSLOT_MAX_NUM = 36, // 서버와 맞춰져 있는 값 QUICKSLOT_MAX_NUM = 36, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>
SHOP_HOST_ITEM_MAX_NUM = 40, SHOP_HOST_ITEM_MAX_NUM = 40,
@ -423,8 +420,6 @@ enum
WEAR_MAX_NUM = 11, WEAR_MAX_NUM = 11,
OPENID_AUTHKEY_LEN = 32,
SHOP_TAB_NAME_MAX = 32, SHOP_TAB_NAME_MAX = 32,
SHOP_TAB_COUNT_MAX = 3, SHOP_TAB_COUNT_MAX = 3,
}; };
@ -465,7 +460,7 @@ typedef struct packet_mark_idxlist
BYTE header; BYTE header;
DWORD bufSize; DWORD bufSize;
WORD count; WORD count;
//뒤에 size * (WORD + WORD)만큼 데이터 붙음 //<EFBFBD>ڿ<EFBFBD> size * (WORD + WORD)<29><>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
} TPacketGCMarkIDXList; } TPacketGCMarkIDXList;
typedef struct packet_mark_block typedef struct packet_mark_block
@ -474,7 +469,7 @@ typedef struct packet_mark_block
DWORD bufSize; DWORD bufSize;
BYTE imgIdx; BYTE imgIdx;
DWORD count; DWORD count;
// 뒤에 64 x 48 x 픽셀크기(4바이트) = 12288만큼 데이터 붙음 // <EFBFBD>ڿ<EFBFBD> 64 x 48 x <20>ȼ<EFBFBD>ũ<EFBFBD><C5A9>(4<><34><EFBFBD><EFBFBD>Ʈ) = 12288<38><38>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
} TPacketGCMarkBlock; } TPacketGCMarkBlock;
typedef struct command_symbol_upload typedef struct command_symbol_upload
@ -543,7 +538,7 @@ typedef struct command_login
char pwd[PASS_MAX_NUM + 1]; char pwd[PASS_MAX_NUM + 1];
} TPacketCGLogin; } TPacketCGLogin;
// start - 권한 서버 접속을 위한 패킷들 // start - <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6>
typedef struct command_login2 typedef struct command_login2
{ {
BYTE header; BYTE header;
@ -559,14 +554,7 @@ typedef struct command_login3
char pwd[PASS_MAX_NUM + 1]; char pwd[PASS_MAX_NUM + 1];
DWORD adwClientKey[4]; DWORD adwClientKey[4];
} TPacketCGLogin3; } TPacketCGLogin3;
// end - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6>
typedef struct command_login5
{
BYTE header;
char authKey[OPENID_AUTHKEY_LEN + 1];
DWORD adwClientKey[4];
} TPacketCGLogin5;
// end - 권한 서버 접속을 위한 패킷들
typedef struct command_direct_enter typedef struct command_direct_enter
{ {
@ -585,8 +573,8 @@ typedef struct command_player_select
typedef struct command_attack typedef struct command_attack
{ {
BYTE header; BYTE header;
BYTE bType; // 공격 유형 BYTE bType; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD dwVictimVID; // VID DWORD dwVictimVID; // <EFBFBD><EFBFBD> VID
BYTE bCRCMagicCubeProcPiece; BYTE bCRCMagicCubeProcPiece;
BYTE bCRCMagicCubeFilePiece; BYTE bCRCMagicCubeFilePiece;
} TPacketCGAttack; } TPacketCGAttack;
@ -1014,9 +1002,9 @@ typedef struct SShopItemTable
DWORD vnum; DWORD vnum;
BYTE count; BYTE count;
TItemPos pos; // PC 상점에만 이용 TItemPos pos; // PC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
DWORD price; // PC 상점에만 이용 DWORD price; // PC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
BYTE display_pos; // PC 상점에만 이용, 보일 위치. BYTE display_pos; // PC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ġ.
} TShopItemTable; } TShopItemTable;
typedef struct SPacketCGMyShop typedef struct SPacketCGMyShop
@ -1116,18 +1104,18 @@ typedef struct command_script_select_item
// From Server // From Server
enum EPhase enum EPhase
{ {
PHASE_CLOSE, // 끊기는 상태 (또는 끊기 전 상태) PHASE_CLOSE, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)
PHASE_HANDSHAKE, // 악수..;; PHASE_HANDSHAKE, // <EFBFBD>Ǽ<EFBFBD>..;;
PHASE_LOGIN, // 로그인 중 PHASE_LOGIN, // <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><>
PHASE_SELECT, // 캐릭터 선택 화면 PHASE_SELECT, // ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȭ<><C8AD>
PHASE_LOADING, // 선택 후 로딩 화면 PHASE_LOADING, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ε<EFBFBD> ȭ<><C8AD>
PHASE_GAME, // 게임 화면 PHASE_GAME, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><C8AD>
PHASE_DEAD, // 죽었을 때.. (게임 안에 있는 것일 수도..) PHASE_DEAD, // <EFBFBD>׾<EFBFBD><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20>ȿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..)
PHASE_DBCLIENT_CONNECTING, // 서버용 PHASE_DBCLIENT_CONNECTING, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PHASE_DBCLIENT, // 서버용 PHASE_DBCLIENT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PHASE_P2P, // 서버용 PHASE_P2P, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PHASE_AUTH, // 로그인 인증 용 PHASE_AUTH, // <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
}; };
typedef struct packet_phase typedef struct packet_phase
@ -1136,7 +1124,7 @@ typedef struct packet_phase
BYTE phase; BYTE phase;
} TPacketGCPhase; } TPacketGCPhase;
typedef struct packet_blank // 공백패킷. typedef struct packet_blank // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ.
{ {
BYTE header; BYTE header;
} TPacketGCBlank; } TPacketGCBlank;
@ -1273,7 +1261,7 @@ enum EPKModes
PK_MODE_MAX_NUM, PK_MODE_MAX_NUM,
}; };
// 2004.11.20.myevan.CRaceData::PART_MAX_NUM 사용안하게 수정 - 서버에서 사용하는것과 일치하지 않음 // 2004.11.20.myevan.CRaceData::PART_MAX_NUM <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ°Ͱ<C2B0> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
enum ECharacterEquipmentPart enum ECharacterEquipmentPart
{ {
CHR_EQUIPPART_ARMOR, CHR_EQUIPPART_ARMOR,
@ -1293,7 +1281,7 @@ typedef struct packet_char_additional_info
BYTE bEmpire; BYTE bEmpire;
DWORD dwGuildID; DWORD dwGuildID;
DWORD dwLevel; DWORD dwLevel;
short sAlignment; //선악치 short sAlignment; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ
BYTE bPKMode; BYTE bPKMode;
DWORD dwMountVnum; DWORD dwMountVnum;
} TPacketGCCharacterAdditionalInfo; } TPacketGCCharacterAdditionalInfo;
@ -1405,14 +1393,14 @@ typedef struct packet_GlobalTime
enum EChatType enum EChatType
{ {
CHAT_TYPE_TALKING, /* 그냥 채팅 */ CHAT_TYPE_TALKING, /* <EFBFBD>׳<EFBFBD> ä<><C3A4> */
CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */ CHAT_TYPE_INFO, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><>) */
CHAT_TYPE_NOTICE, /* 공지사항 */ CHAT_TYPE_NOTICE, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
CHAT_TYPE_PARTY, /* 파티말 */ CHAT_TYPE_PARTY, /* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> */
CHAT_TYPE_GUILD, /* 길드말 */ CHAT_TYPE_GUILD, /* <EFBFBD><EFBFBD> */
CHAT_TYPE_COMMAND, /* 명령 */ CHAT_TYPE_COMMAND, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
CHAT_TYPE_SHOUT, /* 외치기 */ CHAT_TYPE_SHOUT, /* <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> */
CHAT_TYPE_WHISPER, // 서버와는 연동되지 않는 Only Client Enum CHAT_TYPE_WHISPER, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> Only Client Enum
CHAT_TYPE_BIG_NOTICE, CHAT_TYPE_BIG_NOTICE,
CHAT_TYPE_MAX_NUM, CHAT_TYPE_MAX_NUM,
}; };
@ -1426,7 +1414,7 @@ typedef struct packet_chatting
BYTE bEmpire; BYTE bEmpire;
} TPacketGCChat; } TPacketGCChat;
typedef struct packet_whisper // 가변 패킷 typedef struct packet_whisper // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
{ {
BYTE bHeader; BYTE bHeader;
WORD wSize; WORD wSize;
@ -1513,57 +1501,57 @@ enum EPointTypes
POINT_MAX_HP, // 6 POINT_MAX_HP, // 6
POINT_SP, // 7 POINT_SP, // 7
POINT_MAX_SP, // 8 POINT_MAX_SP, // 8
POINT_STAMINA, // 9 스테미너 POINT_STAMINA, // 9 <EFBFBD><EFBFBD><EFBFBD>׹̳<EFBFBD>
POINT_MAX_STAMINA, // 10 최대 스테미너 POINT_MAX_STAMINA, // 10 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD>׹̳<D7B9>
POINT_GOLD, // 11 POINT_GOLD, // 11
POINT_ST, // 12 근력 POINT_ST, // 12 <EFBFBD>ٷ<EFBFBD>
POINT_HT, // 13 체력 POINT_HT, // 13 ü<EFBFBD><EFBFBD>
POINT_DX, // 14 민첩성 POINT_DX, // 14 <EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD>
POINT_IQ, // 15 정신력 POINT_IQ, // 15 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD>
POINT_ATT_POWER, // 16 공격력 POINT_ATT_POWER, // 16 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>
POINT_ATT_SPEED, // 17 공격속도 POINT_ATT_SPEED, // 17 <EFBFBD><EFBFBD><EFBFBD>ݼӵ<EFBFBD>
POINT_EVADE_RATE, // 18 회피율 POINT_EVADE_RATE, // 18 ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_MOV_SPEED, // 19 이동속도 POINT_MOV_SPEED, // 19 <EFBFBD>̵<EFBFBD><EFBFBD>ӵ<EFBFBD>
POINT_DEF_GRADE, // 20 방어등급 POINT_DEF_GRADE, // 20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_CASTING_SPEED, // 21 주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임 POINT_CASTING_SPEED, // 21 <EFBFBD>ֹ<EFBFBD><EFBFBD>ӵ<EFBFBD> (<28><>ٿ<EFBFBD>Ÿ<EFBFBD><C5B8>*100) / (100 + <20>̰<EFBFBD>) = <20><><EFBFBD><EFBFBD> <20><>ٿ<EFBFBD> Ÿ<><C5B8>
POINT_MAGIC_ATT_GRADE, // 22 마법공격력 POINT_MAGIC_ATT_GRADE, // 22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>
POINT_MAGIC_DEF_GRADE, // 23 마법방어력 POINT_MAGIC_DEF_GRADE, // 23 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_EMPIRE_POINT, // 24 제국점수 POINT_EMPIRE_POINT, // 24 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_LEVEL_STEP, // 25 한 레벨에서의 단계.. (1 2 3 될 때 보상, 4 되면 레벨 업) POINT_LEVEL_STEP, // 25 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ<EFBFBD>.. (1 2 3 <20><> <20><> <20><><EFBFBD><EFBFBD>, 4 <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>)
POINT_STAT, // 26 능력치 올릴 수 있는 개수 POINT_STAT, // 26 <EFBFBD>ɷ<EFBFBD>ġ <20>ø<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_SUB_SKILL, // 27 보조 스킬 포인트 POINT_SUB_SKILL, // 27 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ
POINT_SKILL, // 28 액티브 스킬 포인트 POINT_SKILL, // 28 <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ
// POINT_SKILL_PASV, // 27 패시브 기술 올릴 수 있는 개수 // POINT_SKILL_PASV, // 27 <EFBFBD>нú<EFBFBD> <20><><EFBFBD> <20>ø<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
// POINT_SKILL_ACTIVE, // 28 액티브 스킬 포인트 // POINT_SKILL_ACTIVE, // 28 <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ
POINT_MIN_ATK, // 29 최소 파괴력 POINT_MIN_ATK, // 29 <EFBFBD>ּ<EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD>
POINT_MAX_ATK, // 30 최대 파괴력 POINT_MAX_ATK, // 30 <EFBFBD>ִ<EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD>
POINT_PLAYTIME, // 31 플레이시간 POINT_PLAYTIME, // 31 <EFBFBD>÷<EFBFBD><EFBFBD>̽ð<EFBFBD>
POINT_HP_REGEN, // 32 HP 회복률 POINT_HP_REGEN, // 32 HP ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_SP_REGEN, // 33 SP 회복률 POINT_SP_REGEN, // 33 SP ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_BOW_DISTANCE, // 34 활 사정거리 증가치 (meter) POINT_BOW_DISTANCE, // 34 Ȱ <20><><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>ġ (meter)
POINT_HP_RECOVERY, // 35 체력 회복 증가량 POINT_HP_RECOVERY, // 35 ü<EFBFBD><EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_SP_RECOVERY, // 36 정신력 회복 증가량 POINT_SP_RECOVERY, // 36 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_POISON_PCT, // 37 독 확률 POINT_POISON_PCT, // 37 <EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_STUN_PCT, // 38 기절 확률 POINT_STUN_PCT, // 38 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_SLOW_PCT, // 39 슬로우 확률 POINT_SLOW_PCT, // 39 <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> Ȯ<><C8AE>
POINT_CRITICAL_PCT, // 40 크리티컬 확률 POINT_CRITICAL_PCT, // 40 ũ<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_PENETRATE_PCT, // 41 관통타격 확률 POINT_PENETRATE_PCT, // 41 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_CURSE_PCT, // 42 저주 확률 POINT_CURSE_PCT, // 42 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
POINT_ATTBONUS_HUMAN, // 43 인간에게 강함 POINT_ATTBONUS_HUMAN, // 43 <EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_ANIMAL, // 44 동물에게 데미지 % 증가 POINT_ATTBONUS_ANIMAL, // 44 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_ORC, // 45 웅귀에게 데미지 % 증가 POINT_ATTBONUS_ORC, // 45 <EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_MILGYO, // 46 밀교에게 데미지 % 증가 POINT_ATTBONUS_MILGYO, // 46 <EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_UNDEAD, // 47 시체에게 데미지 % 증가 POINT_ATTBONUS_UNDEAD, // 47 <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_DEVIL, // 48 마귀(악마)에게 데미지 % 증가 POINT_ATTBONUS_DEVIL, // 48 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>Ǹ<EFBFBD>)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> % <20><><EFBFBD><EFBFBD>
POINT_ATTBONUS_INSECT, // 49 벌레족 POINT_ATTBONUS_INSECT, // 49 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_FIRE, // 50 화염족 POINT_ATTBONUS_FIRE, // 50 ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_ICE, // 51 빙설족 POINT_ATTBONUS_ICE, // 51 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_DESERT, // 52 사막족 POINT_ATTBONUS_DESERT, // 52 <EFBFBD><EFBFBD><EFBFBD>
POINT_ATTBONUS_UNUSED0, // 53 UNUSED0 POINT_ATTBONUS_UNUSED0, // 53 UNUSED0
POINT_ATTBONUS_UNUSED1, // 54 UNUSED1 POINT_ATTBONUS_UNUSED1, // 54 UNUSED1
POINT_ATTBONUS_UNUSED2, // 55 UNUSED2 POINT_ATTBONUS_UNUSED2, // 55 UNUSED2
@ -1575,42 +1563,42 @@ enum EPointTypes
POINT_ATTBONUS_UNUSED8, // 61 UNUSED8 POINT_ATTBONUS_UNUSED8, // 61 UNUSED8
POINT_ATTBONUS_UNUSED9, // 62 UNUSED9 POINT_ATTBONUS_UNUSED9, // 62 UNUSED9
POINT_STEAL_HP, // 63 생명력 흡수 POINT_STEAL_HP, // 63 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_STEAL_SP, // 64 정신력 흡수 POINT_STEAL_SP, // 64 <EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_MANA_BURN_PCT, // 65 마나 번 POINT_MANA_BURN_PCT, // 65 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
/// 피해시 보너스 /// /// <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> ///
POINT_DAMAGE_SP_RECOVER, // 66 공격당할 시 정신력 회복 확률 POINT_DAMAGE_SP_RECOVER, // 66 <EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ŷ<EFBFBD> ȸ<><C8B8> Ȯ<><C8AE>
POINT_BLOCK, // 67 블럭율 POINT_BLOCK, // 67 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_DODGE, // 68 회피율 POINT_DODGE, // 68 ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_RESIST_SWORD, // 69 POINT_RESIST_SWORD, // 69
POINT_RESIST_TWOHAND, // 70 POINT_RESIST_TWOHAND, // 70
POINT_RESIST_DAGGER, // 71 POINT_RESIST_DAGGER, // 71
POINT_RESIST_BELL, // 72 POINT_RESIST_BELL, // 72
POINT_RESIST_FAN, // 73 POINT_RESIST_FAN, // 73
POINT_RESIST_BOW, // 74 화살 저항 : 대미지 감소 POINT_RESIST_BOW, // 74 ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_FIRE, // 75 화염 저항 : 화염공격에 대한 대미지 감소 POINT_RESIST_FIRE, // 75 ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ȭ<><C8AD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_ELEC, // 76 전기 저항 : 전기공격에 대한 대미지 감소 POINT_RESIST_ELEC, // 76 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_MAGIC, // 77 술법 저항 : 모든술법에 대한 대미지 감소 POINT_RESIST_MAGIC, // 77 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_RESIST_WIND, // 78 바람 저항 : 바람공격에 대한 대미지 감소 POINT_RESIST_WIND, // 78 <EFBFBD>ٶ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
POINT_REFLECT_MELEE, // 79 공격 반사 POINT_REFLECT_MELEE, // 79 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݻ<EFBFBD>
/// 특수 피해시 /// /// Ư<EFBFBD><EFBFBD> <20><><EFBFBD>ؽ<EFBFBD> ///
POINT_REFLECT_CURSE, // 80 저주 반사 POINT_REFLECT_CURSE, // 80 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݻ<EFBFBD>
POINT_POISON_REDUCE, // 81 독데미지 감소 POINT_POISON_REDUCE, // 81 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// 적 소멸시 /// /// <EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8> ///
POINT_KILL_SP_RECOVER, // 82 적 소멸시 MP 회복 POINT_KILL_SP_RECOVER, // 82 <EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8> MP ȸ<><C8B8>
POINT_EXP_DOUBLE_BONUS, // 83 POINT_EXP_DOUBLE_BONUS, // 83
POINT_GOLD_DOUBLE_BONUS, // 84 POINT_GOLD_DOUBLE_BONUS, // 84
POINT_ITEM_DROP_BONUS, // 85 POINT_ITEM_DROP_BONUS, // 85
/// 회복 관련 /// /// ȸ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ///
POINT_POTION_BONUS, // 86 POINT_POTION_BONUS, // 86
POINT_KILL_HP_RECOVER, // 87 POINT_KILL_HP_RECOVER, // 87
@ -1635,32 +1623,32 @@ enum EPointTypes
POINT_STAT_RESET_COUNT = 112, POINT_STAT_RESET_COUNT = 112,
POINT_HORSE_SKILL = 113, POINT_HORSE_SKILL = 113,
POINT_MALL_ATTBONUS, // 114 공격력 +x% POINT_MALL_ATTBONUS, // 114 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> +x%
POINT_MALL_DEFBONUS, // 115 방어력 +x% POINT_MALL_DEFBONUS, // 115 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
POINT_MALL_EXPBONUS, // 116 경험치 +x% POINT_MALL_EXPBONUS, // 116 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ +x%
POINT_MALL_ITEMBONUS, // 117 아이템 드롭율 x/10배 POINT_MALL_ITEMBONUS, // 117 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> x/10<31><30>
POINT_MALL_GOLDBONUS, // 118 돈 드롭율 x/10배 POINT_MALL_GOLDBONUS, // 118 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> x/10<31><30>
POINT_MAX_HP_PCT, // 119 최대생명력 +x% POINT_MAX_HP_PCT, // 119 <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
POINT_MAX_SP_PCT, // 120 최대정신력 +x% POINT_MAX_SP_PCT, // 120 <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD> +x%
POINT_SKILL_DAMAGE_BONUS, // 121 스킬 데미지 *(100+x)% POINT_SKILL_DAMAGE_BONUS, // 121 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *(100+x)%
POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 평타 데미지 *(100+x)% POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *(100+x)%
POINT_SKILL_DEFEND_BONUS, // 123 스킬 방어 데미지 POINT_SKILL_DEFEND_BONUS, // 123 <EFBFBD><EFBFBD>ų <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_NORMAL_HIT_DEFEND_BONUS, // 124 평타 방어 데미지 POINT_NORMAL_HIT_DEFEND_BONUS, // 124 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POINT_PC_BANG_EXP_BONUS, // 125 POINT_PC_BANG_EXP_BONUS, // 125
POINT_PC_BANG_DROP_BONUS, // 126 PC방 전용 드롭률 보너스 POINT_PC_BANG_DROP_BONUS, // 126 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ӷ<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD>
POINT_ENERGY = 128, // 128 기력 POINT_ENERGY = 128, // 128 <EFBFBD><EFBFBD><EFBFBD>
// 기력 ui 용. // <EFBFBD><EFBFBD><EFBFBD> ui <20><>.
// 이렇게 하고 싶지 않았지만, // <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>,
// uiTaskBar에서는 affect에 접근할 수 없고, // uiTaskBar<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> affect<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>,
// 더구나 클라리언트에서는 blend_affect는 관리하지 않아, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<>󸮾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> blend_affect<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾ<EFBFBD>,
// 임시로 이렇게 둔다. // <EFBFBD>ӽ÷<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>д<EFBFBD>.
POINT_ENERGY_END_TIME = 129, // 129 기력 종료 시간 POINT_ENERGY_END_TIME = 129, // 129 <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
// 클라이언트 포인트 // Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>Ʈ
POINT_MIN_WEP = 200, POINT_MIN_WEP = 200,
POINT_MAX_WEP, POINT_MAX_WEP,
POINT_MIN_MAGIC_WEP, POINT_MIN_MAGIC_WEP,
@ -1668,7 +1656,7 @@ enum EPointTypes
POINT_HIT_RATE, POINT_HIT_RATE,
//POINT_MAX_NUM = 255,=>stdafx.h / //POINT_MAX_NUM = 255,=>stdafx.h <EFBFBD><EFBFBD>/
}; };
typedef struct packet_points typedef struct packet_points
@ -1684,8 +1672,8 @@ typedef struct packet_point_change
DWORD dwVID; DWORD dwVID;
BYTE Type; BYTE Type;
long amount; // 바뀐 값 long amount; // <EFBFBD>ٲ<EFBFBD> <20><>
long value; // 현재 값 long value; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
} TPacketGCPointChange; } TPacketGCPointChange;
typedef struct packet_motion typedef struct packet_motion
@ -1723,7 +1711,7 @@ typedef struct packet_set_item
BYTE pos; BYTE pos;
DWORD vnum; DWORD vnum;
BYTE count; BYTE count;
DWORD flags; // 플래그 추가 DWORD flags; // <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
} TPacketGCItemSet; } TPacketGCItemSet;
@ -1750,8 +1738,8 @@ typedef struct packet_set_item2
TItemPos Cell; TItemPos Cell;
DWORD vnum; DWORD vnum;
BYTE count; BYTE count;
DWORD flags; // 플래그 추가 DWORD flags; // <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
DWORD anti_flags; // 플래그 추가 DWORD anti_flags; // <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
bool highlight; bool highlight;
long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM]; TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_SLOT_MAX_NUM];
@ -1832,7 +1820,7 @@ typedef struct packet_shop_start
struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM]; struct packet_shop_item items[SHOP_HOST_ITEM_MAX_NUM];
} TPacketGCShopStart; } TPacketGCShopStart;
typedef struct packet_shop_start_ex // 다음에 TSubPacketShopTab* shop_tabs 이 따라옴. typedef struct packet_shop_start_ex // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TSubPacketShopTab* shop_tabs <20><> <20><><EFBFBD><EFBFBD><EFBFBD>.
{ {
typedef struct sub_packet_shop_tab typedef struct sub_packet_shop_tab
{ {
@ -1975,12 +1963,12 @@ typedef struct packet_move
enum enum
{ {
QUEST_SEND_IS_BEGIN = 1 << 0, QUEST_SEND_IS_BEGIN = 1 << 0,
QUEST_SEND_TITLE = 1 << 1, // 28자 까지 QUEST_SEND_TITLE = 1 << 1, // 28<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
QUEST_SEND_CLOCK_NAME = 1 << 2, // 16자 까지 QUEST_SEND_CLOCK_NAME = 1 << 2, // 16<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
QUEST_SEND_CLOCK_VALUE = 1 << 3, QUEST_SEND_CLOCK_VALUE = 1 << 3,
QUEST_SEND_COUNTER_NAME = 1 << 4, // 16자 까지 QUEST_SEND_COUNTER_NAME = 1 << 4, // 16<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
QUEST_SEND_COUNTER_VALUE = 1 << 5, QUEST_SEND_COUNTER_VALUE = 1 << 5,
QUEST_SEND_ICON_FILE = 1 << 6, // 24자 까지 QUEST_SEND_ICON_FILE = 1 << 6, // 24<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}; };
typedef struct packet_quest_info typedef struct packet_quest_info
@ -2003,8 +1991,8 @@ typedef struct packet_attack
{ {
BYTE header; BYTE header;
DWORD dwVID; DWORD dwVID;
DWORD dwVictimVID; // VID DWORD dwVictimVID; // <EFBFBD><EFBFBD> VID
BYTE bType; // 공격 유형 BYTE bType; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
} TPacketGCAttack; } TPacketGCAttack;
typedef struct packet_c2c typedef struct packet_c2c
@ -2074,7 +2062,7 @@ enum EPVPModes
typedef struct packet_duel_start typedef struct packet_duel_start
{ {
BYTE header ; BYTE header ;
WORD wSize ; // DWORD가 몇개? 개수 = (wSize - sizeof(TPacketGCPVPList)) / 4 WORD wSize ; // DWORD<EFBFBD><EFBFBD> <20>? <20><><EFBFBD><EFBFBD> = (wSize - sizeof(TPacketGCPVPList)) / 4
} TPacketGCDuelStart ; } TPacketGCDuelStart ;
typedef struct packet_pvp typedef struct packet_pvp
@ -2230,7 +2218,7 @@ enum
typedef struct packet_guild_sub_grade typedef struct packet_guild_sub_grade
{ {
char grade_name[GUILD_GRADE_NAME_MAX_LEN+1]; // 8+1 길드장, 길드원 등의 이름 char grade_name[GUILD_GRADE_NAME_MAX_LEN+1]; // 8+1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>
BYTE auth_flag; BYTE auth_flag;
} TPacketGCGuildSubGrade; } TPacketGCGuildSubGrade;
@ -2271,7 +2259,7 @@ enum EGuildWarState
GUILD_WAR_ON_WAR, GUILD_WAR_ON_WAR,
GUILD_WAR_END, GUILD_WAR_END,
GUILD_WAR_DURATION = 2*60*60, // 2시간 GUILD_WAR_DURATION = 2*60*60, // 2<EFBFBD>ð<EFBFBD>
}; };
typedef struct packet_guild_war typedef struct packet_guild_war
@ -2347,8 +2335,8 @@ typedef struct SRefineTable
DWORD src_vnum; DWORD src_vnum;
DWORD result_vnum; DWORD result_vnum;
BYTE material_count; BYTE material_count;
int cost; // 소요 비용 int cost; // <EFBFBD>ҿ<EFBFBD> <20><><EFBFBD>
int prob; // 확률 int prob; // Ȯ<EFBFBD><EFBFBD>
TMaterial materials[REFINE_MATERIAL_MAX_NUM]; TMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TRefineTable; } TRefineTable;
@ -2383,17 +2371,17 @@ enum SPECIAL_EFFECT
SE_SUCCESS, SE_SUCCESS,
SE_FAIL, SE_FAIL,
SE_FR_SUCCESS, SE_FR_SUCCESS,
SE_LEVELUP_ON_14_FOR_GERMANY, //레벨업 14일때 ( 독일전용 ) SE_LEVELUP_ON_14_FOR_GERMANY, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 14<31>϶<EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
SE_LEVELUP_UNDER_15_FOR_GERMANY,//레벨업 15일때 ( 독일전용 ) SE_LEVELUP_UNDER_15_FOR_GERMANY,//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 15<31>϶<EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
SE_PERCENT_DAMAGE1, SE_PERCENT_DAMAGE1,
SE_PERCENT_DAMAGE2, SE_PERCENT_DAMAGE2,
SE_PERCENT_DAMAGE3, SE_PERCENT_DAMAGE3,
SE_AUTO_HPUP, SE_AUTO_HPUP,
SE_AUTO_SPUP, SE_AUTO_SPUP,
SE_EQUIP_RAMADAN_RING, // 초승달의 반지를 착용하는 순간에 발동하는 이펙트 SE_EQUIP_RAMADAN_RING, // <EFBFBD>ʽ´<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
SE_EQUIP_HALLOWEEN_CANDY, // 할로윈 사탕을 착용(-_-;)한 순간에 발동하는 이펙트 SE_EQUIP_HALLOWEEN_CANDY, // <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(-_-;)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
SE_EQUIP_HAPPINESS_RING, // 크리스마스 행복의 반지를 착용하는 순간에 발동하는 이펙트 SE_EQUIP_HAPPINESS_RING, // ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
SE_EQUIP_LOVE_PENDANT, // 발렌타인 사랑의 팬던트(71145) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님) SE_EQUIP_LOVE_PENDANT, // <EFBFBD>߷<EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ(71145) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
}; };
typedef struct SPacketGCSpecialEffect typedef struct SPacketGCSpecialEffect
@ -2472,14 +2460,6 @@ typedef struct packet_auth_success
BYTE bResult; BYTE bResult;
} TPacketGCAuthSuccess; } TPacketGCAuthSuccess;
typedef struct packet_auth_success_openid
{
BYTE bHeader;
DWORD dwLoginKey;
BYTE bResult;
char login[ID_MAX_NUM + 1];
} TPacketGCAuthSuccessOpenID;
typedef struct packet_channel typedef struct packet_channel
{ {
BYTE header; BYTE header;
@ -2696,7 +2676,7 @@ typedef struct packet_hs_check_req
AHNHS_TRANS_BUFFER Req; AHNHS_TRANS_BUFFER Req;
} TPacketHSCheck; } TPacketHSCheck;
//NOTE : recv/send에 공통으로 생김, bPacketData의 내용만 바뀐다. //NOTE : recv/send<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, bPacketData<74><61> <20><><EFBFBD><20>ٲ<EFBFBD><D9B2>.
typedef struct packet_xtrap_verify typedef struct packet_xtrap_verify
{ {
BYTE bHeader; BYTE bHeader;
@ -2714,7 +2694,7 @@ typedef struct packet_autoban_quiz
// END_OF_AUTOBAN // END_OF_AUTOBAN
#ifdef __AUCTION__ #ifdef __AUCTION__
// Argument의 용도는 cmd에 따라 다르다. // Argument<EFBFBD><EFBFBD> <20><EFBFBD><EBB5B5> cmd<6D><64> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD>.
typedef struct SPacketCGAuctionCmd typedef struct SPacketCGAuctionCmd
{ {
BYTE bHeader; BYTE bHeader;
@ -2740,7 +2720,7 @@ typedef struct SPacketGCSpecificEffect
char effect_file[128]; char effect_file[128];
} TPacketGCSpecificEffect; } TPacketGCSpecificEffect;
// 용혼석 // <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
enum EDragonSoulRefineWindowRefineType enum EDragonSoulRefineWindowRefineType
{ {
DragonSoulRefineWindow_UPGRADE, DragonSoulRefineWindow_UPGRADE,

View File

@ -9,10 +9,6 @@ extern BOOL bVisibleNotice = true;
extern BOOL bTestServerFlag = FALSE; extern BOOL bTestServerFlag = FALSE;
extern int TWOHANDED_WEWAPON_ATT_SPEED_DECREASE_VALUE = 0; extern int TWOHANDED_WEWAPON_ATT_SPEED_DECREASE_VALUE = 0;
#ifdef USE_OPENID
extern int openid_test;
#endif
PyObject* appShowWebPage(PyObject* poSelf, PyObject* poArgs) PyObject* appShowWebPage(PyObject* poSelf, PyObject* poArgs)
{ {
char* szWebPage; char* szWebPage;
@ -1356,7 +1352,7 @@ void initapp()
PyModule_AddIntConstant(poModule, "VK_DELETE", VK_DELETE); PyModule_AddIntConstant(poModule, "VK_DELETE", VK_DELETE);
PyModule_AddIntConstant(poModule, "DIK_ESCAPE", DIK_ESCAPE); PyModule_AddIntConstant(poModule, "DIK_ESCAPE", DIK_ESCAPE);
PyModule_AddIntConstant(poModule, "DIK_ESC", DIK_ESCAPE); // ÆíÀǸ¦ À§ÇØ PyModule_AddIntConstant(poModule, "DIK_ESC", DIK_ESCAPE); // <EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>
PyModule_AddIntConstant(poModule, "DIK_1", DIK_1); PyModule_AddIntConstant(poModule, "DIK_1", DIK_1);
PyModule_AddIntConstant(poModule, "DIK_2", DIK_2); PyModule_AddIntConstant(poModule, "DIK_2", DIK_2);
PyModule_AddIntConstant(poModule, "DIK_3", DIK_3); PyModule_AddIntConstant(poModule, "DIK_3", DIK_3);
@ -1516,15 +1512,4 @@ void initapp()
#else #else
PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 0); PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 0);
#endif #endif
#ifdef USE_OPENID
PyModule_AddIntConstant(poModule, "USE_OPENID", 1);
if (openid_test)
PyModule_AddIntConstant(poModule, "OPENID_TEST", 1);
else
PyModule_AddIntConstant(poModule, "OPENID_TEST", 0);
#else
PyModule_AddIntConstant(poModule, "USE_OPENID", 0);
PyModule_AddIntConstant(poModule, "OPENID_TEST", 0);
#endif /* USE_OPENID */
} }

View File

@ -150,7 +150,6 @@ class CMainPacketHeaderMap : public CNetworkPacketHeaderMap
Set(HEADER_GC_LOGIN_KEY, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoginKey), STATIC_SIZE_PACKET)); Set(HEADER_GC_LOGIN_KEY, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLoginKey), STATIC_SIZE_PACKET));
Set(HEADER_GC_AUTH_SUCCESS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAuthSuccess), STATIC_SIZE_PACKET)); Set(HEADER_GC_AUTH_SUCCESS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAuthSuccess), STATIC_SIZE_PACKET));
Set(HEADER_GC_AUTH_SUCCESS_OPENID, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCAuthSuccessOpenID), STATIC_SIZE_PACKET));
Set(HEADER_GC_CHANNEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChannel), STATIC_SIZE_PACKET)); Set(HEADER_GC_CHANNEL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChannel), STATIC_SIZE_PACKET));
Set(HEADER_GC_VIEW_EQUIP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCViewEquip), STATIC_SIZE_PACKET)); Set(HEADER_GC_VIEW_EQUIP, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCViewEquip), STATIC_SIZE_PACKET));
Set(HEADER_GC_LAND_LIST, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLandList), DYNAMIC_SIZE_PACKET)); Set(HEADER_GC_LAND_LIST, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCLandList), DYNAMIC_SIZE_PACKET));
@ -239,7 +238,7 @@ void CPythonNetworkStream::AbsoluteExitApplication()
bool CPythonNetworkStream::__IsNotPing() bool CPythonNetworkStream::__IsNotPing()
{ {
// 원래는 핑이 안올때 체크이나 서버랑 정확히 맞추어야 한다. // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȿö<C8BF> üũ<C3BC>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20><><EFBFBD>߾<EFBFBD><DFBE> <20>Ѵ<EFBFBD>.
return false; return false;
} }
@ -251,7 +250,7 @@ DWORD CPythonNetworkStream::GetGuildID()
UINT CPythonNetworkStream::UploadMark(const char * c_szImageFileName) UINT CPythonNetworkStream::UploadMark(const char * c_szImageFileName)
{ {
// MARK_BUG_FIX // MARK_BUG_FIX
// 길드를 만든 직후는 길드 아이디가 0이다. // <EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ĵ<EFBFBD> <20><><EFBFBD> <20><><EFBFBD>̵<EFBFBD> 0<>̴<EFBFBD>.
if (0 == m_dwGuildID) if (0 == m_dwGuildID)
return ERROR_MARK_UPLOAD_NEED_RECONNECT; return ERROR_MARK_UPLOAD_NEED_RECONNECT;
@ -321,13 +320,13 @@ UINT CPythonNetworkStream::UploadSymbol(const char* c_szImageFileName)
void CPythonNetworkStream::__DownloadMark() void CPythonNetworkStream::__DownloadMark()
{ {
// 3분 안에는 다시 접속하지 않는다. // 3<EFBFBD><EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
DWORD curTime = ELTimer_GetMSec(); DWORD curTime = ELTimer_GetMSec();
if (curTime < gs_nextDownloadMarkTime) if (curTime < gs_nextDownloadMarkTime)
return; return;
gs_nextDownloadMarkTime = curTime + 60000 * 3; // 3 gs_nextDownloadMarkTime = curTime + 60000 * 3; // 3<EFBFBD><EFBFBD>
CGuildMarkDownloader& rkGuildMarkDownloader = CGuildMarkDownloader::Instance(); CGuildMarkDownloader& rkGuildMarkDownloader = CGuildMarkDownloader::Instance();
rkGuildMarkDownloader.Connect(m_kMarkAuth.m_kNetAddr, m_kMarkAuth.m_dwHandle, m_kMarkAuth.m_dwRandomKey); rkGuildMarkDownloader.Connect(m_kMarkAuth.m_kNetAddr, m_kMarkAuth.m_dwHandle, m_kMarkAuth.m_dwRandomKey);
@ -593,19 +592,19 @@ bool CPythonNetworkStream::RecvPhasePacket()
switch (packet_phase.phase) switch (packet_phase.phase)
{ {
case PHASE_CLOSE: // 끊기는 상태 (또는 끊기 전 상태) case PHASE_CLOSE: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)
ClosePhase(); ClosePhase();
break; break;
case PHASE_HANDSHAKE: // 악수..;; case PHASE_HANDSHAKE: // <EFBFBD>Ǽ<EFBFBD>..;;
SetHandShakePhase(); SetHandShakePhase();
break; break;
case PHASE_LOGIN: // 로그인 중 case PHASE_LOGIN: // <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><>
SetLoginPhase(); SetLoginPhase();
break; break;
case PHASE_SELECT: // 캐릭터 선택 화면 case PHASE_SELECT: // ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȭ<><C8AD>
SetSelectPhase(); SetSelectPhase();
BuildProcessCRC(); BuildProcessCRC();
@ -615,15 +614,15 @@ bool CPythonNetworkStream::RecvPhasePacket()
// END_OF_MARK_BUG_FIX // END_OF_MARK_BUG_FIX
break; break;
case PHASE_LOADING: // 선택 후 로딩 화면 case PHASE_LOADING: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ε<EFBFBD> ȭ<><C8AD>
SetLoadingPhase(); SetLoadingPhase();
break; break;
case PHASE_GAME: // 게임 화면 case PHASE_GAME: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><C8AD>
SetGamePhase(); SetGamePhase();
break; break;
case PHASE_DEAD: // 죽었을 때.. (게임 안에 있는 것일 수도..) case PHASE_DEAD: // <EFBFBD>׾<EFBFBD><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20>ȿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..)
break; break;
} }
@ -655,7 +654,7 @@ bool CPythonNetworkStream::RecvDefaultPacket(int header)
if (!header) if (!header)
return true; return true;
TraceError("처리되지 않은 패킷 헤더 %d, state %s\n", header, m_strPhase.c_str()); TraceError("ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD> %d, state %s\n", header, m_strPhase.c_str());
ClearRecvBuffer(); ClearRecvBuffer();
return true; return true;
} }

View File

@ -42,10 +42,6 @@ bool __IS_TEST_SERVER_MODE__=false;
extern bool SetDefaultCodePage(DWORD codePage); extern bool SetDefaultCodePage(DWORD codePage);
#ifdef USE_OPENID
extern int openid_test;
#endif
static const char* sc_apszPythonLibraryFilenames[] = static const char* sc_apszPythonLibraryFilenames[] =
{ {
@ -239,20 +235,20 @@ bool PackInitialize(const char * c_pszFolder)
} }
#ifdef _DISTRIBUTE #ifdef _DISTRIBUTE
Tracef("알림: 팩 모드입니다.\n"); Tracef("<EFBFBD>˸<EFBFBD>: <20><> <20><><EFBFBD><EFBFBD>Դϴ<D4B4>.\n");
//if (0 == strPackType.compare("FILE")) //if (0 == strPackType.compare("FILE"))
//{ //{
// bPackFirst = FALSE; // bPackFirst = FALSE;
// Tracef("알림: 파일 모드입니다.\n"); // Tracef("<EFBFBD>˸<EFBFBD>: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Դϴ<D4B4>.\n");
//} //}
//else //else
//{ //{
// Tracef("알림: 팩 모드입니다.\n"); // Tracef("<EFBFBD>˸<EFBFBD>: <20><> <20><><EFBFBD><EFBFBD>Դϴ<D4B4>.\n");
//} //}
#else #else
bPackFirst = FALSE; bPackFirst = FALSE;
Tracef("알림: 파일 모드입니다.\n"); Tracef("<EFBFBD>˸<EFBFBD>: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Դϴ<D4B4>.\n");
#endif #endif
CTextFileLoader::SetCacheMode(); CTextFileLoader::SetCacheMode();
@ -262,7 +258,7 @@ bool PackInitialize(const char * c_pszFolder)
CEterPackManager::Instance().SetCacheMode(); CEterPackManager::Instance().SetCacheMode();
CEterPackManager::Instance().SetSearchMode(bPackFirst); CEterPackManager::Instance().SetSearchMode(bPackFirst);
CSoundData::SetPackMode(); // Miles 파일 콜백을 셋팅 CSoundData::SetPackMode(); // Miles <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݹ<EFBFBD><DDB9><EFBFBD> <20><><EFBFBD><EFBFBD>
std::string strPackName, strTexCachePackName; std::string strPackName, strTexCachePackName;
for (DWORD i = 1; i < TextLoader.GetLineCount() - 1; i += 2) for (DWORD i = 1; i < TextLoader.GetLineCount() - 1; i += 2)
@ -353,7 +349,7 @@ bool RunMainScript(CPythonLauncher& pyLauncher, const char* lpCmdLine)
SplitLine(lpCmdLine,seperator,&stVec); SplitLine(lpCmdLine,seperator,&stVec);
if (CmdSize == stVec.size() && stVec[0]==loginMark) if (CmdSize == stVec.size() && stVec[0]==loginMark)
{ {
char buf[MAX_PATH]; //TODO 아래 함수 string 형태로 수정 char buf[MAX_PATH]; //TODO <EFBFBD>Ʒ<EFBFBD> <20>Լ<EFBFBD> string <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD>
base64_decode(stVec[2].c_str(),buf); base64_decode(stVec[2].c_str(),buf);
stVec[2] = buf; stVec[2] = buf;
string_join(seperator,stVec,&stCmdLine); string_join(seperator,stVec,&stCmdLine);
@ -462,12 +458,12 @@ bool Main(HINSTANCE hInstance, LPSTR lpCmdLine)
if (pyLauncher.Create()) if (pyLauncher.Create())
{ {
ret=RunMainScript(pyLauncher, lpCmdLine); //게임 실행중엔 함수가 끝나지 않는다. ret=RunMainScript(pyLauncher, lpCmdLine); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
} }
//ProcessScanner_ReleaseQuitEvent(); //ProcessScanner_ReleaseQuitEvent();
//게임 종료시. //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
app->Clear(); app->Clear();
timeEndPeriod(1); timeEndPeriod(1);
@ -537,20 +533,6 @@ bool __IsLocaleVersion(LPSTR lpCmdLine)
return (strcmp(lpCmdLine, "--perforce-revision") == 0); return (strcmp(lpCmdLine, "--perforce-revision") == 0);
} }
#ifdef USE_OPENID
//2012.07.16 김용욱
//일본 OpenID 지원. 인증키 인자 추가
bool __IsOpenIDAuthKeyOption(LPSTR lpCmdLine)
{
return (strcmp(lpCmdLine, "--openid-authkey") == 0);
}
bool __IsOpenIDTestOption(LPSTR lpCmdLine) //클라이언트에서 로그인이 가능하다.
{
return (strcmp(lpCmdLine, "--openid-test") == 0);
}
#endif /* USE_OPENID */
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ {
if (strstr(lpCmdLine, "--hackshield") != 0) if (strstr(lpCmdLine, "--hackshield") != 0)
@ -567,14 +549,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
SetDefaultCodePage(LocaleService_GetCodePage()); SetDefaultCodePage(LocaleService_GetCodePage());
bool bQuit = false; bool bQuit = false;
bool bAuthKeyChecked = false; //OpenID 버전에서 인증키가 들어왔는지 알기 위한 인자.
int nArgc = 0; int nArgc = 0;
PCHAR* szArgv = CommandLineToArgv( lpCmdLine, &nArgc ); PCHAR* szArgv = CommandLineToArgv( lpCmdLine, &nArgc );
for( int i=0; i < nArgc; i++ ) { for( int i=0; i < nArgc; i++ ) {
if(szArgv[i] == 0) if(szArgv[i] == 0)
continue; continue;
if (__IsLocaleVersion(szArgv[i])) // #0000829: [M2EU] 버전 파일이 항상 생기지 않도록 수정 if (__IsLocaleVersion(szArgv[i])) // #0000829: [M2EU] <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD>
{ {
char szModuleName[MAX_PATH]; char szModuleName[MAX_PATH];
char szVersionPath[MAX_PATH]; char szVersionPath[MAX_PATH];
@ -601,7 +582,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
bQuit = true; bQuit = true;
} else if ((strcmp(szArgv[i], "--force-set-locale") == 0)) } else if ((strcmp(szArgv[i], "--force-set-locale") == 0))
{ {
// locale 설정엔 인자가 두 개 더 필요함 (로케일 명칭, 데이터 경로) // locale <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20><> <20><> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ī, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>)
if (nArgc <= i + 2) if (nArgc <= i + 2)
{ {
MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP); MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
@ -613,49 +594,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
LocaleService_ForceSetLocale(localeName, localePath); LocaleService_ForceSetLocale(localeName, localePath);
} }
#ifdef USE_OPENID
else if (__IsOpenIDAuthKeyOption(szArgv[i])) //2012.07.16 OpenID : 김용욱
{
// 인증키 설정엔 인자가 한 개 더 필요함 (인증키)
if (nArgc <= i + 1)
{
MessageBox(NULL, "Invalid arguments", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
goto Clean;
} }
const char* authKey = szArgv[++i];
//ongoing (2012.07.16)
//인증키 저장하는 부분
LocaleService_SetOpenIDAuthKey(authKey);
bAuthKeyChecked = true;
}
else if (__IsOpenIDTestOption(szArgv[i]))
{
openid_test = 1;
}
#endif /* USE_OPENID */
}
#ifdef USE_OPENID
//OpenID
//OpenID 클라이언트의 경우인증키를 받아오지 않을 경우 (웹을 제외하고 실행 시) 클라이언트 종료.
if (false == bAuthKeyChecked && !openid_test)
{
MessageBox(NULL, "Invalid execution", ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
goto Clean;
}
#endif /* USE_OPENID */
if(bQuit) if(bQuit)
goto Clean; goto Clean;
#if defined(NEEDED_COMMAND_ARGUMENT) #if defined(NEEDED_COMMAND_ARGUMENT)
// 옵션이 없으면 비정상 실행으로 간주, 프로그램 종료 // <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD>
if (strstr(lpCmdLine, NEEDED_COMMAND_ARGUMENT) == 0) { if (strstr(lpCmdLine, NEEDED_COMMAND_ARGUMENT) == 0) {
MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP); MessageBox(NULL, ApplicationStringTable_GetStringz(IDS_ERR_MUST_LAUNCH_FROM_PATCHER, "ERR_MUST_LAUNCH_FROM_PATCHER"), ApplicationStringTable_GetStringz(IDS_APP_NAME, "APP_NAME"), MB_ICONSTOP);
goto Clean; goto Clean;
@ -713,7 +658,7 @@ static void GrannyError(granny_log_message_type Type,
int Setup(LPSTR lpCmdLine) int Setup(LPSTR lpCmdLine)
{ {
/* /*
* . * Ÿ<EFBFBD≯<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>.
*/ */
TIMECAPS tc; TIMECAPS tc;
UINT wTimerRes; UINT wTimerRes;
@ -725,7 +670,7 @@ int Setup(LPSTR lpCmdLine)
timeBeginPeriod(wTimerRes); timeBeginPeriod(wTimerRes);
/* /*
* * <EFBFBD>׷<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڵ
*/ */
granny_log_callback Callback; granny_log_callback Callback;