2020-06-23 15:53:23 +08:00
|
|
|
|
#include <stdio.h>
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#define NETPROC_NOTSEND 0 // ??????????
|
|
|
|
|
#define NETPROC_SENDING 1 // ??????
|
|
|
|
|
#define NETPROC_RECEIVED 2 // ???
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _MAILSHOWPLANET // (可开放) Syu ADD 显示名片星球
|
2020-06-23 15:27:59 +08:00
|
|
|
|
extern struct gameserver gmsv[];
|
|
|
|
|
#endif
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _NEW_WGS_MSG // WON ADD WGS的新视窗
|
2020-06-23 15:27:59 +08:00
|
|
|
|
int ERROR_MESSAGE = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// GAMESTATE_CHOOSESERVER??????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
char gamestate_chooseserver_name[128];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// GAMESTATE_LOGIN??????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
char gamestate_login_charname[128];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// GAMESTATE_DELETECHAR??????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case 1: // 战斗技能
|
2020-06-23 15:27:59 +08:00
|
|
|
|
BattleSkill[count1] = i;
|
|
|
|
|
count1++;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case 2: // 辅助
|
2020-06-23 15:27:59 +08:00
|
|
|
|
AssitSkill[count2] = i;
|
|
|
|
|
count2++;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case 3: // 进阶
|
2020-06-23 15:27:59 +08:00
|
|
|
|
AdvanceSkill[count3] = i;
|
|
|
|
|
count3++;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef _CHANNEL_MODIFY
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 储存对话内容
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
fprintf(rfp, "收到:\t%s\n", data);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT_S);
|
|
|
|
|
return -5;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dwServer = WGS;
|
|
|
|
|
iWGS = 1;
|
|
|
|
|
connectServerCounter = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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();
|
2020-06-23 15:53:23 +08:00
|
|
|
|
connectServerCounter = 143; // 暂定
|
2020-06-23 15:27:59 +08:00
|
|
|
|
iWGS = 7;
|
|
|
|
|
#endif
|
|
|
|
|
if (FD_ISSET(sockfd, &efds))
|
|
|
|
|
{
|
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
sprintf_s(netprocErrmsg, NET_ERRMSG_BADNAME);
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
|
if (sockfd == INVALID_SOCKET)
|
|
|
|
|
{
|
|
|
|
|
count = 0;
|
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
count = 0;
|
|
|
|
|
sprintf_s(netprocErrmsg, NET_ERRMSG_VERSIONERROR);
|
|
|
|
|
closesocket(sockfd);
|
|
|
|
|
dwServer = NULL;
|
|
|
|
|
return -8;
|
|
|
|
|
}
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
count = 0;
|
|
|
|
|
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
|
|
|
|
|
closesocket(sockfd);
|
|
|
|
|
dwServer = NULL;
|
|
|
|
|
return -6;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//end cary
|
|
|
|
|
if (FD_ISSET(sockfd, &efds))
|
|
|
|
|
{
|
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
count = 0;
|
|
|
|
|
sprintf_s(netprocErrmsg, NET_ERRMSG_NOTCONNECT);
|
|
|
|
|
closesocket(sockfd);
|
|
|
|
|
dwServer = NULL;
|
|
|
|
|
return -6;
|
|
|
|
|
}
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
count++;
|
|
|
|
|
|
|
|
|
|
if(count >= 1500)
|
|
|
|
|
{
|
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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);
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern char 机器数据[];
|
2020-06-23 15:27:59 +08:00
|
|
|
|
unsigned char tmp[256];
|
|
|
|
|
CHAR mac[64];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
MD5( (const unsigned char*)机器数据, strlen(机器数据), tmp );
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern char 玩家公网IP[];
|
|
|
|
|
lssproto_ClientLogin_send(sockfd, userId,userPassword, token, selectServerIndex,玩家公网IP);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime() + 2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
//cary
|
|
|
|
|
ChangeProc( PROC_ID_PASSWORD );
|
|
|
|
|
SubProcNo = 5;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
DeathAllAction();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void charListStart(void)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MAXCHARACTER; i++)
|
|
|
|
|
resetCharacterList(i);
|
|
|
|
|
#ifdef _MORECHARACTERS_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int 多人物当前页数;
|
|
|
|
|
多人物当前页数=0;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
TCHAR 登陆错误内容[1024];
|
2020-06-23 15:27:59 +08:00
|
|
|
|
|
|
|
|
|
void lssproto_CharList_recv(int fd, char *result, char *data)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
memset(登陆错误内容,0,1024);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if(strcmp(result,_T("failed"))==0) {
|
2020-06-23 15:53:23 +08:00
|
|
|
|
strcpy(登陆错误内容,data);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#ifdef _AIDENGLU_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PcLanded.登陆延时时间 = TimeGetTime()+2000;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _NEW_WGS_MSG // WON ADD WGS的新视窗
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _NEW_WGS_MSG // WON ADD WGS的新视窗
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _NEW_WGS_MSG // WON ADD WGS的新视窗
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 '|'
|
|
|
|
|
|
|
|
|
|
/*================================
|
2020-06-23 15:53:23 +08:00
|
|
|
|
C warp 用
|
|
|
|
|
D 修正时间
|
|
|
|
|
X 骑宠
|
|
|
|
|
P 人物状态
|
|
|
|
|
F 家族状态
|
2020-06-23 15:27:59 +08:00
|
|
|
|
M HP,MP,EXP
|
2020-06-23 15:53:23 +08:00
|
|
|
|
K 宠物状态
|
2020-06-23 15:27:59 +08:00
|
|
|
|
E nowEncountPercentage
|
2020-06-23 15:53:23 +08:00
|
|
|
|
J 魔法
|
|
|
|
|
N 队伍资讯
|
|
|
|
|
I 道具
|
|
|
|
|
W 宠物技能
|
|
|
|
|
S 职业技能
|
|
|
|
|
G 职业技能冷却时间
|
2020-06-23 15:27:59 +08:00
|
|
|
|
================================*/
|
|
|
|
|
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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.道具栏状态 = getIntegerToken(data, S_DELIM, 32);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef _SA_VERSION_25
|
|
|
|
|
int pointindex = getIntegerToken(data, S_DELIM, 33);
|
|
|
|
|
char pontname[][32]={
|
2020-06-23 15:53:23 +08:00
|
|
|
|
"萨姆吉尔村",
|
|
|
|
|
"玛丽娜丝村",
|
|
|
|
|
"加加村",
|
|
|
|
|
"卡鲁它那村",
|
2020-06-23 15:27:59 +08:00
|
|
|
|
};
|
|
|
|
|
sprintf(pc.chusheng,"%s",pontname[pointindex]);
|
|
|
|
|
#ifdef _MAGIC_ITEM_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.法宝道具状态 = getIntegerToken(data, S_DELIM, 34);
|
|
|
|
|
pc.道具光环效果 = getIntegerToken(data, S_DELIM, 35);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.签到标记 = getIntegerToken(data, S_DELIM, i);// 0x80000000
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s( title, "%s %s [%s %s:%s]", DEF_APPNAME, "调试版本",
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int 繁体开关;
|
|
|
|
|
if(繁体开关){
|
|
|
|
|
char 繁体[1024]={0};
|
|
|
|
|
LCMapString (0x804,0x4000000,title, strlen(title),繁体,1024);
|
|
|
|
|
sprintf(title,"%s",繁体);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int 编码;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
extern char* GB2312ToBIG5(const char* szGBString);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if(编码==950){
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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);
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 显示物品耐久度
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.item[i].道具类型 = getIntegerToken(data, '|', no + 13);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
//接收到的宠物技能
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if (strlen(szData) == 0) // 没道具
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 显示物品耐久度
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
//可拿给宠物装备的道具,就不会是拼图了,以下就免了
|
2020-06-23 15:27:59 +08:00
|
|
|
|
//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];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s(msg, "佋???????????????FL%d %d,%d-%d,%d (%ud/%ud)", fl, x1, y1, x2, y2, tileSum, partsSum);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s(msg , "??????佋????????FL%d %d,%d-%d,%d", fl, x1, y1, x2, y2);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
|
2020-06-23 15:27:59 +08:00
|
|
|
|
int profession_class, profession_level, profession_skill_point;
|
|
|
|
|
#endif
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _ALLDOMAN // (不可开) Syu ADD 排行榜NPC
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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);
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern BOOL 人物屏蔽开关;
|
|
|
|
|
if(人物屏蔽开关){
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _ALLDOMAN // Syu ADD 排行榜NPC
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// #ifdef _GM_IDENTIFY // Rog ADD GM识别
|
2020-06-23 15:27:59 +08:00
|
|
|
|
// 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();
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
|
|
|
|
|
// #ifdef _GM_IDENTIFY // Rog ADD GM识别
|
2020-06-23 15:27:59 +08:00
|
|
|
|
// 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);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _ALLDOMAN // Syu ADD 排行榜NPC
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
|
|
|
|
|
#ifdef _GM_IDENTIFY // Rog ADD GM识别
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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);
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
|
|
|
|
|
#ifdef _GM_IDENTIFY // Rog ADD GM识别
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 ){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// NPC?
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// PC??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( pc.ptAct == NULL
|
|
|
|
|
|| (pc.ptAct != NULL && pc.ptAct->anim_chr_no == 0) )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????????C????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?ID???????????????????ID??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_CD_recv( int fd, char *data )
|
|
|
|
|
{
|
|
|
|
|
int i, j;
|
|
|
|
|
int id;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ? ///////////////////////////////////////////////////////////////////
|
|
|
|
|
// ????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????
|
|
|
|
|
// ??????????????????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_W_recv( int fd, int id, int x, int y )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
// ??????????????????????
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _STONDEBUG_ // 手动送出封包
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if(strstr(str,".光环")){
|
|
|
|
|
int 光环ID=0;
|
|
|
|
|
光环ID = getIntegerToken(str, ' ',2);
|
|
|
|
|
setCharmManor(pc.ptAct, 光环ID);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
StockChatBufferLine("表演中请勿喧哗。。。", FONT_PAL_YELLOW);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef _NPC_DANCE
|
|
|
|
|
if( pc.iDanceMode )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
StockChatBufferLine("嘘!你可能会吵到别人。", FONT_PAL_YELLOW);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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) {
|
2020-06-23 15:53:23 +08:00
|
|
|
|
StockChatBufferLine( "指令使用格式不正确!" , FONT_PAL_RED);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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:
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s(m,"P|/OCC%s:%s",pc.name,dest);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
break;
|
|
|
|
|
#ifdef _CHATROOMPROTOCOL
|
|
|
|
|
case 5:
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s(tmpMsg,"T|%s:%s",pc.name,dest);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lssproto_CHATROOM_send (sockfd ,tmpMsg);
|
|
|
|
|
return;
|
|
|
|
|
#endif
|
|
|
|
|
*/
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _CHANNEL_WORLD ///世界频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???? ///////////////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _TRADETALKWND // (不可开) Syu ADD 交易新增对话框架
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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]){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 密语频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'M':
|
|
|
|
|
{
|
|
|
|
|
char tellName[32] = { "" };
|
|
|
|
|
char szMsgBuf[2024];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
char temp[] = "告诉你:";
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 家族频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'F':
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 队伍频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'T':
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 职业频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'O':
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
SaveChatData(msg,szToken[0],false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else getStringToken(message,'|',2,2022 - 1,msg);
|
|
|
|
|
#ifdef _TALK_WINDOW
|
|
|
|
|
if (!g_bTalkWindow)
|
|
|
|
|
#endif
|
|
|
|
|
TradeTalk(msg);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if (strcmp(msg,"成立聊天室扣除200石币") == 0) pc.gold -= 200;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _TELLCHANNEL // (不可开) ROG ADD 密语频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
char temp[] = "告诉你:";
|
2020-06-23 15:27:59 +08:00
|
|
|
|
char *found;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if (strcmp( msg, "成立聊天室扣除200石币") == 0) pc.gold -= 200;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
|
|
|
|
|
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 ){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 1000??
|
2020-06-23 15:27:59 +08:00
|
|
|
|
setPcFukidashi( 1000 );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ptAct = getCharObjAct( index );
|
|
|
|
|
if ( ptAct != NULL )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 1000??
|
2020-06-23 15:27:59 +08:00
|
|
|
|
setCharFukidashi( ptAct, 1000 );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???? ///////////////////////////////////////////////////////////
|
|
|
|
|
// ????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void createNewCharStart(void)
|
|
|
|
|
{
|
|
|
|
|
newCharStatus = 0;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if (bNewServer){
|
|
|
|
|
#ifdef _MORECHARACTERS_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int 多人物当前页数;
|
|
|
|
|
lssproto_CreateNewChar_send(sockfd, selectPcNo+多人物当前页数*2, newCharacterName,
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????
|
|
|
|
|
// ??: 0 ... ? / 1 ... ?? / -1 ... ?????? / -2 ... ?????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
char 创建人物内容提示[512];
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf(创建人物内容提示,data);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ????? /////////////////////////////////////////////////////////////
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void delCharStart(void)
|
|
|
|
|
{
|
|
|
|
|
charDelStatus = 0;
|
|
|
|
|
|
|
|
|
|
if (bNewServer)
|
|
|
|
|
lssproto_CharDelete_send(sockfd, gamestate_deletechar_charname );
|
|
|
|
|
else
|
|
|
|
|
old_lssproto_CharDelete_send(sockfd, gamestate_deletechar_charname );
|
|
|
|
|
|
|
|
|
|
SETSENDING;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????
|
|
|
|
|
// ??: 0 ... ??? / 1 ... ???? / -1 ... ?????? / -2 ... ?????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????? /////////////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_PR_recv( int fd, int request, int result )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( request == 1 && result == 1 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
setPcParty();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if ( request == 0 && result == 1 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
//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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// EV?????????? /////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_EV_recv( int fd, int seqno, int result )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( eventWarpSendId == seqno )
|
|
|
|
|
{
|
|
|
|
|
eventWarpSendFlag = 0;
|
|
|
|
|
if ( result == 0 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
redrawMap();
|
|
|
|
|
floorChangeFlag = FALSE;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
warpEffectStart = TRUE;
|
|
|
|
|
warpEffectOk = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if ( eventEnemySendId == seqno )
|
|
|
|
|
{
|
|
|
|
|
if ( result == 0 )
|
|
|
|
|
{
|
|
|
|
|
eventEnemySendFlag = 0;
|
|
|
|
|
}
|
|
|
|
|
//else
|
|
|
|
|
//{
|
|
|
|
|
// ??????process.cpp???
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??OK???OK????? OK? ////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_FS_recv( int fd, int flg )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
pc.etcFlag = (unsigned short)flg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????? ///////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_AB_recv( int fd, char *data )
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int no;
|
|
|
|
|
int nameLen;
|
|
|
|
|
char name[256];
|
|
|
|
|
int flag;
|
|
|
|
|
int useFlag;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _MAILSHOWPLANET // (可开放) Syu ADD 显示名片星球
|
2020-06-23 15:27:59 +08:00
|
|
|
|
char planetid[8];
|
|
|
|
|
int j ;
|
|
|
|
|
#endif
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
mailLamp = CheckMailNoReadFlag();
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _MAILSHOWPLANET // (可开放) Syu ADD 显示名片星球
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????????////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_ABI_recv( int fd, int num, char* data )
|
|
|
|
|
{
|
|
|
|
|
char name[256];
|
|
|
|
|
int nameLen;
|
|
|
|
|
int useFlag;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _MAILSHOWPLANET // (可开放) Syu ADD 显示名片星球
|
2020-06-23 15:27:59 +08:00
|
|
|
|
char planetid[8];
|
|
|
|
|
int j ;
|
|
|
|
|
#endif
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
mailLamp = CheckMailNoReadFlag();
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _MAILSHOWPLANET // (可开放) Syu ADD 显示名片星球
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????? /////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_RS_recv( int fd, char *data )
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
char token[2048];
|
|
|
|
|
char item[2048];
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
battleResultMsg.useFlag = 1;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
//cary 确定 栏位 数
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????? /////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_RD_recv( int fd, char *data )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
battleResultMsg.useFlag = 2;
|
|
|
|
|
|
|
|
|
|
battleResultMsg.resChr[0].exp = getInteger62Token(data, '|', 1 );
|
|
|
|
|
battleResultMsg.resChr[1].exp = getInteger62Token(data, '|', 2 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????? ///////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_SI_recv( int fd, int from, int to )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
swapItem( from, to );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???? ///////////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_I_recv( int fd, char *data )
|
|
|
|
|
{
|
|
|
|
|
int i, j;
|
|
|
|
|
int no;
|
|
|
|
|
char name[256];
|
|
|
|
|
char name2[256];
|
|
|
|
|
char memo[256];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
//char *data = "9|乌力斯坦的肉||0|耐久力10前後回复|24002|0|1|0|7|不会损坏|1|肉|20||10|乌力斯坦的肉||0|耐久力10前後回复|24002|0|1|0|7|不会损坏|1|肉|20|";
|
|
|
|
|
if ( logOutFlag )//人物未登陆则不接收这个封包
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
i = getIntegerToken(data, '|', no+1 );//道具位
|
|
|
|
|
if ( getStringToken(data, '|', no+2, sizeof(name) - 1 , name ) == 1 )//道具名
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(data, '|', no+3, sizeof( name2 ) - 1, name2 );//第二个道具名
|
2020-06-23 15:27:59 +08:00
|
|
|
|
makeStringFromEscaped( name2 );
|
|
|
|
|
if ( strlen( name2 ) <= ITEM_NAME2_LEN ){
|
|
|
|
|
strcpy( pc.item[i].name2, name2 );
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.item[i].color = getIntegerToken(data, '|', no+4 );//颜色
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( pc.item[i].color < 0 )
|
|
|
|
|
pc.item[i].color = 0;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(data, '|', no+5, sizeof( memo ) - 1, memo );//道具介绍
|
2020-06-23 15:27:59 +08:00
|
|
|
|
makeStringFromEscaped( memo );
|
|
|
|
|
if ( strlen( memo ) <= ITEM_MEMO_LEN ){
|
|
|
|
|
strcpy( pc.item[i].memo, memo );
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.item[i].graNo = getIntegerToken(data, '|', no+6 );//道具形像
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.item[i].level = getIntegerToken(data, '|', no+9 );//等级
|
2020-06-23 15:27:59 +08:00
|
|
|
|
pc.item[i].sendFlag = getIntegerToken(data, '|', no+10 );
|
|
|
|
|
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 显示物品耐久度
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.item[i].道具类型 = getIntegerToken(data, '|', no + 14);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if( strstr(data,"否则家族在七天之后会消失唷!") ){
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if( TimeGetTime() - MsgCooltime > 300000 )
|
|
|
|
|
MsgCooltime = TimeGetTime();
|
|
|
|
|
else
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
openServerWindow( windowtype, buttontype, seqno, objindex, data );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????? ///////////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_PME_recv( int fd, int objindex,
|
|
|
|
|
int graphicsno, int x, int y, int dir, int flg, int no, char *cdata )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( encountNowFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????? /////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_EF_recv( int fd, int effect, int level, char *option )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( effect == 0 )
|
|
|
|
|
{
|
|
|
|
|
mapEffectRainLevel = 0;
|
|
|
|
|
mapEffectSnowLevel = 0;
|
|
|
|
|
mapEffectKamiFubukiLevel = 0;
|
|
|
|
|
#ifdef _HALLOWEEN_EFFECT
|
|
|
|
|
mapEffectHalloween = 0;
|
|
|
|
|
initMapEffect(FALSE);
|
|
|
|
|
#endif
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// ???????
|
|
|
|
|
if ( effect & 1 )
|
|
|
|
|
{
|
|
|
|
|
mapEffectRainLevel = level;
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 骰子
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ? ///////////////////////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
StatusUpPoint = point;
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_MSG_recv( int fd,int aindex,char* text ,int color)
|
|
|
|
|
{
|
|
|
|
|
char moji[ 256 ];
|
|
|
|
|
int noReadFlag;
|
|
|
|
|
|
|
|
|
|
// ???????????
|
|
|
|
|
mailLamp = TRUE;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
MailHistory[ aindex ].newHistoryNo--;
|
|
|
|
|
// ????????
|
|
|
|
|
if ( MailHistory[ aindex ].newHistoryNo <= -1 ) MailHistory[ aindex ].newHistoryNo = MAIL_MAX_HISTORY - 1;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
getStringToken( text, '|', 1, sizeof( MailHistory[ aindex ].dateStr[ MailHistory[ aindex ].newHistoryNo ] ) - 1,
|
|
|
|
|
MailHistory[ aindex ].dateStr[ MailHistory[ aindex ].newHistoryNo ] );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???
|
2020-06-23 15:27:59 +08:00
|
|
|
|
getStringToken( text, '|', 2, sizeof( MailHistory[ aindex ].str[ MailHistory[ aindex ].newHistoryNo ] ) - 1,
|
|
|
|
|
MailHistory[ aindex ].str[ MailHistory[ aindex ].newHistoryNo ] );
|
|
|
|
|
// ????????
|
|
|
|
|
makeStringFromEscaped( MailHistory[ aindex ].str[ MailHistory[ aindex ].newHistoryNo ] );
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
noReadFlag = getIntegerToken( text, '|', 3 );
|
|
|
|
|
// ????????
|
|
|
|
|
if ( noReadFlag != -1 ){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
MailHistory[ aindex ].noReadFlag[ MailHistory[ aindex ].newHistoryNo ] = noReadFlag;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
MailHistory[ aindex ].petLevel[ MailHistory[ aindex ].newHistoryNo ] = getIntegerToken( text, '|', 4 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
getStringToken( text, '|', 5, sizeof( MailHistory[ aindex ].petName[ MailHistory[ aindex ].newHistoryNo ] ),
|
|
|
|
|
MailHistory[ aindex ].petName[ MailHistory[ aindex ].newHistoryNo ] );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
makeStringFromEscaped( MailHistory[ aindex ].petName[ MailHistory[ aindex ].newHistoryNo ] );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
MailHistory[ aindex ].itemGraNo[ MailHistory[ aindex ].newHistoryNo ] = getIntegerToken( text, '|', 6 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????
|
|
|
|
|
sprintf_s( moji,"收到%s送来的宠物邮件!", addressBook[ aindex ].name );
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
else{
|
|
|
|
|
MailHistory[ aindex ].noReadFlag[ MailHistory[ aindex ].newHistoryNo ] = TRUE;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????
|
|
|
|
|
sprintf_s( moji,"收到%s送来的邮件!", addressBook[ aindex ].name );
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
StockChatBufferLine( moji, FONT_PAL_WHITE );
|
|
|
|
|
|
|
|
|
|
// ????????
|
|
|
|
|
if ( mailHistoryWndSelectNo == aindex ){
|
|
|
|
|
// ??????????????
|
|
|
|
|
mailHistoryWndPageNo++;
|
|
|
|
|
// ????????
|
|
|
|
|
if ( mailHistoryWndPageNo >= MAIL_MAX_HISTORY ) mailHistoryWndPageNo = 0;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
// DeathLetterAction();
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?
|
2020-06-23 15:27:59 +08:00
|
|
|
|
play_se( 101, 320, 240 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
SaveMailHistory( aindex );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_PS_recv( int fd,int result,int havepetindex,int havepetskill,int toindex )
|
|
|
|
|
{
|
|
|
|
|
char moji[ 256 ];
|
|
|
|
|
|
|
|
|
|
// ???????
|
|
|
|
|
ItemMixRecvFlag = FALSE;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ???
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( result == 0 ){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
//???????
|
|
|
|
|
sprintf_s( moji,"失败!");
|
|
|
|
|
// ??????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
StockChatBufferLine( moji, FONT_PAL_WHITE );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_SE_recv( int fd, int x, int y, int senumber, int sw )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if ( logOutFlag )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if ( sw )
|
|
|
|
|
{
|
|
|
|
|
play_se( senumber, x, y );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ??????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
transmigrationEffectFlag = 1;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
transEffectPaletteStatus = 1;
|
|
|
|
|
// ????????
|
|
|
|
|
palNo = 15;
|
|
|
|
|
palTime = 300;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????? /////////////////////////////////////////////////////////
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_Echo_recv( int fd, char *test )
|
|
|
|
|
{
|
|
|
|
|
#if 1
|
|
|
|
|
#ifdef _STONDEBUG__MSG
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
time( &serverAliveLongTime );
|
|
|
|
|
localtime_s(&serverAliveTime, &serverAliveLongTime );
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Robin 2001/04/06
|
|
|
|
|
void lssproto_NU_recv( int fd, int AddCount)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// ?????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_PlayerNumGet_recv( int fd, int logincount, int player )
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void lssproto_ProcGet_recv( int fd, char* data )
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2020-06-23 15:53:23 +08:00
|
|
|
|
???????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
void lssproto_R_recv( int fd, char* data )
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void lssproto_D_recv( int fd,int category,int dx,int dy,char* data )
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2020-06-23 15:53:23 +08:00
|
|
|
|
???????????????????????
|
2020-06-23 15:27:59 +08:00
|
|
|
|
*/
|
|
|
|
|
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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if ( strcmp(FMType2,"F") ==0) // 家族列表
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
initFamilyList(data );
|
|
|
|
|
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if ( strcmp(FMType2,"D") ==0) // 家族详细
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
initFamilyDetail(data );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if ( strcmp(FMType1,"C") ==0 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if ( strcmp(FMType2,"J") ==0) // 加入频道
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
getStringToken(data, '|', 3, sizeof( FMType3 ) - 1, FMType3 );
|
|
|
|
|
pc.channel = atoi( FMType3 );
|
|
|
|
|
if ( pc.channel != -1 )
|
|
|
|
|
pc.quickChannel = pc.channel;
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if ( strcmp(FMType2,"L") ==0) // 频道列表
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
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 );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
else if ( strcmp(FMType1,"L") ==0 ) // 族长功能
|
2020-06-23 15:27:59 +08:00
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _MAGIC_NOCAST//沉默
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_NC_recv( int fd, int flg )
|
|
|
|
|
{
|
|
|
|
|
if (flg==1 )
|
|
|
|
|
NoCastFlag=TRUE;
|
|
|
|
|
else
|
|
|
|
|
NoCastFlag=FALSE;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef _CHANNEL_MODIFY
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 储存对话内容
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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[] = {
|
2020-06-23 15:53:23 +08:00
|
|
|
|
PC_ETCFLAG_CHAT_MODE //队伍频道开关
|
|
|
|
|
,PC_ETCFLAG_CHAT_TELL //密语频道开关
|
|
|
|
|
,PC_ETCFLAG_CHAT_FM //家族频道开关
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#ifdef _CHAR_PROFESSION
|
2020-06-23 15:53:23 +08:00
|
|
|
|
,PC_ETCFLAG_CHAT_OCC //职业频道开关
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef _CHATROOMPROTOCOL
|
2020-06-23 15:53:23 +08:00
|
|
|
|
,PC_ETCFLAG_CHAT_CHAT //聊天室开关
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef _CHANNEL_WORLD
|
2020-06-23 15:53:23 +08:00
|
|
|
|
,PC_ETCFLAG_CHAT_WORLD //世界频道开关
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef _CHANNEL_ALL_SERV
|
2020-06-23 15:53:23 +08:00
|
|
|
|
,PC_ETCFLAG_ALL_SERV //星球频道开关
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#endif
|
|
|
|
|
};
|
|
|
|
|
char ChannelType[] = {'T','M','F',
|
|
|
|
|
#ifdef _CHAR_PROFESSION
|
|
|
|
|
'O',
|
|
|
|
|
#endif
|
|
|
|
|
'R',
|
|
|
|
|
#ifdef _CHANNEL_WORLD
|
|
|
|
|
'W',
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef _CHANNEL_ALL_SERV
|
|
|
|
|
'S',
|
|
|
|
|
#endif
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 储存对话内容选项开启
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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]){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 开新摆摊介面
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'O':
|
|
|
|
|
sStreetVendorBtn = 1;
|
|
|
|
|
pc.iOnStreetVendor = 1;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 设定摆摊内容
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'S':
|
|
|
|
|
sStreetVendorBtn = 3;
|
|
|
|
|
StreetVendorWndfunc(false,data);
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// server送来的卖方贩卖内容
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'B':
|
|
|
|
|
sStreetVendorBuyBtn = 1;
|
|
|
|
|
StreetVendorBuyWndfunc(data);
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// server 送来关闭视窗
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'C':
|
|
|
|
|
sStreetVendorBuyBtn = 0;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// server 送来的单笔贩卖物详细资料
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'D':
|
|
|
|
|
StreetVendorBuyWndfunc(data);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
#ifdef _STONDEBUG_ // 手动送出封包功能 Robin
|
2020-06-23 15:27:59 +08:00
|
|
|
|
/*
|
2020-06-23 15:53:23 +08:00
|
|
|
|
(封包编号)`d`(数值资料)`s`(字串资料)`......
|
|
|
|
|
例: 35`d`100`d`100`s`P|Hellp~~`d`1`d`1
|
2020-06-23 15:27:59 +08:00
|
|
|
|
*/
|
|
|
|
|
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;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
strcat_s( showbuf, "手动送出 ");
|
2020-06-23 15:27:59 +08:00
|
|
|
|
|
|
|
|
|
getStringToken(data, '`', i++, sizeof(token), token );
|
|
|
|
|
if ( token[0] == NULL ) return;
|
|
|
|
|
datakind = atoi( token);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s( showsubbuf, "封包=%d ", datakind);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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));
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s( showsubbuf, "数=%d ", atoi(token3));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
strcat_s( showbuf, showsubbuf);
|
|
|
|
|
}
|
|
|
|
|
else if ( !strcmp( token2, "s") ) {
|
|
|
|
|
checksum += util_mkstring( sendbuf, token3);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
sprintf_s( showsubbuf, "字=%s ", token3);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
strcat_s( showbuf, showsubbuf);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
util_mkint( sendbuf, checksum);
|
|
|
|
|
util_SendMesg(sockfd, datakind, sendbuf);
|
|
|
|
|
|
|
|
|
|
StockChatBufferLine( showbuf, FONT_PAL_RED);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef _FAMILYBADGE_
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int 徽章数据[];
|
|
|
|
|
extern int 徽章个数;
|
|
|
|
|
int 徽章价格;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_FamilyBadge_recv(char *data)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
徽章个数=0;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
int i=2;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
徽章价格 = getIntegerToken(data,'|',1);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
for(i;i<201;i++){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
徽章数据[i-2] = getIntegerToken(data,'|',i);
|
|
|
|
|
if(徽章数据[i-2]==-1) break;
|
|
|
|
|
徽章个数++;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _JOBDAILY
|
|
|
|
|
extern JOBDAILY jobdaily[MAXMISSION];
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int JobdailyGetMax; //是否有接收到资料
|
2020-06-23 15:27:59 +08:00
|
|
|
|
void lssproto_JOBDAILY_recv(int fd,char *data)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
//解读资料
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
default: StockChatBufferLine("每笔资料内参数有错误",FONT_PAL_RED); break;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
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]){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 显示说明
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'M':sTeacherSystemBtn = 1;break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 询问是否要对方当你的导师
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'C':
|
|
|
|
|
sTeacherSystemBtn = 2;
|
|
|
|
|
TeacherSystemWndfunc(0,data);
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 超过一人,询问要找谁当导师
|
2020-06-23 15:27:59 +08:00
|
|
|
|
case 'A':
|
|
|
|
|
sTeacherSystemBtn = 3;
|
|
|
|
|
TeacherSystemWndfunc(1,data);
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// 显示导师资料
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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
|
2020-06-23 15:53:23 +08:00
|
|
|
|
// client 移动荧幕
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.bCanUseMouse = FALSE; // 表演完毕,可以正常使用滑鼠移动
|
2020-06-23 15:27:59 +08:00
|
|
|
|
pc.iSceneryNumber = -1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.bCanUseMouse = TRUE; // 表演中
|
2020-06-23 15:27:59 +08:00
|
|
|
|
pc.iSceneryNumber = 26558;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case E_DATA_TYPE_MOVE: // 移动
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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));
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.bCanUseMouse = FALSE; // 设为 FALSE,不然人物不能移动
|
2020-06-23 15:27:59 +08:00
|
|
|
|
mouse.level = DISP_PRIO_TILE;
|
|
|
|
|
closeCharActionAnimeChange();
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case E_DATA_TYPE_DIR: // 方向
|
2020-06-23 15:27:59 +08:00
|
|
|
|
setPcDir(iData);
|
|
|
|
|
szMessage[0] = cnvServDir(iData, 1 );
|
|
|
|
|
szMessage[1] = '\0';
|
|
|
|
|
walkSendForServer(nowGx, nowGy, szMessage);
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case E_DATA_TYPE_SCENERY: // 布景
|
2020-06-23 15:27:59 +08:00
|
|
|
|
pc.iSceneryNumber = iData;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case E_DATA_TYPE_BGM: // 背景音乐
|
2020-06-23 15:27:59 +08:00
|
|
|
|
play_bgm(iData);
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case E_THEATER_SEND_DATA_DISPLAY_SCORE: // 显示分数
|
2020-06-23 15:27:59 +08:00
|
|
|
|
pc.iTheaterMode |= 0x00000004;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
pc.iTheaterMode |= iData << 16; // iData 是分数值
|
2020-06-23 15:27:59 +08:00
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case E_DATA_TYPE_NPC: // 产生或是消失或更改临时NPC
|
|
|
|
|
// 当 iType 为 E_DATA_TYPE_NPC 时取出来的 iData 是 NPC 编号
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if (iData >= 0 && iData < 5)
|
|
|
|
|
{
|
|
|
|
|
int iSprNum, iGX, iGY, iAction, iDir;
|
|
|
|
|
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(pData, '|', 3, sizeof(szMessage) - 1, szMessage); // 取出指令
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if (atoi(szMessage) == 1)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(pData, '|', 4, sizeof(szMessage) - 1, szMessage); // 取出图号
|
2020-06-23 15:27:59 +08:00
|
|
|
|
iSprNum = atoi(szMessage);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(pData, '|', 5, sizeof(szMessage) - 1, szMessage); // 取出座标
|
2020-06-23 15:27:59 +08:00
|
|
|
|
iGX = atoi(szMessage);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(pData, '|', 6, sizeof(szMessage) - 1, szMessage); // 取出座标
|
2020-06-23 15:27:59 +08:00
|
|
|
|
iGY = atoi(szMessage);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(pData, '|', 7, sizeof(szMessage) - 1, szMessage); // 取出动作
|
2020-06-23 15:27:59 +08:00
|
|
|
|
iAction = atoi(szMessage);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
getStringToken(pData, '|', 8, sizeof(szMessage) - 1, szMessage); // 取出方向
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 );
|
2020-06-23 15:53:23 +08:00
|
|
|
|
actionNum = atoi( token ); //图号
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case 0: //关闭视窗
|
2020-06-23 15:27:59 +08:00
|
|
|
|
wnCloseFlag = 1;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case 1: //开启动一动模式
|
2020-06-23 15:27:59 +08:00
|
|
|
|
pc.iDanceMode = 1;
|
|
|
|
|
break;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
case 2: //关闭动一动模式
|
2020-06-23 15:27:59 +08:00
|
|
|
|
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)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
extern int 公告数量;
|
|
|
|
|
extern char 公告内容[512];
|
|
|
|
|
extern int 公告颜色;
|
|
|
|
|
extern int 公告时间;
|
|
|
|
|
公告时间=0;
|
|
|
|
|
sprintf(公告内容, "%s", data);
|
|
|
|
|
公告颜色 = colors;
|
|
|
|
|
公告数量 = nums;
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _PET_SKINS
|
|
|
|
|
|
|
|
|
|
void lssproto_PetSkins_recv(char *data)
|
|
|
|
|
{
|
2020-06-23 15:53:23 +08:00
|
|
|
|
char *str = "宠物栏位置|当前使用皮肤图号|总皮肤数|皮肤图号|说明|皮肤图号|说明|...";
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|