map2.c

来自「CS反恐精英1.6的部分C源代码。」· C语言 代码 · 共 2,313 行 · 第 1/5 页

C
2,313
字号
	continue;
      memcpy(WFIFOP(fd,0),dat,len);
      WFIFOSET(fd,len);
      c++;
    }
  }
  return c;
}

// wos = without self  0 - include srcfd  1- exclude srcfd
// 2- exclude all in chat users 3- exclude same chat joined user
int mmo_map_sendarea(int srcfd,char *dat,int len,int wos)
{
  struct map_session_data *srcsd;
  int bx,by,i,j;

  srcsd=session[srcfd]->session_data;
  for(by=srcsd->y/BLOCK_SIZE-AREA_SIZE,i=0;i<(AREA_SIZE*2+1);by++,i++){
    if(by < 0 || by >= map_data[srcsd->mapno].bys)
      continue;
    for(bx=srcsd->x/BLOCK_SIZE-AREA_SIZE,j=0;j<(AREA_SIZE*2+1);bx++,j++){
      if(bx < 0 || bx >= map_data[srcsd->mapno].bxs)
	continue;
      mmo_map_sendblock(srcsd->mapno,bx,by,dat,len,srcfd,wos);
    }
  }
  return 0;
}

int mmo_map_sendchat(int srcfd,char *dat,int len,int wos)
{
  struct map_session_data *srcsd,*dstsd;
  struct mmo_chat* chat;
  int fd,i;

  srcsd=session[srcfd]->session_data;
  if((chat=(struct mmo_chat*)srcsd->chatID) == NULL)
    return 0;
  for(i=0;i<chat->users;i++){
    fd=chat->usersfd[i];
    if(!session[fd] || !(dstsd=session[fd]->session_data))
      continue;
    if(wos && fd==srcfd)
      continue;
    memcpy(WFIFOP(fd,0),dat,len);
    WFIFOSET(fd,len);
  }
  return 0;
}

int mmo_map_sendarea_mxy(int m,int x,int y,char *dat,int len)
{
  int bx,by,i,j;

  for(by=y/BLOCK_SIZE-AREA_SIZE,i=0;i<(AREA_SIZE*2+1);by++,i++){
    if(by < 0 || by >= map_data[m].bys)
      continue;
    for(bx=x/BLOCK_SIZE-AREA_SIZE,j=0;j<(AREA_SIZE*2+1);bx++,j++){
      if(bx < 0 || bx >= map_data[m].bxs)
	continue;
      mmo_map_sendblock(m,bx,by,dat,len,0,0);
    }
  }
  return 0;
}

int mmo_map_sendall(int srcfd,char *dat,int len,int wos)
{
  struct map_session_data *srcsd,*dstsd;
  int fd;

  srcsd=session[srcfd]->session_data;
  for(fd=0;fd<FD_SETSIZE;fd++){
    if(!session[fd] || !(dstsd=session[fd]->session_data))
      continue;
    if(wos && fd==srcfd)
      continue;
    memcpy(WFIFOP(fd,0),dat,len);
    WFIFOSET(fd,len);
  }
  return 0;
}

int mmo_map_set_frameinitem(int fd,unsigned char *buf,struct flooritem_data *fitem)
{
  if(fitem->item_data.nameid==0)
    return 0;
  //009d <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
  WBUFW(buf,0)=0x9d;
  WBUFL(buf,2)=fitem->id;
  WBUFW(buf,6)=fitem->item_data.nameid;
  WBUFB(buf,8)=fitem->item_data.identify;
  WBUFW(buf,9)=fitem->x;
  WBUFW(buf,11)=fitem->y;
  WBUFW(buf,13)=fitem->item_data.amount;
  WBUFB(buf,15)=fitem->subx;
  WBUFB(buf,16)=fitem->suby;
  return 17;
}

int mmo_map_set_dropitem(int fd,unsigned char *buf,struct flooritem_data *fitem)
{
  if(fitem->item_data.nameid==0)
    return 0;
  //009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
  WBUFW(buf,0)=0x9e;
  WBUFL(buf,2)=fitem->id;
  WBUFW(buf,6)=fitem->item_data.nameid;
  WBUFB(buf,8)=fitem->item_data.identify;
  WBUFW(buf,9)=fitem->x;
  WBUFW(buf,11)=fitem->y;
  WBUFB(buf,13)=fitem->subx;
  WBUFB(buf,14)=fitem->suby;
  WBUFW(buf,15)=fitem->item_data.amount;
  return 17;
}

int mmo_map_set_npc(int fd,unsigned char *buf,unsigned long id, unsigned long class, int x, int y,int dir)
{
  WBUFW(buf,0)=0x78;
  WBUFL(buf,2)=id;
  WBUFW(buf,6)=200;
  WBUFW(buf,8)=0;
  WBUFW(buf,10)=0;
  WBUFW(buf,12)=0;
  WBUFW(buf,14)=class;
  WBUFW(buf,16)=0;
  WBUFW(buf,18)=0;
  WBUFW(buf,20)=0;
  WBUFW(buf,22)=0;
  WBUFW(buf,24)=0;
  WBUFW(buf,26)=0;
  WBUFW(buf,28)=0;
  WBUFW(buf,30)=0;
  WBUFW(buf,32)=0;
  WBUFW(buf,34)=0;
  WBUFW(buf,36)=0;
  WBUFW(buf,38)=0;
  WBUFW(buf,40)=0;
  WBUFW(buf,42)=0;
  WBUFB(buf,44)=0;
  WBUFB(buf,45)=0;
  set_pos(WBUFP(buf,46),x,y);
  WBUFB(buf,48)|=dir&0x0f;
  WBUFB(buf,49)=5;
  WBUFB(buf,50)=5;
  WBUFB(buf,51)=0;
  return 52;
}

int mmo_map_set_npc007c(int fd,unsigned char *buf,unsigned long id, unsigned long class, int x, int y)
{
  WBUFW(buf,0)=0x7c;
  WBUFL(buf,2)=id;
  WBUFW(buf,6)=200;
  WBUFW(buf,8)=0;
  WBUFW(buf,10)=0;
  WBUFW(buf,12)=0;
  WBUFW(buf,14)=0;
  WBUFW(buf,16)=0;
  WBUFW(buf,18)=0;
  WBUFW(buf,20)=class;
  WBUFW(buf,22)=0;
  WBUFW(buf,24)=0;
  WBUFW(buf,26)=0;
  WBUFW(buf,28)=0;
  WBUFW(buf,30)=0;
  WBUFW(buf,32)=0;
  WBUFW(buf,34)=0;
  set_pos(WBUFP(buf,36),x,y);
  WBUFB(buf,39)=0;
  WBUFB(buf,40)=0;
  return 41;
}

int mmo_map_set00b1(int fd,int type,int val)
{
	WFIFOW(fd,0) = 0xb1;
	WFIFOW(fd,2) = type;
	WFIFOL(fd,4) = val;
	WFIFOSET(fd,8);
	return 0;
}
/*various character settings */
int mmo_map_set0078(int fd,unsigned char *buf)
{
  struct map_session_data *sd;

  sd=session[fd]->session_data;

  WBUFW(buf,0)=0x78;
  WBUFL(buf,2)=sd->account_id;
  WBUFW(buf,6)=sd->speed;
  WBUFW(buf,8)=0;
  WBUFW(buf,10)=0;
  WBUFW(buf,12)=sd->status.option;
  WBUFW(buf,14)=sd->status.class;
  WBUFW(buf,16)=sd->status.hair;
  WBUFW(buf,18)=sd->status.weapon;
  WBUFW(buf,20)=sd->status.head_bottom;
  WBUFW(buf,22)=sd->status.sheild;
  WBUFW(buf,24)=sd->status.head_top;
  WBUFW(buf,26)=sd->status.head_mid;
  WBUFW(buf,28)=sd->status.hair_color;
  WBUFW(buf,30)=sd->status.clothes_color;
  WBUFW(buf,32)=sd->head_dir;
  WBUFW(buf,34)=sd->status.guild_id;
  WBUFW(buf,36)=0;
  WBUFW(buf,38)=0;
  WBUFW(buf,40)=sd->status.manner;
  WBUFW(buf,42)=sd->status.karma;
  WBUFB(buf,44)=0;
  WBUFB(buf,45)=sd->sex;
  set_pos(WBUFP(buf,46),sd->x,sd->y);
  WBUFB(buf,48)|=sd->dir&0x0f;
  WBUFB(buf,49)=5;
  WBUFB(buf,50)=5;
  WBUFB(buf,51)=sd->sitting;
  return 0;
}

int mmo_map_set0079(int fd,unsigned char *buf)
{
  mmo_map_set0078(fd,buf);
  WBUFW(buf,0)=0x79;
  return 0;
}

int mmo_map_set007b(int fd,unsigned char *buf,unsigned long tick,int x0,int y0,int x1,int y1)
{
  struct map_session_data *sd;

  sd=session[fd]->session_data;

  WBUFW(buf,0)=0x7b;
  WBUFL(buf,2)=sd->account_id;
  WBUFW(buf,6)=sd->speed;
  WBUFW(buf,8)=0;
  WBUFW(buf,10)=0;
  WBUFW(buf,12)=sd->status.option;
  WBUFW(buf,14)=sd->status.class;
  WBUFW(buf,16)=sd->status.hair;
  WBUFW(buf,18)=sd->status.weapon;
  WBUFW(buf,20)=sd->status.head_bottom;
  WBUFL(buf,22)=tick;
  WBUFW(buf,26)=sd->status.sheild;
  WBUFW(buf,28)=sd->status.head_top;
  WBUFW(buf,30)=sd->status.head_mid;
  WBUFW(buf,32)=sd->status.hair_color;
  WBUFW(buf,34)=sd->status.clothes_color;
  WBUFW(buf,36)=sd->head_dir;
  WBUFW(buf,38)=sd->status.guild_id;
  WBUFW(buf,40)=0;
  WBUFW(buf,42)=0;
  WBUFW(buf,44)=sd->status.manner;
  WBUFW(buf,46)=sd->status.karma;
  WBUFB(buf,48)=0;
  WBUFB(buf,49)=sd->sex;
  set_2pos(WBUFP(buf,50),x0,y0,x1,y1);
  WBUFB(buf,55)=0;
  WBUFB(buf,56)=5;
  WBUFB(buf,57)=5;
  return 0;
}

/**********************************************
acquire name function
**********************************************/
int mmo_map_send0095(int fd,unsigned long id)
{
  	int i,char_id=0;
  	struct map_session_data *sd;
	sd = NULL;
	//printf("fd:%d,ID:%d\n",fd,id);
	//Fred Fix5 (Username Showing in Map)
	for(i=5;i<FD_SETSIZE;i++){
			if(session[i] && (sd=session[i]->session_data) &&  sd->account_id==id){
				char_id=sd->char_id;
				break;
				}
	}
	if(char_id){ // PC
		if(strcmp(sd->status.guild_name,"not post")!=0){//if guild post
			//printf("%s\n%s\n%s\n%s",sd->status.name,sd->status.party_name,sd->status.guild_name,sd->status.class_name);
			WFIFOW(fd,0)=0x195;//name packet
			WFIFOL(fd,2)=id;
			memcpy(WFIFOP(fd,6),sd->status.name,24);//increases as it sends name
			memcpy(WFIFOP(fd,30),sd->status.party_name,24);
			memcpy(WFIFOP(fd,54),sd->status.guild_name,24);
			memcpy(WFIFOP(fd,78),sd->status.class_name,24);
			WFIFOSET(fd,packet_len_table[0x195]);
		}else{
			WFIFOW(fd,0)=0x95;//name packet
			WFIFOL(fd,2)=id;
			memcpy(WFIFOP(fd,6),sd->status.name,24);//increases as it sends name
			WFIFOSET(fd,packet_len_table[0x95]);
		}

	return 0;
  	} else { // NPC
    sd=session[fd]->session_data;
    for(i=0;i<map_data[sd->mapno].npc_num;i++){
      if(map_data[sd->mapno].npc[i]->id==id){
	WFIFOW(fd,0)=0x95;
	WFIFOL(fd,2)=id;
	memcpy(WFIFOP(fd,6),map_data[sd->mapno].npc[i]->name,24);
	WFIFOSET(fd,30);
	return 0;
      }
    }
  }

  return -1;
}

void equip_check(int fd){
	int i;
	struct map_session_data *sd;
	sd=session[fd]->session_data;
	// equip check&modify
	for(i=0;i<100;i++){
	  if(sd->status.inventory[i].nameid &&
	     (sd->status.inventory[i].equip)){
			 mmo_map_calc_status(fd,sd->status.inventory[i].nameid,1);//status addition
		}
	}
}

