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 + -
显示快捷键?