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