stoneage8.5/石器时代8.5客户端最新源代码/石器源码/system/netproc.cpp

5123 lines
131 KiB
C++
Raw Normal View History

2020-06-22 17:49:02 +08:00
#include <stdio.h>
#include <winsock.h>
#include <time.h>
#include <tchar.h>
#include "../systeminc/version.h"
#include"../systeminc/system.h"
#include "../systeminc/netmain.h"
#include "../systeminc/netproc.h"
#include "../systeminc/lssproto_cli.h"
#include "../systeminc/savedata.h"
#include "../systeminc/process.h"
#include "../systeminc/pc.h"
#include "../systeminc/tool.h"
#include "../systeminc/map.h"
#include "../systeminc/character.h"
#include "../systeminc/action.h"
#include "../systeminc/battlemenu.h"
#include "../systeminc/battleProc.h"
#include "../systeminc/battleMap.h"
#include "../systeminc/menu.h"
#include "../systeminc/anim_tbl.h"
#include "../systeminc/login.h"
#include "../systeminc/handletime.h"
#include "../systeminc/field.h"
#include "../systeminc/t_music.h"
#include "../systeminc/battleMenu.h"
#include "../wgs/message.h"
#include "../wgs/descrypt.h"
#include "./test.h"
#include "../NewProto/autil.h"
#ifdef _REMAKE_20
#include "../MMOGprotect.h"
#endif
#ifdef _AIDENGLU_
#include "../systeminc/pc.h"
extern Landed PcLanded;
#endif
#ifdef _TALK_WINDOW
#include "../systeminc/TalkWindow.h"
#endif
#include "../openssl/md5.h"
#include "../systeminc/VMProtectSDK.h"
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
#ifdef _STONDEBUG_
extern int g_iMallocCount;
#endif
#define NETPROC_NOTSEND 0 // ????<3F><>??????
#define NETPROC_SENDING 1 // ?<3F><>????<3F>N?
#define NETPROC_RECEIVED 2 // <20><><EFBFBD><EFBFBD>???
#define SET_SENDTIME(time) time = TimeGetTime()
#define CHECK_TIMEOUT(time, timeout) \
if ((TimeGetTime() - (time)) > (timeout)) \
return -1;
#define SETSENDING netproc_sending = NETPROC_SENDING; start_time = TimeGetTime();
#define SETTIMEOUT(msg, state) \
if ((TimeGetTime() - start_time) > TIMEOUT) \
return;
#define SETTIMEOUT2(msg) \
if ((TimeGetTime() - start_time) > TIMEOUT) \
{ \
sprintf_s( netprocErrmsg, msg ); \
return -1; \
}
#define SETNEEDCHOOSE(mode) \
if (server_choosed == 0) \
return;
#ifdef _STONDEBUG_
void sendDataToServer(char* data);
#endif
extern char szUser[], szPassword[];
short selectServerIndex = -1;
short clientLoginStatus = 0;
short charListStatus = 0;
short charDelStatus = 0;
short newCharStatus = 0;
short charLoginStatus = 0;
short charLogoutStatus = 0;
#ifdef _MAILSHOWPLANET // (<28>ɿ<EFBFBD><C9BF><EFBFBD>) Syu ADD <20><>ʾ<EFBFBD><CABE>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
extern struct gameserver gmsv[];
#endif
#ifdef _NEW_WGS_MSG // WON ADD WGS<47><53><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>
int ERROR_MESSAGE = 0;
#endif
// GAMESTATE_CHOOSESERVER????<3F>@<40>e?????????<3F>ѩ<EFBFBD>?
char gamestate_chooseserver_name[128];
// GAMESTATE_LOGIN????<3F>@<40>e?????????<3F>ѩ<EFBFBD>?
char gamestate_login_charname[128];
// GAMESTATE_DELETECHAR????<3F>@<40>e?????????<3F>ѩ<EFBFBD>?
char gamestate_deletechar_charname[128];
char netprocErrmsg[1024];
int netproc_sending = NETPROC_NOTSEND;
DWORD start_time = 0;
BOOL bNewServer;
char c_temp[1024];
int connectServerCounter = 0;
#ifdef _SKILLSORT
int AdvanceSkill[20] = {-1};
int AssitSkill[20] = {-1};
int BattleSkill[20] = {-1};
void SortSkill()
{
int count1 = 0, count2 = 0, count3 = 0;
for (int i = 0; i < 20; i++)
{
AdvanceSkill[i] = -1;
AssitSkill[i] = -1;
BattleSkill[i] = -1;
}
#ifdef _PRO3_ADDSKILL
for (int i = 0; i < 30; i++)
#else
for (int i = 0; i < 26; i++)
#endif
{
switch (profession_skill[i].kind)
{
case 1: // ս<><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BattleSkill[count1] = i;
count1++;
break;
case 2: // <20><><EFBFBD><EFBFBD>
AssitSkill[count2] = i;
count2++;
break;
case 3: // <20><><EFBFBD><EFBFBD>
AdvanceSkill[count3] = i;
count3++;
break;
}
}
}
#endif
#ifdef _CHANNEL_MODIFY
// <20><><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD>
void SaveChatData(char *msg,char KindOfChannel,bool bCloseFile);
#endif
void initConnectServer(void)
{
connectServerCounter = 0;
}
void LogToRecvdata2(char *data)
{
char lssproto_readlogfilename[256] = "recvdata.txt";
if (lssproto_readlogfilename[0] != '\0')
{
FILE *rfp;
rfp = fopen(lssproto_readlogfilename, "a+");
if (rfp)
{
fprintf(rfp, "<EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>\t%s\n", data);
fclose(rfp);
}
}
}
extern int iEncrypt;
int ConnectWGS()
{
if (connectServerCounter == 0)
{
HANDLE hFileMapping = NULL;
LPSTR lpstr = NULL;
cleanupNetwork();
if (initNet())
{
unsigned long flg = 1;
struct sockaddr_in sin;
struct hostent *h;
iWGS = 0;
iEncrypt = E_INIT;
start_time = TimeGetTime();
if (INVALID_SOCKET == (sockfd = socket(AF_INET, SOCK_STREAM, 0)))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_SOCKETERROR);
return -3;
}
ioctlsocket(sockfd, FIONBIO, &flg);
sin.sin_family = AF_INET;
sin.sin_port = htons(wWGS);
sin.sin_addr.s_addr = inet_addr(szWGS);
if (sin.sin_addr.s_addr == -1)
{
if (!(h = gethostbyname(szWGS)))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTGETADDR);
closesocket(sockfd);
dwServer = NULL;
return -4;
}
memcpy((void*)&sin.sin_addr.s_addr, h->h_addr, sizeof(struct in_addr));
}
int ret = connect(sockfd, (struct sockaddr*)&sin, sizeof(sin));
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
closesocket(sockfd);
dwServer = NULL;
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT_S);
return -5;
}
}
dwServer = WGS;
iWGS = 1;
connectServerCounter = 1;
}
else
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
strcpy(netprocErrmsg, NET_ERRMSG_SOCKLIBERROR);
return -1;
}
}
else if (connectServerCounter >= 1 && connectServerCounter <= 70)
{
fd_set rfds, wfds, efds;
struct timeval tm;
if (++connectServerCounter == 70)
connectServerCounter = 69;
tm.tv_sec = 0;
tm.tv_usec = 0;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&efds);
FD_SET(sockfd, &rfds);
FD_SET(sockfd, &wfds);
FD_SET(sockfd, &efds);
int a = select(2, &rfds, &wfds, &efds, &tm);
if (FD_ISSET(sockfd, &wfds))
{
connectServerCounter = 71;
server_choosed = 100;
}
#ifdef _OMIT_WGS
testtest();
connectServerCounter = 143; // <20>ݶ<EFBFBD>
iWGS = 7;
#endif
if (FD_ISSET(sockfd, &efds))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
closesocket(sockfd);
dwServer = NULL;
return -6;
}
}
else if (connectServerCounter == 71)
{
if (iWGS == 2)
{
unsigned long flg = 1;
struct sockaddr_in sin;
struct hostent *h;
closesocket(sockfd);
dwServer = NULL;
if (INVALID_SOCKET == (sockfd = socket(AF_INET, SOCK_STREAM, 0)))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_SOCKETERROR);
return -3;
}
ioctlsocket(sockfd, FIONBIO, &flg);
sin.sin_family = AF_INET;
sin.sin_port = htons(wCS);
sin.sin_addr.s_addr = inet_addr(szCSIP);
if (sin.sin_addr.s_addr == -1)
{
if (!(h = gethostbyname(szCSIP)))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTGETADDR);
closesocket(sockfd);
dwServer = NULL;
return -4;
}
memcpy((void*)&sin.sin_addr.s_addr, h->h_addr, sizeof(struct in_addr));
}
int ret = connect(sockfd, (struct sockaddr*)&sin, sizeof(sin));
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
closesocket(sockfd);
dwServer = NULL;
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT_S);
return -5;
}
}
dwServer = CS;
iWGS = 3;
connectServerCounter = 72;
}
}
else if (connectServerCounter >= 72 && connectServerCounter <= 140)
{
fd_set rfds, wfds, efds;
struct timeval tm;
if (++connectServerCounter == 140)
connectServerCounter = 139;
tm.tv_sec = 0;
tm.tv_usec = 0;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&efds);
FD_SET(sockfd, &rfds);
FD_SET(sockfd, &wfds);
FD_SET(sockfd, &efds);
int a = select(2, &rfds, &wfds, &efds, &tm);
if (FD_ISSET(sockfd, &wfds))
{
connectServerCounter = 141;
server_choosed = 100;
}
if (FD_ISSET(sockfd, &efds))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
closesocket(sockfd);
dwServer = NULL;
return -6;
}
}
else if (connectServerCounter == 141)
{
if (iWGS == 4)
{
DoSKey();
connectServerCounter = 142;
iWGS = 5;
}
}
else if (connectServerCounter == 142)
{
if (iWGS == 6)
{
DoHellow();
connectServerCounter = 143;
iWGS = 7;
}
}
else if (connectServerCounter == 143)
{
if (iWGS == 8)
{
cleanupNetwork();
disconnectServerFlag = TRUE;
oldDisconnectServerFlag = TRUE;
closesocket(sockfd);
dwServer = GS;
return 1;
}
}
if (iWGS == 9)
return -7;
SETTIMEOUT2(NET_ERRMSG_CONNECTTIMEOUT);
return 0;
}
struct sockaddr_in sin_server;
int connectServer(void)
{
if (!init_net)
return 0;
static int count = 0;
if (connectServerCounter == 0)
{
char hostname[128];
short pt;
unsigned long flg = 1;
struct hostent *h;
#ifdef _VMP_
lstrcpy(PersonalKey, VMProtectDecryptStringA(_DEFAULT_PKEY));
#else
lstrcpy(PersonalKey, _DEFAULT_PKEY);
#endif
// lstrcpy(PersonalKey, "forever");
start_time = TimeGetTime();
if (getServerInfo(selectServerIndex, hostname, &pt) < 0)
{
count = 0;
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_BADNAME);
return -2;
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == INVALID_SOCKET)
{
count = 0;
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_SOCKETERROR);
return -3;
}
ioctlsocket(sockfd, FIONBIO, &flg);
extern BOOL NoDelay;
if (NoDelay)
{
int flag = 1;
if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int)) != 0)
{
count = 0;
return -100;
}
}
ZeroMemory(&sin_server, sizeof(sin_server));
sin_server.sin_family = AF_INET;
sin_server.sin_port = htons(pt);
sin_server.sin_addr.s_addr = inet_addr(hostname); /* accept only dot notaion */
if (sin_server.sin_addr.s_addr == -1)
{
h = gethostbyname(hostname);
if (h == NULL)
{
count = 0;
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTGETADDR);
closesocket(sockfd);
dwServer = NULL;
return -4;
}
memcpy((void*)&sin_server.sin_addr.s_addr, h->h_addr, sizeof(struct in_addr));
}
// Non blocking Connect
int ret = connect(sockfd, (struct sockaddr*)&sin_server, sizeof(sin_server));
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
count = 0;
closesocket(sockfd);
dwServer = NULL;
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT_S);
return -5;
}
connectServerCounter = 1;
c_temp[0] = 0;
bNewServer = FALSE;
/*sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
closesocket(sockfd);
dwServer = NULL;
return -6; */
}
}
else if (connectServerCounter >= 1 && connectServerCounter <= 70)
{
fd_set rfds, wfds, efds;
struct timeval tm;
connectServerCounter++;
if (connectServerCounter == 70)
connectServerCounter = 69;
// select??
tm.tv_sec = 0;
tm.tv_usec = 0;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&efds);
FD_SET(sockfd, &rfds);
FD_SET(sockfd, &wfds);
FD_SET(sockfd, &efds);
int a = select(sockfd, &rfds, &wfds, &efds, &tm);
if (a > 0)
{
if (FD_ISSET(sockfd, &rfds))
{
// Nuke start
int i_len = recv(sockfd, c_temp, sizeof(c_temp) - 1, 0);
if (i_len > 0)
{
if (c_temp[0] == 'E')
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
count = 0;
sprintf_s(netprocErrmsg, c_temp + 1);
closesocket(sockfd);
dwServer = NULL;
return -6;
}
else if (c_temp[0] == _SA_VERSION)
{
bNewServer = 0xf000000 | 1;
if (FD_ISSET(sockfd, &wfds))
{
connectServerCounter = 71;
server_choosed = 1;
}
}
else
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
count = 0;
sprintf_s(netprocErrmsg, NET_ERRMSG_VERSIONERROR);
closesocket(sockfd);
dwServer = NULL;
return -8;
}
}else
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
count = 0;
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
closesocket(sockfd);
dwServer = NULL;
return -6;
}
}
//end cary
if (FD_ISSET(sockfd, &efds))
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
count = 0;
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
closesocket(sockfd);
dwServer = NULL;
return -6;
}
}else
{
count++;
if(count >= 1500)
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
count = 0;
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
closesocket(sockfd);
dwServer = NULL;
return -6;
}
}
}
else if (connectServerCounter >= 71 && connectServerCounter <= 80)
{
count = 0;
if (connectServerCounter == 71)
{
char userId[32], userPassword[32];
clientLoginStatus = 0;
CopyMemory(userId, szUser, 32);
ecb_crypt("f;encor1c", userId, 32, DES_DECRYPT);
CopyMemory(userPassword, szPassword, 32);
ecb_crypt("f;encor1c", userPassword, 32, DES_DECRYPT);
extern char <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[];
unsigned char tmp[256];
CHAR mac[64];
MD5( (const unsigned char*)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, strlen(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>), tmp );
size_t leng = 0;
for (int i = 0; i < 16; i ++)
{
sprintf( &mac[ leng ], "%02x", tmp[ i ] );
leng = strlen( mac );
}
#ifdef _NEW_CLIENT_LOGIN
#ifdef _SA_MAC_VERSION_CONTROL
CHAR token[64];
sprintf_s(token, "%s-%s",_SA_MAC_VERSION, mac);
#ifdef _LOGIP_
extern char <EFBFBD><EFBFBD><EFBFBD>ҹ<EFBFBD><EFBFBD><EFBFBD>IP[];
lssproto_ClientLogin_send(sockfd, userId,userPassword, token, selectServerIndex,<EFBFBD><EFBFBD><EFBFBD>ҹ<EFBFBD><EFBFBD><EFBFBD>IP);
#else
lssproto_ClientLogin_send(sockfd, userId,userPassword, token, selectServerIndex,"192.168.1.1");
#endif
#else
lssproto_ClientLogin_send(sockfd, userId,userPassword, mac, selectServerIndex,"192.168.1.1");
#endif
#endif
if ((bNewServer & 0xf000000) == 0xf000000)
{
lstrcpy(PersonalKey, userId);
#ifdef _VMP_
lstrcat(PersonalKey, VMProtectDecryptStringA(_RUNNING_KEY));
#else
lstrcat(PersonalKey, _RUNNING_KEY);
#endif
// lstrcat(PersonalKey, "520999");
}
else
{
lstrcpy(PersonalKey, userId);
lstrcat(PersonalKey, "19761101");
}
netproc_sending = NETPROC_SENDING;
}
if (netproc_sending == NETPROC_RECEIVED)
{
// recv ?????
if (clientLoginStatus)
connectServerCounter = 81;
else
{
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime() + 2000;
#endif
count = 0;
netproc_sending = NETPROC_NOTSEND;
sprintf_s(netprocErrmsg, NET_ERRMSG_LOGINFAIL);
closesocket(sockfd);
dwServer = NULL;
return -7;
}
}
connectServerCounter++;
if (connectServerCounter == 81)
connectServerCounter = 80;
}
else if (connectServerCounter >= 81 && connectServerCounter <= 98)
connectServerCounter ++;
else if (connectServerCounter == 99)
{
netproc_sending = NETPROC_NOTSEND;
return 1;
}
SETTIMEOUT2(NET_ERRMSG_CONNECTTIMEOUT);
return 0;
}
void lssproto_ClientLogin_recv(int fd, char *result)
{
if (netproc_sending == NETPROC_SENDING)
{
netproc_sending = NETPROC_RECEIVED;
if (strcmp(result, OKSTR) == 0)
{
clientLoginStatus = 1;
time(&serverAliveLongTime);
localtime_s(&serverAliveTime,&serverAliveLongTime);
}else if(strcmp (result, CANCLE) == 0)
{
//ChangeProc(PROC_TITLE_MENU , 6 );
cleanupNetwork();
// ????????????
PaletteChange(DEF_PAL, 0);
// ?????<3F><>?
//cary
ChangeProc( PROC_ID_PASSWORD );
SubProcNo = 5;
// ??????<3F><>
DeathAllAction();
}
}
}
void charListStart(void)
{
int i;
for (i = 0; i < MAXCHARACTER; i++)
resetCharacterList(i);
#ifdef _MORECHARACTERS_
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰҳ<EFBFBD><EFBFBD>;
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰҳ<EFBFBD><EFBFBD>=0;
#endif
charListStatus = 0;
if (bNewServer)
lssproto_CharList_send(sockfd);
else
old_lssproto_CharList_send(sockfd);
SETSENDING;
}
int charListProc(void)
{
if (netproc_sending == NETPROC_RECEIVED)
{
netproc_sending = NETPROC_NOTSEND;
if (charListStatus == 1)
return 1;
else if (charListStatus == 2)
return -3;
#ifdef _CHANGEGALAXY
else if (charListStatus == 3)
return -12;
#endif
#ifdef _ERROR301
else if (charListStatus == 4)
return -13;
#endif
else
return -2;
}
SETTIMEOUT2(NET_ERRMSG_CHARLISTTIMEOUT);
return 0;
}
TCHAR <EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[1024];
void lssproto_CharList_recv(int fd, char *result, char *data)
{
memset(<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,0,1024);
if(strcmp(result,_T("failed"))==0) {
strcpy(<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,data);
#ifdef _AIDENGLU_
PcLanded.<EFBFBD><EFBFBD>½<EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD> = TimeGetTime()+2000;
#endif
}
if (netproc_sending == NETPROC_SENDING)
{
char nm[1024], opt[1024];
int i;
netproc_sending = NETPROC_RECEIVED;
if (strcmp(result, SUCCESSFULSTR) != 0)
{
if (strcmp(data, "OUTOFSERVICE") == 0)
charListStatus = 2;
#ifdef _CHANGEGALAXY
if (strcmp(data, "CHANGE_GALAXY") == 0)
charListStatus = 3;
#endif
#ifdef _ERROR301
if (strcmp(data, "301") == 0)
charListStatus = 4;
#endif
return;
}
charListStatus = 1;
for (i = 0; i < MAXCHARACTER; i++)
{
strcpy(nm, "");
strcpy(opt, "");
getStringToken(data, '|', i * 2 + 1, sizeof(nm) - 1 , nm);
getStringToken(data, '|', i * 2 + 2, sizeof(opt) - 1, opt);
setCharacterList(nm, opt);
}
}
}
void charLoginStart(void)
{
charLoginStatus = 0;
#ifdef _NEW_WGS_MSG // WON ADD WGS<47><53><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>
ERROR_MESSAGE = 0;
#endif
if (bNewServer){
#ifdef _TRADITIONAL_LONG_
CHAR szOutBuffer[128+1] = {0};
WORD wLanguageID = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
LCID Locale = MAKELCID(wLanguageID, SORT_CHINESE_PRCP);
int iRet = LCMapString(Locale,
LCMAP_SIMPLIFIED_CHINESE,
gamestate_login_charname, -1,
szOutBuffer, 128);
lssproto_CharLogin_send(sockfd, szOutBuffer);
#else
lssproto_CharLogin_send(sockfd, gamestate_login_charname);
#endif
}
else
old_lssproto_CharLogin_send(sockfd, gamestate_login_charname);
SETSENDING;
}
int charLoginProc(void)
{
tradeStatus = 0;
if (!server_choosed)
return 0;
if (netproc_sending == NETPROC_RECEIVED)
{
netproc_sending = NETPROC_NOTSEND;
if (charLoginStatus == 1)
return 1;
else
#ifdef _NEW_WGS_MSG // WON ADD WGS<47><53><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>
if (ERROR_MESSAGE != 0)
return ERROR_MESSAGE;
else
#endif
return -2;
}
SETTIMEOUT2(NET_ERRMSG_LOGINTIMEOUT);
return 0;
}
#ifdef __NEW_CLIENT
HANDLE hPing = NULL;
DWORD dwPingID;
DWORD WINAPI PingFunc(LPVOID param);
#endif
void lssproto_CharLogin_recv(int fd, char* result, char* data)
{
if (netproc_sending == NETPROC_SENDING)
{
netproc_sending = NETPROC_RECEIVED;
#ifdef __NEW_CLIENT
if (strcmp(result, SUCCESSFULSTR) == 0 && !hPing)
#else
if (strcmp(result, SUCCESSFULSTR) == 0)
#endif
{
charLoginStatus = 1;
#ifdef __NEW_CLIENT
hPing = CreateThread(NULL, 0, PingFunc, &sin_server.sin_addr, 0, &dwPingID);
#endif
}
#ifdef __NEW_CLIENT
#ifdef _NEW_WGS_MSG // WON ADD WGS<47><53><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>
if (strcmp(result, "failed" ) == 0 && !hPing)
ERROR_MESSAGE = atoi(data);
#endif
#endif
#ifdef _ANGEL_SUMMON
angelFlag = FALSE;
angelMsg[0] = NULL;
#endif
}
}
void charLogoutStart(void)
{
charLogoutStatus = 0;
if (bNewServer)
lssproto_CharLogout_send(sockfd, 1);
else
old_lssproto_CharLogout_send(sockfd);
SETSENDING;
}
int charLogoutProc(void)
{
if (netproc_sending == NETPROC_RECEIVED)
{
netproc_sending = NETPROC_NOTSEND;
if (charLogoutStatus == 1)
return 1;
else
return -2;
}
SETTIMEOUT2(NET_ERRMSG_LOGOUTTIMEOUT);
return 0;
}
void lssproto_CharLogout_recv(int fd, char *result, char *data)
{
if (netproc_sending == NETPROC_SENDING)
{
netproc_sending = NETPROC_RECEIVED;
if (strcmp(result, SUCCESSFULSTR) == 0)
charLogoutStatus = 1;
}
}
#define S_DELIM '|'
/*================================
C warp <EFBFBD><EFBFBD>
D <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
X <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
F <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
M HP,MP,EXP
K <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
E nowEncountPercentage
J ħ<EFBFBD><EFBFBD>
N <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѷ
I <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
S ְҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
G ְҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴʱ<EFBFBD><EFBFBD>
================================*/
void lssproto_S_recv(int fd, char *data)
{
if (logOutFlag)
return;
switch (data[0])
{
case 'C':
{
int fl, maxx, maxy, gx, gy;
floorChangeFlag = TRUE;
if (!loginFlag && ProcNo == PROC_GAME)
{
if (!warpEffectFlag)
{
SubProcNo = 200;
warpEffectProc();
if (MenuToggleFlag & JOY_CTRL_M)
MapWmdFlagBak = TRUE;
}
resetPc();
warpEffectFlag = FALSE;
warpEffectStart = TRUE;
}
data++;
fl = getIntegerToken(data, S_DELIM, 1);
maxx = getIntegerToken(data, S_DELIM, 2);
maxy = getIntegerToken(data, S_DELIM, 3);
gx = getIntegerToken(data, S_DELIM, 4);
gy = getIntegerToken(data, S_DELIM, 5);
setMap(fl, gx, gy);
createMap(fl, maxx, maxy);
nowFloorGxSize = maxx;
nowFloorGySize = maxy;
resetCharObj();
mapEmptyFlag = FALSE;
nowEncountPercentage = minEncountPercentage;
nowEncountExtra = 0;
resetMap();
transmigrationEffectFlag = 0;
#ifdef __SKYISLAND
extern void SkyIslandSetNo( int fl);
SkyIslandSetNo( fl);
#endif
break;
}
case 'D':
data++;
setPcId(getIntegerToken(data, S_DELIM, 1));
serverTime = getIntegerToken(data, S_DELIM, 2);
FirstTime = TimeGetTime();
RealTimeToSATime(&SaTime);
SaTimeZoneNo = getLSTime(&SaTime);
PaletteChange(SaTimeZoneNo, 0);
break;
//andy_add
case 'X':
pc.lowsride = getIntegerToken(data, S_DELIM, 2);
break;
case 'P':
{
char name[256], freeName[256];
int i, kubun;
unsigned int mask;
data++;
kubun = getInteger62Token(data, S_DELIM, 1);
if (!bNewServer)
pc.ridePetNo = -1;
if (kubun == 1)
{
pc.hp = getIntegerToken(data, S_DELIM, 2); // 0x00000002
pc.maxHp = getIntegerToken(data, S_DELIM, 3); // 0x00000004
pc.mp = getIntegerToken(data, S_DELIM, 4); // 0x00000008
pc.maxMp = getIntegerToken(data, S_DELIM, 5); // 0x00000010
pc.vital = getIntegerToken(data, S_DELIM, 6); // 0x00000020
pc.str = getIntegerToken(data, S_DELIM, 7); // 0x00000040
pc.tgh = getIntegerToken(data, S_DELIM, 8); // 0x00000080
pc.dex = getIntegerToken(data, S_DELIM, 9); // 0x00000100
pc.exp = getIntegerToken(data, S_DELIM, 10); // 0x00000200
pc.maxExp = getIntegerToken(data, S_DELIM, 11); // 0x00000400
pc.level = getIntegerToken(data, S_DELIM, 12); // 0x00000800
pc.atk = getIntegerToken(data, S_DELIM, 13); // 0x00001000
pc.def = getIntegerToken(data, S_DELIM, 14); // 0x00002000
pc.quick = getIntegerToken(data, S_DELIM, 15); // 0x00004000
pc.charm = getIntegerToken(data, S_DELIM, 16); // 0x00008000
pc.luck = getIntegerToken(data, S_DELIM, 17); // 0x00010000
pc.earth = getIntegerToken(data, S_DELIM, 18); // 0x00020000
pc.water = getIntegerToken(data, S_DELIM, 19); // 0x00040000
pc.fire = getIntegerToken(data, S_DELIM, 20); // 0x00080000
pc.wind = getIntegerToken(data, S_DELIM, 21); // 0x00100000
pc.gold = getIntegerToken(data, S_DELIM, 22); // 0x00200000
pc.titleNo = getIntegerToken(data, S_DELIM, 23); // 0x00400000
pc.dp = getIntegerToken(data, S_DELIM, 24); // 0x00800000
pc.transmigration = getIntegerToken(data, S_DELIM, 25);// 0x01000000
pc.ridePetNo = getIntegerToken(data, S_DELIM, 26); // 0x02000000
pc.learnride = getIntegerToken(data, S_DELIM, 27); // 0x04000000
pc.baseGraNo = getIntegerToken(data, S_DELIM, 28); // 0x08000000
#ifdef _NEW_RIDEPETS
pc.lowsride = getIntegerToken(data, S_DELIM, 29); // 0x08000000
#endif
#ifdef _SFUMATO
pc.sfumato = 0xff0000;
#endif
getStringToken(data, S_DELIM, 30, sizeof(name) - 1, name);
makeStringFromEscaped(name);
if (strlen(name) <= CHAR_NAME_LEN)
strcpy_s(pc.name, name);
getStringToken(data, S_DELIM, 31, sizeof(freeName) - 1, freeName);
makeStringFromEscaped(freeName);
if (strlen(freeName) <= CHAR_FREENAME_LEN)
strcpy_s(pc.freeName, freeName);
#ifdef _NEW_ITEM_
pc.<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ = getIntegerToken(data, S_DELIM, 32);
#endif
#ifdef _SA_VERSION_25
int pointindex = getIntegerToken(data, S_DELIM, 33);
char pontname[][32]={
"<EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><EFBFBD>",
"<EFBFBD>ӼӴ<EFBFBD>",
"<EFBFBD><EFBFBD>³<EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>",
};
sprintf(pc.chusheng,"%s",pontname[pointindex]);
#ifdef _MAGIC_ITEM_
pc.<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ = getIntegerToken(data, S_DELIM, 34);
pc.<EFBFBD><EFBFBD><EFBFBD>߹Ч<EFBFBD><EFBFBD> = getIntegerToken(data, S_DELIM, 35);
#endif
#endif
}
else
{
mask = 2;
i = 2;
for (; mask > 0; mask <<= 1)
{
if (kubun & mask)
{
if (mask == 0x00000002) // ( 1 << 1 )
{
pc.hp = getIntegerToken(data, S_DELIM, i);// 0x00000002
i++;
}
else if (mask == 0x00000004) // ( 1 << 2 )
{
pc.maxHp = getIntegerToken(data, S_DELIM, i);// 0x00000004
i++;
}
else if (mask == 0x00000008)
{
pc.mp = getIntegerToken(data, S_DELIM, i);// 0x00000008
i++;
}
else if (mask == 0x00000010)
{
pc.maxMp = getIntegerToken(data, S_DELIM, i);// 0x00000010
i++;
}
else if (mask == 0x00000020)
{
pc.vital = getIntegerToken(data, S_DELIM, i);// 0x00000020
i++;
}
else if (mask == 0x00000040)
{
pc.str = getIntegerToken(data, S_DELIM, i);// 0x00000040
i++;
}
else if (mask == 0x00000080)
{
pc.tgh = getIntegerToken(data, S_DELIM, i);// 0x00000080
i++;
}
else if (mask == 0x00000100)
{
pc.dex = getIntegerToken(data, S_DELIM, i);// 0x00000100
i++;
}
else if (mask == 0x00000200)
{
pc.exp = getIntegerToken(data, S_DELIM, i);// 0x00000200
i++;
}
else if (mask == 0x00000400)
{
pc.maxExp = getIntegerToken(data, S_DELIM, i);// 0x00000400
i++;
}
else if (mask == 0x00000800)
{
pc.level = getIntegerToken(data, S_DELIM, i);// 0x00000800
i++;
}
else if (mask == 0x00001000)
{
pc.atk = getIntegerToken(data, S_DELIM, i);// 0x00001000
i++;
}
else if (mask == 0x00002000)
{
pc.def = getIntegerToken(data, S_DELIM, i);// 0x00002000
i++;
}
else if (mask == 0x00004000)
{
pc.quick = getIntegerToken(data, S_DELIM, i);// 0x00004000
i++;
}
else if (mask == 0x00008000)
{
pc.charm = getIntegerToken(data, S_DELIM, i);// 0x00008000
i++;
}
else if (mask == 0x00010000)
{
pc.luck = getIntegerToken(data, S_DELIM, i);// 0x00010000
i++;
}
else if (mask == 0x00020000)
{
pc.earth = getIntegerToken(data, S_DELIM, i);// 0x00020000
i++;
}
else if (mask == 0x00040000)
{
pc.water = getIntegerToken(data, S_DELIM, i);// 0x00040000
i++;
}
else if (mask == 0x00080000)
{
pc.fire = getIntegerToken(data, S_DELIM, i);// 0x00080000
i++;
}
else if (mask == 0x00100000)
{
pc.wind = getIntegerToken(data, S_DELIM, i);// 0x00100000
i++;
}
else if (mask == 0x00200000)
{
pc.gold = getIntegerToken(data, S_DELIM, i);// 0x00200000
i++;
}
else if (mask == 0x00400000)
{
pc.titleNo = getIntegerToken(data, S_DELIM, i);// 0x00400000
i++;
}
else if (mask == 0x00800000)
{
pc.dp = getIntegerToken(data, S_DELIM, i);// 0x00800000
i++;
}
else if (mask == 0x01000000)
{
pc.transmigration = getIntegerToken(data, S_DELIM, i);// 0x01000000
i++;
}
else if (mask == 0x02000000)
{
getStringToken(data, S_DELIM, i, sizeof(name) - 1, name);// 0x01000000
makeStringFromEscaped(name);
if (strlen(name) <= CHAR_NAME_LEN)
strcpy_s(pc.name, name);
i++;
}
else if (mask == 0x04000000)
{
getStringToken(data, S_DELIM, i, sizeof(freeName) - 1, freeName);// 0x02000000
makeStringFromEscaped(freeName);
if (strlen(freeName) <= CHAR_FREENAME_LEN)
strcpy_s(pc.freeName, freeName);
i++;
}
else if (mask == 0x08000000) // ( 1 << 27 )
{
pc.ridePetNo = getIntegerToken(data, S_DELIM, i);// 0x08000000
i++;
}
else if (mask == 0x10000000) // ( 1 << 28 )
{
pc.learnride = getIntegerToken(data, S_DELIM, i);// 0x10000000
i++;
}
else if (mask == 0x20000000) // ( 1 << 29 )
{
pc.baseGraNo = getIntegerToken(data, S_DELIM, i);// 0x20000000
i++;
}
else if (mask == 0x40000000) // ( 1 << 30 )
{
pc.skywalker = getIntegerToken(data, S_DELIM, i);// 0x40000000
i++;
}
#ifdef _CHARSIGNADY_NO_
else if (mask == 0x80000000) // ( 1 << 31 )
{
pc.ǩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = getIntegerToken(data, S_DELIM, i);// 0x80000000
i++;
}
#endif
}
}
}
updataPcAct();
if ((pc.status & CHR_STATUS_LEADER) != 0 && party[0].useFlag != 0)
{
party[0].level = pc.level;
party[0].maxHp = pc.maxHp;
party[0].hp = pc.hp;
strcpy_s(party[0].name, pc.name);
}
#ifdef _STONDEBUG_
char title[128];
sprintf_s( title, "%s %s [%s %s:%s]", DEF_APPNAME, "<EFBFBD><EFBFBD><EFBFBD>԰汾",
gmsv[selectServerIndex].name,
gmsv[selectServerIndex].ipaddr, gmsv[selectServerIndex].port );
#else
char title[128];
extern int nServerGroup;
sprintf_s( title, "%s %s [%s] %s", DEF_APPNAME, gmgroup[nServerGroup].name, gmsv[selectServerIndex].name,pc.name );
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
if(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>){
char <EFBFBD><EFBFBD><EFBFBD><EFBFBD>[1024]={0};
LCMapString (0x804,0x4000000,title, strlen(title),<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,1024);
sprintf(title,"%s",<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
}
#endif
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
extern char* GB2312ToBIG5(const char* szGBString);
if(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>==950){
SetWindowText( hWnd, GB2312ToBIG5((const char *)title));
}else{
SetWindowText(hWnd,title);
}
}
if (!bNewServer)
pc.ridePetNo = -1;
if ((bNewServer & 0xf000000) == 0xf000000 && sPetStatFlag == 1)
saveUserSetting();
break;
case 'F':
char familyName[256];
data++;
getStringToken(data, S_DELIM, 1, sizeof(familyName) - 1, familyName);
makeStringFromEscaped(familyName);
if (strlen(familyName) <= CHAR_NAME_LEN)
strcpy_s(pc.familyName, familyName);
pc.familyleader = getIntegerToken(data, S_DELIM, 2);
pc.channel = getIntegerToken(data, S_DELIM, 3);
pc.familySprite = getIntegerToken(data, S_DELIM, 4);
pc.big4fm = getIntegerToken(data, S_DELIM, 5);
#ifdef _CHANNEL_MODIFY
if (pc.familyleader == FMMEMBER_NONE){
pc.etcFlag &= ~PC_ETCFLAG_CHAT_FM;
TalkMode = 0;
}
#endif
break;
// HP,MP,EXP
case 'M':
data++;
pc.hp = getIntegerToken(data, '|', 1);
pc.mp = getIntegerToken(data, '|', 2);
pc.exp = getIntegerToken(data, '|', 3);
updataPcAct();
if ((pc.status & CHR_STATUS_LEADER) != 0 && party[0].useFlag != 0)
party[0].hp = pc.hp;
break;
case 'K':
{
char name[256], freeName[256];
int no, kubun, i;
unsigned int mask;
no = data[1] - '0';
data += 3;
kubun = getInteger62Token(data, S_DELIM, 1);
if (kubun == 0)
{
if (pet[no].useFlag)
{
if (no == pc.battlePetNo)
pc.battlePetNo = -1;
if (no == pc.mailPetNo)
pc.mailPetNo = -1;
pc.selectPetNo[no] = FALSE;
}
pet[no].useFlag = 0;
break;
}else{
pet[no].useFlag = 1;
if (kubun == 1){
pet[no].graNo = getIntegerToken(data, S_DELIM, 2); // 0x00000002
pet[no].hp = getIntegerToken(data, S_DELIM, 3); // 0x00000004
pet[no].maxHp = getIntegerToken(data, S_DELIM, 4); // 0x00000008
pet[no].mp = getIntegerToken(data, S_DELIM, 5); // 0x00000010
pet[no].maxMp = getIntegerToken(data, S_DELIM, 6); // 0x00000020
pet[no].exp = getIntegerToken(data, S_DELIM, 7); // 0x00000040
pet[no].maxExp = getIntegerToken(data, S_DELIM, 8); // 0x00000080
pet[no].level = getIntegerToken(data, S_DELIM, 9); // 0x00000100
pet[no].atk = getIntegerToken(data, S_DELIM, 10); // 0x00000200
pet[no].def = getIntegerToken(data, S_DELIM, 11); // 0x00000400
pet[no].quick = getIntegerToken(data, S_DELIM, 12); // 0x00000800
pet[no].ai = getIntegerToken(data, S_DELIM, 13); // 0x00001000
pet[no].earth = getIntegerToken(data, S_DELIM, 14); // 0x00002000
pet[no].water = getIntegerToken(data, S_DELIM, 15); // 0x00004000
pet[no].fire = getIntegerToken(data, S_DELIM, 16); // 0x00008000
pet[no].wind = getIntegerToken(data, S_DELIM, 17); // 0x00010000
pet[no].maxSkill= getIntegerToken(data, S_DELIM, 18); // 0x00020000
pet[no].changeNameFlag = getIntegerToken(data, S_DELIM, 19);// 0x00040000
pet[no].trn = getIntegerToken(data , S_DELIM, 20);
#ifdef _SHOW_FUSION
pet[no].fusion = getIntegerToken(data , S_DELIM, 21);
getStringToken(data, S_DELIM, 22, sizeof(name) - 1, name);// 0x00080000
makeStringFromEscaped(name);
if (strlen(name) <= PET_NAME_LEN)
strcpy(pet[no].name, name);
getStringToken(data, S_DELIM, 23, sizeof(freeName) - 1, freeName);// 0x00100000
makeStringFromEscaped(freeName);
if (strlen(freeName) <= PET_NAME_LEN)
strcpy(pet[no].freeName, freeName);
#else
getStringToken(data, S_DELIM, 21, sizeof(name) - 1, name);// 0x00080000
makeStringFromEscaped(name);
if (strlen(name) <= PET_NAME_LEN)
strcpy(pet[no].name, name);
getStringToken(data, S_DELIM, 22, sizeof(freeName) - 1, freeName);// 0x00100000
makeStringFromEscaped(freeName);
if (strlen(freeName) <= PET_NAME_LEN)
strcpy(pet[no].freeName, freeName);
#endif
#ifdef _PETCOM_
pet[no].oldhp = getIntegerToken(data, S_DELIM, 24);
pet[no].oldatk = getIntegerToken(data, S_DELIM, 25);
pet[no].olddef = getIntegerToken(data, S_DELIM, 26);
pet[no].oldquick = getIntegerToken(data, S_DELIM, 27);
pet[no].oldlevel = getIntegerToken(data, S_DELIM, 28);
#endif
#ifdef _RIDEPET_
pet[no].rideflg = getIntegerToken(data, S_DELIM, 29);
#endif
#ifdef _PETBLESS_
pet[no].blessflg = getIntegerToken(data, S_DELIM, 30);
pet[no].blesshp = getIntegerToken(data, S_DELIM, 31);
pet[no].blessatk = getIntegerToken(data, S_DELIM, 32);
pet[no].blessdef = getIntegerToken(data, S_DELIM, 33);
pet[no].blessquick = getIntegerToken(data, S_DELIM, 34);
#endif
}
else
{
mask = 2;
i = 2;
for (; mask > 0; mask <<= 1)
{
if (kubun & mask)
{
if (mask == 0x00000002)
{
pet[no].graNo = getIntegerToken(data, S_DELIM, i);// 0x00000002
i++;
}
else if (mask == 0x00000004)
{
pet[no].hp = getIntegerToken(data, S_DELIM, i);// 0x00000004
i++;
}
else if (mask == 0x00000008)
{
pet[no].maxHp = getIntegerToken(data, S_DELIM, i);// 0x00000008
i++;
}
else if (mask == 0x00000010)
{
pet[no].mp = getIntegerToken(data, S_DELIM, i);// 0x00000010
i++;
}
else if (mask == 0x00000020)
{
pet[no].maxMp = getIntegerToken(data, S_DELIM, i);// 0x00000020
i++;
}
else if (mask == 0x00000040)
{
pet[no].exp = getIntegerToken(data, S_DELIM, i);// 0x00000040
i++;
}
else if (mask == 0x00000080)
{
pet[no].maxExp = getIntegerToken(data, S_DELIM, i);// 0x00000080
i++;
}
else if (mask == 0x00000100)
{
pet[no].level = getIntegerToken(data, S_DELIM, i);// 0x00000100
i++;
}
else if (mask == 0x00000200)
{
pet[no].atk = getIntegerToken(data, S_DELIM, i);// 0x00000200
i++;
}
else if (mask == 0x00000400)
{
pet[no].def = getIntegerToken(data, S_DELIM, i);// 0x00000400
i++;
}
else if (mask == 0x00000800)
{
pet[no].quick = getIntegerToken(data, S_DELIM, i);// 0x00000800
i++;
}
else if (mask == 0x00001000 )
{
pet[no].ai = getIntegerToken(data, S_DELIM, i);// 0x00001000
i++;
}
else if (mask == 0x00002000)
{
pet[no].earth = getIntegerToken(data, S_DELIM, i);// 0x00002000
i++;
}
else if (mask == 0x00004000 )
{
pet[no].water = getIntegerToken(data, S_DELIM, i);// 0x00004000
i++;
}
else if (mask == 0x00008000)
{
pet[no].fire = getIntegerToken(data, S_DELIM, i);// 0x00008000
i++;
}
else if (mask == 0x00010000)
{
pet[no].wind = getIntegerToken(data, S_DELIM, i);// 0x00010000
i++;
}
else if (mask == 0x00020000)
{
pet[no].maxSkill = getIntegerToken(data, S_DELIM, i);// 0x00020000
i++;
}
else if (mask == 0x00040000)
{
pet[no].changeNameFlag = getIntegerToken(data, S_DELIM, i);// 0x00040000
i++;
}
else if (mask == 0x00080000)
{
getStringToken(data, S_DELIM, i, sizeof(name) - 1, name);// 0x00080000
makeStringFromEscaped(name);
if (strlen(name) <= PET_NAME_LEN)
strcpy(pet[no].name, name);
i++;
}
else if (mask == 0x00100000)
{
getStringToken(data, S_DELIM, i, sizeof(freeName) - 1, freeName);// 0x00100000
makeStringFromEscaped(freeName);
if (strlen(freeName) <= PET_NAME_LEN)
strcpy(pet[no].freeName, freeName);
i++;
}
#ifdef _PETCOM_
else if (mask == 0x200000)
{
pet[no].oldhp = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x400000)
{
pet[no].oldatk = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x800000)
{
pet[no].olddef = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x1000000)
{
pet[no].oldquick = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x2000000)
{
pet[no].oldlevel = getIntegerToken(data, S_DELIM, i);
i++;
}
#endif
#ifdef _PETBLESS_
else if (mask == 0x4000000)
{
pet[no].blessflg = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x8000000)
{
pet[no].blesshp = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x10000000)
{
pet[no].blessatk = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x20000000)
{
pet[no].blessquick = getIntegerToken(data, S_DELIM, i);
i++;
}
else if (mask == 0x40000000)
{
pet[no].blessdef = getIntegerToken(data, S_DELIM, i);
i++;
}
#endif
}
}
}
}
}
break;
case 'E':
{
data++;
minEncountPercentage = getIntegerToken(data, S_DELIM, 1);
maxEncountPercentage = getIntegerToken(data, S_DELIM, 2);
nowEncountPercentage = minEncountPercentage;
}
break;
case 'J':
{
char name[256], memo[256];
int no;
no = data[1] - '0';
data += 3;
magic[no].useFlag = getIntegerToken(data, S_DELIM, 1);
if (magic[no].useFlag != 0)
{
magic[no].mp = getIntegerToken(data, S_DELIM, 2);
magic[no].field = getIntegerToken(data, S_DELIM, 3);
magic[no].target = getIntegerToken(data, S_DELIM, 4);
if (magic[no].target >= 100)
{
magic[no].target %= 100;
magic[no].deadTargetFlag = 1;
}
else
magic[no].deadTargetFlag = 0;
getStringToken(data, S_DELIM, 5, sizeof(name) - 1, name);
makeStringFromEscaped(name);
if (strlen(name) <= sizeof(magic[no].name) - 1){
strcpy_s(magic[no].name, name);
}
getStringToken(data, S_DELIM, 6, sizeof(memo) - 1, memo);
makeStringFromEscaped(memo);
if (strlen(memo) <= sizeof(magic[no].memo) - 1){
strcpy_s(magic[no].memo, memo);
}
}
}
break;
case 'N':
{
ACTION *ptAct;
char name[256];
int no, kubun, i, checkPartyCount, gx, gy, no2;
unsigned int mask;
no = data[1] - 48;
data += 3;
kubun = getInteger62Token(data, S_DELIM, 1);
if (kubun == 0)
{
if (party[no].useFlag != 0 && party[no].id != pc.id)
{
ptAct = getCharObjAct(party[no].id);
if (ptAct != NULL)
delCharParty(ptAct);
}
gx = -1;
gy = -1;
if (party[no].ptAct != NULL)
{
gx = party[no].ptAct->nextGx;
gy = party[no].ptAct->nextGy;
}
party[no].useFlag = 0;
party[no].ptAct = NULL;
checkPartyCount = 0;
no2 = -1;
#ifdef MAX_AIRPLANENUM
for (i = 0; i < MAX_AIRPLANENUM; i++)
#else
for (i = 0; i < MAX_PARTY; i++)
#endif
{
if (party[i].useFlag != 0)
{
checkPartyCount++;
if (no2 == -1 && i > no)
no2 = i;
}
}
if (checkPartyCount <= 1)
{
partyModeFlag = 0;
clearPartyParam();
#ifdef _CHANNEL_MODIFY
pc.etcFlag &= ~PC_ETCFLAG_CHAT_MODE;
if (TalkMode == 2)
TalkMode = 0;
#endif
}
else
{
if (no2 >= 0 || gx >= 0 || gy >= 0)
goFrontPartyCharacter(no2, gx, gy);
}
break;
}
partyModeFlag = 1;
prSendFlag = 0;
party[no].useFlag = 1;
if (kubun == 1)
{
party[no].id = getIntegerToken(data, S_DELIM, 2); // 0x00000002
party[no].level = getIntegerToken(data, S_DELIM, 3); // 0x00000004
party[no].maxHp = getIntegerToken(data, S_DELIM, 4); // 0x00000008
party[no].hp = getIntegerToken(data, S_DELIM, 5); // 0x00000010
party[no].mp = getIntegerToken(data, S_DELIM, 6); // 0x00000020
getStringToken(data, S_DELIM, 7, sizeof(name) - 1, name); // 0x00000040
makeStringFromEscaped(name);
if (strlen(name) <= sizeof(party[no].name) - 1)
strcpy(party[no].name, name);
else
strcpy(party[no].name, "???");
}
else
{
mask = 2;
i = 2;
for (; mask > 0; mask <<= 1)
{
if (kubun & mask)
{
if (mask == 0x00000002)
{
party[no].id = getIntegerToken(data, S_DELIM, i);// 0x00000002
i++;
}
else if (mask == 0x00000004)
{
party[no].level = getIntegerToken(data, S_DELIM, i);// 0x00000004
i++;
}
else if (mask == 0x00000008)
{
party[no].maxHp = getIntegerToken(data, S_DELIM, i);// 0x00000008
i++;
}
else if (mask == 0x00000010)
{
party[no].hp = getIntegerToken(data, S_DELIM, i);// 0x00000010
i++;
}
else if (mask == 0x00000020)
{
party[no].mp = getIntegerToken(data, S_DELIM, i);// 0x00000020
i++;
}
else if (mask == 0x00000040)
{
getStringToken(data, S_DELIM, i, sizeof(name) - 1, name);// 0x00000040
makeStringFromEscaped(name);
if (strlen(name) <= sizeof(party[no].name) - 1)
strcpy(party[no].name, name);
else
strcpy(party[no].name, "???");
i++;
}
}
}
}
if (party[no].id != pc.id)
{
ptAct = getCharObjAct(party[no].id);
if (ptAct != NULL)
{
party[no].ptAct = ptAct;
setCharParty(ptAct);
// NPC???????
if (no == 0)
setCharLeader(ptAct);
}
else
party[no].ptAct = NULL;
}
else
{
party[no].ptAct = pc.ptAct;
setPcParty();
// PC???????
if (no == 0)
setPcLeader();
}
}
break;
case 'I':
{
int i, no;
char temp[256];
data++;
for (i = 0; i < MAX_ITEM; i++)
{
#ifdef _ITEM_JIGSAW
#ifdef _NPC_ITEMUP
#ifdef _ITEM_COUNTDOWN
no = i * 16;
#else
no = i * 15;
#endif
#else
no = i * 14;
#endif
#else
#ifdef _PET_ITEM
no = i * 13;
#else
#ifdef _ITEM_PILENUMS
#ifdef _ALCHEMIST //#ifdef _ITEMSET7_TXT
no = i * 14;
#else
no = i * 11;
#endif//_ALCHEMIST
#else
no = i * 10;
//end modified by lsh
#endif//_ITEM_PILENUMS
#endif//_PET_ITEM
#endif//_ITEM_JIGSAW
getStringToken(data, '|', no + 1, sizeof(temp) - 1 , temp);
makeStringFromEscaped(temp);
if (strlen(temp) == 0 )
{
pc.item[i].useFlag = 0;
continue;
}
pc.item[i].useFlag = 1;
if (strlen(temp) <= ITEM_NAME_LEN)
strcpy(pc.item[i].name, temp);
getStringToken(data, '|', no + 2, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
if (strlen(temp) <= ITEM_NAME2_LEN)
strcpy(pc.item[i].name2, temp);
pc.item[i].color = getIntegerToken(data, '|', no + 3);
if (pc.item[i].color < 0)
pc.item[i].color = 0;
getStringToken(data, '|', no + 4, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
if (strlen(temp) <= ITEM_MEMO_LEN)
strcpy(pc.item[i].memo, temp);
pc.item[i].graNo = getIntegerToken(data, '|', no + 5);
pc.item[i].field = getIntegerToken(data, '|', no + 6);
pc.item[i].target = getIntegerToken(data, '|', no + 7);
if (pc.item[i].target >= 100)
{
pc.item[i].target %= 100;
pc.item[i].deadTargetFlag = 1;
}
else
pc.item[i].deadTargetFlag = 0;
pc.item[i].level = getIntegerToken(data, '|', no + 8);
pc.item[i].sendFlag = getIntegerToken(data, '|', no + 9);
// <20><>ʾ<EFBFBD><CABE>Ʒ<EFBFBD>;ö<CDBE>
getStringToken(data, '|', no + 10, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
if (strlen(temp) <= 16)
strcpy(pc.item[i].damage, temp);
#ifdef _ITEM_PILENUMS
getStringToken(data, '|', no + 11, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
pc.item[i].pile = atoi(temp);
#endif
#ifdef _ALCHEMIST //_ITEMSET7_TXT
getStringToken(data, '|', no + 12, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
strcpy(pc.item[i].alch, temp);
#endif
#ifdef _PET_ITEM
pc.item[i].type = getIntegerToken(data, '|', no + 13);
#else
#ifdef _MAGIC_ITEM_
pc.item[i].<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = getIntegerToken(data, '|', no + 13);
#endif
#endif
#ifdef _ITEM_JIGSAW
getStringToken(data, '|', no + 14, sizeof(temp) - 1 , temp);
if (strlen(temp) <= 10)
strcpy(pc.item[i].jigsaw, temp);
#endif
#ifdef _NPC_ITEMUP
pc.item[i].itemup = getIntegerToken(data, '|', no + 15);
#endif
#ifdef _ITEM_COUNTDOWN
pc.item[i].counttime = getIntegerToken(data, '|', no + 16);
#endif
}
}
break;
//<2F><><EFBFBD>յ<EFBFBD><D5B5>ij<EFBFBD><C4B3><EFBFBD><EFBCBC>
case 'W':
{
int i, no, no2;
char temp[256];
no = data[1] - '0';
data += 3;
for (i = 0; i < MAX_SKILL; i++)
petSkill[no][i].useFlag = 0;
for (i = 0; i < MAX_SKILL; i++)
{
no2 = i * 5;
getStringToken(data, '|', no2 + 4, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
if (strlen(temp) == 0)
continue;
petSkill[no][i].useFlag = 1;
if (strlen(temp) <= SKILL_NAME_LEN)
strcpy(petSkill[no][i].name, temp);
else
strcpy(petSkill[no][i].name, "??? name ???");
petSkill[no][i].skillId = getIntegerToken(data, '|', no2 + 1);
petSkill[no][i].field = getIntegerToken(data, '|', no2 + 2);
petSkill[no][i].target = getIntegerToken(data, '|', no2 + 3);
getStringToken(data, '|', no2 + 5, sizeof(temp) - 1, temp);
makeStringFromEscaped(temp);
if (strlen(temp) <= SKILL_MEMO_LEN)
strcpy(petSkill[no][i].memo, temp);
else
strcpy(petSkill[no][i].memo, "??? memo ???");
}
}
break;
#ifdef _CHAR_PROFESSION // WON ADD <20><><EFBFBD><EFBFBD>ְҵ
case 'S':
{
char name[CHAR_NAME_LEN + 1];
char memo[PROFESSION_MEMO_LEN + 1];
int i, count = 0;
data++;
for (i = 0; i < MAX_PROFESSION_SKILL; i++)
{
profession_skill[i].useFlag = 0;
profession_skill[i].kind = 0;
}
for (i = 0; i < MAX_PROFESSION_SKILL; i++)
{
count = i * 9;
profession_skill[i].useFlag = getIntegerToken(data, S_DELIM, 1 + count);
profession_skill[i].skillId = getIntegerToken(data, S_DELIM, 2 + count);
profession_skill[i].target = getIntegerToken(data, S_DELIM, 3 + count);
profession_skill[i].kind = getIntegerToken(data, S_DELIM, 4 + count);
profession_skill[i].icon = getIntegerToken(data, S_DELIM, 5 + count);
profession_skill[i].costmp = getIntegerToken(data, S_DELIM, 6 + count);
profession_skill[i].skill_level = getIntegerToken(data, S_DELIM, 7 + count);
memset(name, 0, sizeof(name));
getStringToken(data, S_DELIM, 8 + count, sizeof(name) - 1, name);
makeStringFromEscaped(name);
if (strlen(name) <= CHAR_NAME_LEN)
strcpy(profession_skill[i].name, name);
memset(memo, 0, sizeof(memo));
getStringToken(data, S_DELIM, 9 + count, sizeof(memo) - 1, memo);
makeStringFromEscaped(memo);
if (strlen(memo) <= PROFESSION_MEMO_LEN)
strcpy(profession_skill[i].memo, memo);
}
#ifdef _SKILLSORT
SortSkill();
#endif
}
break;
#endif
#ifdef _PRO3_ADDSKILL
case 'G':
{
int i, count = 0;
data++;
for (i = 0; i < MAX_PROFESSION_SKILL; i++)
profession_skill[i].cooltime = 0;
for (i = 0; i < MAX_PROFESSION_SKILL; i++)
{
count = i * 1;
profession_skill[i].cooltime = getIntegerToken(data, S_DELIM, 1 + count);
}
}
break;
#endif
#ifdef _PET_ITEM
case 'B':
{
int i, no, nPetIndex;
char szData[256];
nPetIndex = data[1] - '0';
data += 2;
for (i = 0; i < MAX_PET_ITEM; i++)
{
#ifdef _ITEM_JIGSAW
#ifdef _NPC_ITEMUP
#ifdef _ITEM_COUNTDOWN
no = i * 16;
#else
no = i * 15;
#endif
#else
no = i * 14;
#endif
#else
no = i * 13;
#endif
getStringToken(data, '|', no + 1, sizeof(szData) - 1, szData);
makeStringFromEscaped(szData);
if (strlen(szData) == 0) // û<><C3BB><EFBFBD><EFBFBD>
{
memset(&pet[nPetIndex].item[i], 0, sizeof(pet[nPetIndex].item[i]));
continue;
}
pet[nPetIndex].item[i].useFlag = 1;
if (strlen(szData) <= ITEM_NAME_LEN)
strcpy(pet[nPetIndex].item[i].name, szData);
getStringToken(data, '|', no + 2, sizeof(szData) - 1, szData);
makeStringFromEscaped(szData);
if (strlen(szData) <= ITEM_NAME2_LEN)
strcpy(pet[nPetIndex].item[i].name2, szData);
pet[nPetIndex].item[i].color = getIntegerToken(data, '|', no + 3);
if (pet[nPetIndex].item[i].color < 0)
pet[nPetIndex].item[i].color = 0;
getStringToken(data, '|', no + 4, sizeof(szData) - 1, szData);
makeStringFromEscaped(szData);
if (strlen(szData) <= ITEM_MEMO_LEN)
strcpy(pet[nPetIndex].item[i].memo, szData);
pet[nPetIndex].item[i].graNo = getIntegerToken(data, '|', no + 5);
pet[nPetIndex].item[i].field = getIntegerToken(data, '|', no + 6);
pet[nPetIndex].item[i].target = getIntegerToken(data, '|', no + 7);
if (pet[nPetIndex].item[i].target >= 100)
{
pet[nPetIndex].item[i].target %= 100;
pet[nPetIndex].item[i].deadTargetFlag = 1;
}
else
pet[nPetIndex].item[i].deadTargetFlag = 0;
pet[nPetIndex].item[i].level = getIntegerToken(data, '|', no + 8);
pet[nPetIndex].item[i].sendFlag = getIntegerToken(data, '|', no + 9);
// <20><>ʾ<EFBFBD><CABE>Ʒ<EFBFBD>;ö<CDBE>
getStringToken(data, '|', no + 10, sizeof(szData) - 1, szData);
makeStringFromEscaped(szData);
if (strlen(szData) <= 16)
strcpy(pet[nPetIndex].item[i].damage, szData);
pet[nPetIndex].item[i].pile = getIntegerToken(data, '|', no + 11);
#ifdef _ALCHEMIST //_ITEMSET7_TXT
getStringToken(data, '|', no + 12, sizeof(szData) - 1, szData);
makeStringFromEscaped(szData);
strcpy(pet[nPetIndex].item[i].alch, szData);
#endif
pet[nPetIndex].item[i].type = getIntegerToken(data, '|', no + 13);
#ifdef _ITEM_JIGSAW
getStringToken(data, '|', no + 14, sizeof(szData) - 1, szData);
makeStringFromEscaped(szData);
strcpy( pet[nPetIndex].item[i].jigsaw, szData );
//<2F><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>,<2C>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD>ƴͼ<C6B4><CDBC>,<2C><><EFBFBD>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD>
//if( i == JigsawIdx )
// SetJigsaw( pc.item[i].graNo, pc.item[i].jigsaw );
#endif
#ifdef _NPC_ITEMUP
pet[nPetIndex].item[i].itemup = getIntegerToken(data, '|', no + 15);
#endif
#ifdef _ITEM_COUNTDOWN
pet[nPetIndex].item[i].counttime = getIntegerToken(data, '|', no + 16);
#endif
}
}
break;
#endif
}
}
void lssproto_MC_recv( int fd, int fl, int x1, int y1, int x2, int y2, int tileSum, int partsSum, int eventSum, char *data)
{
char showString[512], floorName[32];
if (logOutFlag)
return;
#ifdef DEBUGPUSH
char msg[800];
sprintf_s(msg, "<EFBFBD><EFBFBD>???????????????FL%d %d,%d-%d,%d (%ud/%ud)", fl, x1, y1, x2, y2, tileSum, partsSum);
PUSH(msg);
#endif
getStringToken(data, '|', 1, sizeof(showString) - 1, showString);
makeStringFromEscaped(showString);
if (nowFloor == fl)
{
char strPal[32];
getStringToken(showString, '|', 1, sizeof(floorName) - 1, floorName);
if (strlen(floorName) <= FLOOR_NAME_LEN)
strcpy(nowFloorName, floorName);
else
strcpy(nowFloorName, "???");
palNo = -2;
getStringToken(showString, '|', 2, sizeof(strPal) - 1, strPal);
if (strlen(strPal) == 0)
{
if (TimeZonePalChangeFlag == FALSE || loginFlag)
{
palNo = -1;
palTime = 0;
drawTimeAnimeFlag = 1;
}
}
else
{
int pal;
pal = atoi(strPal);
if (pal >= 0)
{
if (TimeZonePalChangeFlag == TRUE || loginFlag)
{
palNo = pal;
palTime = 0;
drawTimeAnimeFlag = 0;
}
}
else
{
if (TimeZonePalChangeFlag == FALSE || loginFlag)
{
palNo = -1;
palTime = 0;
drawTimeAnimeFlag = 1;
}
}
}
}
if (mapCheckSum(fl, x1, y1, x2, y2, tileSum, partsSum, eventSum))
{
if (nowFloor == fl)
{
floorChangeFlag = FALSE;
if (warpEffectStart)
warpEffectOk = TRUE;
}
loginFlag = FALSE;
}
}
void lssproto_M_recv(int fd, int fl, int x1, int y1, int x2, int y2, char* data)
{
char showString[512], floorName[32], tilestring[18192], partsstring[18192], eventstring[18192], tmp[100];
unsigned short tile[2048] , parts[2048], event[2048];
int i, flag;
if (logOutFlag)
return;
#ifdef DEBUGPUSH
char msg[800];
sprintf_s(msg , "??????<3F><>????????FL%d %d,%d-%d,%d", fl, x1, y1, x2, y2);
PUSH(msg);
#endif
getStringToken(data, '|', 1, sizeof(showString) - 1, showString);
makeStringFromEscaped(showString);
if (nowFloor == fl)
{
char strPal[32];
getStringToken(showString, '|', 1, sizeof(floorName) - 1, floorName);
if (strlen(floorName) <= FLOOR_NAME_LEN)
strcpy(nowFloorName, floorName);
else
strcpy(nowFloorName, "???");
palNo = -2;
getStringToken(showString, '|', 2, sizeof(strPal) - 1, strPal);
if (strlen(strPal) == 0)
{
if (TimeZonePalChangeFlag == FALSE || loginFlag)
{
palNo = -1;
palTime = 0;
drawTimeAnimeFlag = 1;
}
}
else
{
int pal;
pal = atoi(strPal);
if (pal >= 0)
{
if (TimeZonePalChangeFlag == TRUE || loginFlag)
{
palNo = pal;
palTime = 0;
drawTimeAnimeFlag = 0;
}
}
else
{
if (TimeZonePalChangeFlag == FALSE || loginFlag)
{
palNo = -1;
palTime = 0;
drawTimeAnimeFlag = 1;
}
}
}
}
getStringToken(data, '|', 2, sizeof(tilestring) - 1, tilestring);
getStringToken(data, '|', 3, sizeof(partsstring) - 1, partsstring);
getStringToken(data, '|', 4, sizeof(eventstring) - 1, eventstring);
for (i = 0; ; i++)
{
flag = getStringToken(tilestring, ',', i + 1, sizeof(tmp) - 1, tmp);
tile[i] = a62toi(tmp);
getStringToken(partsstring, ',', i + 1, sizeof(tmp) - 1, tmp);
parts[i] = a62toi(tmp);
getStringToken(eventstring, ',', i + 1, sizeof(tmp) - 1, tmp);
event[i] = a62toi(tmp);
if (flag == 1)
break;
}
writeMap(fl, x1, y1, x2, y2, tile, parts, event);
if (mapEmptyFlag || floorChangeFlag)
{
if (nowFloor == fl)
{
redrawMap();
floorChangeFlag = FALSE;
if (warpEffectStart)
warpEffectOk = TRUE;
}
}
loginFlag = FALSE;
}
/*===========================
1 OBJTYPE_CHARA
2 OBJTYPE_ITEM
3 OBJTYPE_GOLD
4 NPC&other player
===========================*/
void lssproto_C_recv(int fd, char *data)
{
int i, j, id, x, y, dir, graNo, level, nameColor, walkable, height, classNo, money, charType, charNameColor;
char bigtoken[2048], smalltoken[2048], name[2048], freeName[2048], info[1024], fmname[2048], petname[1024];
#ifdef _CHARTITLE_STR_
char titlestr[128];
int titleindex=0;
*titlestr = 0;
#endif
int petlevel;
#ifdef _CHAR_PROFESSION // WON ADD <20><><EFBFBD><EFBFBD>ְҵ
int profession_class, profession_level, profession_skill_point;
#endif
#ifdef _ALLDOMAN // (<28><><EFBFBD>ɿ<EFBFBD>) Syu ADD <20><><EFBFBD>а<EFBFBD>NPC
int herofloor;
#endif
#ifdef _NPC_PICTURE
int picture;
#endif
#ifdef _NPC_EVENT_NOTICE
int noticeNo;
#endif
ACTION *ptAct;
if (logOutFlag)
return;
if (encountNowFlag)
return;
for (i = 0; ; i++)
{
getStringToken(data, ',', i + 1, sizeof(bigtoken) - 1, bigtoken);
if (strlen(bigtoken) == 0)
break;
#ifdef _OBJSEND_C
getStringToken(bigtoken, '|', 1, sizeof(smalltoken) - 1, smalltoken);
if (strlen(smalltoken) == 0)
return;
switch (atoi(smalltoken))
{
case 1://OBJTYPE_CHARA
charType = getIntegerToken(bigtoken, '|', 2);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
extern BOOL <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD>;
if(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><EFBFBD><EFBFBD>){
if(id != pc.id){
if(charType <4 )
continue;
}
}
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 5, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 6, sizeof(smalltoken) - 1, smalltoken);
dir = (atoi(smalltoken) + 3) % 8;
getStringToken(bigtoken, '|', 7, sizeof(smalltoken) - 1, smalltoken);
graNo = atoi(smalltoken);
if(graNo==9999) continue;
getStringToken(bigtoken, '|', 8, sizeof(smalltoken) - 1,smalltoken);
level = atoi(smalltoken);
nameColor = getIntegerToken(bigtoken, '|', 9);
getStringToken(bigtoken, '|', 10, sizeof(name) - 1, name);
makeStringFromEscaped(name);
getStringToken(bigtoken, '|', 11, sizeof(freeName) - 1, freeName);
makeStringFromEscaped(freeName);
getStringToken(bigtoken, '|', 12, sizeof(smalltoken) - 1, smalltoken);
walkable = atoi(smalltoken);
getStringToken(bigtoken, '|', 13, sizeof(smalltoken) - 1, smalltoken);
height = atoi(smalltoken);
charNameColor = getIntegerToken(bigtoken, '|', 14);
getStringToken(bigtoken , '|', 15, sizeof(fmname) - 1, fmname);
makeStringFromEscaped(fmname);
getStringToken(bigtoken , '|', 16, sizeof(petname) - 1, petname);
makeStringFromEscaped(petname);
getStringToken(bigtoken, '|', 17, sizeof(smalltoken) - 1, smalltoken);
petlevel = atoi(smalltoken);
#ifdef _NPC_EVENT_NOTICE
getStringToken(bigtoken, '|', 18, sizeof(smalltoken) - 1, smalltoken);
noticeNo = atoi(smalltoken);
#endif
#ifdef _CHARTITLE_STR_
getStringToken(bigtoken, '|', 23, sizeof(titlestr) - 1, titlestr);
titleindex = atoi(titlestr);
memset(titlestr,0,128);
if(titleindex > 0){
extern char* FreeGetTitleStr(int id);
sprintf(titlestr,"%s",FreeGetTitleStr(titleindex));
}
#endif
#ifdef _CHAR_PROFESSION // WON ADD <20><><EFBFBD><EFBFBD>ְҵ
getStringToken(bigtoken, '|', 18, sizeof(smalltoken) - 1, smalltoken);
profession_class = atoi(smalltoken);
getStringToken(bigtoken, '|', 19, sizeof(smalltoken) - 1, smalltoken);
profession_level = atoi(smalltoken);
// getStringToken(bigtoken, '|', 20, sizeof(smalltoken) - 1, smalltoken);
// profession_exp = atoi(smalltoken);
getStringToken(bigtoken, '|', 20, sizeof(smalltoken) - 1, smalltoken);
profession_skill_point = atoi(smalltoken);
#ifdef _ALLDOMAN // Syu ADD <20><><EFBFBD>а<EFBFBD>NPC
getStringToken(bigtoken, '|', 21, sizeof(smalltoken) - 1, smalltoken);
herofloor = atoi(smalltoken);
#endif
#ifdef _NPC_PICTURE
getStringToken(bigtoken, '|', 22, sizeof(smalltoken) - 1, smalltoken);
picture = atoi(smalltoken);
#endif
// #ifdef _GM_IDENTIFY // Rog ADD GMʶ<4D><CAB6>
// getStringToken(bigtoken , '|', 23 , sizeof( gm_name ) - 1, gm_name );
// makeStringFromEscaped( gm_name );
// #endif
#endif
if (charNameColor < 0)
charNameColor = 0;
if (pc.id == id)
{
if (pc.ptAct == NULL)
{
createPc(graNo, x, y, dir);
updataPcAct();
}
else
setPcGraNo(graNo, pc.dir);
#ifdef _CHARTITLE_STR_
getCharTitleSplit(titlestr,&pc.ptAct->TitleText);
#endif
updateMapArea();
#ifdef _CHAR_PROFESSION // WON ADD <20><><EFBFBD><EFBFBD>ְҵ
// #ifdef _GM_IDENTIFY // Rog ADD GMʶ<4D><CAB6>
// setPcParam(name, freeName, level, petname, petlevel, nameColor, walkable, height, profession_class, profession_level, profession_exp, profession_skill_point , gm_name);
// setPcParam(name, freeName, level, petname, petlevel, nameColor, walkable, height, profession_class, profession_level, profession_skill_point , gm_name);
// #else
// setPcParam(name, freeName, level, petname, petlevel, nameColor, walkable, height, profession_class, profession_level, profession_exp, profession_skill_point);
#ifdef _ALLDOMAN // Syu ADD <20><><EFBFBD>а<EFBFBD>NPC
setPcParam(name, freeName, level, petname, petlevel, nameColor, walkable, height, profession_class, profession_level, profession_skill_point , herofloor);
#else
setPcParam(name, freeName, level, petname, petlevel, nameColor, walkable, height, profession_class, profession_level, profession_skill_point);
#endif
// #endif
#else
setPcParam(name, freeName, level, petname, petlevel, nameColor, walkable, height);
#endif
setPcNameColor(charNameColor);
if ((pc.status & CHR_STATUS_LEADER) != 0 && party[0].useFlag != 0)
{
party[0].level = pc.level;
strcpy(party[0].name, pc.name);
}
#ifdef MAX_AIRPLANENUM
for (j = 0; j < MAX_AIRPLANENUM; j++)
#else
for (j = 0; j < MAX_PARTY; j++)
#endif
{
if (party[j].useFlag != 0 && party[j].id == id)
{
party[j].ptAct = pc.ptAct;
setPcParty();
if (j == 0)
setPcLeader();
break;
}
}
}
else
{
#ifdef _CHAR_PROFESSION // WON ADD <20><><EFBFBD><EFBFBD>ְҵ
#ifdef _GM_IDENTIFY // Rog ADD GMʶ<4D><CAB6>
setNpcCharObj(id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType, profession_class, gm_name);
#else
#ifdef _NPC_PICTURE
setNpcCharObj(id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType, profession_class, picture );
#else
setNpcCharObj(id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType, profession_class );
#endif
#endif
#else
#ifdef _NPC_EVENT_NOTICE
setNpcCharObj(id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType,noticeNo
#ifdef _CHARTITLE_STR_
,titlestr
#endif
);
#else
setNpcCharObj(id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType);
#endif
#endif
ptAct = getCharObjAct(id);
#ifdef _NPC_EVENT_NOTICE
// noticeNo=120137;
if(charType==13 && noticeNo>0){
setNpcNotice( ptAct, noticeNo);
}
#endif
if (ptAct != NULL)
{
#ifdef MAX_AIRPLANENUM
for (j = 0; j < MAX_AIRPLANENUM; j++)
#else
for (j = 0; j < MAX_PARTY; j++)
#endif
{
if (party[j].useFlag != 0 && party[j].id == id)
{
party[j].ptAct = ptAct;
setCharParty(ptAct);
if (j == 0)
setCharLeader(ptAct);
break;
}
}
setCharNameColor(ptAct, charNameColor);
}
}
break;
case 2://OBJTYPE_ITEM
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 5, sizeof(smalltoken) - 1, smalltoken);
graNo = atoi(smalltoken);
classNo = getIntegerToken(bigtoken, '|', 6);
getStringToken(bigtoken, '|', 7, sizeof(info) - 1, info);
makeStringFromEscaped(info);
setItemCharObj(id, graNo, x, y, 0, classNo, info);
break;
case 3://OBJTYPE_GOLD
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 5, sizeof(smalltoken) - 1, smalltoken);
money = atoi(smalltoken);
sprintf_s(info, "%d Stone", money);
if (money > 10000)
setMoneyCharObj(id, 24050, x, y, 0, money, info);
else if (money > 1000)
setMoneyCharObj(id, 24051, x, y, 0, money, info);
else
setMoneyCharObj(id, 24052, x, y, 0, money, info);
break;
case 4:
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(name) - 1, name);
makeStringFromEscaped(name);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
dir = (atoi(smalltoken) + 3) % 8;
getStringToken(bigtoken, '|', 5, sizeof(smalltoken) - 1, smalltoken);
graNo = atoi(smalltoken);
getStringToken(bigtoken, '|', 6, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 7, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
#ifdef _CHAR_PROFESSION // WON ADD <20><><EFBFBD><EFBFBD>ְҵ
#ifdef _GM_IDENTIFY // Rog ADD GMʶ<4D><CAB6>
setNpcCharObj( id, graNo, x, y, dir, "", name, "",
level, petname, petlevel, nameColor, 0, height, 2, 0, "");
#else
#ifdef _NPC_PICTURE
setNpcCharObj( id, graNo, x, y, dir, "", name, "",
level, petname, petlevel, nameColor, 0, height, 2, 0, 0 );
#else
setNpcCharObj( id, graNo, x, y, dir, "", name, "",
level, petname, petlevel, nameColor, 0, height, 2, 0 );
#endif
#endif
#else
#ifdef _NPC_EVENT_NOTICE
setNpcCharObj( id, graNo, x, y, dir, "", name, "",
level, petname, petlevel, nameColor, 0, height, 2, 0
#ifdef _CHARTITLE_STR_
,titlestr
#endif
);
#else
setNpcCharObj( id, graNo, x, y, dir, "", name, "",
level, petname, petlevel, nameColor, 0, height, 2);
#endif
#endif
ptAct = getCharObjAct( id );
break;
}
#else
getStringToken(bigtoken , '|' , 11 , sizeof(smalltoken) - 1, smalltoken);
if ( strlen(smalltoken) > 0 ){
// NPC?<3F>ѩ<EFBFBD>
charType = getIntegerToken(bigtoken, '|', 1 );
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 5, sizeof(smalltoken) - 1, smalltoken);
dir = (atoi(smalltoken) + 3) % 8;
getStringToken(bigtoken, '|', 6, sizeof(smalltoken) - 1, smalltoken);
graNo = atoi(smalltoken);
getStringToken(bigtoken, '|', 7, sizeof(smalltoken) - 1,smalltoken);
level = atoi(smalltoken);
nameColor = getIntegerToken(bigtoken, '|', 8 );
getStringToken(bigtoken , '|' , 9 , sizeof(name) - 1, name );
makeStringFromEscaped(name);
getStringToken(bigtoken , '|' , 10 , sizeof( freeName ) - 1, freeName );
makeStringFromEscaped( freeName );
getStringToken(bigtoken, '|', 11, sizeof(smalltoken) - 1, smalltoken);
walkable = atoi(smalltoken);
getStringToken(bigtoken, '|', 12, sizeof(smalltoken) - 1, smalltoken);
height = atoi(smalltoken);
charNameColor = getIntegerToken(bigtoken, '|', 13 );
getStringToken(bigtoken , '|' , 14, sizeof( fmname ) - 1, fmname );
makeStringFromEscaped( fmname );
getStringToken(bigtoken , '|' , 15 , sizeof( petname ) - 1, petname );
makeStringFromEscaped( petname );
getStringToken(bigtoken, '|', 16, sizeof(smalltoken) - 1, smalltoken);
petlevel = atoi(smalltoken);
if ( charNameColor < 0 )
charNameColor = 0;
if ( pc.id == id ){
if ( pc.ptAct == NULL ){
createPc( graNo, x, y, dir );
updataPcAct();
}else{
setPcGraNo( graNo, pc.dir );
}
updateMapArea();
setPcParam( name, freeName, level, petname, petlevel, nameColor, walkable, height );
setPcNameColor( charNameColor );
if ( (pc.status & CHR_STATUS_LEADER) != 0
&& party[0].useFlag != 0 ){
party[0].level = pc.level;
strcpy( party[0].name, pc.name );
}
for ( j = 0; j < MAX_PARTY; j++ ){
if ( party[j].useFlag != 0 && party[j].id == id ){
party[j].ptAct = pc.ptAct;
setPcParty();
if ( j == 0 ){
setPcLeader();
}
break;
}
}
}else{
#ifdef _NPC_PICTURE
setNpcCharObj( id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType, 0 );
#else
setNpcCharObj( id, graNo, x, y, dir, fmname, name, freeName,
level, petname, petlevel, nameColor, walkable, height, charType );
#endif
ptAct = getCharObjAct( id );
if ( ptAct != NULL ){
for ( j = 0; j < MAX_PARTY; j++ ){
if ( party[j].useFlag != 0 && party[j].id == id ){
party[j].ptAct = ptAct;
setCharParty( ptAct );
if ( j == 0 ){
setCharLeader( ptAct );
}
break;
}
}
setCharNameColor( ptAct, charNameColor );
}
}
}else{
getStringToken(bigtoken, '|', 6, sizeof(smalltoken) - 1, smalltoken);
if ( strlen(smalltoken) > 0 ){
getStringToken(bigtoken, '|', 1, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
graNo = atoi(smalltoken);
classNo = getIntegerToken(bigtoken, '|', 5 );
getStringToken(bigtoken, '|', 6, sizeof( info ) - 1, info );
makeStringFromEscaped( info );
setItemCharObj( id, graNo, x, y, 0, classNo, info );
}else{
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
if ( strlen(smalltoken) > 0 ){
getStringToken(bigtoken, '|', 1, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
money = atoi(smalltoken);
sprintf_s( info, "%d Stone", money );
if ( money > 10000 ){
setMoneyCharObj( id, 24050, x, y, 0, money, info );
}else
if ( money > 1000 ){
setMoneyCharObj( id, 24051, x, y, 0, money, info );
}else{
setMoneyCharObj( id, 24052, x, y, 0, money, info );
}
}
}
}
#endif
}
}
void lssproto_CA_recv( int fd, char *data )
{
char bigtoken[2048];
char smalltoken[2048];
int alreadytellC[1024];
int tellCindex = 0;
int tellflag;
int i, j;
int charindex;
int x;
int y;
int act;
int dir;
int effectno = 0, effectparam1 = 0, effectparam2 = 0;
#ifdef _STREET_VENDOR
char szStreetVendorTitle[32];
#endif
ACTION *ptAct;
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
// <20>P<EFBFBD>f??<3F><>???
if ( encountNowFlag )
{
return;
}
for ( i = 0; ; i++ )
{
getStringToken(data, ',', i+1, sizeof(bigtoken ) - 1, bigtoken );
if ( strlen(bigtoken ) == 0 )
break;
getStringToken(bigtoken, '|', 1, sizeof(smalltoken) - 1, smalltoken);
charindex = a62toi(smalltoken);
getStringToken(bigtoken, '|', 2, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken(bigtoken, '|', 3, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken(bigtoken, '|', 4, sizeof(smalltoken) - 1, smalltoken);
act = atoi(smalltoken);
getStringToken(bigtoken, '|', 5, sizeof(smalltoken) - 1, smalltoken);
dir = (atoi(smalltoken)+3)%8;
getStringToken(bigtoken, '|', 6, sizeof(smalltoken) - 1, smalltoken);
#ifdef _STREET_VENDOR
if (act == 41) strncpy_s(szStreetVendorTitle,sizeof(szStreetVendorTitle),smalltoken,sizeof(szStreetVendorTitle));
else
#endif
{
effectno = atoi(smalltoken);
effectparam1 = getIntegerToken(bigtoken, '|', 7 );
effectparam2 = getIntegerToken(bigtoken, '|', 8 );
}
if ( pc.id == charindex )
{
// PC????<3F>h?<3F><>?
if ( pc.ptAct == NULL
|| (pc.ptAct != NULL && pc.ptAct->anim_chr_no == 0) )
{
// ?????<3F><>??????C????????????
if (bNewServer)
lssproto_C_send(sockfd, charindex );
else
old_lssproto_C_send(sockfd, charindex );
}
else
{
#ifdef _STREET_VENDOR
if (act == 41){
if (pc.iOnStreetVendor == 1){
memset(pc.ptAct->szStreetVendorTitle,0,sizeof(pc.ptAct->szStreetVendorTitle));
sprintf_s(pc.ptAct->szStreetVendorTitle,sizeof(pc.ptAct->szStreetVendorTitle),"%s",szStreetVendorTitle);
changePcAct( x, y, dir, act, effectno, effectparam1, effectparam2 );
#ifdef _STREET_VENDOR_CHANGE_ICON
if (bNewServer)
lssproto_AC_send(sockfd,nowGx,nowGy,5);
else
old_lssproto_AC_send(sockfd,nowGx,nowGy,5);
setPcAction(5);
#endif
}
}
else
#endif
changePcAct( x, y, dir, act, effectno, effectparam1, effectparam2 );
}
continue;
}
ptAct = getCharObjAct( charindex );
if ( ptAct == NULL )
{
// <20>i?ID?<3F><>??????????????????ID??????
tellflag = 0;
for ( j = 0; j < tellCindex; j++ )
{
if ( alreadytellC[j] == charindex )
{
tellflag = 1;
break;
}
}
if ( tellflag == 0 && tellCindex < sizeof(alreadytellC) )
{
alreadytellC[tellCindex] = charindex;
tellCindex++;
if (bNewServer)
lssproto_C_send(sockfd, charindex );
else
old_lssproto_C_send(sockfd, charindex );
}
}
else
{
#ifdef _STREET_VENDOR
if (act == 41){
memset(ptAct->szStreetVendorTitle,0,sizeof(ptAct->szStreetVendorTitle));
strncpy_s(ptAct->szStreetVendorTitle,szStreetVendorTitle,sizeof(szStreetVendorTitle));
}
#endif
changeCharAct( ptAct, x, y, dir, act, effectno, effectparam1, effectparam2 );
}
}
}
// ?????<3F><>
void lssproto_CD_recv( int fd, char *data )
{
int i, j;
int id;
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
for ( i = 1; ; i++ )
{
// id = getInteger62Token(data, '|', i );
id = getInteger62Token(data, ',', i );
if ( id == -1 )
break;
delCharObj( id );
#ifdef MAX_AIRPLANENUM
for (j = 0; j < MAX_AIRPLANENUM; j++)
#else
for ( j = 0; j < MAX_PARTY; j++ )
#endif
{
if ( party[j].useFlag != 0 && party[j].id == id )
{
party[j].ptAct = NULL;
break;
}
}
}
}
// ?<3F>h ///////////////////////////////////////////////////////////////////
// ?????<3F>h?????<3F><>??
void walkSendForServer( int x, int y, char *direction )
{
#ifdef _REMAKE_20
if (!ChangedLibrary())
RestoreLibrary();
#endif
if (bNewServer)
lssproto_W_send(sockfd , x, y, direction );
else
old_lssproto_W_send(sockfd , x, y, direction );
}
// ?????<3F>h?????<3F><>??
// ????????????????????<3F>T??????????<3F><>????
void noChecksumWalkSendForServer( int x, int y, char *direction )
{
if (bNewServer)
lssproto_W2_send(sockfd , x, y, direction );
else
old_lssproto_w_send(sockfd , x, y, direction );
}
// ?<3F>h?????<3F><>?<3F><><EFBFBD><EFBFBD>
void lssproto_W_recv( int fd, int id, int x, int y )
{
// ??????<3F>R<EFBFBD>e???????????
// ??????????????????????
}
#ifdef _SETTICK_COUNT
float *fTalkTick=NULL;
#endif
void chatStrSendForServer( char *str, int color )
{
char dest[1024], m[1024];
int x, y;
#ifdef _FRIENDCHANNEL
char tmpMsg[128];
#endif
#ifdef _TELLCHANNEL
char tmp1[128] ;
#endif
#ifdef _STONDEBUG_ // <20>ֶ<EFBFBD><D6B6>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>
{
if ( !strncmp( str, "send ", 5) ) {
sendDataToServer( str+5);
return;
}
}
#endif
#ifdef _SETTICK_COUNT
if ( fTalkTick == NULL || (GetTickCount() - *fTalkTick) > 60000 ){
FREE( fTalkTick);
#ifdef _STONDEBUG_
g_iMallocCount--;
#endif
fTalkTick = (float *)MALLOC( sizeof(float));
#ifdef _STONDEBUG_
g_iMallocCount++;
#endif
*fTalkTick = (float)0.00;
}
if ( (GetTickCount() - *fTalkTick) > 2500 ){
*fTalkTick = (float)GetTickCount();
}else{
return;
}
#endif
#ifdef _CHAR_MANOR_DEBUG
if(strstr(str,".<2E>")){
int <EFBFBD>ID=0;
<EFBFBD>ID = getIntegerToken(str, ' ',2);
setCharmManor(pc.ptAct, <EFBFBD>ID);
return;
}
#endif
x = nowGx;
y = nowGy;
makeEscapeString( str, dest, sizeof(dest) );
#ifdef _TELLCHANNEL
getStringToken( str , ' ', 1, sizeof( tmp1 ) -1, tmp1 );
char *found;
char tellName[32]={""};
switch (TalkMode){
case 0:
#ifdef _THEATER
if (pc.iTheaterMode & 0x00000001)
{
StockChatBufferLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", FONT_PAL_YELLOW);
return;
}
#endif
#ifdef _NPC_DANCE
if( pc.iDanceMode )
{
StockChatBufferLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻᳳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˡ<EFBFBD>", FONT_PAL_YELLOW);
return;
}
#endif
#ifdef _CHANNEL_MODIFY
case 2:
#endif
sprintf_s( m, "P|%s", dest );
break;
case 1:
if ( strcmp ( tmp1 , str ) == 0 || strlen(tmp1) > 16) {
StockChatBufferLine( "ָ<EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>" , FONT_PAL_RED);
strcpy(secretName,"");
return ;
}
if ( found = strstr( str, " " )){
strncpy_s(tellName, str, strlen(str) - strlen(found));
}
sprintf_s( secretName, "%s ",tellName);
sprintf_s( m, "P|/tell %s", dest );
break;
#ifndef _CHANNEL_MODIFY
#ifdef _FRIENDCHANNEL
case 2:
sprintf_s(tmpMsg,"T|%s : %s",pc.name,dest);
lssproto_CHATROOM_send (sockfd ,tmpMsg);
return;
#endif
#else
case 3:
sprintf_s(m,"P|/FM%s",dest);
break;
/*
case 4:
sprintf_s(m,"P|/OCC%s<><73>%s",pc.name,dest);
break;
#ifdef _CHATROOMPROTOCOL
case 5:
sprintf_s(tmpMsg,"T|%s<><73>%s",pc.name,dest);
lssproto_CHATROOM_send (sockfd ,tmpMsg);
return;
#endif
*/
#ifdef _CHANNEL_WORLD ///<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
case 4:
sprintf_s(m,"P|/WD %s",dest);
break;
#endif
#ifdef _CHANNEL_ALL_SERV
case 5:
sprintf_s(m,"P|/XQ %s",dest);
break;
#endif
#endif
}
#else
sprintf_s( m, "P|%s", dest );
#endif
if (bNewServer){
CHAR szOutBuffer[1280+1] = {0};
WORD wLanguageID = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
LCID Locale = MAKELCID(wLanguageID, SORT_CHINESE_PRCP);
int iRet = LCMapString(Locale,
LCMAP_SIMPLIFIED_CHINESE,
m, -1,
szOutBuffer, 1280);
lssproto_TK_send(sockfd, x, y, szOutBuffer, color, NowMaxVoice );
}
else
old_lssproto_TK_send(sockfd, x, y, m, color, NowMaxVoice );
}
// ????<3F><><EFBFBD><EFBFBD> ///////////////////////////////////////////////////////////
void lssproto_TK_recv( int fd, int index, char *message, int color )
{
char id[2];
#ifdef _MESSAGE_FRONT_
char msg1[2024];
char *msg;
#else
char msg[2024];
#endif
ACTION *ptAct;
int fontsize =0;
#ifdef _MESSAGE_FRONT_
msg1[0] = 0xA1;
msg1[1] = 0xF4;
msg1[2] = 0;
msg = msg1+2;
#endif
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
getStringToken( message, '|', 1, sizeof( id ) - 1, id );
if ( id[0] == 'P' ){
#ifndef _CHANNEL_MODIFY
getStringToken( message, '|', 2, 2022 - 1, msg );
makeStringFromEscaped( msg );
#ifdef _TRADETALKWND // (<28><><EFBFBD>ɿ<EFBFBD>) Syu ADD <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD>
TradeTalk( msg ) ;
#endif
#endif
#ifdef _CHANNEL_MODIFY
char szToken[4];
if (getStringToken(message,'|',2,sizeof(szToken) - 1,szToken) == 0){
getStringToken(message,'|',3,2022 - 1,msg);
makeStringFromEscaped(msg);
#ifdef _FONT_SIZE
char token[10];
if ( getStringToken(message,'|',4,sizeof(token) - 1,token) == 1) {
fontsize = atoi( token);
if ( fontsize < 0 ) fontsize = 0;
}else {
fontsize = 0;
}
#endif
if (strlen(szToken) > 1){
if (strcmp(szToken,"TK") == 0) InitSelectChar(message,0);
else if (strcmp(szToken,"TE") == 0) InitSelectChar(message,1);
return;
}
else{
switch (szToken[0]){
// <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
case 'M':
{
char tellName[32] = { "" };
char szMsgBuf[2024];
char temp[] = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
char *found;
if (found = strstr(msg,temp)){
strncpy_s(tellName,msg,strlen(msg) - strlen(found));
color = 5;
strncpy_s(szMsgBuf,found,sizeof(szMsgBuf));
memset(msg,0,2022);
sprintf(msg,"[%s]%s",tellName,szMsgBuf);
sprintf(secretName,"%s ",tellName);
}
}
break;
// <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
case 'F':
// <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
case 'T':
// ְҵƵ<D2B5><C6B5>
case 'O':
break;
}
SaveChatData(msg,szToken[0],false);
}
}
else getStringToken(message,'|',2,2022 - 1,msg);
#ifdef _TALK_WINDOW
if (!g_bTalkWindow)
#endif
TradeTalk(msg);
if (strcmp(msg,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҿ۳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʯ<EFBFBD><EFBFBD>") == 0) pc.gold -= 200;
#ifdef _FONT_SIZE
#ifdef _MESSAGE_FRONT_
StockChatBufferLineExt( msg-2, color, fontsize );
#else
StockChatBufferLineExt( msg, color, fontsize );
#endif
#else
#ifdef _MESSAGE_FRONT_
StockChatBufferLine(msg-2,color);
#else
StockChatBufferLine(msg,color);
#endif
#endif
#else
#ifdef _TELLCHANNEL // (<28><><EFBFBD>ɿ<EFBFBD>) ROG ADD <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
char tellName[128] = { "" };
char tmpMsg[STR_BUFFER_SIZE + 32];
char TK[4];
if ( getStringToken( msg, '|', 1, sizeof( TK ) - 1, TK ) == 0){
if (strcmp(TK,"TK") == 0) InitSelectChar( msg, 0);
else if (strcmp(TK,"TE") == 0) InitSelectChar( msg, 1);
}
else{
char temp[] = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
char *found;
if (strcmp( msg, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҿ۳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʯ<EFBFBD><EFBFBD>") == 0) pc.gold -= 200;
if ( found = strstr( msg, temp )){
strncpy_s(tellName, msg, strlen(msg) - strlen(found));
color = 5;
sprintf_s(tmpMsg,"[%s]%s",tellName, found);
StockChatBufferLine( tmpMsg, color );
sprintf_s(msg,"");
sprintf_s(secretName,"%s ",tellName);
}else StockChatBufferLine( msg, color );
}
#else
#ifdef _FONT_SIZE
StockChatBufferLineExt( msg, color, fontsize );
#else
StockChatBufferLine( msg, color );
#endif
#endif
#endif
if ( index >= 0 ){
if ( pc.ptAct != NULL && pc.id == index ){
// 1000??<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
setPcFukidashi( 1000 );
}
else
{
ptAct = getCharObjAct( index );
if ( ptAct != NULL )
{
// 1000??<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
setCharFukidashi( ptAct, 1000 );
}
}
}
}
return;
}
// <20><>????<3F><> ///////////////////////////////////////////////////////////
// ?<3F><>???????????????
void createNewCharStart(void)
{
newCharStatus = 0;
// ????<3F><><EFBFBD>V?<3F>t??<3F>e???????????
if (bNewServer){
#ifdef _MORECHARACTERS_
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰҳ<EFBFBD><EFBFBD>;
lssproto_CreateNewChar_send(sockfd, selectPcNo+<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰҳ<EFBFBD><EFBFBD>*2, newCharacterName,
newCharacterGraNo, newCharacterFaceGraNo,
newCharacterVit, newCharacterStr, newCharacterTgh, newCharacterDex,
newCharacterEarth, newCharacterWater, newCharacterFire, newCharacterWind,
newCharacterHomeTown );
#else
#ifdef _TRADITIONAL_LONG_
CHAR szOutBuffer[128+1] = {0};
WORD wLanguageID = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
LCID Locale = MAKELCID(wLanguageID, SORT_CHINESE_PRCP);
int iRet = LCMapString(Locale,
LCMAP_SIMPLIFIED_CHINESE,
newCharacterName, -1,
szOutBuffer, 128);
#endif
lssproto_CreateNewChar_send(sockfd, selectPcNo,
#ifdef _TRADITIONAL_LONG_
szOutBuffer,
#else
newCharacterName,
#endif
newCharacterGraNo, newCharacterFaceGraNo,
newCharacterVit, newCharacterStr, newCharacterTgh, newCharacterDex,
newCharacterEarth, newCharacterWater, newCharacterFire, newCharacterWind,
newCharacterHomeTown );
#endif
}else
old_lssproto_CreateNewChar_send(sockfd, selectPcNo, newCharacterName,
newCharacterGraNo, newCharacterFaceGraNo,
newCharacterVit, newCharacterStr, newCharacterTgh, newCharacterDex,
newCharacterEarth, newCharacterWater, newCharacterFire, newCharacterWind,
newCharacterHomeTown );
SETSENDING;
}
// <20><>???<3F>K???<3F>r?
// ??<3F>k<EFBFBD><6B> 0 ... <20><><EFBFBD><EFBFBD><EFBFBD>r? / 1 ... <20><><EFBFBD><EFBFBD>?? / -1 ... ?????? / -2 ... ?????????
int createNewCharProc(void)
{
if ( netproc_sending == NETPROC_RECEIVED )
{
netproc_sending = NETPROC_NOTSEND;
if ( newCharStatus == 1 )
{
return 1;
}
else
{
return -2;
}
}
SETTIMEOUT2( NET_ERRMSG_CREATECHARTIMEOUT );
return 0;
}
char <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ[512];
void lssproto_CreateNewChar_recv( int fd, char *result, char *data )
{
if ( netproc_sending == NETPROC_SENDING )
{
netproc_sending = NETPROC_RECEIVED;
if ( strcmp( result, SUCCESSFULSTR ) == 0 )
{
newCharStatus = 1;
}else{
sprintf(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ,data);
}
}
}
// ????? /////////////////////////////////////////////////////////////
// ?????<3F>k??<3F><>
void delCharStart(void)
{
charDelStatus = 0;
if (bNewServer)
lssproto_CharDelete_send(sockfd, gamestate_deletechar_charname );
else
old_lssproto_CharDelete_send(sockfd, gamestate_deletechar_charname );
SETSENDING;
}
// ?????<3F>r?
// ??<3F>k<EFBFBD><6B> 0 ... ??<3F>r? / 1 ... ???? / -1 ... ?????? / -2 ... ?????????
int delCharProc(void)
{
if ( netproc_sending == NETPROC_RECEIVED )
{
netproc_sending = NETPROC_NOTSEND;
if ( charDelStatus )
{
return 1;
}
else
{
return -2;
}
}
SETTIMEOUT2( NET_ERRMSG_DELETECHARTIMEOUT );
return 0;
}
// ???????<3F><><EFBFBD><EFBFBD>
void lssproto_CharDelete_recv( int fd, char *result, char *data )
{
if ( netproc_sending == NETPROC_SENDING )
{
netproc_sending = NETPROC_RECEIVED;
if ( strcmp( result, SUCCESSFULSTR ) == 0 )
{
charDelStatus = 1;
}
}
}
// ?????<3F><><EFBFBD><EFBFBD> /////////////////////////////////////////////////////////
void lssproto_PR_recv( int fd, int request, int result )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
if ( request == 1 && result == 1 )
{
// <20>M????????<3F>V????<3F>G??
setPcParty();
}
else
if ( request == 0 && result == 1 )
{
// ????????<3F><>??
//delPcParty();
//delPcLeader();
partyModeFlag = 0;
clearPartyParam();
#ifdef _CHANNEL_MODIFY
pc.etcFlag &= ~PC_ETCFLAG_CHAT_MODE;
if (TalkMode == 2) TalkMode = 0;
#endif
char dir = (pc.dir+5) % 8;
if (bNewServer)
lssproto_SP_send(sockfd, nextGx, nextGy, dir );
else
old_lssproto_SP_send(sockfd, nextGx, nextGy, dir );
}
prSendFlag = 0;
}
// EV???????<3F><>??<3F><><EFBFBD><EFBFBD><EFBFBD>r? /////////////////////////////////////////
void lssproto_EV_recv( int fd, int seqno, int result )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
if ( eventWarpSendId == seqno )
{
eventWarpSendFlag = 0;
if ( result == 0 )
{
// ???<3F><><EFBFBD><EFBFBD>??????<3F><>?<3F><><EFBFBD><EFBFBD>???
redrawMap();
floorChangeFlag = FALSE;
// ?<3F>ɤ<EFBFBD>??????????
warpEffectStart = TRUE;
warpEffectOk = TRUE;
}
}
else
if ( eventEnemySendId == seqno )
{
if ( result == 0 )
{
eventEnemySendFlag = 0;
}
//else
//{
// ??????process.cpp???
//}
}
}
// ??OK?<3F>P<EFBFBD>f<EFBFBD>N?<3F><>?OK????? <20>ϣ<EFBFBD>?<3F>֢t<D6A2><74><EFBFBD><EFBFBD> ////////////////////////
void lssproto_FS_recv( int fd, int flg )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
pc.etcFlag = (unsigned short)flg;
}
// ????????<3F><>?<3F><><EFBFBD><EFBFBD> ///////////////////////////////////////////////
void lssproto_AB_recv( int fd, char *data )
{
int i;
int no;
int nameLen;
char name[256];
int flag;
int useFlag;
#ifdef _MAILSHOWPLANET // (<28>ɿ<EFBFBD><C9BF><EFBFBD>) Syu ADD <20><>ʾ<EFBFBD><CABE>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
char planetid[8];
int j ;
#endif
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
for ( i = 0; i < MAX_ADR_BOOK; i++ )
{
//no = i * 6; //the second
no = i * 8;
useFlag = getIntegerToken(data, '|', no+1 );
if ( useFlag == -1 )
{
useFlag = 0;
}
if ( useFlag <= 0 )
{
#if 0
if ( addressBook[i].useFlag == 1 )
#else
if ( MailHistory[i].dateStr[MAIL_MAX_HISTORY-1][0] != '\0' )
#endif
{
memset( &MailHistory[i], 0, sizeof( MailHistory[0] ) ) ;
SaveMailHistory( i );
// <20>t<EFBFBD><74>????
mailLamp = CheckMailNoReadFlag();
// <20><>????<3F><>?
DeathLetterAction();
}
addressBook[i].useFlag = 0;
addressBook[i].name[0] = '\0';
continue;
}
#ifdef _EXTEND_AB
if ( i == MAX_ADR_BOOK-1 )
addressBook[i].useFlag = useFlag;
else
addressBook[i].useFlag = 1;
#else
addressBook[i].useFlag = 1;
#endif
flag = getStringToken(data, '|', no+2, sizeof(name) - 1 , name );
if ( flag == 1 )
break;
makeStringFromEscaped(name);
nameLen = strlen(name);
if ( 0 < nameLen && nameLen <= CHAR_NAME_LEN )
{
strcpy( addressBook[i].name, name );
}
addressBook[i].level = getIntegerToken(data, '|', no+3 );
addressBook[i].dp = getIntegerToken(data, '|', no+4 );
addressBook[i].onlineFlag = (short)getIntegerToken(data, '|', no+5 );
addressBook[i].graNo = getIntegerToken(data, '|', no+6 );
addressBook[i].transmigration = getIntegerToken(data, '|', no+7 );
#ifdef _MAILSHOWPLANET // (<28>ɿ<EFBFBD><C9BF><EFBFBD>) Syu ADD <20><>ʾ<EFBFBD><CABE>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
for ( j = 0 ; j < MAX_GMSV ; j ++ ) {
if ( gmsv[j].used == '1' ) {
getStringToken( gmsv[j].ipaddr, '.', 4, sizeof( planetid ) -1, planetid );
if ( addressBook[i].onlineFlag == atoi(planetid) ) {
sprintf_s( addressBook[i].planetname , "%s" , gmsv[j].name ) ;
break;
}
}
}
#endif
}
}
// ????????<3F><>?<3F><><EFBFBD><EFBFBD>?<3F>O<EFBFBD>l?////////////////////////////////////////
void lssproto_ABI_recv( int fd, int num, char* data )
{
char name[256];
int nameLen;
int useFlag;
#ifdef _MAILSHOWPLANET // (<28>ɿ<EFBFBD><C9BF><EFBFBD>) Syu ADD <20><>ʾ<EFBFBD><CABE>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
char planetid[8];
int j ;
#endif
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
useFlag = getIntegerToken(data, '|', 1 );
if ( useFlag == -1 )
{
useFlag = 0;
}
if ( useFlag == 0 )
{
#if 0
if ( addressBook[num].useFlag == 1 )
#else
if ( MailHistory[num].dateStr[MAIL_MAX_HISTORY-1][0] != '\0' )
#endif
{
memset( &MailHistory[num], 0, sizeof( MailHistory[0] ) ) ;
SaveMailHistory( num );
// <20>t<EFBFBD><74>????
mailLamp = CheckMailNoReadFlag();
// <20><>????<3F><>?
DeathLetterAction();
}
addressBook[num].useFlag = useFlag;
addressBook[num].name[0] = '\0';
return;
}
#ifdef _EXTEND_AB
if ( num == MAX_ADR_BOOK-1 )
addressBook[num].useFlag = useFlag;
else
addressBook[num].useFlag = 1;
#else
addressBook[num].useFlag = useFlag;
#endif
getStringToken(data, '|', 2, sizeof(name) - 1 , name );
makeStringFromEscaped(name);
nameLen = strlen(name);
if ( 0 < nameLen && nameLen <= CHAR_NAME_LEN )
{
strcpy( addressBook[num].name, name );
}
addressBook[num].level = getIntegerToken(data, '|', 3 );
addressBook[num].dp = getIntegerToken(data, '|', 4 );
addressBook[num].onlineFlag = (short)getIntegerToken(data, '|', 5 );
addressBook[num].graNo = getIntegerToken(data, '|', 6 );
addressBook[num].transmigration = getIntegerToken(data, '|', 7 );
#ifdef _MAILSHOWPLANET // (<28>ɿ<EFBFBD><C9BF><EFBFBD>) Syu ADD <20><>ʾ<EFBFBD><CABE>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
if ( addressBook[num].onlineFlag == 0 )
sprintf_s( addressBook[num].planetname , " ");
for ( j = 0 ; j < MAX_GMSV ; j ++ ) {
if ( gmsv[j].used == '1' ) {
getStringToken( gmsv[j].ipaddr, '.', 4, sizeof( planetid ) -1, planetid );
if ( addressBook[num].onlineFlag == atoi(planetid) ) {
sprintf_s( addressBook[num].planetname ,64, "%s" , gmsv[j].name ) ;
break;
}
}
}
#endif
}
// <20>P<EFBFBD>f???????<3F><><EFBFBD><EFBFBD> /////////////////////////////////////////////////
void lssproto_RS_recv( int fd, char *data )
{
int i;
char token[2048];
char item[2048];
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
battleResultMsg.useFlag = 1;
//cary ȷ<><C8B7> <20><>λ <20><>
int cols = RESULT_CHR_EXP;
getStringToken(data, ',', RESULT_CHR_EXP+1, sizeof( token ) - 1, token );
if ( token[0] == 0){
cols = RESULT_CHR_EXP - 1;
battleResultMsg.resChr[RESULT_CHR_EXP-1].petNo = -1;
battleResultMsg.resChr[RESULT_CHR_EXP-1].levelUp = -1;
battleResultMsg.resChr[RESULT_CHR_EXP-1].exp = -1;
}
//end cary
for ( i = 0; i < cols; i++ ){
getStringToken(data, ',', i+1, sizeof( token ) - 1, token );
battleResultMsg.resChr[i].petNo = getIntegerToken( token, '|', 1 );
battleResultMsg.resChr[i].levelUp = getIntegerToken( token, '|', 2 );
battleResultMsg.resChr[i].exp = getInteger62Token( token, '|', 3 );
}
getStringToken(data, ',', i+1, sizeof( token ) - 1, token );
getStringToken( token, '|', 1, sizeof( item ) - 1, item );
makeStringFromEscaped( item );
if ( strlen( item ) <= RESULT_ITEM_NAME_LEN )
{
strcpy( battleResultMsg.item[0], item );
}
getStringToken( token, '|', 2, sizeof( item ) - 1, item );
makeStringFromEscaped( item );
if ( strlen( item ) <= RESULT_ITEM_NAME_LEN )
{
strcpy( battleResultMsg.item[1], item );
}
getStringToken( token, '|', 3, sizeof( item ) - 1, item );
makeStringFromEscaped( item );
if ( strlen( item ) <= RESULT_ITEM_NAME_LEN )
{
strcpy( battleResultMsg.item[2], item );
}
}
// ???????????<3F><><EFBFBD><EFBFBD> /////////////////////////////////////////////////
void lssproto_RD_recv( int fd, char *data )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
battleResultMsg.useFlag = 2;
battleResultMsg.resChr[0].exp = getInteger62Token(data, '|', 1 );
battleResultMsg.resChr[1].exp = getInteger62Token(data, '|', 2 );
}
// ?????<3F>t<EFBFBD><74>?<3F><><EFBFBD><EFBFBD> ///////////////////////////////////////////////////
void lssproto_SI_recv( int fd, int from, int to )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
swapItem( from, to );
}
// ????<3F>ѩ<EFBFBD><D1A9><EFBFBD><EFBFBD><EFBFBD> ///////////////////////////////////////////////////////
void lssproto_I_recv( int fd, char *data )
{
int i, j;
int no;
char name[256];
char name2[256];
char memo[256];
//char *data = "9|<7C><><EFBFBD><EFBFBD>˹̹<CBB9><CCB9><EFBFBD><EFBFBD>||0|<7C>;<EFBFBD><CDBE><EFBFBD>10ǰ<30><C7B0><EFBFBD>ظ<EFBFBD>|24002|0|1|0|7|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|1|<7C><>|20||10|<7C><><EFBFBD><EFBFBD>˹̹<CBB9><CCB9><EFBFBD><EFBFBD>||0|<7C>;<EFBFBD><CDBE><EFBFBD>10ǰ<30><C7B0><EFBFBD>ظ<EFBFBD>|24002|0|1|0|7|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|1|<7C><>|20|";
if ( logOutFlag )//<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>½<EFBFBD>򲻽<EFBFBD><F2B2BBBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
for ( j = 0; ; j++ ){
#ifdef _ITEM_JIGSAW
#ifdef _NPC_ITEMUP
#ifdef _ITEM_COUNTDOWN
no = j * 17;
#else
no = j * 16;
#endif
#else
no = j * 15;
#endif
#else
#ifdef _PET_ITEM
no = j * 14;
#else
#ifdef _ITEM_PILENUMS
#ifdef _ALCHEMIST
#ifdef _MAGIC_ITEM_
no = j * 15;
#else
no = j * 13;
#endif
#else
no = j * 12;
#endif
#else
no = j * 11;
#endif
#endif//_PET_ITEM
#endif//_ITEM_JIGSAW
i = getIntegerToken(data, '|', no+1 );//<2F><><EFBFBD><EFBFBD>λ
if ( getStringToken(data, '|', no+2, sizeof(name) - 1 , name ) == 1 )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
makeStringFromEscaped(name);
if ( strlen(name) == 0 ){
pc.item[i].useFlag = 0;
continue;
}
pc.item[i].useFlag = 1;
if ( strlen(name) <= ITEM_NAME_LEN ){
strcpy( pc.item[i].name, name );
}
getStringToken(data, '|', no+3, sizeof( name2 ) - 1, name2 );//<2F>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
makeStringFromEscaped( name2 );
if ( strlen( name2 ) <= ITEM_NAME2_LEN ){
strcpy( pc.item[i].name2, name2 );
}
pc.item[i].color = getIntegerToken(data, '|', no+4 );//<2F><>ɫ
if ( pc.item[i].color < 0 )
pc.item[i].color = 0;
getStringToken(data, '|', no+5, sizeof( memo ) - 1, memo );//<2F><><EFBFBD>߽<EFBFBD><DFBD><EFBFBD>
makeStringFromEscaped( memo );
if ( strlen( memo ) <= ITEM_MEMO_LEN ){
strcpy( pc.item[i].memo, memo );
}
pc.item[i].graNo = getIntegerToken(data, '|', no+6 );//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.item[i].field = getIntegerToken(data, '|', no+7 );//
pc.item[i].target = getIntegerToken(data, '|', no+8 );
if ( pc.item[i].target >= 100 ){
pc.item[i].target %= 100;
pc.item[i].deadTargetFlag = 1;
}else{
pc.item[i].deadTargetFlag = 0;
}
pc.item[i].level = getIntegerToken(data, '|', no+9 );//<2F>ȼ<EFBFBD>
pc.item[i].sendFlag = getIntegerToken(data, '|', no+10 );
{
// <20><>ʾ<EFBFBD><CABE>Ʒ<EFBFBD>;ö<CDBE>
char damage[256];
getStringToken(data, '|', no+11, sizeof( damage ) - 1, damage );
makeStringFromEscaped( damage );
if ( strlen( damage ) <= 16 ){
strcpy( pc.item[i].damage, damage );
}
}
#ifdef _ITEM_PILENUMS
{
char pile[256];
getStringToken(data, '|', no+12, sizeof( pile ) - 1, pile );
makeStringFromEscaped( pile );
pc.item[i].pile = atoi( pile);
}
#endif
#ifdef _ALCHEMIST //_ITEMSET7_TXT
{
char alch[256];
getStringToken(data, '|', no+13, sizeof( alch ) - 1, alch );
makeStringFromEscaped( alch );
strcpy( pc.item[i].alch, alch );
}
#endif
#ifdef _PET_ITEM
{
char type[8];
getStringToken(data, '|', no + 14, sizeof(type) - 1, type);
makeStringFromEscaped(type);
pc.item[i].type = atoi(type);
}
#else
#ifdef _MAGIC_ITEM_
pc.item[i].<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = getIntegerToken(data, '|', no + 14);
#endif
#endif
/*
#ifdef _ITEM_JIGSAW
{
char jigsaw[10];
getStringToken(data, '|', no + 15, sizeof(jigsaw) - 1, jigsaw);
makeStringFromEscaped(jigsaw);
strcpy( pc.item[i].jigsaw, jigsaw );
if( i == JigsawIdx ){
SetJigsaw( pc.item[i].graNo, pc.item[i].jigsaw );
}
}
#endif
#ifdef _NPC_ITEMUP
pc.item[i].itemup = getIntegerToken(data, '|', no + 16);
#endif
#ifdef _ITEM_COUNTDOWN
pc.item[i].counttime = getIntegerToken(data, '|', no + 17);
#endif
*/
}
}
void lssproto_WN_recv( int fd,int windowtype,int buttontype,int seqno,int objindex,char* data )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
if( strstr(data,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧࡣ<EFBFBD>") ){
if( TimeGetTime() - MsgCooltime > 300000 )
MsgCooltime = TimeGetTime();
else
return;
}
openServerWindow( windowtype, buttontype, seqno, objindex, data );
}
// ???????<3F><> ///////////////////////////////////////////////////////
void lssproto_PME_recv( int fd, int objindex,
int graphicsno, int x, int y, int dir, int flg, int no, char *cdata )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
// <20>P<EFBFBD>f??<3F><>???
if ( encountNowFlag )
return;
// ?<3F><>?<3F><>
if ( flg == 0 )
{
switch ( no )
{
case 0:
createPetAction( graphicsno, x, y, dir, 0, dir, -1 );
break;
case 1:
createPetAction( graphicsno, x, y, dir, 2, 0, -1 );
break;
}
}
else
// <20><><EFBFBD><EFBFBD>?<3F><>
{
char smalltoken[2048];
int id;
int x;
int y;
int dir;
int graNo;
int level;
int nameColor;
char name[2048];
char freeName[2048];
int walkable;
int height;
int charType;
int ps=1;
#ifdef _OBJSEND_C
ps = 2;
#endif
charType = getIntegerToken( cdata, '|', ps++);
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
id = a62toi(smalltoken);
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
x = atoi(smalltoken);
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
y = atoi(smalltoken);
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
dir = (atoi(smalltoken)+3)%8;
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
graNo = atoi(smalltoken);
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1,smalltoken);
level = atoi(smalltoken);
nameColor = getIntegerToken( cdata, '|', ps++ );
getStringToken( cdata, '|' , ps++ , sizeof(name) - 1, name );
makeStringFromEscaped(name);
getStringToken( cdata, '|' , ps++ , sizeof( freeName ) - 1, freeName );
makeStringFromEscaped( freeName );
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
walkable = atoi(smalltoken);
getStringToken( cdata, '|', ps++, sizeof(smalltoken) - 1, smalltoken);
height = atoi(smalltoken);
// ???<3F>ѩ<EFBFBD>??????????
if ( setReturnPetObj( id, graNo, x, y, dir, name, freeName,
level, nameColor, walkable, height, charType ) )
{
switch ( no )
{
case 0:
createPetAction( graphicsno, x, y, dir, 1, 0, objindex );
break;
case 1:
createPetAction( graphicsno, x, y, dir, 3, 0, objindex );
break;
}
}
}
}
char *pCommand = NULL;
DWORD dwDiceTimer;
// ?????????<3F><><EFBFBD><EFBFBD><EFBFBD>r? /////////////////////////////////////////////
void lssproto_EF_recv( int fd, int effect, int level, char *option )
{
// <20>u????????<3F><>??
if ( effect == 0 )
{
mapEffectRainLevel = 0;
mapEffectSnowLevel = 0;
mapEffectKamiFubukiLevel = 0;
#ifdef _HALLOWEEN_EFFECT
mapEffectHalloween = 0;
initMapEffect(FALSE);
#endif
return;
}
// ???????
if ( effect & 1 )
{
mapEffectRainLevel = level;
}
// <20>D??????
if ( effect & 2 )
{
mapEffectSnowLevel = level;
}
// ????
if ( effect & 4 )
{
mapEffectKamiFubukiLevel = level;
}
#ifdef _HALLOWEEN_EFFECT
if (effect & 8) mapEffectHalloween = level;
#endif
// Terry add 2002/01/14
#ifdef __EDEN_DICE
// <20><><EFBFBD><EFBFBD>
if (effect == 10)
{
pCommand = (char*)MALLOC(strlen(option)+1);
#ifdef _STONDEBUG_
g_iMallocCount++;
#endif
if (pCommand != NULL)
{
strcpy(pCommand,strlen(option)+1,option);
bMapEffectDice = TRUE;
dwDiceTimer = TimeGetTime();
}
}
#endif
// Terry end
}
// <20><>? ///////////////////////////////////////////////////////////////////
void lssproto_IS_recv( int fd, char* cdata )
{
}
void lssproto_EN_recv( int fd,int result,int field )
{
if ( logOutFlag )
return;
if ( result > 0 ){
EncountFlag = TRUE;
if ( result == 4 )
vsLookFlag = 1;
else
vsLookFlag = 0;
if ( result == 6 || result == 2 )
eventEnemyFlag = 1;
else
eventEnemyFlag = 0;
if ( field < 0 || BATTLE_MAP_FILES <= field )
BattleMapNo = 0;
else
BattleMapNo = field;
if ( result == 2 )
DuelFlag = TRUE;
else
DuelFlag = FALSE;
if ( result == 2 || result == 5 )
NoHelpFlag = TRUE;
else
NoHelpFlag = FALSE;
BattleStatusReadPointer = BattleStatusWritePointer =0;
BattleCmdReadPointer = BattleCmdWritePointer =0;
#ifdef PK_SYSTEM_TIMER_BY_ZHU
BattleCliTurnNo = -1;
#endif
}else{
sendEnFlag = 0;
duelSendFlag = 0;
jbSendFlag = 0;
}
}
void lssproto_HL_recv( int fd, int flg )
{
helpFlag = flg;
}
void lssproto_B_recv( int fd,char* command )
{
if ( *( command + 1 ) == 'C'){
strcpy( BattleStatusBak[ BattleStatusWritePointer ], command );
BattleStatusWritePointer = ( BattleStatusWritePointer + 1 ) & ( BATTLE_BUF_SIZE-1 );
}
else if ( *( command + 1 ) == 'P')
sscanf_s( command + 3, "%X|%X|%X", &BattleMyNo, &BattleBpFlag, &BattleMyMp );
else if ( *( command + 1 ) == 'A'){
sscanf_s( command + 3, "%X|%X", &BattleAnimFlag, &BattleSvTurnNo );
if ( BattleTurnReceiveFlag == TRUE ){
BattleCliTurnNo = BattleSvTurnNo;
BattleTurnReceiveFlag = FALSE;
}
}
else if ( *( command + 1 ) == 'U')
BattleEscFlag = TRUE;
#ifdef PK_SYSTEM_TIMER_BY_ZHU
else if ( *( command + 1 ) == 'Z') {
int TurnNo = -1;
sscanf( command + 3, "%X", &TurnNo );
if ( TurnNo >= 0 )
{
if ( TurnNo > 0 )
{
BattleCntDownRest = TRUE;
} else {
BattleCntDown = TimeGetTime() + BATTLE_CNT_DOWN_TIME;
}
BattleCliTurnNo = TurnNo;
}
}
else if ( *( command + 1 ) == 'F') {
int TurnNo = -1;
sscanf( command + 3, "%X", &TurnNo );
if ( TurnNo >= 0 )
{
BattleCliTurnNo = TurnNo;
}
//if ( TurnNo >= 0 )
//{
// if ( TurnNo > 0 )
// {
// BattleCntDownRest = TRUE;
// } else {
// BattleCntDown = TimeGetTime() + BATTLE_CNT_DOWN_TIME;
// }
// BattleCliTurnNo = TurnNo;
//}
BattleDown();
//BattleSetWazaHitBox( 0, 0 );
}
else if ( *( command + 1 ) == 'O') {
int TurnNo = -1;
sscanf( command + 3, "%X", &TurnNo );
if ( TurnNo >= 0 )
{
BattleCliTurnNo = TurnNo;
BattleCntDown = TimeGetTime() + BATTLE_CNT_DOWN_TIME;
}
}
#endif
else {
strcpy( BattleCmdBak[ BattleCmdWritePointer ], command );
BattleCmdWritePointer = ( BattleCmdWritePointer + 1 ) & ( BATTLE_BUF_SIZE-1 );
}
#ifdef _STONDEBUG__MSG
//StockChatBufferLine( command, FONT_PAL_RED );
#endif
}
#ifdef _PETS_SELECTCON
void lssproto_PETST_recv( int fd,int petarray,int result )
{
if ( petarray < 0 || petarray >= 5 ) return;
pc.selectPetNo[ petarray] = result;
BattlePetStMenCnt--;
if ( BattlePetStMenCnt < 0 ) BattlePetStMenCnt = 0;
if ( BattlePetStMenCnt > 4 ) BattlePetStMenCnt = 4;
if ( pc.battlePetNo == petarray )
pc.battlePetNo = -1;
}
#endif
void lssproto_KS_recv( int fd,int petarray,int result )
{
int cnt = 0;
int i;
BattlePetReceiveFlag = FALSE;
BattlePetReceivePetNo = -1;
if ( result == TRUE ){
battlePetNoBak = -2;
if ( petarray != -1 ){
pc.selectPetNo[ petarray ] = TRUE;
if ( pc.mailPetNo == petarray ) pc.mailPetNo = -1;
for ( i = 0 ; i < 5 ; i++ ){
if ( pc.selectPetNo[ i ] == TRUE && i != petarray ) cnt++;
if ( cnt >= 4 ){
pc.selectPetNo[ i ] = FALSE;
cnt--;
}
}
}
pc.battlePetNo = petarray;
}
#ifdef _AFTER_TRADE_PETWAIT_
else{
if (tradeStatus==2){
pc.selectPetNo[petarray] = 0;
if (petarray==pc.battlePetNo)
pc.battlePetNo = -1;
}
}
#endif
}
#ifdef _STANDBYPET
void lssproto_SPET_recv( int fd, int standbypet, int result )
{
int cnt = 0;
int i;
StandbyPetSendFlag = FALSE;
if ( result == TRUE ) {
pc.standbyPet = standbypet;
for ( i =0; i <MAX_PET; i++) {
if ( standbypet & ( 1 << i) )
pc.selectPetNo[ i ] = TRUE;
else
pc.selectPetNo[ i ] = FALSE;
}
}
}
#endif
void lssproto_SKUP_recv( int fd,int point )
{
// ????????????<3F><><EFBFBD><EFBFBD>
StatusUpPoint = point;
}
// ?????????????<3F><>?<3F><>??
void lssproto_MSG_recv( int fd,int aindex,char* text ,int color)
{
char moji[ 256 ];
int noReadFlag;
// ???????????
mailLamp = TRUE;
// ?<3F><>??<3F>k???<3F><>
MailHistory[ aindex ].newHistoryNo--;
// ????????
if ( MailHistory[ aindex ].newHistoryNo <= -1 ) MailHistory[ aindex ].newHistoryNo = MAIL_MAX_HISTORY - 1;
// <20>T??<3F><>?<3F><>?
getStringToken( text, '|', 1, sizeof( MailHistory[ aindex ].dateStr[ MailHistory[ aindex ].newHistoryNo ] ) - 1,
MailHistory[ aindex ].dateStr[ MailHistory[ aindex ].newHistoryNo ] );
// <20><><EFBFBD><EFBFBD>?<3F><>?<3F><>?
getStringToken( text, '|', 2, sizeof( MailHistory[ aindex ].str[ MailHistory[ aindex ].newHistoryNo ] ) - 1,
MailHistory[ aindex ].str[ MailHistory[ aindex ].newHistoryNo ] );
// ????????
makeStringFromEscaped( MailHistory[ aindex ].str[ MailHistory[ aindex ].newHistoryNo ] );
// ??????????<3F>k?<3F><>?<3F><>?
noReadFlag = getIntegerToken( text, '|', 3 );
// ????????
if ( noReadFlag != -1 ){
// ??????????<3F>k???
MailHistory[ aindex ].noReadFlag[ MailHistory[ aindex ].newHistoryNo ] = noReadFlag;
// ????????<3F><>?<3F><>?
MailHistory[ aindex ].petLevel[ MailHistory[ aindex ].newHistoryNo ] = getIntegerToken( text, '|', 4 );
// ????<3F><><EFBFBD>q?<3F><>?<3F><>?
getStringToken( text, '|', 5, sizeof( MailHistory[ aindex ].petName[ MailHistory[ aindex ].newHistoryNo ] ),
MailHistory[ aindex ].petName[ MailHistory[ aindex ].newHistoryNo ] );
// ????<3F><><EFBFBD>q?????????
makeStringFromEscaped( MailHistory[ aindex ].petName[ MailHistory[ aindex ].newHistoryNo ] );
// ???????????<3F>k??<3F><>?<3F><>?
MailHistory[ aindex ].itemGraNo[ MailHistory[ aindex ].newHistoryNo ] = getIntegerToken( text, '|', 6 );
// ????<3F><>????????<3F><>
sprintf_s( moji,"<EFBFBD>յ<EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>", addressBook[ aindex ].name );
}
// ?<3F>G?????
else{
MailHistory[ aindex ].noReadFlag[ MailHistory[ aindex ].newHistoryNo ] = TRUE;
// ????<3F><>????????<3F><>
sprintf_s( moji,"<EFBFBD>յ<EFBFBD>%s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>", addressBook[ aindex ].name );
}
// ????<3F><>??????????????
StockChatBufferLine( moji, FONT_PAL_WHITE );
// ????????
if ( mailHistoryWndSelectNo == aindex ){
// ??????????????
mailHistoryWndPageNo++;
// ????????
if ( mailHistoryWndPageNo >= MAIL_MAX_HISTORY ) mailHistoryWndPageNo = 0;
// <20><>?????????<3F><>
// DeathLetterAction();
}
// <20><><EFBFBD><EFBFBD>?
play_se( 101, 320, 240 );
// ???????<3F><><EFBFBD>V
SaveMailHistory( aindex );
}
// ??????<3F><>?<3F><>????<3F><><EFBFBD><EFBFBD>
void lssproto_PS_recv( int fd,int result,int havepetindex,int havepetskill,int toindex )
{
char moji[ 256 ];
// ???????
ItemMixRecvFlag = FALSE;
// <20><><EFBFBD><EFBFBD>???
if ( result == 0 ){
//???????<3F><><EFBFBD><EFBFBD>
sprintf_s( moji,"ʧ<EFBFBD>ܣ<EFBFBD>");
// ????<3F><>??????????????
StockChatBufferLine( moji, FONT_PAL_WHITE );
}
}
// ???????<3F>D??<3F><><EFBFBD><EFBFBD>
void lssproto_SE_recv( int fd, int x, int y, int senumber, int sw )
{
// ????????????????<3F>ѩ<EFBFBD>?<3F><>???
if ( logOutFlag )
return;
if ( sw )
{
play_se( senumber, x, y );
}
else
{
// ??<3F><>??<3F><>????<3F>Y????
}
}
// <20>P<EFBFBD>f<EFBFBD><66>?<3F><><EFBFBD>q?????<3F><>????<3F><><EFBFBD><EFBFBD>
void lssproto_XYD_recv( int fd, int x, int y, int dir )
{
updateMapArea();
setPcWarpPoint( x, y );
setPcPoint();
dir = (dir+3) % 8;
setPcDir( dir );
}
void lssproto_WO_recv( int fd, int effect )
{
return;
// ???????
if ( effect == 0 )
{
// <20><><EFBFBD><EFBFBD>????????
transmigrationEffectFlag = 1;
// <20><><EFBFBD><EFBFBD>?????????<3F><>????
transEffectPaletteStatus = 1;
// ????????
palNo = 15;
palTime = 300;
}
}
// ?????<3F><>? /////////////////////////////////////////////////////////
void lssproto_Echo_recv( int fd, char *test )
{
#if 1
#ifdef _STONDEBUG__MSG
// ???<3F>T??<3F><><EFBFBD>x
time( &serverAliveLongTime );
localtime_s(&serverAliveTime, &serverAliveLongTime );
#endif
#endif
}
// Robin 2001/04/06
void lssproto_NU_recv( int fd, int AddCount)
{
}
// ???<3F><><EFBFBD><EFBFBD>??
void lssproto_PlayerNumGet_recv( int fd, int logincount, int player )
{
}
void lssproto_ProcGet_recv( int fd, char* data )
{
}
/*
?????<EFBFBD>ѩ<EFBFBD>??????
*/
void lssproto_R_recv( int fd, char* data )
{
}
void lssproto_D_recv( int fd,int category,int dx,int dy,char* data )
{
}
/*
???<EFBFBD>d????????????????????
*/
void lssproto_ACI_recv( int fd, char* data )
{
}
extern void initFamilyList( char * );
extern void initFamilyDetail( char * );
extern void initJoinChannelWN( char * );
extern void initJoinChannel2WN( char * );
extern void initFamilyTaxWN( char * );
extern void initFamilyLeaderChange( char * );
void lssproto_FM_recv( int fd, char* data )
{
char FMType1[512];
char FMType2[512];
char FMType3[512];
getStringToken(data, '|', 1, sizeof( FMType1 ) - 1, FMType1 );
//makeStringFromEscaped( FMType1 );
getStringToken(data, '|', 2, sizeof( FMType2 ) - 1, FMType2 );
//makeStringFromEscaped( FMType2 );
if ( strcmp(FMType1,"S") ==0 )
{
if ( strcmp(FMType2,"F") ==0) // <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
{
initFamilyList(data );
}
if ( strcmp(FMType2,"D") ==0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ
{
initFamilyDetail(data );
}
}
else if ( strcmp(FMType1,"C") ==0 )
{
if ( strcmp(FMType2,"J") ==0) // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
{
getStringToken(data, '|', 3, sizeof( FMType3 ) - 1, FMType3 );
pc.channel = atoi( FMType3 );
if ( pc.channel != -1 )
pc.quickChannel = pc.channel;
}
if ( strcmp(FMType2,"L") ==0) // Ƶ<><C6B5><EFBFBD>б<EFBFBD>
{
initJoinChannel2WN(data );
}
}
else if ( strcmp(FMType1,"B") ==0 )
{
//MenuToggleFlag = JOY_CTRL_B;
if ( strcmp(FMType2,"G") ==0)
{
//getStringToken(data, '|', 3, sizeof( FMType3 ) - 1, FMType3 );
BankmanInit(data );
}
if ( strcmp(FMType2,"I") ==0)
{
//getStringToken(data, '|', 3, sizeof( FMType3 ) - 1, FMType3 );
//ItemmanInit(data );
//initItemman(data );
}
if ( strcmp(FMType2,"T") ==0)
{
initFamilyTaxWN(data );
}
}
else if ( strcmp(FMType1,"R") ==0 )
{
if ( strcmp(FMType2,"P") ==0) // ride Pet
{
//initFamilyList(data );
getStringToken(data, '|', 3, sizeof( FMType3 ) - 1, FMType3 );
pc.ridePetNo = atoi( FMType3 );
}
}
else if ( strcmp(FMType1,"L") ==0 ) // <20><EFBFBD><E5B3A4><EFBFBD><EFBFBD>
{
if ( strcmp(FMType2,"CHANGE") ==0)
{
initFamilyLeaderChange(data );
}
}
}
DWORD dwPingTime;
DWORD dwPingState;
#ifdef __NEW_CLIENT
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)
/* The IP header */
typedef struct iphdr {
unsigned int h_len:4; // length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // total length of the packet
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl;
unsigned char proto; // protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum
unsigned int sourceIP;
unsigned int destIP;
}IpHeader;
typedef struct _ihdr {
BYTE i_type;
BYTE i_code; /* type sub code */
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
/* This is not the std header, but we reserve space for time */
ULONG timestamp;
}IcmpHeader;
#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE 32
#define MAX_PACKET 1024
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while( size > 1){
cksum += *buffer++;
size -=sizeof(USHORT);
}
if ( size)
cksum += *(UCHAR*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int iWrote, iRead;
SOCKET sockRaw = INVALID_SOCKET;
DWORD WINAPI PingFunc(LPVOID param)
{
struct sockaddr_in from;
struct sockaddr_in dest;
int datasize;
int fromlen = sizeof(from);
int timeout = 1000;
IcmpHeader *icmp_hdr;
char icmp_data[MAX_PACKET];
char recvbuf[MAX_PACKET];
USHORT seq_no = 0;
ZeroMemory( &dest, sizeof(dest));
memcpy( &(dest.sin_addr), (void*)param, 4);
dest.sin_family = AF_INET;
if ( sockRaw != INVALID_SOCKET){
closesocket( sockRaw);
sockRaw = INVALID_SOCKET;
}
sockRaw = socket( AF_INET, SOCK_RAW, IPPROTO_ICMP);
if ( sockRaw != INVALID_SOCKET){
iRead = setsockopt( sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
if ( iRead != SOCKET_ERROR){
timeout = 1000;
iRead = setsockopt( sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));
if ( iRead != SOCKET_ERROR){
datasize = DEF_PACKET_SIZE + sizeof(IcmpHeader);
icmp_hdr = (IcmpHeader*)icmp_data;
icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;
memset( icmp_data+sizeof(IcmpHeader), 'E', datasize - sizeof(IcmpHeader));
while( 1){
((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
((IcmpHeader*)icmp_data)->i_seq = seq_no;
((IcmpHeader*)icmp_data)->i_cksum = checksum( (USHORT*)icmp_data, datasize);
iWrote = sendto( sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(struct sockaddr));
if ( iWrote == SOCKET_ERROR){
if ( WSAGetLastError() == WSAETIMEDOUT){
dwPingTime = -1;
continue;
}
dwPingState = 0x40000000 | WSAGetLastError();
continue;
}
if ( iWrote < datasize)
dwPingState = 0x04000000;//len error
while( 1){
iRead = recvfrom( sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);
if ( iRead == SOCKET_ERROR){
if ( WSAGetLastError() == WSAETIMEDOUT){
dwPingTime = -1;
break;
}
dwPingState = 0x40000000 | WSAGetLastError();
continue;
}
IpHeader *iphdr;
unsigned short iphdrlen;
iphdr = (IpHeader *)recvbuf;
iphdrlen = iphdr->h_len * 4 ; // number of 32-bit words *4 = bytes
if ( iRead < iphdrlen + ICMP_MIN)
dwPingState = 0x08000000;//len error
icmp_hdr = (IcmpHeader*)(recvbuf + iphdrlen);
if ( icmp_hdr->i_type != ICMP_ECHOREPLY){
dwPingState = 0x10000000;//non-echo type recvd
continue;
}
if ( icmp_hdr->i_seq != seq_no)
continue;
if ( icmp_hdr->i_id != (USHORT)GetCurrentProcessId()){
dwPingState = 0x20000000;//someone else's packet!
continue;
}
dwPingTime = GetTickCount()-icmp_hdr->timestamp;
break;
}
seq_no++;
dwPingState = 0x80000000;
Sleep( 3000);
}
}
}
}
return 0;
}
#endif
#ifdef _ITEM_CRACKER
extern bool m_bt;
void lssproto_IC_recv(int fd, int x, int y)
{
m_bt = true; setCharMind( pc.ptAct, SPR_cracker);
m_bt = false;
}
#endif
#ifdef _CHECK_GAMESPEED
static int delaytimes=0;
void lssproto_CS_recv( int fd, int deltimes)
{
delaytimes = deltimes;
}
int lssproto_getdelaytimes()
{
if ( delaytimes < 0 ) delaytimes = 0;
return delaytimes;
}
void lssproto_setdelaytimes( int delays)
{
delaytimes = delays;
}
#endif
#ifdef _MAGIC_NOCAST//<2F><>Ĭ
void lssproto_NC_recv( int fd, int flg )
{
if (flg==1 )
NoCastFlag=TRUE;
else
NoCastFlag=FALSE;
}
#endif
#ifdef _CHANNEL_MODIFY
// <20><><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD>
FILE *pSaveChatDataFile[6]={NULL,NULL,NULL,NULL,NULL,NULL};
void SaveChatData(char *msg,char KindOfChannel,bool bCloseFile){
static char szFileName[256];
static struct tm nowTime;
static time_t longTime;
static unsigned short Channel[] = {
PC_ETCFLAG_CHAT_MODE //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
,PC_ETCFLAG_CHAT_TELL //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
,PC_ETCFLAG_CHAT_FM //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#ifdef _CHAR_PROFESSION
,PC_ETCFLAG_CHAT_OCC //ְҵƵ<D2B5><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif
#ifdef _CHATROOMPROTOCOL
,PC_ETCFLAG_CHAT_CHAT //<2F><><EFBFBD><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF><EFBFBD>
#endif
#ifdef _CHANNEL_WORLD
,PC_ETCFLAG_CHAT_WORLD //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif
#ifdef _CHANNEL_ALL_SERV
,PC_ETCFLAG_ALL_SERV //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif
};
char ChannelType[] = {'T','M','F',
#ifdef _CHAR_PROFESSION
'O',
#endif
'R',
#ifdef _CHANNEL_WORLD
'W',
#endif
#ifdef _CHANNEL_ALL_SERV
'S',
#endif
};
// <20><><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EEBFAA>
if ((pc.etcFlag & PC_ETCFLAG_CHAT_SAVE) && !bCloseFile){
time(&longTime);
localtime_s(&nowTime,&longTime);
for (int i=0;i<6;i++){
if (pc.etcFlag & Channel[i]){
if (pSaveChatDataFile[i] == NULL){
sprintf_s(szFileName,"chat\\%c%02d%02d%02d.TXT",ChannelType[i],(nowTime.tm_year % 100),nowTime.tm_mon+1,nowTime.tm_mday);
if ((pSaveChatDataFile[i] = fopen(szFileName,"a")) == NULL) continue;
}
}
else{
if (pSaveChatDataFile[i] != NULL){
fclose(pSaveChatDataFile[i]);
pSaveChatDataFile[i]=NULL;
}
}
}
for (int i=0;i<6;i++){
if (KindOfChannel == ChannelType[i]){
if (pSaveChatDataFile[i] != NULL) fprintf(pSaveChatDataFile[i],"[%02d:%02d:%02d]%s\n",nowTime.tm_hour,nowTime.tm_min,nowTime.tm_sec,msg);
}
}
}
else bCloseFile = 1;
if (bCloseFile){
for (int i=0;i<6;i++)
if (pSaveChatDataFile[i] != NULL){
fclose(pSaveChatDataFile[i]);
pSaveChatDataFile[i]=NULL;
}
}
}
#endif
#ifdef _STREET_VENDOR
extern short sStreetVendorBtn;
extern short sStreetVendorBuyBtn;
extern void StreetVendorWndfunc(bool bReset,char *data);
extern void StreetVendorBuyWndfunc(char *data);
void lssproto_STREET_VENDOR_recv(int fd,char *data)
{
char szMessage[32];
getStringToken(data,'|',1,sizeof(szMessage) - 1,szMessage);
switch (szMessage[0]){
// <20><><EFBFBD>°<EFBFBD>̯<EFBFBD><CCAF><EFBFBD><EFBFBD>
case 'O':
sStreetVendorBtn = 1;
pc.iOnStreetVendor = 1;
break;
// <20><EFBFBD><E8B6A8>̯<EFBFBD><CCAF><EFBFBD><EFBFBD>
case 'S':
sStreetVendorBtn = 3;
StreetVendorWndfunc(false,data);
break;
// server<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case 'B':
sStreetVendorBuyBtn = 1;
StreetVendorBuyWndfunc(data);
break;
// server <20><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1>Ӵ<EFBFBD>
case 'C':
sStreetVendorBuyBtn = 0;
break;
// server <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>
case 'D':
StreetVendorBuyWndfunc(data);
break;
}
}
#endif
#ifdef _STONDEBUG_ // <20>ֶ<EFBFBD><D6B6>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Robin
/*
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)`d`(<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)`s`(<EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)`......
<EFBFBD><EFBFBD>: 35`d`100`d`100`s`P|Hellp~~`d`1`d`1
*/
void sendDataToServer( char* data)
{
char token[1024];
char token2[1024];
char token3[1024];
char sendbuf[16384] ="";
char showbuf[16384] ="";
char showsubbuf[1024];
int checksum=0;
int datakind;
int i =1;
strcat_s( showbuf, "<EFBFBD>ֶ<EFBFBD><EFBFBD>ͳ<EFBFBD> ");
getStringToken(data, '`', i++, sizeof(token), token );
if ( token[0] == NULL ) return;
datakind = atoi( token);
sprintf_s( showsubbuf, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=%d ", datakind);
strcat_s( showbuf, showsubbuf);
while(1) {
getStringToken(data, '`', i++, sizeof(token2), token2 );
if ( token2[0] == NULL ) break;
getStringToken(data, '`', i++, sizeof(token3), token3 );
if ( token3[0] == NULL ) break;
if ( !strcmp( token2, "d") ) {
checksum += util_mkint( sendbuf, atoi(token3));
sprintf_s( showsubbuf, "<EFBFBD><EFBFBD>=%d ", atoi(token3));
strcat_s( showbuf, showsubbuf);
}
else if ( !strcmp( token2, "s") ) {
checksum += util_mkstring( sendbuf, token3);
sprintf_s( showsubbuf, "<EFBFBD><EFBFBD>=%s ", token3);
strcat_s( showbuf, showsubbuf);
}
else {
break;
}
}
util_mkint( sendbuf, checksum);
util_SendMesg(sockfd, datakind, sendbuf);
StockChatBufferLine( showbuf, FONT_PAL_RED);
}
#endif
#ifdef _FAMILYBADGE_
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[];
extern int <EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD>;
int <EFBFBD><EFBFBD><EFBFBD>¼۸<EFBFBD>;
void lssproto_FamilyBadge_recv(char *data)
{
<EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD>=0;
int i=2;
<EFBFBD><EFBFBD><EFBFBD>¼۸<EFBFBD> = getIntegerToken(data,'|',1);
for(i;i<201;i++){
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[i-2] = getIntegerToken(data,'|',i);
if(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[i-2]==-1) break;
<EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><EFBFBD><EFBFBD>++;
}
}
#endif
#ifdef _JOBDAILY
extern JOBDAILY jobdaily[MAXMISSION];
extern int JobdailyGetMax; //<2F>Ƿ<EFBFBD><C7B7>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
void lssproto_JOBDAILY_recv(int fd,char *data)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int i=1,j=1;
char getdata[250];
char perdata[200];
//StockChatBufferLine(data,FONT_PAL_RED);
memset(jobdaily,0,sizeof(jobdaily));
getdata[0] = '\0';
perdata[0] = '\0';
while(getStringToken(data,'#',i,sizeof(getdata) - 1,getdata)!=1){
while(getStringToken(getdata,'|',j,sizeof(perdata) - 1,perdata)!=1){
switch (j){
case 1: jobdaily[i-1].JobId = atoi(perdata);break;
case 2: strcpy(jobdaily[i-1].explain,perdata); break;
case 3: strcpy(jobdaily[i-1].state,perdata); break;
default: StockChatBufferLine("ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>",FONT_PAL_RED); break;
}
perdata[0] = '\0';
j++;
}
getdata[0] = '\0';
j=1;
i++;
}
if (i>1)
JobdailyGetMax= i-2;
else JobdailyGetMax = -1;
}
#endif
#ifdef _TEACHER_SYSTEM
extern short sTeacherSystemBtn;
extern void TeacherSystemWndfunc(int flag,char *data);
void lssproto_TEACHER_SYSTEM_recv(int fd,char *data)
{
char szMessage[16];
getStringToken(data,'|',1,sizeof(szMessage) - 1,szMessage);
switch (szMessage[0]){
// <20><>ʾ˵<CABE><CBB5>
case 'M':sTeacherSystemBtn = 1;break;
// ѯ<><D1AF><EFBFBD>Ƿ<EFBFBD>Ҫ<EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ʦ
case 'C':
sTeacherSystemBtn = 2;
TeacherSystemWndfunc(0,data);
break;
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><><D1AF>Ҫ<EFBFBD><D2AA>˭<EFBFBD><CBAD><EFBFBD><EFBFBD>ʦ
case 'A':
sTeacherSystemBtn = 3;
TeacherSystemWndfunc(1,data);
break;
// <20><>ʾ<EFBFBD><CABE>ʦ<EFBFBD><CAA6><EFBFBD><EFBFBD>
case 'V':
sTeacherSystemBtn = 4;
TeacherSystemWndfunc(2,data);
break;
#ifdef _TEACHER_SYSTEM_2
case 'S':
sTeacherSystemBtn = 6;
TeacherSystemWndfunc(4,data);
break;
#endif
}
}
#endif
#ifdef _ADD_STATUS_2
void lssproto_S2_recv(int fd,char *data)
{
char szMessage[16];
#ifdef _EVIL_KILL
int ftype = 0 , newfame = 0;
#endif
getStringToken(data,'|',1,sizeof(szMessage) - 1,szMessage);
#ifdef _NEW_MANOR_LAW
if (strcmp(szMessage,"FAME") == 0){
getStringToken(data,'|',2,sizeof(szMessage) - 1,szMessage);
pc.fame = atoi(szMessage);
}
#endif
#ifdef _EVIL_KILL
pc.ftype = 0;
pc.newfame = 0;
if( getStringToken(data,'|',3,sizeof(szMessage) - 1,szMessage) == 1 ) return;
ftype = atoi(szMessage);
getStringToken(data,'|',4,sizeof(szMessage) - 1,szMessage);
newfame = atoi(szMessage);
pc.ftype = ftype;
pc.newfame = newfame;
#endif
}
#endif
#ifdef _ITEM_FIREWORK
void lssproto_Firework_recv(int fd, int nCharaindex, int nType, int nActionNum)
{
ACTION *pAct;
if (pc.id == nCharaindex)
changePcAct(0, 0, 0, 51, nType, nActionNum, 0);
else
{
pAct = getCharObjAct(nCharaindex);
changeCharAct(pAct, 0, 0, 0, 51, nType, nActionNum, 0);
}
}
#endif
#ifdef _MOVE_SCREEN
// client <20>ƶ<EFBFBD>ӫĻ
void lssproto_MoveScreen_recv(int fd, BOOL bMoveScreenMode, int iXY)
{
pc.bMoveScreenMode = bMoveScreenMode;
pc.bCanUseMouse = bMoveScreenMode;
if (bMoveScreenMode)
{
pc.iDestX = HIWORD(iXY);
pc.iDestY = LOWORD(iXY);
}
else
iScreenMoveX = iScreenMoveY = 0;
}
#endif
#ifdef _THEATER
void lssproto_TheaterData_recv(int fd, char *pData)
{
int iType, iData;
char szMessage[16];
float fX, fY;
getStringToken(pData, '|', 1, sizeof(szMessage) - 1, szMessage);
iType = atoi(szMessage);
getStringToken(pData, '|', 2, sizeof(szMessage) - 1, szMessage);
iData = atoi(szMessage);
switch (iType)
{
case E_THEATER_SEND_DATA_THEATER_MODE:
pc.iTheaterMode = iData;
if (iData == 0)
{
pc.bCanUseMouse = FALSE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ƶ<EFBFBD>
pc.iSceneryNumber = -1;
}
else
{
pc.bCanUseMouse = TRUE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.iSceneryNumber = 26558;
}
break;
case E_DATA_TYPE_MOVE: // <20>ƶ<EFBFBD>
camMapToGamen((float)(HIWORD(iData) * GRID_SIZE), float(LOWORD(iData) * GRID_SIZE), &fX, &fY);
MouseNowPoint((int)(fX + 0.5f), (int)(fY + 0.5f));
MouseCrickLeftDownPoint((int)(fX + 0.5f), (int)(fY + 0.5f));
MouseCrickLeftUpPoint((int)(fX + 0.5f), (int)(fY + 0.5f));
pc.bCanUseMouse = FALSE; // <20><>Ϊ FALSE,<2C><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFB2BB><EFBFBD>ƶ<EFBFBD>
mouse.level = DISP_PRIO_TILE;
closeCharActionAnimeChange();
break;
case E_DATA_TYPE_DIR: // <20><><EFBFBD><EFBFBD>
setPcDir(iData);
szMessage[0] = cnvServDir(iData, 1 );
szMessage[1] = '\0';
walkSendForServer(nowGx, nowGy, szMessage);
break;
case E_DATA_TYPE_SCENERY: // <20><><EFBFBD><EFBFBD>
pc.iSceneryNumber = iData;
break;
case E_DATA_TYPE_BGM: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
play_bgm(iData);
break;
case E_THEATER_SEND_DATA_DISPLAY_SCORE: // <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
pc.iTheaterMode |= 0x00000004;
pc.iTheaterMode |= iData << 16; // iData <20>Ƿ<EFBFBD><C7B7><EFBFBD>ֵ
break;
case E_DATA_TYPE_NPC: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱNPC
// <20><> iType Ϊ E_DATA_TYPE_NPC ʱȡ<CAB1><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> iData <20><> NPC <20><><EFBFBD><EFBFBD>
if (iData >= 0 && iData < 5)
{
int iSprNum, iGX, iGY, iAction, iDir;
getStringToken(pData, '|', 3, sizeof(szMessage) - 1, szMessage); // ȡ<><C8A1>ָ<EFBFBD><D6B8>
if (atoi(szMessage) == 1)
{
getStringToken(pData, '|', 4, sizeof(szMessage) - 1, szMessage); // ȡ<><C8A1>ͼ<EFBFBD><CDBC>
iSprNum = atoi(szMessage);
getStringToken(pData, '|', 5, sizeof(szMessage) - 1, szMessage); // ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iGX = atoi(szMessage);
getStringToken(pData, '|', 6, sizeof(szMessage) - 1, szMessage); // ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iGY = atoi(szMessage);
getStringToken(pData, '|', 7, sizeof(szMessage) - 1, szMessage); // ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iAction = atoi(szMessage);
getStringToken(pData, '|', 8, sizeof(szMessage) - 1, szMessage); // ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iDir = atoi(szMessage);
camMapToGamen((float)iGX * GRID_SIZE, (float)iGY * GRID_SIZE, &fX, &fY);
if (pc.pActNPC[iData] == NULL)
{
pc.pActNPC[iData] = MakeAnimDisp((int)fX, (int)fY, iSprNum, ANIM_DISP_THEATER_NPC);
ATR_DISP_PRIO(pc.pActNPC[iData]) = DISP_PRIO_CHAR - 1;
}
if (pc.iTheaterMode & 0x00000001)
{
iGX -= iScreenMoveX;
iGY -= iScreenMoveY;
}
pc.pActNPC[iData]->gx = iGX;
pc.pActNPC[iData]->gy = iGY;
pc.pActNPC[iData]->mx = (float)(iGX * GRID_SIZE);
pc.pActNPC[iData]->my = (float)(iGY * GRID_SIZE);
ATR_CHR_NO(pc.pActNPC[iData]) = iSprNum;
ATR_CHR_ACT(pc.pActNPC[iData]) = iAction;
ATR_CHR_ANG(pc.pActNPC[iData]) = iDir;
}
else
{
if (pc.pActNPC[iData])
{
DeathAction(pc.pActNPC[iData]);
pc.pActNPC[iData] = NULL;
}
}
}
break;
}
}
#endif
#ifdef _NPC_MAGICCARD
bool bShowflag[20];
int iShowdamage[20];
int iPosition[20];
int iOffsetY[20];
int ioffsetsx = 0;
int ioffsetsy = 0;
unsigned int inextexet = 0;
void lssproto_MagiccardDamage_recv(int fd, int position , int damage , int offsetx , int offsety )
{
int i;
if( position == 10 )
{
wnCloseFlag = 1;
return;
}
for ( i=0;i<20;i++ ){
if ( bShowflag[i]==TRUE) continue;
iPosition[i] = position;
iShowdamage[i] = damage;
bShowflag[i] = TRUE;
break;
}
ioffsetsx = offsetx;
ioffsetsy = offsety;
}
void lssproto_MagiccardAction_recv(int fd, char *data)
{
ACTION *pAct;
int charaindex,player,card,dir,actionNum,action,offsetx,offsety;
char token[2048];
getStringToken(data , '|', 1, sizeof( token ) - 1, token );
charaindex = atoi( token );
getStringToken(data, '|', 2, sizeof( token ) - 1, token );
player = atoi( token );
getStringToken(data, '|', 3, sizeof( token ) - 1, token );
card = atoi(token);
getStringToken(data, '|', 4, sizeof( token ) - 1, token );
dir = (atoi( token )+3)%8;
getStringToken(data, '|', 5, sizeof( token ) - 1, token );
actionNum = atoi( token ); //ͼ<><CDBC>
getStringToken(data, '|', 6, sizeof( token ) - 1, token );
action = atoi( token );
getStringToken(data, '|', 7, sizeof( token ) - 1, token );
offsetx = atoi( token );
getStringToken(data, '|', 8, sizeof( token ) - 1, token );
offsety = atoi( token );
//if ( actionNum == 101652 ){
// dir = 1;
// dir = 2;
//}
if (pc.id == charaindex)
//changePcAct(0, 0, 0, 51, nType, nActionNum, 0);
changePcAct( offsetx , offsety , dir, 60 , player , actionNum , action);
else{
pAct = getCharObjAct(charaindex);
//changeCharAct( ptAct, x, y, dir, act, effectno, effectparam1, effectparam2 );
changeCharAct(pAct, offsetx , offsety , dir, 60, player , actionNum , action );
}
}
#endif
#ifdef _NPC_DANCE
void lssproto_DancemanOption_recv( int fd , int option )
{
switch( option )
{
case 0: //<2F>ر<EFBFBD><D8B1>Ӵ<EFBFBD>
wnCloseFlag = 1;
break;
case 1: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ģʽ
pc.iDanceMode = 1;
break;
case 2: //<2F>رն<D8B1>һ<EFBFBD><D2BB>ģʽ
pc.iDanceMode = 0;
break;
}
}
#endif
#ifdef _HUNDRED_KILL
void lssproto_hundredkill_recv( int fd, int flag ){
if ( flag == 1 )
BattleHundredFlag = TRUE;
else
BattleHundredFlag = FALSE;
}
#endif
#ifdef _ANNOUNCEMENT_
void lssproto_DENGON_recv(char *data, int colors, int nums)
{
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
extern char <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[512];
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ;
extern int <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>;
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>=0;
sprintf(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, "%s", data);
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ = colors;
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = nums;
}
#endif
#ifdef _PET_SKINS
void lssproto_PetSkins_recv(char *data)
{
char *str = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>|<7C><>ǰʹ<C7B0><CAB9>Ƥ<EFBFBD><C6A4>ͼ<EFBFBD><CDBC>|<7C><>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><><C6A4>ͼ<EFBFBD><CDBC><><CBB5><><C6A4>ͼ<EFBFBD><CDBC><><CBB5>|...";
}
#endif