int NPC_Util_FrontItem( int meindex ) { int front_x, front_y,objindex,itemindex; OBJECT obj; CHAR_getCoordinationDir( CHAR_getInt(meindex,CHAR_DIR) , CHAR_getInt(meindex,CHAR_X) , CHAR_getInt(meindex,CHAR_Y) ,1, &front_x, &front_y ); for( obj=MAP_getTopObj(CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y );obj; obj=NEXT_OBJECT(obj) ){ objindex = GET_OBJINDEX(obj); if( OBJECT_getType(objindex) == OBJTYPE_ITEM ){ itemindex = OBJECT_getIndex(objindex); if(ITEM_CHECKINDEX(itemindex) ){ return itemindex; }else{ return -1; } } } return -1; }
BOOL NPC_Util_IsVisiblePlayer( int meindex) { int chr_fl,chr_x,chr_y, i, j; BOOL found = FALSE; chr_fl = CHAR_getInt( meindex, CHAR_FLOOR); chr_x = CHAR_getInt( meindex, CHAR_X); chr_y = CHAR_getInt( meindex, CHAR_Y); for( i = chr_x-CHAR_DEFAULTSEESIZ/2 ; i <= chr_x+CHAR_DEFAULTSEESIZ/2 && found == FALSE; i++ ){ for( j = chr_y-CHAR_DEFAULTSEESIZ/2 ; j <= chr_y+CHAR_DEFAULTSEESIZ/2 && found == FALSE; j ++ ){ OBJECT object; for( object = MAP_getTopObj( chr_fl, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { found = TRUE; break; } } } } } return( found); }
static int SearchNearLine(int xStart, int yStart, int floor, int xPlus, int yPlus, int Count, int type) { OBJECT object; int i, x = xStart, y = yStart; for (i = 0; i < Count; i++) { for (object = MAP_getTopObj(floor, x, y); object; object = NEXT_OBJECT(object)) { int objindex = GET_OBJINDEX(object), iWork; if (OBJECT_getType(objindex) != OBJTYPE_CHARA) continue; iWork = OBJECT_getIndex(objindex); if (CHAR_getInt(iWork, CHAR_HP) < 0) continue; if (CHAR_getInt(iWork, CHAR_WHICHTYPE) == type) { return iWork; } } x += xPlus; y += yPlus; } return -1; }
static BOOL CHAR_clairvoyance_item(int objindex,char* buf ) { if( OBJECT_getType( objindex ) == OBJTYPE_ITEM) { *buf = 'I'; return TRUE; } return FALSE; }
static BOOL CHAR_clairvoyance_gold(int objindex,char* buf ) { if( OBJECT_getType( objindex ) == OBJTYPE_GOLD ) { *buf = 'G'; return TRUE; } return FALSE; }
int EVENT_main( int charaindex,int event, int x, int y) { OBJECT object; BOOL found = FALSE; int rc = FALSE; int fl = CHAR_getInt( charaindex, CHAR_FLOOR); if( !EVENT_CHECKEVENTINDEX( event)) return FALSE; for( object = MAP_getTopObj(fl,x,y) ; object ; object = NEXT_OBJECT(object) ){ int o = GET_OBJINDEX(object); if( OBJECT_getType(o) == OBJTYPE_CHARA ){ int etype; int echaraindex=OBJECT_getIndex(o); if( !CHAR_CHECKINDEX(echaraindex) )continue; if( CHAR_getInt( echaraindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) continue; etype = CHAR_getWorkInt( echaraindex, CHAR_WORKEVENTTYPE); if( etype != CHAR_EVENT_NONE ) { if( etype == event) { if( functbl[event] != NULL ) { rc = functbl[event]( charaindex, echaraindex, fl,x,y); } found = TRUE; break; } } } #ifdef _MAP_WARPPOINT else if( OBJECT_getType(o) == OBJTYPE_WARPPOINT){ if( !MAPPOINT_CHECKINDEX( OBJECT_getIndex( o)) ) continue; if( OBJECT_getchartype( o) != event ) continue; MAPPOINT_MapWarpHandle( charaindex, OBJECT_getIndex( o), fl, x, y ); found = TRUE; rc = TRUE; break; } #endif } /* if( !found ) { print( "not found eventobject : cind [%d] event [%d] fl[%d] x[%d] y[%d]\n", charaindex, event, fl,x,y); } */ return rc; }
static BOOL CHAR_clairvoyance_player(int objindex,char* buf ) { if( OBJECT_getType( objindex ) == OBJTYPE_CHARA && CHAR_getInt(OBJECT_getIndex(objindex),CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) { *buf = 'P'; return TRUE; } return FALSE; }
static BOOL CHAR_clairvoyance_enemy(int objindex,char* buf ) { if( OBJECT_getType( objindex ) == OBJTYPE_CHARA && CHAR_getInt(OBJECT_getIndex(objindex),CHAR_WHICHTYPE) == CHAR_TYPEENEMY ) { *buf = 'E'; return TRUE; } return FALSE; }
BOOL CHAR_makeCAOPT1String( int objindex,char* buf, int buflen, int act,int opt1 ) { char objindexbuf[64]; if( CHECKOBJECT(objindex) == FALSE ) return FALSE; if( OBJECT_getType(objindex) != OBJTYPE_CHARA ) return FALSE; snprintf( buf,buflen,"%s|%d|%d|%d|%d|%d", cnv10to62( objindex,objindexbuf, sizeof(objindexbuf)), OBJECT_getX(objindex), OBJECT_getY(objindex), act, CHAR_getInt(OBJECT_getIndex(objindex),CHAR_DIR), opt1); return TRUE; }
/********************************* * watch質 *********************************/ void NPC_ActionWatch( int meobjindex, int objindex, CHAR_ACTION act, int x,int y,int dir, int* opt,int optlen ) { int meindex; int index; char argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; char buf[64]; int i; struct { CHAR_ACTION act; char *string; }searchtbl[] = { { CHAR_ACTATTACK, "attack"}, { CHAR_ACTDAMAGE, "damage"}, { CHAR_ACTDOWN, "down"}, { CHAR_ACTSIT, "sit"}, { CHAR_ACTHAND, "hand"}, { CHAR_ACTPLEASURE, "pleasure"}, { CHAR_ACTANGRY, "angry"}, { CHAR_ACTSAD, "sad"}, { CHAR_ACTGUARD, "guard"}, { CHAR_ACTNOD, "nod"}, { CHAR_ACTTHROW, "throw"}, }; if( OBJECT_getType( objindex) != OBJTYPE_CHARA) return; index = OBJECT_getIndex( objindex); /* 皿伊奶乩□卞及心 殺允月 */ if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return; meindex = OBJECT_getIndex( meobjindex); /* 輊五寧勻化ㄠ弘伉永玉匹卅中午 殺仄卅中 */ if( NPC_Util_isFaceToFace( meindex, index, 1 ) != TRUE ) return; argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1)); for( i = 0; i < arraysizeof( searchtbl); i ++ ) { if( searchtbl[i].act == act) { if( NPC_Util_GetStrFromStrWithDelim( argstr, searchtbl[i].string, buf, sizeof( buf)) != NULL ) { CHAR_talkToCli( index, meindex ,buf , CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR )); break; } } } }
int NPC_WarpSearchByPosition( int fl , int x, int y) { OBJECT object; for( object=MAP_getTopObj(fl,x,y) ; object ; object=NEXT_OBJECT(object)){ int objindex = GET_OBJINDEX(object); if( OBJECT_getType( objindex ) == OBJTYPE_CHARA && CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE) == CHAR_TYPEWARP ){ return OBJECT_getIndex(objindex); } } return -1; }
static int NPC_DoorSamePos( int meindex ){ int iWork; OBJECT object; int floor = CHAR_getInt( meindex, CHAR_FLOOR ); int x = CHAR_getInt( meindex, CHAR_X ); int y = CHAR_getInt( meindex, CHAR_Y ); for( object=MAP_getTopObj( floor, x,y ); object ; object = NEXT_OBJECT(object) ){ int objindex = GET_OBJINDEX(object); if( OBJECT_getType(objindex) != OBJTYPE_CHARA )continue; iWork = OBJECT_getIndex(objindex); if( CHAR_getInt(iWork,CHAR_HP) < 0 )continue; if( CHAR_getInt( iWork,CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ return iWork; } } return -1; }
void NPC_WarpWatch( int meobjindex, int objindex, CHAR_ACTION act, int x,int y,int dir, int* opt,int optlen ) { int meindex,moveindex; if( OBJECT_getType( objindex ) != OBJTYPE_CHARA )return; meindex = OBJECT_getIndex(meobjindex); moveindex = OBJECT_getIndex(objindex); if( CHAR_getInt( moveindex,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){ return; } if( act != CHAR_ACTWALK )return; if( opt[0] == x && opt[1] == y )return; if( CHAR_getInt(meindex,CHAR_X) == x && CHAR_getInt(meindex,CHAR_Y) == y ) { NPC_WarpWarpCharacter( meindex, moveindex ); } }
/* void MAPPOINT_checkMapWarpPoint( int floor, int x, int y) { OBJECT object; for( object = MAP_getTopObj(fl,x,y) ; object ; object = NEXT_OBJECT(object) ){ int o = GET_OBJINDEX(object); if( OBJECT_getType(o) == OBJTYPE_WARPPOINT){ if( !MAPPOINT_CHECKINDEX( OBJECT_getIndex( o)) ) continue; if( OBJECT_getchartype( o) != event ) continue; MAPPOINT_MapWarpHandle( charaindex, OBJECT_getIndex( o), fl, x, y ); found = TRUE; break; } } */ void MAPPOINT_resetMapWarpPoint( int flg) { int i; if( MapWarppoint == NULL ) return; for( i=0; i<MAP_MAXWARPPOINT; i++){ MapWarppoint[i].use = 0; MapWarppoint[i].floor = -1; } if( flg == 1 ){ int objindex; int objmaxnum = OBJECT_getNum(); for( objindex=0; objindex<objmaxnum; objindex++) { if( CHECKOBJECT( objindex ) == FALSE ) continue; if( OBJECT_getType( objindex) != OBJTYPE_WARPPOINT )continue; CHAR_ObjectDelete( objindex); } } }
void Check_EnemyWarpMe( int meindex, char *args ) { char buf1[256]; int objindex,index; int nfl, nx, ny; OBJECT obj; memset( buf1, 0, sizeof( buf1)); if( NPC_Util_GetStrFromStrWithDelim( args, "REPLACEMENT", buf1, sizeof( buf1)) == NULL ) { return; } GetRand_WarpPoint( buf1, &nfl, &nx, &ny ); if( MAP_IsValidCoordinate( nfl, nx, ny ) == FALSE ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCENEMY REPLACEMENT: %s .Invalid POINT( %d, %d, %d)\n", filename, nfl, nx, ny ); return; } { int ofl, ox, oy; ofl = CHAR_getInt( meindex, CHAR_FLOOR ); ox = CHAR_getInt( meindex, CHAR_X ); oy = CHAR_getInt( meindex, CHAR_Y ); for ( obj=MAP_getTopObj( nfl, nx, ny); obj; obj=NEXT_OBJECT( obj) ) { objindex = GET_OBJINDEX( obj); if (OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; index = OBJECT_getIndex( objindex); if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER && CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) != CHAR_TYPEPET ) { CHAR_warpToSpecificPoint( index, ofl, ox, oy); CHAR_sendCToArroundCharacter( objindex); break; } } } objindex = CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX); CHAR_warpToSpecificPoint( meindex, nfl, nx, ny); CHAR_sendCToArroundCharacter( objindex); }
int NPC_Util_FrontChar( int meindex ) { int front_x, front_y,objindex,enemyindex; OBJECT obj; CHAR_getCoordinationDir( CHAR_getInt(meindex,CHAR_DIR) , CHAR_getInt(meindex,CHAR_X) , CHAR_getInt(meindex,CHAR_Y) ,1, &front_x, &front_y ); for( obj=MAP_getTopObj(CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y );obj; obj=NEXT_OBJECT(obj) ){ objindex = GET_OBJINDEX(obj); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ enemyindex = OBJECT_getIndex(objindex); if(CHAR_CHECKINDEX(enemyindex) ){ return enemyindex; } } } return -1; }
static CHAR_WALKRET CHAR_walk_turn( int index, int dir ) { int fx,fy,ff; OBJECT object; if(!CHAR_CHECKINDEX( index ))return CHAR_WALKSYSTEMERROR; CHAR_setInt(index,CHAR_DIR,dir); fx = CHAR_getInt(index,CHAR_X); fy = CHAR_getInt(index,CHAR_Y); ff = CHAR_getInt(index,CHAR_FLOOR); CHAR_sendWatchEvent( CHAR_getWorkInt(index, CHAR_WORKOBJINDEX), CHAR_ACTTURN,NULL,0,FALSE); CHAR_setWorkInt( index, CHAR_WORKACTION, CHAR_ACTTURN); for( object = MAP_getTopObj(ff,fx,fy) ; object ; object = NEXT_OBJECT(object ) ){ typedef void (*POSTOFUNC)(int,int); POSTOFUNC pfunc=NULL; int objindex = GET_OBJINDEX(object); switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (POSTOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_POSTOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (POSTOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_POSTOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),index ); } return CHAR_WALKSUCCESSED; }
/******************************************************* int NPC_Util_SuberiWalk( int index, CHAR 及奶件犯永弁旦 ); -1 “穴永皿卞娄匀井井匀化巨仿□ -2 “平乓仿弁正卞娄匀井井匀化巨仿□ *******************************************************/ int NPC_Util_OtherCharCheck(int ff, int fx, int fy) { #if 1 OBJECT object; for (object = MAP_getTopObj(ff, fx, fy); object; object = NEXT_OBJECT(object)) { int objindex = GET_OBJINDEX(object); if (OBJECT_getType(objindex) == OBJTYPE_CHARA) { return 1; } } return 0; #else int i; for (i = 0; i < objnum; i++) { if (obj[i].x == fx && obj[i].y == fy && obj[i].floor == ff) { if (obj[i].type != OBJTYPE_NOUSE) { return 1; } } } return 0; #endif }
/*------------------------------------------------------------ * ¥Ñ¡¼ ¥£¤Ë ¤í¤¦¤È¤¹¤ë¡e ------------------------------------------------------------*/ BOOL CHAR_JoinParty( int charaindex ) { int result = -1; int x,y; OBJECT object; int found = FALSE; int fd; int cnt; int i; fd = getfdFromCharaIndex( charaindex ); if( fd == -1 ) { print( "%s : %d err\n", __FILE__, __LINE__); return FALSE; } /* ¼«Ê¬¤¬¥Ñ¡¼ ¥£ÁȤó¤Ç¤¿¤éÂÌ */ if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { lssproto_PR_send( fd, 1, FALSE); return FALSE; } /* ¤ÎÁ°¤ÎºÂ ¤ò ¤ë */ CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , CHAR_getInt( charaindex , CHAR_X ), CHAR_getInt( charaindex , CHAR_Y ) , 1 , &x , &y ); /* ½é´ü²½¤¹¤ë */ for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setJoinpartycharaindex(fd,i,-1); } cnt = 0; /*¼«Ê¬¤Î ¤ÎÁ°¤Î¥¥ã¥é¤ò¼è ¤¹¤ë */ for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR),x,y) ; object ; object = NEXT_OBJECT(object ) ) { int toindex; int parray; int objindex = GET_OBJINDEX(object); int targetindex = -1; /* ¥¥ã¥é¥¯¥¿¡¼¤¸¤ã¤Ê¤¤ */ if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; toindex = OBJECT_getIndex( objindex); // shan begin if( CHAR_getInt(charaindex, CHAR_FMINDEX) > 0 && CHAR_getInt(toindex, CHAR_FMINDEX) >0){ for( i = 0; i < FAMILY_FMPKFLOOR; i++){ if( fmpkflnum[i].fl == CHAR_getInt( charaindex, CHAR_FLOOR) ) if( CHAR_getInt(charaindex, CHAR_FMINDEX) != CHAR_getInt(toindex, CHAR_FMINDEX) ){ lssproto_PR_send( fd, 1, FALSE); return FALSE; } } } // shan end /* ¥×¥ì¥¤¥ä¡¼¤Î»þ */ if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ found = TRUE; /* Áê¼ê¤¬»Ò¤À¤Ã¤¿¤é¿Æ¤ò°ú¤ÃÄ¥¤ê½Ð¤¹ */ if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { targetindex = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( !CHAR_CHECKINDEX( targetindex) ) { print( " %s:%d err\n", __FILE__, __LINE__); continue; } if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS) { continue; } } else { targetindex = toindex; } /* ¿Æ¤È £±¬¤°Ê ¤Ë¤¤¤ë¤« */ if( NPC_Util_CharDistance( charaindex, targetindex ) > 1) { continue; } /* Àï ¤Ï¤Ç¤Ê¤¤»ö¡e*/ if( CHAR_getWorkInt( targetindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){ continue; } /* Ãç´Öµö²Ä¥â¡¼¥É¤« */ if( !CHAR_getFlg( targetindex, CHAR_ISPARTY) ) continue; #ifdef _ANGEL_SUMMON if( CHAR_getWorkInt( targetindex, CHAR_WORKANGELMODE) == TRUE) { CHAR_talkToCli( charaindex, -1, "¨ÏªÌ¤£¥i¥H·í»â¶¤¡C", CHAR_COLORYELLOW); continue; } #endif #ifdef _ESCAPE_RESET // ¨Ï¥Î´cÄ_°k¶]«áx¤ÀÄÁ¤º¤£¥i»P¤H²Õ¶¤ if( getStayEncount( getfdFromCharaIndex(targetindex) ) ) { //print(" ´cÄ_¤¤²Õ¶¤ "); if( time(NULL) - CHAR_getWorkInt( targetindex, CHAR_WORKLASTESCAPE) < 5*60 ) { //print(" ´cÄ_°k¶]«á²Õ¶¤ "); CHAR_talkToCli( charaindex, -1, "¦¹¤H¼È®É¤£¥i¥H·í»â¶¤¡C", CHAR_COLORYELLOW); continue; } } #endif } /* ¥Þ¥ó¥â¥¹¥Ð¥¹¤¬¤¤¤ë»þ¤Ï¡f¿Í´Ö¤è¤êÍ¥À褹¤ë¡e */ else if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { targetindex = toindex; cnt = 0; if( !NPC_BusCheckJoinParty( toindex, charaindex, TRUE)) { /* ¾ò·ï¤ò ¤¿¤µ¤Ê¤«¤Ã¤¿¡eÃç´Ö ¤ë¤Î¤Ï½ª¤ï¤ë¡e¿Í´Ö¤Î½è ¤â¤·¤Ê¤¤¡e * ¤ä¤ä¤³¤·¤¤¤Î¤Ç¡e */ break; } { // Arminius 7.10 Airplane int busimg=CHAR_getInt(toindex, CHAR_BASEIMAGENUMBER); if ((busimg!=100355) && (busimg!=100461)) { CHAR_setInt(charaindex,CHAR_BASEIMAGENUMBER,busimg); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); // Robin debug 01/11/21 if( CHAR_getInt( charaindex, CHAR_RIDEPET) != -1 ) { CHAR_setInt( charaindex, CHAR_RIDEPET, -1); CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_RIDEPET); } /* CHAR_sendPMEToArroundCharacterFLXY(charaindex, CHAR_getInt( charaindex, CHAR_FLOOR), CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y), 0,1,CHAR_getInt( charaindex, CHAR_PETMAILEFFECT) ); */ } } } /* ¥×¥ì¥¤¥ä¡¼Ëô¤Ï¥Þ¥ó¥â¥¹¥Ð¥¹°Ê³°¤Ï »ë¤¹¤ë */ else { continue; } /* Áê¼ê¥Ñ¡¼ ¥£¤Î¿Í¿ô¤Ï ¤«¡ª */ parray = CHAR_getEmptyPartyArray( targetindex) ; if( parray == -1 ) continue; /* ¤³¤³¤Þ¤Ç¤¯¤ì¤Ð */ CONNECT_setJoinpartycharaindex( fd,cnt,toindex); cnt++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; /* ¥Þ¥ó¥â¥¹¥Ð¥¹ ¸«¤·¤À¤¤¡f¥ë¡¼¥×¤ò ¤±¤ë¡e */ if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) break; } if( cnt == 0 ) { if( found == TRUE) { CHAR_talkToCli( charaindex, -1, "µLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); } result = FALSE; }else if( cnt == 1 ) { #ifdef _DEATH_CONTEND int toindex = CONNECT_getJoinpartycharaindex( fd, 0); if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ }else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ CHAR_talkToCli( charaindex, -1, "¶¤¥î¤£¦P¡AµLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); result = FALSE; }else{ #endif CHAR_JoinParty_Main( charaindex, CONNECT_getJoinpartycharaindex(fd,0)); result = TRUE; #ifdef _DEATH_CONTEND } #endif }else { int strlength; char msgbuf[1024]; char escapebuf[2048]; #ifdef _DEATH_CONTEND int toindex = CONNECT_getJoinpartycharaindex( fd, 0); if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ }else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ CHAR_talkToCli( charaindex, -1, "¶¤¥î¤£¦P¡AµLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); result = FALSE; } #endif strcpy( msgbuf, "1\n©M½Ö²Õ¦¨¹Î¶¤©O¡H\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getJoinpartycharaindex( fd,i ) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getJoinpartycharaindex(fd,i) , CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%dµøµ¡°T®§buffer¤£¨¬¡C\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTPARTY, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); } if( result != -1 ) { lssproto_PR_send( fd, 1, result); } return result; }
/** まわりに何かが起こったときに呼ばれる*/ void NPC_TimeManWatch( int meobjindex, int objindex, CHAR_ACTION act, int x,int y,int dir, int* opt,int optlen ) { int meindex=0; int index; LSTIME nowlstime; int born; int dead; if( OBJECT_getType( objindex) != OBJTYPE_CHARA) return; index = OBJECT_getIndex( objindex); /* プレイヤーにのみ反応する */ if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return; meindex = OBJECT_getIndex( meobjindex); born = CHAR_getWorkInt( meindex , E_INT_BORN ); dead = CHAR_getWorkInt( meindex , E_INT_DEAD ); // print("now_hour=%d",nowlstime.hour); /* 時間を見て状態を決める */ if(born < dead){ RealTimeToLSTime( NowTime.tv_sec, &nowlstime); if( (born < nowlstime.hour) && (dead > nowlstime.hour) ){ if(CHAR_getWorkInt(meindex,E_INT_NOWGRAPHIC) ==CHAR_getWorkInt( meindex, E_INT_GRAPHIC)) return; CHAR_setInt(meindex,CHAR_BASEIMAGENUMBER, CHAR_getWorkInt( meindex, E_INT_GRAPHIC)); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) ); CHAR_setWorkInt(meindex,E_INT_MODE,0); CHAR_setWorkInt(meindex,E_INT_NOWGRAPHIC, CHAR_getInt(meindex,CHAR_BASEIMAGENUMBER)); }else{ /*-消えている--*/ if(CHAR_getWorkInt(meindex,E_INT_NOWGRAPHIC) ==CHAR_getWorkInt( meindex, E_INT_GRAPHIC2)) return; CHAR_setInt(meindex,CHAR_BASEIMAGENUMBER, CHAR_getWorkInt( meindex, E_INT_GRAPHIC2)); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) ); CHAR_setWorkInt(meindex,E_INT_MODE,1); CHAR_setWorkInt(meindex,E_INT_NOWGRAPHIC, CHAR_getInt(meindex,CHAR_BASEIMAGENUMBER)); } }else{ RealTimeToLSTime( NowTime.tv_sec, &nowlstime); if( (born < nowlstime.hour && 1024 > nowlstime.hour) || ( 0 < nowlstime.hour && dead > nowlstime.hour) ){ if(CHAR_getWorkInt(meindex,E_INT_NOWGRAPHIC) ==CHAR_getWorkInt( meindex, E_INT_GRAPHIC)) return; CHAR_setInt(meindex,CHAR_BASEIMAGENUMBER, CHAR_getWorkInt( meindex, E_INT_GRAPHIC)); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) ); CHAR_setWorkInt(meindex,E_INT_MODE,0); CHAR_setWorkInt(meindex,E_INT_NOWGRAPHIC, CHAR_getInt(meindex,CHAR_BASEIMAGENUMBER)); }else{ if(CHAR_getWorkInt(meindex,E_INT_NOWGRAPHIC) ==CHAR_getWorkInt( meindex, E_INT_GRAPHIC2)) return; CHAR_setInt(meindex,CHAR_BASEIMAGENUMBER, CHAR_getWorkInt( meindex, E_INT_GRAPHIC2)); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX ) ); CHAR_setWorkInt(meindex,E_INT_MODE,1); CHAR_setWorkInt(meindex,E_INT_NOWGRAPHIC, CHAR_getInt(meindex,CHAR_BASEIMAGENUMBER)); } } }
int NPC_RealyCheack(int meindex,int talker) { int fl, x, y; int i, j; int px[10] = {0, 1, 0,-1, 1,-1, 1, 0,-1}; int py[10] = {0,-1,-1,-1, 0, 0, 1, 1, 1}; int objindex; OBJECT object; int talkerindex; BOOL okflg = FALSE; struct pl PLAYER; int *pl_ptr; int point; fl = CHAR_getInt( meindex, CHAR_FLOOR); for(j = 0 ; j < MEPLAYER ; j++) { point = CHAR_getWorkInt( meindex, CHAR_WORK_PLAYER1 + j); okflg = FALSE; if(point == -1) continue; /*--▓Є┼·╝╘╚╓╣цдЄ╞└ды--*/ pl_ptr = (int *)point; memcpy(&PLAYER, pl_ptr, sizeof(struct pl)); talkerindex = PLAYER.talkerindex; for(i=0 ; i < 10 ; i++) { x = px[i] + CHAR_getInt( meindex, CHAR_X); y = py[i] + CHAR_getInt( meindex, CHAR_Y); for(object = MAP_getTopObj(fl,x,y) ; object; object = NEXT_OBJECT( object)) { objindex = GET_OBJINDEX( object); if( OBJECT_getType( objindex) == OBJTYPE_CHARA ){ if( OBJECT_getIndex( objindex) == talkerindex) { if(talkerindex == talker) { okflg = TRUE; // print("\n %s %d╢}йё",CHAR_getChar(talker,CHAR_NAME),(int)PLAYER.ptr); free(PLAYER.ptr); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER1 + j,-1); }else{ okflg = TRUE; } break; } } } if(okflg == TRUE) break; } if(okflg ==FALSE){ // print("\n %s %d╢}йё",CHAR_getChar(talker,CHAR_NAME),(int)PLAYER.ptr); free(PLAYER.ptr); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER1 + j,-1); } } return -1; }
BOOL ADDRESSBOOK_addEntry( int meindex ) { int objbuf[20]; int found_count; int front_x , front_y; int i; int cnt = 0; int fd; char *mycd , *tocd; BOOL found = FALSE; if( !CHAR_CHECKINDEX( meindex ) )return FALSE; fd = getfdFromCharaIndex( meindex); if( fd == -1 ) return FALSE; if( ADDRESSBOOK_findBlankEntry( meindex ) < 0) { CHAR_talkToCli( meindex , -1,ADDRESSBOOK_MYTABLEFULL,CHAR_COLORWHITE ); return FALSE; } for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setTradecardcharaindex( fd,i,-1); } CHAR_getCoordinationDir( CHAR_getInt( meindex, CHAR_DIR ) , CHAR_getInt( meindex , CHAR_X ), CHAR_getInt( meindex , CHAR_Y ) , 1 , &front_x , &front_y ); found_count = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf), CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y ); if( found_count == 0 ){ CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); return FALSE; } for( i = 0 ; i < found_count; i++ ){ int objindex = objbuf[i]; int index = OBJECT_getIndex( objindex); if( OBJECT_getType(objindex) != OBJTYPE_CHARA ) { continue; } if( CHAR_getInt( index,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){ continue; } if( index == meindex ) { continue; } found = TRUE; if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) { continue; } if(!CHAR_getFlg( index, CHAR_ISTRADECARD)) { continue; } if( ADDRESSBOOK_findBlankEntry( index ) < 0 ) { continue; } tocd = CHAR_getChar( index, CHAR_CDKEY); mycd = CHAR_getChar( meindex, CHAR_CDKEY); if( ADDRESSBOOK_getIndexInAddressbook( meindex, tocd, CHAR_getChar( index, CHAR_NAME)) >= 0 && ADDRESSBOOK_getIndexInAddressbook( index, mycd, CHAR_getChar(meindex, CHAR_NAME) ) >= 0 ) { continue; } CONNECT_setTradecardcharaindex( fd,cnt,index); cnt ++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; } if( cnt == 0 ) { if( found ) { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD2, CHAR_COLORWHITE); }else { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); } return FALSE; } if( cnt == 1 ) { ADDRESSBOOK_addAddressBook( meindex, CONNECT_getTradecardcharaindex(fd,0) ); return TRUE; }else if( cnt > 1 ) { int strlength; char msgbuf[1024]; char escapebuf[2048]; strcpy( msgbuf, "1\n©M½Ö¥æ´«¦W¤ù©O¡H\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getTradecardcharaindex(fd,i) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getTradecardcharaindex(fd,i), CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%dµøµ¡°T®§buffer¤£¨¬¡C\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTTRADECARD, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); return TRUE; } return FALSE; }
static void CHAR_clairvoyance( int charaindex ) { char onebuf[128]; int stringlen=0; int clairvoyancelevel; int centerx,centery,fl; int i,j; BOOL sendclairvoyance=FALSE; #define CHAR_CLAIRVOYANCEWIDTH 81 BOOL (*clairvoyancefunc[])(int,char*) = { CHAR_clairvoyance_gold, CHAR_clairvoyance_item, CHAR_clairvoyance_player, CHAR_clairvoyance_enemy, }; if( CHAR_getWorkInt( charaindex, CHAR_WORKLOOPSTARTSEC)%10 != 0 ) return; clairvoyancelevel = CHAR_getInt(charaindex,CHAR_RADARSTRENGTH ); if( clairvoyancelevel <= 0 )return; if( clairvoyancelevel > arraysizeof( clairvoyancefunc ) ) clairvoyancelevel = arraysizeof( clairvoyancefunc ); centerx = CHAR_getInt(charaindex,CHAR_X); centery = CHAR_getInt(charaindex,CHAR_Y); fl = CHAR_getInt(charaindex,CHAR_FLOOR); for( i = centerx - CHAR_CLAIRVOYANCEWIDTH/2 ; i < centerx + CHAR_CLAIRVOYANCEWIDTH/2 ; i ++ ) { for( j = centery - CHAR_CLAIRVOYANCEWIDTH/2 ; j < centery + CHAR_CLAIRVOYANCEWIDTH/2 ; j ++ ) { OBJECT object; for( object = MAP_getTopObj(fl,i,j) ; object ; object = NEXT_OBJECT( object ) ) { int objindex = GET_OBJINDEX(object); int loop; if( OBJECT_getType(objindex) == OBJTYPE_NOUSE )continue; if( OBJECT_getType(objindex) == OBJTYPE_CHARA && OBJECT_getIndex(objindex) == charaindex) continue; for( loop = 0 ; loop < clairvoyancelevel ; loop ++ ) { BOOL ret; char id; ret = clairvoyancefunc[loop](objindex,&id); if( ret == TRUE ) { sendclairvoyance=TRUE; snprintf( onebuf,sizeof(onebuf), "%d|%d|%c|",i,j,id ); strcpysafe( CHAR_clairvoyanceString + stringlen, sizeof(CHAR_clairvoyanceString) - stringlen, onebuf); stringlen += strlen(onebuf); if( stringlen > sizeof(CHAR_clairvoyanceString) ) goto RETURN; } } } } } RETURN: if( stringlen >= 1 ) { int fd; fd = getfdFromCharaIndex( charaindex ); dchop( CHAR_clairvoyanceString, "|" ); if( fd != -1 ) lssproto_R_send( fd, CHAR_clairvoyanceString ); } else if( !sendclairvoyance ) { int fd; fd = getfdFromCharaIndex( charaindex ); if( fd != -1 ) lssproto_R_send( fd, "" ); } }
void CHAR_Talk(int fd, int index, char *message, int color, int area) { char firstToken[64]; char messageeraseescape[512]; char *messagebody; int mesgvolume = 0; int lastvolume = 0; int fl, x, y; int stringlen; int micflg = 0; int fmindexi = CHAR_getWorkInt(index, CHAR_WORKFMINDEXI); int channel = CHAR_getWorkInt(index, CHAR_WORKFMCHANNEL); int quickchannel = CHAR_getWorkInt(index, CHAR_WORKFMCHANNELQUICK); { char *cdkey = CHAR_getChar(index, CHAR_CDKEY); char *charname = CHAR_getChar(index, CHAR_NAME); if(strlen(message) > 3) { if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE) { // shan begin if(strstr(message, "[") && strstr(message, "]")) { } else { // original LogTalk(charname, cdkey, CHAR_getInt(index, CHAR_FLOOR), CHAR_getInt(index, CHAR_X), CHAR_getInt(index, CHAR_Y), message); } // end } } } //bg|0|r0|fc|d4B8|p0|bn|10|bt|10| // Nuke +1 08/27: For invalid message attack if(*message == 0) return; CHAR_getMessageBody(message, firstToken, sizeof(firstToken), &messagebody); // Nuke +1: For invalid message attack if(!messagebody) return; strcpysafe(messageeraseescape, sizeof(messageeraseescape), messagebody); makeStringFromEscaped(messageeraseescape); stringlen = strlen(messageeraseescape); if(stringlen <= 0) return; if(messageeraseescape[0] == '[' && messageeraseescape[stringlen - 1] == ']') { char gm[128]; char *pass = strstr(messageeraseescape + 1, getChatMagicPasswd()); // Arminius: limit ip +2 char* ip = CONNECT_get_userip(fd); messageeraseescape[stringlen - 1] = '\0'; // Arminius: limit ip if(pass == messageeraseescape + 1) { if(CHAR_useChatMagic(index, messageeraseescape + 1 + strlen(getChatMagicPasswd()) + 1, TRUE)) { print("\n账号:%s 名字:%s\n来自ip:%s\n使用GM命令%s]\n", CHAR_getChar(index, CHAR_CDKEY), CHAR_getChar(index, CHAR_NAME), ip, messageeraseescape); sprintf(gm, "您使用GM命令%s]已成功", messageeraseescape); CHAR_talkToCli(index, -1, gm, CHAR_COLORYELLOW); } } else { if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE) { if(CHAR_useChatMagic(index, messageeraseescape + 1, TRUE)) { print("\n账号:%s 名字:%s\n来自ip:%s\n使用GM命令%s]\n", CHAR_getChar(index, CHAR_CDKEY), CHAR_getChar(index, CHAR_NAME), ip, messageeraseescape); sprintf(gm, "您使用GM命令%s]已成功", messageeraseescape); CHAR_talkToCli(index, -1, gm, CHAR_COLORYELLOW); } } else { #ifdef _GM_ITEM if(CHAR_getInt( index, CHAR_GMTIME)>0){ char magicname[32]; char token[64]; getStringFromIndexWithDelim( messageeraseescape + 1, " ", 1, magicname, sizeof( magicname)); if(!strcmp( CHAR_getChar( index, CHAR_GMFUNCTION), magicname)){ player_useChatMagic( index,messageeraseescape + 1,TRUE); print( "\n账号:%s 名字:%s\n来自ip:%d.%d.%d.%d\n使用物品命令%s]次数剩下%d\n", CHAR_getChar( index, CHAR_CDKEY), CHAR_getChar( index, CHAR_NAME), a, b, c, d,messageeraseescape, CHAR_getInt( index, CHAR_GMTIME) - 1); CHAR_setInt( index , CHAR_GMTIME, CHAR_getInt( index, CHAR_GMTIME) - 1 ); if(CHAR_getInt( index, CHAR_GMTIME) > 0){ sprintf( token, "你还能使用%s权限%d次!", CHAR_getChar( index, CHAR_GMFUNCTION),CHAR_getInt( index, CHAR_GMTIME)); CHAR_talkToCli( index, -1,token, CHAR_COLORRED ); }else{ sprintf( token, "你已经没有使用%s权限了!", CHAR_getChar( index, CHAR_GMFUNCTION)); CHAR_talkToCli( index, -1,token, CHAR_COLORRED ); } }else if(!strcmp( "help", magicname) || !strcmp( "帮助", magicname)){ getStringFromIndexWithDelim( messageeraseescape + 1, " ", 2, magicname, sizeof( magicname)); if(!strcmp( CHAR_getChar( index, CHAR_GMFUNCTION), magicname)){ player_useChatMagic( index,messageeraseescape + 1,TRUE); print( "\n账号:%s 名字:%s\n来自ip:%d.%d.%d.%d\n使用帮助命令%s]\n", CHAR_getChar( index, CHAR_CDKEY), CHAR_getChar( index, CHAR_NAME), a, b, c, d,messageeraseescape); } } }else #endif CHAR_useChatMagic(index, messageeraseescape + 1, FALSE); } } messageeraseescape[stringlen - 1] = ']'; return; } else { if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_DEBUGMODE) { if(strstr(messageeraseescape, "[") != NULL || strstr(messageeraseescape, "]") != NULL) { return; } } } #ifdef _PLAYER_MOVE if(getPMove() != -1) { if(messageeraseescape[0] == '/' && messageeraseescape[1] == 'g' && messageeraseescape[2] == 'o') { int point = CHAR_getInt(index, CHAR_AMPOINT); if(point > getPMove() || getPMove() == 0) { char x[4], y[4]; easyGetTokenFromString(messageeraseescape, 2, x, sizeof(x)); easyGetTokenFromString(messageeraseescape, 3, y, sizeof(y)); CHAR_warpToSpecificPoint(index, CHAR_getInt(index, CHAR_FLOOR), atoi(x), atoi(y)); CHAR_setInt(index, CHAR_AMPOINT, point - getPMove()); } else CHAR_talkToCli(index, -1, "你已经没有足够的会员点数顺移了!", CHAR_COLORRED); return; } } #endif #ifdef _PLAYER_ANNOUNCE if(getPAnnounce() != -1) { if(messageeraseescape[0] == '/' && messageeraseescape[1] == 'g' && messageeraseescape[2] == 'g') { int point = CHAR_getInt(index, CHAR_AMPOINT); if(point > getPAnnounce() || getPAnnounce() == 0) { int i; int playernum = CHAR_getPlayerMaxNum(); char buff[255]; char xlbmsg[255]; char *MyName = CHAR_getChar(index, CHAR_NAME); easyGetTokenFromString(messageeraseescape, 2, buff, sizeof(buff)); for(i = 0; i < playernum; i++) { if(CHAR_getCharUse(i) != FALSE) sprintf(xlbmsg, "<小喇叭>%s说:%s", MyName, buff); CHAR_talkToCli(i, -1, xlbmsg, CHAR_COLORGREEN); } CHAR_setInt(index, CHAR_AMPOINT, point - getPAnnounce()); } else CHAR_talkToCli(index, -1, "你已经没有足够的会员点数小喇叭了!", CHAR_COLORRED); return; } } #endif #ifdef _TALK_ACTION TalkAction(index, messageeraseescape); #endif mesgvolume = CHAR_getVolume(messageeraseescape); if(area == 0) area = 3; if(mesgvolume == -1) lastvolume = -1; else lastvolume = area - 1 + mesgvolume; if(CHAR_getWorkInt(index, CHAR_WORKFLG) & WORKFLG_MICMODE) { lastvolume = 15; micflg = 1; } fl = CHAR_getInt(index, CHAR_FLOOR); x = CHAR_getInt(index, CHAR_X); y = CHAR_getInt(index, CHAR_Y); // Robin 0705 channel if(messageeraseescape[0] == ':') { if((channel == -1) && (quickchannel != -1)) channel = quickchannel; else if(channel != -1) channel = -1; } { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(index, CHAR_TALKEDFUNC); if(talkedfunc) { talkedfunc(index, index, messageeraseescape, color, channel); } } if(lastvolume == -1) { int j; int xx[2] = {x, x + CHAR_getDX(CHAR_getInt(index, CHAR_DIR))}; int yy[2] = {y, y + CHAR_getDY(CHAR_getInt(index, CHAR_DIR))}; int talk = FALSE; for(j = 0; j < 2; j++) { OBJECT object; for(object = MAP_getTopObj(fl, xx[j], yy[j]); object; object = NEXT_OBJECT(object)) { int objindex = GET_OBJINDEX(object); int toindex = OBJECT_getIndex(objindex); if(OBJECT_getType(objindex) == OBJTYPE_CHARA && toindex != index) { if(CHAR_Talk_check(index, toindex, 0)) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(toindex, CHAR_TALKEDFUNC); if(talkedfunc) { talkedfunc(toindex, index, messageeraseescape, color, -1); } if(CHAR_getInt(toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { talk = TRUE; } } } } } if(talk)CHAR_setInt(index, CHAR_TALKCOUNT, CHAR_getInt(index, CHAR_TALKCOUNT) + 1); } else { int range = CHAR_getRangeFromVolume(lastvolume); int i, j; int talk = FALSE; int channelTalk = FALSE; int partyindex[CHAR_PARTYMAX]; for(i = 0; i < CHAR_PARTYMAX; i++) { partyindex[i] = -1; } if(CHAR_getWorkInt(index, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) { for(i = 0; i < CHAR_PARTYMAX; i++) { int toindex = CHAR_getPartyIndex(index, i); if(CHAR_CHECKINDEX(toindex) && toindex != index) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(toindex, CHAR_TALKEDFUNC); if(talkedfunc) talkedfunc(toindex, index, messageeraseescape, color, -1); talk = TRUE; partyindex[i] = toindex; } } } if(channel > -1 && fmindexi >= 0) { int i, tindex; channelTalk = TRUE; i = 0; #ifdef _FMVER21 if(channel == FAMILY_MAXCHANNEL && CHAR_getInt(index, CHAR_FMLEADERFLAG) == FMMEMBER_LEADER) #else if( channel == FAMILY_MAXCHANNEL && CHAR_getInt( index, CHAR_FMLEADERFLAG ) == 1) #endif { char buf[512]; sprintf(buf, "[族长广播]%s: %s", CHAR_getChar(index, CHAR_NAME), messageeraseescape); saacproto_ACFMAnnounce_send(acfd, CHAR_getChar(index, CHAR_FMNAME), CHAR_getInt(index, CHAR_FMINDEX), CHAR_getWorkInt(index, CHAR_WORKFMINDEXI), buf, color ); return; } else for(i = 0; i < FAMILY_MAXMEMBER; i++) { tindex = channelMember[fmindexi][channel][i]; if(!CHAR_CHECKINDEX(tindex)) continue; if(tindex >= 0 && tindex != index) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(tindex, CHAR_TALKEDFUNC); if(talkedfunc) talkedfunc(tindex, index, messageeraseescape, color, channel); } } talk = TRUE; } else { for(i = x - range / 2; i <= x + range / 2; i++) { for(j = y - range / 2; j <= y + range / 2; j++) { OBJECT object; for(object = MAP_getTopObj(fl, i, j); object; object = NEXT_OBJECT(object)) { int objindex = GET_OBJINDEX(object); int toindex = OBJECT_getIndex(objindex); if(OBJECT_getType(objindex) == OBJTYPE_CHARA && toindex != index) { int k; for(k = 0; k < CHAR_PARTYMAX; k++) { if(toindex == partyindex[k]) { break; } } if(k != CHAR_PARTYMAX) continue; if(CHAR_Talk_check(index, toindex, micflg)) { typedef void (*TALKF)(int, int, char *, int, int); TALKF talkedfunc = NULL; talkedfunc = (TALKF) CHAR_getFunctionPointer(toindex, CHAR_TALKEDFUNC); if(talkedfunc) { talkedfunc(toindex, index, messageeraseescape, color, -1); } if(CHAR_getInt(toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { talk = TRUE; } } } } } } } if(talk) { CHAR_setInt(index, CHAR_TALKCOUNT, CHAR_getInt(index, CHAR_TALKCOUNT) + 1); } if(CHAR_getInt(index, CHAR_POPUPNAMECOLOR) != color) { CHAR_setInt(index, CHAR_POPUPNAMECOLOR, color); if(talk) { int opt[1]; opt[0] = color; CHAR_sendWatchEvent(CHAR_getWorkInt(index, CHAR_WORKOBJINDEX), CHAR_ACTPOPUPNAME, opt, 1, FALSE); } } } }
/*------------------------------------------------------------ * 啖 允月[ * 娄醒 * index int 平乓仿及奶件犯永弁旦 * dir int 轾 * 忒曰袄 * CHAR_WALKRET ------------------------------------------------------------*/ static CHAR_WALKRET CHAR_walk_move( int charaindex, int dir ) { int i; int fx,fy,ff; int ox,oy,of; int objbuf[128]; int objbufindex=0; int notover=FALSE; int retvalue=CHAR_WALKSUCCESSED; if( !CHAR_CHECKINDEX( charaindex )) return CHAR_WALKSYSTEMERROR; ox = CHAR_getInt(charaindex,CHAR_X); oy = CHAR_getInt(charaindex,CHAR_Y); of = CHAR_getInt(charaindex,CHAR_FLOOR); CHAR_getCoordinationDir( dir,ox,oy,1,&fx,&fy); ff = of; if( CHAR_getInt( charaindex,CHAR_WHICHTYPE ) == CHAR_TYPEENEMY ){ RECT walkr; POINT nextp; int npccreateindex; npccreateindex = CHAR_getInt( charaindex,CHAR_NPCCREATEINDEX ); if( CHAR_isInvincibleArea( ff,fx,fy)) { CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKEXTEND; goto CHAR_AFTERWALK; } if( NPC_isBoundarySet( npccreateindex ) && NPC_createGetRECT( npccreateindex,&walkr ) == TRUE ) { nextp.x = fx; nextp.y = fy; if( PointInRect( &walkr,&nextp ) == FALSE ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKEXTEND; goto CHAR_AFTERWALK; } }else{ ; } } if( CHAR_getFlg( charaindex, CHAR_ISBIG ) == 1 ){ static POINT offset[5]={ { 0,-1}, {-1, 0}, { 0, 0}, { 1, 0}, { 0, 1}, }; int k; for( k=0 ; k<5; k++ ){ if( !MAP_walkAble( charaindex, ff, fx+offset[k].x, fy+offset[k].y )){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } } }else{ if( CHAR_getDX(dir)*CHAR_getDY(dir) == 0 ){ if( !MAP_walkAble( charaindex,ff, fx, fy ) ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } }else{ int xflg,yflg; if( !MAP_walkAble( charaindex,ff, fx, fy ) ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } xflg = MAP_walkAble( charaindex,of, ox+CHAR_getDX(dir), oy ); yflg = MAP_walkAble( charaindex,of, ox, oy+CHAR_getDY(dir) ); if( !xflg || !yflg ) { CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } } } objbufindex = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf ), ff,fx,fy ); for( i = 0 ; i < objbufindex ; i ++ ){ int objindex= objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: if( !CHAR_getFlg( OBJECT_getIndex(objindex),CHAR_ISOVERED) ){ if(!CHAR_CHECKINDEX(OBJECT_getIndex(objindex))){ printf("自动删除一个问题对象!"); endObjectOne(objindex); break; } notover= TRUE; } break; case OBJTYPE_ITEM: if( !ITEM_getInt( OBJECT_getIndex(objindex), ITEM_ISOVERED ) ) notover= TRUE; break; case OBJTYPE_GOLD: break; default: break; } } if( notover == TRUE ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKHITOBJECT; }else{ for( i = 0 ; i < objbufindex ; i ++ ){ typedef void (*PREOFUNC)(int,int); PREOFUNC pfunc=NULL; int objindex=objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (PREOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_PREOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (PREOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_PREOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex ); } CHAR_setInt(charaindex,CHAR_X,fx); CHAR_setInt(charaindex,CHAR_Y,fy); CHAR_setInt(charaindex,CHAR_FLOOR,ff); CHAR_setInt(charaindex,CHAR_DIR,dir); { int objindex; int ox,oy,of; objindex = CHAR_getWorkInt( charaindex,CHAR_WORKOBJINDEX ); of = OBJECT_setFloor(objindex, CHAR_getInt(charaindex,CHAR_FLOOR)); ox = OBJECT_setX(objindex,CHAR_getInt(charaindex,CHAR_X)); oy = OBJECT_setY(objindex,CHAR_getInt(charaindex,CHAR_Y)); if( !MAP_objmove( objindex, of,ox,oy,ff,fx,fy ) ){ /* 仇氏卅氏升丹仄方丹手卅中 */ fprint( "ERROR MAP_OBJMOVE objindex=%d(%s)\n",objindex, CHAR_getUseName( charaindex ) ); } } CHAR_setInt(charaindex,CHAR_WALKCOUNT, CHAR_getInt(charaindex,CHAR_WALKCOUNT) + 1 ); for( i = 0 ; i < objbufindex ; i ++ ){ typedef void (*POSTOFUNC)(int,int); POSTOFUNC pfunc=NULL; int objindex=objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (POSTOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_POSTOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (POSTOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_POSTOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex ); } objbufindex = CHAR_getSameCoordinateObjects(objbuf, arraysizeof(objbuf), of, ox, oy ); for( i=0 ;i<objbufindex;i++){ typedef void (*OFFFUNC)(int,int); OFFFUNC ofunc=NULL; int objindex = objbuf[i]; switch( OBJECT_getType( objindex ) ){ case OBJTYPE_CHARA: ofunc = (OFFFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_OFFFUNC); break; case OBJTYPE_ITEM: /* 卞窒手仄卅中 */ break; case OBJTYPE_GOLD: /* 卞窒手仄卅中 */ break; default: break; } if( ofunc )ofunc( OBJECT_getIndex(objindex), charaindex ); } } CHAR_AFTERWALK: if( retvalue == CHAR_WALK1357 || retvalue == CHAR_WALKHITOBJECT ){ { int opt[2] = { ox, oy}; CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWALK,opt,2,TRUE ); } CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, ""); if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWARP,NULL,0,TRUE); } }else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ BOOL flg = FALSE; int par; int count; CHAR_setWorkInt( charaindex, CHAR_WORKACTION, -1 ); if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){ CHAR_sendCharaAtWalk( charaindex, of,ox,oy,CHAR_getDX(dir), CHAR_getDY(dir)); } { int opt[2] = { ox, oy}; CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWALK,opt,2,TRUE ); } if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { CHAR_sendMapAtWalk( charaindex, of, ox,oy, CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y)); } count = CHAR_getWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT); if( count > 0 ) { CHAR_setWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT, count -1); if( count -1 == 0 ) { CHAR_talkToCli( charaindex, -1, "道具的效力已到。", CHAR_COLORWHITE); } } par = ENCOUNT_getEncountPercentMin( charaindex, of,ox,oy); if( par != -1 ) { if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN) != par ){ flg = TRUE; CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN, par); } } par = ENCOUNT_getEncountPercentMax( charaindex, of,ox,oy); if( par != -1 ) { if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX) != par ){ flg = TRUE; CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX, par); } } // Arminius 7.12 login announce /* { int enfd = getfdFromCharaIndex( charaindex ); if (CONNECT_get_announced(enfd)==0) { // Robin 0720 //AnnounceToPlayer(charaindex); AnnounceToPlayerWN( enfd ); CONNECT_set_announced(enfd,1); } } */ // Arminius 6.22 check Encounter // Nuke 0622: Provide No Enemy function { int enfd = getfdFromCharaIndex( charaindex ); int eqen = getEqNoenemy( enfd ); // Arminius 7.2: Ra's amulet int noen = getNoenemy(enfd); // Arminius 7.31 cursed stone if (getStayEncount(enfd)>0) { clearStayEncount(enfd); } //print("\n enfd=%d,eqen=%d,noen=%d", enfd, eqen, noen); // Arminius 7.2 Ra's amulet if (eqen>=200) { noen=1; } else if (eqen>=120) { if ((ff==100)||(ff==200)||(ff==300)||(ff==400)||(ff==500)) noen=1; } else if (eqen>=80) { if ((ff==100)||(ff==200)||(ff==300)||(ff==400)) noen=1; } else if (eqen>=40) { if ((ff==100)||(ff==200)) noen=1; } //print("\n noen=%d", noen); if (noen==0) { int maxep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX); int minep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN); int cep = CONNECT_get_CEP(enfd); if (cep<minep) cep=minep; if (cep>maxep) cep=maxep; if (CHAR_getWorkInt(charaindex,CHAR_WORKBATTLEMODE)==BATTLE_CHARMODE_NONE) { int entflag=1; { int objindex,index; OBJECT obj; for ( obj = MAP_getTopObj( ff, fx, fy); obj; obj = NEXT_OBJECT( obj)) { objindex = GET_OBJINDEX( obj); if (OBJECT_getType( objindex) == OBJTYPE_CHARA) { int etype; index = OBJECT_getIndex( objindex); if (!CHAR_CHECKINDEX( index)) continue; if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPENPCENEMY && CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) == CHAR_EVENT_ENEMY ) { CHAR_setInt( charaindex, CHAR_X, ox); CHAR_setInt( charaindex, CHAR_Y, oy); lssproto_XYD_send( getfdFromCharaIndex(charaindex), CHAR_getInt( charaindex, CHAR_X ), CHAR_getInt( charaindex, CHAR_Y ), CHAR_getInt( charaindex, CHAR_DIR ) ); break; } etype = CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE); if (etype!=CHAR_EVENT_NONE) { if (etype==CHAR_EVENT_WARP) entflag=0; } } } } #ifdef _ENEMY_ACTION if( rand()%(120*getEnemyAction()) < cep ){ #else if (rand()%120<cep){ // Arminius 6.28 lower encounter prob. #endif if (entflag) { #ifdef _Item_MoonAct if( getEqRandenemy( enfd) > 0 ) { int Rnum=0; int RandEnemy = getEqRandenemy( enfd); Rnum = RAND(0,100); if( Rnum > RandEnemy ) { #endif //encounter!! cep = minep; lssproto_EN_recv(enfd, CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y)); #ifdef _Item_MoonAct } }else{ cep = minep; lssproto_EN_recv(enfd, CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y)); } #endif } } else { if (cep<maxep) cep++; } } CONNECT_set_CEP(enfd, cep); } } if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE )!= CHAR_PARTY_CLIENT ){ CHAR_setFlg( charaindex, CHAR_ISWARP, 0); } } else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ||
/*------------------------------------------------------------ * ³Ä뵤ÐÄ·ÖÔÊèëô÷ëè£ÀÃÔÊÔ * ¦ÐÑ * cr NPC_Create* Õç ¼°ã໥è£ÔÈ»¯ÖÐÔÂNPC_Create¼°ºÌÄ̼þÕý * nobody int 1 ¼°ÁÝ·´²¾ÊÖÖÐئÖÐÁݱ年ÈÊÔ * (²¾¾®Öл¯ÊÖ×ÛÔÂ) * 0 ¼°ÁÝ·´²¾ÊÖÖÐئÖÐÁÝ·´×ÛÈÕئÖÐ£Û * (²¾¾®ÖÐÐ×Áݼ°ÐÄ×ÛÔÂ) * nosee int 1 ¼°ÁÝ·´ÃóÒÁÄÌØÀ¡õ¼°÷»îμ° Æ¥ÊÖ×ÛÔÂ£Û * 0 ¼°ÁÝ·´ÃóÒÁÄÌØÀ¡õ¼°÷»îμ°Â½Æ¥×ÛÔÂ£Û * point NPC_searchPoint* ÇëòؽñÁùÔÂèëô÷ëҽ ÔÊÔ * isflying BOOL ÊÏÆ¥ÖÐÔ¾®Éýµ¤¾®£Û ÊÏÆ¥ÖÐÔÂئÈÕ TRUE Æ¥ * ÇëòØÞË Êϼ°¼°Ñ¨ÓÀÃóÎç¼°ñ²Ô» Àà * ëØÆئÈÊئÔ * ߯Ի°À * ×ÛľÔÂÁÝ·´ TRUE * ×ÛľئÖÐÁÝ·´ FALSE ------------------------------------------------------------*/ static BOOL NPC_searchCreatePoint( NPC_Create* cr,int nobody,int nosee, NPC_searchPoint* point, BOOL isflying ) { int floor=cr->intdata[NPC_CREATEFLOORID]; int x = cr->intdata[NPC_CREATEBORNLEFTUPX]; int y = cr->intdata[NPC_CREATEBORNLEFTUPY]; int width; int height; int area; int loop; BOOL ret = FALSE; int i, j; width = cr->intdata[NPC_CREATEBORNRIGHTDOWNX] - cr->intdata[NPC_CREATEBORNLEFTUPX] + 1; height = cr->intdata[NPC_CREATEBORNRIGHTDOWNY] - cr->intdata[NPC_CREATEBORNLEFTUPY] + 1; area = width * height; if( nobody == 0 && all_nobody == 0 ) { BOOL found = FALSE; for( i = x ; i <= x +width && found == FALSE; i ++ ) { for( j = y; j <= y + height && found == FALSE; j ++ ) { OBJECT object; for( object = MAP_getTopObj( floor, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { found = TRUE; break; } } } } } if( found == FALSE ) { return( FALSE); } } for( loop=0 ; loop<NPC_CREATECHALLENGETIME ; loop++ ){ int startpoint; int crx; int cry; startpoint = RAND(0,area-1); if( width == 0 ){ return FALSE; }else{ /* Õç 裻§½åÇÐئ¼°Æ¥ */ crx = startpoint%width + x; cry = startpoint/width + y; } if( cr->intdata[NPC_CREATEIGNOREINVINCIBLE] == 0 && CHAR_isInvincibleArea( floor,crx,cry ) ){ continue; } if( nosee == 0 && all_nosee == 0 ) { BOOL found = FALSE; for( i = crx - CHAR_DEFAULTSEESIZ/2 ; i <= crx +CHAR_DEFAULTSEESIZ/2 && found == FALSE ; i ++ ) { for( j = cry - CHAR_DEFAULTSEESIZ/2; j <= cry + CHAR_DEFAULTSEESIZ/2 && found == FALSE; j ++ ) { OBJECT object; for( object = MAP_getTopObj( floor, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ if( CHAR_getInt( OBJECT_getIndex(objindex), CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { found = TRUE; break; } } } } } if( found == TRUE ){ return FALSE; } } if( MAP_walkAbleFromPoint( floor,crx,cry,isflying ) == TRUE ){ point->floor = cr->intdata[NPC_CREATEFLOORID]; point->x = crx; point->y = cry; ret = TRUE; break; }else{ } } return( ret ); }
void CHAR_playerWatchfunc( int objmeindex, int objmoveindex, CHAR_ACTION act, int x, int y, int dir, int* opt, int optlen ) { int fd; int meindex; if( !CHECKOBJECTUSE(objmeindex) )return; if( !CHECKOBJECTUSE(objmoveindex))return; if( OBJECT_getType(objmeindex) != OBJTYPE_CHARA )return; meindex = OBJECT_getIndex(objmeindex); if( CHAR_getInt( meindex,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER )return; fd = getfdFromCharaIndex( meindex ); if( fd == -1 )return; switch( OBJECT_getType(objmoveindex) ) { case OBJTYPE_CHARA: { char buf[128]; if( !CHAR_getFlg( OBJECT_getIndex(objmoveindex),CHAR_ISVISIBLE) ) return; switch( act ) { case CHAR_ACTSTAND: case CHAR_ACTWALK: case CHAR_ACTATTACK: case CHAR_ACTDEAD: case CHAR_ACTMAGIC: case CHAR_ACTITEM: case CHAR_ACTDOWN: case CHAR_ACTSIT: case CHAR_ACTHAND: case CHAR_ACTPLEASURE: case CHAR_ACTANGRY: case CHAR_ACTSAD: case CHAR_ACTDAMAGE: case CHAR_ACTGUARD: case CHAR_ACTTURN: case CHAR_ACTWARP: case CHAR_ACTACTIONWALK: case CHAR_ACTNOD: case CHAR_ACTTHROW: case CHAR_ACTACTIONSTAND: if( CHAR_makeCADefaultString(objmoveindex,buf,sizeof(buf),act) ) { CONNECT_appendCAbuf( fd,buf,strlen(buf)); } break; // shan begin case CHAR_ACTTRADE: if( optlen == 1 ) if( CHAR_makeCAOPT1String( objmoveindex, buf, sizeof( buf), act, opt[0] ) ) CONNECT_appendCAbuf( fd, buf, strlen(buf)); break; // shan end #ifdef _MIND_ICON case CHAR_MIND: if( optlen == 1 ) if( CHAR_makeCAOPT1String( objmoveindex, buf, sizeof(buf), act, opt[0])) CONNECT_appendCAbuf( fd, buf, strlen(buf)); break; #endif #ifdef _ITEM_CRACKER case CHAR_ITEM_CRACKER: if( optlen == 1 ) if( CHAR_makeCAOPT1String( objmoveindex, buf, sizeof(buf), act, opt[0])) CONNECT_appendCAbuf( fd, buf, strlen(buf)); break; #endif case CHAR_ACTEFFECT: if( optlen == 1 ) if( CHAR_makeCAOPT1String(objmoveindex,buf, sizeof(buf),act,opt[0] ) ) CONNECT_appendCAbuf( fd,buf,strlen(buf)); break; case CHAR_ACTPOPUPNAME: case CHAR_ACTLEADER: case CHAR_ACTBATTLEWATCH: if( optlen == 1 ) if( CHAR_makeCAOPT1String(objmoveindex,buf, sizeof(buf),act,opt[0] ) ) CONNECT_appendCAbuf( fd,buf,strlen(buf)); break; case CHAR_ACTBATTLE: if( optlen == 3 ) if( CHAR_makeCAOPT3String( objmoveindex,buf, sizeof(buf), act,opt[0],opt[1],opt[2] ) ) CONNECT_appendCAbuf( fd,buf,strlen(buf)); break; default: break; } break; } case OBJTYPE_ITEM: case OBJTYPE_GOLD: CHAR_sendSpecifiedobjindexCToCharaindex(meindex,objmoveindex); break; default: break; } }
/*----------------------------------------------- * °ìÈÖ¤ª¶â¤ò¿¤¯»ý¤Ã¤Æ¤¤¤ë¥×¥ì¥¤¥ä¡¼¤òõ¤¹ *----------------------------------------------*/ static int NPC_RoomAdminNew_SearchPlayerHasMostMoney( int meindex) { int i,j, range; int fl,x,y, gold; int doorindex; int topindex; fl = CHAR_getInt( meindex, CHAR_FLOOR); x = CHAR_getInt( meindex, CHAR_X); y = CHAR_getInt( meindex, CHAR_Y); range = CHAR_getWorkInt( meindex , CHAR_WORKINT_RANGE); topindex = -1; /* Éô²°¤Î̾Á°¤«¤éºÇÄãÍ¶â³Û¤òÄ´¤Ù¤ë */ doorindex = NPC_DoorSearchByName( CHAR_getWorkChar( meindex, CHAR_WORKCHAR_NEXTROOM)); gold = atoi( CHAR_getWorkChar( doorindex, CHAR_WORKDOORGOLDLIMIT)); /* ÈÏ°ÏÆâ¤Ë¤¤¤ë¥¥ã¥é¤Î¿ô¤òÄ´¤Ù¤ë */ for( i = x-range ; i <= x+range ; i++ ){ for( j = y-range ; j <= y+range ; j ++ ){ OBJECT object; for( object = MAP_getTopObj( fl, i,j); object; object = NEXT_OBJECT(object) ) { int objindex = GET_OBJINDEX( object); if( OBJECT_getType(objindex) == OBJTYPE_CHARA ){ int index; index = OBJECT_getIndex(objindex); if( CHAR_getInt( index, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ) { if( CHAR_getInt( index, CHAR_GOLD) >= gold ) { if( topindex == -1 ) { topindex = index; } else { /* ¥È¥Ã¥×¤Î¿Í¤È¤ª¶âÈæ³Ó */ int nowgold,topgold; nowgold = CHAR_getInt( index, CHAR_GOLD ); topgold = CHAR_getInt( topindex, CHAR_GOLD); if( nowgold > topgold ) { topindex = index; } else if( nowgold == topgold ) { /* °ì½ï¤Ê¤é¥ì¥Ù¥ë¤¬Ä㤤¿Í */ int nowlv, toplv; nowlv = CHAR_getInt( index, CHAR_LV ); toplv = CHAR_getInt( topindex, CHAR_LV); if( nowlv < toplv ) { topindex = index; } /* ¤½¤ì¤Ç¤â²ò·è¤·¤Ê¤¤¤ó¤Ê¤é¥é¥ó¥À¥à¤¸¤ã*/ /* index¤¬Àè¤Î¿Í¤¬¤Á¤ç¤Ã¤ÈÉÔÍø¤À¤±¤É */ else if( nowlv == toplv ) { if( RAND( 0,1)) { topindex = index; } } } } } } } } } } return( topindex); }
void PET_Watchfunc( int objmeindex, int objmoveindex, CHAR_ACTION act, int x, int y, int dir, int* opt, int optlen ) { int pindex; int petindex; int petputtime; if( OBJECT_getType(objmoveindex) != OBJTYPE_CHARA ) return; pindex = OBJECT_getIndex( objmoveindex); if( CHAR_getInt( pindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) return; petindex = OBJECT_getIndex( objmeindex); petputtime = CHAR_getInt( petindex, CHAR_PUTPETTIME); if( CHAR_getInt( petindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE) { //宠邮不处理 }else if( CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWMODE) == CHAR_PETFOLLOW_NOW ){ if( NowTime.tv_sec >= (petputtime + 60*60) ) { int ownerindex = CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX); if( CHAR_CHECKINDEX( ownerindex) ){ if( CHAR_pickupFollowPet( ownerindex, petindex ) ) { return; } CHAR_talkToCli( ownerindex, -1, "溜宠太久,宠物走失了!!", CHAR_COLORYELLOW ); } #ifdef _PET_LOSTPET CHAR_CharSaveLostPet( petindex, 1); LogPet( "系统", "Watchfunc", CHAR_getChar( petindex, CHAR_NAME), CHAR_getInt( petindex, CHAR_LV), "timeout_lost(系统扣留-溜宠自由宠)", CHAR_getInt( petindex, CHAR_FLOOR), CHAR_getInt( petindex,CHAR_X ), CHAR_getInt( petindex,CHAR_Y ), CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14 ); print("系统扣留-溜宠自由宠:%s\n", CHAR_getUseName( petindex)); CHAR_CharaDelete( petindex); #else CHAR_setInt( petindex, CHAR_PUTPETTIME, NowTime.tv_sec); CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWMODE, CHAR_PETFOLLOW_NONE); LogPet( CHAR_getChar( pindex, CHAR_NAME ), CHAR_getChar( pindex, CHAR_CDKEY ), CHAR_getChar( petindex, CHAR_NAME), CHAR_getInt( petindex, CHAR_LV), "timeout_lost(溜宠太久,宠物走失))", CHAR_getInt( pindex,CHAR_FLOOR), CHAR_getInt( pindex,CHAR_X ), CHAR_getInt( pindex,CHAR_Y ), CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14 ); #endif return; } }else{ PET_CHECKFreePetIsIt( petindex); } if( CHAR_getInt( petindex, CHAR_MAILMODE) == CHAR_PETMAIL_IDLE3 || CHAR_getInt( petindex, CHAR_MAILMODE) == CHAR_PETMAIL_IDLE2){ if( act == CHAR_ACTATTACK) { if( NPC_Util_isFaceToChara( pindex,petindex,1 ) == TRUE ) { int action[2] = { CHAR_ACTDAMAGE, CHAR_ACTGUARD}; CHAR_sendWatchEvent( objmeindex, action[RAND(0,1)], NULL,0,FALSE); CHAR_setWorkInt( petindex, CHAR_WORKACTION, act); } } }else if( CHAR_getInt( petindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE) { ; }else if( CHAR_getWorkInt( petindex, CHAR_WORKFIXAI) >= 100 ) { int workpindex = CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX); if( act == CHAR_ACTWALK && CHAR_CHECKINDEX( workpindex) && workpindex == pindex ){ dir = NPC_Util_GetDirCharToChar( petindex, pindex, 0); if( dir != -1 ) { if( CHAR_getInt( petindex, CHAR_DIR) != dir ) { CHAR_setInt( petindex, CHAR_DIR, dir); CHAR_sendWatchEvent( CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX), CHAR_ACTTURN,NULL,0,TRUE); } } }else if( NPC_Util_isFaceToFace( petindex, pindex, 2 ) == TRUE ) { switch( act) { case CHAR_ACTATTACK: case CHAR_ACTDAMAGE: case CHAR_ACTDOWN: case CHAR_ACTSTAND: case CHAR_ACTACTIONWALK: case CHAR_ACTGUARD: case CHAR_ACTACTIONSTAND: CHAR_sendWatchEvent( objmeindex, act, NULL,0,FALSE); CHAR_setWorkInt( petindex, CHAR_WORKACTION, act); break; default: break; } } }else { } return; }
/*======================================= * watch �� *======================================*/ void NPC_BodyLanWatch( int objmeindex, int objmoveindex, CHAR_ACTION act, int x, int y, int dir, int* opt, int optlen ) { char szP[256], szArg[4096]; char buf[256]; int actindex; int meindex; int seqNo, needSeq; // ƽ�ҷ�������½���������� if( OBJECT_getType(objmoveindex) != OBJTYPE_CHARA ) return; actindex = OBJECT_getIndex(objmoveindex); // ������������½���������� if( CHAR_getInt( actindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) return; // ���м��̼������͵� meindex = OBJECT_getIndex(objmeindex); // ���м�INDEXë�� �ƻ����¾�����ئ��ľ���������� if( CHAR_getWorkInt( actindex, CHAR_WORKTRADER ) != meindex ){ return; } // ������ƥʧ�������ë�ƻ����¾� seqNo = CHAR_getWorkInt( actindex, CHAR_WORKSHOPRELEVANT ); // ئ������ �پ��� if( seqNo < 1 )seqNo = 1; // ¦�� ٯ if( NPC_Util_GetArgStr( meindex, szArg, sizeof( szArg ) ) == NULL ){ print( "npc_bodylan.c:û������(%s)\n", CHAR_getChar(meindex,CHAR_NPCARGUMENT) ); return ; } // �ˡ�������ë���� if( NPC_Util_GetStrFromStrWithDelim( szArg, "Act", szP, sizeof( szP ) ) == NULL ){ print( "npc_bodylan:������������δ�趨(%s)\n", szArg ); return; } // ۢئ�� if(getStringFromIndexWithDelim( szP, ",", seqNo, buf, sizeof( buf)) != FALSE ){ needSeq = atoi(buf); }else{ // ئ�⾮ئ�������� �پ��� CHAR_setWorkInt( actindex, CHAR_WORKSHOPRELEVANT, 1 ); // print( "����ͷ�ˡ��ص������\n", seqNo, needSeq ); // �Ͼ��������微������ return; } // ��� ۢئʧ����������������� if( needSeq == act ){ // �������ף۳�ľ�� �� // print( "�ɹ�\(%d������%d)\n", seqNo, needSeq ); seqNo ++; if( seqNo >= CHAR_getWorkInt( meindex, BODYLAN_E_COMMANDNUM ) ){ // print( "�ڴ˽�����\n" ); } // ���� ë���� CHAR_setWorkInt( actindex, CHAR_WORKSHOPRELEVANT, seqNo ); }else{ // �� ���������� �پ���֧Ի �� CHAR_setWorkInt( actindex, CHAR_WORKSHOPRELEVANT, 1 ); // print( "(%d������%d)\n", seqNo, needSeq ); } }