npc_itemshop.c

来自「石器时代8.0服务端完整源代码。可以直接编译」· C语言 代码 · 共 1,386 行 · 第 1/3 页

C
1,386
字号
#include "version.h"#include <string.h>#include "char.h"#include "object.h"#include "char_base.h"#include "npcutil.h"#include "lssproto_serv.h"#include "pet_skill.h"#include "npc_eventaction.h"#include "readmap.h"#include "log.h"#include "family.h"#define MAXSHOPITEM 33static void NPC_ItemShop_selectWindow( int meindex, int talker, int num,int select);void NPC_ItemShop_BuyMain(int meindex,int talker,int before );#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收	#elsevoid NPC_GetItemList(char *argstr,char * argtoken2);	#ifdef _NEW_MANOR_LAW	void NPC_ItemStrStr(int itemID,double rate,char *name,char *token2,int iCostFame,int iChangeItemCost);	#else	void NPC_ItemStrStr(int itemID,double rate,char *name,char *token2);	#endif#endifBOOL NPC_SetNewItem(int meindex,int talker,char *data);BOOL NPC_SellNewItem(int meindex,int talker,char *data);void NPC_ItemShop_Menu(int meindex,int talker);#ifdef _NPC_SHOPALTER01int NPC_GetLimtItemList(int talker,char *argstr,char *token2,int sell, char* sLimt); //sLimt存放玩家的物品可否卖出,以及价钱,格式为 0|100|10|0|1|50|10|0|1|80|10|0| ,0:可卖,1:不可卖,再来数值为价钱,10为table,0为堆叠#elseint NPC_GetLimtItemList(int talker,char *argstr,char *token2,int sell);#endifvoid NPC_ItemShop_SellMain(int meindex,int talker,int select);int NPC_GetSellItemList(int itemindex,int flg,char *argstr,char *argtoken,int select,int sell);#ifdef _NEW_MANOR_LAWBOOL NPC_AddItemBuy(int meindex, int talker,int itemID,int kosuu,double rate,int iCostFame,int iChangeItemCost);#elseBOOL NPC_AddItemBuy(int meindex, int talker,int itemID,int kosuu,double rate);#endifint NPC_SellItemstrsStr(int itemindex,int flg,double rate,char *argtoken,int select,int sell);void NPC_LimitItemShop(int meindex,int talker,int select);void NPC_ExpressmanCheck(int meindex,int talker);enum{	NPC_SHOP_WORK_NO 		= CHAR_NPCWORKINT1,	NPC_SHOP_WORK_EV 		= CHAR_NPCWORKINT2,	NPC_SHOP_WORK_EXPRESS	= CHAR_NPCWORKINT3,};		  typedef struct {	char	arg[32];	int		type;}NPC_Shop;static NPC_Shop		TypeTable[] = {	{ "FIST",		0 }, //拳	{ "AXE",		1 }, //斧	{ "CLUB",		2 }, //棍棒	{ "SPEAR",		3},  //矛	{ "BOW",		4},  //弓	{ "SHIELD",		5},  //盾	{ "HELM",		6 }, //头盔	{ "ARMOUR",		7 }, //盔甲	{ "BRACELET",	8},  //手镯	{ "ANCLET",		9 }, //踝饰	{ "NECKLACE",	10}, //项  	{ "RING",		11}, //戒指	{ "BELT",		12}, //腰带	{ "EARRING",	13}, //耳环	{ "NOSERING",	14}, //鼻环	{ "AMULET",		15}, //护身符	{ "OTHER",		16}, 	{ "BOOMERANG",	17}, //回力标	{ "BOUNDTHROW",	18}, 	{ "BREAKTHROW",	19}, //投掷物#ifdef _ITEM_TYPETABLE	{ "DISH",	20},	{ "METAL",	21},	{ "JEWEL",	22},	{ "WARES",	23},	{ "WBELT",	24},	{ "WSHIELD", 25},	{ "WSHOES",	26},	{ "WGLOVE",	27},	{ "ANGELTOKEN",	28},	{ "HEROTOKEN",	29},#endif	{ "ACCESSORY",	30}, //配件	{ "OFFENCE",	40}, //攻击	{ "DEFENCE",	50}, //防御};BOOL NPC_ItemShopInit( int meindex ){	char	argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEITEMSHOP );	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {		print("GetArgStrErr");		return FALSE;	}	if(strstr(argstr,"LIMITSHOP") != NULL) {		CHAR_setWorkInt( meindex, NPC_SHOP_WORK_NO, 1);	}else{		CHAR_setWorkInt( meindex, NPC_SHOP_WORK_NO, 0);	}	if(strstr( argstr, "EVENT") != NULL) {		CHAR_setWorkInt( meindex, NPC_SHOP_WORK_EV, 1);	}else{		CHAR_setWorkInt( meindex, NPC_SHOP_WORK_EV, 0);	}	if(strstr( argstr, "EXPRESS") != NULL) {		CHAR_setWorkInt( meindex, NPC_SHOP_WORK_EXPRESS, 1);	}else{		CHAR_setWorkInt( meindex, NPC_SHOP_WORK_EXPRESS, 0);	}		return TRUE;}void NPC_ItemShopTalked( int meindex , int talker , char *szMes ,int color ){	char	argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char	buff[1024];	char	buf2[256];	char 	token[1024];	int 	i = 1;	BOOL	sellonlyflg = FALSE;	char	sellmsg[1024];    if( CHAR_getInt( talker , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {    	return;    }	if(NPC_Util_isFaceToFace( meindex, talker, 2) == FALSE) {//交谈时检查是否面对面		if( NPC_Util_CharDistance( talker, meindex ) > 1) return; //若距离大於1跳出	}	//取得npc买卖设定档内的内容,若为NULL,则错误    if(NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL){    	print("itemshopGetArgStrErr");    	return;    }	//取得NPC只能卖的讯息	if( NPC_Util_GetStrFromStrWithDelim( argstr, "sellonly_msg", token, sizeof( token))	!= NULL){		sellonlyflg = TRUE; //NPC不能买玩家的东西		strcpysafe(sellmsg, sizeof( sellmsg), token);//例如:sellmsg的值可能是->并不是专门收买东西的店。	}    //取得玩家买东西的指令. buff为一串买东西指令的字串,例如:买,购买,感谢您,kau,buy,menu,谢谢,买东西,当玩家打出这些字句时,就可以买东西了	if( NPC_Util_GetStrFromStrWithDelim( argstr, "buy_msg",	buff, sizeof( buff)) != NULL ){	    while(getStringFromIndexWithDelim(buff,",",i,buf2,sizeof(buf2)) != FALSE ){			i++; //若买东西的指令有8个,i就会加到8			if( strstr( szMes, buf2) != NULL) {				if( CHAR_getWorkInt( meindex, NPC_SHOP_WORK_EV) == 0) {					if( CHAR_getWorkInt( meindex, NPC_SHOP_WORK_NO) == 1) {						if( sellonlyflg ) {							NPC_ItemShop_selectWindow( meindex, talker, 3, -1);							return;						}					}else{						NPC_ItemShop_selectWindow( meindex, talker, 1, -1);						return;					}				}else{					if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_NO) == 1) {						if( sellonlyflg) {							NPC_ItemShop_selectWindow( meindex, talker, 3, -1);							return;						}					}else{						NPC_ItemShop_selectWindow( meindex, talker, 1, -1);						return;					}		 			return;		 	 	}			}		}	}	i=1;    //取得玩家卖东西的指令. buff为一串卖东西指令的字串,例如:卖东西,卖,sell,uru  当玩家打出这些字句时,就可以卖东西了	if( NPC_Util_GetStrFromStrWithDelim( argstr, "sell_msg", buff, sizeof( buff)) != NULL ){	    while( getStringFromIndexWithDelim(buff,",", i,buf2,sizeof(buf2)) != FALSE ){			i++;			if(strstr(szMes,buf2) != NULL) {				NPC_ItemShop_selectWindow( meindex, talker, 2, -1);				return;			}		}	}	i = 1;	//其它讯息	if( NPC_Util_GetStrFromStrWithDelim( argstr, "other_msg", buff, sizeof( buff)) != NULL ){	    while(getStringFromIndexWithDelim( buff, ",", i, buf2, sizeof( buf2)) != FALSE ){			i++;			if(strstr(szMes,buf2) != NULL) {				if(NPC_Util_GetStrFromStrWithDelim( argstr, "hint_msg", 				token, sizeof( token)) != NULL)				{					CHAR_talkToCli( talker, meindex, token, CHAR_COLORWHITE);					return;				}			}		}		}	if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_NO) == 1) {		if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_EV) == 1) {			if( sellonlyflg) {				CHAR_talkToCli( talker, meindex, sellmsg, CHAR_COLORWHITE);				return;			}		}else{			if( sellonlyflg) {				NPC_ItemShop_selectWindow( meindex, talker, 3, -1);				return;			}		}	}else{		if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_EV) == 1) {			if( sellonlyflg) {				CHAR_talkToCli( talker, meindex, sellmsg, CHAR_COLORWHITE);				return;			}		}else{						if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_EXPRESS) == 1) {				NPC_ExpressmanCheck( meindex, talker);			}else{				NPC_ItemShop_selectWindow( meindex, talker, 0, -1);			}		}	}				}static void NPC_ItemShop_selectWindow( int meindex, int talker, int num,int select){	switch( num) {	  case 0:		CHAR_send_P_StatusString( talker, CHAR_P_STRING_GOLD);//传送金钱,若100元 送出去的资料格式可能为 P8Nz2|100|				if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_EXPRESS) == 1 ) {			if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_NO) ==0 ) {				NPC_ExpressmanCheck( meindex, talker);//长毛象快递 			}		}else if(CHAR_getWorkInt( meindex, NPC_SHOP_WORK_NO) == 1) {				}else{		  	NPC_ItemShop_Menu( meindex, talker);//选择(买,卖,离开)的小视窗			}	  	break;	  case 1://进入买视窗		CHAR_sendStatusString( talker,"I");//传送玩家身上所有的道具给Client	  	NPC_ItemShop_BuyMain( meindex, talker, select);	  	break;	  case 2://进入卖视窗		CHAR_sendStatusString( talker,"I");	  	NPC_ItemShop_SellMain( meindex, talker, select);	  	break;	  case 3:	  	NPC_LimitItemShop( meindex, talker, select);	  	break;	}}void NPC_ItemShopWindowTalked( int meindex, int talkerindex, 								int seqno, int select, char *data){	if( NPC_Util_CharDistance( talkerindex, meindex ) > 3) {		CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);		return;	}	makeStringFromEscaped( data);	switch( seqno){	  case CHAR_WINDOWTYPE_WINDOWITEMSHOP_STARTMSG:		if(atoi( data) == 1 )	NPC_ItemShop_selectWindow(meindex, talkerindex, 1, -1);		if(atoi( data) == 2)	NPC_ItemShop_selectWindow(meindex, talkerindex, 2, -1);		if(atoi( data) == 3)	return;/*--窒手仄卅中--*/		break;	  case CHAR_WINDOWTYPE_WINDOWITEMSHOP_BUY_MSG:		if(NPC_SetNewItem(meindex , talkerindex, data) == TRUE) {			NPC_ItemShop_selectWindow( meindex, talkerindex, 1, 0);		}else{			NPC_ItemShop_selectWindow( meindex, talkerindex ,0, -1);		}		break;	  case CHAR_WINDOWTYPE_WINDOWITEMSHOP_SELL_MSG:		if(NPC_SellNewItem(meindex , talkerindex, data) == TRUE) {			NPC_ItemShop_selectWindow( meindex, talkerindex, 2, 0);		}else{			NPC_ItemShop_selectWindow( meindex,  talkerindex, 0, -1);		}		break;				  case CHAR_WINDOWTYPE_WINDOWITEMSHOP_LIMIT:		 if(select == WINDOW_BUTTONTYPE_YES) {			NPC_ItemShop_selectWindow( meindex, talkerindex ,2, -1);		}else  if(select == WINDOW_BUTTONTYPE_NO) {			return;		}else if(select == WINDOW_BUTTONTYPE_OK) {				NPC_ItemShop_selectWindow( meindex, talkerindex, 2, -1);		}		break;		  case CHAR_WINDOWTYPE_WINDOWITEMSHOP_EXPRESS:		if(atoi(data) == 2) {			NPC_ItemShop_selectWindow( meindex, talkerindex, 1, -1);		}else if(atoi( data) == 4) {			NPC_ItemShop_selectWindow( meindex, talkerindex, 2, -1);		}	}}void NPC_ItemShop_BuyMain(int meindex,int talker,int before ){      	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char token[NPC_UTIL_GETARGSTR_BUFSIZE];	int fd = getfdFromCharaIndex( talker);    	char token2[NPC_UTIL_GETARGSTR_BUFSIZE];	char buff2[256];    char buff[256];    #ifdef _NPC_SHOPALTER01	char sLimt[1024]; //存放玩家物品可否卖出及价钱	char tokentemp[NPC_UTIL_GETARGSTR_BUFSIZE]; //与token功能相同	float fdata; //转换sell_rate为数值#endif	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {       	print("itemshop_GetArgStr_Err");       	return;    }#ifdef _ADD_STATUS_2	sprintf(token,"FAME|%d",CHAR_getInt(talker,CHAR_FAME)/100);	lssproto_S2_send(fd,token);#endif	if(before != -1) {		sprintf(token,"0|0");		lssproto_WN_send( fd, WINDOW_MESSAGETYPE_ITEMSHOPMAIN, 				WINDOW_BUTTONTYPE_NONE, 				CHAR_WINDOWTYPE_WINDOWITEMSHOP_BUY_MSG,				CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),				token);	}else{		NPC_Util_GetStrFromStrWithDelim( argstr, "main_msg", buff, sizeof( buff));		NPC_Util_GetStrFromStrWithDelim( argstr, "buy_main", buff2, sizeof( buff2));		sprintf(token,"0|1|%d|%s|%s|%s|", CHAR_WINDOWTYPE_WINDOWITEMSHOP_STARTMSG,				CHAR_getChar( meindex, CHAR_NAME), buff, buff2);		NPC_Util_GetStrFromStrWithDelim( argstr, "what_msg", buff, sizeof( buff));		NPC_Util_GetStrFromStrWithDelim( argstr, "level_msg", buff2, sizeof( buff));		snprintf( token2, sizeof( token2), "%s|%s", buff, buff2);		    strncat( token, token2, sizeof( token));					NPC_Util_GetStrFromStrWithDelim( argstr, "realy_msg", buff, sizeof( buff));		NPC_Util_GetStrFromStrWithDelim( argstr, "itemfull_msg", buff2, sizeof( buff2));		sprintf( token2, "|%s|%s", buff, buff2);		strncat(token , token2,sizeof(token));		strcpy(token2, "|");#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收	#else		NPC_GetItemList( argstr, token2);#endif		strncat( token, token2, sizeof( token));	}#ifdef _NPC_SHOPALTER01	sprintf(tokentemp,"%s","");	sprintf(sLimt,"%s","");	NPC_GetLimtItemList( talker, argstr, tokentemp, -1, sLimt);//详细玩家要卖出的道具资料    fdata = atof(NPC_Util_GetStrFromStrWithDelim( argstr, "sell_rate", buff, sizeof( buff)));	fdata *= 100; //原本资料为小数,Client端处理的为整数,所以乘以100	sprintf(token,"%suseritem|%d%s", token, (int)fdata, sLimt);//原本的字串後再加上sell_rate,与sLimt资料#endif	lssproto_WN_send( fd, WINDOW_MESSAGETYPE_ITEMSHOPMAIN, 				WINDOW_BUTTONTYPE_NONE, 				CHAR_WINDOWTYPE_WINDOWITEMSHOP_BUY_MSG,				CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),				token);}#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收	#elsevoid NPC_GetItemList(char *argstr,char *argtoken)#endif{	int i = 1;	int tmp;	char *name ;	char buff2[256];#ifdef _NEW_MANOR_LAW	char buff3[NPC_UTIL_GETARGSTR_LINEMAX];	char buff4[256];	char buff5[NPC_UTIL_GETARGSTR_LINEMAX];	char buff6[256];	int iCostFame = 0;	int iChangeItemCost = 0;#endif	char buff[NPC_UTIL_GETARGSTR_LINEMAX];	char token2[NPC_UTIL_GETARGSTR_BUFSIZE];	double rate = 1.0;	int loopcnt = 0;	if(NPC_Util_GetStrFromStrWithDelim( argstr, "buy_rate", buff2, sizeof( buff2))	 != NULL){		rate = atof( buff2);	}#ifdef _NEW_MANOR_LAW	memset(buff3,0,sizeof(buff3));	memset(buff5,0,sizeof(buff5));	if(NPC_Util_GetStrFromStrWithDelim(argstr,"CostFame",buff3,sizeof(buff3)) == NULL) iCostFame = -1;	if(NPC_Util_GetStrFromStrWithDelim(argstr,"ChangeItemCost",buff5,sizeof(buff5)) == NULL) iChangeItemCost = -1;#endif	if( NPC_Util_GetStrFromStrWithDelim( argstr, "ItemList", buff, sizeof( buff)) != NULL ){	    while( getStringFromIndexWithDelim(buff,",",i,buff2,sizeof(buff2)) !=FALSE ) {#ifdef _NEW_MANOR_LAW				if(iCostFame > -1){					if(getStringFromIndexWithDelim(buff3,",",i,buff4,sizeof(buff4)) != FALSE) iCostFame = atoi(buff4);				}				if(iChangeItemCost > -1){					if(getStringFromIndexWithDelim(buff5,",",i,buff6,sizeof(buff6)) != FALSE) iChangeItemCost = atoi(buff6);				}#endif			i++;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?