?? char_item.c
字號:
#include "version.h"#include <stdio.h>#include "readmap.h"#include "map_deal.h"#include "object.h"#include "char.h"#include "char_base.h"#include "item.h"#include "lssproto_serv.h"#include "handletime.h"#include "log.h"#include "item_event.h"#include "battle.h"#include "petmail.h"#ifdef _MARKET_TRADE#include "item_trade.h"#endif#ifdef _DROPSTAKENEW#define CASINOTOKENID 20121 // 游樂場彩券代號#define MAXCASINOMAPNUM 150 // 游樂場地圖上限#define MAXACCUMULATION 1000000 // 積分上限typedef struct tagCasinoMapTable{ int casinofl; // 游樂場圖層 int casinox; // 游樂場X座標 int casinoy; // 游樂場Y座標 int casinotype; // 賭注類型 int dropflag; // 是否可下注 flag char casinoinfo[64]; // 賭注類型說明 int accumulation; // 積分 int stakenum; // 彩券數量}CasinoMapTable;CasinoMapTable casinomap[MAXCASINOMAPNUM] = { { 7008, 13, 13, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 14, 13, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 15, 13, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 16, 13, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 17, 13, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 13, 14, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 14, 14, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 15, 14, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 16, 14, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 17, 14, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 13, 15, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 14, 15, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 15, 15, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 16, 15, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 17, 15, DICE_BIG, 1, "骰子-大", 1, 0}, { 7008, 8, 13, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 9, 13, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 10, 13, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 11, 13, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 12, 13, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 8, 14, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 9, 14, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 10, 14, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 11, 14, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 12, 14, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 8, 15, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 9, 15, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 10, 15, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 11, 15, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7008, 12, 15, DICE_SMALL, 1, "骰子-小", 1, 0}, { 7005, 22, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 23, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 24, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 25, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 26, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 27, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 28, 21, PET_RACE1, 1, "競速場-寵物1", 2, 0}, { 7005, 22, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 23, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 24, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 25, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 26, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 27, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 28, 24, PET_RACE2, 1, "競速場-寵物2", 2, 0}, { 7005, 22, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7005, 23, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7005, 24, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7005, 25, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7005, 26, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7005, 27, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7005, 28, 27, PET_RACE3, 1, "競速場-寵物3", 2, 0}, { 7003, 21, 15, ROULETTE1, 1, "輪盤紅1", 1, 0}, { 7003, 17, 15, ROULETTE3, 1, "輪盤紅3", 1, 0}, { 7003, 13, 15, ROULETTE5, 1, "輪盤紅5", 1, 0}, { 7003, 21, 21, ROULETTE6, 1, "輪盤紅6", 1, 0}, { 7003, 17, 21, ROULETTE8, 1, "輪盤紅8", 1, 0}, { 7003, 15, 21, ROULETTE9, 1, "輪盤紅9", 1, 0}, { 7003, 13, 21, ROULETTE10, 1, "輪盤紅10", 1, 0}, { 7003, 13, 18, ROULETTE13, 1, "輪盤紅13", 1, 0}, { 7003, 9, 21, ROULETTE17, 1, "輪盤紅17", 1, 0}, { 7003, 21, 18, ROULETTE18, 1, "輪盤紅18", 1, 0}, { 7003, 19, 15, ROULETTE22, 1, "輪盤綠2", 1, 0}, { 7003, 15, 15, ROULETTE24, 1, "輪盤綠4", 1, 0}, { 7003, 19, 21, ROULETTE27, 1, "輪盤綠7", 1, 0}, { 7003, 11, 15, ROULETTE31, 1, "輪盤綠11", 1, 0}, { 7003, 9, 15, ROULETTE32, 1, "輪盤綠12", 1, 0}, { 7003, 11, 18, ROULETTE34, 1, "輪盤綠14", 1, 0}, { 7003, 9, 18, ROULETTE35, 1, "輪盤綠15", 1, 0}, { 7003, 11, 21, ROULETTE36, 1, "輪盤綠16", 1, 0}, { 7003, 19, 18, ROULETTE39, 1, "輪盤綠19", 1, 0}, { 7003, 17, 18, ROULETTE40, 1, "輪盤綠20", 1, 0}, { 7003, 17, 24, ROULETTE41, 1, "輪盤紅", 1, 0}, { 7003, 16, 24, ROULETTE41, 1, "輪盤紅", 1, 0}, { 7003, 17, 25, ROULETTE41, 1, "輪盤紅", 1, 0}, { 7003, 16, 25, ROULETTE41, 1, "輪盤紅", 1, 0}, { 7003, 14, 24, ROULETTE42, 1, "輪盤綠", 1, 0}, { 7003, 13, 24, ROULETTE42, 1, "輪盤綠", 1, 0}, { 7003, 14, 25, ROULETTE42, 1, "輪盤綠", 1, 0}, { 7003, 13, 25, ROULETTE42, 1, "輪盤綠", 1, 0}, // WON ADD 修正地圖上單雙的錯誤 { 7003, 11, 24, ROULETTE43, 1, "輪盤單", 1, 0}, { 7003, 10, 24, ROULETTE43, 1, "輪盤單", 1, 0}, { 7003, 11, 25, ROULETTE43, 1, "輪盤單", 1, 0}, { 7003, 10, 25, ROULETTE43, 1, "輪盤單", 1, 0}, { 7003, 20, 24, ROULETTE44, 1, "輪盤雙", 1, 0}, { 7003, 19, 24, ROULETTE44, 1, "輪盤雙", 1, 0}, { 7003, 20, 25, ROULETTE44, 1, "輪盤雙", 1, 0}, { 7003, 19, 25, ROULETTE44, 1, "輪盤雙", 1, 0}, { 7003, 20, 15, (ROULETTE1<<16)+ROULETTE22, 1, "雙號紅1綠2", 1, 0}, { 7003, 18, 15, (ROULETTE3<<16)+ROULETTE22, 1, "雙號紅3綠2", 1, 0}, { 7003, 16, 15, (ROULETTE3<<16)+ROULETTE24, 1, "雙號紅3綠4", 1, 0}, { 7003, 14, 15, (ROULETTE5<<16)+ROULETTE24, 1, "雙號紅5綠4", 1, 0}, { 7003, 12, 15, (ROULETTE5<<16)+ROULETTE31, 1, "雙號紅5綠11", 1, 0}, { 7003, 10, 15, (ROULETTE32<<16)+ROULETTE31, 1, "雙號綠12綠11", 1, 0}, { 7003, 20, 18, (ROULETTE18<<16)+ROULETTE39, 1, "雙號紅18綠19", 1, 0}, { 7003, 18, 18, (ROULETTE40<<16)+ROULETTE39, 1, "雙號綠20綠19", 1, 0}, { 7003, 16, 18, (ROULETTE40<<16)+ROULETTE45, 1, "雙號綠20黑00", 1, 0}, { 7003, 14, 18, (ROULETTE13<<16)+ROULETTE45, 1, "雙號紅13黑00", 1, 0}, { 7003, 12, 18, (ROULETTE13<<16)+ROULETTE34, 1, "雙號紅13綠14", 1, 0}, { 7003, 10, 18, (ROULETTE35<<16)+ROULETTE34, 1, "雙號綠15綠14", 1, 0}, { 7003, 20, 21, (ROULETTE6<<16) +ROULETTE27, 1, "雙號紅6綠7", 1, 0}, { 7003, 18, 21, (ROULETTE8<<16) +ROULETTE27, 1, "雙號紅8綠7", 1, 0}, { 7003, 16, 21, (ROULETTE8<<16) + ROULETTE9, 1, "雙號紅8紅9", 1, 0}, { 7003, 14, 21, (ROULETTE10<<16)+ ROULETTE9, 1, "雙號紅10紅9", 1, 0}, { 7003, 12, 21, (ROULETTE10<<16)+ROULETTE36, 1, "雙號紅10綠16", 1, 0}, { 7003, 10, 21, (ROULETTE17<<16)+ROULETTE36, 1, "雙號紅17綠16", 1, 0}, { 7003, 8, 15, ROULETTE51, 1, "橫列1", 1, 0}, //橫列 { 7003, 8, 18, ROULETTE52, 1, "橫列2", 1, 0}, { 7003, 8, 21, ROULETTE53, 1, "橫列3", 1, 0}, { 7003, 6, 15, ROULETTE61, 1, "號碼1-10", 1, 0}, //1到10 { 7003, 5, 15, ROULETTE61, 1, "號碼1-10", 1, 0}, { 7003, 6, 16, ROULETTE61, 1, "號碼1-10", 1, 0}, { 7003, 5, 16, ROULETTE61, 1, "號碼1-10", 1, 0}, { 7003, 24, 15, ROULETTE62, 1, "號碼11-20", 1, 0}, //10到11 { 7003, 23, 15, ROULETTE62, 1, "號碼11-20", 1, 0}, { 7003, 24, 16, ROULETTE62, 1, "號碼11-20", 1, 0}, { 7003, 23, 16, ROULETTE62, 1, "號碼11-20", 1, 0}, { 7003, 15, 18, ROULETTE45, 1, "輪盤(00)", 1, 0},};#endifstatic char CHAR_sendItemBuffer[STRINGBUFSIZ];BOOL CHAR_sendItemDataOne( int charaindex, int haveitemindex){ int itemgrp[1]; itemgrp[0] = haveitemindex; return CHAR_sendItemData( charaindex, itemgrp, 1);}BOOL CHAR_sendItemData( int charaindex, int *itemgroup, int num){ int i; int strlength = 0; int fd; if( num <= 0 || num > CHAR_MAXITEMHAVE) return FALSE; if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) { return FALSE; } for( i = 0; i < num; i ++ ) { char token[512]; int itemindex;DebugPoint = 200; if( !CHAR_CHECKITEMINDEX( charaindex, itemgroup[i])) { continue; } itemindex = CHAR_getItemIndex( charaindex, itemgroup[i] ); if( itemindex >= 0 ) { snprintf( token ,sizeof(token),"%s|" , ITEM_makeItemStatusString( itemgroup[i],itemindex ) ); }else { snprintf( token ,sizeof(token),"%s|" , ITEM_makeItemFalseStringWithNum( itemgroup[i]) ); } strcpysafe( CHAR_sendItemBuffer + strlength, sizeof(CHAR_sendItemBuffer) - strlength, token ); strlength += strlen( token ); if( strlength >= arraysizeof(CHAR_sendItemBuffer) ) { break; } } dchop( CHAR_sendItemBuffer , "|" ); fd = getfdFromCharaIndex( charaindex ); if( fd != -1 ){ lssproto_I_send( fd, CHAR_sendItemBuffer ); return TRUE; } return FALSE;}static void CHAR_sendItemDetachEvent( int charaindex,int itemid ){ char mesg[256]; snprintf( mesg, sizeof( mesg), "卸下%s ", ITEM_getAppropriateName(itemid) ); CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE);#ifdef _ITEM_METAMO if( ITEM_getEquipPlace( charaindex, itemid) == CHAR_BODY && CHAR_getWorkInt( charaindex, CHAR_WORKITEMMETAMO) != 0 ) { CHAR_setWorkInt( charaindex, CHAR_WORKITEMMETAMO, 0); CHAR_setWorkInt( charaindex, CHAR_WORKNPCMETAMO, 0 ); //與npc對話後的變身也要變回來 CHAR_complianceParameter( charaindex); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); CHAR_send_P_StatusString( charaindex , CHAR_P_STRING_BASEBASEIMAGENUMBER); CHAR_talkToCli( charaindex, -1, "變身失效了!", CHAR_COLORWHITE); }#endif { typedef void (*DETACHFUNC)(int,int); DETACHFUNC def; def=(DETACHFUNC)ITEM_getFunctionPointer(itemid,ITEM_DETACHFUNC); if( def ) { def( charaindex,itemid ); } }}static void CHAR_sendItemAttachEvent( int charaindex,int itemid ){ char mesg[256]; snprintf( mesg, sizeof( mesg), "裝備%s ", ITEM_getAppropriateName(itemid) ); CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORWHITE); { typedef void (*ATTACHFUNC)(int,int); ATTACHFUNC atf; atf=(ATTACHFUNC)ITEM_getFunctionPointer(itemid,ITEM_ATTACHFUNC); if( atf ) atf( charaindex,itemid ); }}int CHAR_findSurplusItemBox( int charaindex ){ int i, remnants=0, itemindex; for(i=CHAR_STARTITEMARRAY; i< CHAR_MAXITEMHAVE; i++){ itemindex = CHAR_getItemIndex( charaindex , i ); if( itemindex == -1 ) remnants++; } return remnants;}static int CHAR_findEmptyItemBoxFromChar( Char* ch ){ int i; for( i = CHAR_STARTITEMARRAY ; i < CHAR_MAXITEMHAVE ; i ++ ){ int itemindex; itemindex = ch->indexOfExistItems[i]; if( itemindex == -1 )return i; } return -1;}static int CHAR_findEmptyPoolItemBoxFromChar( Char* ch ){ int i; for( i=0; i<CHAR_MAXPOOLITEMHAVE; i++ ){ int itemindex; itemindex = ch->indexOfExistPoolItems[i]; if( itemindex == -1 ) return i; } return -1;}int CHAR_findEmptyPoolItemBox( int index ){ Char* ch; if( !CHAR_CHECKINDEX( index ) )return -1; ch = CHAR_getCharPointer(index); if( ch != NULL ) return CHAR_findEmptyPoolItemBoxFromChar( ch ); else return -1;}int CHAR_findEmptyItemBox( int index ){ Char* ch; if( !CHAR_CHECKINDEX( index ) )return -1; ch = CHAR_getCharPointer(index); if( ch != NULL ) return CHAR_findEmptyItemBoxFromChar( ch ); else return -1;}#define LACKOFCLASS {CHAR_talkToCli(index,-1,"能力不足無法裝備。",CHAR_COLORWHITE);}#define CANNOTEQUIP {CHAR_talkToCli(index,-1,"無法裝備該項物品。",CHAR_COLORWHITE);}#define CANNOTEQUIP2 {CHAR_talkToCli(index,-1,"無法同時裝備兩項同種類的物品。",CHAR_COLORWHITE);}#define CANNOTEXCHANGE {CHAR_talkToCli(index,-1,"無法交換此兩項物品。",CHAR_COLORWHITE);}#define CANNOTMOVE {CHAR_talkToCli(index,-1,"無法移動該項物品。",CHAR_COLORWHITE);}static BOOL CHAR_sendSIToCli( int charindex , int from , int to ){ int fd = getfdFromCharaIndex( charindex ); if( fd != -1 ){ lssproto_SI_send( fd , from, to ); return TRUE; } return FALSE;}static BOOL CHAR_moveItemFromItemBoxToEquip( int index, int fromindex, int toindex ){ int fromid,toid; int fromeqplace; BOOL flg = FALSE; if( !CHAR_CHECKINDEX( index ) )return FALSE; fromid = CHAR_getItemIndex(index,fromindex); toid = CHAR_getItemIndex(index,toindex); if( !ITEM_CHECKINDEX( fromid) ) return FALSE; if( CHAR_getInt( index, CHAR_TRANSMIGRATION ) <= 0 ){ if( ITEM_getInt(fromid,ITEM_LEVEL) > CHAR_getInt(index,CHAR_LV) ){ LACKOFCLASS; return FALSE; } }#ifdef _ITEMSET4_TXT if( CHAR_getInt( index, CHAR_STR) < ITEM_getInt( fromid, ITEM_NEEDSTR) ) return FALSE; if( CHAR_getInt( index, CHAR_DEX) < ITEM_getInt( fromid, ITEM_NEEDDEX) ) return FALSE; if( CHAR_getInt( index, CHAR_TRANSMIGRATION) < ITEM_getInt( fromid, ITEM_NEEDTRANS) ) return FALSE;#ifdef _CHAR_PROFESSION // WON ADD 人物職業 if( ITEM_getInt( fromid, ITEM_NEEDPROFESSION) != 0 ){ if( CHAR_getInt( index, PROFESSION_CLASS ) != ITEM_getInt( fromid, ITEM_NEEDPROFESSION) ) return FALSE; }#endif#endif#ifdef _FIXBUG_ATTACKBOW { if( CHAR_getWorkInt( index, CHAR_WORKITEMMETAMO) > 0 || CHAR_getWorkInt( index, CHAR_WORKNPCMETAMO) > 0 || CHAR_getWorkInt( index, CHAR_WORKFOXROUND ) != -1){ //若是變成小狐貍 int armtype = ITEM_getInt( fromid, ITEM_TYPE ); if( armtype == ITEM_BOW || armtype == ITEM_BOUNDTHROW || armtype == ITEM_BREAKTHROW || armtype == ITEM_BOOMERANG) { CHAR_talkToCli( index, -1, "變身無法使用遠距離武器!", CHAR_COLORYELLOW ); return FALSE; } } }#endif#ifdef _ANGEL_SUMMON //if( !strcmp( ITEM_getChar( fromid, ITEM_USEFUNC), "ITEM_AngelToken") ) { if( ITEM_getInt( fromid, ITEM_ID) == ANGELITEM ) { int mindex; char nameinfo[64]; mindex = checkIfAngel( index); getMissionNameInfo( index, nameinfo); if( mindex < 0 || strcmp( ITEM_getChar( fromid, ITEM_ANGELINFO), missiontable[mindex].angelinfo) || strcmp( ITEM_getChar( fromid, ITEM_HEROINFO), missiontable[mindex].heroinfo) || strcmp( ITEM_getChar( fromid, ITEM_ANGELINFO), nameinfo) ) { CHAR_talkToCli( index, -1, "這并不是屬於你的信物,無法裝備。", CHAR_COLORYELLOW ); return FALSE; } }#endif fromeqplace = ITEM_getEquipPlace( index, fromid ); if( fromeqplace == -1 ){ CANNOTEQUIP; return FALSE; } //if( BATTLE_GetWepon( charaindex ) != ITEM_BOW ) if( fromeqplace == CHAR_DECORATION1 ) { int checkplace = ( toindex == CHAR_DECORATION1) ? CHAR_DECORATION2:CHAR_DECORATION1; int otheritemindex; if( toindex == CHAR_DECORATION1 || toindex == CHAR_DECORATION2 ) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -