#include "version.h" #include #include #include #include #include "readmap.h" #include "object.h" #include "char.h" #include "char_base.h" #include "lssproto_serv.h" #include "saacproto_cli.h" #include "npcutil.h" #include "family.h" #include "log.h" #include "handletime.h" #include "buf.h" #include "net.h" #include "char_base.h" #include "battle.h" #include "npc_bus.h" #include "char_talk.h" #include "npc_scheduleman.h" #ifdef _FM_MODIFY #include "npc_fmdengon.h" #endif #define CHAR_MAXNAME 20 #define CHAR_MAXID 20 #define MINFMLEVLEFORPOINT 3 // 3 申请庄园最低等级 #ifdef _FAMILY_MANORNUM_CHANGE #else #define MANORNUM 4 #endif struct FAMILY { int fmindex; char name[CHAR_MAXNAME]; char leadername[CHAR_MAXNAME]; char leaderid[CHAR_MAXID]; int leadergraph; char petname[CHAR_MAXNAME]; char petattr[256]; int fmnum; int acceptflag; char rule[256]; int village; int pointindex; int dp; char memolist[35][100]; }; int familyNumTotal = 0; char familyListBuf[MAXFAMILYLIST]; int channelMember[FAMILY_MAXNUM][FAMILY_MAXCHANNEL][FAMILY_MAXMEMBER]; int familyMemberIndex[FAMILY_MAXNUM][FAMILY_MAXMEMBER]; int familyTax[FAMILY_MAXNUM]; extern tagRidePetTable ridePetTable[146]; void LeaveMemberIndex( int charaindex, int fmindexi); // Arminius: 取得家族 pk dp 增加/损失值 // getFMdpAward // arg: windp=winner's fmdp losedp=loser's fmdp // ret: dp award // #ifdef _MERGE_NEW_8 int fmdplevelexp[]={0, // 0 150000, // 1 500000, // 2 1000000, // 3 1500000, // 4 2000000, // 5 2500000, // 6 3500000, // 7 4500000, // 8 5000000, // 9 7000000 //10 }; #else int fmdplevelexp[]={0, // 0 10000, // 1 30000, // 2 100000, // 3 500000, // 4 1500000, // 5 5000000, // 6 15000000, // 7 50000000, // 8 200000000, // 9 500000000 //10 }; #endif // Arminius end // shan begin int getFmLv(int playerindex) // 合成时专用 { int i, dp; dp = CHAR_getWorkInt(playerindex, CHAR_WORKFMDP); if( dp > fmdplevelexp[10] ){ // print("\n player DP->%d",dp); return 10; } for(i=0; i<=10; i++) if( dp <= fmdplevelexp[i+1] ) break; // Nuke 20040217: Open the merge limit //if(i>=9) i = 8; if (i>=10) i=10; return i; } #ifdef _MERGE_NEW_8 // 查询个人声望等级 int famelevelexp[]={0, // 0 1500, // 1 3000, // 2 4500, // 3 7500, // 4 11000, // 5 14500, // 6 18000, // 7 25000, // 8 32000, // 9 39000 //10 }; int getFameLv(int playerindex) // 合成时专用 { int i, dp; dp = CHAR_getWorkInt(playerindex, CHAR_FAME); if( dp > famelevelexp[10] ){ return 10; } for(i=0; i<=10; i++) if( dp <= famelevelexp[i+1] ) break; if (i>=10) i=10; return i; } #endif struct FMMEMBER_LIST memberlist[FAMILY_MAXNUM]; struct FMS_MEMO fmsmemo; struct FM_POINTLIST fmpointlist; #ifdef _NEW_MANOR_LAW ManorSchedule_t ManorSchedule[MANORNUM]; #endif struct FMS_DPTOP fmdptop; struct FM_PKFLOOR fmpkflnum[FAMILY_FMPKFLOOR]= { {142}, {143}, {144}, {145}, {146}, {1042}, {2032}, {3032}, {4032}, #ifdef _FAMILY_MANORNUM_CHANGE // CoolFish 用来修改装园数量 {5032}, {6032}, {7032}, {8032}, {9032}, #endif }; int leaderdengonindex = 0; // shan end 新增图层需到 family.h 增加 FAMILY_FMPKFLOOR 数量 void SetFMPetVarInit(int meindex) { int i = 0, petindex = 0; #ifdef _FMVER21 if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER) #else if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != 1) #endif { for (i = 0; i < CHAR_MAXPETHAVE; i++) { petindex = CHAR_getCharPet(meindex, i); if (!CHAR_CHECKINDEX(petindex)) continue; CHAR_setInt(petindex, CHAR_PETFAMILY, -1); } } } void SetFMVarInit(int meindex) { SetFMPetVarInit(meindex); // 清除守护兽 Flag CHAR_setInt(meindex, CHAR_FMINDEX, -1); CHAR_setChar(meindex, CHAR_FMNAME, ""); CHAR_setInt(meindex, CHAR_FMSPRITE, -1); #ifdef _FMVER21 CHAR_setInt(meindex, CHAR_FMLEADERFLAG, FMMEMBER_NONE); #else CHAR_setInt(meindex, CHAR_FMLEADERFLAG, -1); #endif CHAR_setWorkInt(meindex, CHAR_WORKFMSETUPFLAG, -1); CHAR_setWorkInt(meindex, CHAR_WORKFMINDEXI, -1); CHAR_setWorkInt(meindex, CHAR_WORKFMCHARINDEX, -1); } void FAMILY_Init( void ) { int i, j ,k; for( i=0; i 0) return -1; if (strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") != 0) return -1; #ifdef _FMVER21 if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == FMMEMBER_LEADER) return -1; #else if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == 1) return -1; #endif return 1; } int CheckFMMember(int meindex) { if (CHAR_getInt(meindex, CHAR_FMINDEX) > 0) return -1; if (strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") != 0) return -1; #ifdef _FMVER21 if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) > 0 && CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_APPLY ) return -1; #else if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) > 0 ) return -1; #endif return 1; } int CheckLeaderQ(int meindex) { if (CHAR_getInt(meindex, CHAR_LV) < FMLEADERLV && CHAR_getInt(meindex, CHAR_TRANSMIGRATION) <= 0) return -1; if (!NPC_EventCheckFlg(meindex, 4)) return -2; return 0; } void FAMILY_Add(int fd, int meindex, char* message) { char token[128], fmname[128], charname[128], charid[128]; char petname[128], fmrule[256], petattr[256], buf[1024]; int charlv, havepetindex, petindex, fmsprite = 0, chargrano; int gold, tmpflag; if (!CHAR_CHECKINDEX(meindex)) return; if (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if (CHAR_getInt(meindex, CHAR_FMINDEX) >= 0 && strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") != 0) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你已经加入家族罗~无法再成立家族!", buf, sizeof(buf))); return; } tmpflag = CheckLeaderQ(meindex); if(tmpflag == -1) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n很抱歉喔!你的等级不足!", buf, sizeof(buf))); return; } if(tmpflag == -2) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n很抱歉喔!你必须先完成成人礼才行!", buf, sizeof(buf))); return; } gold = CHAR_getInt(meindex, CHAR_GOLD); if( gold < 10000 ) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n很抱歉喔!成立家族需要一万元石币的手续费!", buf, sizeof(buf))); return; } else { CHAR_setInt( meindex, CHAR_GOLD, gold-10000 ); CHAR_send_P_StatusString( meindex , CHAR_P_STRING_GOLD); } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; sprintf(fmname, "%s", token); if ((strstr(fmname, " ")) || (strcmp(fmname, "") == 0) || (strstr(fmname, " "))) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n家族的名称请勿输入空格!", buf, sizeof(buf))); return; } if (getStringFromIndexWithDelim(message, "|", 3, token, sizeof(token)) == FALSE) return; havepetindex = atoi(token); petindex = CHAR_getCharPet(meindex, havepetindex); if (!CHAR_CHECKINDEX(petindex)) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n请选择一只宠物作为家族守护兽!", buf, sizeof(buf))); return; } if (getStringFromIndexWithDelim(message, "|", 4, token, sizeof(token)) == FALSE) return; fmsprite = atoi(token); if (getStringFromIndexWithDelim(message, "|", 5, token, sizeof(token)) == FALSE) return; if (strcmp(token, "") == 0) sprintf(fmrule, "无"); else sprintf(fmrule, "%s", token); sprintf(charname, "%s", CHAR_getChar(meindex, CHAR_NAME)); sprintf(charid, "%s", CHAR_getChar(meindex, CHAR_CDKEY)); charlv = CHAR_getInt(meindex, CHAR_LV); chargrano = CHAR_getInt(meindex, CHAR_FACEIMAGENUMBER); if (strlen(CHAR_getChar(petindex, CHAR_USERPETNAME)) == 0) sprintf(petname, "%s", CHAR_getChar(petindex, CHAR_NAME)); else sprintf(petname, "%s", CHAR_getChar(petindex, CHAR_USERPETNAME)); sprintf(petattr, "%d %d %d %d", CHAR_getInt(petindex, CHAR_BASEIMAGENUMBER), CHAR_getWorkInt(petindex, CHAR_WORKATTACKPOWER), CHAR_getWorkInt(petindex, CHAR_WORKDEFENCEPOWER), CHAR_getWorkInt(petindex, CHAR_WORKQUICK)); CHAR_setInt(petindex, CHAR_PETFAMILY, 1); CHAR_setChar(meindex, CHAR_FMNAME, fmname); #ifdef _FMVER21 CHAR_setInt(meindex, CHAR_FMLEADERFLAG, FMMEMBER_LEADER); #else CHAR_setInt(meindex, CHAR_FMLEADERFLAG, 1); #endif CHAR_setInt(meindex, CHAR_FMSPRITE, fmsprite); // print("%s %s %s %d %s %s %s %d %d\n", fmname, charname, charid, charlv, petname, // petattr, fmrule, fmsprite, chargrano); #ifdef _PERSONAL_FAME saacproto_ACAddFM_send(acfd, fmname, charname, charid, charlv, petname, petattr, fmrule, fmsprite, chargrano, CHAR_getInt(meindex, CHAR_FAME), CONNECT_getFdid(fd)); // print("ACAddFM acfd:%d meindex:%d fmname:%s charname:%s fame:%d Connectfd:%d fd:%d\n", // acfd, meindex, fmname, charname, CHAR_getInt(meindex, CHAR_FAME), CONNECT_getFdid(fd), fd); #else saacproto_ACAddFM_send(acfd, fmname, charname, charid, charlv, petname, petattr, fmrule, fmsprite, chargrano, CONNECT_getFdid(fd)); #endif // 要求最新家族列表 //saacproto_ACShowFMList_send( acfd ); } /* ┐┌ ┘└┘└ └┐..┌┘─ ┴──┤★~~├ │o o│  │●   ┬──   │ ~~~~~~~~~哞 ▲△▲△▲△▲△▲△▲△▲△▲△ */ void ACAddFM(int fd, int result, int fmindex, int index) { int meindex = CONNECT_getCharaindex(fd); char buf[1024]; // print("ACAddFM result:%d fmindex:%d meindex:%d\n", result, fmindex, meindex); // test if (!CHAR_CHECKINDEX(meindex)) return; // print("ACAddFM_2!\n"); if (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; // print("ACAddFM_3!\n"); if(result == 1) { CHAR_setInt(meindex, CHAR_FMINDEX, fmindex); CHAR_setWorkInt(meindex, CHAR_WORKFMINDEXI, index); CHAR_setWorkInt(meindex, CHAR_WORKFMSETUPFLAG, 0); #ifdef _NEW_MANOR_LAW CHAR_setInt(meindex,CHAR_MOMENTUM,0); CHAR_talkToCli(meindex,-1,"成立家族个人气势归零",CHAR_COLORYELLOW); #endif lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n恭喜你成立了新的家族!但请在7天之内召集到10名族人加入,不然会取消家族资格喔。", buf, sizeof(buf))); JoinMemberIndex( meindex, index); CHAR_charSaveFromConnect(fd, FALSE); // 要求最新家族资料 saacproto_ACShowFMList_send( acfd ); saacproto_ACShowMemberList_send( acfd, index ); saacproto_ACShowTopFMList_send(acfd, FM_TOP_INTEGRATE); LogFamily( CHAR_getChar( meindex, CHAR_FMNAME), CHAR_getInt( meindex, CHAR_FMINDEX), CHAR_getChar( meindex, CHAR_NAME), CHAR_getChar( meindex, CHAR_CDKEY), "ADDFAMILY(成立家族)", "" ); } else { int i = 0, petindex = 0; char tmpbuf[256]; int gold = CHAR_getInt(meindex, CHAR_GOLD); CHAR_setInt(meindex, CHAR_GOLD, gold + 10000); CHAR_send_P_StatusString( meindex , CHAR_P_STRING_GOLD); SetFMVarInit(meindex); for (i = 0; i < CHAR_MAXPETHAVE; i++) { petindex = CHAR_getCharPet(meindex, i); if (!CHAR_CHECKINDEX(petindex)) continue; CHAR_setInt(petindex, CHAR_PETFAMILY, -1); } if (fmindex == -2) sprintf(tmpbuf, "\n已经有相同名字的家族成立了!"); else sprintf(tmpbuf, "\n申请成立家族失败!"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString(tmpbuf, buf, sizeof(buf))); } CHAR_sendStatusString( meindex, "F"); } void FAMILY_Join(int fd, int meindex, char *message) { int fmindex, charlv, index, fmsprite; char token[128], fmname[128], charname[128], charid[128], buf[1024]; if (!CHAR_CHECKINDEX(meindex)) return; if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) || (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE)) return; if (CheckFMMember(meindex) < 0){ lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你已经加入其他家族了喔!", buf, sizeof(buf))); return; } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; index = atoi(token); if (getStringFromIndexWithDelim(message, "|", 3, token, sizeof(token)) == FALSE) return; fmindex = atoi(token); if (getStringFromIndexWithDelim(message, "|", 4, token, sizeof(token)) == FALSE) return; sprintf(fmname, "%s", token); if (getStringFromIndexWithDelim(message, "|", 5, token, sizeof(token)) == FALSE) return; fmsprite = atoi(token); sprintf(charname, "%s", CHAR_getChar(meindex, CHAR_NAME)); sprintf(charid, "%s", CHAR_getChar(meindex, CHAR_CDKEY)); charlv = CHAR_getInt(meindex, CHAR_LV); CHAR_setInt(meindex, CHAR_FMINDEX, fmindex); CHAR_setChar(meindex, CHAR_FMNAME, fmname); #ifdef _FMVER21 CHAR_setInt(meindex, CHAR_FMLEADERFLAG, FMMEMBER_APPLY); #else CHAR_setInt(meindex, CHAR_FMLEADERFLAG, 0); #endif CHAR_setInt(meindex, CHAR_FMSPRITE, fmsprite); CHAR_setWorkInt(meindex, CHAR_WORKFMINDEXI, index); // print("JoinFM index:%d fmindex:%d fmname:%s charname:%s charid:%s charlv:%d sprite:%d\n", // index, fmindex, fmname, charname, charid, charlv, fmsprite); #ifdef _PERSONAL_FAME // Arminius: 家族个人声望 // print("fame:%d charfdid:%d\n", CHAR_getInt(meindex, CHAR_FAME), // CONNECT_getFdid(fd)); saacproto_ACJoinFM_send(acfd, fmname, fmindex, charname, charid, charlv, index, CHAR_getInt(meindex, CHAR_FAME), CONNECT_getFdid(fd)); #else // print("charfdid:%d\n", CONNECT_getFdid(fd)); saacproto_ACJoinFM_send(acfd, fmname, fmindex, charname, charid, charlv, index, CONNECT_getFdid(fd)); #endif } void ACJoinFM(int fd, int result, int recv) { int meindex = CONNECT_getCharaindex(fd); char buf[1024]; if(!CHAR_CHECKINDEX(meindex)) return; if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) || (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE)) return; if (result == 1) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n谢谢你的加入申请!请先等族长对你的审核通过之後,才算正式加入。", buf, sizeof(buf))); JoinMemberIndex( meindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI) ); #ifdef _NEW_MANOR_LAW CHAR_setInt(meindex,CHAR_MOMENTUM,0); CHAR_talkToCli(meindex,-1,"加入家族个人气势归零",CHAR_COLORYELLOW); #endif sprintf(buf,"fame:%d",CHAR_getInt(meindex,CHAR_FAME)); LogFamily( CHAR_getChar( meindex, CHAR_FMNAME), CHAR_getInt( meindex, CHAR_FMINDEX), CHAR_getChar( meindex, CHAR_NAME), CHAR_getChar( meindex, CHAR_CDKEY), "JOINFAMILY(申请加入家族)", buf ); } else { SetFMVarInit(meindex); if (recv == -2) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n此家族目前不愿意招收成员!", buf, sizeof(buf))); } else if (recv == -3) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n此家族目前无法招收成员,家族成员人数已到达上限!", buf, sizeof(buf))); } else lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n申请加入家族失败!", buf, sizeof(buf))); } CHAR_sendStatusString( meindex, "F"); } void FAMILY_Leave(int fd, int meindex, char *message) { int result, fmindex, index; char token[128], fmname[128], charname[128], charid[128], buf[1024]; if (!CHAR_CHECKINDEX(meindex)) return; if (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if ((CHAR_getInt(meindex, CHAR_FMINDEX) == -1) || (strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") == 0) #ifdef _FMVER21 || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == FMMEMBER_NONE)) #else || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == -1)) #endif { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你并没有加入家族喔!", buf, sizeof(buf))); return; } { int i, fmpks_pos; for( i=1; i<=MANORNUM; i++){ // CoolFish 4->MANORNUM 2002/2/25 fmpks_pos = i * MAX_SCHEDULE; #ifdef _FMVER21 if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == FMMEMBER_LEADER){ #else if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == 1){ #endif if( (fmpks[fmpks_pos+1].host_index+1) == CHAR_getInt(meindex, CHAR_FMINDEX) || (fmpks[fmpks_pos+1].guest_index+1) == CHAR_getInt(meindex, CHAR_FMINDEX) ){ lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你目前的家族正约战中,因此无法解散家族!", buf, sizeof(buf))); return; } } } } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; result = atoi(token); if (result == 1) { fmindex = CHAR_getInt(meindex, CHAR_FMINDEX); index = CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI); sprintf(fmname, "%s", CHAR_getChar(meindex, CHAR_FMNAME)); sprintf(charname, "%s", CHAR_getChar(meindex, CHAR_NAME)); sprintf(charid, "%s", CHAR_getChar(meindex, CHAR_CDKEY)); #ifdef _FMVER21 if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == FMMEMBER_LEADER) { #else if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) == 1) { #endif // print("DelFM index:%d fmindex:%d fmname:%s\n", index, fmindex, fmname); saacproto_ACDelFM_send(acfd, fmname, fmindex, index, charname, charid, CONNECT_getFdid(fd)); // 要求最新家族列表 //saacproto_ACShowFMList_send( acfd ); } else { // print("LeaveFM index:%d fmindex:%d fmname:%s charname:%s charid:%s\n", // index, fmindex, fmname, charname, charid); saacproto_ACLeaveFM_send(acfd, fmname, fmindex, charname, charid, index, CONNECT_getFdid(fd)); } } } void ACLeaveFM( int fd, int result, int resultflag) { int meindex = CONNECT_getCharaindex(fd); char buf[1024]; if (!CHAR_CHECKINDEX(meindex)) return; if (result == 1){ // won 2002/01/05 LogFamily( CHAR_getChar( meindex, CHAR_FMNAME), CHAR_getInt( meindex, CHAR_FMINDEX), CHAR_getChar( meindex, CHAR_NAME), CHAR_getChar( meindex, CHAR_CDKEY), "LEAVEFAMILY(离开家族)", "" ); if( CHAR_getWorkInt( meindex, CHAR_WORKFMCHANNEL) != -1 ) CHAR_setWorkInt( meindex, CHAR_WORKFMCHANNEL, -1 ); LeaveMemberIndex( meindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI) ); SetFMVarInit(meindex); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n申请退出家族OK!", buf, sizeof(buf))); #ifdef _FM_RIDE_PET if(getFmridepet()==1) { int fmRides = CHAR_getInt( index, CHAR_LOWRIDEPETS); switch( CHAR_getWorkInt( index, CHAR_WORKFMFLOOR) ) { case 1041: fmRides=fmRides^RIDE_PET9; break; case 2031: fmRides=fmRides^RIDE_PET8|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 3031: fmRides=fmRides^RIDE_PET7|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 4031: fmRides=fmRides^RIDE_PET1|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 5031: fmRides=fmRides^RIDE_PET3|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 6031: fmRides=fmRides^RIDE_PET5|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 7031: fmRides=fmRides^RIDE_PET4|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 8031: fmRides=fmRides^RIDE_PET6|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; case 9031: fmRides=fmRides^RIDE_PET2|RIDE_PET0|RIDE_PET10|RIDE_PET11); break; default: fmRides=fmRides^RIDE_PET0|RIDE_PET10|RIDE_PET11); } CHAR_setInt( index, CHAR_LOWRIDEPETS, fmRides ); CHAR_sendStatusString( index, "x"); } #endif CHAR_setWorkInt( meindex, CHAR_WORKFMFLOOR, -1); #ifdef _FM_JOINLIMIT CHAR_setInt( meindex, CHAR_FMTIMELIMIT, (int)time(NULL)+(7*24)*(60*60) ); #endif #ifdef _NEW_MANOR_LAW CHAR_setInt(meindex,CHAR_MOMENTUM,0); CHAR_talkToCli(meindex,-1,"退出家族个人气势归零",CHAR_COLORYELLOW); #endif }else lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n申请退出家族失败!", buf, sizeof(buf))); CHAR_sendStatusString( meindex, "F" ); } void ACDelFM(int fd, int result) { char buf[1024]; int meindex = CONNECT_getCharaindex(fd); if (!CHAR_CHECKINDEX(meindex)) return; //if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) // || (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE)) // return; if (result == 1) { // WON ADD LogFamily( CHAR_getChar( meindex, CHAR_FMNAME), CHAR_getInt( meindex, CHAR_FMINDEX), CHAR_getChar( meindex, CHAR_NAME), CHAR_getChar( meindex, CHAR_CDKEY), "DELFAMILY(家族解散)", "" ); LeaveMemberIndex( meindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI) ); /* for( i=0; i familyNumTotal ) break; if( getStringFromIndexWithDelim( familyListBuf, "|", i, subbuf, sizeof(subbuf) ) == FALSE) break; strcat( buf, "|" ); strcat( buf, subbuf ); j++; // print(" |%s| ", subbuf); } sprintf( sendbuf, "S|F|%d|%d|%d%s", familyNumTotal, atoi(token2), j, buf ); lssproto_FM_send( fd, sendbuf ); return; } // shan add if (strcmp(token, "P") == 0 ){ int personfame; char sendbuf[512]; #ifdef _PERSONAL_FAME personfame = (CHAR_getInt( meindex, CHAR_FAME)/100); #else personfame = CHAR_getWorkInt( meindex, CHAR_WORKFMDP); #endif sprintf( sendbuf, "你目前的个人声望点数为:%d", personfame); CHAR_talkToCli(meindex, -1, sendbuf, CHAR_COLORYELLOW); #ifdef _NEW_MANOR_LAW sprintf(sendbuf,"你目前的个人气势点数为:%d",CHAR_getInt(meindex,CHAR_MOMENTUM)/100); CHAR_talkToCli(meindex, -1, sendbuf, CHAR_COLORYELLOW); #endif } if(strcmp(token,"D") == 0){ if(getStringFromIndexWithDelim(message, "|", 3, fmname, sizeof(fmname)) == FALSE) return; if(getStringFromIndexWithDelim(message, "|", 4, token2, sizeof(token2)) == FALSE) return; fmindex = atoi( token2 ); if(getStringFromIndexWithDelim(message, "|", 5, token2, sizeof(token2)) == FALSE) return; tempindex = atoi( token2 ); //print(" send_fmname_ac:%s ", fmname); saacproto_ACFMDetail_send( acfd, fmname, fmindex, tempindex, CONNECT_getFdid(fd) ); } // shan begin else if (strcmp(token, "D2") ==0 ) { char sendbuf[2048], tmpbuf[1024], leadernamebuf[64]; int h, i = 0; int meindex = CONNECT_getCharaindex(fd); int fmindex_wk = CHAR_getWorkInt( meindex, CHAR_WORKFMINDEXI); if( fmindex_wk < 0 || fmindex_wk >= FAMILY_MAXNUM) return; for( h=0; h 家族名称|人数|族长名称|家族排行|家族声望|个人声望|个人职位|家族精灵|PK #ifdef _NEW_MANOR_LAW sprintf( sendbuf, "%s|%d|%s|%d|%d|%d|%d|%d|%s|%d|%d", #else sprintf( sendbuf, "%s|%d|%s|%d|%d|%d|%d|%d|%s", #endif CHAR_getChar(meindex, CHAR_FMNAME), memberlist[fmindex_wk].fmjoinnum, leadernamebuf, h+1, #ifdef _FMVER21 fmdptop.fmtopdp[h], #else (CHAR_getWorkInt( meindex, CHAR_WORKFMDP)/100), #endif #ifdef _PERSONAL_FAME (CHAR_getInt( meindex, CHAR_FAME)/100), #else (CHAR_getWorkInt( meindex, CHAR_WORKFMDP)/100), #endif CHAR_getInt( meindex, CHAR_FMLEADERFLAG), CHAR_getInt( meindex, CHAR_FMSPRITE ), tmpbuf #ifdef _NEW_MANOR_LAW ,fmdptop.fmMomentum[h]/100 // 家族气势 ,CHAR_getInt(meindex,CHAR_MOMENTUM)/100 // 个人气势 #endif ); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_FAMILYDETAIL, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( sendbuf, buf, sizeof(buf))); } // shan end } void ACFMDetail(int ret, char *data, int clifd) { char sendbuf[1024]; //print(" Detail:%s ", data); if( ret != 1 ) { print(" ACFMDetailError!:%d ", clifd ); return; } //print(" ACFMDetail:%d:%s ", clifd, data ); /* len = strlen(data); strcpy( buf, data ); for( i=0 ; i 人物名称:%s 人物索引 (设该人物为族员):%d\n", CHAR_getInt(meindex, CHAR_FMLEADERFLAG), charname, charindex); LogFamily( CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getChar(meindex, CHAR_NAME), CHAR_getChar(meindex, CHAR_CDKEY), "CheckMember", sbuf ); // shan end saacproto_ACMemberJoinFM_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), charname, charindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), result, CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); } #else { saacproto_ACMemberJoinFM_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), charname, charindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), result, CONNECT_getFdid(fd)); } #endif #ifdef _FMVER21 else if (result == FMMEMBER_NONE) #else else if (result == 4) #endif { for (i = 0 + 1; i < FAMILY_MAXHOME + 1; i++) { int fmpks_pos = i * MAX_SCHEDULE; if ((fmpks[fmpks_pos].host_index == index && strcmp(fmname, fmpks[fmpks_pos].host_name) == 0) || (fmpks[fmpks_pos].guest_index == index && strcmp(fmname, fmpks[fmpks_pos].guest_name) == 0)) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n家族目前正在战斗中,所以无法审核成员。", buf, sizeof(buf))); // print("fmpks_pos:%d index:%d host:%d guest:%d\n", fmpks_pos, // index, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index); return; } } #ifdef _FMVER21 { // shan begin char sbuf[1024]; sprintf( sbuf, "族长代号:%d -> 人物名称:%s 人物索引:%d (将该人物退出家族)\n", CHAR_getInt(meindex, CHAR_FMLEADERFLAG), charname, charindex); LogFamily( CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getChar(meindex, CHAR_NAME), CHAR_getChar(meindex, CHAR_CDKEY), "CheckMember", sbuf ); // shan end saacproto_ACMemberLeaveFM_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), charname, charindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); } #else { saacproto_ACMemberLeaveFM_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), charname, charindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), CONNECT_getFdid(fd)); } #endif } #ifdef _FMVER21 // else if (result == FMMEMBER_ELDER || result == FMMEMBER_INVITE // || result == FMMEMBER_BAILEE || result == FMMEMBER_VICELEADER ) else if (result == FMMEMBER_ELDER ) { if (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER) return; #ifdef _FMVER21 { // shan begin char sbuf[1024]; sprintf( sbuf, "族长代号:%d -> 人物名称:%s 人物索引:%d (设该人物为长老)\n", CHAR_getInt(meindex, CHAR_FMLEADERFLAG), charname, charindex); LogFamily( CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getChar(meindex, CHAR_NAME), CHAR_getChar(meindex, CHAR_CDKEY), "CheckMember", sbuf ); // shan end saacproto_ACMemberJoinFM_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), charname, charindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), result, CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); } #else { saacproto_ACMemberJoinFM_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), charname, charindex, CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), result, CONNECT_getFdid(fd)); } #endif } #endif // 要求最新家族列表 saacproto_ACShowFMList_send( acfd ); } void FAMILY_Channel(int fd, int meindex, char *message) { char token[128], token2[128]; char buf[4096], subbuf[4096], sendbuf[4096]; int i, tempindex, fmindexi, channel, nowchannel, num; fmindexi = CHAR_getWorkInt( meindex, CHAR_WORKFMINDEXI); nowchannel = CHAR_getWorkInt( meindex, CHAR_WORKFMCHANNEL ); // print(" channelFM:%d ", fmindexi); if( fmindexi < 0 ) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你还没有加入任何家族!", buf, sizeof(buf))); return; } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; if (getStringFromIndexWithDelim(message, "|", 3, token2, sizeof(token2)) == FALSE) return; channel = atoi( token2 ); if( strcmp( token, "J") == 0) { if( channel < -1 || channel > FAMILY_MAXCHANNEL )return; if( nowchannel >= 0 && nowchannel < FAMILY_MAXCHANNEL ) { i = 0; while( i < FAMILY_MAXMEMBER ) { if( channelMember[fmindexi][nowchannel][i] == meindex ) { channelMember[fmindexi][nowchannel][i] = -1; break; } i++; } } if( channel > 0 && channel < FAMILY_MAXCHANNEL ) { i = 0; while( i < FAMILY_MAXCHANNELMEMBER ) { if( channelMember[fmindexi][channel][i] < 0 ) { channelMember[fmindexi][channel][i] = meindex; break; } i++; } if( i >= FAMILY_MAXCHANNELMEMBER ) { CHAR_talkToCli( meindex, -1, "此频道人数已满。", CHAR_COLORWHITE); return; } sprintf( buf, "加入家族频道 [%d]。", channel ); CHAR_talkToCli( meindex, -1, buf, CHAR_COLORWHITE); if( nowchannel >=0 && nowchannel < FAMILY_MAXCHANNEL ) { sprintf( buf, "%s 退出频道。", CHAR_getChar( meindex, CHAR_NAME) ); for( i=0; i < FAMILY_MAXCHANNELMEMBER; i++ ) { if( CHAR_CHECKINDEX(channelMember[fmindexi][nowchannel][i]) && channelMember[fmindexi][nowchannel][i] != meindex ) { CHAR_talkToCli( channelMember[fmindexi][nowchannel][i], -1, buf, CHAR_COLORWHITE); } } } sprintf( buf, "%s 加入频道。", CHAR_getChar( meindex, CHAR_NAME) ); for( i=0; i < FAMILY_MAXCHANNELMEMBER; i++ ) { if( CHAR_CHECKINDEX(channelMember[fmindexi][channel][i]) && channelMember[fmindexi][channel][i] != meindex ) { CHAR_talkToCli( channelMember[fmindexi][channel][i], -1, buf, CHAR_COLORWHITE); } } } else if( channel == 0 ) { i = 0; while( i < FAMILY_MAXMEMBER ) { if( channelMember[fmindexi][0][i] < 0 ) { channelMember[fmindexi][0][i] = meindex; break; } i++; } if( i >= FAMILY_MAXMEMBER ) { #ifndef _CHANNEL_MODIFY CHAR_talkToCli( meindex, -1, "此频道人数已满。", CHAR_COLORWHITE); #endif return; } #ifndef _CHANNEL_MODIFY sprintf( buf, "加入家族频道 [全]。"); CHAR_talkToCli( meindex, -1, buf, CHAR_COLORWHITE); if( nowchannel >=0 && nowchannel < FAMILY_MAXCHANNEL ) { sprintf( buf, "%s 退出频道。", CHAR_getChar( meindex, CHAR_NAME) ); for( i=0; i < FAMILY_MAXCHANNELMEMBER; i++ ) { if( CHAR_CHECKINDEX(channelMember[fmindexi][nowchannel][i]) && channelMember[fmindexi][nowchannel][i] != meindex ) { CHAR_talkToCli( channelMember[fmindexi][nowchannel][i], -1, buf, CHAR_COLORWHITE); } } } sprintf( buf, "%s 加入频道。", CHAR_getChar( meindex, CHAR_NAME) ); for( i=0; i < FAMILY_MAXCHANNELMEMBER; i++ ) { if( CHAR_CHECKINDEX(channelMember[fmindexi][channel][i]) && channelMember[fmindexi][channel][i] != meindex ) { CHAR_talkToCli( channelMember[fmindexi][channel][i], -1, buf, CHAR_COLORWHITE); } } #endif } #ifdef _FMVER21 else if( channel == FAMILY_MAXCHANNEL && CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) == FMMEMBER_LEADER ) #else else if( channel == FAMILY_MAXCHANNEL && CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) == 1 ) #endif { CHAR_talkToCli( meindex, -1, "启动族长广播。", CHAR_COLORWHITE); } else { channel = -1; #ifndef _CHANNEL_MODIFY CHAR_talkToCli( meindex, -1, "退出家族频道。", CHAR_COLORWHITE); #else CHAR_talkToCli( meindex, -1, "关闭族长广播。", CHAR_COLORWHITE); channel = 0; i = 0; while(i < FAMILY_MAXMEMBER){ if( channelMember[fmindexi][0][i] < 0 ) { channelMember[fmindexi][0][i] = meindex; break; } i++; } #endif sprintf( buf, "%s 退出频道。", CHAR_getChar( meindex, CHAR_NAME) ); for( i=0; i < FAMILY_MAXCHANNELMEMBER; i++ ) { if( CHAR_CHECKINDEX(channelMember[fmindexi][nowchannel][i]) && channelMember[fmindexi][nowchannel][i] != meindex ) { CHAR_talkToCli( channelMember[fmindexi][nowchannel][i], -1, buf, CHAR_COLORWHITE); } } } CHAR_setWorkInt( meindex, CHAR_WORKFMCHANNEL, channel); if( channel != -1 ) CHAR_setWorkInt( meindex, CHAR_WORKFMCHANNELQUICK, channel); sprintf( sendbuf, "C|J|%d", channel); lssproto_FM_send( fd, sendbuf); } else if( strcmp( token, "L") == 0) { int j, membernum, bFind = 0; if( channel < 0 || channel >= FAMILY_MAXCHANNEL ) return; subbuf[0] = '\0'; num = 0; if( channel != 0 ) membernum = FAMILY_MAXCHANNELMEMBER; else membernum = FAMILY_MAXMEMBER; for( j = 0 ; j < FAMILY_MAXMEMBER ; j++ ) { bFind = 0; tempindex = familyMemberIndex[fmindexi][j]; //if( tempindex >= 0 ) { if( CHAR_CHECKINDEX(tempindex) ) { for( i=0; i< membernum ; i++) { if( tempindex == channelMember[fmindexi][channel][i] ) { //if( CHAR_getChar( tempindex, CHAR_NAME ) == NULL ) { // familyMemberIndex[fmindexi][j] = -1; // channelMember[fmindexi][channel][i] = -1; // continue; //} bFind = 1; break; } } if( bFind ) strcat( subbuf, "|1|" ); else strcat( subbuf, "|0|" ); makeEscapeString( CHAR_getChar( tempindex, CHAR_NAME ), buf, sizeof(buf)); strcat( subbuf, buf ); num++; } } sprintf( sendbuf, "C|L|%d|%d%s", channel, num, subbuf); lssproto_FM_send( fd, sendbuf); //print(" CList:%s ", sendbuf); } } void FAMILY_Bank(int fd, int meindex, char *message) { char token[128], token2[128], buf[1024]; int fmindex, cash, bank, toBank; int MaxGold; MaxGold = CHAR_getMaxHaveGold( meindex); fmindex = CHAR_getInt( meindex, CHAR_FMINDEX); // add shan if( fmindex <= 0 && CHAR_getInt( meindex, CHAR_BANKGOLD) < 1) { CHAR_talkToCli( meindex, -1, "你必须先加入家族。", CHAR_COLORWHITE); return; } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; if( strcmp(token, "G" )==0 ) { if (getStringFromIndexWithDelim(message, "|", 3, token2, sizeof(token)) == FALSE) return; toBank = atoi( token2 ); cash = CHAR_getInt( meindex, CHAR_GOLD); bank = CHAR_getInt( meindex, CHAR_BANKGOLD); if( ((cash - toBank) >= 0) && ((cash - toBank) <= MaxGold ) &&((bank + toBank) >= 0)&&((bank + toBank) <= CHAR_MAXBANKGOLDHAVE) ) { // shan add if( toBank > 0 && CHAR_getInt( meindex, CHAR_FMINDEX ) < 1 ) { sprintf(buf, "抱歉!你没有加入任何家族,所以仅能领取存款"); CHAR_talkToCli( meindex, -1, buf, CHAR_COLORWHITE); return; } CHAR_setInt( meindex, CHAR_GOLD, cash - toBank); CHAR_setInt( meindex, CHAR_BANKGOLD, bank + toBank); CHAR_send_P_StatusString( meindex , CHAR_P_STRING_GOLD); if( toBank >= 0 ) { sprintf(buf, "存入%d到家族银行个人帐户。", toBank); CHAR_talkToCli( meindex, -1, buf, CHAR_COLORWHITE); // Syu ADD 新增家族个人银行存取Log (不含家族银行) LogFamilyBankStone( CHAR_getChar( meindex, CHAR_NAME ), CHAR_getChar( meindex, CHAR_CDKEY ), toBank, CHAR_getInt( meindex, CHAR_GOLD ), "myBank(存款)(家族个人银行)", CHAR_getInt( meindex,CHAR_FLOOR), CHAR_getInt( meindex,CHAR_X ), CHAR_getInt( meindex,CHAR_Y ), CHAR_getInt( meindex,CHAR_BANKGOLD) ); } else { sprintf(buf, "从家族银行个人帐户取出%d。", -toBank); CHAR_talkToCli( meindex, -1, buf, CHAR_COLORWHITE); // Syu ADD 新增家族个人银行存取Log (不含家族银行) LogFamilyBankStone( CHAR_getChar( meindex, CHAR_NAME ), CHAR_getChar( meindex, CHAR_CDKEY ), toBank, CHAR_getInt( meindex, CHAR_GOLD ), "myBank(提款)(家族个人银行)", CHAR_getInt( meindex,CHAR_FLOOR), CHAR_getInt( meindex,CHAR_X ), CHAR_getInt( meindex,CHAR_Y ), CHAR_getInt( meindex,CHAR_BANKGOLD) ); } // Syu ADD 新增家族个人银行存取Log (不含家族银行) LogStone( -1, CHAR_getChar( meindex, CHAR_NAME ), /* 平乓仿 */ CHAR_getChar( meindex, CHAR_CDKEY ), /* 交□扒□ID */ -toBank, /* 嗯喊 */ CHAR_getInt( meindex, CHAR_GOLD ), "myBank(家族个人银行)", CHAR_getInt( meindex,CHAR_FLOOR), CHAR_getInt( meindex,CHAR_X ), CHAR_getInt( meindex,CHAR_Y ) ); } else print(" bank_error "); } if( strcmp(token, "I" )==0 ) { } if( strcmp(token, "T" )==0 ) { int toTax; int mygold; int FMindex; if (getStringFromIndexWithDelim(message, "|", 3, token2, sizeof(token)) == FALSE) return; toTax = atoi( token2 ); #ifdef _FMVER21 if( CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) != FMMEMBER_LEADER && CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) != FMMEMBER_ELDER && toTax < 0 ) return; #endif FMindex = CHAR_getWorkInt( meindex, CHAR_WORKFMINDEXI ); mygold = CHAR_getInt( meindex, CHAR_GOLD); if( mygold < 0 || mygold > MaxGold || toTax == 0 ) return; if( toTax > 0 ) {//+存款 if( ((mygold-toTax) < 0) || (familyTax[ FMindex] + toTax) > CHAR_MAXFMBANKGOLDHAVE ) { return; } }else if( toTax < 0 ){ //-取款 if( ((mygold-toTax)>MaxGold) || (familyTax[ FMindex] + toTax) < 0 ) { return; } } if( toTax>0 ) { //存款预先扣款 CHAR_setInt( meindex, CHAR_GOLD, CHAR_getInt( meindex, CHAR_GOLD)-toTax ); } sprintf( buf, "家族银行%s处理中....", (toTax>0)?"存款":"取款"); CHAR_talkToCli( meindex , -1, buf, CHAR_COLORYELLOW); CHAR_send_P_StatusString( meindex , CHAR_P_STRING_GOLD); sprintf( buf, "%d", toTax ); saacproto_ACFixFMData_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), FM_FIX_FMGOLD, buf, "", CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); #ifdef _FAMILYBANKSTONELOG saacproto_ACgetFMBankgold_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); #endif //print(" getTax:%s=%d ", CHAR_getChar(meindex, CHAR_FMNAME), toTax ); } } void ACFMPointList(int ret, char *data) { } #ifdef _CK_ONLINE_PLAYER_COUNT // WON ADD 计算线上人数 void GS_SEND_PLAYER_COUNT(void) { int i, count = 0; int playernum = CHAR_getPlayerMaxNum(); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) count++; } saacproto_GS_PLAYER_COUNT_SEND(acfd, count); } #endif void FAMILY_SetPoint(int fd, int meindex, char *message) { int i, fmpointindex, fl, x, y, fmdp, fmlevel = 0; char token[128], buf[1024]; if (!CHAR_CHECKINDEX(meindex)) return; if (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if ((CHAR_getInt(meindex, CHAR_FMINDEX) == -1) || (strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") == 0) #ifdef _FMVER21 || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER)) #else || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != 1)) #endif { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你不是族长,所以没有修改的权力唷!", buf, sizeof(buf))); return; } fmdp = CHAR_getWorkInt(meindex, CHAR_WORKFMDP); for (i = 0; i < arraysizeof(fmdplevelexp); i++){ if (fmdp < fmdplevelexp[i + 1] && fmdp >= fmdplevelexp[i]){ fmlevel = i; } } #ifndef _ACFMPK_NOFREE if (fmlevel < MINFMLEVLEFORPOINT){// or 人数小於30人 lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n家族等级尚未到达申请家族据点的条件!", buf, sizeof(buf))); return; } #endif for (i = 1; i <= MANORNUM; i++) { if (((strcmp(fmpks[i * MAX_SCHEDULE + 1].guest_name, CHAR_getChar(meindex, CHAR_FMNAME)) == 0)) && ((fmpks[i * MAX_SCHEDULE + 1].flag = FMPKS_FLAG_MANOR_BATTLEBEGIN) || (fmpks[i * MAX_SCHEDULE + 1].flag == FMPKS_FLAG_MANOR_PREPARE))){ char tmpbuf[256]; sprintf(tmpbuf, "\n你跟%s已经有预约庄园争夺赛了~\n无法再申请庄园了喔!", fmpks[i * MAX_SCHEDULE + 1].host_name); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString(tmpbuf, buf, sizeof(buf))); return; } } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; fmpointindex = atoi(token); if (getStringFromIndexWithDelim(message, "|", 3, token, sizeof(token)) == FALSE) return; fl = atoi(token); if (getStringFromIndexWithDelim(message, "|", 4, token, sizeof(token)) == FALSE) return; x = atoi(token); if (getStringFromIndexWithDelim(message, "|", 5, token, sizeof(token)) == FALSE) return; y = atoi(token); /* print("SetFMPoint charname:%s fmindex:%d index:%d pointindex:%d fl:%d x:%d y:%d\n", CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), fmpointindex, fl, x, y); */ saacproto_ACSetFMPoint_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), fmpointindex, fl, x, y, CONNECT_getFdid(fd)); } void ACSetFMPoint(int ret, int r, int clifd) { int meindex = CONNECT_getCharaindex(clifd); char message[256], buf[512]; if (!CHAR_CHECKINDEX(meindex)) return; if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) || (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE)) return; if (ret == 0){ if (r == -1) sprintf(message, "申请家族失败!"); else if (r == -2) sprintf(message, "你已经有家族据点了~不得重复申请!"); else if (r == -3) sprintf(message, "尚未到达申请家族据点的资格!"); else if (r == -4) sprintf(message, "家族据点已经有家族在使用中罗!"); else if (r == -5) sprintf(message, "您的家族人数未达申请标准唷!"); } else if (ret == 1) sprintf(message, "申请家族据点OK!"); lssproto_WN_send( clifd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString(message, buf, sizeof(buf))); } void ACFMAnnounce(int ret, char *fmname, int fmindex, int index, int kindflag, char *data, int color) { // kindflag 1:族长广播 2:系统公告家族被删除 3:系统通知讯息 int i, chindex; if( ret != 1 ) return; // print("fmname:%s fmindex:%d index:%d kindflag:%d data:%s color:%d\n", // fmname, fmindex, index, kindflag, data, color); for( i=0; i < FAMILY_MAXMEMBER; i++) { chindex = familyMemberIndex[index][i]; if( chindex >= 0 ) { if( CHAR_getCharUse(chindex) ) { if (kindflag == 1) { #ifdef _FMVER21 // shan 2001/12/13 //if( CHAR_getInt( chindex, CHAR_FMLEADERFLAG ) == FMMEMBER_MEMBER ) if( CHAR_getInt( chindex, CHAR_FMLEADERFLAG ) == FMMEMBER_MEMBER || CHAR_getInt( chindex, CHAR_FMLEADERFLAG ) == FMMEMBER_ELDER ) #else if( CHAR_getInt( chindex, CHAR_FMLEADERFLAG ) == 2 ) #endif CHAR_talkToCli( chindex, -1, data, color ); } else if (kindflag == 2) { int fd = getfdFromCharaIndex( chindex ); if (fd == -1) return; SetFMVarInit( chindex ); CHAR_talkToCli( chindex , -1, "由於您的家族在七天之内没有召收到10名家族成员,所以被迫解散了!", CHAR_COLORRED); } } else familyMemberIndex[index][i] = -1; } } if (kindflag == 3) { int meindex = 0; int clifd = getfdFromFdid(color); if (CONNECT_checkfd(clifd) == FALSE) return; meindex = CONNECT_getCharaindex(clifd); if (!CHAR_CHECKINDEX(meindex)) return; CHAR_talkToCli(meindex, -1, data, CHAR_COLORRED); } if (kindflag == 4) { int meindex = 0; char buf[1024]; int clifd = getfdFromFdid(color); // print("Here1\n"); if (CONNECT_checkfd(clifd) == FALSE) return; meindex = CONNECT_getCharaindex(clifd); if (!CHAR_CHECKINDEX(meindex)) return; // print("Here2\n"); lssproto_WN_send(clifd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString(data, buf, sizeof(buf))); } } void FAMILY_SetAcceptFlag(int fd, int meindex, char *message) { int result; char token[128], buf[1024]; if (!CHAR_CHECKINDEX(meindex)) return; if ((CHAR_getWorkInt(meindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) || (CHAR_getWorkInt(meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE)) return; if ((CHAR_getInt(meindex, CHAR_FMINDEX) == -1) || (strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") == 0) #ifdef _FMVER21 // || ((CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER) // && (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_ELDER) // && (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_VICELEADER))) || ((CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER) && (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_ELDER))) #else || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != 1)) #endif { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你不是族长,所以没有修改的权力唷!", buf, sizeof(buf))); return; } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; result = atoi(token); if ((result == 0) || (result == 1)) { saacproto_ACFixFMData_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), FM_FIX_ACCEPTFLAG, token, "", CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); } } void FAMILY_FixRule( int fd, int meindex, char* message ) { char token[1024], buf[1024]; if (!CHAR_CHECKINDEX(meindex))return; if ((CHAR_getInt(meindex, CHAR_FMINDEX) == -1) || (strcmp(CHAR_getChar(meindex, CHAR_FMNAME), "") == 0) #ifdef _FMVER21 || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER)) #else || (CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != 1)) #endif { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n你不是族长,所以没有修改的权力唷!", buf, sizeof(buf))); return; } if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; if( strcmp( token, "R") == 0 ) { if (getStringFromIndexWithDelim(message, "|", 3, buf, sizeof( buf ) ) == FALSE)return; if (strcmp( buf, "") == 0) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n家族主旨不可为空白唷!", buf, sizeof(buf))); return; } // print(" new_rule:%s ", buf); saacproto_ACFixFMData_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), FM_FIX_FMRULE, buf, "", CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); return; } if( strcmp( token, "P") == 0 ) { int havepetindex, petindex, i; char petname[20], petattr[512]; // 检查是否已有守护兽 for( i =0; i< CHAR_MAXPETHAVE; i++ ) { int petindex = CHAR_getCharPet(meindex, i); if (!CHAR_CHECKINDEX(petindex)) continue; if( CHAR_getInt( petindex , CHAR_PETFAMILY ) ==1 ) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n原本的守护兽还在唷。", buf, sizeof(buf))); return; } } // 检查是否已有守护兽(寄宠) for( i =0; i< CHAR_MAXPOOLPETHAVE; i++ ) { int petindex = CHAR_getCharPoolPet(meindex, i); if (!CHAR_CHECKINDEX(petindex)) continue; if( CHAR_getInt( petindex , CHAR_PETFAMILY ) ==1 ) { lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n原本的守护兽还在唷。", buf, sizeof(buf))); return; } } if (getStringFromIndexWithDelim(message, "|", 3, buf, sizeof( buf ) ) == FALSE) return; havepetindex = atoi( buf ); petindex = CHAR_getCharPet(meindex, havepetindex); if (!CHAR_CHECKINDEX(petindex)) return; if (strlen(CHAR_getChar(petindex, CHAR_USERPETNAME)) == 0) sprintf(petname, "%s", CHAR_getChar(petindex, CHAR_NAME)); else sprintf(petname, "%s", CHAR_getChar(petindex, CHAR_USERPETNAME)); sprintf(petattr, "%d %d %d %d", CHAR_getInt(petindex, CHAR_BASEIMAGENUMBER), CHAR_getWorkInt(petindex, CHAR_WORKATTACKPOWER), CHAR_getWorkInt(petindex, CHAR_WORKDEFENCEPOWER), CHAR_getWorkInt(petindex, CHAR_WORKQUICK)); CHAR_setInt(petindex, CHAR_PETFAMILY, 1); saacproto_ACFixFMData_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), FM_FIX_FMPET, petname, petattr, CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); return; } } void JoinMemberIndex( int meindex, int fmindexi ) { int i; for( i = 0 ; i < FAMILY_MAXMEMBER; i++){ if( familyMemberIndex[fmindexi][i] == meindex ) familyMemberIndex[fmindexi][i] = -1; } for( i = 0 ; i < FAMILY_MAXMEMBER; i++){ if( familyMemberIndex[fmindexi][i] < 0 ){ familyMemberIndex[fmindexi][i] = meindex; break; } } #ifdef _CHANNEL_MODIFY i = 0; // 先清掉旧的频道记录 while(i < FAMILY_MAXMEMBER){ if(channelMember[fmindexi][0][i] == meindex){ channelMember[fmindexi][0][i] = -1; } i++; } i = 0; // 加入频道 while(i < FAMILY_MAXMEMBER){ if(channelMember[fmindexi][0][i] == -1){ channelMember[fmindexi][0][i] = meindex; CHAR_setWorkInt(meindex,CHAR_WORKFMCHANNEL,0); break; } i++; } #endif } void LeaveMemberIndex( int meindex, int fmindexi ) { int i; for( i = 0 ; i < FAMILY_MAXMEMBER; i++){ if( familyMemberIndex[fmindexi][i] == meindex ) familyMemberIndex[fmindexi][i] = -1; } #ifdef _CHANNEL_MODIFY i = 0; // 清掉旧的频道记录 while(i < FAMILY_MAXMEMBER){ if(channelMember[fmindexi][0][i] == meindex){ channelMember[fmindexi][0][i] = -1; } i++; } #endif } void FAMILY_RidePet( int fd, int meindex, char* message ) { char token[64], token2[64]; int petindex, rideGraNo = 0, leaderimageNo; // Arminius 8.25 recover int i; #ifndef _NEW_RIDEPETS int big4fm = 0; #endif if (!CHAR_CHECKINDEX(meindex))return; // Robin fix 战斗中不可骑 if( CHAR_getWorkInt( meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ) return; #ifdef _PETSKILL_BECOMEPIG if( CHAR_getInt( meindex, CHAR_BECOMEPIG) > -1 ){ //处於乌力化状态 CHAR_setInt( meindex, CHAR_RIDEPET, -1 ); //宠物选项的状态依然为"骑乘",这里修正过来 CHAR_complianceParameter( meindex ); CHAR_send_P_StatusString( meindex, CHAR_P_STRING_RIDEPET); return; } #endif if( CHAR_getWorkInt( meindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if (getStringFromIndexWithDelim(message, "|", 2, token, sizeof(token)) == FALSE) return; if( strcmp( token, "P") == 0) { if (getStringFromIndexWithDelim(message, "|", 3, token2, sizeof(token2)) == FALSE) return; if( atoi(token2) != -1 ) { petindex = CHAR_getCharPet( meindex, atoi( token2 ) ); if(!CHAR_CHECKINDEX(petindex))return; if( CHAR_getInt( meindex, CHAR_DEFAULTPET ) == atoi( token2 ) ) return; if( CHAR_getInt( meindex, CHAR_RIDEPET) != -1 ) return; if( CHAR_getInt( meindex, CHAR_LEARNRIDE) < CHAR_getInt( petindex, CHAR_LV ) ) return; if( CHAR_getWorkInt( petindex, CHAR_WORKFIXAI ) < 100 )return; if( CHAR_getInt( meindex, CHAR_LV)+5 < CHAR_getInt( petindex, CHAR_LV ) ) return; #ifdef _PET_2TRANS if( CHAR_getInt( petindex, CHAR_TRANSMIGRATION) > 2 ) return; #endif leaderimageNo = 100700 + ((CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER)-100000)/20)*10 + CHAR_getInt( meindex, CHAR_FMSPRITE)*5; #ifndef _NEW_RIDEPETS switch( CHAR_getWorkInt( meindex, CHAR_WORKFMFLOOR) ){ case 1041: big4fm = 1; break; case 2031: big4fm = 2; break; case 3031: big4fm = 3; break; case 4031: big4fm = 4; break; default: big4fm = 0; } #endif // Arminius 8.25 recover for( i=0; i< arraysizeof(ridePetTable) ; i++ ){ #ifdef _NEW_RIDEPETS if( (( CHAR_getInt( meindex, CHAR_BASEIMAGENUMBER) == ridePetTable[i].charNo ) || ( CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER) == ridePetTable[i].charNo )) #else if( ( CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER) == ridePetTable[i].charNo ) #endif && ( CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER) == ridePetTable[i].petNo ) ){ rideGraNo = ridePetTable[i].rideNo; break; } #ifndef _NEW_RIDEPETS if( ( leaderimageNo == ridePetTable[i].charNo ) && ( CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER) == ridePetTable[i].petNo ) #ifdef _EVERYONE_RIDE && big4fm != 0 && CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) != FMMEMBER_NONE && CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) != FMMEMBER_APPLY ){ #else && CHAR_getInt( meindex, CHAR_FMLEADERFLAG ) == FMMEMBER_LEADER ){ #endif rideGraNo = ridePetTable[i].rideNo; break; } #endif } #ifdef _NEW_RIDEPETS if( rideGraNo == 0 ) { int ti=-1, index, image=-1; int petNo = CHAR_getInt( petindex, CHAR_BASEBASEIMAGENUMBER); int playerNo = CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER); int playerlowsride = CHAR_getInt( meindex, CHAR_LOWRIDEPETS); if( (ti = RIDEPET_getPETindex( petNo, playerlowsride )) >= 0 ) { if( (index = RIDEPET_getNOindex( playerNo)) >= 0 ){ if( (image = RIDEPET_getRIDEno( index,ti)) >= 0 ) { rideGraNo = image; } } } } #endif if( rideGraNo != 0 ){ #ifdef _ITEM_METAMO // CHAR_setWorkInt( meindex, CHAR_WORKITEMMETAMO, 0); #endif CHAR_setInt( meindex , CHAR_RIDEPET, atoi( token2 ) ); CHAR_setInt( meindex , CHAR_BASEIMAGENUMBER , rideGraNo ); CHAR_complianceParameter( meindex ); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX )); CHAR_send_P_StatusString( meindex, CHAR_P_STRING_RIDEPET ); }else return; }else { //还原人物 basebaseimage CHAR_setInt( meindex , CHAR_RIDEPET, -1 ); CHAR_setInt( meindex , CHAR_BASEIMAGENUMBER , CHAR_getInt( meindex , CHAR_BASEBASEIMAGENUMBER) ); CHAR_complianceParameter( meindex ); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX )); CHAR_send_P_StatusString( meindex , CHAR_P_STRING_RIDEPET); } } } void ACFixFMPK(int winindex, int loseindex, int data) { int i = 0, charindex = 0; char msg1[256], msg2[256]; sprintf(msg1, "恭喜您!家族声望提高了%8d点!", (data / 100)); sprintf(msg2, "家族声望减少了%8d点!", (data / 100)); for (i = 0; i < FAMILY_MAXMEMBER; i++) { charindex = familyMemberIndex[winindex][i]; if( charindex >= 0 ) { if( CHAR_getCharUse(charindex) ) CHAR_talkToCli( charindex , -1, msg1, CHAR_COLORYELLOW); else familyMemberIndex[winindex][i] = -1; } charindex = familyMemberIndex[loseindex][i]; if( charindex >= 0 ) { if( CHAR_getCharUse(charindex) ) CHAR_talkToCli( charindex , -1, msg2, CHAR_COLORRED); else familyMemberIndex[loseindex][i] = -1; } } } void getNewFMList() { saacproto_ACShowFMList_send( acfd ); } //int channelMember[FAMILY_MAXNUM][FAMILY_MAXCHANNEL][FAMILY_MAXMEMBER]; //int familyMemberIndex[FAMILY_MAXNUM][FAMILY_MAXMEMBER]; #ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族战GM指令 int get_fm_leader_index( int fm1 ) { int charindex = -1; charindex = familyMemberIndex[fm1][0]; return charindex; } #endif void checkFamilyIndex( void ) { int i, j, k, charaindex, err1=0, err2=0; // print(" checkFamilyIndex! "); for( i=0; i 0 ){ if( fmindex_wk < 0 || fmindex_wk >= FAMILY_MAXNUM){ print("FamilyNumber Data Error!!"); return; } } saacproto_ACShowMemberList_send( acfd, fmindex_wk); sprintf( sendbuf, " 『族 长 需 知』\n请小心处理族员的资料,一经修改後就无法回复原态,敬请小心。"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, CHAR_WINDOWTYPE_FM_MESSAGE2, CHAR_getWorkInt( leaderdengonindex, CHAR_WORKOBJINDEX), makeEscapeString( sendbuf, buf, sizeof(buf))); } if( strcmp( token, "L") == 0 ){ int i, kind, letterNo = 0; char subtoken[256]; #ifdef _FMVER21 // if( CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER && // CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_INVITE && // CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_VICELEADER) return; if( CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER && CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_ELDER ) return; #else if( CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != 1) return; #endif if (getStringFromIndexWithDelim(message, "|", 3, token2, sizeof(token2)) == FALSE) return; kind = atoi( token2 ); for( i=0 ; i= 0 && tempindex != meindex ) { char tmpbuf[1024]; sprintf(tmpbuf, "%s", CHAR_getChar(tempindex, CHAR_NAME)); makeEscapeString( tmpbuf, buf, sizeof(buf)); sprintf( subsub, "|%d|%s", j, buf ); strcat( subbuf, subsub ); num++; } } sprintf( sendbuf, "L|CHANGE|L|%d%s", num, subbuf ); //lssproto_FM_send( fd, sendbuf); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_LEADERSELECT, WINDOW_BUTTONTYPE_OK, -1, -1, sendbuf ); } // 询问族长候选人是否愿意接受 if( strcmp( token2, "Q") == 0 ) { char token3[64], token4[64]; int toindex; #ifdef _FMVER21 if( CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER) return; #else if( CHAR_getInt(meindex, CHAR_FMLEADERFLAG) != 1) return; #endif if (getStringFromIndexWithDelim(message, "|", 4, token3, sizeof(token3)) == FALSE)return; if (getStringFromIndexWithDelim(message, "|", 5, token4, sizeof(token4)) == FALSE)return; makeStringFromEscaped( token4 ); if( atoi(token3) < 0 || atoi(token3) > FAMILY_MAXMEMBER ) return; toindex = familyMemberIndex[fmindexi][atoi(token3)]; if( !CHAR_CHECKINDEX( toindex ) ) return; if( strcmp( token4, CHAR_getChar( toindex, CHAR_NAME)) != 0 ) return; if( CheckLeaderQ(toindex) < 0 ) return; // 双方都决定让位时,CHAR_WORKLEADERCHANGE存放对方的charaindex CHAR_setWorkInt( toindex, CHAR_WORKLEADERCHANGE, meindex); CHAR_setWorkInt( meindex, CHAR_WORKLEADERCHANGE, toindex); sprintf( sendbuf, "%s|%d", makeEscapeString( CHAR_getChar( meindex, CHAR_NAME ), buf, sizeof(buf)), meindex ); lssproto_WN_send( CHAR_getWorkInt( toindex, CHAR_WORKFD ), WINDOW_MESSAGETYPE_LEADERSELECTA, WINDOW_BUTTONTYPE_OK, -1, -1, sendbuf ); } // 候选人的答覆 if( strcmp( token2, "A") == 0 ) { int leaderindex, answerflag; char leadername[64], token3[64], token4[64]; // print( "%s", message ); if (getStringFromIndexWithDelim(message, "|", 4, token3, sizeof(token3)) == FALSE) return; answerflag = atoi( token3 ); if (getStringFromIndexWithDelim(message, "|", 5, leadername, sizeof( leadername )) == FALSE)return; makeStringFromEscaped( leadername ); if (getStringFromIndexWithDelim(message, "|", 6, token4, sizeof(token4)) == FALSE)return; //if( atoi(token4) < 0 || atoi(token4) > FAMILY_MAXMEMBER ) return; leaderindex = atoi( token4 ); // 检查双方的CHAR_WORKLEADERCHANGE是否相符 if( CHAR_getWorkInt( meindex, CHAR_WORKLEADERCHANGE ) != leaderindex ) return; if( !CHAR_CHECKINDEX(leaderindex) ) return; if( strcmp( leadername, CHAR_getChar( leaderindex, CHAR_NAME) ) != 0 ) return; if( CHAR_getWorkInt( leaderindex, CHAR_WORKLEADERCHANGE ) != meindex ) return; CHAR_setWorkInt( leaderindex, CHAR_WORKLEADERCHANGE, -1 ); #ifdef _FMVER21 if( CHAR_getInt(leaderindex, CHAR_FMLEADERFLAG ) != FMMEMBER_LEADER ) return; #else if( CHAR_getInt(leaderindex, CHAR_FMLEADERFLAG ) != 1 ) return; #endif if( CHAR_getInt(meindex, CHAR_FMINDEX) != CHAR_getInt(leaderindex, CHAR_FMINDEX) ) return; if( answerflag == 0 ) { CHAR_setWorkInt( meindex, CHAR_WORKLEADERCHANGE, 0); CHAR_setWorkInt( leaderindex, CHAR_WORKLEADERCHANGE, 0); lssproto_WN_send( CHAR_getWorkInt( leaderindex, CHAR_WORKFD) , WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n对不起!对方不愿意接受!", buf, sizeof(buf)) ); return; } if( answerflag == 1 ) { char tmpbuf[1024]; sprintf( buf, "%d", CHAR_getInt( meindex, CHAR_FACEIMAGENUMBER ) ); // CoolFish: add charname 2001/9/27 sprintf( tmpbuf, "%s", CHAR_getChar( meindex, CHAR_NAME ) ); saacproto_ACFixFMData_send(acfd, CHAR_getChar(meindex, CHAR_FMNAME), CHAR_getInt(meindex, CHAR_FMINDEX), CHAR_getWorkInt(meindex, CHAR_WORKFMINDEXI), FM_FIX_FMLEADERCHANGE , buf, tmpbuf, CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); // "", CHAR_getWorkInt(meindex, CHAR_WORKFMCHARINDEX), CONNECT_getFdid(fd)); return; } } } } void ACFMJob( int fd, int ret, char* data1, char* data2 ) { int charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX(charaindex) ) return; if( 1 ){ int leaderindex = CHAR_getWorkInt( charaindex, CHAR_WORKLEADERCHANGE ); char buf[256], buf2[256]; CHAR_setWorkInt( charaindex, CHAR_WORKLEADERCHANGE, 0 ); print("leaderindex:%d:%s\n", leaderindex,CHAR_getChar(leaderindex,CHAR_NAME) ); if( !CHAR_CHECKINDEX(leaderindex) ) return; //if( CHAR_getWorkInt( leaderindex, CHAR_WORKLEADERCHANGE ) != charaindex ) return; CHAR_setWorkInt( leaderindex, CHAR_WORKLEADERCHANGE, 0 ); if( ret == 0 ){ CHAR_talkToCli( charaindex, -1, "族长让位失败!", CHAR_COLORYELLOW ); CHAR_talkToCli( leaderindex, -1, "族长让位失败!", CHAR_COLORYELLOW ); return; } // Robin 10/02 debug if( CHAR_getInt( leaderindex, CHAR_FMINDEX) != CHAR_getInt( charaindex, CHAR_FMINDEX) #ifdef _FMVER21 // || CHAR_getInt( leaderindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER ) #else // || CHAR_getInt( leaderindex, CHAR_FMLEADERFLAG) != 1 #endif ) { sprintf( buf, "leaderindex:%d:%s\n", leaderindex, CHAR_getChar( leaderindex, CHAR_NAME) ); LogFamily( CHAR_getChar(charaindex, CHAR_FMNAME), CHAR_getInt(charaindex, CHAR_FMINDEX), CHAR_getChar(charaindex, CHAR_NAME), CHAR_getChar(charaindex, CHAR_CDKEY), "LEADERCHANGE_ERROR(族长让位失败)", buf ); return; } //CHAR_setInt( leaderindex, CHAR_FMLEADERFLAG, FMMEMBER_MEMBER); //CHAR_setInt( charaindex, CHAR_FMLEADERFLAG, FMMEMBER_LEADER); SetFMPetVarInit( leaderindex ); SetFMPetVarInit( charaindex ); CHAR_sendStatusString( leaderindex, "F"); CHAR_sendStatusString( charaindex, "F"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( "\n恭喜你!你已经是新任的族长了。\n请好好的努力吧!\n对了~记得请先到村长家的家族管理员选择\n新的家族守护兽,否则家族将会被解散唷!", buf, sizeof(buf))); sprintf( buf2, "\n辛苦你了!你已经将族长的位子交给%s了。", CHAR_getChar( charaindex, CHAR_NAME) ); lssproto_WN_send( CHAR_getWorkInt( leaderindex, CHAR_WORKFD) , WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, makeEscapeString( buf2, buf, sizeof(buf))); // print(" LeaderChange!! [%s]->[%s] ", CHAR_getChar(leaderindex, CHAR_CDKEY), CHAR_getChar(charaindex, CHAR_CDKEY) ); sprintf( buf, "%s\t%s\t%s", CHAR_getChar(leaderindex, CHAR_FMNAME), CHAR_getChar(leaderindex, CHAR_NAME), CHAR_getChar(leaderindex, CHAR_CDKEY) ); LogFamily( CHAR_getChar(charaindex, CHAR_FMNAME), CHAR_getInt(charaindex, CHAR_FMINDEX), CHAR_getChar(charaindex, CHAR_NAME), CHAR_getChar(charaindex, CHAR_CDKEY), "LEADERCHANGE(族长让位)", buf ); } } #ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族战GM指令 FM_PK_STRUCT fm_pk_struct; void setInt_fm_pk_struct( int index, int type, int num ) { switch( type ){ case FM_INDEX: fm_pk_struct.fm_index[index] = num; break; case FM_WIN: fm_pk_struct.fm_win[index] = num; break; case FM_LOSE: fm_pk_struct.fm_lose[index] = num; break; case FM_SCORE: fm_pk_struct.fm_score[index] = num; break; } } void setChar_fm_pk_struct( int index, int type, char *msg ) { switch( type ){ case FM_NAME: strcpy( fm_pk_struct.fm_name[index], msg ); break; } } int getInt_fm_pk_struct( int index, int type ) { switch( type ){ case FM_INDEX: return fm_pk_struct.fm_index[index]; case FM_WIN: return fm_pk_struct.fm_win[index]; case FM_LOSE: return fm_pk_struct.fm_lose[index]; case FM_SCORE: return fm_pk_struct.fm_score[index]; } return -1; } char *getChar_fm_pk_struct( int index, int type ) { switch( type ){ case FM_NAME: return fm_pk_struct.fm_name[index]; } return NULL; } #endif