int mmo_map_set_look(int fd,unsigned char *buf,int id,int type,int val)
{
  //printf("mmo_map_set_look : %d,%d,%d\n",id,type,val);
  WBUFW(buf,0)=0xc3;
  WBUFL(buf,2)=id;
  WBUFB(buf,6)=type;
  WBUFB(buf,7)=val;
  return 8;
}

int calc_need_status_point(struct map_session_data *sd,int type)
{
  int val;

  if(type<SP_STR || type>SP_LUK)
    return -1;
  val =
    type==SP_STR ? sd->status.str :
    type==SP_AGI ? sd->status.agi :
    type==SP_VIT ? sd->status.vit :
    type==SP_INT ? sd->status.int_:
    type==SP_DEX ? sd->status.dex : sd->status.luk;
  return (val+9)/10+1;
}

/*parameter setting*/
int mmo_map_set_param(int fd,unsigned char *buf,int type)
{

  int len=8;
  struct map_session_data *sd;

  sd=session[fd]->session_data;
  WBUFW(buf,0)=0xb0;
  WBUFW(buf,2)=type;
  switch(type){
  case SP_STATUSPOINT:
    WBUFL(buf,4)=sd->status.status_point;
    break;
  case SP_ASPD:
    WBUFL(buf,4)=sd->status.aspd;
    break;
  case SP_ATK1:
    WBUFW(buf,4)=sd->status.atk1;
    break;
  case SP_MATK1:
    WBUFL(buf,4)=sd->status.matk1;
    break;
  case SP_MATK2:
    WBUFL(buf,4)=sd->status.matk2;
    break;
  case SP_DEF2:
    WBUFW(buf,4) = sd->status.def2;
    break;
  case SP_MDEF2:
    WBUFW(buf,4) = sd->status.mdef2;
    break;
  case SP_HIT:
    WBUFL(buf,4) = sd->status.hit;
  case SP_FLEE1:
    WBUFW(buf,4) = sd->status.flee1;
    break;
  case SP_FLEE2:
    WBUFW(buf,4) = sd->status.flee2;
    break;
  case SP_SKILLPOINT:
    WBUFL(buf,4)=sd->status.skill_point;
    break;
  case SP_ZENY:
    WBUFW(buf,0)=0xb1;
    WBUFL(buf,4)=sd->status.zeny;
    break;
  case SP_WEIGHT:
    WBUFL(buf,4)=sd->weight;
    break;
  case SP_MAXWEIGHT:
    WBUFL(buf,4)=sd->max_weight;
    break;
  case SP_STR:
    WBUFW(buf,0)=0x141;
    WBUFL(buf,2)=type;
    WBUFL(buf,6)=sd->status.str;
    WBUFL(buf,10)=0; // str bonus
    len=14;
    break;
  case SP_AGI:
    WBUFW(buf,0)=0x141;
    WBUFL(buf,2)=type;
    WBUFL(buf,6)=sd->status.agi;
    WBUFL(buf,10)=0; // agi bonus
    len=14;
    break;
  case SP_VIT:
    WBUFW(buf,0)=0x141;
    WBUFL(buf,2)=type;
    WBUFL(buf,6)=sd->status.vit;
    WBUFL(buf,10)=0; // vit bonus
    len=14;
    break;
  case SP_INT:
    WBUFW(buf,0)=0x141;
    WBUFL(buf,2)=type;
    WBUFL(buf,6)=sd->status.int_;
    WBUFL(buf,10)=0; // int bonus
    len=14;
    break;
  case SP_DEX:
    WBUFW(buf,0)=0x141;
    WBUFL(buf,2)=type;
    WBUFL(buf,6)=sd->status.dex;
    WBUFL(buf,10)=0; // dex bonus
    len=14;
    break;
  case SP_LUK:
    WBUFW(buf,0)=0x141;
    WBUFL(buf,2)=type;
    WBUFL(buf,6)=sd->status.luk;
    WBUFL(buf,10)=0; // luk bonus
    len=14;
    break;
  default:
    len=0;
    break;
  }
  return len;
}

int mmo_map_update_param(int fd,int type,int val)
{
 struct map_session_data *sd;
 int len;
 sd=session[fd]->session_data;
 switch(type){
 case SP_ZENY:
   sd->status.zeny=sd->status.zeny+val;

⌨️ 快捷键说明

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