diff options
Diffstat (limited to 'src/map/map.c')
-rw-r--r-- | src/map/map.c | 152 |
1 files changed, 122 insertions, 30 deletions
diff --git a/src/map/map.c b/src/map/map.c index ee597789c..d402ac06c 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -403,12 +403,13 @@ int map_count_oncell(int m, int x, int y) { /* * «»«E¾ªÎõÌôøªË̸ªÄª±ª¿«¹««Eæ«Ë«Ã«ÈªòÚ÷ª¹ */ -struct skill_unit *map_find_skill_unit_oncell(int m,int x,int y,int skill_id) +struct skill_unit *map_find_skill_unit_oncell(struct block_list *target,int x,int y,int skill_id,struct skill_unit *out_unit) { - int bx,by; + int m,bx,by; struct block_list *bl; int i,c; struct skill_unit *unit; + m = target->m; if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys)) return NULL; @@ -421,7 +422,10 @@ struct skill_unit *map_find_skill_unit_oncell(int m,int x,int y,int skill_id) if (bl->x != x || bl->y != y || bl->type != BL_SKILL) continue; unit = (struct skill_unit *) bl; - if (unit->alive && unit->group->skill_id == skill_id) + if (unit==out_unit || !unit->alive || + !unit->group || unit->group->skill_id!=skill_id) + continue; + if (battle_check_target(&unit->bl,target,unit->group->target_flag)>0) return unit; } return NULL; @@ -1622,7 +1626,7 @@ struct map_session_data * map_nick2sd(char *nick) { struct block_list * map_id2bl(int id) { struct block_list *bl=NULL; - if(id<sizeof(objects)/sizeof(objects[0])) + if(id >= 0 && id < sizeof(objects)/sizeof(objects[0])) bl = objects[id]; else bl = (struct block_list*)numdb_search(id_db,id); @@ -1826,7 +1830,7 @@ int map_getcell(int m,int x,int y,cell_t cellchk) int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk) { - int j; + int type; nullpo_ret(m); if(x<0 || x>=m->xs-1 || y<0 || y>=m->ys-1) @@ -1834,24 +1838,28 @@ int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk) if(cellchk==CELL_CHKNOPASS) return 1; return 0; } - j=x+y*m->xs; + type = m->gat[x+y*m->xs]; + if (cellchk<0x10) + type &= CELL_MASK; switch(cellchk) { case CELL_CHKPASS: - return (m->gat[j] != 1 && m->gat[j] != 5); + return (type!=1 && type!=5); case CELL_CHKNOPASS: - return (m->gat[j] == 1 || m->gat[j] == 5); + return (type==1 || type==5); case CELL_CHKWALL: - return (m->gat[j] == 1); - case CELL_CHKNPC: - return (m->gat[j]&0x80); + return (type==1); case CELL_CHKWATER: - return (m->gat[j] == 3); + return (type==3); case CELL_CHKGROUND: - return (m->gat[j] == 5); + return (type==5); case CELL_GETTYPE: - return m->gat[j]; + return type; + case CELL_CHKNPC: + return (type&CELL_NPC); + case CELL_CHKBASILICA: + return (type&CELL_BASILICA); default: return 0; } @@ -1868,10 +1876,20 @@ void map_setcell(int m,int x,int y,int cell) return; j=x+y*map[m].xs; - if (cell == CELL_SETNPC) - map[m].gat[j] |= 0x80; - else - map[m].gat[j] = cell; + switch (cell) { + case CELL_SETNPC: + map[m].gat[j] |= CELL_NPC; + break; + case CELL_SETBASILICA: + map[m].gat[j] |= CELL_BASILICA; + break; + case CELL_CLRBASILICA: + map[m].gat[j] &= ~CELL_BASILICA; + break; + default: + map[m].gat[j] = (map[m].gat[j]&~CELL_MASK) + cell; + break; + } } /*========================================== @@ -1889,15 +1907,39 @@ int map_setipport(char *name,unsigned long ip,int port) { mdos->gat = NULL; mdos->ip = ip; mdos->port = port; + mdos->map = NULL; strdb_insert(map_db,mdos->name,mdos); + } else if(md->gat){ + if(ip!=clif_getip() || port!=clif_getport()){ + // “Ç‚Ýž‚ñ‚Å‚¢‚½‚¯‚ÇA’S“–ŠO‚É‚È‚Á‚½ƒ}ƒbƒv + mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server)); + memcpy(mdos->name,name,24); + mdos->gat = NULL; + mdos->ip = ip; + mdos->port = port; + mdos->map = md; + strdb_insert(map_db,mdos->name,mdos); + // printf("from char server : %s -> %08lx:%d\n",name,ip,port); + } else { + // “Ç‚Ýž‚ñ‚Å‚¢‚ÄA’S“–‚É‚È‚Á‚½ƒ}ƒbƒvi‰½‚à‚µ‚È‚¢j + ; + } } else { - if(md->gat){ // local -> check data - if(ip!=clif_getip() || port!=clif_getport()){ - printf("from char server : %s -> %08lx:%d\n",name,ip,port); - return 1; + mdos=(struct map_data_other_server *)md; + if(ip == clif_getip() && port == clif_getport()) { + // Ž©•ª‚Ì’S“–‚É‚È‚Á‚½ƒ}ƒbƒv + if(mdos->map == NULL) { + // “Ç‚Ýž‚ñ‚Å‚¢‚È‚¢‚Ì‚ÅI—¹‚·‚é + printf("map_setipport : %s is not loaded.\n",name); + exit(1); + } else { + // “Ç‚Ýž‚ñ‚Å‚¢‚é‚Ì‚Å’u‚«Š·‚¦‚é + md = mdos->map; + free(mdos); + strdb_insert(map_db,md->name,md); } - } else { // update - mdos=(struct map_data_other_server *)md; + } else { + // ‘¼‚ÌŽI‚Ì’S“–ƒ}ƒbƒv‚È‚Ì‚Å’u‚«Š·‚¦‚邾‚¯ mdos->ip = ip; mdos->port = port; } @@ -1905,6 +1947,56 @@ int map_setipport(char *name,unsigned long ip,int port) { return 0; } +/*========================================== + * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ð‘S‚Äíœ + *------------------------------------------ + */ +int map_eraseallipport_sub(void *key,void *data,va_list va) { + struct map_data_other_server *mdos = (struct map_data_other_server*)data; + if(mdos->gat == NULL && mdos->map == NULL) { + strdb_erase(map_db,key); + free(mdos); + } + return 0; +} + +int map_eraseallipport(void) { + strdb_foreach(map_db,map_eraseallipport_sub); + return 1; +} + +/*========================================== + * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ðdb‚©‚çíœ + *------------------------------------------ + */ +int map_eraseipport(char *name,unsigned long ip,int port) +{ + struct map_data *md; + struct map_data_other_server *mdos; +// unsigned char *p=(unsigned char *)&ip; + + md=strdb_search(map_db,name); + if(md){ + if(md->gat) // local -> check data + return 0; + else { + mdos=(struct map_data_other_server *)md; + if(mdos->ip==ip && mdos->port == port) { + if(mdos->map) { + // ‚±‚̃}ƒbƒvŽI‚Å‚à“Ç‚Ýž‚ñ‚Å‚¢‚é‚̂ňړ®‚Å‚«‚é + return 1; // ŒÄ‚Ño‚µŒ³‚Å chrif_sendmap() ‚ð‚·‚é + } else { + strdb_erase(map_db,name); + free(mdos); + } +// if(battle_config.etc_log) +// printf("erase map %s %d.%d.%d.%d:%d\n",name,p[0],p[1],p[2],p[3],port); + } + } + } + return 0; +} + // ‰Šú‰»Žü‚è /*========================================== * …ê‚‚³Ý’è @@ -2043,7 +2135,7 @@ static void map_cache_close(void) fwrite(map_cache.map,map_cache.head.nmaps,sizeof(struct map_cache_info),map_cache.fp); } fclose(map_cache.fp); - free(map_cache.map); + aFree(map_cache.map); map_cache.fp = NULL; return; } @@ -2085,16 +2177,16 @@ int map_cache_read(struct map_data *m) if(fread(buf,1,size_compress,map_cache.fp) != size_compress) { // ‚È‚º‚©ƒtƒ@ƒCƒ‹Œã”¼‚ªŒ‡‚¯‚Ä‚é‚Ì‚Å“Ç‚Ý’¼‚µ printf("fread error\n"); - m->xs = 0; m->ys = 0; m->gat = NULL; - free(m->gat); free(buf); + free(m->gat); m->xs = 0; m->ys = 0; m->gat = NULL; + free(buf); return 0; } dest_len = m->xs * m->ys; decode_zip(m->gat,&dest_len,buf,size_compress); if(dest_len != map_cache.map[i].xs * map_cache.map[i].ys) { // ³í‚ɉ𓀂ªo—ˆ‚Ä‚È‚¢ - m->xs = 0; m->ys = 0; m->gat = NULL; - free(m->gat); free(buf); + free(m->gat); m->xs = 0; m->ys = 0; m->gat = NULL; + free(buf); return 0; } free(buf); @@ -3069,7 +3161,7 @@ void do_final(void) { strdb_final(nick_db, nick_db_final); numdb_final(charid_db, charid_db_final); - + do_final_chrif(); // ‚±‚Ì“à•”‚ŃLƒƒƒ‰‚ð‘S‚ÄØ’f‚·‚é do_final_script(); do_final_itemdb(); do_final_storage(); |