📄 npc_stoneserviceman.c
字号:
CHAR_setWorkInt(meindex,NPC_WORK_START,0);
break;
}
if((Ret = RecvFromAP(&nAid,meindex,&nLen,&DataList)) == -1){
sprintf(token,"\n 等待回应...");
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);
}
// 使用过的讯息清空
bzero(&g_APMsg[Ret],sizeof(Msg));
}
if(nAid == AP_GET)
{
//如果是给钱
//确定玩家身上有没有空的栏位
if(atoi(Data[2]) == 0){
if(CHAR_getInt(toindex,CHAR_GOLD)+atoi(Data[1]) > CHAR_getMaxHaveGold(toindex) ){
sprintf(token,"\n"
"\n 你身上的空间不足以放入那麽多钱!\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石币已经给你喽!!\n",Data[1]);
}
}
//如果是给物品
else if(atoi(Data[2]) == 1){
//确定玩家身上有没有空的栏位
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 你的道具栏空间不够!\n");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
//有空的栏位
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]),
"物品",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y)
);
break;
}
}
}
sprintf(talk,"%s %s个已经给你喽!!\n",ITEM_getAppropriateName(itemindex),Data[1]);
}
//如果是给宠物
else if(atoi(Data[2]) == 2)
{
//确定玩家身上有没有空的栏位
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 你的宠物栏空间不够!\n");
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
//有空的栏位
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]),
"宠物",
CHAR_getInt(toindex,CHAR_FLOOR),
CHAR_getInt(toindex,CHAR_X),
CHAR_getInt(toindex,CHAR_Y)
);
break;
}
}
}
sprintf(talk,"%s %s只已经给你喽!!\n",CHAR_getChar(ret,CHAR_NAME),Data[1]);
}
//玩家资料存档
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,
"玩家已领取宠物但Cli_YES没送到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 系统讯息错误!!(%d)",nAid);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_SERVICE_EXIT;
break;
}
}
else
{
sprintf(token,"\n 等待回应...");
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)
{
// 如果玩家和NPC讲话了就开始倒数
if(CHAR_getWorkInt(meindex,NPC_WORK_ISUSE) == 1)
{
nLeaveCount = CHAR_getWorkInt(meindex,NPC_WORK_LEAVE_COUNT);
// 如果玩家超过时间没完成动作(也有可能是玩家没有按下ok就离开对话框)
// 这时要把NPC的工作变数清为零才能让下一个玩家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);
//把之前收的有关这个NPC的讯息buf清空
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;
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;
}
// 未超过时间则计数
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时计时五秒,超过五秒为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);
// 检查AP有没有送讯息过来
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.");
// 有送讯息过来接收讯息
switch(GetMsg(meindex))
{
//这个讯息不是给这个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; //重新connect to ap
case -2: print("Msg buf is full!!\n"); break; // 讯息buffer用光了
case -3: print("Msg data is wrong!!\n"); break; // 讯息内容错误
case -4: print("calloc fail!!\n"); break; // 记忆体配置错失败
case -5: print("\nAP send get I'm life"); break; // AP收到Cli_CONNECT的回应
}
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);
//把之前收的有关这个NPC的讯息buf清空
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -