📄 npc_stoneserviceman.c
字号:
for(i=0;i<MAX_AP_MSG;i++)
{
// 检查讯息栏有没有被使用
if(g_APMsg[i].bIsUse == 1)
{
// 检查是不是送给这个NPC的讯息
if(g_APMsg[i].nIndex == meindex)
{
// 使用过的讯息清空
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;
}
}
//送讯息到AP
//nAid (Cli_????) nIndex (npc Index) nLen (後续资料笔数) 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 修正石器服务员星系确认
char *sags="";
if( strcmp ( getAccountservername() , "210.64.50.31") == 0 ) sags = "sags31"; //北斗
if( strcmp ( getAccountservername() , "210.64.50.41") == 0 ) sags = "sags41"; //天神
if( strcmp ( getAccountservername() , "210.64.50.51") == 0 ) sags = "sags51"; //太阳
if( strcmp ( getAccountservername() , "210.64.50.61") == 0 ) sags = "sags61"; //紫微
if( strcmp ( getAccountservername() , "210.64.50.71") == 0 ) sags = "sags71"; //苍龙
if( strcmp ( getAccountservername() , "210.64.50.81") == 0 ) sags = "sags81"; //银河
if( strcmp ( getAccountservername() , "210.64.50.91") == 0 ) sags = "sags91"; //天鹰
if( strcmp ( getAccountservername() , "210.64.50.101") == 0 ) sags = "sags101"; //网路家庭
if( strcmp ( getAccountservername() , "210.64.50.106") == 0 ) sags = "sags106"; //星乐园
if( strcmp ( getAccountservername() , "210.64.50.111") == 0 ) sags = "sags111"; //圣兽
if( strcmp ( getAccountservername() , "152.104.1.206") == 0 ) sags = "hkgs206"; //香港
if( strcmp ( getAccountservername() , "202.134.122.130") == 0 ) sags = "hkgs130"; //新界
bzero(buf,sizeof(buf));
pData[0] = (char*)Data1;
pData[1] = (char*)Data2;
// 以下为编码
// 取得流水号
nAid = GetSerialNum()*10+nAid;
// Syu ADD 修正石器服务员星系确认
nLen=2;
sprintf(buf,"&;%d;%d;%d;",nAid,nIndex,nLen);
CHAR_setWorkInt(nIndex,NPC_WORK_SERIALNUM,nAid/10);
if(nLen > 0)
{
// Syu ADD 修正石器服务员星系确认
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 修正石器服务员星系确认
strcat(buf,";");
strcat(buf,sags);
buf[strlen(buf)] = ';';
}
}
else strcat(buf,"0;0;");
memset(&buf[strlen(buf)],'&',sizeof(buf)-strlen(buf));
// 检查网路可不可以传送讯息
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)
{
// 送讯息到AP
print("\n**SendToAP**:[%s]",buf);
if((bufnum = write(g_nServiceSocket,buf,sizeof(buf))) < 0)
{
//与主机失去连线
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;
}
//收到AP回应的讯息
int RecvFromAP(int *nAid,int nIndex,int *nLen,LPList *Data)
{
int i;
for(i=0;i<MAX_AP_MSG;i++)
{
// 检查讯息栏有没有被使用
if(g_APMsg[i].bIsUse == 1)
{
// 检查是不是送给这个NPC的讯息
if(g_APMsg[i].nIndex == nIndex)
{
*nAid = g_APMsg[i].nAid;
//检查流水号对不对
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));
// 接收AP传来的讯息
if(read(g_nServiceSocket,buf,sizeof(buf)) <= 0)
{
print("can't read message!\n");
//重连AP
close(g_nServiceSocket);
flag = 1;
return -1;
}
print("**GetFromAP**:[%s]\n",buf);
// 取得一个没用过的讯息栏来用
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;
}
}
// 超过MAX_AP_MSG表示讯息栏都满了
if(j == MAX_AP_MSG) return -2;
Msg->bIsUse = 1;
// 以下为解码
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]);
// 如果收到的是AP_CONNECT不理这个讯息
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;
// 如果这个讯息是给这个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;
}
//取得流水号
int GetSerialNum(void)
{
static int i = 0;
if(++i > 65535)
{
i = 0;
}
return i;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -