#include "version.h" #include #include "readmap.h" #include "object.h" #include "char.h" #include "char_base.h" #include "battle.h" #include "lssproto_serv.h" #include "npcutil.h" #include "npc_bus.h" #include "npc_airplane.h" // Arminius 7.10 Airplane #include "family.h" // shan #ifdef _ITEM_QUITPARTY #include "init.h" #endif #ifdef _ALLBLUES_LUA #include "mylua/function.h" #endif // shan add extern struct FM_PKFLOOR fmpkflnum[FAMILY_FMPKFLOOR]; /*------------------------------------------------------------ * 由□ 奴楮 及末□旦 ------------------------------------------------------------*/ /*------------------------------------------------------------ * 坞中化中月由□ 奴 毛茧允 * 卅仃木壬-1毛忒允[ ------------------------------------------------------------*/ int CHAR_getEmptyPartyArray( int charaindex) { int i = -1; int rc = FALSE; int toindex; if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { toindex = charaindex; } else { toindex = CHAR_getPartyIndex( charaindex, 0); } if( CHAR_CHECKINDEX( toindex)){ for( i = 1; i < CHAR_PARTYMAX; i ++ ) { if( CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1) == -1 ) { rc = TRUE; break; } } } return( rc ? i: -1); } int CHAR_getPartyNum( int charaindex) { int i = -1; int rc = FALSE; int toindex; if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { return 1; } else { toindex = CHAR_getPartyIndex( charaindex, 0); } if( CHAR_CHECKINDEX( toindex)){ for( i = 1; i <= CHAR_PARTYMAX; i ++ ) { if(i==CHAR_PARTYMAX) return i; if( CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1) == -1 ) { return i; } } } return i; } /*------------------------------------------------------------ * 端卞由□ 奴卞 月质 * * charaindex int 愤坌 * targetindex int 月锹澎及谛 ------------------------------------------------------------*/ BOOL CHAR_JoinParty_Main( int charaindex, int targetindex) { int firstflg = FALSE; int i; char c[3]; char buf[64]; int toindex; int parray; /* 褪互中凶日娄匀舰曰请允 */ if( CHAR_getWorkInt( targetindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { toindex = targetindex; } else { toindex = CHAR_getPartyIndex( targetindex, 0); if( !CHAR_CHECKINDEX( toindex) ) { print( " %s:%d err\n", __FILE__, __LINE__); return; } } #ifdef _ALLBLUES_LUA_1_5 if(FreePartyJoin(charaindex, toindex) == FALSE){ return FALSE; } #endif /* 锹澎由□ 奴及谛醒反 井" */ parray = CHAR_getEmptyPartyArray( toindex) ; if( parray == -1 ) { print( "%s : %d err\n", __FILE__,__LINE__); return; } //组队BUG int pi; for( pi = 0; pi < CHAR_PARTYMAX; pi ++ ) { int index = CHAR_getWorkInt( toindex, pi + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { if(index == charaindex) return; //组队BUG } } #ifdef _WARNPC_CTRL int mapi; for(mapi=0;mapi<10;mapi++){ int floorid = getPartyMap(mapi); if(CHAR_getInt(charaindex,CHAR_FLOOR)==floorid){ int sameipnum = getMapSameIp(mapi); int partyi; unsigned ip=CONNECT_get_userip(getfdFromCharaIndex(charaindex)); unsigned teseip = ip; unsigned toip; int a, b, c, d,ipcnt=1; char ipstr[32]; a=(teseip % 0x100); teseip=teseip / 0x100; b=(teseip % 0x100); teseip=teseip / 0x100; c=(teseip % 0x100); teseip=teseip / 0x100; d=(teseip % 0x100); sprintf(ipstr,"%d.%d.%d.%d",a,b,c,d); if(strcmp(ipstr,getNoAttIp(0))==0 || strcmp(ipstr,getNoAttIp(1))==0 || strcmp(ipstr,getNoAttIp(2))==0 || strcmp(ipstr,getNoAttIp(3))==0 || strcmp(ipstr,getNoAttIp(4))==0) break; if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { toip=CONNECT_get_userip(getfdFromCharaIndex(toindex)); if(ip==toip){ ipcnt++; if(ipcnt>sameipnum){ CHAR_talkToCli( charaindex, -1, "此地图允许的单IP组队已达上限,无法加入。", CHAR_COLORYELLOW); return; } else break; } break; }else{ for( partyi = 0; partyi < CHAR_PARTYMAX; partyi ++ ) { int index = CHAR_getWorkInt( toindex, partyi + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { toip = CONNECT_get_userip(getfdFromCharaIndex(index)); if(ip==toip){ ipcnt++; if(ipcnt>sameipnum){ CHAR_talkToCli( charaindex, -1, "此地图允许的单IP组队已达上限,无法加入。", CHAR_COLORYELLOW); return; } } } } } } } #endif #ifdef _FLOOR_PARTY_CTRL int mapj; for(mapj=1;mapj<=5;mapj++){ int floorid = getPartyFloor(mapj); if(CHAR_getInt(charaindex,CHAR_FLOOR)==floorid){ time_t timep; struct tm *p; time(&timep); p=localtime(&timep); /*取得当地时间*/ int day=p->tm_wday; int hour=p->tm_hour; if(hour < 2) day = day - 1; if(day>5 || day<1) day = 5; int partyi,partycnt=1; if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { partycnt++; if(partycnt>day){ CHAR_talkToCli( charaindex, -1, "本地图限制组队人数已达上限,周一为1人,周二为2人,周三为3人,周四为4人,其余无限制。", CHAR_COLORYELLOW); return; } else break; }else{ for( partyi = 0; partyi < CHAR_PARTYMAX; partyi ++ ) { int index = CHAR_getWorkInt( toindex, partyi + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { partycnt++; if(partycnt>day){ CHAR_talkToCli( charaindex, -1, "本地图限制组队人数已达上限,周一为1人,周二为2人,周三为3人,周四为4人,其余无限制。", CHAR_COLORYELLOW); return; } } } } } } #endif /* 窒手 仄 褪及凛反褪卞卅匀凶CA毛霜耨允月 */ if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { CHAR_sendLeader( CHAR_getWorkInt( toindex, CHAR_WORKOBJINDEX), 1); /* 锹澎及橇谪及踏五晶尹 */ /* 褪卞卅月 */ CHAR_setWorkInt( toindex, CHAR_WORKPARTYMODE, 1); CHAR_setWorkInt( toindex, CHAR_WORKPARTYINDEX1, toindex); firstflg = TRUE; } CHAR_setWorkInt( toindex, parray + CHAR_WORKPARTYINDEX1, charaindex); CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, ""); CHAR_setWorkInt( charaindex, CHAR_WORKPARTYMODE, CHAR_PARTY_CLIENT); CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, toindex); if( firstflg ) { CHAR_sendStatusString( toindex, "N0"); } for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { snprintf( c, sizeof(c), "N%d", i); CHAR_sendStatusString( charaindex, c); } } snprintf( buf,sizeof( buf), "%s 加入团队!", CHAR_getChar( charaindex, CHAR_NAME)); for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index)) { if( index != charaindex ) { snprintf( c, sizeof(c), "N%d", parray); CHAR_sendStatusString( index, c); CHAR_talkToCli( index, -1, buf, CHAR_COLORYELLOW); } else { CHAR_talkToCli( index, -1, "加入团队!", CHAR_COLORYELLOW); } } } } /*------------------------------------------------------------ * 由□ 奴卞 欠丹午允月[ ------------------------------------------------------------*/ BOOL CHAR_JoinParty( int charaindex ) { int result = -1; int x,y; OBJECT object; int found = FALSE; int fd; int cnt; int i; fd = getfdFromCharaIndex( charaindex ); if( fd == -1 ) { print( "%s : %d err\n", __FILE__, __LINE__); return FALSE; } /* 愤坌互由□ 奴赚氏匹凶日蛲 */ if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { lssproto_PR_send( fd, 1, FALSE); return FALSE; } /* 及蟆及甄 毛 月 */ CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , CHAR_getInt( charaindex , CHAR_X ), CHAR_getInt( charaindex , CHAR_Y ) , 1 , &x , &y ); /* 赓渝祭允月 */ for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setJoinpartycharaindex(fd,i,-1); } cnt = 0; /*愤坌及 及蟆及平乓仿毛潸 允月 */ for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR),x,y) ; object ; object = NEXT_OBJECT(object ) ) { int toindex; int parray; int objindex = GET_OBJINDEX(object); int targetindex = -1; /* 平乓仿弁正□元扎卅中 */ if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; toindex = OBJECT_getIndex( objindex); // shan begin if( CHAR_getInt(charaindex, CHAR_FMINDEX) > 0 && CHAR_getInt(toindex, CHAR_FMINDEX) >0){ for( i = 0; i < FAMILY_FMPKFLOOR; i++){ if( fmpkflnum[i].fl == CHAR_getInt( charaindex, CHAR_FLOOR) ) if( CHAR_getInt(charaindex, CHAR_FMINDEX) != CHAR_getInt(toindex, CHAR_FMINDEX) ){ lssproto_PR_send( fd, 1, FALSE); return FALSE; } } } // shan end /* 皿伊奶乩□及凛 */ if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER || CHAR_getInt(toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYERNPC){ found = TRUE; /* 锹澎互阂分匀凶日褪毛娄匀舰曰请允 */ if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { targetindex = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( !CHAR_CHECKINDEX( targetindex) ) { print( " %s:%d err\n", __FILE__, __LINE__); continue; } if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS) { continue; } } else { targetindex = toindex; } /* 褪午 ㄠ汹动 卞中月井 */ if( NPC_Util_CharDistance( charaindex, targetindex ) > 1) { continue; } /* 爵 反匹卅中仪[*/ if( CHAR_getWorkInt( targetindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){ continue; } /* 醮棉袱第乒□玉井 */ if( !CHAR_getFlg( targetindex, CHAR_ISPARTY) ) continue; #ifdef _ANGEL_SUMMON if( CHAR_getWorkInt( targetindex, CHAR_WORKANGELMODE) == TRUE) { CHAR_talkToCli( charaindex, -1, "使者不可以当领队。", CHAR_COLORYELLOW); continue; } #endif } /* 穴件乒旦田旦互中月凛反]谛棉方曰穸燮允月[ */ else if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { targetindex = toindex; cnt = 0; if( !NPC_BusCheckJoinParty( toindex, charaindex, TRUE)) { /* 椭瘀毛 凶今卅井匀凶[醮棉 月及反蔽歹月[谛棉及质 手仄卅中[ * 支支仇仄中及匹[ */ break; } { // Arminius 7.10 Airplane int busimg=CHAR_getInt(toindex, CHAR_BASEIMAGENUMBER); if ((busimg!=100355) && (busimg!=100461)) { CHAR_setInt(charaindex,CHAR_BASEIMAGENUMBER,busimg); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); // Robin debug 01/11/21 if( CHAR_getInt( charaindex, CHAR_RIDEPET) != -1 ) { CHAR_setInt( charaindex, CHAR_RIDEPET, -1); CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_RIDEPET); } /* CHAR_sendPMEToArroundCharacterFLXY(charaindex, CHAR_getInt( charaindex, CHAR_FLOOR), CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y), 0,1,CHAR_getInt( charaindex, CHAR_PETMAILEFFECT) ); */ } } } /* 皿伊奶乩□坭反穴件乒旦田旦动陆反 骰允月 */ else { continue; } /* 锹澎由□ 奴及谛醒反 井" */ parray = CHAR_getEmptyPartyArray( targetindex) ; if( parray == -1 ) continue; /* 仇仇引匹仁木壬 */ CONNECT_setJoinpartycharaindex( fd,cnt,toindex); cnt++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; /* 穴件乒旦田旦 苇仄分中]伙□皿毛 仃月[ */ if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) break; } if( cnt == 0 ) { if( found == TRUE) { CHAR_talkToCli( charaindex, -1, "无法加入团队。", CHAR_COLORYELLOW); } result = FALSE; }else if( cnt == 1 ) { #ifdef _AUTO_PK if(CHAR_getInt(charaindex,CHAR_FLOOR)==20000){ CHAR_talkToCli( charaindex, -1, "单P系统禁止组队!", CHAR_COLORYELLOW); result = FALSE; }else #endif { CHAR_JoinParty_Main( charaindex, CONNECT_getJoinpartycharaindex(fd,0)); result = TRUE; } }else { int strlength; char msgbuf[1024]; char escapebuf[2048]; strcpy( msgbuf, "1\n和谁组成团队呢?\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getJoinpartycharaindex( fd,i ) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getJoinpartycharaindex(fd,i) , CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%d视窗讯息buffer不足。\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTPARTY, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); } if( result != -1 ) { lssproto_PR_send( fd, 1, result); } return result; } static BOOL CHAR_DischargePartySub( int charaindex, int msgflg) { char buf[64], c[3]; int toindex,flg,i; #ifdef _ITEM_QUITPARTY int j = 0,k; #endif if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) { int pindex, airplaneflag=0; // Arminius 7.10 Airplane if( CHAR_getInt(charaindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { if ((CHAR_getInt(charaindex, CHAR_BASEIMAGENUMBER) !=100355) && (CHAR_getInt(charaindex, CHAR_BASEIMAGENUMBER) !=100461)){ airplaneflag=1; } } for( i = 0; i < CHAR_PARTYMAX; i ++ ) { pindex = CHAR_getWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( pindex) ) { int fd = getfdFromCharaIndex( pindex ); #ifdef _PLAYER_NPC if(CHAR_getInt( pindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYERNPC){ CHAR_CharaDelete(pindex); continue; } #endif CHAR_setWorkInt( pindex, CHAR_WORKPARTYINDEX1, -1); CHAR_setWorkInt( pindex, CHAR_WORKPARTYMODE, CHAR_PARTY_NONE); if( msgflg ){ CHAR_talkToCli( pindex, -1, "团队已解散!", CHAR_COLORYELLOW); #ifdef _ITEM_QUITPARTY // won fix for( j=0;j=0){ int fl,x,y; CHAR_getElderPosition( CHAR_getInt( charaindex, CHAR_LASTTALKELDER), &fl, &x, &y ); CHAR_warpToSpecificPoint(charaindex, fl, x, y); } } } } CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, -1); for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX(index) ){ if( index == charaindex) { myarray = i; break; } } } if( myarray == CHAR_PARTYMAX) { print( "DischargeParty(): 真奇怪!"); return FALSE; } CHAR_setWorkInt( toindex, CHAR_WORKPARTYINDEX1 + myarray, -1); snprintf( buf,sizeof( buf), "%s 脱离团队!", CHAR_getChar( charaindex, CHAR_NAME)); if( msgflg ){ CHAR_talkToCli( charaindex, -1, "脱离团队!", CHAR_COLORYELLOW); #ifdef _ITEM_QUITPARTY // won fix for( i=0;i 1) { int parent_dir; start.x = CHAR_getInt( index, CHAR_X); start.y = CHAR_getInt( index, CHAR_Y); parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); end = start; if( parent_dir != -1 ) { CHAR_walk( index, parent_dir, 0); } } previndex = index; } } } } return TRUE; } BOOL CHAR_DischargeParty( int charaindex, int flg) { return CHAR_DischargePartySub( charaindex, 1); } BOOL CHAR_DischargePartyNoMsg( int charaindex) { return CHAR_DischargePartySub( charaindex, 0); } /*------------------------------------------------------------ * 愤坌互伉□母□井升丹井毛霜耨允月[ ------------------------------------------------------------*/ void CHAR_sendLeader( int objindex, int leader) { int opt[1]; opt[0] = leader; CHAR_sendWatchEvent( objindex,CHAR_ACTLEADER,opt,1,TRUE); } /*------------------------------------------------------------ * 醮棉毛赐 CHAR_WORKPARTYINDEX)隙烂匹平乓仿index毛娄匀舰月[ * 愤坌互褪匹手阂匹手 [ ------------------------------------------------------------*/ int CHAR_getPartyIndex( int index, int num) { int nindex = -1; /* 醮棉及奶件犯永弁旦毛潸 */ /* 褪及桦宁 */ if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) { nindex = CHAR_getWorkInt( index, CHAR_WORKPARTYINDEX1 + num ); } /* 阂及桦宁 */ else { int oyaindex = CHAR_getWorkInt( index, CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( oyaindex)) { nindex = CHAR_getWorkInt( oyaindex, CHAR_WORKPARTYINDEX1+num); } } return nindex; } /*------------------------------------------------------------ * 丢永本□斥毛霜耨允月[ * 醮棉互中木壬公及醮棉卞手丢永本□斥毛霜耨允月[ ------------------------------------------------------------*/ void CHAR_talkToCliAndParty( int talkedcharaindex,int talkcharaindex, char* message, CHAR_COLOR color ) { int i; /* 引内愤坌 */ CHAR_talkToCli( talkedcharaindex, talkcharaindex, message, color); for( i = 0; i < CHAR_PARTYMAX; i ++ ) { int index = CHAR_getPartyIndex( talkedcharaindex, i); if( CHAR_CHECKINDEX( index) && index != talkedcharaindex) { CHAR_talkToCli( index, talkcharaindex, message, color); } } }