map2.c

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

C
2,313
字号
		//Lv up renewal
		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x0b;
		WFIFOL(fd,4) = m_cs->base_level;
		WFIFOSET(fd,8);
		mmo_map_calc_status(fd,0,0);//status recalculation
		//HP,SP maximum value modification
		m_cs->hp = m_cs->max_hp;
		m_cs->sp = m_cs->max_sp;

		//HP,MAXHP,SP,MAXSP renewal
		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x05;
		WFIFOL(fd,4) = m_cs->hp;
		WFIFOSET(fd,8);
		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x06;
		WFIFOL(fd,4) = m_cs->max_hp;
		WFIFOSET(fd,8);
		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x07;
		WFIFOL(fd,4) = m_cs->sp;
		WFIFOSET(fd,8);
		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x08;
		WFIFOL(fd,4) = m_cs->max_sp;
		WFIFOSET(fd,8);
	}
}


int mmo_map_item_get(int fd,unsigned char* buf, struct item* item)
{
  struct map_session_data *sd;
  struct mmo_charstatus *m_cs;
  struct item *n_item;
  int c=0,len;

  sd=session[fd]->session_data;
  m_cs=&sd->status;

  if(!itemdb_isequip(item->nameid)) {
    for(c=0;c<MAX_INVENTORY;c++) {
      n_item=&m_cs->inventory[c];
      if(n_item->nameid==item->nameid) {
	n_item->amount+=item->amount;
	//printf("already exist item add\n");
	break;
      }
    }
  }
  if(c==MAX_INVENTORY || itemdb_isequip(item->nameid)) {
    for(c=0;c<MAX_INVENTORY;c++) {
      n_item=&m_cs->inventory[c];
      if(n_item->nameid)
	continue;
      else {
	memcpy(n_item, item, sizeof(*item));
	//printf("equip or new item add\n");
 	break;
      }
    }
  }
  if(c==MAX_INVENTORY)
    return -1;
  if(sd->weight + itemdb_weight(item->nameid)*item->amount > sd->max_weight )
    return -2;

  sd->weight += itemdb_weight(item->nameid)*item->amount;

  //00a0 <index>.w <amount>.w <item ID>.w <identify flag>.B <attribute?>.B <refine>.B <card>.4w <equip type>.w <type>.B <fail>.B
  n_item=&m_cs->inventory[c];
  WBUFW(buf,0)=0xa0;
  WBUFW(buf,2)=c+2;
  WBUFW(buf,4)=item->amount;
  WBUFW(buf,6)=n_item->nameid;
  WBUFB(buf,8)=n_item->identify;
  WBUFB(buf,9)=n_item->attribute;
  WBUFB(buf,10)=n_item->refine;
  WBUFW(buf,11)=n_item->card[0];
  WBUFW(buf,13)=n_item->card[1];
  WBUFW(buf,15)=n_item->card[2];
  WBUFW(buf,17)=n_item->card[3];
  WBUFW(buf,19)=itemdb_equip_point(n_item->nameid,sd);
  WBUFB(buf,21)=itemdb_type(n_item->nameid);
  WBUFB(buf,22)=0;

  len=mmo_map_set_param(fd,WBUFP(buf,23),SP_WEIGHT);

  return len+23;
}

int mmo_map_item_lost(int fd,unsigned char* buf, short index, short amount)
{
  struct map_session_data *sd;
  struct mmo_charstatus *m_cs;
  struct item *n_item;
  int len;

  sd=session[fd]->session_data;
  m_cs=&sd->status;
  if(index>=MAX_INVENTORY+2 || index<2)
    return -1;
  n_item=&m_cs->inventory[index-2];
  if(!n_item->nameid)
    return -1;
  if(n_item->amount<amount)
    return -1;
  n_item->amount-=amount;
  if(n_item->amount==0)
    n_item->nameid=0;

  sd->weight-=itemdb_weight(n_item->nameid)*amount;
  len=mmo_map_set_param(fd,WBUFP(buf,0),SP_WEIGHT);
  WBUFW(buf,len+0)=0xaf;
  WBUFW(buf,len+2)=index;
  WBUFW(buf,len+4)=amount;

  return len+6;
}
int mmo_map_item_lost_silent(int fd,unsigned char* buf, short index, short amount)
{
 struct map_session_data *sd;
 struct mmo_charstatus *m_cs;
 struct item *n_item;
 int len;
 sd=session[fd]->session_data;
 m_cs=&sd->status;
 if(index>=MAX_INVENTORY+2 || index<2)
   return -1;
 n_item=&m_cs->inventory[index-2];
 if(!n_item->nameid)
   return -1;
 if(n_item->amount<amount)
   return -1;
 n_item->amount-=amount;
 if(n_item->amount==0)
   n_item->nameid=0;
 sd->weight-=itemdb_weight(n_item->nameid)*amount;
 len=mmo_map_set_param(fd,WBUFP(buf,0),SP_WEIGHT);
 return 0;
}
int mmo_map_set00d7(int fd,unsigned char *buf)
{
  struct mmo_chat* temp_chat;
  struct map_session_data *sd;

  if(session[fd]==NULL || (sd=session[fd]->session_data)==NULL)
    return 0;
  if((temp_chat=(struct mmo_chat*)(sd->chatID))==NULL)
    return 0;

  WBUFW(buf, 0) = 0xd7;
  WBUFW(buf, 2) = strlen(temp_chat->title)+17;	/* len */
  WBUFL(buf, 4) = temp_chat->ownID; /* ownID */
  WBUFL(buf, 8) = temp_chat->chatID;	/* chatID */
  WBUFW(buf,12) = temp_chat->limit;  /* limit */
  WBUFW(buf,14) = temp_chat->users;  /* users */
  WBUFB(buf,16) = temp_chat->pub;  /* pub */
  strcpy(WBUFP(buf,17),temp_chat->title);  /* title */
  return WBUFW(buf,2);
}

int mmo_map_getblockchar(int fd,int m,int bx,int by)
{
  struct block_list *bl;
  int c=0,len;

  if(bx<0 || bx>=map_data[m].bxs ||
     by<0 || by>=map_data[m].bys)
    return 0;
  //printf("getblockchar (%d,%d,%d)\n",m,bx,by);
  bl=map_data[m].block[bx + by*map_data[m].bxs].next;
  for(;bl;bl=bl->next){
    if(bl->type==BL_PC){
      struct map_session_data *srcsd;
      struct mmo_chat* temp_chat;

      srcsd=(struct map_session_data *)bl;
      if(fd == srcsd->fd)
	continue;
      //printf("send 0078 pc%08x\n",srcsd->account_id);
      mmo_map_set0078(srcsd->fd,WFIFOP(fd,0));
      WFIFOSET(fd,packet_len_table[0x78]);
      if((temp_chat=(struct mmo_chat*)srcsd->chatID) &&
	 temp_chat->ownID == srcsd->account_id){
	len=mmo_map_set00d7(srcsd->fd,WFIFOP(fd,0));
	if(len>0)
	  WFIFOSET(fd,len);
      }
      c++;
    } else if(bl->type==BL_NPC){
      struct npc_data *nd;
      nd=(struct npc_data*)bl;
      //printf("send 0078 npc%08x\n",nd->id);
      mmo_map_set_npc(fd,WFIFOP(fd,0),nd->id,nd->class,nd->x,nd->y,nd->dir);
      WFIFOSET(fd,packet_len_table[0x78]);
    } else if(bl->type==BL_ITEM){
      struct flooritem_data *fid;

      fid=(struct flooritem_data*)bl;
      len=mmo_map_set_frameinitem(fd,WFIFOP(fd,0),fid);
      if(len>0)
	WFIFOSET(fd,len);
    }
  }
  return c;
}

/* clear block character */
int mmo_map_clrblockchar(int fd,int m,int bx,int by)
{
  struct block_list *bl;
  int c=0;

  if(bx<0 || bx>=map_data[m].bxs ||
     by<0 || by>=map_data[m].bys)
    return 0;
  bl=map_data[m].block[bx + by*map_data[m].bxs].next;
  for(;bl;bl=bl->next){
    if(bl->type==BL_PC){//character
      struct map_session_data *srcsd;
      struct mmo_chat* temp_chat;
      srcsd=(struct map_session_data *)bl;
      if(fd == srcsd->fd)
	continue;
      WFIFOW(fd,0)=0x80;
      WFIFOL(fd,2)=srcsd->account_id;
      WFIFOB(fd,6)=0; // no effect?
      WFIFOSET(fd,packet_len_table[0x80]);
      if((temp_chat=(struct mmo_chat*)srcsd->chatID) &&
	 temp_chat->ownID == srcsd->account_id){
	WFIFOW(fd,0)=0xd8;
	WFIFOW(fd,2)=srcsd->chatID;
	WFIFOSET(fd,packet_len_table[0xd8]);
      }
      c++;
    } else if(bl->type==BL_NPC){//NPC
      struct npc_data *nd;
      nd=(struct npc_data*)bl;
      WFIFOW(fd,0)=0x80;
      WFIFOL(fd,2)=nd->id;
      WFIFOB(fd,6)=0; // no effect?
      WFIFOSET(fd,packet_len_table[0x80]);
	}else if(!bl->subtype){ //DJP Fix1
    }else{
       if(bl->subtype==MONS){//monster
    	  struct npc_data *nd;
          nd=(struct npc_data*)bl;
          WFIFOW(fd,0)=0x80;
          WFIFOL(fd,2)=nd->id;
          WFIFOB(fd,6)=0; //fadeout(keeps fading out)
          WFIFOSET(fd,packet_len_table[0x80]);
    }
   }     
  }
  return c;
}

int mmo_map_getareachar(int fd)
{
  int i,j,bx,by;
  struct map_session_data *srcsd;

  srcsd=session[fd]->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_getblockchar(fd,srcsd->mapno,bx,by);
    }
  }

#if 0
  // --- skill effect test code ---
  if(strcmp(srcsd->mapname,"prontera.gat"))
    return 0;
  for(i=0;i<256;i++){
    len=mmo_map_set_skilleffectarea(fd,WFIFOP(fd,0),49999-i, srcsd->account_id, i, 159-(i/32*2), 191-(i%32*2));
    if(len>0) WFIFOSET(fd,len);
  }

#endif
#if 0
  // --- NPC test code ---
  if(strcmp(srcsd->mapname,"prontera.gat"))
    return 0;
  len=mmo_map_set_npc(fd,WFIFOP(fd,0),1, 0x70, 156, 195);
  WFIFOSET(fd,len);
  for(i=45;i<126;i++){
    if(i==0x68 || i==0x6f)
      continue;
    mmo_map_set_npc(fd,WFIFOP(fd,0),i-45+20, i, 159-((i-45)/20*2), 191-((i-45)%20*2));
    WFIFOSET(fd,packet_len_table[0x78]);
  }
  mmo_map_set_npc(fd,WFIFOP(fd,0),i-45+20, 0x2bc, 159-((i-45)/20*2), 191-((i-45)%20*2));
  WFIFOSET(fd,packet_len_table[0x78]);
  i++;
  mmo_map_set_npc(fd,WFIFOP(fd,0),i-45+20, 1039, 159-((i-45)/20*2), 191-((i-45)%20*2)); // Baphomet
  WFIFOSET(fd,packet_len_table[0x78]);
#endif
  return 0;
}

int mmo_map_sendwis(int fd)
{
  int i;
  struct map_session_data *srcsd,*dstsd;

  if(!session[fd] || !(srcsd=session[fd]->session_data))
    return -1;
  for(i=0;i<FD_SETSIZE;i++){
    if(!session[i] || fd==i || !(dstsd=session[i]->session_data))
      continue;
    if(strcmp(dstsd->status.name,RFIFOP(fd,4))==0){
      WFIFOW(i,0)=0x97;
      WFIFOW(i,2)=RFIFOW(fd,2);
      memcpy(WFIFOP(i,4),srcsd->status.name,24);
      memcpy(WFIFOP(i,28),RFIFOP(fd,28),RFIFOW(fd,2)-28);
      WFIFOSET(i,RFIFOW(fd,2));
      break;
    }
  }
  WFIFOW(fd,0)=0x98;
  WFIFOB(fd,2)= i==FD_SETSIZE;
  WFIFOSET(fd,3);
  return 0;
}

int mmo_map_all_nonequip(int fd,unsigned char *buf)
{
  int i,c;
  struct map_session_data *sd;
  struct item *n_item;

  sd=session[fd]->session_data;
  WBUFW(buf,0)=0xa3;
  for(i=c=0;i<MAX_INVENTORY;i++){
    n_item=&sd->status.inventory[i];
    if(n_item->nameid==0 || itemdb_isequip(n_item->nameid))
      continue;
    WBUFW(buf,4+c*10)=i+2;
    WBUFW(buf,4+c*10+2)=n_item->nameid;
    WBUFB(buf,4+c*10+4)=itemdb_type(n_item->nameid);
    WBUFB(buf,4+c*10+5)=n_item->identify;
    WBUFW(buf,4+c*10+6)=n_item->amount;
    WBUFB(buf,4+c*10+8)=0;
    WBUFB(buf,4+c*10+9)=0;	// while equipping arrow 0x80?
    c++;
  }
  if(c==0)
    return 0;
  WBUFW(buf,2)=4+c*10;
  return 4+c*10;
}

int mmo_map_all_equip(int fd,unsigned char *buf)
{
  int i,c;
  struct map_session_data *sd;
  struct item *n_item;

  sd=session[fd]->session_data;
  WBUFW(buf,0)=0xa4;
  for(i=c=0;i<MAX_INVENTORY;i++){
    n_item=&sd->status.inventory[i];
    if(n_item->nameid==0 || !itemdb_isequip(n_item->nameid))
      continue;
    WBUFW(buf,4+c*20)=i+2;
    WBUFW(buf,4+c*20+2)=n_item->nameid;
	//beginning equipment position somewhere?
    WBUFB(buf,4+c*20+4)=itemdb_type(n_item->nameid);
    WBUFB(buf,4+c*20+5)=n_item->identify;
    WBUFW(buf,4+c*20+6)=itemdb_equip_point(n_item->nameid,sd);
    WBUFW(buf,4+c*20+8)=n_item->equip;
    WBUFB(buf,4+c*20+10)=n_item->attribute;
    WBUFB(buf,4+c*20+11)=n_item->refine;
    WBUFW(buf,4+c*20+12)=n_item->card[0];
    WBUFW(buf,4+c*20+14)=n_item->card[1];
    WBUFW(buf,4+c*20+16)=n_item->card[2];
    WBUFW(buf,4+c*20+18)=n_item->card[3];
    c++;
  }
  if(c==0)
    return 0;
  WBUFW(buf,2)=4+c*20;
  return 4+c*20;
}



int mmo_map_set00bd(int fd,unsigned char *buf)
{
  struct map_session_data *sd;

  sd=session[fd]->session_data;

  //R 00bd <status point>.w <STR>.B <STRupP>.B <AGI>.B <AGIupP>.B <VIT>.B <VITupP>.B <INT>.B <INTupP>.B <DEX>.B <DEXupP>.B <LUK>.B <LUKupP>.B <ATK>.w <ATKbonus>.w <MATKmax>.w <MATKmin>.w <DEF>.w <DEFbonus>.w <MDEF>.w <MDEFbonus>.w <HIT>.w <FLEE>.w <FLEEbonus>.w <critical>.w ?.w
  memset(buf,0,packet_len_table[0xbd]);
  WBUFW(buf,0)=0xbd;
  WBUFW(buf,2)=sd->status.status_point;
  WBUFB(buf,4)=sd->status.str;
  WBUFB(buf,5)=calc_need_status_point(sd,SP_STR);
  WBUFB(buf,6)=sd->status.agi;
  WBUFB(buf,7)=calc_need_status_point(sd,SP_AGI);
  WBUFB(buf,8)=sd->status.vit;
  WBUFB(buf,9)=calc_need_status_point(sd,SP_VIT);
  WBUFB(buf,10)=sd->status.int_;
  WBUFB(buf,11)=calc_need_status_point(sd,SP_INT);
  WBUFB(buf,12)=sd->status.dex;
  WBUFB(buf,13)=calc_need_status_point(sd,SP_DEX);
  WBUFB(buf,14)=sd->status.luk;
  WBUFB(buf,15)=calc_need_status_point(sd,SP_LUK);

  WBUFW(buf,16) = sd->status.str + (sd->status.str%10)*(sd->status.str%10) + (sd->status.dex/5);
  WBUFW(buf,18) = 0; // attack bouns
  WBUFW(buf,20) = sd->status.int_ + (sd->status.int_/5)*(sd->status.int_/5);
  WBUFW(buf,22) = sd->status.int_ + (sd->status.int_/7)*(sd->status.int_/7);
  WBUFW(buf,24) = 0; // def
  WBUFW(buf,26) = sd->status.vit;
  WBUFW(buf,28) = 0; // mdef
  WBUFW(buf,30) = sd->status.int_;
  WBUFW(buf,32) = sd->status.base_level + sd->status.dex;
  WBUFW(buf,34) = sd->status.base_level + sd->status.agi;
  WBUFW(buf,36) = (sd->status.luk/10)+1;
  WBUFW(buf,38) = 1+(sd->status.luk/3);
  WBUFW(buf,40) = sd->status.karma;
  WBUFW(buf,42) = sd->status.manner;

  return packet_len_table[0xbd];
}

int mmo_send_selfdata(int fd,struct map_session_data *sd)
{
  int len,i;

  sd->max_weight=10000;
  sd->weight=0;
  sd->status.damage_atk = 0;
  for(i=0;i<MAX_INVENTORY;i++){
    struct item *n_item=&sd->status.inventory[i];
    if(n_item->nameid==0)
      continue;
    sd->weight+=itemdb_weight(n_item->nameid)*n_item->amount;
  }
  // each connection

  // party&guild
  // each load end
  // next exp , weight , skill point
  len=mmo_map_set_param(fd,WFIFOP(fd,0),SP_MAXWEIGHT);
  if(len>0) WFIFOSET(fd,len);
  len=mmo_map_set_param(fd,WFIFOP(fd,0),SP_WEIGHT);
  if(len>0) WFIFOSET(fd,len);
  // item
  len=mmo_map_all_nonequip(fd,WFIFOP(fd,0));
  if(len>0) WFIFOSET(fd,len);
  len=mmo_map_all_equip(fd,WFIFOP(fd,0));
  if(len>0) WFIFOSET(fd,len);
  // status
  len=mmo_map_set00bd(fd,WFIFOP(fd,0));

⌨️ 快捷键说明

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