StoneAge/gmsv/npc/npc_stoneserviceman.c

1043 lines
32 KiB
C
Raw Normal View History

2018-08-07 15:51:35 +08:00
//Terry 2001/09/27
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "npc_stoneserviceman.h"
#include "readmap.h"
#include "battle.h"
#include "log.h"
#include "enemy.h"
#include "configfile.h"
#ifdef _SERVICE
#define LOOP_TIME 100 //0.1<EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>loop function <20><>ʱ<EFBFBD><CAB1>)
#define MAX_AP_MSG 128 // <20><><EFBFBD><EFBFBD>AP<41><50><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// socket struct
struct socketaddr_in
{
u_short sin_family;
u_short sin_port;
u_long sin_addr;
char sin_zero[8];
};
// <20><><EFBFBD><EFBFBD>AP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѶϢ
typedef struct _MSG
{
int nAid; // nAid => <20><>ˮ<EFBFBD><CBAE>*10 + ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>(_AP_CLIENT_MESSAGE)
int nIndex; // NPC<50><43>indexֵ
int nLen; // ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>
LPList Data; // ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int bIsUse; // <20><><EFBFBD><EFBFBD>ѶϢ<D1B6>Ƿ<EFBFBD><C7B7><EFBFBD>ʹ<EFBFBD>ù<EFBFBD>
}Msg,*pMsg;
Msg g_APMsg[MAX_AP_MSG];
// <20><><EFBFBD><EFBFBD>id
enum _AP_CLIENT_MESSAGE
{
Cli_CHECKPLAYER, //Ҫ<><D2AA>AP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7>ȷ<EFBFBD><C8B7> 0
AP_CHECKPLAYER, //AP<41><50>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>Ʒ
Cli_YES, //<2F><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
Cli_CANCEL, //֪ͨAP<41><50>lock<63><6B>λ<EFBFBD><CEBB>Ϊ0
Cli_GET, //֪ͨAP<41><50><EFBFBD><EFBFBD>Ʒ
AP_GET, //AP<41><50>Ӧ<EFBFBD><D3A6>Ʒ 5
Cli_CONNECT, //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AP
AP_CONNECT, //AP<41><50>Ӧ
AP_ERROR //AP<41>д<EFBFBD><D0B4><EFBFBD>
};
// NPC<50>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enum
{
NPC_WORK_FLAG1 = CHAR_NPCWORKINT2, //flag1
NPC_WORK_FLAG2 = CHAR_NPCWORKINT3, //flag2
NPC_WORK_FLAG3 = CHAR_NPCWORKINT4, //flag3
NPC_WORK_TIMEOUT = CHAR_NPCWORKINT5, //time out ʱ<><CAB1>
NPC_WORK_STATE = CHAR_NPCWORKINT6, //Ŀǰִ<C7B0><D6B4>״̬
NPC_WORK_START = CHAR_NPCWORKINT7, //<2F><>ʼ<EFBFBD><CABC>ʱflag
NPC_WORK_LEAVE_COUNT = CHAR_NPCWORKINT8, //<2F><><EFBFBD><EFBFBD>talkʱ<6B><CAB1><EFBFBD><EFBFBD>ʱ
NPC_WORK_TOINDEX = CHAR_NPCWORKINT9, //<2F><><EFBFBD>ҵ<EFBFBD>indexֵ
NPC_WORK_SERIALNUM = CHAR_NPCWORKINT10, //<2F><>ˮ<EFBFBD><CBAE>
NPC_WORK_ISUSE = CHAR_NPCWORKINT11, //ĿǰNPC<50>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
};
// ִ<>е<EFBFBD>״̬
enum
{
SERVICE_STATE_1, // check <20><>û<EFBFBD>к<EFBFBD>AP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SERVICE_STATE_2, // <20><>APȡ<50><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ
SERVICE_STATE_3, // ȡ<><C8A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ҵĶ<D2B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SERVICE_STATE_4 // end state
};
extern int errno;
int g_nServiceSocket;
int g_EnableService = 0;
char g_ApID[32];
struct socketaddr_in server_sin;
struct sockaddr temp;
unsigned short g_Port;
static void NPC_StoneServiceMan_selectWindow(int meindex,int toindex,int num,int select);
extern int GetSerialNum(void);
static int flag = 1;
/*********************************
* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
*********************************/
BOOL NPC_StoneServiceManInit(int meindex )
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
if(NPC_Util_GetArgStr(meindex,npcarg,sizeof(npcarg)) == NULL){
print("StoneServiceMan:GetArgStrErr");
return FALSE;
}
CHAR_setInt(meindex,CHAR_LOOPINTERVAL,LOOP_TIME);
CHAR_setInt(meindex,CHAR_WHICHTYPE,CHAR_TYPESTONESERVICEMAN);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG1,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG2,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG3,1);
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_STATE,SERVICE_STATE_2);
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
CHAR_setWorkInt(meindex,NPC_WORK_TOINDEX,-1);
CHAR_setWorkInt(meindex,NPC_WORK_ISUSE,0);
CHAR_setWorkInt(meindex,NPC_WORK_LEAVE_COUNT,0);
CHAR_setWorkInt(meindex,NPC_WORK_SERIALNUM,-1);
g_EnableService = getEnableService();
//<2F><><EFBFBD>ߵ<EFBFBD>AP<41><50>initʱֻ<CAB1><D6BB>һ<EFBFBD><D2BB>
if(flag && g_EnableService){
strcpy(g_ApID,getApID());
g_Port = getApPort();
bzero(g_APMsg,sizeof(g_APMsg));
ConnectToAP();//<2F><><EFBFBD>ߵ<EFBFBD>AP
flag = 0;
}
return TRUE;
}
void NPC_StoneServiceManTalked(int meindex,int talkerindex,char *szMes,int color)
{
if(CHAR_getInt(talkerindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return;
if(NPC_Util_isFaceToFace(talkerindex,meindex,1) == FALSE) return;
NPC_StoneServiceMan_selectWindow(meindex,talkerindex,0,-1);
}
static void NPC_StoneServiceMan_selectWindow(int meindex,int toindex,int num,int select)
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[1024],buf[128],*pUserid;
int buttontype = 0, windowtype = 0, windowno = 0,nAid,nLen;
int fd = getfdFromCharaIndex(toindex);
char Data[3][32],talk[128];
int i,j,k,Ret;
LPList DataList = NULL,Kill = NULL;
if(fd == -1)
{
print("getfd err\n");
return;
}
if(NPC_Util_GetArgStr(meindex,npcarg,sizeof(npcarg)) == NULL)
{
print("GetArgStrErr");
return ;
}
token[0] = '\0';
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ʯ<EFBFBD><CAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>
if(!g_EnableService)
{
sprintf(token,"\n <20><EFBFBD><EBB5BD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ô˷<C3B4><CBB7><EFBFBD><EFBFBD><EFBFBD>лл<D0BB><D0BB>");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_WAIT;
lssproto_WN_send(fd,windowtype,buttontype,windowno,
CHAR_getWorkInt(meindex,CHAR_WORKOBJINDEX),
token);
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>NPC<50><43><EFBFBD><EFBFBD>
if(CHAR_getWorkInt(meindex,NPC_WORK_ISUSE) == 0 &&
CHAR_getWorkInt(meindex,NPC_WORK_TOINDEX) == -1)
{
//<2F><>ס<EFBFBD><D7A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>NPC<50><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˭
CHAR_setWorkInt(meindex,NPC_WORK_TOINDEX,toindex);
//<2F>趨ΪNPC<50><43><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>
CHAR_setWorkInt(meindex,NPC_WORK_ISUSE,1);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǵڶ<C7B5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NPC<50><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if(CHAR_getWorkInt(meindex,NPC_WORK_ISUSE) == 1 &&
CHAR_getWorkInt(meindex,NPC_WORK_TOINDEX) != toindex)
{
sprintf(token,"\n <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ե<EFBFBD>...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_WAIT;
lssproto_WN_send(fd,windowtype,buttontype,windowno,
CHAR_getWorkInt(meindex,CHAR_WORKOBJINDEX),
token);
return;
}
if(flag)
{
ConnectToAP();
flag = 0;
}
switch(num)
{
case 0:
case 1:
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>id
pUserid = CHAR_getChar(toindex,CHAR_CDKEY);
if(CHAR_getWorkInt(meindex,NPC_WORK_FLAG2) == 1)
{
if(pUserid == NULL || SendToAP(Cli_CHECKPLAYER,meindex,1,pUserid,NULL) == 0)
{
if(NPC_Util_GetStrFromStrWithDelim(npcarg,"SysBusyMsg",buf,sizeof(buf)) == NULL) return;
sprintf(token,"\n %s",buf);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
CHAR_setWorkInt(meindex,NPC_WORK_FLAG2,0);
CHAR_setWorkInt(meindex,NPC_WORK_START,1);
}
if(CHAR_getWorkInt(meindex,NPC_WORK_STATE) == SERVICE_STATE_2)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>time out
if(CHAR_getWorkInt(meindex,NPC_WORK_TIMEOUT) >= 50)
{
close(g_nServiceSocket);
flag = 1;
sprintf(token,"\n <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳȡ<CDB3><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_CONTINUE;
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG2,1);
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
break;
}
if((Ret = RecvFromAP(&nAid,meindex,&nLen,&DataList)) == -1)
{
sprintf(token,"\n <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_CONTINUE;
break;
}
else
{
for(i=0;i<nLen;i++)
{
strcpy(Data[i],DataList->Data);
Kill = DataList;
DataList = DataList->Next;
if(Kill != NULL) free(Kill);
}
// ʹ<>ù<EFBFBD><C3B9><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>
bzero(&g_APMsg[Ret],sizeof(Msg));
}
if(nAid == AP_CHECKPLAYER)
{
switch(atoi(Data[0]))
{
case 0: //û<><C3BB>
if(NPC_Util_GetStrFromStrWithDelim(npcarg,"ErrMsg",buf,sizeof(buf)) == NULL) return;
sprintf(token,"\n %s",buf);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
case 1: //<2F><><EFBFBD><EFBFBD>
if(NPC_Util_GetStrFromStrWithDelim(npcarg,"MainMsg",buf,sizeof(buf)) == NULL) return;
sprintf(token,"5\n %s"
"\n <20><>Ҫ<EFBFBD><D2AA>%s"
"\n <20>Ľ<EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>\n"
"\n"
"\n <20><> ȷ <20><> <20><>"
"\n"
"\n <20><> ȡ <20><> <20><>",
buf,Data[1]);
buttontype = WINDOW_BUTTONTYPE_NONE;
windowtype = WINDOW_MESSAGETYPE_SELECT;
windowno = CHAR_WINDOWTYPE_SERVICE_START;
break;
//<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>
case 2:
sprintf(token,"\n Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ.");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
//<2F><><EFBFBD>ҵĽ<D2B5>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case 3:
sprintf(token,"\n <20><><EFBFBD>Ľ<EFBFBD>Ʒ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
break;
}
}
else
{
sprintf(token,"\n ϵͳѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>!!(%d)",nAid);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
}
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG2,1);
}
else
{
sprintf(token,"\n <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_CONTINUE;
}
break;
case 2:
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>id
pUserid = CHAR_getChar(toindex,CHAR_CDKEY);
if(CHAR_getWorkInt(meindex,NPC_WORK_FLAG3) == 1){
if(pUserid == NULL || SendToAP(Cli_GET,meindex,1,pUserid,NULL) == 0){
if(NPC_Util_GetStrFromStrWithDelim(npcarg,"SysBusyMsg",buf,sizeof(buf)) == NULL) return;
sprintf(token,"\n %s",buf);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
CHAR_setWorkInt(meindex,NPC_WORK_START,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG3,0);
}
if(CHAR_getWorkInt(meindex,NPC_WORK_STATE) == SERVICE_STATE_3){
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>time out
if(CHAR_getWorkInt(meindex,NPC_WORK_TIMEOUT) >= 50){
close(g_nServiceSocket);
flag = 1;
sprintf(token,"\n <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳȡ<CDB3><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_CONTINUE;
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG3,1);
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
break;
}
if((Ret = RecvFromAP(&nAid,meindex,&nLen,&DataList)) == -1){
sprintf(token,"\n <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_CONTINUE;
break;
}
else
{
for(i=0;i<nLen;i++)
{
strcpy(Data[i],DataList->Data);
Kill = DataList;
DataList = DataList->Next;
if(Kill != NULL) free(Kill);
}
// ʹ<>ù<EFBFBD><C3B9><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>
bzero(&g_APMsg[Ret],sizeof(Msg));
}
if(nAid == AP_GET)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD>Ǯ
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>пյ<D0BF><D5B5><EFBFBD>λ
if(atoi(Data[2]) == 0){
if(CHAR_getInt(toindex,CHAR_GOLD)+atoi(Data[1]) > CHAR_getMaxHaveGold(toindex) ){
sprintf(token,"\n"
"\n <20><><EFBFBD><EFBFBD><EFBFBD>ϵĿռ<D5BC><E4B2BB><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE>\n");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}else{
CHAR_AddGold( toindex, atoi(Data[1]) );
CHAR_send_P_StatusString(toindex,CHAR_P_STRING_GOLD);
LogService(CHAR_getChar(toindex,CHAR_NAME),
CHAR_getChar(toindex,CHAR_CDKEY),
atoi(Data[1]),
"Ǯ",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y)
);
sprintf(talk,"%sʯ<73><CAAF><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!\n",Data[1]);
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD>Ʒ
else if(atoi(Data[2]) == 1){
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>пյ<D0BF><D5B5><EFBFBD>λ
int num = 0,itemindex = 0;
for(i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++)
if(CHAR_getItemIndex(toindex,i) != -1) num++;
if(atoi(Data[1])+num > CHAR_MAXITEMNUM){
sprintf(token,"\n"
"\n <20><><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<D5BC><E4B2BB><EFBFBD><EFBFBD>\n");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
//<2F>пյ<D0BF><D5B5><EFBFBD>λ
for(j=0;j<atoi(Data[1]);j++){
for(i=CHAR_STARTITEMARRAY;i<CHAR_MAXITEMHAVE;i++){
if(CHAR_getItemIndex(toindex,i) == -1){
itemindex = ITEM_makeItemAndRegist(atoi(Data[0]));
CHAR_setItemIndex(toindex,i,itemindex);
ITEM_setWorkInt(itemindex,ITEM_WORKOBJINDEX,-1);
ITEM_setWorkInt(itemindex,ITEM_WORKCHARAINDEX,toindex);
CHAR_sendItemDataOne(toindex,i);
LogService(CHAR_getChar(toindex,CHAR_NAME),
CHAR_getChar(toindex,CHAR_CDKEY),
atoi(Data[0]),
"<EFBFBD><EFBFBD>Ʒ",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y)
);
break;
}
}
}
sprintf(talk,"%s %s<><73><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!\n",ITEM_getAppropriateName(itemindex),Data[1]);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD>
else if(atoi(Data[2]) == 2)
{
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>пյ<D0BF><D5B5><EFBFBD>λ
int num = 0,ret = 0;
for(i=0;i<CHAR_MAXPETHAVE;i++)
if(CHAR_getCharPet(toindex,i) != -1) num++;
if(atoi(Data[1])+num > CHAR_MAXPETHAVE)
{
sprintf(token,"\n"
"\n <20><><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<D5BC><E4B2BB><EFBFBD><EFBFBD>\n");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
//<2F>пյ<D0BF><D5B5><EFBFBD>λ
for(j=0;j<atoi(Data[1]);j++)
{
for(i=0;i<CHAR_MAXPETHAVE;i++)
{
if(CHAR_getCharPet(toindex,i) == -1)
{
int enemynum,count;
char msgbuf[64];
enemynum = ENEMY_getEnemyNum();
for(k=0;k<enemynum;k++)
{
if(ENEMY_getInt(k,ENEMY_ID) == atoi(Data[0])) break;
}
if(k == enemynum) break;
ret = ENEMY_createPetFromEnemyIndex( toindex,k);
CHAR_setCharPet(toindex,i,ret);
snprintf(msgbuf,sizeof(msgbuf),"K%d",i);
CHAR_sendStatusString(toindex,msgbuf);
snprintf(msgbuf,sizeof(msgbuf),"W%d",i);
CHAR_sendStatusString(toindex,msgbuf);
for(count=0;count<CHAR_MAXPETHAVE;count++)
{
if(CHAR_getCharPet(toindex,count) == ret)
{
CHAR_send_K_StatusString(toindex,count,CHAR_K_STRING_HP|CHAR_K_STRING_AI);
}
}
//CHAR_setInt(petindex,CHAR_VARIABLEAI,CHAR_MAXVARIABLEAI);
LogService(CHAR_getChar(toindex,CHAR_NAME),
CHAR_getChar(toindex,CHAR_CDKEY),
atoi(Data[0]),
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y)
);
break;
}
}
}
sprintf(talk,"%s %sֻ<73>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!\n",CHAR_getChar(ret,CHAR_NAME),Data[1]);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ浵
CHAR_charSaveFromConnect(CHAR_getWorkInt(toindex,CHAR_WORKFD),0);
if(pUserid == NULL || SendToAP(Cli_YES,meindex,1,pUserid,NULL) == 0)
{
if(NPC_Util_GetStrFromStrWithDelim(npcarg,"SysBusyMsg",buf,sizeof(buf)) == NULL) return;
sprintf(token,"\n %s",buf);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
LogService(CHAR_getChar(toindex,CHAR_NAME),
CHAR_getChar(toindex,CHAR_CDKEY),
-1,
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ﵫCli_YESû<EFBFBD>͵<EFBFBD>AP",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y)
);
break;
}
if(NPC_Util_GetStrFromStrWithDelim(npcarg , "ExitMsg" , buf , sizeof(buf)) == NULL) return;
sprintf(token,"%s %s",talk,buf);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG3,1);
CHAR_setWorkInt(meindex,NPC_WORK_STATE,SERVICE_STATE_4);
}
else
{
sprintf(token,"\n ϵͳѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>!!(%d)",nAid);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
}
else
{
sprintf(token,"\n <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ...");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_CONTINUE;
}
break;
case 3:
pUserid = CHAR_getChar(toindex,CHAR_CDKEY);
if(NPC_Util_GetStrFromStrWithDelim(npcarg,"CancelMsg",buf,sizeof(buf)) == NULL) return;
sprintf(token,"\n %s",buf);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
lssproto_WN_send(fd,windowtype,buttontype,windowno,
CHAR_getWorkInt(meindex,CHAR_WORKOBJINDEX),
token);
}
void NPC_StoneServiceManLoop(int meindex)
{
int nLeaveCount,nTimeout;
fd_set readfds;
struct timeval tm;
LPList kill = NULL;
//static unsigned int dwLifeTime = 0;
if(g_EnableService)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD>NPC<50><43><EFBFBD><EFBFBD><EFBFBD>˾Ϳ<CBBE>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
if(CHAR_getWorkInt(meindex,NPC_WORK_ISUSE) == 1)
{
nLeaveCount = CHAR_getWorkInt(meindex,NPC_WORK_LEAVE_COUNT);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD>ʱ<EFBFBD><CAB1>û<EFBFBD><C3BB><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD><>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>а<EFBFBD><D0B0><EFBFBD>ok<6F><6B><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>)
// <20><>ʱҪ<CAB1><D2AA>NPC<50>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>talk
if(nLeaveCount > getLoopTime())
{
int talkerindex,i;
char *pUserid;
talkerindex = CHAR_getWorkInt(meindex,NPC_WORK_TOINDEX);
pUserid = CHAR_getChar(talkerindex,CHAR_CDKEY);
if(pUserid != NULL) SendToAP(Cli_CANCEL,meindex,1,pUserid,NULL);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG1,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG2,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG3,1);
CHAR_setWorkInt(meindex,NPC_WORK_STATE,SERVICE_STATE_2);
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_TOINDEX,-1);
CHAR_setWorkInt(meindex,NPC_WORK_ISUSE,0);
CHAR_setWorkInt(meindex,NPC_WORK_LEAVE_COUNT,0);
CHAR_setWorkInt(meindex,NPC_WORK_SERIALNUM,-1);
//<2F><>֮ǰ<D6AE>յ<EFBFBD><D5B5>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>NPC<50><43>ѶϢbuf<75><66><EFBFBD><EFBFBD>
for(i=0;i<MAX_AP_MSG;i++)
{
// <20><><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>û<EFBFBD>б<EFBFBD>ʹ<EFBFBD><CAB9>
if(g_APMsg[i].bIsUse == 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD>NPC<50><43>ѶϢ
if(g_APMsg[i].nIndex == meindex)
{
// ʹ<>ù<EFBFBD><C3B9><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>
while(g_APMsg[i].Data != NULL)
{
kill = g_APMsg[i].Data;
g_APMsg[i].Data = g_APMsg[i].Data->Next;
if(kill != NULL) free(kill);
}
bzero(&g_APMsg[i],sizeof(Msg));
}
}
}
print("Player leave NPC\n");
return;
}
// δ<><CEB4><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CHAR_setWorkInt(meindex,NPC_WORK_LEAVE_COUNT,++nLeaveCount);
}
/*if(dwLifeTime > 3000)
{
SendToAP(Cli_CONNECT,meindex,0,NULL,NULL);
dwLifeTime = 0;
print("\nI'm life!!!!!");
}
else dwLifeTime++;*/
// NPC_WORK_STARTΪ1ʱ<31><CAB1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊtime out
if(CHAR_getWorkInt(meindex,NPC_WORK_START) == 1)
{
tm.tv_sec = 0;
tm.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(g_nServiceSocket,&readfds);
// <20><><EFBFBD><EFBFBD>AP<41><50>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>
if(!select(g_nServiceSocket+1,&readfds,NULL,NULL,&tm))
{
nTimeout = CHAR_getWorkInt(meindex,NPC_WORK_TIMEOUT);
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,++nTimeout);
return;
}
print("\nAP send message.");
// <20><><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѶϢ
switch(GetMsg(meindex))
{
//<2F><><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD>NPC
case 0:
print("Msg not send to this npc!!\n");
nTimeout = CHAR_getWorkInt(meindex,NPC_WORK_TIMEOUT);
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,++nTimeout);
return;
case -1: break; //<2F><><EFBFBD><EFBFBD>connect to ap
case -2: print("Msg buf is full!!\n"); break; // ѶϢbuffer<65>ù<EFBFBD><C3B9><EFBFBD>
case -3: print("Msg data is wrong!!\n"); break; // ѶϢ<D1B6><CFA2><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
case -4: print("calloc fail!!\n"); break; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>ʧ<EFBFBD><CAA7>
case -5: print("\nAP send get I'm life"); break; // AP<41>յ<EFBFBD>Cli_CONNECT<43>Ļ<EFBFBD>Ӧ
}
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
}
}
}
void NPC_StoneServiceManWindowTalked(int meindex,int talkerindex,int seqno,int select,char *data)
{
int datanum = -1,i;
char *pUserid;
LPList Kill = NULL;
makeStringFromEscaped(data);
datanum = atoi( data);
switch(seqno)
{
case CHAR_WINDOWTYPE_SERVICE_START:
if(datanum == 1)
{
CHAR_setWorkInt(meindex,NPC_WORK_STATE,SERVICE_STATE_3);
NPC_StoneServiceMan_selectWindow(meindex,talkerindex,2,-1);
}
else
if(datanum == 3) NPC_StoneServiceMan_selectWindow(meindex,talkerindex,3,-1);
break;
case CHAR_WINDOWTYPE_SERVICE_EXIT:
pUserid = CHAR_getChar(talkerindex,CHAR_CDKEY);
if(pUserid != NULL) SendToAP(Cli_CANCEL,meindex,1,pUserid,NULL);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG1,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG2,1);
CHAR_setWorkInt(meindex,NPC_WORK_FLAG3,1);
CHAR_setWorkInt(meindex,NPC_WORK_STATE,SERVICE_STATE_2);
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
CHAR_setWorkInt(meindex,NPC_WORK_TIMEOUT,0);
CHAR_setWorkInt(meindex,NPC_WORK_TOINDEX,-1);
CHAR_setWorkInt(meindex,NPC_WORK_ISUSE,0);
CHAR_setWorkInt(meindex,NPC_WORK_LEAVE_COUNT,0);
CHAR_setWorkInt(meindex,NPC_WORK_SERIALNUM,-1);
//<2F><>֮ǰ<D6AE>յ<EFBFBD><D5B5>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>NPC<50><43>ѶϢbuf<75><66><EFBFBD><EFBFBD>
for(i=0;i<MAX_AP_MSG;i++)
{
// <20><><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>û<EFBFBD>б<EFBFBD>ʹ<EFBFBD><CAB9>
if(g_APMsg[i].bIsUse == 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD>NPC<50><43>ѶϢ
if(g_APMsg[i].nIndex == meindex)
{
// ʹ<>ù<EFBFBD><C3B9><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>
while(g_APMsg[i].Data != NULL)
{
Kill = g_APMsg[i].Data;
if(g_APMsg[i].Data->Next != NULL)
{
g_APMsg[i].Data = g_APMsg[i].Data->Next;
if(Kill != NULL) free(Kill);
}
else
{
if(Kill != NULL) free(Kill);
break;
}
}
bzero(&g_APMsg[i],sizeof(Msg));
}
}
}
break;
case CHAR_WINDOWTYPE_SERVICE_CONTINUE:
if(CHAR_getWorkInt(meindex,NPC_WORK_STATE) == SERVICE_STATE_1)
{
NPC_StoneServiceMan_selectWindow(meindex,talkerindex,0,-1);
}
if(CHAR_getWorkInt(meindex,NPC_WORK_STATE) == SERVICE_STATE_2)
{
NPC_StoneServiceMan_selectWindow(meindex,talkerindex,1,-1);
}
if(CHAR_getWorkInt(meindex,NPC_WORK_STATE) == SERVICE_STATE_3)
{
NPC_StoneServiceMan_selectWindow(meindex,talkerindex,2,-1);
}
break;
case CHAR_WINDOWTYPE_SERVICE_WAIT:
break;
default:
print("ERROR type\n");
break;
}
}
//<2F><>ѶϢ<D1B6><CFA2>AP
//nAid (Cli_????) nIndex (npc Index) nLen (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>) Data1 (user cdkey)
int SendToAP(int nAid,int nIndex,int nLen,void *Data1,void *Data2)
{
char buf[128];
char *pData[2];
int i,j,bufnum;
fd_set fdset;
struct timeval tmv;
int ret;
// Syu ADD <20><><EFBFBD><EFBFBD>ʯ<EFBFBD><CAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>ϵȷ<CFB5><C8B7>
char *sags="";
if( strcmp ( getAccountservername() , "210.64.50.31") == 0 ) sags = "sags31"; //<2F><><EFBFBD><EFBFBD>
if( strcmp ( getAccountservername() , "210.64.50.41") == 0 ) sags = "sags41"; //<2F><><EFBFBD><EFBFBD>
if( strcmp ( getAccountservername() , "210.64.50.51") == 0 ) sags = "sags51"; //̫<><CCAB>
if( strcmp ( getAccountservername() , "210.64.50.61") == 0 ) sags = "sags61"; //<2F><>΢
if( strcmp ( getAccountservername() , "210.64.50.71") == 0 ) sags = "sags71"; //<2F><><EFBFBD><EFBFBD>
if( strcmp ( getAccountservername() , "210.64.50.81") == 0 ) sags = "sags81"; //<2F><><EFBFBD><EFBFBD>
if( strcmp ( getAccountservername() , "210.64.50.91") == 0 ) sags = "sags91"; //<2F><>ӥ
if( strcmp ( getAccountservername() , "210.64.50.101") == 0 ) sags = "sags101"; //<2F><>·<EFBFBD><C2B7>ͥ
if( strcmp ( getAccountservername() , "210.64.50.106") == 0 ) sags = "sags106"; //<2F><><EFBFBD><EFBFBD>԰
if( strcmp ( getAccountservername() , "210.64.50.111") == 0 ) sags = "sags111"; //ʥ<><CAA5>
if( strcmp ( getAccountservername() , "152.104.1.206") == 0 ) sags = "hkgs206"; //<2F><><EFBFBD><EFBFBD>
if( strcmp ( getAccountservername() , "202.134.122.130") == 0 ) sags = "hkgs130"; //<2F>½<EFBFBD>
bzero(buf,sizeof(buf));
pData[0] = (char*)Data1;
pData[1] = (char*)Data2;
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
// ȡ<><C8A1><EFBFBD><EFBFBD>ˮ<EFBFBD><CBAE>
nAid = GetSerialNum()*10+nAid;
// Syu ADD <20><><EFBFBD><EFBFBD>ʯ<EFBFBD><CAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>ϵȷ<CFB5><C8B7>
nLen=2;
sprintf(buf,"&;%d;%d;%d;",nAid,nIndex,nLen);
CHAR_setWorkInt(nIndex,NPC_WORK_SERIALNUM,nAid/10);
if(nLen > 0)
{
// Syu ADD <20><><EFBFBD><EFBFBD>ʯ<EFBFBD><CAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>ϵȷ<CFB5><C8B7>
for(j = 0 ; j < 1 ; j++)
{
for(i = strlen(buf) ; i < 128 ; i++)
{
if(*pData[j] == '\0')
break;
else if(*pData[j] == ';')
{
buf[i] = '\\';
buf[++i] = ';';
}
else if(*pData[j] == '\\')
{
buf[i] = '\\';
buf[++i] = '\\';
}
else if(*pData[j] == '&')
{
buf[i] = '\\';
buf[++i] = '&';
}
else buf[i] = *pData[j];
pData[j]++;
}
// Syu ADD <20><><EFBFBD><EFBFBD>ʯ<EFBFBD><CAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>ϵȷ<CFB5><C8B7>
strcat(buf,";");
strcat(buf,sags);
buf[strlen(buf)] = ';';
}
}
else strcat(buf,"0;0;");
memset(&buf[strlen(buf)],'&',sizeof(buf)-strlen(buf));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ѶϢ
FD_ZERO(&fdset);
FD_SET(g_nServiceSocket,&fdset);
tmv.tv_sec = tmv.tv_usec = 0;
ret = select(g_nServiceSocket + 1,(fd_set*)NULL,&fdset,(fd_set*)NULL,&tmv);
print("ret1=%d ",ret);
if(ret > 0)
{
// <20><>ѶϢ<D1B6><CFA2>AP
print("\n**SendToAP**:[%s]",buf);
if((bufnum = write(g_nServiceSocket,buf,sizeof(buf))) < 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧȥ<CAA7><C8A5><EFBFBD><EFBFBD>
print("reconnect to server!\n");
close(g_nServiceSocket);
flag = 1;
return 0;
}
print("\nSend %d bytes to AP.",bufnum);
}
else
{
print("reconnect to server!\n");
close(g_nServiceSocket);
flag = 1;
return 0;
}
return 1;
}
//<2F>յ<EFBFBD>AP<41><50>Ӧ<EFBFBD><D3A6>ѶϢ
int RecvFromAP(int *nAid,int nIndex,int *nLen,LPList *Data)
{
int i;
for(i=0;i<MAX_AP_MSG;i++)
{
// <20><><EFBFBD><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD>û<EFBFBD>б<EFBFBD>ʹ<EFBFBD><CAB9>
if(g_APMsg[i].bIsUse == 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD>NPC<50><43>ѶϢ
if(g_APMsg[i].nIndex == nIndex)
{
*nAid = g_APMsg[i].nAid;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˮ<EFBFBD>ŶԲ<C5B6><D4B2><EFBFBD>
if((*nAid)/10 == CHAR_getWorkInt(nIndex,NPC_WORK_SERIALNUM))
{
*nAid = *nAid%10;
*nLen = g_APMsg[i].nLen;
*Data = g_APMsg[i].Data;
return i;
}
}
}
}
return -1;
}
int GetMsg(int meindex)
{
char buf[128];
char temp[3][128];
char *p;
int i = 0,j;
pMsg Msg = NULL;
LPList tempList = NULL;
bzero(buf,sizeof(buf));
// <20><><EFBFBD><EFBFBD>AP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѶϢ
if(read(g_nServiceSocket,buf,sizeof(buf)) <= 0)
{
print("can't read message!\n");
//<2F><><EFBFBD><EFBFBD>AP
close(g_nServiceSocket);
flag = 1;
return -1;
}
print("**GetFromAP**:[%s]\n",buf);
// ȡ<><C8A1>һ<EFBFBD><D2BB>û<EFBFBD>ù<EFBFBD><C3B9><EFBFBD>ѶϢ<D1B6><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(j=0;j<MAX_AP_MSG;j++)
{
if(g_APMsg[j].bIsUse == 0)
{
Msg = &g_APMsg[j];
if((Msg->Data = (LPList)calloc( 1,sizeof(List))) != NULL)
{
Msg->Data->Next = NULL;
tempList = Msg->Data;
break;
}
else return -4;
}
}
// <20><><EFBFBD><EFBFBD>MAX_AP_MSG<53><47>ʾѶϢ<D1B6><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(j == MAX_AP_MSG) return -2;
Msg->bIsUse = 1;
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
if(buf[i] == '&')
{
if(buf[++i] == ';')
{
bzero(temp[0] , sizeof(temp[0]));
bzero(temp[1] , sizeof(temp[1]));
bzero(temp[2] , sizeof(temp[2]));
for(j = 0 ; j < 3 ; j++)
{
p = strchr(&buf[i+1] , ';');
strncpy(temp[j] , &buf[i+1] , p - (&buf[i+1]));
i += strlen(temp[j]) + 1;
}
Msg->nAid = atoi(temp[0]);
Msg->nIndex = atoi(temp[1]);
Msg->nLen = atoi(temp[2]);
// <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>AP_CONNECT<43><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѶϢ
if(Msg->nAid%10 == AP_CONNECT)
{
free(Msg->Data);
bzero(Msg,sizeof(Msg));
return -5;
}
j = 0;
bzero(temp[0] , sizeof(temp[0]));
if(Msg->nLen > 0)
{
while(buf[++i] != '\0')
{
switch(buf[i])
{
case '\\':
switch(buf[i + 1])
{
case ';':
case '&':
case '\\':
temp[0][j++] = buf[++i];
break;
default:
temp[0][j++] = buf[i++];
break;
}
break;
case ';':
j = 0;
strcpy(tempList->Data,temp[0]);
tempList->Next = (LPList)calloc( 1,sizeof(List));
tempList = tempList->Next;
bzero(temp[0],sizeof(temp[0]));
break;
case '&':
buf[i--] = '\0';
break;
default:
temp[0][j++] = buf[i];
break;
}
}
tempList->Next = NULL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѶϢ<D1B6>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD>NPC return 1
if(Msg->nIndex == meindex) return 1;
else return 0;
}
}
}
else return -3;
return 1;
}
int ConnectToAP(void)
{
//make socket and connect to ap
if((g_nServiceSocket = socket(PF_INET,SOCK_STREAM,0)) < 0)
//if((g_nServiceSocket = socket(PF_INET,SOCK_DGRAM,0)) < 0)
{
print("can't create socket!\n");
return 0;
}
bzero((char*)&server_sin , sizeof(server_sin));
server_sin.sin_family = AF_INET;
server_sin.sin_port = htons(g_Port);
server_sin.sin_addr = inet_addr(g_ApID);
memcpy(&temp , &server_sin , sizeof(server_sin));
if(connect(g_nServiceSocket,&temp,sizeof(temp)) < 0)
{
// print("connect server error: %s\n" , sys_errlist[errno]);
print("connect server error !!\n");
print("ip:%s,port:%d\n",g_ApID,g_Port);
return 0;
}
else print("connect AP server success!\n");
return 1;
}
//ȡ<><C8A1><EFBFBD><EFBFBD>ˮ<EFBFBD><CBAE>
int GetSerialNum(void)
{
static int i = 0;
if(++i > 65535)
{
i = 0;
}
return i;
}
#endif