⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 char.c

📁 传奇3源程序, 用vc开发的
💻 C
📖 第 1 页 / 共 3 页
字号:
		}
		return users;
	}
  return 0;
}

int mmo_char_send006b(int fd,struct char_session_data *sd)
{
  int i,j,found_num;
#ifdef NEW_006b
  int offset=24;
#else
  int offset=4;
#endif

  sd->state=CHAR_STATE_AUTHOK;
  for(i=found_num=0;i<char_num;i++){
    if(char_dat[i].account_id==sd->account_id){
      sd->found_char[found_num]=i;
      found_num++;
      if(found_num==9)
				break;
    }
  }
  for(i=found_num;i<9;i++)
    sd->found_char[i]=-1;

	memset(WFIFOP(fd,0),0,offset+found_num*106);
  WFIFOW(fd,0)=0x6b;
  WFIFOW(fd,2)=offset+found_num*106;

  for( i = 0; i < found_num; i++ ) {

    j=sd->found_char[i];

    memset(WFIFOP(fd,offset+(i*106)),0x00,106);

    WFIFOL(fd,offset+(i*106)) = char_dat[j].char_id;
    WFIFOL(fd,offset+(i*106)+4) = char_dat[j].base_exp;
    WFIFOL(fd,offset+(i*106)+8) = char_dat[j].zeny;
    WFIFOL(fd,offset+(i*106)+12) = char_dat[j].job_exp;
    WFIFOL(fd,offset+(i*106)+16) = char_dat[j].job_level;

    WFIFOL(fd,offset+(i*106)+20) = 0;
    WFIFOL(fd,offset+(i*106)+24) = 0;
    WFIFOL(fd,offset+(i*106)+28) = char_dat[j].option;

    WFIFOL(fd,offset+(i*106)+32) = char_dat[j].karma;
    WFIFOL(fd,offset+(i*106)+36) = char_dat[j].manner;

    WFIFOW(fd,offset+(i*106)+40) = char_dat[j].status_point;
    WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
    WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
    WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp;
    WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
    WFIFOW(fd,offset+(i*106)+50) = DEFAULT_WALK_SPEED; // char_dat[j].speed;
    WFIFOW(fd,offset+(i*106)+52) = char_dat[j].class;
    WFIFOW(fd,offset+(i*106)+54) = char_dat[j].hair;
    WFIFOW(fd,offset+(i*106)+56) = char_dat[j].weapon;
    WFIFOW(fd,offset+(i*106)+58) = char_dat[j].base_level;
    WFIFOW(fd,offset+(i*106)+60) = char_dat[j].skill_point;
    WFIFOW(fd,offset+(i*106)+62) = char_dat[j].head_bottom;
    WFIFOW(fd,offset+(i*106)+64) = char_dat[j].shield;
    WFIFOW(fd,offset+(i*106)+66) = char_dat[j].head_top;
    WFIFOW(fd,offset+(i*106)+68) = char_dat[j].head_mid;
    WFIFOW(fd,offset+(i*106)+70) = char_dat[j].hair_color;
    WFIFOW(fd,offset+(i*106)+72) = char_dat[j].clothes_color;

    memcpy( WFIFOP(fd,offset+(i*106)+74), char_dat[j].name, 24 );

    WFIFOB(fd,offset+(i*106)+98) = (char_dat[j].str > 255)? 255:char_dat[j].str;
    WFIFOB(fd,offset+(i*106)+99) = (char_dat[j].agi > 255)? 255:char_dat[j].agi;
    WFIFOB(fd,offset+(i*106)+100) = (char_dat[j].vit > 255)? 255:char_dat[j].vit;
    WFIFOB(fd,offset+(i*106)+101) = (char_dat[j].int_ > 255)? 255:char_dat[j].int_;
    WFIFOB(fd,offset+(i*106)+102) = (char_dat[j].dex > 255)? 255:char_dat[j].dex;
    WFIFOB(fd,offset+(i*106)+103) = (char_dat[j].luk > 255)? 255:char_dat[j].luk;
    WFIFOB(fd,offset+(i*106)+104) = char_dat[j].char_num;
  }

  WFIFOSET(fd,WFIFOW(fd,2));
  return 0;
}

int set_account_reg2(int acc,int num,struct global_reg *reg)
{
	int i,c;
	for(i=0,c=0;i<char_num;i++){
		if(char_dat[i].account_id==acc){
			memcpy(char_dat[i].account_reg2,reg,sizeof(char_dat[i].account_reg2));
			char_dat[i].account_reg2_num=num;
			c++;
		}
	}
	return c;
}

int parse_tologin(int fd)
{
  int i,fdc;
  struct char_session_data *sd;

  if(session[fd]->eof){
    if(fd==login_fd)
      login_fd=-1;
    close(fd);
    delete_session(fd);
    return 0;
  }
  printf("parse_tologin : %d %d %d\n",fd,RFIFOREST(fd),RFIFOW(fd,0));
  sd=session[fd]->session_data;
  while(RFIFOREST(fd)>=2){
    switch(RFIFOW(fd,0)){
    case 0x2711:
      if(RFIFOREST(fd)<3)
	return 0;
      if(RFIFOB(fd,2)){
	printf("connect login server error : %d\n",RFIFOB(fd,2));
	exit(1);
      }
      RFIFOSKIP(fd,3);
      break;
    case 0x2713:
      if(RFIFOREST(fd)<7)
	return 0;
      for(i=0;i<fd_max;i++){
	if(session[i] && (sd=session[i]->session_data)){
	  if(sd->account_id==RFIFOL(fd,2))
	    break;
	}
      }
      fdc=i;
      if(fdc==fd_max){
	RFIFOSKIP(fd,7);
	break;
      }
printf("parse_tologin 2713 : %d\n",RFIFOB(fd,6));
      if(RFIFOB(fd,6)!=0){
	WFIFOW(fdc,0)=0x6c;
	WFIFOB(fdc,2)=0x42;
	WFIFOSET(fdc,3);
	RFIFOSKIP(fd,7);
	break;
      }

			if(max_connect_user > 0) {
				if(count_users() < max_connect_user)
					mmo_char_send006b(fdc,sd);
				else {
					WFIFOW(fdc,0)=0x6c;
					WFIFOW(fdc,2)=0;
					WFIFOSET(fdc,3);
				}
			}
			else
				mmo_char_send006b(fdc,sd);

      RFIFOSKIP(fd,7);
      break;
	
	case 0x2721:	// gm reply
	  {
	  	int oldacc,newacc;
		unsigned char buf[64];
	  	if(RFIFOREST(fd)<10)
			return 0;
		oldacc=RFIFOL(fd,2);
		newacc=RFIFOL(fd,6);
		RFIFOSKIP(fd,10);
		if(newacc>0){
			for(i=0;i<char_num;i++){
				if(char_dat[i].account_id==oldacc)
					char_dat[i].account_id=newacc;
			}
		}
		WBUFW(buf,0)=0x2b0b;
		WBUFL(buf,2)=oldacc;
		WBUFL(buf,6)=newacc;
		mapif_sendall(buf,10);
//		printf("char -> map\n");
	  }break;

	case 0x2723:	// changesex reply
	  {
	  	int acc,sex,i/*,h,j*/;
		unsigned char buf[64];
	  	if(RFIFOREST(fd)<7)
			return 0;

		acc=RFIFOL(fd,2);
		sex=RFIFOB(fd,6);
		RFIFOSKIP(fd,7);
		if(acc>0){
			for(i=0;i<char_num;i++){
				if(char_dat[i].account_id==acc){
					char_dat[i].sex=sex;
					auth_fifo[i].sex=sex;
					if(char_dat[i].class==19 || char_dat[i].class==20){
						char_dat[i].class=(sex)?19:20;//棆捁偼怑傕曄峏
						/*for(h=1901;h<1964;h++){//棆捁愱梡憰旛傪憰旛偟偰偄偨応崌偼奜偡
							if(char_dat[i].inventory[h].equip)
								char_dat[i].inventory[h].equip=0;
						}
						for(j=0;j<MAX_SKILL;j++){//僗僉儖偼儕僙僢僩
							if(char_dat[i].skill[j].id>0 && !char_dat[i].skill[j].flag){
								char_dat[i].skill_point += char_dat[i].skill[j].lv;
								char_dat[i].skill[j].lv = 0;
							}
						}*/
					}
				}
			}
		}
		WBUFW(buf,0)=0x2b0d;
		WBUFL(buf,2)=acc;
		WBUFB(buf,6)=sex;

		mapif_sendall(buf,7);
//		printf("char -> map\n");
	  }break;

	// account_reg2曄峏捠抦
	case 0x2729: {
			struct global_reg reg[ACCOUNT_REG2_NUM];
			unsigned char buf[4096];
			int j,p,acc;
			if(RFIFOREST(fd)<4)
				return 0;
			if(RFIFOREST(fd)<RFIFOW(fd,2))
				return 0;
			acc=RFIFOL(fd,4);
			for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
				memcpy(reg[j].str,RFIFOP(fd,p),32);
				reg[j].value=RFIFOL(fd,p+32);
			}
			set_account_reg2(acc,j,reg);
			// 摨岰儘僌僀儞傪嬛巭偟偰偄傟偽憲傞昁梫偼柍偄
			memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2));
			WBUFW(buf,0)=0x2b11;
			mapif_sendall(buf,WBUFW(buf,2));
			RFIFOSKIP(fd,RFIFOW(fd,2));
//			printf("char: save_account_reg_reply\n");
		} break;


    default:
      close(fd);
      session[fd]->eof=1;
      return 0;
    }
  }
  RFIFOFLUSH(fd);
  return 0;
}

