BOOL CHAR_allprewalk( int index,int* dir,int* mode) { int poisonvalue; poisonvalue = CHAR_getInt(index, CHAR_POISON ); if( poisonvalue >= 1 ) { CHAR_setInt(index,CHAR_HP , CHAR_getInt(index,CHAR_HP) - poisonvalue ); CHAR_setWorkInt(index,CHAR_WORKLASTATTACKCHARAINDEX,-2); { int opt[2] = { SPR_kmydam,poisonvalue}; CHAR_sendWatchEvent( CHAR_getWorkInt(index,CHAR_WORKOBJINDEX), CHAR_ACTDAMAGE,opt,2,TRUE); CHAR_sendStatusString( index,"M"); } poisonvalue--; if( poisonvalue <= 0)poisonvalue = 1; CHAR_setInt(index,CHAR_POISON,poisonvalue); } if( CHAR_getInt(index,CHAR_CONFUSION) != 0 ) *dir = RAND(0,7); if( CHAR_getInt(index,CHAR_STONE) != 0 ) return FALSE; return TRUE; }
void TalkAction(int charaindex, char *message) { int i; typedef struct { char talk[5]; int action; } tagTlakAction; tagTlakAction TlakAction[13] = { {"坐下", 11}, {"挥手", 12}, {"点头", 18}, {"高兴", 13}, {"生气", 14}, {"悲伤", 15}, {"站立", 19}, {"走动", 17}, {"晕倒", 10}, {"攻击", 2}, {"防御", 16}, {"受伤", 4}, {"投掷", 3} }; for(i = 0; i < 13; i++) if(strstr(message, TlakAction[i].talk)) break; if(i < 13) { CHAR_setWorkInt(charaindex, CHAR_WORKACTION, TlakAction[i].action); CHAR_sendWatchEvent(CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), TlakAction[i].action, NULL, 0, TRUE); } }
/*------------------------------------------------------------ * Map 奶矛件玄及 pre post毛质 允月 * 娄醒 * index int 昙欠丹午仄化中月平乓仿及奶件犯永弁旦 * mode BOOL TRUE及凛反}in FALSE及凛反 out 卞覆杀 * 忒曰袄卅仄 ------------------------------------------------------------*/ static void MAP_dealprepostevent( int index, BOOL mode ) { int map[2]; int i; int damaged=FALSE; if( CHAR_getFlg(index,CHAR_ISFLYING) ) /* 氏匹月支勾卞反窒手仄卅中 */ return; if( !MAP_getMapDataFromCharIndex( index , map ) ) return; for( i = 0 ; i < 2 ; i ++ ){ /* damage */ int damage; damage = MAP_getImageInt(map[i], mode ? MAP_INTODAMAGE : MAP_OUTOFDAMAGE); if( damage != 0 ){ /* 母丢□斥汹毛恳匹 蜇允月及匹 寞 木赘尹 */ int opt[2]={SPR_kmydamY,-damage}; damaged=TRUE; CHAR_setInt(index, CHAR_HP, CHAR_getInt(index,CHAR_HP) + damage ); CHAR_complianceParameter(index); /* 母丢□斥熬仃凶巨白尼弁玄请允 */ CHAR_sendWatchEvent(CHAR_getWorkInt(index,CHAR_WORKOBJINDEX), CHAR_ACTDAMAGE,opt,2,TRUE); } } if( damaged ) CHAR_sendStatusString(index,"M"); }
int NPC_Lua_NLG_SetAction(lua_State *_NLL) { CheckEx(_NLL, 2); CheckIndexNull(_NLL, 1); int TM_Index = (int)lua_tointeger(_NLL, 1); int TM_Action = (int)lua_tointeger(_NLL, 2); if(!CHAR_CHECKINDEX(TM_Index)) { LRetErrInt(_NLL, -1, "传入的索引是无效的。"); } CHAR_sendWatchEvent( CHAR_getWorkInt( TM_Index, CHAR_WORKOBJINDEX), TM_Action, NULL, 0,TRUE); CHAR_setWorkInt( TM_Index, CHAR_WORKACTION, TM_Action); LRetInt(_NLL, 0); }
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; }
/*------------------------------------------------------------ * Map 奶矛件玄及 pre post毛質 允月 * 婁醒 * index int 曇欠丹午仄化中月平乓仿及奶件犯永弁旦 * mode BOOL TRUE及凜反}in FALSE及凜反 out 卞覆殺 * 忒曰襖卅仄 ------------------------------------------------------------*/ static void MAP_dealprepostevent( int index, BOOL mode ) { int map[2]; int i; int damaged=FALSE,statuschange=FALSE; if( CHAR_getFlg(index,CHAR_ISFLYING) ) /* 氏匹月支勾卞反窒手仄卅中 */ return; if( !MAP_getMapDataFromCharIndex( index , map ) ) return; /* damage */ int damage; for( i = 0 ; i < 2 ; i ++ ){ damage = MAP_getImageInt(map[i], mode ? MAP_INTODAMAGE : MAP_OUTOFDAMAGE); if( damage != 0 ){ /* 母丟□斥洶毛懇匹 蜇允月及匹 寞 木贅尹 */ int opt[2]={SPR_kmydamY,-damage}; damaged=TRUE; CHAR_setInt(index, CHAR_HP, CHAR_getInt(index,CHAR_HP) + damage ); CHAR_complianceParameter(index); /* 母丟□斥熬仃凶巨白尼弁玄請允 */ CHAR_sendWatchEvent(CHAR_getWorkInt(index,CHAR_WORKOBJINDEX), CHAR_ACTDAMAGE,opt,2,TRUE); } if( MAP_changeCharStatusFromMapDataAndTime( index,map[i], mode ? TRUE : FALSE ) ) statuschange=TRUE; } if( damaged ) CHAR_sendStatusString(index,"M"); if( statuschange ){ CHAR_sendCToArroundCharacter(index); CHAR_sendStatusString(index,"P"); } }
/* *���Ҽ������� �� */ void NPC_JnakenJudge(int meindex,int talker,int sel) { int player=-1; int jankenman; char j_char[3][8]={" ʯͷ "," ���� "," �� "}; char token[1024]; int shouhai = 0; int fd = getfdFromCharaIndex( talker); int fl=0,x=0,y=0; if(sel == 3) player = 0; //��� if(sel == 5) player = 1; //����ƽ if(sel == 7) player = 2; //�ɡ� jankenman = rand()%3; switch(jankenman){ case 0: if(player == 2){ shouhai = 1; }else if(player == 1){ shouhai = 2; } break; case 1: if(player == 0){ shouhai = 1; }else if(player == 2){ shouhai = 2; } break; case 2: if(player == 1){ shouhai = 1; }else if(player == 0){ shouhai = 2; } break; } if(shouhai == 1){ //Change add ��Ҳ�ʤ�˸��ĵ��� NPC_JankenItemGet( meindex, talker, "WinItem" ); NPC_WarpPointGet(meindex, talker, &fl, &x, &y, 0); snprintf( token, sizeof( token ) , " ������ ������ \n\n" " %16s %-16s\n" " [%s] VS [%s]\n\n\n" " %-16s ʤ��", CHAR_getChar(meindex,CHAR_NAME),CHAR_getChar(talker,CHAR_NAME), j_char[jankenman],j_char[player], CHAR_getChar(talker,CHAR_NAME) ); // CHAR_talkToCli( talker , -1 ,token , CHAR_COLORCYAN ); //������ CHAR_warpToSpecificPoint(talker, fl, x, y); // �������巴�����٣���ʧ�������ë���£� CHAR_sendWatchEvent( CHAR_getWorkInt( talker, CHAR_WORKOBJINDEX), CHAR_ACTPLEASURE,NULL,0,TRUE); CHAR_setWorkInt( talker, CHAR_WORKACTION, CHAR_ACTPLEASURE); }else if(shouhai == 2){ //Change add ��Ҳ����˸��ĵ��� NPC_JankenItemGet( meindex, talker, "LoseItem" ); NPC_WarpPointGet(meindex, talker, &fl, &x, &y, 1); snprintf( token, sizeof( token ) , " ������ ������ \n\n" " %16s %-16s\n" " [%s] VS [%s]\n\n\n" " %-16s ����", CHAR_getChar(meindex,CHAR_NAME),CHAR_getChar(talker,CHAR_NAME), j_char[jankenman],j_char[player], CHAR_getChar(talker,CHAR_NAME) ); // CHAR_talkToCli( talker , -1 ,token , CHAR_COLORCYAN ); //������ CHAR_warpToSpecificPoint(talker, fl, x, y); // �������巴�� ���У�ʧ�������ë���� CHAR_sendWatchEvent( CHAR_getWorkInt( talker, CHAR_WORKOBJINDEX), CHAR_ACTSAD,NULL,0,TRUE); CHAR_setWorkInt( talker, CHAR_WORKACTION, CHAR_ACTSAD); }else{ //����������ؤ�г� NPC_Janken_selectWindow( meindex, talker, 2); return; } //˪�� lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, CHAR_WINDOWTYPE_JANKEN_END, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token); }
/*----------------------------------------- 弁仿奶失件玄井日忒勻化五凶凜卞裟太請今木月〔 -------------------------------------------*/ void NPC_WindowHealerWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { if( NPC_Util_CharDistance( talkerindex, meindex ) > (CHAR_getWorkInt(meindex,CHAR_WORK_RANGE)+4)) return; switch( seqno){ case CHAR_WINDOWTYPE_WINDOWHEALER_STARTMSG: if(atoi(data)==2) /*--薊 仄凶嫩 1--*/ { NPC_WindowHealer_selectWindow( meindex, talkerindex, 1 ); }else if(atoi(data)==3){ /*--薊 仄凶嫩 2--*/ NPC_WindowHealer_selectWindow( meindex, talkerindex, 2 ); }else if(atoi(data)==4){ /*--薊 仄凶嫩 2--*/ NPC_WindowHealer_selectWindow( meindex, talkerindex, 6 ); }else if(atoi(data)==6){ /*--薊 仄凶嫩 2--*/ if(NPC_PetHealerCheck( talkerindex)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 9 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 10 ); } }else if(select==WINDOW_BUTTONTYPE_CANCEL){ /*--仇仇引匹仁月午蔽 卅及匹窒手仄卅中--*/ } break; /*-----覲菁 莢汊毛雲仇卅丹-----*/ case CHAR_WINDOWTYPE_WINDOWHEALER_HPMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); }else if(select==WINDOW_BUTTONTYPE_YES){ /*--雲嗯及民尼永弁--*/ if(NPC_WindowMoneyCheck(meindex,talkerindex,1)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 3 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 8 ); } }else if(select==WINDOW_BUTTONTYPE_NO){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*-----竣 莢汊毛雲仇卅丹-----*/ case CHAR_WINDOWTYPE_WINDOWHEALER_SPIRITMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); }else if(select==WINDOW_BUTTONTYPE_YES){ /*--雲嗯及民尼永弁--*/ if(NPC_WindowMoneyCheck(meindex,talkerindex,2)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 4 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 8 ); } }else if(select==WINDOW_BUTTONTYPE_NO){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*-----覲菁 莢汊及瑛絆-----*/ case CHAR_WINDOWTYPE_WINDOWHEALER_OKHPMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; case CHAR_WINDOWTYPE_WINDOWHEALER_OKSPIRITMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*--蟈莢汊今六月--*/ case CHAR_WINDOWTYPE_WINDOWHEALER_ALLMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); }else if(select==WINDOW_BUTTONTYPE_YES){ if(NPC_WindowMoneyCheck(meindex,talkerindex,3)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 7 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 8 ); } }else if(select==WINDOW_BUTTONTYPE_NO){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*--蟈莢汊及瑛絆--*/ case CHAR_WINDOWTYPE_WINDOWHEALER_OKALLMSG: if(select==WINDOW_BUTTONTYPE_YES){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; } if(select==WINDOW_BUTTONTYPE_CANCEL && CHAR_getWorkInt( talkerindex, CHAR_WORKPARTYMODE ) == 2) { CHAR_sendWatchEvent( CHAR_getWorkInt( talkerindex, CHAR_WORKOBJINDEX), CHAR_ACTPLEASURE,NULL,0,TRUE); CHAR_setWorkInt( talkerindex, CHAR_WORKACTION, CHAR_ACTPLEASURE); } }
/*------------------------------------------------------------ * ¼«Ê¬¤¬¥ê¡¼¥À¡¼¤«¤É¤¦¤«¤òÁ÷¿®¤¹¤ë¡e ------------------------------------------------------------*/ void CHAR_sendLeader( int objindex, int leader) { int opt[1]; opt[0] = leader; CHAR_sendWatchEvent( objindex,CHAR_ACTLEADER,opt,1,TRUE); }
/*----------------------------------------- ¥¯¥é¥¤¥¢¥ó¥È¤«¤éÊ֤äƤ¤¿»þ¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë¡e -------------------------------------------*/ void NPC_WindowHealerWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { if( NPC_Util_CharDistance( talkerindex, meindex ) > (CHAR_getWorkInt(meindex,CHAR_WORK_RANGE)+4)) return; switch( seqno){ case CHAR_WINDOWTYPE_WINDOWHEALER_STARTMSG: if(atoi(data)==2) /*--Áª ¤·¤¿¹à 1--*/ { NPC_WindowHealer_selectWindow( meindex, talkerindex, 1 ); }else if(atoi(data)==3){ /*--Áª ¤·¤¿¹à 2--*/ NPC_WindowHealer_selectWindow( meindex, talkerindex, 2 ); }else if(atoi(data)==4){ /*--Áª ¤·¤¿¹à 2--*/ NPC_WindowHealer_selectWindow( meindex, talkerindex, 6 ); }else if(atoi(data)==6){ /*--Áª ¤·¤¿¹à 2--*/ if(NPC_PetHealerCheck( talkerindex)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 9 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 10 ); } }else if(select==WINDOW_BUTTONTYPE_CANCEL){ /*--¤³¤³¤Þ¤Ç¤¯¤ë¤È½ª ¤Ê¤Î¤Ç²¿¤â¤·¤Ê¤¤--*/ } break; /*-----ÂÑµ× ²óÉü¤ò¶³¤³¤Ê¤¦-----*/ case CHAR_WINDOWTYPE_WINDOWHEALER_HPMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); }else if(select==WINDOW_BUTTONTYPE_YES){ /*--¶³¶â¤Î¥Á¥§¥Ã¥¯--*/ if(NPC_WindowMoneyCheck(meindex,talkerindex,1)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 3 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 8 ); } }else if(select==WINDOW_BUTTONTYPE_NO){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*-----µ¤ ²óÉü¤ò¶³¤³¤Ê¤¦-----*/ case CHAR_WINDOWTYPE_WINDOWHEALER_SPIRITMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); }else if(select==WINDOW_BUTTONTYPE_YES){ /*--¶³¶â¤Î¥Á¥§¥Ã¥¯--*/ if(NPC_WindowMoneyCheck(meindex,talkerindex,2)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 4 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 8 ); } }else if(select==WINDOW_BUTTONTYPE_NO){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*-----ÂÑµ× ²óÉü¤Î·ë²Ì-----*/ case CHAR_WINDOWTYPE_WINDOWHEALER_OKHPMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; case CHAR_WINDOWTYPE_WINDOWHEALER_OKSPIRITMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*--Á´²óÉü¤µ¤»¤ë--*/ case CHAR_WINDOWTYPE_WINDOWHEALER_ALLMSG: if(select==WINDOW_BUTTONTYPE_OK){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); }else if(select==WINDOW_BUTTONTYPE_YES){ if(NPC_WindowMoneyCheck(meindex,talkerindex,3)==TRUE){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 7 ); }else{ NPC_WindowHealer_selectWindow( meindex, talkerindex, 8 ); } }else if(select==WINDOW_BUTTONTYPE_NO){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; /*--Á´²óÉü¤Î·ë²Ì--*/ case CHAR_WINDOWTYPE_WINDOWHEALER_OKALLMSG: if(select==WINDOW_BUTTONTYPE_YES){ NPC_WindowHealer_selectWindow( meindex, talkerindex, 0 ); } break; } if(select==WINDOW_BUTTONTYPE_CANCEL && CHAR_getWorkInt( talkerindex, CHAR_WORKPARTYMODE ) == 2) { CHAR_sendWatchEvent( CHAR_getWorkInt( talkerindex, CHAR_WORKOBJINDEX), CHAR_ACTPLEASURE,NULL,0,TRUE); CHAR_setWorkInt( talkerindex, CHAR_WORKACTION, CHAR_ACTPLEASURE); } }
void CHAR_sendAngelMark( int objindex, int flag) { int opt[1]; opt[0] = flag; CHAR_sendWatchEvent( objindex,CHAR_ACTANGEL,opt,1,TRUE); }
void ADDRESSBOOK_addAddressBook( int meindex, int toindex) { char tmpstring[CHARNAMELEN + ADDRESSBOOK_FIXEDMESSAGE_MAXLEN]; int hisblank; int myblank; int myaddindex, toaddindex; int dir; char *cdkey; hisblank = ADDRESSBOOK_findBlankEntry( toindex ); if( hisblank < 0 ) { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_HISTABLEFULL, CHAR_COLORWHITE); return ; } myblank = ADDRESSBOOK_findBlankEntry( meindex ); if( myblank < 0 ){ CHAR_talkToCli( meindex , -1, ADDRESSBOOK_MYTABLEFULL, CHAR_COLORWHITE ); return ; } cdkey = CHAR_getChar( toindex, CHAR_CDKEY); myaddindex = ADDRESSBOOK_getIndexInAddressbook( meindex, cdkey, CHAR_getChar( toindex, CHAR_NAME)); cdkey = CHAR_getChar( meindex, CHAR_CDKEY); toaddindex = ADDRESSBOOK_getIndexInAddressbook( toindex, cdkey, CHAR_getChar(meindex, CHAR_NAME)); if( myaddindex < 0 ){ ADDRESSBOOK_entry hisentry; if( ADDRESSBOOK_makeEntryFromCharaindex(toindex,&hisentry) == FALSE ){ return ; } CHAR_setAddressbookEntry( meindex, myblank,&hisentry ); snprintf( tmpstring, sizeof( tmpstring), toaddindex < 0 ? ADDRESSBOOK_ADDED: ADDRESSBOOK_GIVEADDRESS, hisentry.charname); CHAR_talkToCli( meindex , -1,tmpstring, CHAR_COLORWHITE ); ADDRESSBOOK_sendAddressbookTableOne( meindex, myblank); }else{ snprintf( tmpstring, sizeof( tmpstring), ADDRESSBOOK_TAKEADDRESS1, CHAR_getChar( toindex, CHAR_NAME)); CHAR_talkToCli( meindex, -1, tmpstring, CHAR_COLORWHITE); } if( toaddindex < 0 ) { ADDRESSBOOK_entry meae; if( ADDRESSBOOK_makeEntryFromCharaindex(meindex,&meae) == FALSE) { return; } CHAR_setAddressbookEntry( toindex, hisblank,&meae ); snprintf( tmpstring , sizeof( tmpstring), myaddindex < 0 ? ADDRESSBOOK_ADDED : ADDRESSBOOK_GIVEADDRESS, CHAR_getChar( meindex, CHAR_NAME ) ); CHAR_talkToCli( toindex, -1, tmpstring, CHAR_COLORWHITE); ADDRESSBOOK_sendAddressbookTableOne( toindex , hisblank); }else { if( myaddindex < 0 ) { snprintf( tmpstring , sizeof( tmpstring), ADDRESSBOOK_TAKEADDRESS2, CHAR_getChar( meindex, CHAR_NAME ) ); CHAR_talkToCli( toindex, -1, tmpstring, CHAR_COLORWHITE); } } dir = NPC_Util_GetDirCharToChar( toindex, meindex, 0); if( dir != -1) { if( CHAR_getInt( toindex, CHAR_DIR) != dir) { CHAR_setInt( toindex, CHAR_DIR, dir); } CHAR_sendWatchEvent( CHAR_getWorkInt( toindex, CHAR_WORKOBJINDEX), CHAR_ACTNOD,NULL,0,TRUE); CHAR_setWorkInt( toindex, CHAR_WORKACTION, CHAR_ACTNOD); CHAR_sendWatchEvent( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), CHAR_ACTNOD,NULL,0,TRUE); CHAR_setWorkInt( meindex, CHAR_WORKACTION, CHAR_ACTNOD); } return; }
/*------------------------------------------------------------ * 啖 允月[ * 娄醒 * 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 ||
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); } } } }
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; }