📄 char.c
字号:
}
}
{
int petarray = CHAR_getInt( charaindex, CHAR_DEFAULTPET);
if( CHAR_CHECKPETINDEX( petarray)) {
if( !CHAR_CHECKINDEX( CHAR_getCharPet( charaindex, petarray))) {
petarray = -1;
}
}else {
petarray = -1;
}
lssproto_KS_send( clifd, petarray, TRUE);
}
{
int flg = 0;
CHAR_setFlg( charaindex, CHAR_ISSHOWBATTLEMSG, 0);
CHAR_setFlg( charaindex, CHAR_ISDUEL, 0);
CHAR_setFlg( charaindex, CHAR_ISTRADECARD, 0);
if( CHAR_getFlg( charaindex, CHAR_ISPARTY)) flg |= CHAR_FS_PARTY;
if( CHAR_getFlg( charaindex, CHAR_ISDUEL)) flg |= CHAR_FS_DUEL;
if( CHAR_getFlg( charaindex, CHAR_ISPARTYCHAT)) flg |= CHAR_FS_PARTYCHAT;
if( CHAR_getFlg( charaindex, CHAR_ISTRADECARD)) flg |= CHAR_FS_TRADECARD;
// CoolFish: 2001/4/18
CHAR_setFlg( charaindex, CHAR_ISTRADE, 0);
lssproto_FS_send( clifd, flg);
}
MAP_sendArroundCharNeedFD( clifd, charaindex );
CHAR_setInt( charaindex, CHAR_LOGINCOUNT, CHAR_getInt( charaindex, CHAR_LOGINCOUNT) + 1 );
CHAR_sendCToArroundCharacter( objindex );
CHAR_sendArroundCharaData( charaindex );
CHAR_sendWatchEvent(objindex,CHAR_ACTSTAND,NULL,0,TRUE);
ADDRESSBOOK_notifyLoginLogout(charaindex,1);
CHAR_setWorkInt(charaindex,CHAR_WORKLASTATTACKCHARAINDEX,-1);
if(CHAR_getInt(charaindex,CHAR_HP) <= 0 ){
typedef int (*DYINGFUNC)(int);
DYINGFUNC dyingfunc=NULL;
dyingfunc = (DYINGFUNC)CHAR_getFunctionPointer(charaindex, CHAR_DYINGFUNC );
CHAR_setInt(charaindex,CHAR_HP,1); // HP 设为 1
logHack( CHAR_getWorkInt(charaindex,CHAR_WORKFD), HACK_HP);
}
if( CHAR_getInt( charaindex,CHAR_SKILLUPPOINT ) >=1 )
CHAR_Skillupsend(charaindex);
CHAR_checkEffect( charaindex);
// CoolFish: Family 2001/5/30
if ((CHAR_getChar(charaindex, CHAR_FMNAME)!=NULL) &&
(CHAR_getInt(charaindex, CHAR_FMINDEX) >= 0) &&
(strcmp(CHAR_getChar(charaindex, CHAR_FMNAME), "") != 0))
{
#ifdef _FMVER21
int eventflag = 0;
// 是否符合族长得资格
if (CheckLeaderQ(charaindex) >= 0)
eventflag = 1;
if (CHAR_getInt(charaindex, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER)
SetFMPetVarInit(charaindex);
saacproto_ACFMCharLogin_send(
acfd,
CHAR_getChar(charaindex, CHAR_FMNAME),
CHAR_getInt(charaindex, CHAR_FMINDEX),
CHAR_getChar(charaindex, CHAR_NAME),
CHAR_getChar(charaindex, CHAR_CDKEY),
CHAR_getInt(charaindex, CHAR_LV), eventflag,
CONNECT_getFdid(clifd)
#ifdef _FM_MODIFY
,getServernumber()
#endif
);
}
#ifdef _FMVER21
else
SetFMVarInit(charaindex);
#endif
#endif
AnnounceToPlayerWN( clifd );
print("\n登陆人物名称:%s ", CHAR_getChar(charaindex, CHAR_NAME ) );
{
unsigned long ip;
char ipstr[512];
ip=CONNECT_get_userip(clifd);
sprintf(ipstr,"%d.%d.%d.%d",
((unsigned char *)&ip)[0],
((unsigned char *)&ip)[1],
((unsigned char *)&ip)[2],
((unsigned char *)&ip)[3]);
LogLogin(
CHAR_getChar( charaindex, CHAR_CDKEY),
CHAR_getChar( charaindex, CHAR_NAME),
saveindex, ipstr
);
}
#ifdef _ITEM_SETLOVER
// 夫妻上线通知对方
if(strlen( CHAR_getChar( charaindex, CHAR_LOVE)) > 0 &&
strlen(CHAR_getChar(charaindex,CHAR_LOVERID))>0 &&
strlen(CHAR_getChar(charaindex,CHAR_LOVERNAME))>0){
int iPlayernum = CHAR_getPlayerMaxNum(),i;
char szMsg[128];
for(i=0;i<iPlayernum;i++){
if(CHAR_getCharUse(i) == FALSE) continue;
if(!strcmp( CHAR_getChar( i, CHAR_LOVE), "YES") &&
!strcmp(CHAR_getChar(charaindex,CHAR_LOVERID),CHAR_getChar(i,CHAR_CDKEY)) &&
!strcmp(CHAR_getChar(charaindex,CHAR_LOVERNAME),CHAR_getChar(i,CHAR_NAME))){
sprintf(szMsg,"你的爱人 %s 上线了",CHAR_getChar(charaindex,CHAR_NAME));
CHAR_talkToCli(i,-1,szMsg,CHAR_COLORYELLOW);
break;
}
}
}
#endif
//VIP上线通知
#ifdef _VIP_ALL
if(getShowVip()!=0)
if(CHAR_getInt( charaindex,CHAR_VIPRIDE )==1){
int i;
int playernum = CHAR_getPlayerMaxNum();
char *MyServerName = getGameserverID();
char *MyGameservername = getGameservername();
char VipMsg1[256];
char VipMsg2[256];
char VipMsg3[256];
char VipMsg4[256];
char VipMsg5[256];
char *MyName = CHAR_getChar( charaindex,CHAR_NAME );
char buf[80];
time_t t;
t=time(0);
strcpy(buf,ctime(&t));
buf[strlen(buf)-1]=0;
for( i = 0 ; i < playernum ; i++)
{
sprintf( VipMsg1, "全国上下,热烈欢呼尊贵的%s会员( %s )登陆%s." , MyGameservername , MyName , MyServerName );
CHAR_talkToCli( i, -1, VipMsg1, CHAR_COLORRED );
sprintf( VipMsg2, "%s精确报时: %s." , MyServerName , buf );
CHAR_talkToCli( i, -1, VipMsg2, CHAR_COLORRED );
sprintf( VipMsg3, "\%s提醒您警惕网络骗子,妥善保管游戏帐号!!" , MyGameservername );
CHAR_talkToCli( i, -1, VipMsg3, CHAR_COLORRED );
CHAR_talkToCli( i, -1,"您现在使用的Server是XFei开发的Windows平台版.", CHAR_COLORYELLOW );
CHAR_talkToCli( i, -1,"提供更好的版本请联系262301417,销售6.0新功能端&8.0新功能端需要联系!!", CHAR_COLORYELLOW );
CHAR_talkToCli( i, -1,"提供更多石器私服研究技术请登陆http://bbs.sq25.cn!!", CHAR_COLORYELLOW );
}
}
#endif
return;
DELETECHARDATA:
CHAR_endCharOneArray( charaindex );
MAKECHARDATAERROR:
{
int i;
char cdkey[CDKEYLEN];
for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) {
if( CHAR_CHECKINDEX(ch.unionTable.indexOfPet[i] ) ) {
CHAR_endCharOneArray( ch.unionTable.indexOfPet[i] );
}
}
CONNECT_getCdkey( clifd, cdkey, sizeof(cdkey ));
saacproto_ACLock_send( acfd, cdkey, UNLOCK, CONNECT_getFdid(clifd) );
}
CONNECT_setState(clifd, WHILECANNOTLOGIN );
CONNECT_setCharaindex( clifd, -1 );
lssproto_CharLogin_send( clifd, FAILED, "Download data ok,but cannot make chara");
}
BOOL CHAR_charSaveFromConnectAndChar( int fd, Char* ch, BOOL unlock )
{
char* chardata;
char cdkey[CDKEYLEN];
chardata = CHAR_makeStringFromCharData( ch );
if( chardata == "\0" )return FALSE;
CONNECT_getCdkey( fd, cdkey, sizeof(cdkey));
if(strcmp(cdkey,ch->string[CHAR_CDKEY].string)!=0){
printf("连接:%s与账号:%s不符合,不给予存档",cdkey,ch->string[CHAR_CDKEY].string);
}
#ifdef _NEWSAVE
// print("saveindex_save:%d\n",ch->data[CHAR_SAVEINDEXNUMBER]);
saacproto_ACCharSave_send( acfd, ch->string[CHAR_CDKEY].string,
ch->string[CHAR_NAME].string,
CHAR_makeOptionString( ch ), chardata,
unlock, CONNECT_getFdid(fd), ch->data[CHAR_SAVEINDEXNUMBER] );
#else
saacproto_ACCharSave_send( acfd, cdkey,
ch->string[CHAR_NAME].string,
CHAR_makeOptionString( ch ), chardata,
unlock, CONNECT_getFdid(fd) );
#endif
return TRUE;
}
BOOL CHAR_charSaveFromConnect( int fd , BOOL unlock)
{
Char* ch;
int charaindex = CONNECT_getCharaindex(fd);
if( CHAR_CHECKINDEX( charaindex ) == FALSE)return FALSE;
ch = CHAR_getCharPointer( charaindex );
if( !ch )return FALSE;
return CHAR_charSaveFromConnectAndChar( fd, ch, unlock );
}
/*------------------------------------------------------------
* 夫弘失它玄允月凛卞 匀凶引引夫弘失它玄匹五卅中失奶 丞毛
* 允
* 娄醒
* charaindex int 平乓仿弁正□及奶件犯永弁旦
* 忒曰袄
* 卅仄
------------------------------------------------------------*/
static void CHAR_dropItemAtLogout( int charaindex )
{
int i;
for( i=0 ; i<CHAR_MAXITEMHAVE ; i++ ){
int itemindex;
itemindex = CHAR_getItemIndex(charaindex,i);
if( ITEM_CHECKINDEX(itemindex) == FALSE )continue;
if( ITEM_getInt(itemindex,ITEM_DROPATLOGOUT ) == TRUE ) {
{
LogItem(
CHAR_getChar( charaindex, CHAR_NAME ),
CHAR_getChar( charaindex, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名称
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID ),
#endif
"LogoutDel(登出後消失的道具)",
CHAR_getInt( charaindex,CHAR_FLOOR),
CHAR_getInt( charaindex,CHAR_X ),
CHAR_getInt( charaindex,CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
}
CHAR_setItemIndex( charaindex, i ,-1);
CHAR_sendItemDataOne( charaindex, i);
ITEM_endExistItemsOne(itemindex);
}
}
}
BOOL _CHAR_logout( char *file, int line, int clifd, BOOL save )
{
int charindex, battleindex;
BOOL ret = TRUE;
int fmindexi, channel, i;
charindex = CONNECT_getCharaindex( clifd );
if( !CHAR_CHECKINDEX( charindex)) {
print( "logout err : clifd[%d] charaindex[%d] %s:%d from %s:%d \n",
clifd, charindex, __FILE__, __LINE__, file, line);
ret = FALSE;
}
battleindex = CHAR_getWorkInt( charindex, CHAR_WORKBATTLEINDEX );
if( battleindex >= 0 ){
BATTLE_EscapeDpSend( battleindex, charindex );
CHAR_setInt( charindex, CHAR_DUELPOINT,
CHAR_getInt( charindex, CHAR_DUELPOINT )
+ CHAR_getWorkInt( charindex, CHAR_WORKGETEXP ) );
BATTLE_Exit( charindex, battleindex );
}
CHAR_dropItemAtLogout( charindex );
CHAR_DischargeParty( charindex, 0);
if(CHAR_getChar(charindex, CHAR_FMNAME) != NULL ) {
if(strlen(CHAR_getChar(charindex, CHAR_FMNAME)) > 0 &&
strlen(CHAR_getChar(charindex, CHAR_FMNAME)) < sizeof( STRING32) )
if( (CHAR_getInt(charindex, CHAR_FMINDEX) >= 0) &&
(strcmp(CHAR_getChar(charindex, CHAR_FMNAME), "") != 0) ) {
saacproto_ACFMCharLogout_send(acfd,
CHAR_getChar(charindex, CHAR_FMNAME),
CHAR_getInt(charindex, CHAR_FMINDEX),
CHAR_getChar(charindex, CHAR_NAME),
CHAR_getChar(charindex, CHAR_CDKEY),
CHAR_getInt(charindex, CHAR_LV),
CHAR_getWorkInt(charindex, CHAR_WORKFMINDEXI),
CONNECT_getFdid(clifd));
}
}
// Robin 0606 channel
fmindexi = CHAR_getWorkInt(charindex, CHAR_WORKFMINDEXI);
channel = CHAR_getWorkInt(charindex, CHAR_WORKFMCHANNEL);
i = 0;
if( (fmindexi > 0) && (channel >= 0) && (fmindexi < FAMILY_MAXNUM) && (channel < FAMILY_MAXCHANNEL)) {
while( i < FAMILY_MAXMEMBER ) {
if( channelMember[fmindexi][channel][i] == charindex ) {
channelMember[fmindexi][channel][i] = -1;
break;
}
i++;
}
}
// Robin 0707 petFollow
CHAR_pickupFollowPet( charindex, -1 );
for( i=0; i<FAMILY_MAXMEMBER; i++ ){
if ((fmindexi > 0) && (fmindexi < FAMILY_MAXNUM)){
if( familyMemberIndex[fmindexi][i] == charindex ){
familyMemberIndex[fmindexi][i] = -1;
break;
}
}
}
// Robin 0629 silent
if( CHAR_getInt( charindex, CHAR_SILENT) > 0 ){
int silent_t, login_t;
login_t = CHAR_getWorkInt(charindex, CHAR_WORKLOGINTIME);
silent_t = CHAR_getInt( charindex, CHAR_SILENT);
silent_t = silent_t - ( (int)NowTime.tv_sec-login_t);
if( silent_t<0 ) silent_t = 0;
CHAR_setInt( charindex, CHAR_SILENT, silent_t);
}
#ifdef _ITEM_ADDEXP2
if( CHAR_getWorkInt( charindex, CHAR_WORKITEM_ADDEXP) > 0 ) {
// 登入时智果效果自动减90秒
CHAR_setWorkInt( charindex, CHAR_WORKITEM_ADDEXPTIME,
CHAR_getWorkInt( charindex, CHAR_WORKITEM_ADDEXPTIME) - 90 );
if( CHAR_getWorkInt( charindex, CHAR_WORKITEM_ADDEXPTIME) <= 0 ) {
CHAR_setWorkInt( charindex, CHAR_WORKITEM_ADDEXPTIME, 0);
CHAR_setWorkInt( charindex, CHAR_WORKITEM_ADDEXP, 0);
}
}
CHAR_setInt( charindex, CHAR_ADDEXPPOWER,
CHAR_getWorkInt( charindex, CHAR_WORKITEM_ADDEXP) );
CHAR_setInt( charindex, CHAR_ADDEXPTIME,
CHAR_getWorkInt( charindex, CHAR_WORKITEM_ADDEXPTIME) );
#endif
#ifdef _TIME_TICKET
if( check_TimeTicketMap( CHAR_getInt( charindex, CHAR_FLOOR)) ) {
CHAR_warpToSpecificPoint( charindex, 7001, 41, 6);
}
#endif
#ifdef _AUTO_PK
if(CHAR_getInt(charindex,CHAR_FLOOR)==20000 && CHAR_getInt(charindex,CHAR_AUTOPK)!=-1 ){
char buf[64];
int i,num=0,winindex;
int playernum = CHAR_getPlayerMaxNum();
sprintf(buf, "胆小鬼%s退出当前比赛!",CHAR_getChar(charindex,CHAR_NAME));
AutoPk_PKSystemTalk( buf, buf );
if(CHAR_getWorkInt( charindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){
if(AutoPk_PKTimeGet()<=0){
for(i=0;i<playernum;i++){
if(CHAR_CHECKINDEX(i) == FALSE ) continue;
if(CHAR_getInt(i, CHAR_FLOOR) == 20000 ){
if(CHAR_getInt(i,CHAR_AUTOPK)!=-1){
if(i!=charindex)
winindex=i;
num++;
}
}
}
if(num==2){
int fl = 0, x = 0, y = 0;
CHAR_getElderPosition(CHAR_getInt(winindex, CHAR_LASTTALKELDER), &fl, &x, &y);
CHAR_warpToSpecificPoint(winindex, fl, x, y);
AutoPk_ChampionShipSet( CHAR_getChar(winindex,CHAR_CDKEY),
CHAR_getChar(winindex,CHAR_NAME), CHAR_getInt(winindex,CHAR_AUTOPK),1);
AutoPk_ChampionShipSet( CHAR_getChar(charindex,CHAR_CDKEY),
CHAR_getChar(charindex,CHAR_NAME),
CHAR_getInt(charindex,CHAR_AUTOPK),2);
AutoPk_GetChampionShip();
}
}
}
}
#endif
// Robin add
CHAR_setInt( charindex, CHAR_LASTLEAVETIME, (int)time(NULL));
if( save ){
CHAR_charSaveFromConnect( clifd ,TRUE);
}
ADDRESSBOOK_notifyLoginLogout(charindex,0);
CHAR_CharaDeleteHavePet( charindex);
CHAR_CharaDelete( charindex );
return ret;
}
/*------------------------------------------------------------
* watch奶矛件玄毛霜月井升丹井民尼永弁允月
* 娄醒
* objindex int 奶矛件玄毛云仇仄凶平乓仿及左皮斥尼弁玄
* 奶件犯永弁旦
* index int 奶矛件玄毛云仇仄凶平乓仿及奶件犯永弁旦
* recvindex int 奶矛件玄毛熬仃午月平乓仿及index
* chac int 失弁扑亦件及潘
* 忒曰袄 TRUE: 霜匀化中中方
* FALSE: 蛲
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -