npc_itemshop.c

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

C
1,386
字号
			if(strstr( buff2, "-") == NULL) {			 	name = ITEM_getNameFromNumber( atoi(buff2));				if(name == NULL) continue;				loopcnt++;				if(loopcnt == MAXSHOPITEM) break;#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收#else	#ifdef _NEW_MANOR_LAW				NPC_ItemStrStr( atoi( buff2), rate, name, token2,iCostFame,iChangeItemCost);	#else				NPC_ItemStrStr( atoi( buff2), rate, name, token2);	#endif#endif	    		strncat( argtoken, token2, sizeof(token2));			}else{				int start;				int end;				getStringFromIndexWithDelim( buff2, "-", 1, token2, sizeof(token2));				start = atoi( token2);				getStringFromIndexWithDelim( buff2, "-", 2 ,token2, sizeof(token2));				end = atoi( token2);				if(start > end){					tmp = start;					start = end;					end = tmp;				}				end++;				for(; start < end ; start++ ) {					/*--引内  蟆      --*/				 	name = ITEM_getNameFromNumber( start );					if(name == NULL) continue;					loopcnt++;					if(loopcnt == MAXSHOPITEM) break;#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收#else	#ifdef _NEW_MANOR_LAW					NPC_ItemStrStr( start, rate, name, token2,iCostFame,iChangeItemCost);	#else					NPC_ItemStrStr( start, rate, name, token2);	#endif#endif		    		strncat( argtoken, token2, sizeof(token2));				}			}		}	}}#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收#else	#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#endif{	int gold;	int level;	int graNo;	char info[1024];	char escape[256];	#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收(改九大庄园时要修改)#else	#ifdef _NEW_MANOR_LAW	if(iChangeItemCost > -1) gold = iChangeItemCost;	else 	#endif	gold  = ITEM_getcostFromITEMtabl( itemID);#endif	level = ITEM_getlevelFromITEMtabl( itemID);	graNo = ITEM_getgraNoFromITEMtabl( itemID);	strcpy(escape,ITEM_getItemInfoFromNumber( itemID));	gold=(int)(gold * rate);	makeEscapeString( escape, info, sizeof( info));	makeEscapeString( name, escape, sizeof( escape));#ifdef _NEW_MANOR_LAW	sprintf(token2,"%s|0|%d|%d|%d|%s|%d|",escape,level,gold,graNo,info,iCostFame < 0 ? -1:iCostFame/100);#else	sprintf( token2, "%s|0|%d|%d|%d|%s|", escape, level, gold, graNo, info);#endif}BOOL NPC_SetNewItem(int meindex,int talker,char *data){	char buf[1024];	char buff2[128];#ifdef _NEW_MANOR_LAW	char buff3[1024];	char buff4[128];	char buff5[1024];	char buff6[128];	int iCostFame = 0;	int iChangeItemCost = 0;#endif	int i = 1, j = 1;	int select;	int kosuu = 0;	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	double rate = 1.0;	int gold = 0;			int kosuucnt = 0;	int itemindex;	/*--忒匀化五凶犯□正毛本伊弁玄午蜊醒卞坌荸--*/	getStringFromIndexWithDelim( data, "|", 1, buf, sizeof( buf));	select = atoi(buf);	if(select == 0) return FALSE;	getStringFromIndexWithDelim( data, "|", 2, buf, sizeof( buf));	kosuu = atoi(buf);	if( kosuu <= 0 ) return FALSE;		/*--蜊醒及民尼永弁  癫卞蝈    月井"-*/	for( i = CHAR_STARTITEMARRAY ; i < CHAR_MAXITEMHAVE ; i++ ) {		itemindex = CHAR_getItemIndex( talker , i );		if( !ITEM_CHECKINDEX( itemindex) ) {			kosuucnt++;		}	}	/*--忒匀化  凶蜊醒及  互  端及蜊醒  扔□田础  方曰聂中午云井仄中及匹--*/	/*--扔□田□础及  毛  木月--*/	if( kosuucnt < kosuu) kosuu = kosuucnt;			/*--未夫及桦宁反巨仿□--*/	if(kosuucnt == 0 ) return FALSE;	i = 1;	/*--云饕及白央奶伙  中坭反白央奶伙互钒仃卅井匀凶午五反蔽  --*/	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {   	print("shop_GetArgStr_Err");   	return FALSE;	}	/*---伊□玄毛潸    卅仃木壬1.0)-*/	if(NPC_Util_GetStrFromStrWithDelim( argstr, "buy_rate", buf, sizeof( buf)) != NULL) {		rate= atof( buf);	}#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", buf, sizeof( buf)) != NULL ){		while(getStringFromIndexWithDelim(buf , "," , j, buff2, sizeof(buff2)) != FALSE ){#ifdef _NEW_MANOR_LAW			if(iCostFame > -1){				if(getStringFromIndexWithDelim(buff3,",",j,buff4,sizeof(buff4)) != FALSE) iCostFame = atoi(buff4);			}			if(iChangeItemCost > -1){				if(getStringFromIndexWithDelim(buff5,",",j,buff6,sizeof(buff6)) != FALSE) iChangeItemCost = atoi(buff6);			}#endif			j++;			/*--  "-"互殖引木化中月井升丹井--*/			if(strstr( buff2, "-") == NULL) {				if( ITEM_getcostFromITEMtabl(atoi(buff2)) !=-1) {					if ( i == select) {						/*---失奶  丞及综岳---*/						/*--蜊醒坌综岳--*/#ifdef _NEW_MANOR_LAW						if(NPC_AddItemBuy(meindex, talker,atoi(buff2),kosuu,rate,iCostFame,iChangeItemCost) != TRUE)#else						if(NPC_AddItemBuy(meindex, talker,atoi(buff2),kosuu,rate) != TRUE)#endif						{							return FALSE;						}						return TRUE;					}					i++;						}			}else{				/*--失奶  丞互  15-25  及溥匹霜日木凶桦宁--*/				int start;				int end;				/* "-"匹嗉濠日木凶铵户及醒袄午  及醒袄毛潸  --*/				getStringFromIndexWithDelim( buff2, "-", 1, argstr, sizeof(argstr));				start = atoi( argstr);				getStringFromIndexWithDelim( buff2, "-", 2 ,argstr, sizeof(argstr));				end = atoi( argstr);				end++;				/*--  寞互菅卞卅匀化中凶日}  木赘尹月**/				if(start > end){					gold = start;					start = end;					end = gold;				}				/*--"-"匹嗉濠日木凶坌及失奶  丞毛树  毛  月--*/				for(; start < end ; start++ ) {					if( ITEM_getcostFromITEMtabl( start) != -1) {						if ( i == select) {							/*---失奶  丞及综岳---*/							/*--蜊醒坌综岳--*/#ifdef _NEW_MANOR_LAW							if(NPC_AddItemBuy(meindex, talker, start, kosuu, rate,iCostFame,iChangeItemCost) != TRUE)#else							if(NPC_AddItemBuy(meindex, talker, start, kosuu, rate) != TRUE)#endif							{								return FALSE;							}							return TRUE;						}						i++;					}				}			}		}	}	return FALSE;}/*--------------------------------------------- *失奶  丞及馨笛毛垫丹 *--------------------------------------------*/#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)#endif{	int itemindex;	int i;	int gold;	int ret;	int maxgold;#ifdef _NEW_MANOR_LAW	int iTotalCostFame = -1;#endif#ifdef _ADD_FAMILY_TAX			   // WON ADD 增加庄园税收(改九大庄园时要修改)#else	#ifdef _NEW_MANOR_LAW	if(iChangeItemCost > -1) gold = iChangeItemCost;	else	#endif	gold = ITEM_getcostFromITEMtabl( itemID);	gold = (int)(gold * rate);#endif	maxgold = gold * kosuu;	if(CHAR_getInt( talker, CHAR_GOLD) < maxgold ) return FALSE;#ifdef _NEW_MANOR_LAW	if(iCostFame > 0){		iTotalCostFame= iCostFame * kosuu;		if(CHAR_getInt(talker,CHAR_FAME) < iTotalCostFame) return FALSE;	}#endif	for(i = 0 ; i < kosuu ; i++){		itemindex = ITEM_makeItemAndRegist( itemID);				if(itemindex == -1) return FALSE;		ret = CHAR_addItemSpecificItemIndex( talker, itemindex);		if( ret < 0 || ret >= CHAR_MAXITEMHAVE ) {			print( "npc_itemshop.c: additem error itemindex[%d]\n", itemindex);			ITEM_endExistItemsOne( itemindex);			return FALSE;		}		CHAR_sendItemDataOne( talker, ret);	}	CHAR_DelGold( talker, maxgold);#ifdef _NEW_MANOR_LAW	if(iTotalCostFame > 0){		CHAR_setInt(talker,CHAR_FAME,CHAR_getInt(talker,CHAR_FAME) - iTotalCostFame);		if(CHAR_getInt(talker,CHAR_FMINDEX) != -1 && (strcmp(CHAR_getChar(talker,CHAR_FMNAME),""))){			int fd = getfdFromCharaIndex(talker);			char	buf[256];			sprintf(buf,"%d",CHAR_getInt(talker,CHAR_FAME));			saacproto_ACFixFMData_send(acfd,				CHAR_getChar(talker,CHAR_FMNAME),				CHAR_getInt(talker,CHAR_FMINDEX),				CHAR_getWorkInt(talker,CHAR_WORKFMINDEXI),				FM_FIX_FAME,buf,"",				CHAR_getWorkInt(talker,CHAR_WORKFMCHARINDEX),				CONNECT_getFdid(fd));			LogFMFameShop(CHAR_getChar(talker,CHAR_FMNAME),										CHAR_getChar(talker,CHAR_CDKEY),										CHAR_getChar(talker,CHAR_NAME),										CHAR_getInt(talker,CHAR_FAME),										iTotalCostFame);		}	}#endif	//CHAR_send_P_StatusString( talker, CHAR_P_STRING_GOLD);	return TRUE;}//选择 (买,卖,出去) 的小视窗void NPC_ItemShop_Menu(int meindex,int talker){		char	argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char	token[NPC_UTIL_GETARGSTR_LINEMAX];	char buff[256];	int fd = getfdFromCharaIndex( talker);#ifdef _NPC_SHOPALTER01	char sLimt[1024]; //存放玩家物品可否卖出及价钱	char tokentemp[NPC_UTIL_GETARGSTR_BUFSIZE]; //与token功能相同	float fdata; //转换sell_rate为数值#endif    //argstr取得整个设定档的讯息: 例如->buy_rate:1.0|sell_rate:0.2|buy_msg:买,购买,感谢您,kau,buy............. (中间的分格号是读入时加入的)    if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {		print("shop_GetArgStr_Err");       	return;    }    	//token为视窗上面的title文字  例如: 萨姆吉尔的防具店|欢迎光临    NPC_Util_GetStrFromStrWithDelim( argstr, "main_msg", buff, sizeof( buff));#ifdef _NEW_MANOR_LAW	snprintf(token, sizeof(token),"%s|%s|%d",CHAR_getChar(meindex,CHAR_NAME),buff,CHAR_getInt(talker,CHAR_FAME)/100);#else	snprintf(token, sizeof(token),"%s|%s",CHAR_getChar( meindex, CHAR_NAME), buff);#endif#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_ITEMSHOPMENU, 				WINDOW_BUTTONTYPE_NONE, 				CHAR_WINDOWTYPE_WINDOWITEMSHOP_STARTMSG,				CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),				token);}void NPC_ItemShop_SellMain(int meindex,int talker,int before){	char	argstr[NPC_UTIL_GETARGSTR_BUFSIZE];	char	token[NPC_UTIL_GETARGSTR_BUFSIZE];	int fd = getfdFromCharaIndex( talker);	//取得npc设定资料    if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) {       	print("shop_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,"1|0");		lssproto_WN_send( fd, WINDOW_MESSAGETYPE_ITEMSHOPMAIN							+CHAR_getWorkInt(meindex,NPC_SHOP_WORK_NO), 					WINDOW_BUTTONTYPE_NONE, 					CHAR_WINDOWTYPE_WINDOWITEMSHOP_SELL_MSG,					CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),					token);		}else{		char token2[NPC_UTIL_GETARGSTR_BUFSIZE];		char buff2[256];	   	char buff[256];		NPC_Util_GetStrFromStrWithDelim( argstr, "main_msg", buff, sizeof( buff));		NPC_Util_GetStrFromStrWithDelim( argstr, "sell_main", buff2, sizeof( buff));		sprintf( token, "1|1|%d|%s|%s|%s|", CHAR_WINDOWTYPE_WINDOWITEMSHOP_STARTMSG,				CHAR_getChar( meindex, CHAR_NAME), buff, buff2);		NPC_Util_GetStrFromStrWithDelim( argstr, "stone_msg", buff, sizeof( buff));		if(CHAR_getWorkInt(meindex,NPC_SHOP_WORK_EXPRESS) == 1 ) {			NPC_Util_GetStrFromStrWithDelim( argstr, "exrealy_msg", buff2, sizeof(buff2));		}else{			NPC_Util_GetStrFromStrWithDelim( argstr, "realy_msg", buff2, sizeof( buff2));		}		sprintf( token2,"%s|%s|", buff, buff2);#ifdef _NPC_SHOPALTER01		NPC_GetLimtItemList( talker,argstr, token2, -1, NULL);//详细玩家要卖出的道具资料#else		NPC_GetLimtItemList( talker,argstr, token2, -1);//详细玩家要卖出的道具资料#endif			strncat( token, token2, sizeof( token));		lssproto_WN_send( fd, WINDOW_MESSAGETYPE_ITEMSHOPMAIN+					CHAR_getWorkInt(meindex,NPC_SHOP_WORK_NO), 					WINDOW_BUTTONTYPE_NONE, 					CHAR_WINDOWTYPE_WINDOWITEMSHOP_SELL_MSG,					CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),					token);	}}#ifdef _NPC_SHOPALTER01int NPC_GetLimtItemList(int talker, char *argstr, char* token2,int sell, char* sLimt)//sLimt:玩家可卖物品的字串#elseint NPC_GetLimtItemList(int talker, char *argstr, char* token2,int sell)#endif{	char token[NPC_UTIL_GETARGSTR_LINEMAX];	char buff[NPC_UTIL_GETARGSTR_LINEMAX];	char token3[NPC_UTIL_GETARGSTR_LINEMAX];	int k = 0 , i = 1 , j = 0;	int imax;	int itemtype = 0;	int itemindex;	int okflg = 0;	char buf[256];	int flg=0;	int cost;#ifdef _NPC_SHOPALTER01    char sbuf[256]; //取得sLimt前,用sbuf取得每一项资料,再存入sLimt#endif	if(sell == -1 ){		i = CHAR_STARTITEMARRAY;		imax = CHAR_MAXITEMHAVE;		flg = -1;	}else{		i= sell;		imax= sell + 1;		flg = 1;	}		for( ; i < imax ; i++ ){		okflg=0;		itemindex = CHAR_getItemIndex( talker , i );				if( ITEM_CHECKINDEX( itemindex) ){			if( NPC_Util_GetStrFromStrWithDelim( argstr,"LimitItemType", buff, sizeof( buff)) != NULL ){				k = 1;				while(getStringFromIndexWithDelim(buff , "," , k, token, sizeof(token)) != FALSE ){#ifdef _ITEM_TYPETABLE					int cmpmaxitem = sizeof(TypeTable)/sizeof(TypeTable[0]);

⌨️ 快捷键说明

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