int parse_frommap(int fd)
{
	int i,j;
	int id;
	
	for(id=0;id<MAX_MAP_SERVERS;id++)
		if(server_fd[id]==fd)
			break;
	if(id==MAX_MAP_SERVERS)
		session[fd]->eof=1;
	if(session[fd]->eof){
		for(i=0;i<MAX_MAP_SERVERS;i++)
			if(server_fd[i]==fd)
		server_fd[i]=-1;
		close(fd);
		delete_session(fd);
		return 0;
	}
	//printf("parse_frommap : %d %d %d\n",fd,RFIFOREST(fd),RFIFOW(fd,0));
	while(RFIFOREST(fd)>=2){
		switch(RFIFOW(fd,0)){
		// 儅僢僾僒乕僶乕偐傜扴摉儅僢僾柤傪庴怣
		case 0x2afa:
			if(RFIFOREST(fd)<4 || RFIFOREST(fd)<RFIFOW(fd,2))
				return 0;
			for(i=4,j=0;i<RFIFOW(fd,2);i+=16,j++){
				memcpy(server[id].map[j],RFIFOP(fd,i),16);
			//	printf("set map %d.%d : %s\n",id,j,server[id].map[j]);
			}
			i=server[id].ip;
			{
				unsigned char *p=(unsigned char *)&i;
				printf("set map %d from %d.%d.%d.%d:%d (%d maps)\n",
					id,p[0],p[1],p[2],p[3],server[id].port,j);
			}
			server[id].map[j][0]=0;
			RFIFOSKIP(fd,RFIFOW(fd,2));
			WFIFOW(fd,0)=0x2afb;
			WFIFOW(fd,2)=0;
			WFIFOSET(fd,3);
			{	// 懠偺儅僢僾僒乕僶乕偵扴摉儅僢僾忣曬傪憲怣
				unsigned char buf[16384];
				int x;
				WBUFW(buf,0)=0x2b04;
				WBUFW(buf,2)=j*16+12;
				WBUFL(buf,4)=server[id].ip;
				WBUFW(buf,8)=server[id].port;
				WBUFW(buf,10)=i;
				for(i=0;i<j;i++){
					memcpy(WBUFP(buf,12+i*16),server[id].map[i],16);
				}
				mapif_sendallwos(fd,buf,WBUFW(buf,2));
				// 懠偺儅僢僾僒乕僶乕偺扴摉儅僢僾傪憲怣
				for(x=0;x<MAX_MAP_SERVERS;x++){
					if(server_fd[x]>=0 && x!=id){
						WFIFOW(fd,0)=0x2b04;
						WFIFOL(fd,4)=server[x].ip;
						WFIFOW(fd,8)=server[x].port;
						for(i=0,j=0;i<MAX_MAP_PER_SERVER;i++){
							if(server[x].map[i][0]>0)
								memcpy(WFIFOP(fd,12+(j++)*16),server[x].map[i],16);
						}
						if(j>0){
							WFIFOW(fd,10)=j;
							WFIFOW(fd,2)=j*16+12;
							WFIFOSET(fd,WFIFOW(fd,2));
						}
					}
				}
			}
			break;
		// 擣徹梫媮
		case 0x2afc:
			if(RFIFOREST(fd)<14)
				return 0;
			printf("auth_fifo search %08x %08x %08x\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
			for(i=0;i<AUTH_FIFO_SIZE;i++){
				if(auth_fifo[i].account_id==RFIFOL(fd,2) &&
					auth_fifo[i].char_id==RFIFOL(fd,6) &&
					auth_fifo[i].login_id1==RFIFOL(fd,10) &&
					!auth_fifo[i].delflag){
					auth_fifo[i].delflag=1;
					break;
				}
			}
			if(i==AUTH_FIFO_SIZE){
				WFIFOW(fd,0)=0x2afe;
				WFIFOW(fd,2)=RFIFOL(fd,2);
				WFIFOB(fd,6)=0;
				WFIFOSET(fd,7);
				printf("auth_fifo search error!\n");
			} else {
				WFIFOW(fd,0)=0x2afd;
				WFIFOW(fd,2)=12+sizeof(char_dat[0]);
				WFIFOL(fd,4)=RFIFOL(fd,2);
				WFIFOL(fd,8)=RFIFOL(fd,6);
				char_dat[auth_fifo[i].char_pos].sex=auth_fifo[i].sex;
				memcpy(WFIFOP(fd,12),&char_dat[auth_fifo[i].char_pos],sizeof(char_dat[0]));
				WFIFOSET(fd,WFIFOW(fd,2));
			}
			RFIFOSKIP(fd,14);
			break;
		// MAP僒乕僶乕忋偺儐乕僓乕悢庴怣
		case 0x2aff:
			if(RFIFOREST(fd)<6)
				return 0;
			server[id].users=RFIFOL(fd,2);
			RFIFOSKIP(fd,6);
			break;
		// 僉儍儔僨乕僞曐懚
		case 0x2b01:
			if(RFIFOREST(fd)<4 || RFIFOREST(fd)<RFIFOW(fd,2))
				return 0;
			for(i=0;i<char_num;i++){
				if(char_dat[i].account_id==RFIFOL(fd,4) &&
					char_dat[i].char_id==RFIFOL(fd,8))
					break;
			}
			if(i!=char_num){
				memcpy(&char_dat[i],RFIFOP(fd,12),sizeof(char_dat[0]));
			}
			RFIFOSKIP(fd,RFIFOW(fd,2));
			break;
		// 僉儍儔僙儗梫媮
		case 0x2b02:
			if(RFIFOREST(fd)<10)
				return 0;

			if(auth_fifo_pos>=AUTH_FIFO_SIZE){
				auth_fifo_pos=0;
			}
			printf("auth_fifo set %d - %08x %08x\n",auth_fifo_pos,RFIFOL(fd,2),RFIFOL(fd,6));
			auth_fifo[auth_fifo_pos].account_id=RFIFOL(fd,2);
			auth_fifo[auth_fifo_pos].char_id=0;
			auth_fifo[auth_fifo_pos].login_id1=RFIFOL(fd,6);
			auth_fifo[auth_fifo_pos].delflag=2;
			auth_fifo[auth_fifo_pos].char_pos=0;
			auth_fifo_pos++;
			
			WFIFOW(fd,0)=0x2b03;
			WFIFOL(fd,2)=RFIFOL(fd,2);
			WFIFOB(fd,6)=0;
			WFIFOSET(fd,7);
			
			RFIFOSKIP(fd,10);
			
			break;
		// 儅僢僾僒乕僶乕娫堏摦梫媮
		case 0x2b05:
			if(RFIFOREST(fd)<41)
				return 0;

			if(auth_fifo_pos>=AUTH_FIFO_SIZE){
				auth_fifo_pos=0;
			}
			memcpy(WFIFOP(fd,2),RFIFOP(fd,2),38);
			WFIFOW(fd,0)=0x2b06;

			printf("auth_fifo set %d - %08x %08x\n",auth_fifo_pos,RFIFOL(fd,2),RFIFOL(fd,6));
			auth_fifo[auth_fifo_pos].account_id=RFIFOL(fd,2);
			auth_fifo[auth_fifo_pos].char_id=RFIFOL(fd,10);
			auth_fifo[auth_fifo_pos].login_id1=RFIFOL(fd,6);
			auth_fifo[auth_fifo_pos].delflag=0;
			auth_fifo[auth_fifo_pos].sex=RFIFOB(fd,40);
			{
				int i=0;
				for(i=0;i<char_num;i++){
					if(	char_dat[i].account_id==RFIFOL(fd,2) &&
						char_dat[i].char_id==RFIFOL(fd,10) )
					break;
				}
				if(i==char_num){
					WFIFOW(fd,6)=1;
					WFIFOSET(fd,40);
					RFIFOSKIP(fd,41);
					break;
				}
				auth_fifo[auth_fifo_pos].char_pos=i;
			}
			auth_fifo_pos++;
			
			WFIFOL(fd,6)=0;
			WFIFOSET(fd,40);
			RFIFOSKIP(fd,41);
			
			break;
			
		// 僉儍儔柤専嶕
		case 0x2b08:
			if(RFIFOREST(fd)<6)
				return 0;
			for(i=0;i<char_num;i++){
				if(char_dat[i].char_id==RFIFOL(fd,2))
					break;
			}
			WFIFOW(fd,0)=0x2b09;
			WFIFOL(fd,2)=RFIFOL(fd,2);
			if(i!=char_num)
				memcpy(WFIFOP(fd,6),char_dat[i].name,24);
			else
				memcpy(WFIFOP(fd,6),unknown_char_name,24);
			WFIFOSET(fd,30);
			
			RFIFOSKIP(fd,6);
			break;
		
		// GM偵側傝偨乕偄
		case 0x2b0a:
			if(RFIFOREST(fd)<4)
				return 0;
			if(RFIFOREST(fd)<RFIFOW(fd,2))
				return 0;
			memcpy(WFIFOP(login_fd,2),RFIFOP(fd,2),RFIFOW(fd,2)-2);
			WFIFOW(login_fd,0)=0x2720;
			WFIFOSET(login_fd,RFIFOW(fd,2));
//			printf("char : change gm -> login %d %s %d\n",RFIFOL(fd,4),RFIFOP(fd,8),RFIFOW(fd,2));
			RFIFOSKIP(fd,RFIFOW(fd,2));
			break;

		//惈暿曄姺梫媮
		case 0x2b0c:
			if(RFIFOREST(fd)<4)
				return 0;
			if(RFIFOREST(fd)<RFIFOW(fd,2)){
				printf("char : changesex -> length error : %d : %d\n",RFIFOREST(fd),RFIFOW(fd,2));
				return 0;}
			WFIFOW(login_fd,0)=0x2722;
			WFIFOW(login_fd,2)=RFIFOW(fd,2);
			WFIFOL(login_fd,4)=RFIFOL(fd,4);
			WFIFOB(login_fd,8)=RFIFOB(fd,8);
			WFIFOSET(login_fd,RFIFOW(fd,2));
//			printf("char : change sex -> login %d %d %d \n",RFIFOL(fd,4),RFIFOB(fd,8),RFIFOW(fd,2));
			RFIFOSKIP(fd,RFIFOW(fd,2));
			break;

		// account_reg曐懚梫媮
		case 0x2b10: {
			struct global_reg reg[ACCOUNT_REG2_NUM];
			int j,p,acc;
			if(RFIFOREST(fd)<4)
				return 0;
			if(RFIFOREST(fd)<RFIFOW(fd,2))
				return 0;
			acc=RFIFOL(fd,4);
			for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
				memcpy(reg[j].str,RFIFOP(fd,p),32);
				reg[j].value=RFIFOL(fd,p+32);
			}
			set_account_reg2(acc,j,reg);
			// login僒乕僶乕傊憲傞
			memcpy(WFIFOP(login_fd,0),RFIFOP(fd,0),RFIFOW(fd,2));
			WFIFOW(login_fd,0)=0x2728;
			WFIFOSET(login_fd,WFIFOW(login_fd,2));
			// 儚乕儖僪傊偺摨岰儘僌僀儞偑側偗傟偽map僒乕僶乕偵憲傞昁梫偼側偄
			//memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2));
			//WBUFW(buf,0)=0x2b11;
			//mapif_sendall(buf,WBUFW(buf,2));
			RFIFOSKIP(fd,RFIFOW(fd,2));
//			printf("char: save_account_reg (from map)\n");
			break;
		}

		default:
			// inter server張棟偵搉偡
			{
				int r=inter_parse_frommap(fd);
				if( r==1 )	break;		// 張棟偱偒偨
				if( r==2 )	return 0;	// 僷働僢僩挿偑懌傝側偄
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -