📄 item_event.c.bak
字号:
#include "version.h"#include <string.h> /* strstr */#include <ctype.h> /* isdigit, isalnum */#include "common.h"#include "char.h"#include "char_base.h"#include "char_data.h"#include "configfile.h"#include "item.h"#include "item_event.h"#include "object.h"#include "anim_tbl.h"#include "magic.h"#include "handletime.h"#include "log.h"#include "util.h"#include "encount.h"#include "battle.h"#include "battle_item.h"#include "lssproto_serv.h"#include "net.h"#include "pet.h"#include "npcutil.h"#include "enemy.h"#ifdef _Item_ReLifeAct#include "battle_magic.h"#endif#ifdef _MARKET_TRADE#include "item_trade.h"#endif#ifdef _ITEM_WARP_FIX_BIextern tagRidePetTable ridePetTable[146];#endif#include "pet_skill.h"#ifdef _DEATH_CONTENDAB#include "deathcontend.h"#endif#ifdef _CFREE_petskill#include "npc_freepetskillshop.h"#endif#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能#include "profession_skill.h"#endifint ITEM_TimeDelCheck( int itemindex ){ int icnt, jcnt, playernum; playernum = CHAR_getPlayerMaxNum(); for( icnt = 0; icnt < playernum; icnt ++ ) { if( CHAR_CHECKINDEX( icnt ) ) { for( jcnt = 0; jcnt < CHAR_MAXITEMHAVE; jcnt ++ ) { if( CHAR_getItemIndex( icnt, jcnt ) == itemindex ) { print( "道具效力时间已到,进行奇怪道具处理(%s)(%s)\n", CHAR_getUseName(icnt),ITEM_getAppropriateName(itemindex) ); return FALSE; } } } } return TRUE;}int ITEM_eventDrop( int itemindex, int charaindex, int itemcharaindex ){ typedef void (*DROPF)(int,int); char szBuffer[256]=""; DROPF dropfunc=NULL; if( ITEM_CHECKINDEX(itemindex) == FALSE )return -1; dropfunc=(DROPF)ITEM_getFunctionPointer( itemindex, ITEM_DROPFUNC ); if( dropfunc ){ dropfunc( charaindex, itemindex ); } if( ITEM_getInt( itemindex, ITEM_VANISHATDROP) != 1 )return 0; snprintf( szBuffer, sizeof( szBuffer), "%s 消灭了。", ITEM_getAppropriateName(itemindex) ); CHAR_talkToCli( charaindex, -1, szBuffer, CHAR_COLORWHITE ); { LogItem( CHAR_getChar( charaindex, CHAR_NAME ), /* 平乓仿 */ CHAR_getChar( charaindex, CHAR_CDKEY ),#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称 itemindex,#else ITEM_getInt( itemindex, ITEM_ID ), /* 失奶 丞 寞 */#endif "Drop&Delete(丢出後消失)", CHAR_getInt( charaindex,CHAR_FLOOR), CHAR_getInt( charaindex,CHAR_X ), CHAR_getInt( charaindex,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); } CHAR_setItemIndex( charaindex, itemcharaindex, -1); ITEM_endExistItemsOne( itemindex ); return 1;}#undef UNDEF#define UNDEF (-1)typedef struct { char* cmd; /* 摹 侬 */ char* onmessage; /* 丢永本□斥 侬 */ char* offmessage; /* 丢永本□斥 侬 */ int element; /* 覆擂卞卅月邰豳 */ int maxElement; /* element匹隙烂今木凶邰豳及 袄毛手勾邰豳 */} ITEM_EFFECTPARAM;static ITEM_EFFECTPARAM ITEM_restorableParam[] = { {"hp", "HP回复了。", "HP降低了。",CHAR_HP, CHAR_WORKMAXHP}, {"mp", "MP回复了。", "MP降低了。",CHAR_MP, CHAR_WORKMAXMP},};static ITEM_EFFECTPARAM ITEM_statusParam[] = { {"po", CHAR_POISONSTRING, CHAR_RECOVERPOISONSTRING, CHAR_POISON, UNDEF}, {"pa", CHAR_PARALYSISSTRING, CHAR_RECOVERPARALYSISSTRING, CHAR_PARALYSIS, UNDEF}, {"si", CHAR_SILENCESTRING, CHAR_RECOVERSILENCESTRING, CHAR_SLEEP,UNDEF}, {"st", CHAR_STONESTRING, CHAR_RECOVERSTONESTRING, CHAR_STONE, UNDEF}, {"da", CHAR_DARKNESSSTRING, CHAR_RECOVERDARKNESSSTRING, CHAR_DRUNK,UNDEF}, {"co", CHAR_CONFUSIONSTRING,CHAR_RECOVERCONFUSIONSTRING, CHAR_CONFUSION, UNDEF},};/*#define LOCAL_DEBUG*/#ifdef LOCAL_DEBUG#define DOUTFILE "doutfile"#include <stdio.h>#include <stdarg.h>static int eprintf(char* format, ...){ va_list arg; long len; FILE* fp; fp = fopen(DOUTFILE, "a"); va_start(arg, format); len = vfprintf(stderr, format, arg); if(fp){ vfprintf(fp, format, arg); fclose(fp); } va_end(arg); return len;}#define fprint eprintf#endifstatic BOOL ITEM_isValidEffect(char* cmd, int value){ int i; for(i=0; i<arraysizeof(ITEM_restorableParam); i++){ if(! strcmp(cmd, ITEM_restorableParam[i].cmd)){ return value <= 0 ? FALSE : TRUE; } } if(value < 0 ) return FALSE; for(i=0; i<arraysizeof(ITEM_statusParam); i++){ if(! strcmp(cmd, ITEM_statusParam[i].cmd)){ return TRUE; } } return FALSE;}#define ID_BUF_LEN_MAX 20#define SEPARATORI '|'BOOL ITEM_MedicineInit(ITEM_Item* itm){ char cmd[ID_BUF_LEN_MAX], arg[ID_BUF_LEN_MAX]; int value; int effectCount = 0; char* p, * q; char* effectarg; effectarg = itm->string[ITEM_ARGUMENT].string; if(* effectarg == '\0') return TRUE; for(p=effectarg; *p != '\0'; ){ int i; if(*p == SEPARATORI) p++; for(q=cmd, i=0; isalnum(*p) && i<ID_BUF_LEN_MAX; i++){ *q++ = *p++; } *q = '\0'; if(q == cmd || *p != SEPARATORI){ fprint("ITEM_medicineInit: error(c)? invalid:%s(%d)\n", effectarg, effectCount); return FALSE; } p++; for(q=arg, i=0; isdigit(*p) && i<ID_BUF_LEN_MAX; i++){ *q++ = *p++; } *q = '\0'; value = strtol(arg, & q, 10); /* strtol()反OK? */ if(ITEM_isValidEffect(cmd, value)){ effectCount++; }else{ fprint("ITEM_medicineInit: error(v)? invalid:%s(%d)\n", effectarg, effectCount); return FALSE; } } return (effectCount == 0) ? FALSE : TRUE;}static BOOL ITEM_medicineRaiseEffect(int charaindex, char* cmd,int value){ int i; char ansmsg[256]; for( i=0 ; i<arraysizeof(ITEM_restorableParam); i++){ if( ! strcmp(cmd, ITEM_restorableParam[i].cmd) ){#if 1 int maxv,curv,amount; char* onoroff=NULL; maxv=CHAR_getWorkInt( charaindex, ITEM_restorableParam[i].maxElement); curv=CHAR_getInt(charaindex,ITEM_restorableParam[i].element); amount = value; if( curv + amount < 0 ) amount = -curv; CHAR_setInt(charaindex,ITEM_restorableParam[i].element, min((curv+amount),maxv)); if( amount > 0 ) onoroff=ITEM_restorableParam[i].onmessage; else if( amount < 0 ) onoroff=ITEM_restorableParam[i].offmessage; else return FALSE; strcpysafe( ansmsg, sizeof(ansmsg), onoroff ); CHAR_talkToCli( charaindex, -1, ansmsg, CHAR_COLORWHITE); return TRUE;#else if(value == ITEM_EFFECT_RESTORE_NORMAL){ int maxv, curv, amount; maxv =CHAR_getWorkInt(charaindex, ITEM_restorableParam[i].maxElement); curv =CHAR_getInt(charaindex, ITEM_restorableParam[i].element); amount = 30; if(curv + amount < 0) amount = -curv; CHAR_setInt(charaindex, ITEM_restorableParam[i].element, min((curv+amount), maxv)); snprintf( ansmsg, sizeof(ansmsg), "%s回复了。", ITEM_restorableParam[i].onmessage ); CHAR_talkToCli( charaindex, -1, ansmsg, CHAR_COLORWHITE); return TRUE; }else if(value == ITEM_EFFECT_RESTORE_COMPLETE){ int maxv; maxv =CHAR_getWorkInt(charaindex, ITEM_restorableParam[i].maxElement); CHAR_setInt(charaindex, ITEM_restorableParam[i].element, maxv); snprintf( ansmsg, sizeof(ansmsg), "%s已完全回复。", ITEM_restorableParam[i].onmessage ); CHAR_talkToCli( charaindex, -1, ansmsg, CHAR_COLORWHITE ); return TRUE; }else return FALSE;#endif } } if( value >= 0 ){ int found = 0; for(i=0; i<arraysizeof(ITEM_statusParam); i++){ if(! strcmp(cmd, ITEM_statusParam[i].cmd)){ ansmsg[0] = '\0'; if( value && CHAR_getInt(charaindex,ITEM_statusParam[i].element) < value ){ CHAR_setInt(charaindex, ITEM_statusParam[i].element, value); strcpysafe( ansmsg, sizeof(ansmsg), ITEM_statusParam[i].onmessage ); }else{ if( CHAR_getInt(charaindex, ITEM_statusParam[i].element ) ){ strcpysafe( ansmsg, sizeof(ansmsg), ITEM_statusParam[i].offmessage ); } CHAR_setInt(charaindex, ITEM_statusParam[i].element, 0 ); } found = 1; if( ansmsg[0] != '\0' ) CHAR_talkToCli( charaindex,-1,ansmsg,CHAR_COLORWHITE); } } if(found){ CHAR_sendCToArroundCharacter( CHAR_getWorkInt(charaindex,CHAR_WORKOBJINDEX) ); return TRUE; } }#undef ITEM_STATUSCHANGEVALUE strcpysafe( ansmsg, sizeof(ansmsg),"什麽也没发生。"); CHAR_talkToCli( charaindex, -1, ansmsg, CHAR_COLORWHITE ); return FALSE;}void ITEM_MedicineUsed(int charaindex, int to_charaindex, int itemindex){ int itemid; int usedf = 0; char cmd[ID_BUF_LEN_MAX], arg[ID_BUF_LEN_MAX]; int value; char* p, * q; char* effectarg; char ansmsg[256]; itemid = CHAR_getItemIndex(charaindex, itemindex); if(!ITEM_CHECKINDEX(itemid)) return; effectarg = ITEM_getChar(itemid, ITEM_ARGUMENT); snprintf( ansmsg, sizeof(ansmsg), "抓到了%s 。", ITEM_getChar(itemid, ITEM_NAME) ); CHAR_talkToCli( charaindex, -1, ansmsg, CHAR_COLORWHITE ); for( p=effectarg ; *p != '\0'; ){ int i; if(*p == SEPARATORI) p++; for(q=cmd, i=0; isalnum(*p) && i<ID_BUF_LEN_MAX; i++){ *q++ = *p++; } *q = '\0'; if(q == cmd || *p != SEPARATORI) return; p++; for(q=arg, i=0; isdigit(*p) && i<ID_BUF_LEN_MAX; i++){ *q++ = *p++; } *q = '\0'; value = strtol(arg, & q, 10); if(ITEM_medicineRaiseEffect(charaindex, cmd, value)){ usedf = 1; } } if(usedf){ CHAR_DelItem( charaindex, itemindex); CHAR_sendStatusString(charaindex, "P"); }else fprint("ITEM_medicineUsed: error? cannot be used.\n");#undef ID_BUF_LEN_MAX#undef SEPARATORI}void ITEM_SandClockDetach( int charaindex , int itemid ){ int i; if( !ITEM_CHECKINDEX( itemid )) return; for( i=0 ; i<CHAR_MAXITEMHAVE ; i++ ){ if( CHAR_getItemIndex(charaindex,i ) == itemid ){ CHAR_DelItem( charaindex, i); CHAR_talkToCli( charaindex, -1, "一卸下沙漏,竟忽然坏了!", CHAR_COLORWHITE ); print( "deleted sand clock!\n" ); break; } }}void ITEM_SandClockLogin( int charaindex ){ int i; int dTime; for( i=0 ; i<CHAR_MAXITEMHAVE; i++ ){ int itemindex = CHAR_getItemIndex(charaindex,i); if( ITEM_getInt( itemindex, ITEM_ID ) != 29 )continue; if( ITEM_getInt( itemindex, ITEM_VAR4 ) == 0 )continue; dTime = NowTime.tv_sec - ITEM_getInt( itemindex, ITEM_VAR4 ); ITEM_setInt( itemindex, ITEM_VAR3, ITEM_getInt( itemindex, ITEM_VAR3 ) + dTime ); }}void ITEM_SandClockLogout( int charaindex ){ int i; for( i=0 ; i<CHAR_MAXITEMHAVE; i++ ){ int itemindex = CHAR_getItemIndex(charaindex,i); if( ITEM_getInt( itemindex, ITEM_ID ) != 29 )continue; ITEM_setInt( itemindex, ITEM_VAR4, NowTime.tv_sec ); }}// Arminius 7.2: Ra's amulet , remove "static"/*static*/BOOL ITEM_getArgument( char* argument , char* entryname, char* buf , int buflen ){ int i; char dividedbypipeline[512]; for( i=1; ; i++ ){ BOOL ret; ret = getStringFromIndexWithDelim( argument, "|", i, dividedbypipeline, sizeof(dividedbypipeline) ); if( ret == TRUE ){ int tworet=1; char first[512]; tworet &= getStringFromIndexWithDelim( dividedbypipeline, ":", 1, first,sizeof(first) ); tworet &= getStringFromIndexWithDelim( dividedbypipeline, ":", 2, buf,buflen ); if( tworet != 0 ) if( strcasecmp( first, entryname ) == 0 ) return TRUE; }else break; } return FALSE;}void ITEM_addTitleAttach( int charaindex, int itemindex )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -