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

📄 char.c

📁 传奇3源程序, 用vc开发的
💻 C
📖 第 1 页 / 共 3 页
字号:
			
			// inter server張棟偱傕側偄応崌偼愗抐
			printf("char: unknown packet %x! (from login)\n",RFIFOW(fd,0));
			close(fd);
			session[fd]->eof=1;	
			return 0;
		}
	}
	return 0;
}

int search_mapserver(char *map)
{
	int i,j,k;
	printf("search_mapserver %s\n",map);
	for(i=0;i<MAX_MAP_SERVERS;i++){
		if(server_fd[i]<0)
			continue;
		for(j=0;server[i].map[j][0];j++){
			//printf("%s : %s = %d\n",server[i].map[j],map,strcmp(server[i].map[j],map));
			if((k=strcmp(server[i].map[j],map))==0){
				printf("search_mapserver success %s -> %d\n",map,i);
				return i;
			}
			//printf("%s : %s = %d\n",server[i].map[j],map,k);
		}
	}
	printf("search_mapserver failed\n");
	return -1;
}

int char_mapif_init(int fd)
{
	return inter_mapif_init(fd);
}

int parse_char(int fd)
{
	int i,ch;
	struct char_session_data *sd;

	if(login_fd<0)
		session[fd]->eof=1;
	if(session[fd]->eof){
		if(fd==login_fd)
			login_fd=-1;
		close(fd);
		delete_session(fd);
		return 0;
	}
	if(RFIFOW(fd,0)<30000)
		printf("parse_char : %d %d %d\n",fd,RFIFOREST(fd),RFIFOW(fd,0));
	sd=session[fd]->session_data;
	while(RFIFOREST(fd)>=2){
		switch(RFIFOW(fd,0)){
		case 0x65:	// 愙懕梫媮
			if(RFIFOREST(fd)<17)
				return 0;
			if(sd==NULL){
				sd=session[fd]->session_data=calloc(sizeof(*sd), 1);
				memset(sd,0,sizeof(*sd));
			}
			sd->account_id=RFIFOL(fd,2);
			sd->login_id1=RFIFOL(fd,6);
			sd->login_id2=RFIFOL(fd,10);
			sd->sex=RFIFOB(fd,16);
			sd->state=CHAR_STATE_WAITAUTH;

			WFIFOL(fd,0)=RFIFOL(fd,2);
			WFIFOSET(fd,4);

			for(i=0;i<AUTH_FIFO_SIZE;i++){
				if(auth_fifo[i].account_id==sd->account_id &&
				   auth_fifo[i].login_id1==sd->login_id1 &&
				   auth_fifo[i].delflag==2){
					auth_fifo[i].delflag=1;
					break;
				}
			}
			if(i==AUTH_FIFO_SIZE){
				WFIFOW(login_fd,0)=0x2712;
				WFIFOL(login_fd,2)=sd->account_id;
				WFIFOL(login_fd,6)=sd->login_id1;
				WFIFOL(login_fd,10)=sd->login_id2;
				WFIFOB(login_fd,14)=sd->sex;
				WFIFOSET(login_fd,15);
			} else {
				if(max_connect_user > 0) {
					if(count_users() < max_connect_user)
						mmo_char_send006b(fd,sd);
					else {
						WFIFOW(fd,0)=0x6c;
						WFIFOW(fd,2)=0;
						WFIFOSET(fd,3);
					}
				}
				else
					mmo_char_send006b(fd,sd);
			}

			RFIFOSKIP(fd,17);
			break;
		case 0x66:	// 僉儍儔慖戰
			if(RFIFOREST(fd)<3)
				return 0;
			for(ch=0;ch<9;ch++)
				if(sd->found_char[ch]>=0 && char_dat[sd->found_char[ch]].char_num==RFIFOB(fd,2))
					break;
			if(ch!=9){
				FILE *logfp;

				logfp=fopen(char_log_filename,"a");
				if(logfp){
					fprintf(logfp,"char select %d-%d %s" RETCODE,sd->account_id,RFIFOB(fd,2),char_dat[sd->found_char[ch]].name);
					fclose(logfp);
				}

				WFIFOW(fd,0)=0x71;
				WFIFOL(fd,2)=char_dat[sd->found_char[ch]].char_id;
				i=search_mapserver(char_dat[sd->found_char[ch]].last_point.map);
				if(i<0){
					memcpy(char_dat[sd->found_char[ch]].last_point.map,"prontera.gat",16);
					i=search_mapserver(char_dat[sd->found_char[ch]].last_point.map);
					if(i<0)
						i=0;
				}
				memcpy(WFIFOP(fd,6),char_dat[sd->found_char[ch]].last_point.map,16);
				WFIFOL(fd,22)=server[i].ip;
				WFIFOW(fd,26)=server[i].port;
				WFIFOSET(fd,28);

				if(auth_fifo_pos>=AUTH_FIFO_SIZE){
					auth_fifo_pos=0;
				}
				printf("auth_fifo set %d - %08x %08x %08x\n",auth_fifo_pos,sd->account_id,char_dat[sd->found_char[ch]].char_id,sd->login_id1);
				auth_fifo[auth_fifo_pos].account_id=sd->account_id;
				auth_fifo[auth_fifo_pos].char_id=char_dat[sd->found_char[ch]].char_id;
				auth_fifo[auth_fifo_pos].login_id1=sd->login_id1;
				auth_fifo[auth_fifo_pos].delflag=0;
				auth_fifo[auth_fifo_pos].char_pos=sd->found_char[ch];
				auth_fifo[auth_fifo_pos].sex=sd->sex;
				auth_fifo_pos++;
			}
			RFIFOSKIP(fd,3);
			break;
		case 0x67:	// 嶌惉
			if(RFIFOREST(fd)<37)
				return 0;
			i=make_new_char(fd,RFIFOP(fd,2));
			if(i<0){
				WFIFOW(fd,0)=0x6e;
				WFIFOB(fd,2)=0x00;
				WFIFOSET(fd,3);
				RFIFOSKIP(fd,37);
				break;
			}

			WFIFOW(fd,0)=0x6d;
			memset(WFIFOP(fd,2),0x00,106);

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

			WFIFOL(fd,2+28) = char_dat[i].karma;
			WFIFOL(fd,2+32) = char_dat[i].manner;

			WFIFOW(fd,2+40) = 0x30;
			WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff)? 0x7fff:char_dat[i].hp;
			WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff)? 0x7fff:char_dat[i].max_hp;
			WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff)? 0x7fff:char_dat[i].sp;
			WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff)? 0x7fff:char_dat[i].max_sp;
			WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
			WFIFOW(fd,2+52) = char_dat[i].class;
			WFIFOW(fd,2+54) = char_dat[i].hair;

			WFIFOW(fd,2+58) = char_dat[i].base_level;
			WFIFOW(fd,2+60) = char_dat[i].skill_point;

			WFIFOW(fd,2+64) = char_dat[i].shield;
			WFIFOW(fd,2+66) = char_dat[i].head_top;
			WFIFOW(fd,2+68) = char_dat[i].head_mid;
			WFIFOW(fd,2+70) = char_dat[i].hair_color;

			memcpy( WFIFOP(fd,2+74), char_dat[i].name, 24 );

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

			WFIFOSET(fd,108);
			RFIFOSKIP(fd,37);
			for(ch=0;ch<9;ch++) {
				if(sd->found_char[ch]==-1) {
					sd->found_char[ch]=i;
					break;
				}
			}
		case 0x68:	// 嶍彍
			if(RFIFOREST(fd)<46)
				return 0;
			for(i=0;i<9;i++){
				if(char_dat[sd->found_char[i]].char_id==RFIFOL(fd,2)){
					int j;
					if(char_dat[sd->found_char[i]].pet_id)
						inter_pet_delete(char_dat[sd->found_char[i]].pet_id);
					for(j=0;j<MAX_INVENTORY;j++)
						if(char_dat[sd->found_char[i]].inventory[j].card[0] == (short)0xff00)
							inter_pet_delete(*((long *)(&char_dat[sd->found_char[i]].inventory[j].card[2])));
					for(j=0;j<MAX_CART;j++)
						if(char_dat[sd->found_char[i]].cart[j].card[0] == (short)0xff00)
							inter_pet_delete(*((long *)(&char_dat[sd->found_char[i]].cart[j].card[2])));
					if(sd->found_char[i]!=char_num-1){
						memcpy(&char_dat[sd->found_char[i]],&char_dat[char_num-1],sizeof(char_dat[0]));
					}
					char_num--;
					for(ch=i;ch<9-1;ch++)
						sd->found_char[ch]=sd->found_char[ch+1];
					sd->found_char[8]=-1;
					break;
				}
			}
			if(i==9){
				WFIFOW(fd,0)=0x70;
				WFIFOB(fd,2)=0;
				WFIFOSET(fd,3);
			} else {
				WFIFOW(fd,0)=0x6f;
				WFIFOSET(fd,2);
			}
			RFIFOSKIP(fd,46);
			break;
		case 0x2af8:	// 儅僢僾僒乕僶乕儘僌僀儞
			if(RFIFOREST(fd)<60)
				return 0;
			WFIFOW(fd,0)=0x2af9;
			for(i=0;i<MAX_MAP_SERVERS;i++){
				if(server_fd[i]<0)
					break;
			}
			if(i==MAX_MAP_SERVERS || strcmp(RFIFOP(fd,2),userid) || strcmp(RFIFOP(fd,26),passwd)){
				WFIFOB(fd,2)=3;
				WFIFOSET(fd,3);
				RFIFOSKIP(fd,60);
			} else {
				WFIFOB(fd,2)=0;
				session[fd]->func_parse=parse_frommap;
				server_fd[i]=fd;
				server[i].ip=RFIFOL(fd,54);
				server[i].port=RFIFOW(fd,58);
				server[i].users=0;
				memset(server[i].map,0,sizeof(server[i].map));
				WFIFOSET(fd,3);
				RFIFOSKIP(fd,60);
				realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);	
				char_mapif_init(fd);
				return 0;
			}
			break;
		case 0x187:	// Alive怣崋丠
			if (RFIFOREST(fd) < 6) {
				return 0;
			}
			RFIFOSKIP(fd, 6);
			break;
		
		case 0x7530:	// Athena忣曬強摼
			WFIFOW(fd,0)=0x7531;
			WFIFOB(fd,2)=ATHENA_MAJOR_VERSION;
			WFIFOB(fd,3)=ATHENA_MINOR_VERSION;
			WFIFOB(fd,4)=ATHENA_REVISION;
			WFIFOB(fd,5)=ATHENA_RELEASE_FLAG;
			WFIFOB(fd,6)=ATHENA_OFFICIAL_FLAG;
			WFIFOB(fd,7)=ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
			WFIFOW(fd,8)=ATHENA_MOD_VERSION;
			WFIFOSET(fd,10);
			RFIFOSKIP(fd,2);
			return 0;
		case 0x7532:	// 愙懕偺愗抐(default偲張棟偼堦弿偩偑柧帵揑偵偡傞偨傔)
			close(fd);
			session[fd]->eof=1;
			return 0;

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

// 慡偰偺MAP僒乕僶乕偵僨乕僞憲怣乮憲怣偟偨map嶪偺悢傪曉偡乯
int mapif_sendall(unsigned char *buf,unsigned int len)
{
	int i,c;
	for(i=0,c=0;i<MAX_MAP_SERVERS;i++){
		int fd;
		if((fd=server_fd[i])>0){
			memcpy(WFIFOP(fd,0),buf,len);
			WFIFOSET(fd,len);
			c++;
		}
	}
	return c;
}
// 帺暘埲奜偺慡偰偺MAP僒乕僶乕偵僨乕僞憲怣乮憲怣偟偨map嶪偺悢傪曉偡乯
int mapif_sendallwos(int sfd,unsigned char *buf,unsigned int len)
{
	int i,c;
	for(i=0,c=0;i<MAX_MAP_SERVERS;i++){
		int fd;
		if((fd=server_fd[i])>0 && fd!=sfd){
			memcpy(WFIFOP(fd,0),buf,len);
			WFIFOSET(fd,len);
			c++;
		}
	}
	return c;
}
// MAP僒乕僶乕偵僨乕僞憲怣乮map嶪惗懚妋擣桳傝乯
int mapif_send(int fd,unsigned char *buf,unsigned int len)
{
	int i;
	for(i=0;i<MAX_MAP_SERVERS;i++){
		if((fd==server_fd[i])>0){
			memcpy(WFIFOP(fd,0),buf,len);
			WFIFOSET(fd,len);
			return 1;
		}
	}
	return 0;
}

int send_users_tologin(int tid,unsigned int tick,int id,int data)
{
  if(login_fd>0 && session[login_fd]){
    int i,users;
    for(i=0,users=0;i<MAX_MAP_SERVERS;i++){
      if(server_fd[i]>0){
	users+=server[i].users;
      }
    }
    WFIFOW(login_fd,0)=0x2714;
    WFIFOL(login_fd,2)=users;
    WFIFOSET(login_fd,6);
    for(i=0;i<MAX_MAP_SERVERS;i++){
      int fd;
      if((fd=server_fd[i])>0){
	WFIFOW(fd,0)=0x2b00;
	WFIFOL(fd,2)=users;
	WFIFOSET(fd,6);
      }
    }
  }
  return 0;
}

int check_connect_login_server(int tid,unsigned int tick,int id,int data)
{
  if(login_fd<=0 || session[login_fd]==NULL){
    login_fd=make_connection(login_ip,login_port);
    session[login_fd]->func_parse=parse_tologin;
	realloc_fifo(login_fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);	
    WFIFOW(login_fd,0)=0x2710;
    memcpy(WFIFOP(login_fd,2),userid,24);
    memcpy(WFIFOP(login_fd,26),passwd,24);
    WFIFOL(login_fd,50)=0;
    WFIFOL(login_fd,54)=char_ip;
    WFIFOL(login_fd,58)=char_port;
    memcpy(WFIFOP(login_fd,60),server_name,20);
    WFIFOW(login_fd,82)=char_maintenance;
    WFIFOW(login_fd,84)=char_new;
    WFIFOSET(login_fd,86);
  }
  return 0;
}

int char_config_read(const char *cfgName)
{
	struct hostent *h=NULL;
	char line[1024],w1[1024],w2[1024];
	int i;
	FILE *fp=fopen(cfgName,"r");
	if(fp==NULL){
		printf("file not found: %s\n",cfgName);
		exit(1);
	}

	while(fgets(line,1020,fp)){
		if(line[0] == '/' && line[1] == '/')
			continue;

		i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
		if(i!=2)
			continue;
		if(strcmpi(w1,"userid")==0){
			memcpy(userid,w2,24);
		}
		else if(strcmpi(w1,"passwd")==0){
			memcpy(passwd,w2,24);
		}
		else if(strcmpi(w1,"server_name")==0){
			memcpy(server_name,w2,16);
		}
		else if(strcmpi(w1,"login_ip")==0){
			h = gethostbyname (w2);
			if(h != NULL) { 
				printf("Login server IP address : %s -> %d.%d.%d.%d\n",w2,(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
				sprintf(login_ip_str,"%d.%d.%d.%d",(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
			}
			else
				memcpy(login_ip_str,w2,16);
		}
		else if(strcmpi(w1,"login_port")==0){
			login_port=atoi(w2);
		}
		else if(strcmpi(w1,"char_ip")==0){
			h = gethostbyname (w2);
			if(h != NULL) { 
				printf("Character server IP address : %s -> %d.%d.%d.%d\n",w2,(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
				sprintf(char_ip_str,"%d.%d.%d.%d",(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
			}
			else
				memcpy(char_ip_str,w2,16);
		}
		else if(strcmpi(w1,"char_port")==0){
			char_port=atoi(w2);
		}
		else if(strcmpi(w1,"char_maintenance")==0){
			char_maintenance=atoi(w2);
		}
		else if(strcmpi(w1,"char_new")==0){
			char_new=atoi(w2);
		}
		else if(strcmpi(w1,"char_txt")==0){
			strcpy(char_txt,w2);
		}
		else if(strcmpi(w1,"max_connect_user")==0){
			max_connect_user=atoi(w2);
		}
		else if(strcmpi(w1,"autosave_time")==0){
			autosave_interval=atoi(w2)*1000;
			if(autosave_interval <= 0)
				autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
		}
		else if(strcmpi(w1,"start_point")==0){
			char map[32];
			int x,y;
			if( sscanf(w2,"%[^,],%d,%d",map,&x,&y)<3 )
				continue;
			memcpy(start_point.map,map,16);
			start_point.x=x;
			start_point.y=y;
		}
		else if(strcmpi(w1,"start_zeny")==0){
			start_zeny=atoi(w2);
			if(start_zeny < 0) start_zeny = 0;
		}
		else if(strcmpi(w1,"unknown_char_name")==0){
			strcpy(unknown_char_name,w2);
			unknown_char_name[24] = 0;
		}
		else if(strcmpi(w1,"char_log_filename")==0){
			strcpy(char_log_filename,w2);
		}
		else if(strcmpi(w1,"import")==0){
			char_config_read(w2);
		}
	}
	fclose(fp);

	return 0;
}

void do_final(void)
{
	mmo_char_sync();
	inter_save();
}

int do_init(int argc,char **argv)
{
	int i;

	char_config_read((argc<2)? CHAR_CONF_NAME:argv[1]);

	login_ip=inet_addr(login_ip_str);
	char_ip=inet_addr(char_ip_str);

	for(i=0;i<MAX_MAP_SERVERS;i++)
		server_fd[i]=-1;

	mmo_char_init();

	inter_init((argc>2)?argv[2]:inter_cfgName);	// inter server 弶婜壔

//	set_termfunc(mmo_char_sync);
	set_termfunc(do_final);
	set_defaultparse(parse_char);

	make_listen_port(char_port);

	add_timer_func_list(check_connect_login_server,"check_connect_login_server");
	add_timer_func_list(send_users_tologin,"send_users_tologin");
	add_timer_func_list(mmo_char_sync_timer,"mmo_char_sync_timer");

	i=add_timer_interval(gettick()+1000,check_connect_login_server,0,0,10*1000);
	i=add_timer_interval(gettick()+1000,send_users_tologin,0,0,5*1000);
	i=add_timer_interval(gettick()+autosave_interval,mmo_char_sync_timer,0,0,autosave_interval);

	return 0;
}

⌨️ 快捷键说明

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