BOOL NPC_reloadNPC(void) { int i; int charnum = getFdnum()+ getPetcharnum()+getOtherscharnum(); for(i=0;i<charnum;i++){ if(!CHAR_CHECKINDEX(i)) continue; if(CHAR_getWorkInt(i,CHAR_WORKNPCTYPE)==1){ NPC_Util_NPCDelete(i); } } if(NPC_readNPCSettingFiles( getNpcdir(), getNpctemplatenum(), getNpccreatenum() )==TRUE) NPC_generateLoop( 1 ); if(getReloadNpcType()==1){ int j; int playernum = CHAR_getPlayerMaxNum(); for(j=0;j<playernum;j++){ if( CHAR_getCharUse(j) != FALSE ) { if(CHAR_getWorkInt(j,CHAR_WORK_OFFLINE)==0 && CHAR_getWorkInt(j,CHAR_WORKBATTLEMODE)==BATTLE_CHARMODE_NONE){ CHAR_warpToSpecificPoint(j,CHAR_getInt(j,CHAR_FLOOR),CHAR_getInt(j,CHAR_X),CHAR_getInt(j,CHAR_Y)); } } } } return TRUE; }
/************************************************ * Ïä·¤«¤±¤é¤ì¤¿»þ¤Î½èÍý ************************************************/ void NPC_PrintpassmanTalked( int meindex , int talkerindex , char *msg , int color ) { int i; int charnum; /* ¥×¥ì¥¤¥ä¡¼¤¬¥É¥¢¥Þ¥ó¤Î2¥°¥ê¥Ã¥É°ÊÆâ¤Ê¤éÈ¿±þ¤¹¤ë¡£ */ if(NPC_Util_CharDistance( talkerindex, meindex ) > 2)return; /* ¼«Ê¬ÍѤδÉÍý¿Í¤Î̾Á°¤ò¸¡º÷¤¹¤ë*/ charnum = CHAR_getCharNum(); for(i= CHAR_getPlayerMaxNum() +CHAR_getPetMaxNum(); i<charnum; i++){ if( CHAR_getCharUse(i) && CHAR_getInt( i ,CHAR_WHICHTYPE) == CHAR_TYPEROOMADMIN ){ if( strcmp( CHAR_getWorkChar(i,CHAR_WORKCHAR_MYNAME), CHAR_getWorkChar( meindex, CHAR_WORKCHAR_ADMNAME)) ==0 ) { break; } } } if( i < charnum ) { NPC_RoomAdminNew_DspRoomPasswd( meindex, i, talkerindex); } else { CHAR_talkToCli( talkerindex, meindex, "¡C¡C¡C", NPC_RANKING_MSGCOLOR); } }
int NPC_Lua_NLG_TalkToFloor(lua_State *_NLL) { CheckEx2(_NLL, 2, 5); int TM_Top = lua_gettop(_NLL); int TM_floor = (int)lua_tointeger(_NLL, 1); char *TM_Msg = lua_tostring(_NLL, 2); if(TM_Msg == NULL) { LRetErrInt(_NLL , -1, "说话内容不能为nil。"); } int TM_color = CHAR_COLORWHITE; int TM_fontsize = 0; int TM_Talkindex = -1; if(TM_Top >= 3) { TM_color = (int)lua_tointeger(_NLL, 3); } if(TM_Top >= 4) { TM_fontsize = (int)lua_tointeger(_NLL, 4); } if(TM_Top == 5) { CheckIndexNull(_NLL, 5); TM_Talkindex = (int)lua_tointeger(_NLL, 5); } //指定地图说话 BOOL TM_Ret = FALSE; int TM_playernum = CHAR_getPlayerMaxNum(); int i = 0; for( i = 0 ; i < TM_playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { if (CHAR_getInt(i, CHAR_FLOOR) == TM_floor) { #ifdef _FONT_SIZE TM_Ret |= CHAR_talkToCliExt( i, TM_Talkindex, TM_Msg, TM_color, TM_fontsize); #else TM_Ret |= CHAR_talkToCli( i, TM_Talkindex, TM_Msg, TM_color); #endif } } } if(TM_Ret == TRUE) { LRetInt(_NLL, 0); }else { LRetErrInt(_NLL , -2, "未知原因导致发送说话失败。"); } }
/* 奶矛件玄蔽 * 申永玄白仿弘毛 化月分仃及質 */ void NPC_EventSetFlg(int talker,int shiftbit) { int point=0; int array; int shift; #ifdef _TEACHER_SYSTEM int iGetFame = 0; #endif /*-- -1反白仿弘卞楮溢互卅中奶矛件玄 -*/ if(shiftbit==-1) return; array = shiftbit / 32; shift = shiftbit % 32; point = CHAR_getInt( talker, CHAR_ENDEVENT+array); // Arminius 8.24 prevent wash dp if (!(point & (1 << shift))) { // CoolFish: Family Adv 2001/8/4 AddFMAdv(talker, shiftbit); #ifdef _TEACHER_SYSTEM if(shiftbit < arraysizeof(FMAdvTbl)) iGetFame = FMAdvTbl[shiftbit]; #endif } #ifdef _TEACHER_SYSTEM iGetFame /= 20; // 導師獲得學生所得聲望的 5% (1/20) // 檢查所得的聲望有沒有大於0 if(iGetFame > 0){ // 檢查有沒有導師 if(strlen(CHAR_getChar(talker,CHAR_TEACHER_ID)) > 0 && strlen(CHAR_getChar(talker,CHAR_TEACHER_NAME)) > 0){ int iPlayernum = CHAR_getPlayerMaxNum(),i; char szMsg[128]; // 檢查導師在不在線上 for(i=0;i<iPlayernum;i++){ if(CHAR_getCharUse(i) == FALSE) continue; if(strcmp(CHAR_getChar(talker,CHAR_TEACHER_ID),CHAR_getChar(i,CHAR_CDKEY)) == 0 && strcmp(CHAR_getChar(talker,CHAR_TEACHER_NAME),CHAR_getChar(i,CHAR_NAME)) == 0){ float fGetFame = (float)iGetFame/100; // 導師在線上 CHAR_setWorkInt(i,CHAR_WORK_GET_TEACHER_FAME,CHAR_getWorkInt(i,CHAR_WORK_GET_TEACHER_FAME) + iGetFame); sprintf(szMsg,"獲得學生 %s %.2f 點聲望",CHAR_getChar(talker,CHAR_NAME),fGetFame); CHAR_talkToCli(i,-1,szMsg,CHAR_COLORYELLOW); break; } } } } #endif point = point | (1 << shift); CHAR_setInt( talker, CHAR_ENDEVENT+array, point); }
static void sendmsg_toall( char *msg ) { int i; int playernum = CHAR_getPlayerMaxNum(); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { CHAR_talkToCli( i, -1, msg, CHAR_COLORYELLOW); } } }
/*------------------------------------------------------------------------ * 蟈化及諦卞丟永本□斥毛霜月〔 *----------------------------------------------------------------------*/ static void NPC_Sysinfo_SendMsgToAll( int meindex, char *msg) { int i; int playernum = CHAR_getPlayerMaxNum(); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { CHAR_talkToCli( i, meindex, msg, CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR)); } } }
void CHAR_talkToFloor(int floor, int talkindex, char *message, CHAR_COLOR color) { int i = 0; int playernum = CHAR_getPlayerMaxNum(); for(i = 0; i < playernum; i++) { if(CHAR_getCharUse(i) == FALSE) continue; if(!CHAR_CHECKINDEX(i)) continue; if(CHAR_getInt(i, CHAR_FLOOR) == floor) { if(CHAR_getWorkInt(i, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE) CHAR_talkToCli(i, talkindex, message, color); } } }
void NPC_Util_AnnounceFloor( int floorid , char *msg ) { int i; int playernum = CHAR_getPlayerMaxNum(); for(i=0;i<playernum;i++){ if( CHAR_getCharUse(i) && CHAR_getInt( i , CHAR_WHICHTYPE) == CHAR_TYPEPLAYER && CHAR_getInt( i , CHAR_FLOOR ) == floorid ){ CHAR_talkToCli( i , -1 , msg , CHAR_COLORWHITE ); } } }
//GM广播 void mproto_GMTalk_Recv(int fd,char* uid,int ntime,char* data) { char message[65530]; int i; int playernum = CHAR_getPlayerMaxNum(); if (uid == NULL || data == NULL ) return ; strcpy(message,""); sprintf(message,"GM[%s]:%s",uid,data); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { CHAR_talkToCli( i, -1, message, CHAR_COLORWHITE); } } }
/*----------------------------------------------- * »ØÄꤵ¤ì¤¿index¤Î¥Õ¥í¥¢¤Ë¤¤¤ë¥×¥ì¥¤¥ä¡¼Á´°÷¤Ë * ¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤¹¤ë¡£ *----------------------------------------------*/ static void NPC_RoomAdminNew_SendMsgThisFloor( int index, char *buff) { int i, fl; int playernum = CHAR_getPlayerMaxNum(); fl = CHAR_getInt( index, CHAR_FLOOR); for( i = 0; i < playernum; i ++ ) { if( CHAR_getInt( i, CHAR_FLOOR) == fl ) { /* Ç°¤Î¤¿¤á¥×¥ì¥¤¥ä¡¼¤«¥Á¥§¥Ã¥¯ */ if( CHAR_getInt( i, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) { CHAR_talkToCli( i, index, buff, NPC_ROOMADMINNEW_MSGCOLOR); } } } }
/*------------------------------------------------------------------------ * 皿伊奶乩□及醒毛譬屯月 *----------------------------------------------------------------------*/ static void NPC_Sysinfo_Msg_Player( int meindex, int tindex, char *msg) { int i, cnt = 0; int playernum=CHAR_getPlayerMaxNum(); char buff[64]; for( i=0 ; i<playernum ; i++ ){ if( CHAR_getCharUse(i) != FALSE ) { if( CHAR_getInt( i, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) { cnt ++; } } } snprintf( buff, sizeof( buff), "玩家有%d人。", cnt); CHAR_talkToCli( tindex, meindex, buff, CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR)); }
int NPC_DoorSearchByName( char *name ) { int i; int charnum = CHAR_getCharNum(); for(i= CHAR_getPlayerMaxNum() + CHAR_getPetMaxNum(); i<charnum; i++){ if( CHAR_getCharUse(i) && CHAR_getInt( i ,CHAR_WHICHTYPE) == CHAR_TYPEDOOR ){ if( strcmp( CHAR_getWorkChar(i,CHAR_WORKDOORNAME),name)==0 ){ return i; } } } return -1; }
int NPC_DoorSearchByPosition( int fl , int x, int y ) { int i; int charnum = CHAR_getCharNum(); for(i=CHAR_getPlayerMaxNum() + CHAR_getPetMaxNum(); i<charnum; i++) { if( CHAR_getCharUse(i) && CHAR_getInt( i , CHAR_WHICHTYPE) == CHAR_TYPEDOOR && CHAR_getInt( i , CHAR_FLOOR ) == fl && CHAR_getInt( i , CHAR_X ) == x && CHAR_getInt( i , CHAR_Y ) == y ){ return i; } } return -1; }
// 使用勇者信物时 void Use_HeroToken( int charaindex, int toindex, int haveitemindex ) { int itemindex; int mindex; char nameinfo[64]; char msg[1024]; print(" 使用勇者信物 "); if( !CHAR_CHECKINDEX( charaindex) ) return; itemindex = CHAR_getItemIndex( charaindex, haveitemindex); if( !ITEM_CHECKINDEX( itemindex) ) return; mindex = checkIfAngel( charaindex); //sprintf( nameinfo, "%s:%s", CHAR_getChar(charaindex, CHAR_CDKEY), CHAR_getChar(charaindex, CHAR_NAME)); getMissionNameInfo( charaindex, nameinfo); if( mindex == -1 || ( strcmp( nameinfo, ITEM_getChar( itemindex, ITEM_ANGELINFO)) && strcmp( nameinfo, ITEM_getChar( itemindex, ITEM_HEROINFO)) ) ) { // 路人甲使用时 CHAR_talkToCli( charaindex, -1, "这并不是属於你的信物,不可随便使用喔。", CHAR_COLORRED); return; } if( strcmp( ITEM_getChar( itemindex, ITEM_ANGELINFO), missiontable[mindex].angelinfo) || strcmp( ITEM_getChar( itemindex, ITEM_HEROINFO), missiontable[mindex].heroinfo) ){ CHAR_talkToCli( charaindex, -1, "这是无用的信物,还是丢掉吧。", CHAR_COLORRED); return; } if( !strcmp( nameinfo, missiontable[mindex].heroinfo) ) { // 勇者使用时 int lefttime, hour, min; lefttime = missiontable[mindex].time + missiontable[mindex].limittime*60*60 - (int)time(NULL); hour = lefttime / (60*60); min = (lefttime % (60*60)) / 60; if( missiontable[mindex].flag == MISSION_DOING ) { // 显示任务资料 sprintf( msg, "你的使命是 %s,时间还剩馀%d小时%d分。", missionlist[missiontable[mindex].mission].detail, hour, min); CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORRED); } else if( missiontable[mindex].flag == MISSION_HERO_COMPLETE ) { // 可以去领奖了 sprintf( msg, "你的使命已经完成了,可以去领奖了,时间还剩馀%d小时%d分。", hour, min); CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORRED); } else if( missiontable[mindex].flag == MISSION_TIMEOVER ) { // 时间超过了 sprintf( msg, "很可惜,使者和勇者并没有在时限内完成使命,下次再加油吧。"); CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORRED); } return; } else if( !strcmp( nameinfo, missiontable[mindex].angelinfo) ) { // 使者使用时 // 传送至勇者身旁 int maxchar, i; char cdkey[64], name[64]; int fl =0, fx =0, fy =0; if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { CHAR_talkToCli( charaindex, -1, "组队中无法传送。", CHAR_COLORYELLOW ); return; } if( checkUnlawWarpFloor( CHAR_getInt( charaindex, CHAR_FLOOR) ) ) { CHAR_talkToCli( charaindex, -1, "你所在的地方无法传送。", CHAR_COLORYELLOW ); return; } //if( CHAR_CheckInItemForWares( charaindex, 0) == FALSE ){ if( CheckDropatLogout( charaindex) == TRUE ) { CHAR_talkToCli( charaindex, -1, "携带登出後消失的道具时无法使用。", CHAR_COLORYELLOW); return; } getStringFromIndexWithDelim( missiontable[mindex].heroinfo, ":", 1, cdkey, sizeof(cdkey)); getStringFromIndexWithDelim( missiontable[mindex].heroinfo, ":", 2, name, sizeof(name)); maxchar = CHAR_getPlayerMaxNum(); for( i =0; i <maxchar; i++) { if( !CHAR_CHECKINDEX( i) ) continue; if( CHAR_getInt( i, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) continue; //sprintf( tempinfo, "%s:%s", CHAR_getChar( i, CHAR_CDKEY), CHAR_getChar( i, CHAR_NAME)); if( strcmp( cdkey, CHAR_getChar( i, CHAR_CDKEY)) ) continue; if( strcmp( name, CHAR_getChar( i, CHAR_NAME)) ) continue; fl = CHAR_getInt( i, CHAR_FLOOR); fx = CHAR_getInt( i, CHAR_X); fy = CHAR_getInt( i, CHAR_Y); if( checkUnlawWarpFloor( fl) ) { CHAR_talkToCli( charaindex, -1, "对象所在的地方无法传送过去。", CHAR_COLORYELLOW ); return; } break; } if( fl <= 0 ) { sprintf( msg, "勇者 %s 目前不在线上或不在本伺服器上。", name); CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORRED); return; } sprintf( msg, "传送至勇者 %s 身边。", name); CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORYELLOW); CHAR_warpToSpecificPoint( charaindex, fl, fx, fy); } else { // 路人甲使用时 CHAR_talkToCli( charaindex, -1, "这并不是属於你的信物,不可随便使用喔。", CHAR_COLORRED); return; } }
//void selectAngel( int charaindex) void selectAngel( int charaindex, int heroindex, int mission, int gm_cmd) { // gm_cmd 表示是否由GM指令产生, //int heroindex =-1; int findindex, startindex; char msg[1024]; int max_char; //int mission; if( AngelReady <= 0 && gm_cmd == FALSE) return; sprintf( msg, " 使者资格检查: %s %s ", CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME)); //print( msg); LogAngel( msg); // 天使条件检查 if( gm_cmd == FALSE ) { if( checkIfAngel( charaindex) != -1) // 是否天使或勇者 { //print(" ANGEL已经是天使或勇者了 "); return; } if( CHAR_getInt( charaindex, CHAR_LV) < 30 || !NPC_EventCheckFlg( charaindex, 4 ) ) { //print(" ANGEL资格不符 "); return; } srand( time(NULL)); if( rand()%3 == 0 ) // 天使的机率 2/3 { //print(" ANGEL机率检查不通过 "); return; } } //print(" ANGEL决定 "); // 挑选勇者 if( heroindex == -1 ) { //heroindex = -1; max_char = CHAR_getPlayerMaxNum(); startindex = RAND( 0, max_char-1); findindex = startindex; while(1) { if( findindex == startindex-1) break; findindex = (findindex+1) % max_char; if( !CHAR_CHECKINDEX( findindex) ) continue; if( CHAR_getInt( findindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) continue; if( findindex == charaindex ) continue; if( checkIfAngel( findindex) != -1) continue; // 是否天使或勇者 if( CHAR_getInt( findindex, CHAR_LV) < 80 || !NPC_EventCheckFlg( findindex, 4 ) ) continue; // 勇者的条件 if( rand()%3 == 0 ) continue; // 勇者的机率 2/3 heroindex = findindex; //print(" ANGEL勇者决定 "); break; } if( heroindex < 0) { //sprintf( msg, " 没有找到勇者人选!! "); //print( msg); //LogAngel( msg); return; } } // 决定任务 if( mission == -1 ) { int mlist[MAXMISSION]; // 符合条件的任务列表 char eventlist[1024]; char buf[64]; int i, j, mindex =0; memset( mlist, 0, sizeof(mlist)); for( i =0; i <MAXMISSION; i++) { int checked =TRUE; if( missionlist[i].id <= 0) continue; if( CHAR_getInt( heroindex, CHAR_LV) < missionlist[i].level ) continue; strcpy( eventlist, missionlist[i].eventflag); // 检查必要旗标 j =0; while(1) { j++; if( getStringFromIndexWithDelim( eventlist, ";", j, buf, sizeof(buf)) == FALSE ) break; if( buf[0] != '!') { // 必要旗标或禁止旗标 if( !NPC_EventCheckFlg( heroindex, atoi(buf) )) { checked = FALSE; break; } } else { if( NPC_EventCheckFlg( heroindex, atoi(buf+1) )) { checked = FALSE; break; } } } if( checked ) { mlist[mindex] = missionlist[i].id; print(" mlist[%d]=%d ", mindex, mlist[mindex]); mindex++; } } if( mindex <= 0 ) { //sprintf( msg, " 找不到合适的任务 "); //print( msg); //LogAngel( msg); return; } mission = mlist[rand()%mindex]; } addAngelData( charaindex, heroindex, mission, MISSION_WAIT_ANSWER); // 传到AC // 清除旗标 event8 224~255 为精灵召唤专用 CHAR_setInt( charaindex, CHAR_NOWEVENT8, 0); CHAR_setInt( charaindex, CHAR_ENDEVENT8, 0); CHAR_setInt( heroindex, CHAR_NOWEVENT8, 0); CHAR_setInt( heroindex, CHAR_ENDEVENT8, 0); if( gm_cmd == FALSE ) AngelReady = 0; // 清除缺额 { sprintf( msg, " 产生 %s 天使候补: %s %s Lv:%d 勇者候补: %s %s Lv:%d 任务:%d ci=%d hi=%d ", gm_cmd ? ("(GM指令)") : (" "), CHAR_getChar( charaindex, CHAR_CDKEY), CHAR_getChar( charaindex, CHAR_NAME), CHAR_getInt( charaindex, CHAR_LV), CHAR_getChar( heroindex, CHAR_CDKEY), CHAR_getChar( heroindex, CHAR_NAME), CHAR_getInt( heroindex, CHAR_LV), mission, charaindex, heroindex); print( msg); LogAngel( msg); } }
void NPC_AlldomanWindowTalked(int meindex, int talkerindex, int seqno, int select,char *data) { char buf2[256]; char buf[256]; int i; int playernum = CHAR_getPlayerMaxNum(); //andy_log print( "seqno:%d\n", seqno); switch(seqno) { case NPC_ALLDOMAN_MAIN_WND: if ( select == WINDOW_BUTTONTYPE_NEXT ) { showpage ++ ; NPC_Alldoman_selectWindow(meindex , talkerindex , 4 ,""); } if ( select == WINDOW_BUTTONTYPE_OK ) { //CHAR_talkToCli(talkerindex,meindex,"看清楚了!",CHAR_COLORRED); showpage = 1 ; NPC_Alldoman_selectWindow(meindex , talkerindex, 5 ,""); } break; case NPC_ALLDOMAN_SELECT_WND: if(atoi(data)==2) { //CHAR_talkToCli(talkerindex,meindex,"1!",CHAR_COLORRED); if ( CHAR_getInt( talkerindex , CHAR_FLOOR ) != 8200 ) { CHAR_talkToCli(talkerindex,-1,"这里只能给真正的英雄刻写!",CHAR_COLORRED); break; } if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) > 132 || CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) <= 0 ) { CHAR_setWorkInt( talkerindex , CHAR_WORKHEROFLOOR , 0 ) ; CHAR_talkToCli(talkerindex,-1,"这里只能给真正的英雄刻写!",CHAR_COLORRED); break; } sprintf( buf2 , "你拿出了打败守灵者%3d的证明,试图将自己的姓名刻上石碑!" , CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) ); CHAR_talkToCli(talkerindex,-1,buf2,CHAR_COLORRED); if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) == 132 ) { sprintf( buf2 , "%s" , "尼斯大陆英雄" ) ; //到达顶层对全星系广播 sprintf( buf , "%s征服了英雄战场,由风之精灵将这个消息通知全世界,新的英雄诞生了!!" , CHAR_getChar( talkerindex, CHAR_NAME ) ); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { CHAR_talkToCli( i, -1, buf, CHAR_COLORBLUE2); } } } else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 130 ) sprintf( buf2 , "%s" , "尼斯大陆战士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 125 ) sprintf( buf2 , "%s" , "尼斯大陆勇士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 120 ) sprintf( buf2 , "%s" , "萨伊那斯英雄" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 115 ) sprintf( buf2 , "%s" , "斯巴达战士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 110 ) sprintf( buf2 , "%s" , "萨姆吉尔战士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 100 ) sprintf( buf2 , "%s" , "玛丽那丝战士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 80 ) sprintf( buf2 , "%s" , "卡坦战士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 60 ) sprintf( buf2 , "%s" , "霍特尔战士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 40 ) sprintf( buf2 , "%s" , "降魔勇士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 20 ) sprintf( buf2 , "%s" , "圣灵勇士" ) ; else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 1 ) sprintf( buf2 , "%s" , "初犊勇士" ) ; else sprintf( buf2 , " " ); saacproto_UpdataStele_send ( acfd , CHAR_getChar( talkerindex , CHAR_CDKEY ), CHAR_getChar( talkerindex , CHAR_NAME ) , buf2 , CHAR_getInt( talkerindex , CHAR_LV ) , CHAR_getInt( talkerindex , CHAR_TRANSMIGRATION) , 10 , CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) ) ; //清除WorkFloor CHAR_setWorkInt( talkerindex , CHAR_WORKHEROFLOOR , 0 ) ; } if(atoi(data)==4) { //CHAR_talkToCli(talkerindex,meindex,"2!",CHAR_COLORRED); showpage = 1 ; NPC_Alldoman_selectWindow(meindex , talkerindex, 6 ,""); } if(atoi(data)==6) { //CHAR_talkToCli(talkerindex,meindex,"3!",CHAR_COLORRED); } break; case NPC_ALLDOMAN_LIST_WND: if( select == WINDOW_BUTTONTYPE_OK ){ print("\nSyu log FloorWorkint => %d" , CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR )); } if( select == WINDOW_BUTTONTYPE_PREV && showpage > 1 ) { showpage -- ; NPC_Alldoman_selectWindow(meindex , talkerindex, 6 ,"" ); } if( select == WINDOW_BUTTONTYPE_NEXT && showpage < totalpage ) { showpage ++ ; NPC_Alldoman_selectWindow(meindex , talkerindex, 6 ,""); } break; } }
void NPC_MicTalked( int meindex , int talkerindex , char *msg ,int color ) { int i; int playernum; int x,y; char message[4096]; char buf[2048]; if( CHAR_getInt(talkerindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) return; if(CHAR_getWorkInt(meindex,CHAR_WORK_TYPE) == 0){ if(NPC_Util_isFaceToChara(talkerindex,meindex,1 ) ==FALSE) return; } snprintf( buf, sizeof( buf), "%s\n%s", CHAR_getChar( talkerindex, CHAR_NAME), msg); // Robin 0621 族長廣播 print(" MIC_FL:%d ", CHAR_getWorkInt( meindex, CHAR_WORK_FMFL )); if( CHAR_getWorkInt( meindex, CHAR_WORK_FMFL ) != 0 ) { #ifdef _FMVER21 if( CHAR_getInt( talkerindex, CHAR_FMLEADERFLAG ) == FMMEMBER_LEADER) #else if( CHAR_getInt( talkerindex, CHAR_FMLEADERFLAG ) == 1) #endif // && ( CHAR_getWorkInt( talkerindex, CHAR_WORKFMFLOOR) == CHAR_getWorkInt( meindex, CHAR_WORK_FLOOR ) ) ) { print(" FMLeaderTalk_send:%s,%d,%d,%s ", CHAR_getChar( talkerindex, CHAR_FMNAME), CHAR_getInt( talkerindex, CHAR_FMINDEX), CHAR_getWorkInt( talkerindex, CHAR_WORKFMINDEXI), buf); sprintf(message, "[族長廣播]%s", buf); saacproto_ACFMAnnounce_send( acfd, CHAR_getChar( talkerindex, CHAR_FMNAME), CHAR_getInt( talkerindex, CHAR_FMINDEX), CHAR_getWorkInt( talkerindex, CHAR_WORKFMINDEXI), message, color ); return; } } makeEscapeString( buf, message, sizeof(buf)); playernum = CHAR_getPlayerMaxNum(); for( i = 0; i < playernum; i ++ ) { BOOL flg = FALSE; if( CHAR_getCharUse(i) == FALSE ) continue; if( CHAR_getInt( i, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) continue; if( CHAR_getInt( i, CHAR_FLOOR) != CHAR_getWorkInt( meindex, CHAR_WORK_FLOOR) ){ continue; } if( CHAR_getWorkInt( meindex, CHAR_WORK_MODE) == 0 ) { x = CHAR_getInt( i, CHAR_X); y = CHAR_getInt( i, CHAR_Y); if( x >= CHAR_getWorkInt( meindex, CHAR_WORK_LX) && x <= CHAR_getWorkInt( meindex, CHAR_WORK_RX) && y >= CHAR_getWorkInt( meindex, CHAR_WORK_LY) && y <= CHAR_getWorkInt( meindex, CHAR_WORK_RY)){ flg = TRUE; } }else { flg = TRUE; } if( flg) { CHAR_talkToCli( i, talkerindex, msg, CHAR_COLORYELLOW); if( CHAR_getWorkInt( meindex, CHAR_WORK_WIND) == 1 ) { if( CHAR_getWorkInt( i, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE) { int fd = getfdFromCharaIndex( i); if( fd != -1 ) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, CHAR_WINDOWTYPE_MICMESSAGE, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), message); } } } } } }
int AngelCreate( int angelindex) { int emptyitem1, emptyitem2; int angeltokenindex, herotokenindex; char msgbuf[1024]/*, nameinfo[1024]*/; int mindex; char herocdkey[64]; char heroname[64]; if( !CHAR_CHECKINDEX( angelindex)) return FALSE; print(" 天使答应了!! "); mindex = checkIfAngel( angelindex); if( mindex == -1 || missiontable[mindex].flag == MISSION_TIMEOVER ) { //print("\n ANGEL错误!!Table逾时或无资料??:%d ", angelindex ); CHAR_talkToCli( angelindex, -1, "很抱歉,你太晚回答,已经逾时了。", CHAR_COLORYELLOW); sprintf( msgbuf, " 回答逾时或无资料 i:%d 使者:%s %s ", mindex, CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME)); print( msgbuf); LogAngel( msgbuf); return FALSE; } if( missiontable[mindex].flag != MISSION_WAIT_ANSWER ) { print(" 旗标不符:%d ", missiontable[mindex].flag); return FALSE; } if( CHAR_findEmptyItemBoxNo( angelindex ) < 2 ){ CHAR_talkToCli( angelindex, -1, "空间栏位不足。至少要有两个空道具栏位。", CHAR_COLORYELLOW); return TRUE; } getStringFromIndexWithDelim( missiontable[mindex].heroinfo, ":", 1, herocdkey, sizeof(herocdkey)); getStringFromIndexWithDelim( missiontable[mindex].heroinfo, ":", 2, heroname, sizeof(heroname)); angeltokenindex = ITEM_makeItemAndRegist( ANGELITEM ); if( angeltokenindex != -1 ){ /*if( ITEM_getInt( angeltokenindex, ITEM_TYPE) != ITEM_ANGELTOKEN) { print(" 制作使者信物失败 "); ITEM_endExistItemsOne( angeltokenindex); return; }*/ //sprintf( nameinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME ) ); ITEM_setChar( angeltokenindex, ITEM_ANGELINFO, missiontable[mindex].angelinfo); ITEM_setChar( angeltokenindex, ITEM_HEROINFO, missiontable[mindex].heroinfo); sprintf( msgbuf, "%d", missiontable[mindex].mission); ITEM_setChar( angeltokenindex, ITEM_ANGELMISSION, msgbuf); //sprintf( msgbuf, "%s(%s)", ITEM_getChar( angeltokenindex, ITEM_NAME), CHAR_getChar( angelindex, CHAR_NAME ) ); //ITEM_setChar( angeltokenindex, ITEM_NAME, msgbuf); //ITEM_setChar( angeltokenindex, ITEM_SECRETNAME, msgbuf); //sprintf( msgbuf, "这是使者 %s 与勇者 %s 专属的信物", CHAR_getChar( angelindex, CHAR_NAME), heroname ); sprintf( msgbuf, "精灵使者 %s 的信物,装备後不遇敌。", CHAR_getChar( angelindex, CHAR_NAME) ); ITEM_setChar( angeltokenindex, ITEM_EFFECTSTRING, msgbuf); emptyitem1 = CHAR_addItemSpecificItemIndex( angelindex, angeltokenindex); CHAR_sendItemDataOne( angelindex, emptyitem1); LogItem( CHAR_getChar( angelindex, CHAR_NAME ), CHAR_getChar( angelindex, CHAR_CDKEY ), angeltokenindex, "AddItem(制作道具 使者信物)", CHAR_getInt( angelindex,CHAR_FLOOR), CHAR_getInt( angelindex,CHAR_X ), CHAR_getInt( angelindex,CHAR_Y ), ITEM_getChar( angeltokenindex, ITEM_UNIQUECODE), ITEM_getChar( angeltokenindex, ITEM_NAME), ITEM_getInt( angeltokenindex, ITEM_ID) ); CHAR_talkToCli( angelindex, -1,"得到使者的信物。", CHAR_COLORYELLOW); }else{ print("制作使者的信物失败。" ); return FALSE; } herotokenindex = ITEM_makeItemAndRegist( HEROITEM ); if( herotokenindex != -1 ){ /*if( ITEM_getInt( herotokenindex, ITEM_TYPE) != ITEM_HEROTOKEN) { print(" 制作勇者信物失败 "); ITEM_endExistItemsOne( herotokenindex); ITEM_endExistItemsOne( angeltokenindex); CHAR_sendItemDataOne( angelindex, emptyitem1); return; }*/ //sprintf( nameinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME ) ); ITEM_setChar( herotokenindex, ITEM_ANGELINFO, missiontable[mindex].angelinfo); ITEM_setChar( herotokenindex, ITEM_HEROINFO, missiontable[mindex].heroinfo); sprintf( msgbuf, "%d", missiontable[mindex].mission); ITEM_setChar( herotokenindex, ITEM_ANGELMISSION, msgbuf); //sprintf( msgbuf, "%s(%s)", ITEM_getChar( herotokenindex, ITEM_NAME), heroname ); //ITEM_setChar( herotokenindex, ITEM_NAME, msgbuf); //ITEM_setChar( herotokenindex, ITEM_SECRETNAME, msgbuf); //sprintf( msgbuf, "这是勇者 %s 与使者 %s 专属的信物", heroname, CHAR_getChar( angelindex, CHAR_NAME) ); sprintf( msgbuf, "勇者 %s 的信物,使者使用可传送至勇者身边。", heroname ); ITEM_setChar( herotokenindex, ITEM_EFFECTSTRING, msgbuf); emptyitem2 = CHAR_addItemSpecificItemIndex( angelindex, herotokenindex); CHAR_sendItemDataOne( angelindex, emptyitem2); LogItem( CHAR_getChar( angelindex, CHAR_NAME ), CHAR_getChar( angelindex, CHAR_CDKEY ), herotokenindex, "AddItem(制作道具 勇者信物)", CHAR_getInt( angelindex,CHAR_FLOOR), CHAR_getInt( angelindex,CHAR_X ), CHAR_getInt( angelindex,CHAR_Y ), ITEM_getChar( herotokenindex, ITEM_UNIQUECODE), ITEM_getChar( herotokenindex, ITEM_NAME), ITEM_getInt( herotokenindex, ITEM_ID) ); CHAR_talkToCli( angelindex, -1,"得到勇者的信物。", CHAR_COLORYELLOW); }else{ print("制作勇者的信物失败。" ); ITEM_endExistItemsOne( angeltokenindex); CHAR_sendItemDataOne( angelindex, emptyitem1); return FALSE; } // 更新至AC Server //sprintf( nameinfo, "%s:%s", CHAR_getChar( angelindex, CHAR_CDKEY), CHAR_getChar( angelindex, CHAR_NAME ) ); sprintf( msgbuf, "%s|%d", missiontable[mindex].angelinfo, missionlist[missiontable[mindex].mission].limittime ); saacproto_ACMissionTable_send( acfd, MISSION_DOING, 4, msgbuf, ""); //CHAR_talkToCli( angelindex, -1, "天之声:非常感谢你答应帮忙,那我就将信物交给你了,请将勇者的信物转交给勇者。", CHAR_COLORYELLOW); lssproto_WN_send( getfdFromCharaIndex(angelindex), WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_YES, -1, -1, "非常感谢你答应帮忙,那我就将信物交给你了,请将勇者的信物转交给勇者。"); #ifdef _ANGLE_EMAIL int maxchar = CHAR_getPlayerMaxNum(); int i; for( i =0; i <maxchar; i++) { if( !CHAR_CHECKINDEX( i) ) continue; if( CHAR_getInt( i, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) continue; if( strcmp( herocdkey, CHAR_getChar( i, CHAR_CDKEY)) ) continue; if( strcmp( heroname, CHAR_getChar( i, CHAR_NAME)) ) continue; if( ADDRESSBOOK_AutoaddAddressBook( angelindex, i) == TRUE ){ char token[256]; sprintf( token, "系统自动为你和英雄 %s 交换名片。", CHAR_getChar( i, CHAR_NAME )); CHAR_talkToCli( angelindex, -1, token, CHAR_COLORRED); } if( ADDRESSBOOK_AutoaddAddressBook( i, angelindex) == TRUE ){ char token[256]; sprintf( token, "系统自动为你和使者 %s 交换名片。", CHAR_getChar( angelindex, CHAR_NAME )); CHAR_talkToCli( i, -1, token, CHAR_COLORRED); } break; } #endif sprintf( msgbuf, " 使者答应帮忙了 i:%d 使者:%s 勇者:%s ci=%d ", mindex, missiontable[mindex].angelinfo, missiontable[mindex].heroinfo, angelindex); print( msgbuf); LogAngel( msgbuf); return FALSE; }
void ADDRESSBOOK_DispatchMessage( char *cd, char *nm, char *value, int mode) { int i; char work[256]; int online,level,duelpoint, faceimagenumber, transmigration; int playernum = CHAR_getPlayerMaxNum(); int ret; getStringFromIndexWithDelim( value, "|" , 1 , work , sizeof( work )); online = atoi( work); getStringFromIndexWithDelim( value, "|" , 2 , work , sizeof( work )); level = atoi( work); getStringFromIndexWithDelim( value, "|" , 3 , work , sizeof( work )); duelpoint = atoi( work); getStringFromIndexWithDelim( value, "|" , 4 , work , sizeof( work )); faceimagenumber = atoi( work); ret = getStringFromIndexWithDelim( value, "|" , 5 , work , sizeof( work )); if( ret ) { transmigration = atoi( work); } else { transmigration = 0; } if( online == getServernumber()) { for( i = 0 ; i < playernum ; i++) { if( CHAR_CHECKINDEX( i )) { char *c = CHAR_getChar( i, CHAR_CDKEY); char *n = CHAR_getChar( i, CHAR_NAME); if( c == NULL || n == NULL ) continue; if( strcmp( c , cd ) == 0 && strcmp( n, nm ) == 0 ) { break; } } } if( i == playernum ) { online = 0; saacproto_Broadcast_send( acfd,cd, nm, "offline", 1); } } for( i = 0 ; i < playernum ; i++) { if( CHAR_CHECKINDEX( i )) { int j; for( j = 0 ; j < ADDRESSBOOK_MAX ; j++) { ADDRESSBOOK_entry *ae; ae = CHAR_getAddressbookEntry( i ,j ); if( ae && ae->use == TRUE && strcmp( ae->cdkey , cd ) == 0 && strcmp( ae->charname, nm ) == 0 ) { if( mode == 0 ) { ae->use = FALSE; }else { ae->online = online; ae->level = level; ae->duelpoint = duelpoint; ae->graphicsno = faceimagenumber; ae->transmigration = transmigration; } ADDRESSBOOK_sendAddressbookTableOne( i,j ); break; } } } } }
void ADDRESSBOOK_notifyLoginLogout( int cindex , int flg ) { int i; char *cd=NULL; char *nm = CHAR_getChar( cindex , CHAR_NAME ); int playernum = CHAR_getPlayerMaxNum(); if( !CHAR_CHECKINDEX( cindex ) )return; cd = CHAR_getChar( cindex, CHAR_CDKEY); CHAR_send_DpDBUpdate_AddressBook( cindex, flg ); for( i = 0 ; i < playernum ; i++){ if( CHAR_CHECKINDEX( i) && i != cindex ) { int j; for( j = 0 ; j<ADDRESSBOOK_MAX ; j++){ ADDRESSBOOK_entry *ae; ae = CHAR_getAddressbookEntry( i , j ); if( ae && ae->use == TRUE && strcmp( ae->cdkey , cd ) == 0 && strcmp( ae->charname, nm ) == 0 ){ ae->online = (flg == 0 ) ? 0: getServernumber(); ae->level = CHAR_getInt( cindex , CHAR_LV ); ae->duelpoint = CHAR_getInt( cindex, CHAR_DUELPOINT); ae->graphicsno = CHAR_getInt( cindex, CHAR_FACEIMAGENUMBER ); ae->transmigration = CHAR_getInt( cindex, CHAR_TRANSMIGRATION); ADDRESSBOOK_sendAddressbookTableOne( i,j ); break; } } } } if( flg == 0 ){ saacproto_Broadcast_send( acfd,cd, nm, "offline", 1); }else if( flg == 1 ) { for( i = 0 ; i < ADDRESSBOOK_MAX; i++ ){ int j; ADDRESSBOOK_entry* ae; ae = CHAR_getAddressbookEntry( cindex, i ); if( ae->use == 0 )continue; ae->online = 0; for( j=0 ; j < playernum ; j++ ) { if( CHAR_CHECKINDEX( j) && strcmp( ae->cdkey, CHAR_getChar( j, CHAR_CDKEY)) == 0 && strcmp( ae->charname, CHAR_getChar( j, CHAR_NAME) )== 0){ ae->level = CHAR_getInt( j, CHAR_LV ); ae->graphicsno = CHAR_getInt( j, CHAR_FACEIMAGENUMBER ); ae->online = getServernumber(); ae->transmigration = CHAR_getInt( j, CHAR_TRANSMIGRATION); break; } } if( j == playernum) { #ifndef _DEATH_CONTEND char buff[512]; char escapebuf[1024]; ae->online = 0; snprintf( buff, sizeof(buff), "%s_%s", ae->cdkey, ae->charname); makeEscapeString( buff, escapebuf, sizeof(escapebuf)); saacproto_DBGetEntryString_send( acfd, DB_ADDRESSBOOK, escapebuf, 0,0); #endif } } ADDRESSBOOK_sendAddressbookTable(cindex); saacproto_Broadcast_send( acfd,cd, nm, "online", 1); saacproto_MessageFlush_send( acfd, cd, nm); } }
/*------------------------------------------------------------ * ¥¢¥É¥ì¥¹¥Ö¥Ã¥¯¤Î¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤¹¤ë * saac ¤«¤émsg ¤ò¼õ¤±¤È¤Ã¤Æ¥¯¥é¥¤¥¢¥ó¥È¤Ë¥Ý¥¹¥È¤¹¤ë¡e * * ÊÖ¤êÃÍ ------------------------------------------------------------*/ BOOL ADDRESSBOOK_sendMessage_FromOther( char *fromcdkey, char *fromcharaname, char *tocdkey, char *tocharaname, char* text , int color ) { #define ADDRESSBOOK_SYSTEM "system" int i ; char tmpmsg[256]; int playernum = CHAR_getPlayerMaxNum(); /* ¥µ¡¼¥Ð¡¼ ¤ò¸¡º÷¤¹¤ë */ for( i = 0 ; i < playernum ; i ++){ if( CHAR_CHECKINDEX( i) && strcmp( CHAR_getChar( i, CHAR_CDKEY), tocdkey) == 0 && strcmp( CHAR_getChar( i, CHAR_NAME), tocharaname) == 0) { int index_to_my_info; /* * CDKEY ¤â ¥¥ã¥é ¤â°ìÃפ·¤¿¡e¤½¤Î¥¥ã¥é¥¯¥¿¤Î * ¥¢¥É¥ì¥¹¥Ö¥Ã¥¯¤Ë¼«Ê¬¤Î¾ð ¤¬¤¢¤ë¤«Ä´¤Ù¤Æ¡b * ¸ºß¤·¤¿¤é¡bMSG¤¹¤ë¡e */ /* ¼³¥¹ ¥à¥á¥Ã¥»¡¼¥¸¤¬µ¢¤Ã¤Æ¤¤¿ */ if( strcmp( fromcdkey, ADDRESSBOOK_SYSTEM) == 0 && strcmp( fromcharaname, ADDRESSBOOK_SYSTEM ) == 0 ) { /* ¼³¥¹ ¥à¥á¥Ã¥»¡¼¥¸¤òÅǤ¯ */ CHAR_talkToCli( i, -1, text , color ); break; } index_to_my_info = ADDRESSBOOK_getIndexInAddressbook( i , fromcdkey, fromcharaname); if( index_to_my_info < 0 ){ /* * Áê¼ê¤¬¼«Ê¬¤òËõ¾Ã¤·¤Æ¤·¤Þ¤Ã¤Æ¤ë¡e */ snprintf( tmpmsg, sizeof( tmpmsg), ADDRESSBOOK_RETURNED2, tocharaname, tocharaname); /* Á÷¤ê¼ç¤Ë¤â¥á¥Ã¥»¡¼¥¸ */ saacproto_Message_send( acfd, ADDRESSBOOK_SYSTEM , ADDRESSBOOK_SYSTEM, fromcdkey, fromcharaname, tmpmsg, CHAR_COLORYELLOW); } else { int fd = getfdFromCharaIndex( i); if( fd != -1 ) { lssproto_MSG_send( fd , index_to_my_info , text , color ); /* ¤Ò¥°¤È¤ê */ printl( LOG_TALK, "CD=%s\tNM=%s\tT=%s" , fromcdkey, fromcharaname, text ); } } break; } } if( i == playernum ) return FALSE; return TRUE; }
void NPC_EventSetFlg(int talker,int shiftbit) { int point=0; int array; int shift; #ifdef _TEACHER_SYSTEM int iGetFame = 0; #endif /*-- -1���º�����绥ئ����ì���� -*/ if(shiftbit==-1) return; if(shiftbit<=255){ array = shiftbit / 32; shift = shiftbit % 32; point = CHAR_getInt( talker, CHAR_ENDEVENT+array); // Arminius 8.24 prevent wash dp if (!(point & (1 << shift))) { // CoolFish: Family Adv 2001/8/4 AddFMAdv(talker, shiftbit); #ifdef _TEACHER_SYSTEM if(shiftbit < arraysizeof(FMAdvTbl)) iGetFame = FMAdvTbl[shiftbit]; #endif } #ifdef _TEACHER_SYSTEM iGetFame /= 20; // ��ʦ���ѧ������������ 5% (1/20) // ������õ�������û�д��0 if(iGetFame > 0){ // �����û�е�ʦ if(strlen(CHAR_getChar(talker,CHAR_TEACHER_ID)) > 0 && strlen(CHAR_getChar(talker,CHAR_TEACHER_NAME)) > 0){ int iPlayernum = CHAR_getPlayerMaxNum(),i; char szMsg[128]; // ��鵼ʦ�ڲ������� for(i=0;i<iPlayernum;i++){ if(CHAR_getCharUse(i) == FALSE) continue; if(strcmp(CHAR_getChar(talker,CHAR_TEACHER_ID),CHAR_getChar(i,CHAR_CDKEY)) == 0 && strcmp(CHAR_getChar(talker,CHAR_TEACHER_NAME),CHAR_getChar(i,CHAR_NAME)) == 0){ float fGetFame = (float)iGetFame/100; // ��ʦ������ CHAR_setWorkInt(i,CHAR_WORK_GET_TEACHER_FAME,CHAR_getWorkInt(i,CHAR_WORK_GET_TEACHER_FAME) + iGetFame); sprintf(szMsg,"���ѧ�� %s %.2f ������",CHAR_getChar(talker,CHAR_NAME),fGetFame); CHAR_talkToCli(i,-1,szMsg,CHAR_COLORYELLOW); break; } } } } #endif point = point | (1 << shift); CHAR_setInt( talker, CHAR_ENDEVENT+array, point); } else if(shiftbit<=510){ array = (shiftbit-255) / 32; shift = (shiftbit-255) % 32; point = CHAR_getInt( talker, CHAR_ENDEVENT9+array); point = point | (1 << shift); CHAR_setInt( talker, CHAR_ENDEVENT9+array, point); } }
/*----------------------------------------------- * ¼¡¤Î¥ª¡¼¥¯¥·¥ç¥ó¤Î»þ´Ö¤ÈÉô²°Ì¾¤ò¥ï¡¼¥¯¤Ë¥»¥Ã¥È¤¹¤ë *----------------------------------------------*/ static BOOL NPC_RoomAdminNew_SetNextAuction( int meindex) { int i, j; int hitindex = -1; int charnum = CHAR_getCharNum(); char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; struct tm tmwk; /* ÍËÆü¤Ê¤É¤ò¼èÆÀ¤¹¤ë*/ memcpy( &tmwk, localtime( ( time_t *)&NowTime.tv_sec), sizeof( tmwk)); NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); /* ¥É¥¢¤ò¸¡º÷¤¹¤ë¡£NPC_DoorSearchByName()¤ò»È¤Ã¤¿¤é³Ú¤À¤±¤É * ̵Â̤¬Â¿¤¯¤Ê¤ê¤½¤¦¤Ê¤Î¤Ç¤³¤³¥ª¥ê¥¸¥Ê¥ë */ for( i = CHAR_getPlayerMaxNum()+ CHAR_getPetMaxNum(); i < charnum; i ++ ) { if( CHAR_getInt( i, CHAR_WHICHTYPE) != CHAR_TYPEDOOR) { continue; } if( CHAR_getWorkInt( i, CHAR_WORKDOORPASSFLG) == 0 ) { continue; } /* ̾Á°¤¬´É³í¤Î¤â¤Î¤«¥Á¥§¥Ã¥¯¤¹¤ë */ for( j = 3; ; j ++ ) { int rc; char *doorname; char buf[256]; int dataexist; NPC_ROOMINFO data; rc = getStringFromIndexWithDelim( argstr, "|" , j, buf,sizeof(buf) ); if( rc != TRUE ) { break; } doorname = CHAR_getWorkChar( i, CHAR_WORKDOORNAME); /* ¥É¥¢Ì¾¤¬°ìÃפ·¤¿ */ if( strcmp( buf, doorname ) != 0 ) { continue; } /* ÍËÆü¤¬°ìÃפ¹¤ë */ if( atoi( CHAR_getWorkChar( i, CHAR_WORKDOORWEEK)) != tmwk.tm_wday) { break; } /* °ì±þ½é´ü²½ */ memset( &data, 0, sizeof( data)); /* ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤«¤é¥Ç¡¼¥¿¤òÆɤà */ if( NPC_RoomAdminNew_ReadFile( doorname, &data) ) { struct tm tmdoor; /* ¤³¤³¤Ç´ü¸ÂÀÚ¤ì¥Á¥§¥Ã¥¯¤ò¤ä¤Ã¤Æ¤ä¤ë¡£ * ´ü¸Â¤¬ÀÚ¤ì¤Æ¤¤¤¿¤é¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë * »ÅÍÍŪ¤Ë¤¢¤Þ¤ê¤³¤Î¥ë¡¼¥Á¥óÄ̤ë»ö¤Ï¤Ê¤¤¤È»×¤¦¡£ */ if( data.expire < NowTime.tv_sec) { NPC_RoomAdminNew_WriteDataFile( meindex, -1,doorname, NULL, 0); /* ¥É¥¢¤â¤¤ì¤¤¤Ë*/ NPC_DoorSetPasswd( i, "8hda8iauia90494jasd9asodfasdf89"); CHAR_setWorkInt( i, CHAR_WORKDOOREXPIRETIME, 0xffffffff); break; } /* º£Æü¤ÇÀÚ¤ì¤ëʪ·ï¤Ê¤é£Ï£Ë */ memcpy( &tmdoor, localtime( ( time_t *)&data.expire), sizeof( tmdoor)); if( tmdoor.tm_mon != tmwk.tm_mon || tmdoor.tm_mday != tmwk.tm_mday) { break; } dataexist = TRUE; } else { dataexist = FALSE; } /* ¸½ºß¤Î»þ´Ö¤è¤ê¸å¤Ç¤¢¤ë»ö¡£ */ if( tmwk.tm_hour > atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))){ break; } if( tmwk.tm_hour == atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))) { if( tmwk.tm_min >= atoi( CHAR_getWorkChar( i, CHAR_WORKDOORMINUTE))) { break; } } /* ¤³¤³¤Þ¤Ç¤¤¿¤é¤È¤ê¤¢¤¨¤º¤³¤Î¥É¥¢¤Ï¼¡³«ºÅ¤Ë½Ð¤ë»ñ³Ê¤¬ * ¤¢¤ë¤È¤¤¤¦»ö¡£¤³¤ì¤«¤é¾¤Î¥É¥¢¤È¥Á¥§¥Ã¥¯¤¹¤ë¡£ */ if( hitindex == -1 ) { hitindex = i; } else { /* ³«ºÅ»þ´Ö¤¬Á᤯¡¤¸½ºß¼Ú¤ê¤é¤ì¤Æ¤¤¤ë¤È¤¤¤¦¤Î¤¬Í¥Àè½ç°Ì */ if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORHOUR)) > atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))) { hitindex = i; } else if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORHOUR)) == atoi( CHAR_getWorkChar( i, CHAR_WORKDOORHOUR))) { if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORMINUTE)) > atoi( CHAR_getWorkChar( i, CHAR_WORKDOORMINUTE))) { hitindex = i; } else if( atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORMINUTE)) == atoi( CHAR_getWorkChar( i, CHAR_WORKDOORMINUTE))) { NPC_ROOMINFO datawk; int hitindexdataexist; hitindexdataexist = NPC_RoomAdminNew_ReadFile( CHAR_getWorkChar( hitindex, CHAR_WORKDOORNAME), &datawk); if( hitindexdataexist < dataexist ) { hitindex = i; } /* ¤³¤³¤Þ¤ÇÍè¤ë¤è¤¦¤Ê¤éÀè¤Îindex¤Î¤Þ¤Þ¤È¤¹¤ë¡£*/ } } } } } if( hitindex > 0 ) { /* ³«ºÅ»þ´Ö¤ò¥»¥Ã¥È */ tmwk.tm_sec = 0; tmwk.tm_min = atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORMINUTE)); tmwk.tm_hour = atoi( CHAR_getWorkChar( hitindex, CHAR_WORKDOORHOUR)); CHAR_setWorkInt( meindex, CHAR_WORKINT_NEXTTIME, mktime( &tmwk)); /* Éô²°Ì¾¤ò¥»¥Ã¥È */ CHAR_setWorkChar( meindex, CHAR_WORKCHAR_NEXTROOM, CHAR_getWorkChar( hitindex, CHAR_WORKDOORNAME)); } else { CHAR_setWorkInt( meindex, CHAR_WORKINT_NEXTTIME, 0); /* Éô²°Ì¾¤ò¥»¥Ã¥È */ CHAR_setWorkChar( meindex, CHAR_WORKCHAR_NEXTROOM,"" ); } /* ¸¡º÷»þ´Ö¤ò¥»¥Ã¥È */ CHAR_setWorkInt( meindex, CHAR_WORKINT_SEARCHROOMTIME, NowTime.tv_sec); return( TRUE); }
int NPC_Lua_NLG_GetMaxPlayNum(lua_State *_NLL) { int TM_playernum = CHAR_getPlayerMaxNum(); LRetInt(_NLL, TM_playernum); }
/*------------------------------------------------------------ * ¥¢¥É¥ì¥¹¥Ö¥Ã¥¯¤Î¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤¹¤ë * MSG¥×¤Ò¥È¥³¥ë¤«¤é¤Ä¤«¤ï¤ì¤ë¡e * * ¤ä¤ë¤³¤È¤Ï¡bconnection¤«¤écdkey¤Ç¸¡º÷¤·¤Æ¡b¥¥ã¥é ¤â * ¥Ò¥Ã¥È¤·¤¿¤é¡b MSG_send¤¹¤ë¡e¤½¤Î¤È¤¤Ë¡b¼«Ê¬¤Î¾ð ¤¬ * Áê¼ê¤Î¥ê¥¹¥È¤Ë¤Ê¤«¤Ã¤¿¤é²¿¤â¤·¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡e * °ú¿ô * cindex int ¥¥ã¥é¤Îindex * aindex int ¥¢¥É¥ì¥¹¥Ö¥Ã¥¯¤Îindex * text char* Á÷¿®¤¹¤ë »ú * color int ¿§ * ÊÖ¤êÃÍ * ¥ª¥ó¥é¥¤¥ó¤Î¥¥ã¥é¤Ë¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤·¤¿¤éTRUE , * ¥ª¥Õ¥é¥¤¥ó¤ËÅÐ ¤·¤¿¤éFALSE¤ò¤«¤¨¤¹ ------------------------------------------------------------*/ BOOL ADDRESSBOOK_sendMessage( int cindex, int aindex, char* text , int color ) { int i ; char tmpmsg[256]; char textbuffer[2048]; char *mycd; char *mycharaname = CHAR_getChar(cindex,CHAR_NAME ); struct tm tm1; ADDRESSBOOK_entry *ae; int playernum = CHAR_getPlayerMaxNum(); if( !CHAR_CHECKINDEX(cindex) )return FALSE; ae = CHAR_getAddressbookEntry( cindex , aindex ); if( ae == NULL )return FALSE; //getcdkeyFromCharaIndex(cindex, mycd,sizeof(mycd) ); mycd = CHAR_getChar( cindex, CHAR_CDKEY); memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); snprintf( textbuffer, sizeof( textbuffer), "%2d/%02d %2d:%02d|%s|-1", tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, text); /* ¥µ¡¼¥Ð¡¼ ¤Ë¤¤¤ë»þ */ for( i = 0 ; i < playernum ; i ++){ if( CHAR_CHECKINDEX( i) && strcmp( CHAR_getChar( i, CHAR_CDKEY), ae->cdkey) == 0 && strcmp( CHAR_getChar( i, CHAR_NAME), ae->charname) == 0 ) { /* * CDKEY ¤â ¥¥ã¥é ¤â°ìÃפ·¤¿¡e¤½¤Î¥¥ã¥é¥¯¥¿¤Î * ¥¢¥É¥ì¥¹¥Ö¥Ã¥¯¤Ë¼«Ê¬¤Î¾ð ¤¬¤¢¤ë¤«Ä´¤Ù¤Æ¡b * ¸ºß¤·¤¿¤é¡bMSG¤¹¤ë¡e */ int index_to_my_info = ADDRESSBOOK_getIndexInAddressbook( i , mycd, mycharaname); int fd; if( index_to_my_info < 0 ){ /* * Áê¼ê¤¬¼«Ê¬¤òËõ¾Ã¤·¤Æ¤·¤Þ¤Ã¤Æ¤ë¡e * °ì±þ ¿Í¤Ë¡f¥á¡¼¥ë¤¬ ¤¿¤È¤À¤±ÄÌÃΤ¹¤ë¡e */ //snprintf( tmpmsg, sizeof( tmpmsg), // ADDRESSBOOK_RETURNED1, // ae->charname // ); //CHAR_talkToCli( CONNECT_getCharaindex(i), -1, // tmpmsg , CHAR_COLORYELLOW ); snprintf( tmpmsg, sizeof( tmpmsg), ADDRESSBOOK_RETURNED2, CHAR_getChar( i, CHAR_NAME), CHAR_getChar( i, CHAR_NAME)); /* Á÷¤ê¼ç¤Ë¤â¥á¥Ã¥»¡¼¥¸ */ CHAR_talkToCli( cindex, -1, tmpmsg , CHAR_COLORYELLOW ); return FALSE; } fd = getfdFromCharaIndex( i); if( fd != -1 ) { lssproto_MSG_send( fd , index_to_my_info , textbuffer , color ); /* ¤Ò¥°¤È¤ê */ printl( LOG_TALK, "CD=%s\tNM=%s\tT=%s" , mycd, mycharaname, textbuffer ); } snprintf( tmpmsg , sizeof( tmpmsg),ADDRESSBOOK_SENT, ae->charname ); CHAR_talkToCli(cindex,-1, tmpmsg , color ); // WON ADD ×¥¿snprintf·|¾ÉP·í¾÷ªºbug { char tmp[1000]; sprintf( tmp , "ADDRESSBOOK_sendMessage:" "Send MSG to: %s %s\n", ae->cdkey , ae->charname ); // print( tmp ); } CHAR_setInt( cindex, CHAR_SENDMAILCOUNT, CHAR_getInt( cindex, CHAR_SENDMAILCOUNT)+1); return TRUE; } } /* ¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿»þ¤Ï¡f¥¢¥«¥¦¥ó¥È¥µ¡¼¥Ð¡¼¤ËÁ÷¤ë */ saacproto_Message_send( acfd, mycd, mycharaname, ae->cdkey, ae->charname, textbuffer, color); CHAR_setInt( cindex, CHAR_SENDMAILCOUNT, CHAR_getInt( cindex, CHAR_SENDMAILCOUNT)+1); snprintf( tmpmsg , sizeof( tmpmsg),ADDRESSBOOK_SENT,ae->charname ); CHAR_talkToCli( cindex,-1, tmpmsg , CHAR_COLORWHITE ); return FALSE; }
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); } } } }