📄 char.c
字号:
// 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 + -