#include "version.h" #include #include #include #include "common.h" #include "util.h" #include "lssproto_serv.h" #include "saacproto_cli.h" #include "net.h" #include "char.h" #include "object.h" #include "readmap.h" #include "addressbook.h" #include "handletime.h" #include "configfile.h" #include "event.h" #include "pet.h" #include "battle.h" #include "battle_command.h" #include "magic.h" #include "petmail.h" #include "item_gen.h" #include "pet_skill.h" #include "log.h" //add this because the second had it #include "map_deal.h" // CoolFish: 2001/4/18 #include "trade.h" // CoolFish: Trade 2001/4/18 #include "family.h" // CoolFish: Family 2001/5/24 #include "item_event.h" // shan: blackmarket #ifdef _AUTO_PK #include "npc_autopk.h" #endif #include "npc_healer.h" #ifdef _PROFESSION_SKILL // WON ADD 人物职业技能 #include "profession_skill.h" #endif #ifdef _CHATROOMPROTOCOL // (不可开) Syu ADD 聊天室频道 #include "chatroom.h" #endif #ifdef _ONLINE_SHOP #include "longzoro/newshop.h" #endif #ifdef _ALLBLUES_LUA #include "mylua/function.h" #endif extern int player_online; BOOL checkStringErr( char * ); // shan add extern struct FM_PKFLOOR fmpkflnum[FAMILY_FMPKFLOOR]; /* ----------------------------------------------------------------------- * 联买した筛弄の戎规からキャラインデックスを评る * ----------------------------------------------------------------------*/ static int Callfromcli_Util_getTargetCharaindex( int fd, int toindex) { int to_charaindex = -1; int fd_charaindex = CONNECT_getCharaindex( fd ); /* 极尸极咳 */ if( toindex == 0 ) { to_charaindex = fd_charaindex; } /* ペット 1 ×5 */ else if( toindex > 0 && toindex < 6 ) { to_charaindex = CHAR_getCharPet( fd_charaindex, toindex-1); if( !CHAR_CHECKINDEX( to_charaindex)) { to_charaindex = -1; } } /* 苗粗 6 ×10 */ else if( toindex > 5 && toindex < 11 ) { to_charaindex = CHAR_getPartyIndex( fd_charaindex, toindex - 6); } return to_charaindex; } /*---------------------------------------- * クライアントがログインする でもメモリに委めるだけなのでチェックはない * これを钙ぶと CLI になる。 ----------------------------------------*/ void lssproto_ClientLogin_recv( int fd,char* cdkey, char* passwd, char* mac, int servid,char *Newip ) { if(CONNECT_getState(fd) == NULLCONNECT){ CONNECT_setState(fd, NOTLOGIN); } /* 2脚にこれが钙ばれるのはいい */ /* パスワ〖ド恃构をして喇根だったら浩びこれを钙ぶ祸。*/ {//ttom avoid the restore 2001/01/09 if(CONNECT_isNOTLOGIN(fd)==FALSE){ print("\n the Client had Logined fd=%d",fd); return; } } if( checkStringErr(cdkey) ) return; if( checkStringErr(passwd) ) return; //print( "CliLogin cdkey=%s\n" , cdkey ); /* connectにコピ〖する */ CONNECT_setCdkey( fd, cdkey ); CONNECT_setPasswd( fd, passwd ); CONNECT_setCtype( fd, CLI ); #ifdef _NEWCLISETSERVID CONNECT_setServid( fd, servid ); #endif #ifdef _NEWCLISETMAC if( checkStringErr(mac) ){ strcpy(mac, ""); } CONNECT_setMAC( fd , mac); #endif unsigned long tmpip; int a,b,c,d; char ip[32]; tmpip=CONNECT_get_userip(fd); a=(tmpip % 0x100); tmpip=tmpip / 0x100; b=(tmpip % 0x100); tmpip=tmpip / 0x100; c=(tmpip % 0x100); tmpip=tmpip / 0x100; d=(tmpip % 0x100); sprintf(ip,"%d.%d.%d.%d",a,b,c,d); // print( "\n登陆账号=%s 密码=%s IP=%s MAC=%s SERVID=%d\n",cdkey,passwd,ip,mac,servid); #ifdef _NO_FULLPLAYER_ATT { int res; if (strlen(cdkey)==0 || strlen(passwd)==0 || strlen(ip)==0){ print("登陆信息有错误!\n"); lssproto_ClientLogin_send( fd , "no" ); CONNECT_endOne_debug(fd); return; } res=sasql_query(cdkey,passwd); // print("res=%d!\n",res); if (res==3){ if(getNoCdkeyPlayer()>0 && fd-player_online>=getNoCdkeyPlayer() && getNoCdkeyMode()!=0){ if(strcmp(ip,getNoAttIp(0))!=0 && strcmp(ip,getNoAttIp(1))!=0 && strcmp(ip,getNoAttIp(2))!=0 && strcmp(ip,getNoAttIp(3))!=0 && strcmp(ip,getNoAttIp(4))!=0){ if(getNoCdkeyType()==0){ //if(sasql_query_online_ip(ip)==0 && sasql_check_lockip(ip,getFengType())<1){ if(sasql_query_online_ip(ip)==0){ //if(sasql_add_lockip(ip,getFengType(),getServernumber(),2)==1){ print("错误1!\n"); CONNECT_endOne_debug(fd); return; //} } }else{ print("错误2!\n"); CONNECT_endOne_debug(fd); return; } } } }else if (res!=1){ if(getNoCdkeyPlayer()>0 && fd-player_online>=getNoCdkeyPlayer() && getNoCdkeyMode()==2){ if(strcmp(ip,getNoAttIp(0))!=0 && strcmp(ip,getNoAttIp(1))!=0 && strcmp(ip,getNoAttIp(2))!=0 && strcmp(ip,getNoAttIp(3))!=0 && strcmp(ip,getNoAttIp(4))!=0){ if(getNoCdkeyType()==0){ //if(sasql_query_online_ip(ip)==0 && sasql_check_lockip(ip,getFengType())<1){ if(sasql_query_online_ip(ip)==0){ //if(sasql_add_lockip(ip,getFengType(),getServernumber(),2)==1){ print("错误3!\n"); CONNECT_endOne_debug(fd); return; //} } }else{ print("错误4!\n"); CONNECT_endOne_debug(fd); return; } } } CONNECT_endOne_debug(fd); return; } } #endif #ifdef _NEWCLISETMAC saacproto_ACCharLogin_send( acfd, fd, cdkey, passwd, ip, mac); #else saacproto_ACCharLogin_send( acfd, fd, cdkey, passwd, ip); #endif } void lssproto_CreateNewChar_recv( int fd,int dataplacenum,char* charname, int imgno,int faceimgno, int vital,int str,int tgh,int dex, int earth,int water,int fire,int wind, int hometown ) { char cdkey[CDKEYLEN]; if( CONNECT_isCLI( fd ) == FALSE )return; if( CONNECT_isNOTLOGIN(fd) == FALSE ){ // lssproto_CreateNewChar_send( fd, FAILED, "Not NOTLOGIN State\n" ); lssproto_CreateNewChar_send( fd, FAILED, "登录状态异常!\n" ); return; } if( strlen( charname ) == 0 ){ // lssproto_CreateNewChar_send(fd,FAILED, "0 length name\n"); lssproto_CreateNewChar_send(fd,FAILED, "人物名字不能为空!\n"); return; }else if( strlen(charname) >= 32 ){ // lssproto_CreateNewChar_send(fd,FAILED, "Too long charname\n"); lssproto_CreateNewChar_send(fd,FAILED, "人物名字过长!\n"); return; // Nuke start 0711: Avoid naming as WAEI }else if (strstr(charname,"华义") // WON ADD || strstr(charname,"gm") || strstr(charname,"GM") || strstr(charname,"Gm") || strstr(charname,"gM") || strstr(charname,"gm") || strstr(charname,"GM") || strstr(charname,"Gm") || strstr(charname,"gM") #ifdef _UNREG_NEMA || (strstr(charname,getUnregname(0)) && strlen(getUnregname(0))>0) || (strstr(charname,getUnregname(1)) && strlen(getUnregname(1))>0) || (strstr(charname,getUnregname(2)) && strlen(getUnregname(2))>0) || (strstr(charname,getUnregname(3)) && strlen(getUnregname(3))>0) || (strstr(charname,getUnregname(4)) && strlen(getUnregname(4))>0) #endif || strstr(charname,"神秘人物") || strstr(charname,"|") || strstr(charname,"'") || strstr(charname,"=") || strstr(charname,";") // WON END ) { // lssproto_CreateNewChar_send(fd,FAILED, "Invalid charname\n"); lssproto_CreateNewChar_send(fd,FAILED, "非法人物名字!\n"); return; /* unsigned int ip=CONNECT_get_userip(fd); int a, b, c, d, ck; a=(ip % 0x100); ip=ip / 0x100; b=(ip % 0x100); ip=ip / 0x100; c=(ip % 0x100); ip=ip / 0x100; d=(ip % 0x100); ck= ( ( (a== 10) && (b==0) && (c==0) ) || ( (a==211) && (b==76) && (c==176) && (d==21) ) || // 台北wayi ( (a==210) && (b==64) && (c==97) && ((d>=21)&&(d<=25)) ) || ( (a==61) && (b==222) && (c==142) && (d==66)) || ( (a==172) && (b==16) && (c==172) && (d==29) ) ); print(" name_WAEI_IP:%d.%d.%d.%d ck:%d ",a,b,c,d,ck ); if( !ck ) { lssproto_CreateNewChar_send(fd,FAILED, "Invalid charname\n"); return; } */ } #ifdef _MO_ILLEGAL_NAME int j; for(j=0;j<32;j++){ if(strstr(charname,getIllegalName(j))&& strlen(getIllegalName(j))>0){ // lssproto_CreateNewChar_send(fd,FAILED, "Invalid charname\n"); lssproto_CreateNewChar_send(fd,FAILED, "非法人物名字!\n"); return; } } #endif { // Nuke start 0801,0916: Avoid strange name int i,ach; for (i=0,ach=0;i=0x7f)&& ((unsigned char)charname[i]<=0xa0)) { ach=1; break; } // Force no 0x7f~0xa0 if ((unsigned char)charname[i]<=0x20) { ach=1; break; } // Force greater than 0x20 if (ach) { if ((((unsigned char)charname[i]>=0x40)&&((unsigned char)charname[i]<=0x7e))|| (((unsigned char)charname[i]>=0xa1)&&((unsigned char)charname[i]<=0xfe))) ach=0; } else { if (((unsigned char)charname[i]>=0xa1)&&((unsigned char)charname[i]<=0xfe)) ach=1; } } if (ach) { // lssproto_CreateNewChar_send(fd,FAILED, "Error in Chinese\n"); lssproto_CreateNewChar_send(fd,FAILED, "错误中文名称!\n"); return; } // Nuke end } // Nuke end CONNECT_getCdkey( fd, cdkey, sizeof( cdkey )); CHAR_createNewChar( fd, dataplacenum, charname ,imgno, faceimgno, vital, str, tgh, dex, earth, water, fire, wind, hometown , cdkey ); } void lssproto_CharLogin_recv( int fd,char* charname ) { char cdkey[CDKEYLEN], passwd[PASSWDLEN]; if( CONNECT_isCLI( fd ) == FALSE )return; print( "\n尝试登陆: 人物名称=%s\n", charname); if( charname[0] == '\0' ){ lssproto_CharLogin_send( fd, FAILED, "Can't access char have no name\n" ); return; } if( CONNECT_isNOTLOGIN(fd) == FALSE ){ lssproto_CharLogin_send( fd, FAILED, "Already Logged in\n" ); return; } CONNECT_setCharname( fd, charname ); CONNECT_getCdkey( fd, cdkey, sizeof( cdkey )); CONNECT_getPasswd( fd, passwd, sizeof(passwd)); saacproto_ACCharLoad_send( acfd, cdkey,passwd, charname,1,"", CONNECT_getFdid(fd) ); CONNECT_setState( fd, WHILELOGIN ); } #ifdef _NEW_ITEM_ extern int CheckCharMaxItem(int charindex); #endif #ifdef _ITEM_CHECKDROPATLOGOUT BOOL CheckDropatLogout(int charaindex ) { int i; for( i=0 ; i< CheckCharMaxItem(charaindex) ; i++ ){ int itemindex; itemindex = CHAR_getItemIndex(charaindex,i); if( ITEM_CHECKINDEX(itemindex) == FALSE )continue; if( ITEM_getInt(itemindex,ITEM_DROPATLOGOUT ) == TRUE ) { return TRUE; } } return FALSE; } #endif void lssproto_CharLogout_recv( int fd, int flg) { char cdkey[CDKEYLEN] , charname[CHARNAMELEN]; int charaindex=CONNECT_getCharaindex(fd); if( CONNECT_isCLI( fd ) == FALSE )return; if( CONNECT_isLOGIN(fd) == FALSE ){ lssproto_CharLogout_send( fd, FAILED, "Not Logged in\n" ); return; } #ifdef _OFFLINE_SYSTEM if(CHAR_getWorkInt( charaindex, CHAR_WORK_OFFLINE ) > 0){ CHAR_setWorkInt( charaindex, CHAR_WORKFD, -1); }else #endif { int fl,x,y; // CoolFish: 2001/10/18 if (!CHAR_CHECKINDEX(charaindex)) return; if( CHAR_getInt( charaindex, CHAR_LASTTALKELDER) >= 0 ) { if(CHAR_getElderPosition( CHAR_getInt( charaindex, CHAR_LASTTALKELDER), &fl, &x, &y )==FALSE){ CHAR_talkToCli( charaindex, -1, "您当前的记录点错误,请重新记录!", CHAR_COLORYELLOW); return; } #ifdef _NO_TEAMWARP_SKYLAND if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE ) != CHAR_PARTY_NONE && fl == 30691){ CHAR_talkToCli( charaindex, -1, "团队中无法回天空之岛!", CHAR_COLORYELLOW); return; } #endif #ifdef _CHAR_NEWLOGOUT if( flg == 1 ){//回纪录点 if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){ CHAR_talkToCli( charaindex, -1, "战斗中无法回纪录点!", CHAR_COLORYELLOW); return; } #ifdef _ITEM_CHECKWARES if( CHAR_CheckInItemForWares( charaindex, 0) == FALSE ){ CHAR_talkToCli( charaindex, -1, "携带货物无法使用。", CHAR_COLORYELLOW); return; } #endif if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE ) == CHAR_PARTY_CLIENT ){ CHAR_talkToCli( charaindex, -1, "团队中无法回纪录点!", CHAR_COLORYELLOW); return; } #ifdef _ITEM_CHECKDROPATLOGOUT if( CheckDropatLogout( charaindex ) ){ CHAR_talkToCli( charaindex, -1, "携带的物品使你无法回纪录点!", CHAR_COLORYELLOW); return; } #endif #ifdef _AUTO_PK if(CHAR_getInt(charaindex,CHAR_FLOOR)==20000 && CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE && CHAR_getWorkInt(charaindex,CHAR_WORK_AUTOPK)!=-1 ){ char buf[64]; int i,num=0,winindex=-1; int playernum = CHAR_getPlayerMaxNum(); sprintf(buf, "胆小鬼 %s 退出当前比赛!",CHAR_getChar(charaindex,CHAR_NAME)); AutoPk_PKSystemTalk( buf, buf ); if(AutoPk_PKTimeGet()<=0){ for(i=0;i1)||(i_diff_y>1) ){ // Robin 0518 //CHAR_talkToCli(fd_charaindex, -1, "因走路座标错误而断线。", CHAR_COLORYELLOW); //return; x = ix; y = iy; } } if(!(MAP_walkAble(fd_charaindex,CHAR_getInt(fd_charaindex, CHAR_FLOOR),x,y))){ // Robin 03/14 x = ix; y = iy; }else{ } CHAR_walk_init( fd, x, y, direction, TRUE); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_W2_recv( int fd,int x,int y,char* direction ) { //ttom +3 int fd_charaindex, ix, iy, i_fl; //Char *chwk;// CoolFish: Rem 2001/4/18 fd_charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX( fd_charaindex ) )return; if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE ) != BATTLE_CHARMODE_NONE )return; if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE)return; if(CHAR_getWorkInt(fd_charaindex, CHAR_WORK_X) == x && CHAR_getWorkInt(fd_charaindex, CHAR_WORK_Y) == x ){ if(strlen(direction) == 1){ if(direction[0] >= 'a' && direction[0] <= 'h'){ if(CHAR_getWorkInt(fd_charaindex, CHAR_WORK_DIR) != direction[0] - 'a'){ CHAR_setWorkInt(fd_charaindex, CHAR_WORK_DIR, direction[0] - 'a'); CHAR_setWorkInt(fd_charaindex, CHAR_WORK_W, 0); }else if(CHAR_getWorkInt(fd_charaindex, CHAR_WORK_W) > 30){ if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT ){ if( CONNECT_getBDTime( fd) < time( NULL) ){ lssproto_EN_recv(fd,CHAR_getInt(fd_charaindex,CHAR_X),CHAR_getInt(fd_charaindex,CHAR_Y)); CONNECT_setBDTime( fd, (int)time( NULL) + 3); } } return; }else{ CHAR_setWorkInt(fd_charaindex, CHAR_WORK_W, CHAR_getWorkInt(fd_charaindex, CHAR_WORK_W) + 1); } } }else{ CHAR_setWorkInt(fd_charaindex, CHAR_WORK_W, 0); } }else{ CHAR_setWorkInt(fd_charaindex, CHAR_WORK_W, 0); } CHAR_setWorkInt(fd_charaindex, CHAR_WORK_X, x); CHAR_setWorkInt(fd_charaindex, CHAR_WORK_Y, x); #ifdef _FIX_STW_SPEED_ENEMY if(strstr(direction, "gcgc") != NULL ){ if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT ){ if( CONNECT_getBDTime( fd) < time( NULL) ){ lssproto_EN_recv(fd,CHAR_getInt(fd_charaindex,CHAR_X),CHAR_getInt(fd_charaindex,CHAR_Y)); CONNECT_setBDTime( fd, (int)time( NULL) + 3); } } return; } #else #ifdef _NO_STW_ENEMY if(strstr(direction, "gcgc") != NULL ){ switch(getNoSTWNenemy()){ case 0: break; case 1: return; case 2: if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT ){ if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE ) != BATTLE_CHARMODE_NONE ){ return; } if(getNoSTWNenemyPoint()>0){ if(CHAR_getInt( fd_charaindex, CHAR_GOLD ) < getNoSTWNenemyPoint()){ char token[256]; sprintf(token, "你身上石币不足%d,无法原地遇敌", getNoSTWNenemyPoint()); CHAR_talkToCli(fd_charaindex, -1, token, CHAR_COLORYELLOW); return; } } if(BATTLE_CreateVsEnemy(fd_charaindex, 0, -1) != BATTLE_ERR_CHARAINDEX){ if(getNoSTWNenemyPoint()>0){ CHAR_setInt( fd_charaindex, CHAR_GOLD, CHAR_getInt( fd_charaindex, CHAR_GOLD ) - getNoSTWNenemyPoint()); CHAR_send_P_StatusString( fd_charaindex , CHAR_P_STRING_GOLD); } } } return; } } #endif #endif ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); i_fl=CHAR_getInt(fd_charaindex, CHAR_FLOOR); //ttom avoid the warp at will 11/6 { int i_diff_x,i_diff_y; //ix=CHAR_getInt(fd_charaindex, CHAR_X); //iy=CHAR_getInt(fd_charaindex, CHAR_Y); //i_fl=CHAR_getInt(fd_charaindex, CHAR_FLOOR); i_diff_x=abs(ix-x); i_diff_y=abs(iy-y); if( (i_diff_x>1)||(i_diff_y>1) ){//2 //print("\nWarp Error!!!!!!!!!"); //print("\nthe origion->fd=%d,x=%d,y=%d",fd,ix,iy); //print("\nthe modify-->fd=%d,X=%d,Y=%d,dir=%s",fd,x,y,direction); x=ix; y=iy; // Robin 03/14 //return; } //if((i_fl==117)&&(ix==225)&&(iy==13)) goto END_w; }//ttom if(!(MAP_walkAble(fd_charaindex,CHAR_getInt(fd_charaindex, CHAR_FLOOR),x,y))){ // print("\n the map is invaild(f:%d,x:%d,y:%d)",CHAR_getInt(fd_charaindex, CHAR_FLOOR),x,y); x = ix; y = iy; } CHAR_walk_init( fd, x, y, direction, FALSE); } void lssproto_SKD_recv( int fd,int dir, int index) { CHECKFDANDTIME; } void lssproto_ID_recv( int fd,int x,int y,int haveitemindex,int toindex ) { if( CONNECT_checkfd(fd) == FALSE )return; int to_charaindex; int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); // CoolFish: Prevent Trade Cheat 2001/4/18 if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; #ifdef _STREET_VENDOR if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKSTREETVENDOR) != -1) return; #endif if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; //ttom avoid the warp at will 12/5 { int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); x=ix; y=iy; } CHAR_setMyPosition( fd_charaindex, x,y,TRUE); to_charaindex = Callfromcli_Util_getTargetCharaindex( fd, toindex); CHAR_ItemUse( fd_charaindex, to_charaindex, haveitemindex ); } /*------------------------------------------------------------ * 惫寞毛蓟少 ------------------------------------------------------------*/ void lssproto_ST_recv( int fd,int titleindex ) { CHECKFDANDTIME; CHAR_selectTitle( CONNECT_getCharaindex( fd) , titleindex ); } /*------------------------------------------------------------ * 惫寞毛绰轮允月 ------------------------------------------------------------*/ void lssproto_DT_recv( int fd,int titleindex ) { CHECKFDANDTIME; CHAR_deleteTitle( CONNECT_getCharaindex(fd) , titleindex ); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_FT_recv( int fd,char* data ) { CHECKFDANDTIME; // Robin 04/23 debug if( strlen(data) > 12 ) return; if( checkStringErr(data) ) return; CHAR_inputOwnTitle( CONNECT_getCharaindex(fd) , data); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_PI_recv( int fd,int x, int y, int dir ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); {//ttom avoid warp at will int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ //print("\n--Error!!!!"); //print("\norigion x=%d,y=%d",ix,iy); //print("\nmodify X=%d,Y=%d",x,y); x=ix; y=iy; } }//ttom end CHAR_setMyPosition( fd_charaindex, x,y,TRUE); if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; CHAR_PickUpItem( fd_charaindex, dir); } void lssproto_DI_recv( int fd,int x, int y, int itemindex ) { int charaindex; CHECKFDANDTIME; charaindex = CONNECT_getCharaindex( fd ); if (CHAR_getWorkInt(charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; #ifdef _STREET_VENDOR if (CHAR_getWorkInt(charaindex, CHAR_WORKSTREETVENDOR) != -1) return; #endif #ifdef _ITEM_PET_LOCKED if(CHAR_getInt(charaindex,CHAR_LOCKED)==1){ char message[256]; char buf[256]; sprintf( message, "为了确保你的物品安全,请输入你的安全密码进行解锁!\n"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT, WINDOW_BUTTONTYPE_OKCANCEL, CHAR_WINDOWTYPE_ITEM_PET_LOCKED, -1, makeEscapeString( message, buf, sizeof(buf))); return; } #endif if( CHAR_getWorkInt(charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; CHAR_setMyPosition( charaindex , CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y), TRUE); CHAR_DropItem( charaindex, itemindex ); } void lssproto_DP_recv( int fd,int x, int y, int petindex ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); #ifdef _ITEM_PET_LOCKED if(CHAR_getInt(fd_charaindex,CHAR_LOCKED)==1){ char message[256]; char buf[256]; sprintf( message, "为了确保你的物品安全,请输入你的安全密码进行解锁!\n"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT, WINDOW_BUTTONTYPE_OKCANCEL, CHAR_WINDOWTYPE_ITEM_PET_LOCKED, -1, makeEscapeString( message, buf, sizeof(buf))); return; } #endif if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; { int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); x=ix; y=iy; } CHAR_setMyPosition( fd_charaindex , x,y,TRUE); if( CHAR_getWorkInt( fd_charaindex , CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; PET_dropPet( fd_charaindex, petindex); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_DG_recv( int fd,int x, int y, int amount ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); //ttom avoid the warp at will 12/15 { int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); x=ix; y=iy; } CHAR_setMyPosition( fd_charaindex, x,y,TRUE); if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; // CoolFish: Prevent Trade Cheat 2001/4/18 if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; CHAR_DropMoney( fd_charaindex, amount ); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_MI_recv( int fd,int fromid,int toid ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; #ifdef _STREET_VENDOR if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKSTREETVENDOR) != -1) return; #endif if(fromid != toid){ int fromitemindex = CHAR_getItemIndex( fd_charaindex, fromid); int toitemindex = CHAR_getItemIndex( fd_charaindex, toid); if( ITEM_CHECKINDEX(fromitemindex) && ITEM_CHECKINDEX(toitemindex)){ CHAR_setWorkInt(fd_charaindex, CHAR_WORKITEMINDEX, fromitemindex); CHAR_setWorkInt(fd_charaindex, CHAR_WORKTOITEMINDEX, toitemindex); #ifdef _ITEM_COLOER if(strcmp(ITEM_getChar( fromid, ITEM_USEFUNC), "ITEM_COLOER")==0){ char *itemarg = ITEM_getChar( fromitemindex, ITEM_ARGUMENT); ITEM_setInt( toitemindex, ITEM_COLOER, atoi(itemarg) ); ITEM_setInt( fromitemindex, ITEM_COLOER, atoi(itemarg) ); CHAR_sendItemDataOne( fd_charaindex, toid); CHAR_DelItem( fd_charaindex, fromid); return ; } #endif #ifdef _ITEM_UPLEVEL if(strcmp(ITEM_getChar( fromitemindex, ITEM_USEFUNC), "ITEM_UPLEVEL")==0){ char message[256]; char buf[256]; int armtype = ITEM_getInt( toitemindex, ITEM_TYPE ); if( armtype == ITEM_FIST || armtype == ITEM_AXE || armtype == ITEM_CLUB || armtype == ITEM_SPEAR || armtype == ITEM_BOW || armtype == ITEM_BOOMERANG || armtype == ITEM_BOUNDTHROW || armtype == ITEM_BREAKTHROW || armtype == ITEM_HELM || armtype == ITEM_ARMOUR ) { sprintf( message, "是否对该物品进行升级?请阅读以下细则:\n\n" "1、升级物品必需是装备,否则浪费升级石头\n" "2、升级物品成功等级+1,失败则等级-1\n" //"3、升级物品一共可让装备升级至+10\n" "3、装备等级越高,升级成功机率则越低\n" "4、机率过低,是否考虑更换高级的升级石呢\n"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_YESNO, CHAR_WINDOWTYPE_ITEM_UPLEVEL, -1, makeEscapeString( message, buf, sizeof(buf))); return; } } #endif #ifdef _ITEM_OVER_LAP if(ItemOverlapFunction( fd_charaindex, fromitemindex, toitemindex ) == 0){ return; } #endif } } if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; CHAR_moveEquipItem( fd_charaindex, fromid, toid ); } #ifdef _PET_ITEM void lssproto_PETITEM_recv( int fd,int x,int y,int petindex,int fromindex,int toindex ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); #ifdef _ITEM_PET_LOCKED if(CHAR_getInt(fd_charaindex,CHAR_LOCKED)==1){ char message[256]; char buf[256]; sprintf( message, "为了确保你的物品安全,请输入你的安全密码进行解锁!\n"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT, WINDOW_BUTTONTYPE_OKCANCEL, CHAR_WINDOWTYPE_ITEM_PET_LOCKED, -1, makeEscapeString( message, buf, sizeof(buf))); return; } #endif // CoolFish: Prevent Trade Cheat 2001/4/18 if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; /* 爵 反轮仁 仿弘匹仇木卞娄匀井井月第 岭丐曰 */ if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; CHAR_movePetItem( fd_charaindex, petindex, fromindex, toindex ); } #endif /*------------------------------------------------------------ * 旦平伙失永皿 ------------------------------------------------------------*/ void lssproto_SKUP_recv( int fd,int skillid ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex(fd); /* 里飘面は近く ∈ラグでこれに苞っかかる材墙拉あり∷*/ if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; CHAR_SkillUp(fd_charaindex,skillid); } /*------------------------------------------------------------ * コネクション陵缄にメッセ〖ジを流慨 ------------------------------------------------------------*/ void lssproto_MSG_recv( int fd,int index,char* message, int color ) { int fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd); ADDRESSBOOK_sendMessage( fd_charaindex, index,message, color ); } /*------------------------------------------------------------ * アドレスブックの柒推をダウンロ〖ドする妥滇が丸た ------------------------------------------------------------*/ void lssproto_AB_recv( int fd ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); ADDRESSBOOK_sendAddressbookTable( fd_charaindex ); } /*------------------------------------------------------------ * アドレスブックの灌誊を猴近する ------------------------------------------------------------*/ void lssproto_DAB_recv( int fd , int index) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); ADDRESSBOOK_deleteEntry( fd_charaindex ,index); } void lssproto_AAB_recv( int fd , int x, int y) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); { int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ x=ix; y=iy; } } CHAR_setMyPosition( fd_charaindex , x,y,TRUE); ADDRESSBOOK_addEntry( fd_charaindex ); } void lssproto_L_recv( int fd, int dir ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); CHAR_Look( fd_charaindex ,dir ); } /*------------------------------------------------------------ * チャット脱メッセ〖ジの流慨 ------------------------------------------------------------*/ void lssproto_TK_recv( int fd,int x, int y,char* message,int color, int area ) { int fd_charaindex,ix,iy;//ttom+2 int fmindex, channel; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); fmindex = CHAR_getInt( fd_charaindex, CHAR_FMINDEX ); channel = CHAR_getWorkInt( fd_charaindex, CHAR_WORKFMCHANNEL ); {// Robin 0629 silent int silentSec, talkCount; silentSec = CHAR_getInt(fd_charaindex,CHAR_SILENT); if( silentSec > 0 ) { int loginTime; char buf[256]; int leftSec; loginTime = CHAR_getWorkInt(fd_charaindex, CHAR_WORKLOGINTIME ); // 防止时间修正回朔後 异常禁言 Robin 20040817 if( (int)NowTime.tv_sec < loginTime) { CHAR_setInt(fd_charaindex, CHAR_SILENT, 0 ); return; } if( ((int)NowTime.tv_sec -loginTime) > silentSec ) { CHAR_setInt(fd_charaindex, CHAR_SILENT, 0 ); return; } silentSec += 10; //多禁10秒 leftSec = silentSec - ((int)NowTime.tv_sec - loginTime); sprintf(buf, "禁言中!!还有%d秒,再讲多禁10秒钟。", leftSec ); CHAR_talkToCli(fd_charaindex, -1, buf, color); CHAR_setInt(fd_charaindex, CHAR_SILENT, silentSec ); return; } talkCount = CHAR_getWorkInt(fd_charaindex, CHAR_WORKTALKCOUNT ); talkCount ++; CHAR_setWorkInt( fd_charaindex, CHAR_WORKTALKCOUNT, talkCount); if( talkCount > 8 ) { int lastTalkTime = CHAR_getWorkInt(fd_charaindex, CHAR_WORKTALKTIME ); if( (int)NowTime.tv_sec - lastTalkTime < 10 ) { CHAR_setInt( fd_charaindex,CHAR_SILENT, 60 ); CHAR_setWorkInt( fd_charaindex, CHAR_WORKLOGINTIME, (int)NowTime.tv_sec ); CHAR_talkToCli( fd_charaindex, -1, "你太多话了唷,请你的嘴巴先休息个一分钟吧!", color); CHAR_setWorkInt(fd_charaindex, CHAR_WORKTALKCOUNT, 0 ); return; }else { CHAR_setWorkInt( fd_charaindex, CHAR_WORKTALKTIME, (int)NowTime.tv_sec ); CHAR_setWorkInt(fd_charaindex, CHAR_WORKTALKCOUNT, 0 ); } } } ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); x=ix; y=iy; CHAR_setMyPosition( fd_charaindex, x,y,TRUE); if( CHAR_getInt(fd_charaindex, CHAR_LV) < 5 && message[strlen(message)-1] != ']'){ CHAR_talkToCli(fd_charaindex, -1, "您的等级小于5级,目前只能说hi", CHAR_COLORYELLOW); CHAR_Talk( fd,fd_charaindex, "P|hi", color, area ); }else{ CHAR_Talk( fd,fd_charaindex, message, color, area ); } //} } void lssproto_M_recv( int fd, int fl, int x1, int y1 , int x2, int y2 ) { char* mapdata; RECT seek={x1,y1,x2-x1,y2-y1},ret; int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); #ifdef _MASK_ENCOUNTER if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYMODE )!= CHAR_PARTY_CLIENT ){ if( getStayEncount( fd) ) return; }else{ int oyaindex = CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYINDEX1); if( getStayEncount( getfdFromCharaIndex(oyaindex)) ) return; } #endif #ifdef _MO_MAP_AUTO_UPDATE mapdata = MAP_getdataFromRECT(fl,&seek,&ret); if( mapdata != NULL ){ lssproto_M_send( fd, fl, ret.x, ret.y, ret.x+ret.width, ret.y+ret.height, mapdata ); } #endif } /*------------------------------------------------------------ * キャラデ〖タ 妥滇。 ------------------------------------------------------------*/ void lssproto_C_recv( int fd, int index ) { if( CONNECT_checkfd(fd) == FALSE )return; int fd_charaindex; fd_charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX(fd_charaindex)){ return; } if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; #ifdef _STREET_VENDOR if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKSTREETVENDOR) != -1) return; #endif CHAR_sendCSpecifiedObjindex( fd, index); } #ifdef _FAMILYBADGE_ extern int getFamilyBadge(int index); #endif void lssproto_S_recv( int fd, char* category ) { char* string; int fd_charaindex; fd_charaindex = CONNECT_getCharaindex( fd ); string = CHAR_makeStatusString( fd_charaindex, category ); if( string != NULL ) lssproto_S_send( fd , string ); } void lssproto_EV_recv( int fd,int event,int seqno,int x,int y, int dir ) { int rc; int fx,fy; int fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); { int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( ( ix != x ) || ( iy != y ) ){ goto CK1; } goto OK; } CK1: { OBJECT object; int ix,iy,ifloor,i,j; int warp_point_x[9]; int warp_point_y[9]; int warp_point=0; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); ifloor=CHAR_getInt(fd_charaindex,CHAR_FLOOR); for(i=iy-1;i<=iy+1;i++){ for(j=ix-1;j<=ix+1;j++){ for( object = MAP_getTopObj(ifloor,j,i) ; object ;object = NEXT_OBJECT(object ) ){ int o = GET_OBJINDEX(object); if( OBJECT_getType(o) == OBJTYPE_CHARA ){ int etype; int charaindex=OBJECT_getIndex(o); if( !CHAR_CHECKINDEX(charaindex) ) continue; etype = CHAR_getWorkInt( charaindex, CHAR_WORKEVENTTYPE); if( etype != CHAR_EVENT_NONE ) { if(etype==CHAR_EVENT_WARP){ warp_point_x[warp_point]=j; warp_point_y[warp_point]=i; warp_point++; } } } #ifdef _MAP_WARPPOINT else if( OBJECT_getType(o) == OBJTYPE_WARPPOINT ){ int etype = OBJECT_getchartype( o); if( etype != CHAR_EVENT_NONE ) { warp_point_x[warp_point]=j; warp_point_y[warp_point]=i; warp_point++; break; } } #endif } } } for(i=0;i 7) { fx = CHAR_getInt(fd_charaindex, CHAR_X); fy = CHAR_getInt(fd_charaindex, CHAR_Y); }else { CHAR_getCoordinationDir( dir, CHAR_getInt(fd_charaindex, CHAR_X), CHAR_getInt(fd_charaindex, CHAR_Y),1,&fx,&fy); } rc = EVENT_main(fd_charaindex, event,fx,fy); lssproto_EV_send( fd, seqno, rc); #ifdef _PLAYER_EFFECT if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT ) > 0 ){ char msg[256]; sprintf(msg,"2|%d",CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT )); lssproto_CHAREFFECT_send(fd, msg); } #endif #ifdef FAMILY_MANOR_ if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT_MANOR ) > 0 ){ char msg[256]; sprintf(msg,"3|%d",CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT_MANOR )); lssproto_CHAREFFECT_send(fd, msg); } #endif #ifdef _NEW_UPDATETITLE if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getInt( fd_charaindex, CHAR_TITLE_DEFAULT ) > 0 ){ char msg[256]; sprintf(msg,"4|%d",CHAR_getInt( fd_charaindex, CHAR_TITLE_DEFAULT )); lssproto_CHAREFFECT_send(fd, msg); } #endif #ifdef _TRUMP_EQUIPMENT if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getInt( fd_charaindex, CHAR_TRUMP_EFFECT ) > 0 ){ char msg[256]; sprintf(msg,"5|%d",CHAR_getInt( fd_charaindex, CHAR_TRUMP_EFFECT )); lssproto_CHAREFFECT_send(fd, msg); } #endif #ifdef _FAMILYBADGE_ if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && getFamilyBadge( fd_charaindex) ){ char msg[256]; sprintf(msg,"1|%d",getFamilyBadge( fd_charaindex)); lssproto_CHAREFFECT_send(fd, msg); } #endif } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_EN_recv( int fd , int x,int y ) { int ret = FALSE, err = 0; int fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd); #ifdef _ALLBLUES_LUA_1_7 // if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) { // if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){ // if(CharVsEnemyFunction( fd_charaindex ) == TRUE)return; // } // } #endif if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT){ CHAR_setMyPosition( fd_charaindex, x,y,TRUE); CHAR_setWorkChar( fd_charaindex, CHAR_WORKWALKARRAY,""); err = BATTLE_CreateVsEnemy( fd_charaindex,0, -1); if( err != 0 ){ ret = FALSE; }else{ ret = TRUE; } } } /*------------------------------------------------------------ * プレイヤ〖票晃でエンカウント∈疯飘∷券栏 ------------------------------------------------------------*/ void lssproto_DU_recv( int fd , int x,int y ) { OBJECT object; int fd_charaindex; int ret = FALSE, charaindex = -1, enemyindex; int frontx,fronty; int cnt = 0; BOOL found = FALSE; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); {//ttom avoid warp at will int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ //print("\n--Error!!!!"); //print("\norigion x=%d,y=%d",ix,iy); //print("\nmodify X=%d,Y=%d",x,y); x=ix; y=iy; } } /* 灰の箕は痰浑する */ if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_CLIENT) { int i; // 极尸のインデックス charaindex = fd_charaindex; CHAR_setMyPosition( charaindex, x,y,TRUE); /* WALKARRAYをクリアする */ CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY,""); /* 介袋步する */ for( i = 0; i < CONNECT_WINDOWBUFSIZE ; i ++ ) { CONNECT_setDuelcharaindex( fd, i, -1 ); } /* 誊の涟の郝筛を评る */ CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , CHAR_getInt( charaindex , CHAR_X ), CHAR_getInt( charaindex , CHAR_Y ) , 1 , &frontx , &fronty ); /*极尸の誊の涟のキャラを艰评する */ for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR), frontx,fronty) ; object ; object = NEXT_OBJECT(object ) ) { int toindex; int objindex = GET_OBJINDEX(object); /* キャラクタ〖じゃない */ if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; toindex = OBJECT_getIndex( objindex); /* プレイヤ〖じゃない */ if( CHAR_getInt( toindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER #ifdef _PLAYER_NPC && CHAR_getInt( toindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYERNPC #endif ) continue; found = TRUE; if( CHAR_getWorkInt( toindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE )continue; #ifdef _ALLBLUES_LUA_1_5 int flg = FreeVsPlayer(charaindex, toindex); if( flg == 1){ lssproto_EN_send( fd, FALSE, 0 ); return; }else if( flg == 2){ return; }else #endif if(!CHAR_getFlg( toindex, CHAR_ISDUEL)){ int floor = CHAR_getInt( charaindex, CHAR_FLOOR ); #ifdef _AUTO_PK if(floor == 20000){ if(AutoPk_PKTimeGet()>0){ CHAR_talkToCli( charaindex, -1, "请等比赛开始再进行PK!", CHAR_COLORYELLOW ); continue; }else{ if(!CHAR_getFlg( toindex, CHAR_ISDUEL)){ if(CHAR_getWorkInt( charaindex, CHAR_WORK_AUTOPK ) == -1)continue; if(CHAR_getWorkInt( toindex, CHAR_WORK_AUTOPK ) == -1)continue; } } }else #endif #ifdef _BATTLE_FLOOR { if(strcmp(getBattleFloorCF(),"是")!=0){ int i; for(i=0;i<32;i++){ if(floor==getBattleFloor(i)){ break; } } if(i==32)continue; } } #else continue; #endif } #ifdef _BATTLE_PK_TYPE else{ int oyaindex1; int oyaindex2; int workindex; int type = CHAR_getWorkInt(charaindex, CHAR_WORK_BATTLEPKTYPE); switch(type){ case 0: //正常PK break; case 1: //混合单P if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE)!=CHAR_PARTY_NONE || CHAR_getWorkInt(toindex,CHAR_WORKPARTYMODE)!=CHAR_PARTY_NONE ){ CHAR_talkToCli( charaindex, toindex, "混合单P的来", CHAR_COLORYELLOW ); continue; } break; case 2: //混合团P if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getWorkInt(toindex,CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE ){ CHAR_talkToCli( charaindex, toindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } oyaindex1 = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1); oyaindex2 = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( oyaindex1 ) && CHAR_CHECKINDEX( oyaindex2 )){ int i; for( i = 0; i < getPartyNum(oyaindex1); i ++ ){ workindex = CHAR_getWorkInt( oyaindex1, CHAR_WORKPARTYINDEX1 + i); if( CHAR_CHECKINDEX( workindex) ){ if( CHAR_getWorkInt(workindex, CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE ){ CHAR_talkToCli( charaindex, workindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } } workindex = CHAR_getWorkInt( oyaindex2, CHAR_WORKPARTYINDEX1 + i); if( CHAR_CHECKINDEX( workindex) ){ if( CHAR_getWorkInt(workindex, CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE ){ CHAR_talkToCli( charaindex, workindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } } } } break; #ifdef _CHAR_PROFESSION case 3: //有职业单P if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE)!=CHAR_PARTY_NONE || CHAR_getWorkInt(toindex,CHAR_WORKPARTYMODE)!=CHAR_PARTY_NONE || CHAR_getInt(charaindex, PROFESSION_CLASS) == 0){ CHAR_talkToCli( charaindex, toindex, "有职业单P的来", CHAR_COLORYELLOW ); continue; } break; case 4: //有职业团P if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getWorkInt(toindex,CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getInt(charaindex, PROFESSION_CLASS) == 0){ CHAR_talkToCli( charaindex, toindex, "有职业团P的来", CHAR_COLORYELLOW ); continue; } oyaindex1 = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1); oyaindex2 = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( oyaindex1 ) && CHAR_CHECKINDEX( oyaindex2 )){ int i; for( i = 0; i < getPartyNum(oyaindex1); i ++ ){ workindex = CHAR_getWorkInt( oyaindex1, CHAR_WORKPARTYINDEX1 + i); if( CHAR_CHECKINDEX( workindex) ){ if( CHAR_getWorkInt(workindex, CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getInt(charaindex, PROFESSION_CLASS) == 0){ CHAR_talkToCli( workindex, workindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } } workindex = CHAR_getWorkInt( oyaindex2, CHAR_WORKPARTYINDEX1 + i); if( CHAR_CHECKINDEX( workindex) ){ if( CHAR_getWorkInt(workindex, CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getInt(workindex, PROFESSION_CLASS) == 0){ CHAR_talkToCli( charaindex, workindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } } } } break; case 5: //无职业单P if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE)!=CHAR_PARTY_NONE || CHAR_getWorkInt(toindex,CHAR_WORKPARTYMODE)!=CHAR_PARTY_NONE || CHAR_getInt(charaindex, PROFESSION_CLASS) > 0){ CHAR_talkToCli( charaindex, toindex, "无职业单P的来", CHAR_COLORYELLOW ); continue; } break; case 6: //无职业团P if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getWorkInt(toindex,CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getInt(charaindex, PROFESSION_CLASS) > 0){ CHAR_talkToCli( charaindex, toindex, "无职业团P的来", CHAR_COLORYELLOW ); continue; } oyaindex1 = CHAR_getWorkInt( charaindex, CHAR_WORKPARTYINDEX1); oyaindex2 = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( oyaindex1 ) && CHAR_CHECKINDEX( oyaindex2 )){ int i; for( i = 0; i < getPartyNum(oyaindex1); i ++ ){ workindex = CHAR_getWorkInt( oyaindex1, CHAR_WORKPARTYINDEX1 + i); if( CHAR_CHECKINDEX( workindex) ){ if( CHAR_getWorkInt(workindex, CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getInt(workindex, PROFESSION_CLASS) > 0){ CHAR_talkToCli( charaindex, workindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } } workindex = CHAR_getWorkInt( oyaindex2, CHAR_WORKPARTYINDEX1 + i); if( CHAR_CHECKINDEX( workindex) ){ if( CHAR_getWorkInt(workindex, CHAR_WORKPARTYMODE)==CHAR_PARTY_NONE || CHAR_getInt(workindex, PROFESSION_CLASS) > 0){ CHAR_talkToCli( charaindex, workindex, "混合团P的来", CHAR_COLORYELLOW ); continue; } } } } break; #endif } } #endif // shan begin { int i; for( i=0; i 1 ) { int strlength; char msgbuf[1024]; char escapebuf[2048]; strcpy( msgbuf, "1\n要和谁战斗?\n"); strlength = strlen( msgbuf); /* ウィンドウのメッセ〖ジ侯喇。 * 里飘面のキャラの办枉 */ for( i = 0; CONNECT_getDuelcharaindex( fd,i) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ) { char *a = CHAR_getChar( CONNECT_getDuelcharaindex( fd,i) , CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s [%s]\n", a, CHAR_getWorkInt( CONNECT_getDuelcharaindex(fd,i), CHAR_WORKPARTYMODE ) != CHAR_PARTY_NONE ? "团体": "单独"); 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_SELECTDUEL, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); ret = TRUE; } } lssproto_DU_recv_Err:; if( ret == FALSE ) { /* 瑛绊霜耨 */ lssproto_EN_send( fd, FALSE, 0 ); if( cnt > 0 ) return; else if( found ) CHAR_talkToCli( charaindex, -1, "无人可以对战。", CHAR_COLORYELLOW); else CHAR_talkToCli( charaindex, -1, "那里没有任何人。", CHAR_COLORYELLOW); } } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_EO_recv( int fd, int dummy ) { int fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); BattleEncountOut( fd_charaindex ); #ifdef _PLAYER_EFFECT if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT ) > 0 ){ char msg[256]; sprintf(msg,"2|%d",CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT )); #ifdef _FAMILYBADGE_ lssproto_CHAREFFECT_send(getfdFromCharaIndex(fd_charaindex), msg); #endif } #endif #ifdef FAMILY_MANOR_ if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT_MANOR ) > 0 ){ char msg[256]; sprintf(msg,"3|%d",CHAR_getWorkInt( fd_charaindex, CHAR_PLAYER_EFFECT_MANOR )); lssproto_CHAREFFECT_send(getfdFromCharaIndex(fd_charaindex), msg); } #endif #ifdef _TRUMP_EQUIPMENT if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getInt( fd_charaindex, CHAR_TRUMP_EFFECT ) > 0 ){ char msg[256]; sprintf(msg,"5|%d",CHAR_getInt( fd_charaindex, CHAR_TRUMP_EFFECT )); lssproto_CHAREFFECT_send(getfdFromCharaIndex(fd_charaindex), msg); } #endif #ifdef _NEW_UPDATETITLE if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && CHAR_getInt( fd_charaindex, CHAR_TITLE_DEFAULT ) > 0 ){ char msg[256]; sprintf(msg,"4|%d",CHAR_getInt( fd_charaindex, CHAR_TITLE_DEFAULT )); lssproto_CHAREFFECT_send(getfdFromCharaIndex(fd_charaindex), msg); } #endif #ifdef _FAMILYBADGE_ if( CHAR_getInt( fd_charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER && getFamilyBadge( fd_charaindex) ){ char msg[256]; sprintf(msg,"1|%d",getFamilyBadge( fd_charaindex)); lssproto_CHAREFFECT_send(fd, msg); } #endif } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_BU_recv( int fd, int dummy) { int fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); // shan 2001/12/25 //BATTLE_WatchStop( fd_charaindex ); } void lssproto_B_recv( int fd, char *command ) { int fd_charaindex; int battle_index;//ttom++ CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); BattleCommandDispach( fd, command ); // Nuke +1 0827: Battle acceleration battle_index=CHAR_getWorkInt(fd_charaindex,CHAR_WORKBATTLEINDEX); if( BATTLE_CHECKINDEX( battle_index ) == FALSE ){ return; } } void lssproto_FS_recv( int fd,int flg ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); /* 椭瘀反竣卞六内卞公及引引白仿弘凳蕙 */ CHAR_setFlg( fd_charaindex, CHAR_ISPARTY, (flg & CHAR_FS_PARTY )? TRUE:FALSE); // CHAR_setFlg( fd_charaindex, CHAR_ISBATTLE, // (flg & CHAR_FS_BATTLE )? TRUE:FALSE); #ifdef _BATTLE_PK_TYPE if((CHAR_getFlg( fd_charaindex, CHAR_ISDUEL) == FALSE) && (flg & CHAR_FS_DUEL)){ CHAR_setWorkInt(fd_charaindex, CHAR_WORK_BATTLEPKTYPE, 0); char message[256]; char buf[256]; sprintf( message, "请选择你所希望的PK类型\n" "正常PK\n" "混合单P\n" "混合团P\n" #ifdef _CHAR_PROFESSION "有职业单P\n" "有职业团P\n" "无职业单P\n" "无职业团P\n" #endif ); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_OKCANCEL, CHAR_WINDOWTYPE_BATTLEPKTYPE, -1, makeEscapeString( message, buf, sizeof(buf))); } #endif CHAR_setFlg( fd_charaindex, CHAR_ISDUEL, (flg & CHAR_FS_DUEL )? TRUE:FALSE); CHAR_setFlg( fd_charaindex, CHAR_ISPARTYCHAT, (flg & CHAR_FS_PARTYCHAT )? TRUE:FALSE); CHAR_setFlg( fd_charaindex, CHAR_ISTRADECARD, (flg & CHAR_FS_TRADECARD )? TRUE:FALSE); #ifdef _CHANNEL_MODIFY //密语频道开关 CHAR_setFlg(fd_charaindex,CHAR_ISTELL,(flg & CHAR_FS_TELL )? TRUE:FALSE); //家族频道开关 CHAR_setFlg(fd_charaindex,CHAR_ISFM,(flg & CHAR_FS_FM )? TRUE:FALSE); //职业频道开关 CHAR_setFlg(fd_charaindex,CHAR_ISOCC,(flg & CHAR_FS_OCC )? TRUE:FALSE); //聊天室 CHAR_setFlg(fd_charaindex,CHAR_ISCHAT,(flg & CHAR_FS_CHAT )? TRUE:FALSE); //储存对话开关 CHAR_setFlg(fd_charaindex,CHAR_ISSAVE,(flg & CHAR_FS_SAVE )? TRUE:FALSE); #ifdef _THE_WORLD_SEND //世界频道开关 CHAR_setFlg(fd_charaindex,CHAR_ISWORLD,(flg & CHAR_FS_WORLD )? TRUE:FALSE); #endif #endif CHAR_setFlg(fd_charaindex,CHAR_AI_MOD,(flg & CHAR_FS_AI )? TRUE:FALSE); CHAR_setFlg( fd_charaindex, CHAR_ISTRADE,(flg & CHAR_FS_TRADE )? TRUE:FALSE); lssproto_FS_send( fd, flg); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_PR_recv( int fd,int x, int y, int request ) { int result = FALSE; int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX( fd_charaindex ) )return; if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; #if 1 // 禁止组队区域 if( request == 1 ) { int nowFloor; nowFloor = CHAR_getInt( fd_charaindex, CHAR_FLOOR); if( nowFloor == 31706 || nowFloor == 10204 || (10601 <= nowFloor && nowFloor <= 10605 ) || nowFloor == 10919 || nowFloor == 10920 || nowFloor == 20711 || nowFloor == 20712 || nowFloor == 1008 || nowFloor == 1021 || nowFloor == 3008 || nowFloor == 3021 || ( nowFloor <= 8213 && nowFloor >= 8200 ) || ( nowFloor >= 30017 && nowFloor <= 30021 ) #ifdef _TIME_TICKET || check_TimeTicketMap(nowFloor) #endif #ifdef _NPC_MAGICCARD || nowFloor == 17003 || nowFloor == 17005 #endif ){ // print("\n 改封包!禁止组队区域!!:%s ", CHAR_getChar( fd_charaindex, CHAR_CDKEY) ); return; } } #endif {//ttom avoid warp at will int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ //print("\n--Error!!!!"); //print("\norigion x=%d,y=%d",ix,iy); //print("\nmodify X=%d,Y=%d",x,y); x=ix; y=iy; } } CHAR_setMyPosition( fd_charaindex, x,y,TRUE); if( request == 0 ) { /* 轮迩允月 */ result = CHAR_DischargeParty(fd_charaindex, 0); } else if( request == 1 ) { result = CHAR_JoinParty(fd_charaindex); } } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_KS_recv( int fd,int petarray ) { int ret , fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX( fd_charaindex ) )return; if(petarray != -1 && CHAR_getInt( fd_charaindex, CHAR_RIDEPET) == petarray ){ lssproto_KS_send( fd, petarray, FALSE); return; } ret = PET_SelectBattleEntryPet( fd_charaindex, petarray); lssproto_KS_send( fd, petarray, ret); } void lssproto_SPET_recv( int fd, int standbypet ) { int fd_charaindex; int i, s_pet =0, cnt =0; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX( fd_charaindex ) )return; //if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE // && standbypet >= CHAR_getWorkInt( fd_charaindex, CHAR_WORKSTANDBYPET) ) { // print("\n 改封包!??战斗中用SPET增加待机宠!!:%s ", CHAR_getChar( fd_charaindex, CHAR_CDKEY) ); // return; //} //if( CHAR_getInt( fd_charaindex, CHAR_RIDEPET) == petarray ) { // lssproto_SPET_send( fd, petarray, FALSE); //} for( i =0; i < CHAR_MAXPETHAVE; i++) { if( standbypet & ( 1 << i ) ) { if( CHAR_getInt( fd_charaindex, CHAR_RIDEPET) == i ) continue; cnt++; //if( cnt > 4 ) { // print("\n 改封包!待机宠超过数量!!:%s ", CHAR_getChar( fd_charaindex, CHAR_CDKEY) ); //lssproto_SPET_send( fd, s_pet, FALSE); // break; //} s_pet |= ( 1 << i ); } } CHAR_setWorkInt( fd_charaindex, CHAR_WORKSTANDBYPET, s_pet); lssproto_SPET_send( fd, s_pet, TRUE); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_AC_recv( int fd,int x, int y,int actionno ) { if( CONNECT_checkfd(fd) == FALSE )return; int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); {//ttom avoid the warp at will Char *ch; ch = CHAR_getCharPointer( fd_charaindex); // CoolFish: +1 2001/11/05 if (!ch) return; if((ch->data[CHAR_X]!=x)||(ch->data[CHAR_Y]!=y)){ return; } } #ifdef _ALLBLUES_LUA_1_9 FreeAction(fd_charaindex, x,y, actionno); #endif CHAR_setMyPosition( fd_charaindex, x,y,TRUE); CHAR_sendAction( fd_charaindex, actionno, FALSE); return; } void lssproto_LOOK_recv( int fd,int x,int y ) { int charaindex, floor; CHECKFDANDTIME; charaindex = CONNECT_getCharaindex( fd ); { int ix,iy; ix=CHAR_getInt(charaindex, CHAR_X); iy=CHAR_getInt(charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ x=ix; y=iy; } } CHAR_setMyPosition( charaindex, x,y,TRUE); if( CHAR_CHECKINDEX( charaindex ) == FALSE )return; BATTLE_WatchTry( charaindex ); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_MU_recv( int fd,int x,int y,int array,int toindex ) { int to_charaindex = -1, fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); {//ttom avoid warp at will int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ //print("\n--Error!!!!"); //print("\norigion x=%d,y=%d",ix,iy); //print("\nmodify X=%d,Y=%d",x,y); x=ix; y=iy; } } CHAR_setMyPosition( fd_charaindex, x,y,TRUE); to_charaindex = Callfromcli_Util_getTargetCharaindex( fd, toindex); MAGIC_Use( fd_charaindex, array, to_charaindex); } void lssproto_JB_recv( int fd,int x,int y ) { int charaindex, floor; CHECKFDANDTIME; charaindex = CONNECT_getCharaindex( fd ); { int ix,iy; ix=CHAR_getInt(charaindex, CHAR_X); iy=CHAR_getInt(charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ x=ix; y=iy; } } CHAR_setMyPosition( charaindex, x,y,TRUE); if( CHAR_CHECKINDEX( charaindex ) == FALSE )return; #ifdef _BATTLE_LOOK_ BATTLE_RescueTry( charaindex ); #else floor = CHAR_getInt( charaindex, CHAR_FLOOR ); if( floor == 1007 || floor == 2007 || floor == 3007 || floor == 4007 || floor == 130 #ifdef _AUTO_PK || (floor == 20000 && CHAR_getWorkInt( charaindex, CHAR_WORK_AUTOPK ) == -1) #endif #ifdef _WATCH_FLOOR || floor == getWatchFloor(1) || floor == getWatchFloor(2) || floor == getWatchFloor(3) || floor == getWatchFloor(4) || floor == getWatchFloor(5) || !strcmp(getWatchFloorCF(),"是") #endif ){ BATTLE_WatchTry( charaindex ); }else{ if(BATTLE_RescueTry( charaindex ) == FALSE){ BATTLE_WatchTry( charaindex ); } } #endif } void lssproto_KN_recv( int fd,int havepetindex,char* data ) { int fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); // Robin 04/26 debug if( strlen(data) > 16 ) return; // CoolFish: Prevent Trade Cheat 2001/4/18 if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; if( checkStringErr(data) ) return; #ifdef _CHANGE_PETNAME_FIX if(strstr(data,"|")!=NULL&&strstr(data,"'")!=NULL&&strstr(data,"/")!=NULL&&strstr(data,"\\")!=NULL){ CHAR_talkToCli( fd_charaindex, -1, "宠物名中请不要带有非法字符!", CHAR_COLORRED); return; } #endif CHAR_inputUserPetName( fd_charaindex, havepetindex, data); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_WN_recv( int fd,int x,int y,int seqno, int objindex,int select, char* data ) { int fd_charaindex; CHECKFDANDTIME; if( checkStringErr(data) ) return; fd_charaindex = CONNECT_getCharaindex( fd ); // CoolFish: Prevent Trade Cheat 2001/4/18 if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) { return; } // Robin if( checkStringErr(data) ) return; #ifdef _ANGEL_SUMMON if( seqno == CHAR_WINDOWTYPE_ANGEL_ASK ) { print("\n CHAR_WINDOWTYPE_ANGEL_ASK objindex:%d select:%d data:%s ", objindex, select, data ); if(select==WINDOW_BUTTONTYPE_YES ) { if( AngelCreate( fd_charaindex) == FALSE ) { sendAngelCleanToCli( fd ); } } else if(select==WINDOW_BUTTONTYPE_NO ) { int mindex; char nameinfo[64]; mindex = checkIfAngel( fd_charaindex); print(" ====不接受召唤任务==== "); getMissionNameInfo( fd_charaindex, nameinfo); saacproto_ACMissionTable_send( acfd, mindex, 3, nameinfo, ""); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, WINDOW_BUTTONTYPE_OK, -1, -1, "真是遗憾。\n少了你的帮助,看来魔族会继续危害大陆的人民了。" ); //CHAR_talkToCli( fd_charaindex, -1, "天之声:真是可惜,这可是难得的机会呀。", CHAR_COLORYELLOW); sendAngelCleanToCli( fd ); } } #endif {//ttom avoid the warp at will Char *ch; ch = CHAR_getCharPointer( fd_charaindex); // CoolFish: +1 2001/11/05 if (!ch) return; if((ch->data[CHAR_X]!=x)||(ch->data[CHAR_Y]!=y)){ // Robin 04/20 test return; x=ch->data[CHAR_X]; y=ch->data[CHAR_Y]; } //ttom avoid WN at will if(seqno==CHAR_WINDOWTYPE_NPCENEMY_START){ // Char *ch; OBJECT object; int ix,iy,ifloor,i,j; int whichtype= -1; int enemy=0; int enemy_index; if(!CHECKOBJECT(objindex)){ goto FIRST; } enemy_index=OBJECT_getIndex(objindex);//ttom 11/15/2000 ix =ch->data[CHAR_X]; iy =ch->data[CHAR_Y]; ifloor=ch->data[CHAR_FLOOR]; for(i=iy-1;i<=iy+1;i++){ for(j=ix-1;j<=ix+1;j++){ for( object = MAP_getTopObj(ifloor,j,i) ; object ; object = NEXT_OBJECT(object ) ){ int objindex = GET_OBJINDEX(object); switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: whichtype = CHAR_getInt( OBJECT_getIndex( objindex), CHAR_WHICHTYPE); if( whichtype == CHAR_TYPENPCENEMY){ int i_ene_temp; i_ene_temp=OBJECT_getIndex( objindex); //print("\n--enetemp=%d",i_ene_temp); if(i_ene_temp== enemy_index){ goto START_WN; }else{ enemy=0; } } break; case OBJTYPE_ITEM: break; case OBJTYPE_GOLD: break; default: break; } } } } if(enemy==0){ FIRST: lssproto_EN_send( fd, FALSE, 0 ); CHAR_talkToCli(fd_charaindex, -1, "事件错误。", CHAR_COLORYELLOW); goto END_WN; } } } //ttom end START_WN: CHAR_setMyPosition( fd_charaindex, x,y,TRUE); if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE){ if(seqno==CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN){ if(!CONNECT_get_first_warp(fd)){ select=1; } } CHAR_processWindow( fd_charaindex, seqno, select, objindex, makeStringFromEscaped(data)); } //ttom+1 END_WN: return; //CONNECT_set_pass(fd,TRUE);//ttom } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_HL_recv( int fd,int flg ) { char msgbuf[128]; int i, fd_charaindex; CHECKFD; fd_charaindex = CONNECT_getCharaindex( fd ); if( CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE) { return; } #ifdef _LOCKHELP_OK // (不可开) Syu ADD 锁定不可加入战斗 if((CHAR_getInt(fd_charaindex,CHAR_FLOOR) >= 8200 && CHAR_getInt(fd_charaindex,CHAR_FLOOR) <= 8213) || (CHAR_getInt(fd_charaindex,CHAR_FLOOR) >= 30017 && CHAR_getInt(fd_charaindex,CHAR_FLOOR) <= 30021) || CHAR_getInt(fd_charaindex,CHAR_FLOOR) == 20000 ){ return ; } #endif #ifdef _NO_HELP_MAP { int floor=CHAR_getInt(fd_charaindex, CHAR_FLOOR); if(floor>=33001&&floor<=33101){ return; } int i; for(i=0;i<32;i++){ if(floor == getNoHelpMap(i)){ return; } } } #endif if( flg == TRUE ) { BattleArray[CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEINDEX)].Side[ CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLESIDE)].flg |= BSIDE_FLG_HELP_OK; snprintf( msgbuf, sizeof( msgbuf), "%s 在求救!", CHAR_getChar( fd_charaindex, CHAR_NAME)); } else { BattleArray[CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEINDEX)].Side[ CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLESIDE)].flg &= ~BSIDE_FLG_HELP_OK; snprintf( msgbuf, sizeof( msgbuf), "%s 决定拒绝帮助。", CHAR_getChar( fd_charaindex, CHAR_NAME)); } for( i = 0; i < 5; i ++ ) { int toindex = BattleArray[CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLEINDEX)].Side[ CHAR_getWorkInt( fd_charaindex, CHAR_WORKBATTLESIDE)].Entry[i].charaindex; if( CHAR_CHECKINDEX( toindex)) { int tofd = getfdFromCharaIndex( toindex ); if( tofd != -1 ) { lssproto_HL_send( tofd, flg); } /* 丢永本□斥霜耨 */ CHAR_talkToCli( toindex, -1, msgbuf, CHAR_COLORYELLOW); CHAR_sendBattleEffect( toindex, ON); } } } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_ProcGet_recv( int fd ) { outputNetProcLog( fd, 1); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_PlayerNumGet_recv( int fd ) { /* int i; int clicnt =0; int playercnt = 0; for( i = 0; i < ConnectLen; i ++ ) { if( CONNECT_getUse_debug(i,1017) ){ if( CONNECT_getCtype(i) == CLI) { clicnt ++; if( CONNECT_getCharaindex(i) >= 0 ) playercnt++; } } } lssproto_PlayerNumGet_send( fd, clicnt * 0.6, playercnt * 0.6); */ } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_LB_recv( int fd,int x,int y ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); {//ttom avoid warp at will int ix,iy; ix=CHAR_getInt(fd_charaindex, CHAR_X); iy=CHAR_getInt(fd_charaindex, CHAR_Y); if( (ix!=x)||(iy!=y)){ //print("\n--Error!!!!"); //print("\norigion x=%d,y=%d",ix,iy); //print("\nmodify X=%d,Y=%d",x,y); x=ix; y=iy; } } CHAR_setMyPosition( fd_charaindex, x,y,TRUE); BATTLE_WatchTry( fd_charaindex ); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_Shutdown_recv( int fd,char* passwd,int min ) { char buff[32]; if( strcmp( passwd, "hogehoge") == 0 ) { int i; int playernum = CHAR_getPlayerMaxNum(); snprintf( buff, sizeof( buff),"%s公告。",getGameservername()); for( i = 0 ; i < playernum ; i++) { if( CHAR_getCharUse(i) != FALSE ) { CHAR_talkToCli( i, -1, buff, CHAR_COLORYELLOW); } } SERVSTATE_setLimittime(min); SERVSTATE_setShutdown( NowTime.tv_sec ); SERVSTATE_setDsptime( 0 ); } } void lssproto_PMSG_recv( int fd,int index,int petindex,int itemindex, char* message,int color ) { // CoolFish: Prevent Trade Cheat 2001/4/18 int fd_charaindex; fd_charaindex = CONNECT_getCharaindex(fd); if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; #ifdef _STREET_VENDOR if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKSTREETVENDOR) != -1) return; #endif #ifdef _ITEM_PET_LOCKED if(CHAR_getInt(fd_charaindex,CHAR_LOCKED)==1){ char message[256]; char buf[256]; sprintf( message, "为了确保你的物品安全,请输入你的安全密码进行解锁!\n"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT, WINDOW_BUTTONTYPE_OKCANCEL, CHAR_WINDOWTYPE_ITEM_PET_LOCKED, -1, makeEscapeString( message, buf, sizeof(buf))); return; } #endif if (CHAR_getWorkInt(fd_charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE) return; PETMAIL_sendPetMail( CONNECT_getCharaindex( fd ), index, petindex, itemindex, message, color); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_PS_recv( int fd, int havepetindex, int havepetskill, int toindex, char* data ) { int charaindex = CONNECT_getCharaindex( fd ); if(CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) !=BATTLE_CHARMODE_NONE )return; int to_charaindex = Callfromcli_Util_getTargetCharaindex( fd, toindex); int petindex; BOOL ret; petindex = CHAR_getCharPet( charaindex, havepetindex); if( !CHAR_CHECKINDEX( petindex)) return; ret = PETSKILL_Use( petindex, havepetskill, to_charaindex, data ); lssproto_PS_send( fd, ret, havepetindex, havepetskill, toindex); } /*------------------------------------------------------------ ------------------------------------------------------------*/ void lssproto_SP_recv( int fd,int x,int y, int dir ) { int fd_charaindex; fd_charaindex = CONNECT_getCharaindex( fd ); {//ttom avoid the warp at will int i_x,i_y; i_x=CHAR_getInt(fd_charaindex, CHAR_X); i_y=CHAR_getInt(fd_charaindex, CHAR_Y); if((i_x!=x)||(i_y!=y)){ x=i_x; y=i_y; } }//ttom CHAR_setMyPosition_main( fd_charaindex, x,y,dir,TRUE); } /*------------------------------------------------------------ * CoolFish: Trade Command 2001/4/18 ------------------------------------------------------------*/ void lssproto_TD_recv( int fd, char* message ) { int fd_charaindex; CHECKFDANDTIME; fd_charaindex = CONNECT_getCharaindex( fd ); //printf("lssproto_TD_recv fd_charaindex=%d message=%d\n",fd_charaindex,message); if(CHAR_getWorkInt(fd_charaindex,CHAR_WORKSTREETVENDOR) != -1){ //printf("lssproto_TD_recv 摆摊状态下不能交易\n",fd_charaindex); CHAR_talkToCli(fd_charaindex,-1,"摆摊状态下不能交易",CHAR_COLORYELLOW); return; } CHAR_Trade(fd, fd_charaindex, message); } /*------------------------------------------------------------ * CoolFish: Family Command 2001/5/24 ------------------------------------------------------------*/ void lssproto_FM_recv( int fd, char* message ) { int fd_charaindex; /* struct timeval recvtime; CHECKFDANDTIME; // add code by shan CONNECT_getLastrecvtime( fd, &recvtime); if( time_diff( NowTime, recvtime) < 0.5 ){ return; } CONNECT_setLastrecvtime(fd, &NowTime); */ fd_charaindex = CONNECT_getCharaindex( fd ); if( checkStringErr( message ) ) return; CHAR_Family(fd, fd_charaindex, message); } // shan 2002/01/10 void lssproto_PETST_recv( int fd, int nPet, int sPet ) { int charaindex; int i, nums=0; CHECKFDANDTIME; charaindex = CONNECT_getCharaindex( fd ); if (!CHAR_CHECKINDEX( charaindex ) ) return; if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; for( i=0; i<5; i++) { if( CHAR_getWorkInt( charaindex, CHAR_WORK_PET0_STAT+i) == TRUE ) nums++; } if(nPet<0 )nPet=0; if(nPet>4 )nPet=4; if( nums <= 3 ){ CHAR_setWorkInt( charaindex, CHAR_WORK_PET0_STAT+nPet, sPet); } if(nPet != CHAR_getInt( charaindex, CHAR_DEFAULTPET)){ lssproto_PETS_send(fd, nPet, sPet); } } #ifdef _MIND_ICON void lssproto_MA_recv(int fd, int x, int y, int nMind) { int charaindex; CHECKFDANDTIME; charaindex = CONNECT_getCharaindex( fd); if(!CHAR_CHECKINDEX( charaindex)) return; if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ; { int i_x, i_y; i_x = CHAR_getInt( charaindex, CHAR_X); i_y = CHAR_getInt( charaindex, CHAR_Y); if((i_x!=x)||(i_y!=y)){ x = i_x; y = i_y; } } //print("\nshan------------------>mind action->%d x->%d y->%d", nMind, x, y); CHAR_setMyPosition( charaindex, x, y, TRUE); CHAR_setWorkInt( charaindex, CHAR_MIND_NUM, nMind); CHAR_sendMindEffect( charaindex, CHAR_getWorkInt( charaindex, CHAR_MIND_NUM)); if(CHAR_getWorkInt( charaindex, CHAR_MIND_NUM) != 101290 && CHAR_getWorkInt( charaindex, CHAR_MIND_NUM) != 101294 && CHAR_getWorkInt( charaindex, CHAR_MIND_NUM) != 101288 ) CHAR_setWorkInt( charaindex, CHAR_MIND_NUM, 0); //print("\nshan------------------>end"); return; } #endif BOOL checkStringErr( char *checkstring ) { int i,ach; for (i=0,ach=0;i=0x40)&&((unsigned char)checkstring[i]<=0x7e))|| (((unsigned char)checkstring[i]>=0xa1)&&((unsigned char)checkstring[i]<=0xfe))) ach=0; } else { if (((unsigned char)checkstring[i]>=0xa1)&&((unsigned char)checkstring[i]<=0xfe)) ach=1; } } if (ach) { print(" StringDog! "); return TRUE; } return FALSE; } #ifdef _TEAM_KICKPARTY void lssproto_KTEAM_recv( int fd, int si) { int charaindex=-1, pindex; if( si < 0 || si > 5 ) return; charaindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX( charaindex) ) return; if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_LEADER ) return; pindex = CHAR_getWorkInt( charaindex, si + CHAR_WORKPARTYINDEX1); if( !CHAR_CHECKINDEX( pindex) ) return; if( CHAR_getWorkInt( pindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) return; if( CHAR_DischargeParty( pindex, 0) == FALSE ){ CHAR_talkToCli( charaindex, -1, "踢除失败!", CHAR_COLORYELLOW); }else{ char buf1[256]; sprintf( buf1, "队长[%s]将你踢除!", CHAR_getUseName( charaindex )); CHAR_talkToCli( pindex, -1, buf1, CHAR_COLORYELLOW); sprintf( buf1, "将[%s]踢除出团队!", CHAR_getUseName( pindex )); CHAR_talkToCli( charaindex, -1, buf1, CHAR_COLORYELLOW); } } #endif #ifdef _CHATROOMPROTOCOL // (不可开) Syu ADD 聊天室频道 void lssproto_CHATROOM_recv (int fd , char *data) { ChatRoom_recvall ( fd , data ) ; } #endif #ifdef _NEWREQUESTPROTOCOL // (不可开) Syu ADD 新增Protocol要求细项 void lssproto_RESIST_recv (int fd ) { int charindex = -1 ; char token[256]; charindex = CONNECT_getCharaindex( fd ); if( !CHAR_CHECKINDEX( charindex) ) return; sprintf ( token , "%d|%d|%d|%d|%d|%d|%d|%d" , CHAR_getInt( charindex, CHAR_EARTH_RESIST ) , CHAR_getInt( charindex, CHAR_WATER_RESIST ) , CHAR_getInt( charindex, CHAR_FIRE_RESIST ) , CHAR_getInt( charindex, CHAR_WIND_RESIST ) , CHAR_getInt( charindex, CHAR_EARTH_EXP ) , CHAR_getInt( charindex, CHAR_WATER_EXP ) , CHAR_getInt( charindex, CHAR_FIRE_EXP ) , CHAR_getInt( charindex, CHAR_WIND_EXP ) ); lssproto_RESIST_send ( fd , token ) ; } #endif #ifdef _OUTOFBATTLESKILL // (不可开) Syu ADD 非战斗时技能Protocol void lssproto_BATTLESKILL_recv (int fd, int iNum) { #ifdef _CHAR_PROFESSION // WON ADD 人物职业 int charaindex = CONNECT_getCharaindex( fd ); #ifndef _PROSKILL_OPTIMUM int skillindex=-1,char_pskill=-1,profession_skill=-1; #endif if( !CHAR_CHECKINDEX( charaindex) ) return; if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ) return; #ifndef _PROSKILL_OPTIMUM // Robin fix cancel 此处略过职业检查, 改在 PROFESSION_SKILL_Use 中检查 // 人物的职业 char_pskill = CHAR_getInt( charaindex, PROFESSION_CLASS ); skillindex = PROFESSION_SKILL_GetArray( charaindex, iNum); int Pskillid = skillindex; // 技能的职业 profession_skill = PROFESSION_SKILL_getInt( Pskillid, PROFESSION_SKILL_PROFESSION_CLASS); if( (char_pskill > 0) && (char_pskill == profession_skill) ){ #else if( 1 ){ #endif if( PROFESSION_SKILL_Use( charaindex, iNum, 0, NULL ) != 1 ){ if(CHAR_getWorkInt( charaindex, CHAR_ENCOUNT_NUM)-(int)time(NULL)>0){ // print("\n 玩家(%s)使用技能错误!", CHAR_getUseName( charaindex ) ); #ifdef _PROSKILL_ERR_KICK CONNECT_setCloseRequest( fd , 1 ); #endif } } } #endif } #endif #ifdef _STREET_VENDOR void lssproto_STREET_VENDOR_recv(int fd,char *message) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; #ifdef _ITEM_PET_LOCKED if(CHAR_getInt(charaindex,CHAR_LOCKED)==1){ char message[256]; char buf[256]; sprintf( message, "为了确保你的物品安全,请输入你的安全密码进行解锁!\n"); lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGEANDLINEINPUT, WINDOW_BUTTONTYPE_OKCANCEL, CHAR_WINDOWTYPE_ITEM_PET_LOCKED, -1, makeEscapeString( message, buf, sizeof(buf))); return; } #endif if(CHAR_getWorkInt(charaindex,CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return; if(CHAR_getWorkInt(charaindex,CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){ CHAR_talkToCli(charaindex,-1,"组队状态下不能交易",CHAR_COLORYELLOW); return; } CHAR_sendStreetVendor(charaindex,message); } #endif #ifdef _RIGHTCLICK void lssproto_RCLICK_recv(int fd, int type, char* data) { print("\n RCLICK_recv( type=%d data=%s) ", type, data); } #endif #ifdef _JOBDAILY void lssproto_JOBDAILY_recv(int fd,char *data) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; CHAR_JobDaily(charaindex,data); } #endif #ifdef _TEACHER_SYSTEM void lssproto_TEACHER_SYSTEM_recv(int fd,char *data) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; CHAR_Teacher_system(charaindex,data); } #endif #ifdef _ASSESS_ABILITY void lssproto_ASSESS_ABILITY_recv(int fd) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; char data[512]; char tmp[512]; memset( data, 0, sizeof( data ) ); int i; for(i=0;i < 25; i++){ sprintf(tmp, "%d|", CHAR_getInt(charaindex, CHAR_MATERIAL01 + i)); strcat(data, tmp); } lssproto_ASSESS_ABILITY_send(fd, data); } #endif #ifdef _ONLINE_SHOP void lssproto_VIP_SHOP_recv(int fd, int type, int page) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; OnlineShop_ShowList(fd, charaindex, type, page); } void lssproto_VIP_SHOP_buy_recv(int fd, int type, int page, int id, int num) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; OnlineShop_Buy(fd, charaindex, type, page, id, num); } #endif void lssproto_SaMenu_recv( int fd, int index ) { int charaindex; int i, nums=0; CHECKFDANDTIME; charaindex = CONNECT_getCharaindex( fd ); if (!CHAR_CHECKINDEX( charaindex ) ) return; FreeSaMenu(charaindex, index); } #ifdef _FAMILYBADGE_ void lssproto_FamilyBadge_recv(int fd) { int charaindex = CONNECT_getCharaindex(fd); if(!CHAR_CHECKINDEX(charaindex)) return; LoadFamilyBadge(fd); } #endif