/*----------------------------------------------- * Í¼Ô¥é¥ó¥¥ó¥°¥Õ¥¡¥¤¥ëÆɤ߹þ¤ß¡õɽ¼¨ * * °ú¿ô meindex ¥¥ã¥é¥¤¥ó¥Ç¥Ã¥¯¥¹¡£¥é¥ó¥¥ó¥°NPC¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¡£ * talkerindex Ïä·¤«¤±¤é¤ì¤¿¿Í¤Îindex¡£¤³¤ì¤Ëtalk¤òÁ÷¿®¤¹¤ë¡£ * admname ÉÔÆ°»º²°¤µ¤ó¤Î̾Á° * *----------------------------------------------*/ static void NPC_RoomAdminNew_ReadScoreFile( int meindex, int talkerindex, char *admname) { int cnt; char filename[128]; char line[1024]; FILE *fp; /* ¥Õ¥¡¥¤¥ë̾¤òÀ¸À® */ strcpy( filename, NPC_ROOMADMINNEW_DATADIR); strcat( filename, admname); strcat( filename, NPC_ROOMADMINNEW_RANKING_EXTENSION); fp = fopen( filename, "r"); if( !fp) return; cnt = 1; while( fgets( line, sizeof( line), fp)) { int gold,bidtime; char charaname[32],owntitle[32]; char tmp[64]; char outbuf[1024], buf[256]; struct tm tmwk; getStringFromIndexWithDelim( line, "|" , 1 , buf,sizeof(buf) ); gold = atoi(buf); getStringFromIndexWithDelim( line, "|" , 2 , buf,sizeof(buf) ); bidtime = atoi(buf); getStringFromIndexWithDelim( line, "|" , 4 , buf,sizeof(buf) ); strcpy( charaname, makeStringFromEscaped( buf)); getStringFromIndexWithDelim( line, "|" , 5 , buf,sizeof(buf) ); strcpy( owntitle, makeStringFromEscaped( buf)); if( strlen( owntitle) != 0 ) { strcpy( tmp, "["); strcat( tmp, owntitle); strcat( tmp, "] "); strcpy( owntitle, tmp); } else { strcpy( owntitle, " "); } memcpy( &tmwk, localtime( (time_t *)&bidtime), sizeof( tmwk)); snprintf( outbuf, sizeof( outbuf), NPC_ROOMADMINNEW_MSG_RANKING, cnt, tmwk.tm_year + 1900, tmwk.tm_mon+1, tmwk.tm_mday, gold,charaname,owntitle ); CHAR_talkToCli( talkerindex, meindex,outbuf, NPC_RANKING_MSGCOLOR); cnt ++; } fclose( fp); }
/*----------------------------------------------- * ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤òÆɤó¤Ç³ºÅö¤¹¤ëÉô²°¤¬¤¢¤ì¤Ð * ¥Ç¡¼¥¿¤ò³ÊǼ¤·¤ÆÊÖ¤¹¡£ *----------------------------------------------*/ BOOL NPC_RoomAdminNew_ReadFile( char *roomname, NPC_ROOMINFO *data) { FILE *fp; char line[1024]; char buf2[128]; char filename[128]; /* ¥Õ¥¡¥¤¥ë̾¤òÀ¸À® */ strcpy( filename, NPC_ROOMADMINNEW_DATADIR); strcat( filename, roomname); strcat( filename, NPC_ROOMADMINNEW_EXTENSION); fp = fopen( filename, "r"); if( !fp) return FALSE; fgets( line, sizeof( line), fp); /* ¥Ç¡¼¥¿¥»¥Ã¥È */ getStringFromIndexWithDelim( line, "|" , 1 , buf2,sizeof(buf2) ); strcpy( data->cdkey, buf2); getStringFromIndexWithDelim( line, "|" , 2 , buf2,sizeof(buf2) ); strcpy( data->charaname, makeStringFromEscaped( buf2)); getStringFromIndexWithDelim( line, "|" , 3 , buf2,sizeof(buf2) ); strcpy( data->passwd, buf2); getStringFromIndexWithDelim( line, "|" , 4 , buf2,sizeof(buf2) ); if( strcmp( buf2, "max") == 0 ) { data->expire = 0xffffffff; } else { data->expire = atoi( buf2); } fclose( fp); return TRUE; }
/*----------------------------------------- * �ͷ���ʧ��������߯�Ȼ������ݱ���̫���ľ�£� * -------------------------------------------*/ void NPC_FMPKManWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int datanum = -1, fl, x, y; char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; char buf[1024], buff2[256]; if (NPC_Util_GetArgStr(meindex, npcarg, sizeof(npcarg)) == NULL) { print("GetArgStrErr"); return; } NPC_Util_GetStrFromStrWithDelim(npcarg, "WARP", buf, sizeof(buf)); getStringFromIndexWithDelim(buf, ",", 1, buff2, sizeof(buff2)); fl = atoi(buff2); getStringFromIndexWithDelim(buf, ",", 2, buff2, sizeof(buff2)); x = atoi(buff2); getStringFromIndexWithDelim(buf, ",", 3, buff2, sizeof(buff2)); y = atoi(buff2); makeStringFromEscaped( data); // print("meindex:%d seqno:%d select:%d data:%s\n", meindex, seqno, select, data); datanum = atoi( data); switch( seqno) { /*--��Ԫ��Ի�� --*/ case CHAR_WINDOWTYPE_FMPKMAN_START: if (datanum == 1) NPC_FMPKMan_selectWindow(meindex, talkerindex, 1, -1); else if (datanum == 2) NPC_FMPKMan_selectWindow(meindex, talkerindex, 2, -1); break; case CHAR_WINDOWTYPE_FMPKMAN_VIEW: break; case CHAR_WINDOWTYPE_FMPKMAN_LEAVEPK: if (select == WINDOW_BUTTONTYPE_YES) { if (CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; // shan add if(NPC_PARTY_CHAECK1( meindex, talkerindex)==FALSE) { NPC_ERR_DiSP1( meindex, talkerindex, 1); return; } CHAR_setWorkInt(talkerindex, CHAR_WORKWARPCHECK, FALSE); CHAR_warpToSpecificPoint(talkerindex, fl, x, y); } break; default: break; } }
/*------------------------------------------------------------ * »ú ²½¤µ¤ì¤Æ¤¤¤ë¥¢¥É¥ì¥¹¥Ö¥Ã¥¯¥¨¥ó¥È¥ê¤ò¡b¹½Â¤ ¤Ë¤Ê¶³¤¹¡e * ¤³¤Î·ë²Ì¹½Â¤ ¤Îuse°Ê³°¤Î¾ð ¤Ï´°àú¤Ë¤Ê¤ë¡e * °ú¿ô * in char* »ú * a ADDRESSBOOK_entry* ¥Ç¡¼¥¿¤ò¼ý¤á¤ë½ê * ÊÖ¤êÃÍ * ¤Ä¤Í¤ËTRUE ------------------------------------------------------------*/ BOOL ADDRESSBOOK_makeAddressbookEntry( char *in , ADDRESSBOOK_entry *a ) { char work1[256], work2[256] , work3[256] , work4[256],work5[256],work6[256]; int ret; if( strlen( in ) == 0 ){ memset( a,0,sizeof(ADDRESSBOOK_entry) ); a->use = 0; return TRUE; } getStringFromIndexWithDelim( in, "|" , 1 , work1 , sizeof( work1 )); getStringFromIndexWithDelim( in, "|" , 2 , work2 , sizeof( work2 )); getStringFromIndexWithDelim( in, "|" , 3 , work3 , sizeof( work3 )); getStringFromIndexWithDelim( in, "|" , 4 , work4 , sizeof( work4 )); getStringFromIndexWithDelim( in, "|" , 5 , work5 , sizeof( work5 )); work6[0] = '\0'; ret = getStringFromIndexWithDelim( in, "|" , 6 , work6 , sizeof( work6 )); if( ret == FALSE ) { a->transmigration = 0; } else { a->transmigration = atoi( work6); } a->use = 1; makeStringFromEscaped( work1 ); makeStringFromEscaped( work2 ); strcpysafe( a->cdkey , sizeof(a->cdkey) , work1 ); strcpysafe( a->charname , sizeof(a->charname), work2 ); a->level = atoi( work3 ); a->duelpoint = atoi( work4 ); a->graphicsno = atoi( work5 ); return FALSE; }
int getCharIndexByName( char *id , char *charname ) { int i; for(i=0;i<MAXCHAR_PER_USER;i++){ char output[CHARDATASIZE]; if( loadCharOne( id , i , output , sizeof( output )) < 0 ){ /* ؤÖл¯ÖÐÔ¡å */ continue; } else { /* ƽÅҷ»¥Ðå»þØÆÐ× */ char cn[CHARDATASIZE]; getCharNameFromString( output , cn ); /* EscapeëݩÈÊ */ if( strcmp( charname , makeStringFromEscaped(cn) ) == 0 ){ return i; }else{ } } } return -1; }
void NPC_PetRaceMasterWindowTalked(int meindex, int talkerindex, int seqno, int select, char *data) { int datanum = 0; makeStringFromEscaped(data); datanum = atoi(data); switch(seqno) { case CHAR_WINDOWTYPE_PETRACEMASTER_START: if (datanum == 1) NPC_PetRaceMaster_selectWindow(meindex, talkerindex, 1, -1); else if (datanum == 2) NPC_PetRaceMaster_selectWindow(meindex, talkerindex, 2, -1); break; case CHAR_WINDOWTYPE_PETRACEMASTER_RULE: if (datanum == 3) NPC_PetRaceMaster_selectWindow(meindex, talkerindex, 1, -1); case CHAR_WINDOWTYPE_PETRACEMASTER_PET: case CHAR_WINDOWTYPE_PETRACEMASTER_LEAVE: default: break; } }
int getCharIndexByName( char *id , char *charname ) { int i; for(i=0;i<MAXCHAR_PER_USER;i++){ char output[CHARDATASIZE]; if( loadCharOne( id , i , output , sizeof( output )) < 0 ){ /* 丐中化中月〞 */ continue; } else { /* 平乓仿互繡箕仄凶 */ char cn[CHARDATASIZE]; getCharNameFromString( output , cn ); /* Escape毛荸仁 */ if( strcmp( charname , makeStringFromEscaped(cn) ) == 0 ){ return i; }else{ } } } return -1; }
void charLoadCallback( int ti , int auth , char *c0, char* c1 , char *c2 , char *c3, char *c4, int i0 , int i1 ) { // Spock deleted 2000/11/2 //static int process_id = 0; // CoolFish: Init charindex 2001/10/16 #ifdef _NewSave int charindex = -1; #else int charindex; #endif char loadbuf[CHARDATASIZE]; char infobuf[CHARDATASIZE]; int lock = i0; char *process = c3; char *id = c0; char *passwd = c1; char *charname = c2; int mesgid = i1; char *deadline = c4; // Spock deleted 2000/11/2 //process_id++; if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ), "%d" , auth ); #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , data, mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , data, mesgid ); #endif return; } if( isLocked( id ) ){ int process=atoi(c3); #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid ); #endif DeleteMemLock(getHash(id) & 0xff, id, &process); // Èç¹ûAPÎÞËøÔòAC½âËø log("\n (%s) ACͬһÐÇϵÖظ²µÇÈ룬ÌßÈË!! ", id ); saacproto_ACKick_recv( ti, id, 1, -1); //ÌßÈË checkGSUCheck(id); return; } charindex = getCharIndexByName( id , charname ); #ifdef _NewSave //log("\nµµ°¸×°ÔØÐòºÅ:%d Õ˺Å:%s Ãû×Ö:%s\n", charindex, id, charname); #endif if( charindex < 0 ){ /* ƽÅҷ»¥Ðå»þØÆئÖм°Æ¥¾Þ·Â¡õئ¼°·Ö */ #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid , charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid ); #endif return; } // log( "loadCharOne: id:[%s] char:[%s]\n", id, charname ); if( loadCharOne( id , charindex , loadbuf ,sizeof( loadbuf ))<0){ #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid ); #endif return; }else{ #ifdef _CHAR_POOLITEM checkCharPoolItem( id); #endif #ifdef _CHAR_POOLITEM checkCharPoolPet( id); #endif } {//ttom char *c_ptr; c_ptr=loadbuf; while(*c_ptr!='\0'){ if( IS_2BYTEWORD(*c_ptr) ){ if(*(c_ptr+1)==' '){ *(c_ptr+1)=0x41; } c_ptr++; if(*c_ptr=='\0') break; } c_ptr++; } }//ttom if( lock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( lockUser( getGSName(ti) , id , charname, passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ #else // Spock 2000/11/2 if( lockUser( getGSName(ti) , id , passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ #endif saacproto_ACCharLoad_send( ti , FAILED, "lock FAIL!!" , mesgid , charindex ); return; } } memset( infobuf , 0 , sizeof( infobuf )); getCharInfoFromString( loadbuf , infobuf ); makeStringFromEscaped( infobuf ); #ifdef _NewSave saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid); #endif #ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 10, -1); //ÌßÆäËûÐÇϵ #endif } #ifdef _NewSave int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid , int charindex) #else int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid ) #endif { #ifdef _NewSave #else int charindex; #endif char savebuf[CHARDATASIZE]; int ret = -1; memset(savebuf, 0, sizeof(savebuf)); //andy_log if( strstr( charinfo, "DATAEND=") == NULL ){ FILE *fp; if( (fp=fopen( "badpetstring.txt", "a+")) != NULL ){ fprintf( fp, "%s\n", charinfo); fclose( fp); } log( "err add batpetstring.txt:%s[%s] !\n", id, charname); } if( unlock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( (ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ #else if( (ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ #endif log( "½âËø:%s ʧ°Ü!!\n", id); } } // Nuke *1 add escape if( makeSaveCharString( savebuf , sizeof( savebuf ) , charname, opt , charinfo )<0){ log("\n AC´æµµ:Ì«³¤ "); saacproto_ACCharSave_send( ti , FAILED , "too long" , mesgid ); // Spock fixed 2000/11/1 return ret; } #ifdef _NewSave if (charindex == -1) charindex = getCharIndexByName( id , charname ); #else // Nuke *1- charindex = getCharIndexByName( id , charname ); #endif if( charindex < 0 ){ int blankind = findBlankCharIndex( id ); if( blankind < 0 ){ log("\n ACCharSave:char full "); saacproto_ACCharSave_send( ti , FAILED , "char full" ,mesgid); return ret; } else { charindex = blankind; } } log( "Õ˺Å:[%s] ÈËÎï:[%s]\n", id, charname ); if( saveCharOne( id , charindex , savebuf ) < 0 ){ log("\n ACCharSave:disk I/O error or a bug "); saacproto_ACCharSave_send( ti , FAILED , "disk I/O error or a bug", mesgid ); return ret; } saacproto_ACCharSave_send( ti , SUCCESSFUL , "" , mesgid); return ret; } void charListCallback( int ti , int auth , char *c0 , char *c1 , char *c2 , char *c3 , char *c4 , int i0 , int i1 ) { char listbuf[CHARDATASIZE]; char *id = c0; int mesgid = i0; //log(" µµ°¸Áбí»ØËÝ:%s:%d \n", id, auth); if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ) , "%d" , auth ); saacproto_ACCharList_send( ti , FAILED , data , mesgid ); total_ng_charlist++; return; } // È¡ÏûÏÂÁÐ unlock ¶¯×÷ if( isLocked( id ) ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); checkGSUCheck( id ); total_ng_charlist++; return; } #ifdef _SLEEP_CHAR // Èç¹ûÎÞеµ, ½«¾ÉµµÒÆÖÁеµ { char fn_old[256], fn_new[256]; FILE *fp_old, *fp_new; int i; // ÒÆÈËÎïµµ for( i=0; i<MAXCHAR_PER_USER; i++) { makeCharFileName( id, fn_new, sizeof(fn_new), i); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharFileName( id, fn_old, sizeof(fn_old), i); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // °áÒÆ //filecopy( fn_old, fn_new); // ¸´ÖÆ log(" ÒƵµ_%s ", fn_new); } } else { fclose( fp_new); } } // ÒƲÖÎïÆ·¿âµµ makeCharPoolItemFileName( id, fn_new, sizeof(fn_new)); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharPoolItemFileName( id, fn_old, sizeof(fn_old)); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // °áÒÆ //filecopy( fn_old, fn_new); // ¸´ÖÆ log(" ÒƵµ_%s ", fn_new); } } else { fclose( fp_new); } // ÒƲֳèÎï¿âµµ makeCharPoolPetFileName( id, fn_new, sizeof(fn_new)); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharPoolPetFileName( id, fn_old, sizeof(fn_old)); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // °áÒÆ //filecopy( fn_old, fn_new); // ¸´ÖÆ log(" ÒƵµ_%s ", fn_new); } } else { fclose( fp_new); } } #endif loadCharNameAndOption( id , listbuf,sizeof(listbuf)); // Arminius saacproto_ACCharList_send( ti , SUCCESSFUL , listbuf , mesgid); total_ok_charlist++; }
void NPC_FreePetSkillShopWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int skill; int pet; int slot; int cost; int skillID=0; int petskillindex; int fd = getfdFromCharaIndex( talkerindex); char buf[64]; char argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; char msg[512]; int petindex; char msgbuf[128]; double rate= 1.0; #ifdef _STONEAGEA8XXX_S int petskCostFametemp=-1; #endif if((argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof(argstr1)))==NULL){ print("GetArgStrErr"); return; } if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) { return; } if(NPC_Util_isFaceToFace(talkerindex,meindex,2 )==FALSE){ if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return; } if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; switch( seqno) { case SELECTSKILL_START: if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != 2 ) { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); return; } NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, SKILL_WINDOW, -1); break; case SELECTSKILL_TEACH: if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != 3 ) { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); return; } makeStringFromEscaped( data); getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf)); skill=atoi(buf); getStringFromIndexWithDelim(data,"|",2,buf,sizeof(buf)); pet=atoi(buf); getStringFromIndexWithDelim(data,"|",3,buf,sizeof(buf)); slot=atoi(buf); getStringFromIndexWithDelim(data,"|",4,buf,sizeof(buf)); cost=atoi(buf); if( NPC_Util_GetStrFromStrWithDelim( argstr, "pet_skill", msg, sizeof( msg)) != NULL){ getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf)); skillID=atoi(buf); } slot--; if( slot < 0 ) return; petindex = CHAR_getCharPet( talkerindex, pet-1); if( !CHAR_CHECKINDEX(petindex) ){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){ rate = atof( msg); } #ifdef _STONEAGEA8XXX_S if( NPC_Util_GetStrFromStrWithDelim( argstr, "petskCostFame", msg, sizeof( msg)) != NULL){ getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf)); petskCostFametemp = atoi(buf); } #endif petskillindex = PETSKILL_getPetskillArray( skillID ); if( !PETSKILL_CHECKINDEX( petskillindex)){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } cost = PETSKILL_getInt( petskillindex, PETSKILL_COST ); cost = cost * rate; //條件判斷 if(CHAR_getInt(talkerindex,CHAR_GOLD) < cost && CHAR_getInt(talkerindex,CHAR_FAME)< petskCostFametemp){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return; } if( NPC_CHECKFREEPETSKILL( talkerindex, petindex, skillID ) == TRUE ){ if( Action_RunDoEventAction( meindex, talkerindex, argstr) == FALSE ){ CHAR_talkToCli( talkerindex, -1, "所需物品不足!!", CHAR_COLORYELLOW); CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); return; } CHAR_setPetSkill( petindex, slot, skillID); CHAR_setInt( talkerindex, CHAR_GOLD, ( CHAR_getInt( talkerindex, CHAR_GOLD) - cost) ); #ifdef _STONEAGEA8XXX_S if (petskCostFametemp!=-1 && petskCostFametemp!=0){ float FlpetCFameTemp; CHAR_setInt( talkerindex, CHAR_FAME, ( CHAR_getInt( talkerindex, CHAR_FAME) - petskCostFametemp) ); FlpetCFameTemp = petskCostFametemp/100; #ifdef _ADD_STATUS_2 sprintf(msgbuf,"FAME|%d",CHAR_getInt(talkerindex,CHAR_FAME)/100); lssproto_S2_send(fd,msgbuf); #endif snprintf( msgbuf, sizeof( msgbuf ), "扣除聲望點數:%4.2f",FlpetCFameTemp); } #endif CHAR_talkToCli( talkerindex, -1, msgbuf, CHAR_COLORYELLOW); snprintf( msgbuf, sizeof( msgbuf ), "W%d",pet-1); CHAR_sendStatusString( talkerindex, msgbuf ); CHAR_sendStatusString( talkerindex, "P"); CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); //WARP if( NPC_SkillShopWarp( meindex, talkerindex) == TRUE ) return; }else { CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); CHAR_talkToCli( talkerindex, -1, "條件不足!!", CHAR_COLORYELLOW); } //ADD NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, SKILL_WINDOW, -1); break; case SELECTSKILL_END: break; } return; }
void NPC_PetShopWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int datanum = -1; if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) { return; } //print("\n NPC_PetShopWindowTalked: data:%s seq:%d sel:%d ", data, seqno, select); makeStringFromEscaped( data); datanum = atoi( data); switch( seqno){ case CHAR_WINDOWTYPE_WINDOWPETSHOP_START: { int poolflg = CHAR_getWorkInt( meindex, CHAR_WORK_POOLFLG); if( ( datanum == 3 && poolflg) || // Âô³èÎï ( datanum == 2 && !poolflg ) ){ // ÁìÈ¡³èÎï NPC_PetShop_selectWindow( meindex, talkerindex, 1, -1 ); }else if( datanum == 1 && poolflg) { // ¼Ä·Å³èÎï if( CHAR_getCharPoolPetElement( talkerindex) != -1 ) { NPC_PetShop_selectWindow( meindex, talkerindex, 5, -1 ); } else { NPC_PetShop_selectWindow( meindex, talkerindex, 8, -1 ); } }else if( datanum == 2 && poolflg ) { // ÁìÈ¡³èÎï if( CHAR_getCharPetElement( talkerindex) != -1 ) { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); NPC_PetShop_selectWindow( meindex, talkerindex, 9, 0); }else { NPC_PetShop_selectWindow( meindex, talkerindex, 12, -1 ); } } #ifdef _NPC_DEPOTPET else if( datanum == 4 ) { // ʹÓóèÎï²Ö¿â //print(" ʹÓóèÎï²Ö¿â "); CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); if( !CHAR_CheckDepotPet( talkerindex) ){ CHAR_GetDepotPet( meindex, talkerindex); CHAR_talkToCli( talkerindex, -1, "È¡µÃ³èÎÇëÉÔáᣡ", CHAR_COLORYELLOW); }else{ NPC_PoolPetShop_DepotPet_Menu( meindex, talkerindex); } } #endif } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_PETSELECT: if(select==WINDOW_BUTTONTYPE_CANCEL){ NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); }else{ NPC_PetShop_selectWindow( meindex, talkerindex, 2, datanum ); } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_PETSELECT2: if(select==WINDOW_BUTTONTYPE_CANCEL){ NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); }else{ NPC_PetShop_selectWindow( meindex, talkerindex, 6, datanum ); } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_MAIN: if(select==WINDOW_BUTTONTYPE_YES){ NPC_PetShop_selectWindow( meindex, talkerindex, 3,-1 ); }else{ NPC_PetShop_selectWindow( meindex, talkerindex,1,-1); } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_MAIN2: if(select==WINDOW_BUTTONTYPE_YES){ NPC_PetShop_selectWindow( meindex, talkerindex, 7,-1 ); }else { NPC_PetShop_selectWindow( meindex, talkerindex,5,-1); } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_ASKDRAW: if( select == WINDOW_BUTTONTYPE_YES){ if( CHAR_getCharPetElement( talkerindex) != -1 ) { NPC_PetShop_selectWindow( meindex, talkerindex, 11,-1 ); }else { NPC_PetShop_selectWindow( meindex, talkerindex, 12, -1 ); } }else { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); NPC_PetShop_selectWindow( meindex, talkerindex, 9, 0); } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_GOLDOVER: if( select == WINDOW_BUTTONTYPE_YES){ NPC_PetShop_selectWindow( meindex, talkerindex, 4,-1 ); }else{ NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); } break; case CHAR_WINDOWTYPE_WINDOWPETSHOP_DRAWSELECT: if( select == WINDOW_BUTTONTYPE_PREV){ NPC_PetShop_selectWindow( meindex, talkerindex, 9, -1); }else if( select == WINDOW_BUTTONTYPE_NEXT) { NPC_PetShop_selectWindow( meindex, talkerindex, 9, 1); }else if( select != WINDOW_BUTTONTYPE_CANCEL) { if( CHAR_getCharPetElement( talkerindex) != -1 ) { NPC_PetShop_selectWindow( meindex, talkerindex, 10, datanum); }else { NPC_PetShop_selectWindow( meindex, talkerindex, 12, -1 ); } }else { NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); } break; #ifdef _NPC_DEPOTPET case CHAR_WINDOWTYPE_DEPOTPETSHOP_HANDLE: if( !CHAR_CheckDepotPet( talkerindex) ) return ; switch( datanum ) { case 1://·ÅÈë if( CHAR_findEmptyDepotPet( talkerindex) == -1 ){ CHAR_talkToCli( talkerindex, -1, "³èÎï²Ö¿âÒÑÂú£¡", CHAR_COLORYELLOW); return; } //NPC_DepotPet_Pet_printWindow( meindex, talkerindex); NPC_PetShop_selectWindow( meindex, talkerindex, 13, -1 ); break; case 2://È¡³ö if( CHAR_getCharPetElement( talkerindex) < 0 ) { CHAR_talkToCli( talkerindex, -1, "ÉíÉϳèÎïÀ¸Î»ÒÑÂú£¡", CHAR_COLORYELLOW); return; } NPC_PetShop_selectWindow( meindex, talkerindex, 14, 0); break; case 0: NPC_PetShop_selectWindow( meindex, talkerindex, 0, -1); break; } break; case CHAR_WINDOWTYPE_DEPOTPETSHOP_ADD: if(select==WINDOW_BUTTONTYPE_CANCEL){ NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); }else{ NPC_PetShop_selectWindow( meindex, talkerindex, 15, datanum ); } break; case CHAR_WINDOWTYPE_DEPOTPETSHOP_GET: if( select == WINDOW_BUTTONTYPE_PREV){ NPC_PetShop_selectWindow( meindex, talkerindex, 14, -1); }else if( select == WINDOW_BUTTONTYPE_NEXT) { NPC_PetShop_selectWindow( meindex, talkerindex, 14, 1); }else if( select != WINDOW_BUTTONTYPE_CANCEL) { if( CHAR_getCharPetElement( talkerindex) != -1 ) { NPC_PetShop_selectWindow( meindex, talkerindex, 16, datanum); }else { NPC_PetShop_selectWindow( meindex, talkerindex, 12, -1 ); } }else { NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); } break; case CHAR_WINDOWTYPE_DEPOTPETSHOP_ASKADD: // È·ÈÏ´æÈë²Ö¿â if(select==WINDOW_BUTTONTYPE_YES){ NPC_PetShop_selectWindow( meindex, talkerindex, 17,-1 ); }else { NPC_PetShop_selectWindow( meindex, talkerindex,13,-1); } break; case CHAR_WINDOWTYPE_DEPOTPETSHOP_ASKGET: // È·ÈÏÈ¡³ö²Ö¿â if( select == WINDOW_BUTTONTYPE_YES){ if( CHAR_getCharPetElement( talkerindex) != -1 ) { NPC_PetShop_selectWindow( meindex, talkerindex, 18,-1 ); }else { NPC_PetShop_selectWindow( meindex, talkerindex, 12, -1 ); } }else { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); NPC_PetShop_selectWindow( meindex, talkerindex, 14, 0); } break; #endif case CHAR_WINDOWTYPE_WINDOWPETSHOP_END: if( select == WINDOW_BUTTONTYPE_OK){ NPC_PetShop_selectWindow( meindex, talkerindex, 0,-1 ); } break; // CoolFish: Add 2001/7/4 default: break; } }
void NPC_Duelranking_PrintRanking( char *data, int count_start, int fdid, int msgid2) { char message[1024]; char buf[2048]; int i; int cnt = 0; int button = 0; int fd = getfdFromFdid( fdid); if( fd == -1 ) return; message[0] = '\0'; snprintf( message, sizeof( message), " 世界的强者们\n\n" " Rank DuelPoint Lv Name\n\n" ); for( i = 1; ; i ++ ) { char rankdata[256]; char cdandname[64]; char charaname[32]; char rank[16]; char score[64]; char msgbuf[512]; char cdkey[32]; char lv[16]; char hosi[6]; if( !getStringFromIndexWithDelim( data, "|", i, rankdata, sizeof( rankdata))) { break; } if( !getStringFromIndexWithDelim( rankdata, ",", 2, rank, sizeof( rank)) ){ continue; } if( !getStringFromIndexWithDelim( rankdata, ",", 3, cdandname, sizeof( cdandname)) ){ continue; } makeStringFromEscaped( cdandname); if( !getStringFromIndexWithDelim( cdandname, "_", 1, cdkey, sizeof( cdkey)) ){ continue; } if( !getStringFromIndexWithDelim( cdandname, "_", 2, charaname, sizeof( charaname)) ){ continue; } if( !getStringFromIndexWithDelim( rankdata, ",", 4, score, sizeof( score)) ){ continue; } if( !getStringFromIndexWithDelim( rankdata, ",", 5, lv, sizeof( lv)) ){ lv[0] = '\0'; } { char *mycdkey = CHAR_getChar( CONNECT_getCharaindex(fd), CHAR_CDKEY); char *myname = CHAR_getChar( CONNECT_getCharaindex(fd), CHAR_NAME); char engnum[4][3] = { "st","nd","rd","th"}; int dsprank = atoi(rank); if( dsprank > 3) dsprank = 3; if( mycdkey != NULL && myname != NULL && strcmp( cdkey, mycdkey) == 0 && strcmp( charaname, myname) == 0 ) { strcpy( hosi, "★"); }else { strcpy( hosi, " "); } snprintf( msgbuf, sizeof( msgbuf), "%s %5d%s %10s %3s %s\n", hosi, atoi(rank)+1, engnum[dsprank], score, lv, charaname ); } strcatsafe( message, sizeof( message), msgbuf); cnt ++; } if( cnt == 0 ) { strcpy( message, "\n 没有其他的资料了。"); button = WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_OK; }else if( cnt < NPC_DUELRANKING_WINDOWLINENUM ) { if( count_start >= NPC_DUELRANKING_WINDOWLINENUM) { button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV; }else { button = WINDOW_BUTTONTYPE_OK; } }else if( count_start == 0 ) { button = WINDOW_BUTTONTYPE_NEXT|WINDOW_BUTTONTYPE_OK; }else { button = WINDOW_BUTTONTYPE_NEXT|WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_OK; } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT, button, CHAR_WINDOWTYPE_DUELRANKING_TOPRANKING, msgid2, makeEscapeString( message, buf, sizeof(buf))); if( cnt == 0 ) { CHAR_setWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKSHOPRELEVANT, -1); }else { CHAR_setWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKSHOPRELEVANT, count_start); } }
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); } } } }
int readMail( char *dir ) { int i, read_count=0; for( i=0; i<256; i++){ char dirname[1000]; DIR *d; snprintf(dirname, sizeof( dirname ), "%s/0x%x", dir, i ); d = opendir(dirname); if(d == NULL ){ mkdir( dirname, 0755); log("创建 %s\n", dirname); continue; } while(1){ struct dirent *de; de = readdir( d ); if( de == NULL )break; if( de->d_name[0] != '.' ){ char filename[1000]; FILE *fp; struct stat s; snprintf( filename, sizeof( filename), "%s/%s", dirname, de->d_name ); if( stat( filename, &s ) < 0 ){ continue; } if( !(s.st_mode & S_IFREG)) continue; fp = fopen( filename, "r" ); if( fp == NULL ){ log( "不能打开文件 %s %s\n",filename,strerror(errno)); continue; } { char line[16384]; char toid[1000] , fromid[1000]; char tochar[CHARNAME_MAX*2+1]; char fromchar[CHARNAME_MAX*2+1]; char text[TEXT_MAX*2+1]; int opt=0; toid[0] = fromid[0] = tochar[0] = fromchar[0] = text[0] = 0; fgets( line, sizeof(line), fp ); chop(line); if( strncmp( TO_ID_HEAD , line, strlen(TO_ID_HEAD) )==0){ snprintf( toid , sizeof( toid ),"%s", line+strlen(TO_ID_HEAD )); } fgets( line, sizeof( line ), fp ); chop(line); if( strncmp( TO_CHAR_HEAD, line,strlen(TO_CHAR_HEAD))==0){ snprintf( tochar, sizeof( tochar ), "%s", line+strlen( TO_CHAR_HEAD )); makeStringFromEscaped( tochar ); } fgets( line, sizeof( line ),fp ); chop(line); if( strncmp( FROM_ID_HEAD,line,strlen(FROM_ID_HEAD))==0){ snprintf( fromid, sizeof( fromid ),"%s", line + strlen( FROM_ID_HEAD )); } fgets( line,sizeof(line),fp); chop(line); if(strncmp(FROM_CHAR_HEAD,line,strlen(FROM_CHAR_HEAD))==0){ snprintf( fromchar, sizeof( fromchar ), line + strlen(FROM_CHAR_HEAD )); makeStringFromEscaped( fromchar ); } fgets( line,sizeof(line),fp); chop(line); if( strncmp( OPTION_HEAD,line, strlen(OPTION_HEAD))==0){ opt = atoi( line + strlen( OPTION_HEAD ) ); } fgets( line, sizeof( line),fp); chop(line); if( strncmp(TEXT_HEAD,line,strlen(TEXT_HEAD))==0){ snprintf( text, sizeof( text), "%s", line + strlen( TEXT_HEAD )); makeStringFromEscaped( text ); } if( toid[0] == 0 || fromid[0] == 0 || tochar[0] == 0 || fromchar[0] == 0 || text[0] == 0 ){ log( "有问题邮件! %s 接收ID[%c] 接收名字[%c]" " 发送ID[%c] 发送名字[%c] 文本[%c]\n", filename, toid[0], tochar[0], fromid[0], fromchar[0], text[0] ); // Nuke +1 1027: Close for safe fclose(fp); continue; } receiveMail( fromid, fromchar, toid, tochar, text, opt , 1, strtoul(de->d_name,NULL,10)); read_count++; } fclose(fp); } } closedir(d); } log( "读取邮件: 在'%s'目录里读取到 %d 封邮件 \n", dir, read_count ); return 0; }
void NPC_WelfareWindowTalked2( int meindex, int talkerindex, int seqno, int select, char *data) { int skill, i, j; int skillID = -1, skillid = -1; int ENDEV = -1, NOWEV = -1; char buf[64]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char msg[512]; int fd = getfdFromCharaIndex( talkerindex ); double rate= 1.0; int skillarray; CHAR_HaveSkill* hskill; char err_msg[128] = {0}; if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) { return; } if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("GetArgStrErr"); return; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "ENDEV:", msg, sizeof( msg)) != NULL){ ENDEV=atof(msg); } if( NPC_Util_GetStrFromStrWithDelim( argstr, "NOWEV:", msg, sizeof( msg)) != NULL){ NOWEV=atof(msg); } if( NPC_Util_GetStrFromStrWithDelim( argstr, "err_msg:", err_msg, sizeof( msg)) == NULL){ print("GetArgStrErr"); return; } if( ENDEV > 0 ){ if( NPC_EventCheckFlg( talkerindex, ENDEV ) != TRUE ){ CHAR_talkToCli( talkerindex, -1, err_msg, CHAR_COLORYELLOW); return; } }else if( NOWEV > 0 ){ if( NPC_EventCheckFlg( talkerindex, NOWEV ) != TRUE ){ CHAR_talkToCli( talkerindex, -1, err_msg, CHAR_COLORYELLOW); return; } } makeStringFromEscaped( data); getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf)); skill=atoi(buf); // 技能id skillid = CHAR_getCharSkill( talkerindex, skill - 1 ); skillID = skillid; if(skillID <= 0) return ; if( CHAR_getWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){ rate = atof( msg); } // 不扣钱 CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); skillarray = PROFESSION_SKILL_getskillArray( skillID ); // 检查是否有不能删除的技能 for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){ int limit = -1, skillid = -1, skillarray_temp = -1; // 技能ID skillid = CHAR_getCharSkill( talkerindex, i); if( skillid <= 0 ) continue; skillarray_temp = PROFESSION_SKILL_getskillArray( skillid ); for( j=0; j<4; j++){ limit = PROFESSION_SKILL_getInt( skillarray_temp, PROFESSION_SKILL_LIMIT1+j*2 ); if( limit > 0 && limit == skillID ){ char token[256] = {0}; sprintf( token, "需先遗忘%s,才可删除此技能", PROFESSION_SKILL_getChar( skillarray_temp, PROFESSION_SKILL_NAME ) ); CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW); return; } } } // 遗忘技能 { int skill_level = -1; int count = 0; int skill_id[CHAR_SKILLMAXHAVE] = {0}; int skill_temp[CHAR_SKILLMAXHAVE] = {0}; // 取熟练度 for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){ int skillid = -1; // 技能ID skillid = CHAR_getCharSkill( talkerindex, i); // 不储存需遗忘的技能 if( skillid <= 0 || skillid == skillID ) continue; // 技能等级 hskill = CHAR_getCharHaveSkill( talkerindex, i ); skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL); skill_id[count] = skillid; skill_temp[count] = skill_level; count++; } // 删除所有技能 CHAR_CHAT_DEBUG_delsk( talkerindex, "all" ); // 还原技能 for( i=0; i<count; i++ ){ PROFESSION_SKILL_ADDSK( talkerindex, skill_id[i], skill_temp[i] ); } CHAR_sendStatusString( talkerindex , "S"); NPC_Welfare_selectWindow2( meindex, talkerindex,0,-1); } // 传送讯息 { char token[256]; int next_profession_skill_point = 0; next_profession_skill_point = CHAR_getInt( talkerindex, PROFESSION_SKILL_POINT ) + 1; CHAR_setInt( talkerindex, PROFESSION_SKILL_POINT, next_profession_skill_point ); memset(token, -1, sizeof(token) ); sprintf( token, "您遗忘了 %s,剩馀学习点数增加一点" ,PROFESSION_SKILL_getChar( skillarray, PROFESSION_SKILL_NAME ) ); CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( talkerindex , CHAR_WORKOBJINDEX )); } }
void charLoadCallback( int ti , int auth , char *c0, char* c1 , char *c2 , char *c3, char *c4, int i0 , int i1 ) { // Spock deleted 2000/11/2 //static int process_id = 0; // CoolFish: Init charindex 2001/10/16 #ifdef _NewSave int charindex = -1; #else int charindex; #endif #ifndef _LOCK_SERVER char loadbuf[CHARDATASIZE]; char infobuf[CHARDATASIZE]; int lock = i0; #endif char *process = c3; char *id = c0; char *passwd = c1; char *charname = c2; int mesgid = i1; char *deadline = c4; // Spock deleted 2000/11/2 //process_id++; if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ), "%d" , auth ); #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , data, mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , data, mesgid ); #endif #ifdef _FIX_MESSAGE // WON ADD 修改WORKER封包內容 // 同一星系重覆登入送 game end if( auth == 204 ){ #ifdef _WAEI_KICK log("\n (%s) AP同一星系重覆登入,踢人!! ", id ); saacproto_ACKick_recv( ti, id, 7, -1); //踢人 #ifdef _UNLOCKPOOL addUnlockPool( ti, id, "", process, ""); // AP解鎖 #else addWorkerTask( id , "dummy" , "3" , dummyCallback , ti , id , "dummy" , charname , process ,"", mesgid , 0 ); #endif #endif }else log("\n (%s) 登入異常!!:%d ", id, auth ); #endif return; } #ifdef _DELAY_UNLOCK if( UNlockM_isBe( id ) ){ saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); return; }else #endif if( isLocked( id ) ){ //int process; #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid ); #endif //DeleteMemLock(getHash(id) & 0xff, id, &process); // 如果AP無鎖則AC解鎖 log("\n (%s) AC同一星系重覆登入,踢人!! ", id ); saacproto_ACKick_recv( ti, id, 7, -1); //踢人 // checkGSUCheck( id); return; } #ifdef _LOCK_SERVER if( CHECK_LS_BEUSE() == TRUE ) { LServer_SACheckLock2_send( ti, id, mesgid, charname, 1, process);//process return; }else { saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); } #else charindex = getCharIndexByName( id , charname ); #ifdef _NewSave log("\nCharLoad charindex:%d id:%s charname:%s\n", charindex, id, charname); #endif if( charindex < 0 ){ /* 平乓仿互繡箕仄卅中及匹巨仿□卅及分 */ #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid , charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid ); #endif return; } log( "loadCharOne: id:[%s] char:[%s]\n", id, charname ); if( loadCharOne( id , charindex , loadbuf ,sizeof( loadbuf ))<0){ #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid ); #endif return; }else{ #ifdef _CHAR_POOLITEM checkCharPoolItem( id); #endif #ifdef _CHAR_POOLITEM checkCharPoolPet( id); #endif } {//ttom char *c_ptr; c_ptr=loadbuf; while(*c_ptr!='\0'){ if( IS_2BYTEWORD(*c_ptr) ){ if(*(c_ptr+1)==' '){ *(c_ptr+1)=0x41; } c_ptr++; if(*c_ptr=='\0') break; } c_ptr++; } }//ttom if( lock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( lockUser( getGSName(ti) , id , charname, passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ #else // Spock 2000/11/2 if( lockUser( getGSName(ti) , id , passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ #endif saacproto_ACCharLoad_send( ti , FAILED, "lock FAIL!!" , mesgid , charindex ); return; }else { #ifdef _TIMEOUTKICK // #endif } } memset( infobuf , 0 , sizeof( infobuf )); getCharInfoFromString( loadbuf , infobuf ); makeStringFromEscaped( infobuf ); #ifdef _BAD_PLAYER // WON ADD 送壞玩家去關 { extern int MAX_BAD_PLAYER; extern char BadPlayerList[500][20]; // 定義最大 500 名 int i; for( i=0; i<=MAX_BAD_PLAYER; i++){ if( strcmp( id, BadPlayerList[i] ) == 0){ saacproto_ACCharLoad_send( ti , BADPLAYER , infobuf , mesgid, charindex ); #ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 10, -1); #endif return; } } } #endif #ifdef _NewSave saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid); #endif #ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 10, -1); //踢其他星系 #endif #endif } #ifdef _NewSave int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid , int charindex) #else int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid ) #endif { #ifdef _NewSave #else int charindex; #endif char savebuf[CHARDATASIZE]; int ret = -1; memset(savebuf, 0, sizeof(savebuf)); //andy_log if( strstr( charinfo, "DATAEND=") == NULL ){ FILE *fp; if( (fp=fopen( "badpetstring.txt", "a+")) != NULL ){ fprintf( fp, "%s\n", charinfo); fclose( fp); } log( "err add batpetstring.txt:%s[%s] !\n", id, charname); } if( unlock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( (ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ #else if( (ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ #endif log( "Unlock:%s FAILED err!!\n", id); } #ifdef _LOCK_SERVER if( CHECK_LS_BEUSE() == TRUE ) { LServer_SAUNLock_send( ti, id, mesgid, 1); } #endif } // Nuke *1 add escape if( makeSaveCharString( savebuf , sizeof( savebuf ) , charname, opt , charinfo )<0){ log("\n ACCharSave:too long "); saacproto_ACCharSave_send( ti , FAILED , "too long" , mesgid ); // Spock fixed 2000/11/1 return ret; } #ifdef _NewSave if (charindex == -1) charindex = getCharIndexByName( id , charname ); #else // Nuke *1- charindex = getCharIndexByName( id , charname ); #endif if( charindex < 0 ){ int blankind = findBlankCharIndex( id ); if( blankind < 0 ){ log("\n ACCharSave:char full "); saacproto_ACCharSave_send( ti , FAILED , "char full" ,mesgid); return ret; } else { charindex = blankind; } } log( "ID:[%s] char:[%s]\n", id, charname ); if( saveCharOne( id , charindex , savebuf ) < 0 ){ log("\n ACCharSave:disk I/O error or a bug "); saacproto_ACCharSave_send( ti , FAILED , "disk I/O error or a bug", mesgid ); return ret; } else { #ifdef _SASQL sasql_save_nm( charindex, id, charname ); sasql_save_opt( charindex, id, opt ); sasql_save_int_info( charindex, id, charinfo ); sasql_save_char_info( charindex, id, charinfo ); #endif } saacproto_ACCharSave_send( ti , SUCCESSFUL , "" , mesgid); return ret; } void charListCallback( int ti , int auth , char *c0 , char *c1 , char *c2 , char *c3 , char *c4 , int i0 , int i1 ) { #ifndef _LOCK_SERVER char listbuf[CHARDATASIZE]; #endif char *id = c0; int mesgid = i0; log(" charListCallback:%s:%d ", id, auth); if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ) , "%d" , auth ); saacproto_ACCharList_send( ti , FAILED , data , mesgid ); total_ng_charlist++; return; } #ifdef _SASQL1 if (sasql_query(c0,c1)){ log(" 密碼錯誤或沒有註冊 "); saacproto_ACCharList_send( ti , FAILED , "Password error" , mesgid); return; } #endif // 取消下列 unlock 動作 #ifdef _FIX_MESSAGE // WON ADD 修改WORKER封包內容 #ifdef _DELAY_UNLOCK if( UNlockM_isBe( id ) ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); return; }else #endif if( isLocked( id ) ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); //DeleteMemLock(getHash(id) & 0xff, id, &process); // 如果AP無鎖則AC解鎖 log("\n (%s) charlist_AC同一星系重覆登入,踢人!! ", id ); //saacproto_ACKick_recv( ti, id, 7, -1); //踢人 checkGSUCheck( id ); total_ng_charlist++; return; } #endif // end FIX_MESSAGE #ifdef _LOCK_SERVER if( CHECK_LS_BEUSE() == TRUE ) { LServer_SACheckLock1_send( ti, id, mesgid, 1); }else { saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); total_ng_charlist++; } #else #ifdef _SLEEP_CHAR // 如果無新檔, 將舊檔移至新檔 { char fn_old[256], fn_new[256]; FILE *fp_old, *fp_new; int i; // 移人物檔 for( i=0; i<MAXCHAR_PER_USER; i++) { makeCharFileName( id, fn_new, sizeof(fn_new), i); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharFileName( id, fn_old, sizeof(fn_old), i); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // 搬移 //filecopy( fn_old, fn_new); // 複製 log(" 移檔_%s ", fn_new); } } else { fclose( fp_new); } } // 移倉庫檔 makeCharPoolItemFileName( id, fn_new, sizeof(fn_new)); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharPoolItemFileName( id, fn_old, sizeof(fn_old)); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // 搬移 //filecopy( fn_old, fn_new); // 複製 log(" 移檔_%s ", fn_new); } } else { fclose( fp_new); } } #endif #ifdef _DEATH_FAMILY_LOGIN_CHECK//無法讀取人物資料 if( loadCharNameAndOption( id , listbuf,sizeof(listbuf)) == 0 ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); return; } #endif #ifdef _DEATH_CONTEND //無法讀取人物資料 if( loadCharNameAndOption( id , listbuf,sizeof(listbuf)) == 0 ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); return; } #else loadCharNameAndOption( id , listbuf,sizeof(listbuf)); #endif // Arminius saacproto_ACCharList_send( ti , SUCCESSFUL , listbuf , mesgid); total_ok_charlist++; #endif }
void NPC_PetSkillShopWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int skill; int pet; int slot; int cost; int skillID=0; int petskillindex; char buf[64]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char msg[512]; int petindex; char msgbuf[128]; int fd = getfdFromCharaIndex( talkerindex ); double rate= 1.0; if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) { return; } if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("GetArgStrErr"); return; } makeStringFromEscaped( data); getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf)); skill=atoi(buf); getStringFromIndexWithDelim(data,"|",2,buf,sizeof(buf)); pet=atoi(buf); getStringFromIndexWithDelim(data,"|",3,buf,sizeof(buf)); slot=atoi(buf); getStringFromIndexWithDelim(data,"|",4,buf,sizeof(buf)); cost=atoi(buf); if( NPC_Util_GetStrFromStrWithDelim( argstr, "pet_skill", msg, sizeof( msg)) != NULL){ getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf)); skillID=atoi(buf); } slot--; if( !CHAR_CHECKPETSKILLINDEX( slot)){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } petindex = CHAR_getCharPet( talkerindex, pet-1); if( !CHAR_CHECKINDEX(petindex) ){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } if(skillID < 0) return ; if(petindex == -1){ print("petskillshop.c:170 PetindexError"); return; } if( CHAR_getWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){ rate = atof( msg); } petskillindex = PETSKILL_getPetskillArray( skillID ); if(petskillindex == -1){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } cost = PETSKILL_getInt( petskillindex, PETSKILL_COST ); cost = cost * rate; if(CHAR_getInt(talkerindex,CHAR_GOLD) < cost){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return; } CHAR_setPetSkill( petindex, slot, skillID); CHAR_DelGold( talkerindex, cost ); snprintf( msgbuf, sizeof( msgbuf ), "W%d",pet-1); CHAR_sendStatusString( talkerindex, msgbuf ); CHAR_sendStatusString( talkerindex, "P"); NPC_PetSkillShop_selectWindow( meindex, talkerindex,0,-1); }
void NPC_FreePetSkillShopWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int skill; int pet; int slot; int cost; int skillID=0; int petskillindex; char buf[64]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char msg[512]; int petindex; char msgbuf[128]; double rate= 1.0; if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("GetArgStrErr"); return; } if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) { return; } if(NPC_Util_isFaceToFace(talkerindex,meindex,2 )==FALSE){ if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return; } if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; switch( seqno) { case SELECTSKILL_START: if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != 2 ) { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); return; } NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, SKILL_WINDOW, -1); break; case SELECTSKILL_TEACH: if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != 3 ) { CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); return; } makeStringFromEscaped( data); getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf)); skill=atoi(buf); getStringFromIndexWithDelim(data,"|",2,buf,sizeof(buf)); pet=atoi(buf); getStringFromIndexWithDelim(data,"|",3,buf,sizeof(buf)); slot=atoi(buf); getStringFromIndexWithDelim(data,"|",4,buf,sizeof(buf)); cost=atoi(buf); if( NPC_Util_GetStrFromStrWithDelim( argstr, "pet_skill", msg, sizeof( msg)) != NULL){ getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf)); skillID=atoi(buf); } slot--; if( slot < 0 ) return; petindex = CHAR_getCharPet( talkerindex, pet-1); if( !CHAR_CHECKINDEX(petindex) ){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){ rate = atof( msg); } petskillindex = PETSKILL_getPetskillArray( skillID ); if( !PETSKILL_CHECKINDEX( petskillindex)){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return ; } cost = PETSKILL_getInt( petskillindex, PETSKILL_COST ); cost = cost * rate; //条件判断 if(CHAR_getInt(talkerindex,CHAR_GOLD) < cost){ CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); return; } if( NPC_CHECKFREEPETSKILL( talkerindex, petindex, skillID ) == TRUE ){ if( Action_RunDoEventAction( meindex, talkerindex, argstr) == FALSE ){ CHAR_talkToCli( talkerindex, -1, "所需物品不足!!", CHAR_COLORYELLOW); CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); return; } CHAR_setPetSkill( petindex, slot, skillID); CHAR_setInt( talkerindex, CHAR_GOLD, ( CHAR_getInt( talkerindex, CHAR_GOLD) - cost) ); snprintf( msgbuf, sizeof( msgbuf ), "W%d",pet-1); CHAR_sendStatusString( talkerindex, msgbuf ); CHAR_sendStatusString( talkerindex, "P"); CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); //WARP if( NPC_SkillShopWarp( meindex, talkerindex) == TRUE ) return; }else { CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD); CHAR_talkToCli( talkerindex, -1, "条件不足!!", CHAR_COLORYELLOW); } //ADD NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, SKILL_WINDOW, -1); break; case SELECTSKILL_END: break; } return; }
/*----------------------------------------- * 弁仿奶失件玄井日忒匀化五凶凛卞裟太请今木月[ * -------------------------------------------*/ void NPC_FMPKCallManWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { int datanum = -1, fl, x, y; char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; char buf[1024], buff2[256]; int fd = getfdFromCharaIndex(talkerindex); if (fd == -1) return; if (NPC_Util_GetArgStr(meindex, npcarg, sizeof(npcarg)) == NULL) { print("GetArgStrErr"); return; } NPC_Util_GetStrFromStrWithDelim(npcarg, "WARP", buf, sizeof(buf)); getStringFromIndexWithDelim(buf, ",", 1, buff2, sizeof(buff2)); fl = atoi(buff2); getStringFromIndexWithDelim(buf, ",", 2, buff2, sizeof(buff2)); x = atoi(buff2); getStringFromIndexWithDelim(buf, ",", 3, buff2, sizeof(buff2)); y = atoi(buff2); makeStringFromEscaped( data); print("meindex:%d seqno:%d select:%d data:%s\n", meindex, seqno, select, data); datanum = atoi( data); switch( seqno){ /*--反元引曰及 --*/ case CHAR_WINDOWTYPE_FMPKCALLMAN_START: if (datanum == 1) NPC_FMPKCallMan_selectWindow(meindex, talkerindex, 1, -1); else if (datanum == 2) NPC_FMPKCallMan_selectWindow(meindex, talkerindex, 2, -1); break; case CHAR_WINDOWTYPE_FMPKCALLMAN_CALL: if (select == WINDOW_BUTTONTYPE_YES) { lssproto_WN_send(fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString("\n召唤中···请稍候!\n@#$%↑&*···", buf, sizeof(buf))); NPC_CallFMMember(meindex, CHAR_getInt(talkerindex, CHAR_FLOOR), CHAR_getInt(talkerindex, CHAR_FMINDEX), CHAR_getChar(talkerindex, CHAR_FMNAME), CHAR_getWorkInt(talkerindex, CHAR_WORKFMINDEXI)); } break; case CHAR_WINDOWTYPE_FMPKCALLMAN_COME: if (select == WINDOW_BUTTONTYPE_YES) { print("CHAR_WINDOWTYPE_FMPKCALLMAN_COME\n"); if (CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if (CHAR_getWorkInt(talkerindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) CHAR_DischargeParty(talkerindex, 0); CHAR_setWorkInt(talkerindex, CHAR_WORKWARPCHECK, FALSE); CHAR_setWorkInt(talkerindex, CHAR_WORKFMPKFLAG, 1); CHAR_warpToSpecificPoint(talkerindex, fl, x, y); } break; case CHAR_WINDOWTYPE_FMPKCALLMAN_LEAVE: if (select == WINDOW_BUTTONTYPE_YES) { int spfl = 0, spx = 0, spy = 0, i = 0, itemindex = 0; if (CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if (CHAR_getWorkInt(talkerindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) { lssproto_WN_send(fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString("\n无法以团队方式离开唷!\n请先解散团队!", buf, sizeof(buf))); return; } for (i = 0; i < CHAR_MAXITEMHAVE; i++) { itemindex = CHAR_getItemIndex(talkerindex, i); if (ITEM_CHECKINDEX(itemindex) == FALSE) continue; if (ITEM_getInt(itemindex, ITEM_DROPATLOGOUT) == TRUE) { lssproto_WN_send(fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString("\n您身上有贵重物品喔!\n为了避免在传送途中不小心损坏,\n请先将这类物品卸下,\n谢谢您的合作!", buf, sizeof(buf))); return; } } CHAR_setWorkInt(talkerindex, CHAR_WORKWARPCHECK, FALSE); CHAR_getElderPosition(CHAR_getInt(talkerindex, CHAR_LASTTALKELDER), &spfl, &spx, &spy); CHAR_warpToSpecificPoint(talkerindex, spfl, spx, spy); } break; default: break; } }