📄 npc_itemshop.c
字号:
#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 );void NPC_GetItemList(char *argstr,char * argtoken2);void NPC_ItemStrStr(int itemID,double rate,char *name,char *token2);BOOL 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);int NPC_GetLimtItemList(int talker,char *argstr,char *token2,int sell);void NPC_ItemShop_SellMain(int meindex,int talker,int select);int NPC_GetSellItemList(int itemindex,int flg,char *argstr,char *argtoken,int select,int sell);BOOL NPC_AddItemBuy(int meindex, int talker,int itemID,int kosuu,double rate);int 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}, //投掷物 { "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]; if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr)) == NULL) { print("itemshop_GetArgStr_Err"); return; } 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, "|"); NPC_GetItemList( argstr, token2); strncat( token, token2, sizeof( token)); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_ITEMSHOPMAIN, WINDOW_BUTTONTYPE_NONE, CHAR_WINDOWTYPE_WINDOWITEMSHOP_BUY_MSG, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);}void NPC_GetItemList(char *argstr,char *argtoken){ int i = 1; int tmp; char *name ="\0"; char buff2[256]; 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); } if( NPC_Util_GetStrFromStrWithDelim( argstr, "ItemList", buff, sizeof( buff)) != NULL ){ while( getStringFromIndexWithDelim(buff,",",i,buff2,sizeof(buff2)) !=FALSE ) { i++; if(strstr( buff2, "-") == NULL) { name = ITEM_getNameFromNumber( atoi(buff2)); if(name == "\0") continue; loopcnt++; if(loopcnt == MAXSHOPITEM) break; NPC_ItemStrStr( atoi( buff2), rate, name, token2); 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 == "\0") continue; loopcnt++; if(loopcnt == MAXSHOPITEM) break; NPC_ItemStrStr( start, rate, name, token2); strncat( argtoken, token2, sizeof(token2)); } } } }}void NPC_ItemStrStr(int itemID,double rate,char *name,char *token2){ int gold; int level; int graNo; char info[1024]; char escape[256]; gold = ITEM_getcostFromITEMtabl( itemID); 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)); sprintf( token2, "%s|0|%d|%d|%d|%s|", escape, level, gold, graNo, info);}BOOL NPC_SetNewItem(int meindex,int talker,char *data){ char buf[1024]; char buff2[128]; 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); } /*--失奶 丞及馨笛毛垫丹午仇欠-*/ if( NPC_Util_GetStrFromStrWithDelim( argstr, "ItemList", buf, sizeof( buf)) != NULL ){ while(getStringFromIndexWithDelim(buf , "," , j, buff2, sizeof(buff2)) != FALSE ){ j++; /*-- "-"互殖引木化中月井升丹井--*/ if(strstr( buff2, "-") == NULL) { if( ITEM_getcostFromITEMtabl(atoi(buff2)) !=-1) { if ( i == select) { /*---失奶 丞及综岳---*/ /*--蜊醒坌综岳--*/ if(NPC_AddItemBuy(meindex, talker,atoi(buff2),kosuu,rate) != TRUE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -