📄 family.c
字号:
#include "version.h"#include <stdio.h>#include <string.h>#include <ctype.h>#include <time.h>#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#endifstruct 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[296];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_8int fmdplevelexp[]={0, // 0 150000, // 1 500000, // 2 1000000, // 3 1500000, // 4 2000000, // 5 2500000, // 6 3500000, // 7 4500000, // 8 5000000, // 9 7000000 //10 };#elseint 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 beginint 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;}#endifstruct FMMEMBER_LIST memberlist[FAMILY_MAXNUM];struct FMS_MEMO fmsmemo;struct FM_POINTLIST fmpointlist;#ifdef _NEW_MANOR_LAWManorSchedule_t ManorSchedule[MANORNUM];#endifstruct 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}, {10032},#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<FAMILY_MAXNUM; i++) { for( j=0; j<FAMILY_MAXCHANNEL; j++) for( k=0; k<FAMILY_MAXMEMBER; k++) channelMember[i][j][k] = -1; } for( i=0; i<FAMILY_MAXNUM; i++) for( j=0; j<FAMILY_MAXMEMBER; j++ ) familyMemberIndex[i][j] = -1; #ifdef _NEW_MANOR_LAW for(i=0;i<FAMILY_MAXHOME;i++){ fmpointlist.fm_momentum[i] = -1; fmpointlist.fm_inwar[i] = FALSE; } memset(&ManorSchedule,0,sizeof(ManorSchedule)); for(j=0;j<MANORNUM;j++){ for(i=0;i<10;i++){ ManorSchedule[j].iSort[i] = ManorSchedule[j].iFmIndex[i] = -1; } }#endif familyListBuf[0] = '\0'; saacproto_ACShowFMList_send( acfd ); //print( "FamilyData_Init:%s ", familyListBuf );}void CHAR_Family(int fd, int index, char *message){ char firstToken[64]; char messageeraseescape[512]; char* messagebody; { if (*message == 0) return; CHAR_getMessageBody(message, firstToken, sizeof(firstToken), &messagebody); if (!messagebody) return; strcpysafe(messageeraseescape, sizeof(messageeraseescape), messagebody); makeStringFromEscaped(messageeraseescape); switch(tolower(firstToken[0])) { case 'a': // 成立家族 FAMILY_Add(fd, index, message); break; case 'j': // 加入家族 FAMILY_Join(fd, index, message); break; case 'e': // 离开、退出家族 FAMILY_Leave(fd, index, message); break; case 'm': // 族长审核 FAMILY_CheckMember(fd, index, message); break; case 's': // 取得家族相关资料 FAMILY_Detail(fd, index, message); break; case 'c': // 家族频道 FAMILY_Channel(fd, index, message); break; case 'b': // 家族银行 FAMILY_Bank(fd, index, message); break; case 'p':#ifdef _UN_FMPOINT#else // 申请家族据点 FAMILY_SetPoint(fd, index, message);#endif break; case 't': // 是否继续招募成员 FAMILY_SetAcceptFlag(fd, index, message); break; case 'x': // 修改家族主旨 FAMILY_FixRule( fd, index, message ); break; case 'r': // 骑乘宠物 FAMILY_RidePet( fd, index, message ); break; case 'l': // 族长功能 FAMILY_LeaderFunc( fd, index, message ); break;#ifdef _FM_MODIFY // 家族布告栏功能 case 'd':#ifdef _UN_FMMEMO#else NPC_FmDengonLooked(0,index);#endif break;#endif default: break; } }}int CheckFMLeader(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) == 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -