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

📄 object.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
字号:
#include "version.h"#include <sys/stat.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <dirent.h>#include "common.h"#include "object.h"#include "char_base.h"#include "char.h"#include "item.h"#include "buf.h"#include "readmap.h"#include "pet.h"static Object *obj;static int objnum;#ifndef _SIMPLIFY_ITEMSTRINGstatic int Restored = FALSE;#endifBOOL initObjectArray( int num ){    int     i;    objnum = num;    obj = allocateMemory( sizeof( Object ) * objnum );    if( obj == NULL ) return FALSE;    for( i = 0 ; i < objnum ; i ++ ){        memset( &obj[i], 0 , sizeof( Object ));        obj[i].type = OBJTYPE_NOUSE;    }    return TRUE;}BOOL endObjectArray( void ){    freeMemory( obj );    return TRUE;}INLINE int _initObjectOne( char *file, int line, Object* ob ){    static int allocobjnum = 0;    int i;    BOOL    first;    i = allocobjnum;    first = TRUE;    while( 1 ) {        if( !first && i >= allocobjnum ) {            fprint( "Can't allocate an object\n" );            return -1;        }        if( obj[i].type == OBJTYPE_NOUSE ) {            if( MAP_addNewObj( ob->floor ,ob->x, ob->y, i ) == 1 ){                memcpy( &obj[i] , ob , sizeof( Object ) );                allocobjnum = ( i+1 >= objnum) ? 0:i+1;                return i;            }else{                allocobjnum = ( i+1 >= objnum) ? 0:i+1;                fprint( "MAP_addNewObj error\n" );                return -1;            }        }else {            if( ++i >= objnum ) {                i = 0;                first = FALSE;            }        }    }    fprint( "Can't allocate an object\n" );    return -1;}void endObjectOne( int index ){    if(objnum <= index || index < 0 )return;    if( MAP_removeObj(obj[index].floor,obj[index].x, obj[index].y,                      index) == FALSE){        //fprint( "REMOVE OBJ ERROR  floor:%d  x:%d  y:%d\n",obj[index].floor,obj[index].x, obj[index].y );    }    obj[index].type = OBJTYPE_NOUSE;}BOOL CHECKOBJECT( int index ){    if( 0<=index && index<objnum )return TRUE;    return FALSE;}BOOL CHECKOBJECTUSE( int index ){    if( CHECKOBJECT(index) == FALSE )return FALSE;    if( obj[index].type == OBJTYPE_NOUSE )return FALSE;    return TRUE;}INLINE int OBJECT_getType( int index ){    return obj[index].type;}#ifdef _NPCSERVER_NEWINLINE int OBJECT_getNpcIndex( int index ){    return obj[index].npcsindex;}INLINE char* OBJECT_getName( int index ){    return obj[index].objname;}//imagenumINLINE int OBJECT_getNpcImage( int index ){    return obj[index].imagenum;}INLINE int OBJECT_getNpcdir( int index ){    return obj[index].dir;}#endifINLINE int OBJECT_getchartype( int index ){    return obj[index].chartype;}INLINE void OBJECT_setchartype( int index, int flg){    obj[index].chartype = flg;}INLINE int OBJECT_setType( int index, int newvalue ){    int     old;    old = obj[index].type;    obj[index].type = newvalue;    return old;}INLINE int OBJECT_getFloor( int index ){    return obj[index].floor;}INLINE int OBJECT_setFloor( int index, int newvalue ){    int     old;    old = obj[index].floor;    obj[index].floor = newvalue;    return old;}INLINE int OBJECT_getX( int index ){    return obj[index].x;}INLINE int OBJECT_setX( int index, int newvalue ){    int     old;    old = obj[index].x;    obj[index].x = newvalue;    return old;}INLINE int OBJECT_getY( int index ){    return obj[index].y;}INLINE int OBJECT_setY( int index, int newvalue ){    int     old;    old = obj[index].y;    obj[index].y = newvalue;    return old;}#ifdef _DEL_DROP_GOLDINLINE int OBJECT_getTime( int index ){    return obj[index].time;}INLINE int OBJECT_setTime( int index, int newvalue ){    int     old;    old = obj[index].time;    obj[index].time = newvalue;    return old;}#endif/*------------------------------------------------------------ * index 毛  月 * 娄醒 *  index      int     奶件犯永弁旦 * 忒曰袄 *  int ------------------------------------------------------------*/INLINE int OBJECT_getIndex( int index ){    return obj[index].index;}/*------------------------------------------------------------ * y 毛涩烂允月 * 娄醒 *  index      int     奶件犯永弁旦 *  newvalue    int     蕙仄中袄 * 忒曰袄 *  int 樯及袄 ------------------------------------------------------------*/INLINE int OBJECT_setIndex( int index, int newvalue ){    int     old;    old = obj[index].index;    obj[index].index = newvalue;    return old;}/*------------------------------------------------------------ * 左皮斥尼弁玄及    醒毛菲户月 * 娄醒 *  卅仄 * 忒曰袄 *  int ------------------------------------------------------------*/INLINE int OBJECT_getNum( void ){    return objnum;}/*------------------------------------------------------------ *  左皮斥尼弁玄厌瞻  及丢件田毛蝈  娄醒卞  匀化 *  左皮斥尼弁玄厌瞻  毛综曰请仄化}瓒  允月[ * * 娄醒 *  type    OBJTYPE     左皮斥尼弁玄及正奶皿 *  index   int         公木冗木及    匹及index *  x       int         x甄   *  y       int         y甄   *  floor   int         floorid * 忒曰袄 *   int  喃曰癫化木凶index, 撩  及凛反} -1 ------------------------------------------------------------*/int initObjectFromObjectMember(    OBJTYPE type, int index, int x, int y , int floor ){    Object  obj;    obj.type = type;    obj.index = index;    obj.x = x;    obj.y = y;    obj.floor = floor;    return initObjectOne( &obj );}int searchObjectFromCharaIndex( int index ){    int i;    for( i = 0 ; i < objnum ; i ++ )        if( obj[i].type == OBJTYPE_CHARA && obj[i].index == index )            return i;    return -1;}#define ITEMGOLDSTOREFILENAME   "itemgold"#define STOREITEMID         "ITEM"#define STOREGOLDID         "GOLD"#define	STORECHARID			"CHAR"#ifndef _SIMPLIFY_ITEMSTRINGstatic BOOL checkObjectStoreFile( char* line, Object* one, char** stringstart){    char    token[16];    int     ret;    int     i;    ret = getStringFromIndexWithDelim(line,"|" ,1 , token, sizeof( token ) );    if( ret == FALSE )return FALSE;    if( strcmp( token , STOREITEMID ) == 0 )        one->type = OBJTYPE_ITEM;    else if( strcmp( token , STOREGOLDID ) == 0 )        one->type = OBJTYPE_GOLD;	else if( strcmp( token, STORECHARID) == 0 )		one->type = OBJTYPE_CHARA;    for(  i = 2 ; i < 5 ; i ++ ){        char    first[64];        char    second[64];        ret = getStringFromIndexWithDelim(line,"|" ,i,                                          token,sizeof( token ));        if( ret == FALSE )return FALSE;        ret = getStringFromIndexWithDelim(token,"=" ,1, first,sizeof( first ));        if( ret == FALSE )return FALSE;        ret = getStringFromIndexWithDelim(token,"=" ,2, second,sizeof( second ));        if( ret == FALSE )return FALSE;        if( strcmp( first , "x" ) == 0 )            one->x = atoi( second );        else if( strcmp( first , "y" ) == 0 )            one->y = atoi( second );        else if( strcmp( first , "floor" ) == 0 )            one->floor = atoi( second );    }    {        char*   findex = nindex( line , '|' , 4);        *stringstart = findex + 1;    }    return TRUE;}BOOL storeObjects( char* dirname ){    int i;    FILE*   igfile;    char    igfilename[256];		if( Restored == TRUE ){    	snprintf( igfilename ,sizeof( igfilename ) ,"%s/%s" ,dirname ,              ITEMGOLDSTOREFILENAME );	}else{    	snprintf( igfilename ,sizeof( igfilename ) ,"%s/%s_extra" ,dirname ,              ITEMGOLDSTOREFILENAME );                print( "\n---- Saving didn't do  with gmsv. ----- \n");                print( "---- It is because gmsv stopped before reading . ----- \n");                print( "---- It is kept with a name of (%s) just in case. ----- \n", igfilename );	}    igfile = fopen( igfilename , "w" );    if( igfile == NULL ){        print( "\n\n---- ERR:can not open (%s) for backup items. ----- \n\n", igfilename );    	return FALSE;    }    print( "Store Objects ...");    for( i = 0 ; i < objnum ; i ++ ){        switch( obj[i].type ){        case OBJTYPE_ITEM:        {            fprintf( igfile , STOREITEMID "|x=%d|y=%d|floor=%d|%s\n" ,                     obj[i].x , obj[i].y ,obj[i].floor,                     ITEM_makeStringFromItemIndex( obj[i].index,0 ) );            break;        }        case OBJTYPE_GOLD:        {            fprintf( igfile , STOREGOLDID  "|x=%d|y=%d|floor=%d|%d\n" ,                     obj[i].x , obj[i].y ,obj[i].floor, obj[i].index );            break;        }        case OBJTYPE_CHARA:        {        	int	petindex = obj[i].index;        	if( CHAR_CHECKINDEX( petindex) ) {	        	if( CHAR_getInt( obj[i].index, CHAR_WHICHTYPE) == CHAR_TYPEPET){		            fprintf( igfile , STORECHARID "|x=%d|y=%d|floor=%d|%s\n" ,		                     obj[i].x , obj[i].y ,obj[i].floor,		                     CHAR_makePetStringFromPetIndex( obj[i].index ) );				}        	}        	break;        }        default:            break;        }    }    fclose( igfile );    print( "done\n");system( "./itemda.pl" );    print( "item backup end\n");    return TRUE;}#endifint detectStoreFile( char*  filename ){    FILE*   f;    char    buffer[10];    f = fopen ( filename ,"r" );    if( f == NULL )return 3;    if( fgets( buffer, sizeof( buffer ),  f ) == NULL ){        fclose(f);        return 3;    }    if( strncmp(buffer,STOREITEMID,sizeof(STOREITEMID) ) == 0 ||        strncmp(buffer,STOREGOLDID,sizeof(STOREGOLDID) ) == 0   ){        fclose(f);        return 2;    }    fclose(f);    return 3;}#ifndef _SIMPLIFY_ITEMSTRINGBOOL restoreObjects( char* dirname ){    char    igfilename[512];    FILE*   file;    char    line[2048];    snprintf( igfilename, sizeof(igfilename), "%s/%s", dirname, ITEMGOLDSTOREFILENAME );    file = fopen( igfilename , "r" );    if( file == NULL ){		Restored = TRUE;    	return FALSE;    }    while(  fgets( line, sizeof( line ), file ) != NULL ){        Object  one;        char    *string;        chomp( line );        if( checkObjectStoreFile( line, &one ,&string ) == FALSE )            continue;        switch( one.type ){        case OBJTYPE_ITEM:        {            ITEM_Item   itmone;            BOOL ret;            int     objindex;            ret = ITEM_makeExistItemsFromStringToArg( string, &itmone, 0 );            if( ret == TRUE ){                one.index = ITEM_initExistItemsOne( &itmone );                if( one.index == -1 )   break;                objindex = initObjectOne( &one );                ITEM_setWorkInt(one.index,ITEM_WORKCHARAINDEX,-1);                ITEM_setWorkInt(one.index,ITEM_WORKOBJINDEX,objindex);            }            break;        }        case OBJTYPE_GOLD:            one.index = atoi( string );            initObjectOne( &one );            break;		case OBJTYPE_CHARA:		{			Char	ch;			int		ret;			ret = CHAR_makePetFromStringToArg(string,&ch, -1);			if( ret ) {			    Object object;			    int objindex;		        int petindex = PET_initCharOneArray( &ch );		        if( petindex < 0 ) {		        	print( "宠物制作失败。\n");		        }			    object.type = OBJTYPE_CHARA;			    object.index = petindex;			    object.x = ch.data[CHAR_X];			    object.y = ch.data[CHAR_Y];			    object.floor = ch.data[CHAR_FLOOR];			    objindex = initObjectOne( &object );				if( objindex == -1 ) {	                CHAR_endCharOneArray( petindex );				}else {				    CHAR_setWorkInt( petindex,CHAR_WORKOBJINDEX,objindex );				}			}			break;        }        default:            break;        }    }    fclose( file );	Restored = TRUE;    return TRUE;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -