family.c
来自「石器时代6.0源代码 2008.08.27最新版 完全可编译开服!」· C语言 代码 · 共 2,026 行 · 第 1/5 页
C
2,026 行
#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 32
#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[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_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;
}
struct FMMEMBER_LIST memberlist[FAMILY_MAXNUM];
struct FMS_MEMO fmsmemo;
struct FM_POINTLIST fmpointlist;
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},
// {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;
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':
// 申请家族据点
FAMILY_SetPoint(fd, index, message);
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;
}
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)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?