?? 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 );#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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -