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 + -
显示快捷键?