⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 item_event.c.bak

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 BAK
📖 第 1 页 / 共 5 页
字号:
#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 + -