📄 map.c
字号:
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int map_check_dir(int s_dir,int t_dir)
{
if(s_dir == t_dir)
return 0;
switch(s_dir) {
case 0:
if(t_dir == 7 || t_dir == 1 || t_dir == 0)
return 0;
break;
case 1:
if(t_dir == 0 || t_dir == 2 || t_dir == 1)
return 0;
break;
case 2:
if(t_dir == 1 || t_dir == 3 || t_dir == 2)
return 0;
break;
case 3:
if(t_dir == 2 || t_dir == 4 || t_dir == 3)
return 0;
break;
case 4:
if(t_dir == 3 || t_dir == 5 || t_dir == 4)
return 0;
break;
case 5:
if(t_dir == 4 || t_dir == 6 || t_dir == 5)
return 0;
break;
case 6:
if(t_dir == 5 || t_dir == 7 || t_dir == 6)
return 0;
break;
case 7:
if(t_dir == 6 || t_dir == 0 || t_dir == 7)
return 0;
break;
}
return 1;
}
/*==========================================
* 斵変偺曽岦傪寁嶼
*------------------------------------------
*/
int map_calc_dir( struct block_list *src,int x,int y)
{
int dir=0;
int dx=x-src->x,dy=y-src->y;
if( dx==0 && dy==0 ){ // 斵変偺応強堦抳
dir=0; // 忋
}else if( dx>=0 && dy>=0 ){ // 曽岦揑偵塃忋
dir=7; // 塃忋
if( dx*3-1<dy ) dir=0; // 忋
if( dx>dy*3 ) dir=6; // 塃
}else if( dx>=0 && dy<=0 ){ // 曽岦揑偵塃壓
dir=5; // 塃壓
if( dx*3-1<-dy ) dir=4; // 壓
if( dx>-dy*3 ) dir=6; // 塃
}else if( dx<=0 && dy<=0 ){ // 曽岦揑偵嵍壓
dir=3; // 嵍壓
if( dx*3+1>dy ) dir=4; // 壓
if( dx<dy*3 ) dir=2; // 嵍
}else{ // 曽岦揑偵嵍忋
dir=1; // 嵍忋
if( -dx*3-1<dy ) dir=0; // 忋
if( -dx>dy*3 ) dir=2; // 嵍
}
return dir;
}
// gat宯
/*==========================================
* (m,x,y)偺忬懺傪挷傋傞
*------------------------------------------
*/
int map_getcell(int m,int x,int y)
{
if(x<0 || x>=map[m].xs-1 || y<0 || y>=map[m].ys-1)
return 1;
return map[m].gat[x+y*map[m].xs];
}
/*==========================================
* (m,x,y)偺忬懺傪t偵偡傞
*------------------------------------------
*/
int map_setcell(int m,int x,int y,int t)
{
if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys)
return t;
return map[m].gat[x+y*map[m].xs]=t;
}
/*==========================================
* 懠嶪娗棟偺儅僢僾傪db偵捛壛
*------------------------------------------
*/
int map_setipport(char *name,unsigned long ip,int port)
{
struct map_data *md;
struct map_data_other_server *mdos;
md=strdb_search(map_db,name);
if(md==NULL){ // not exist -> add new data
mdos=calloc(sizeof(*mdos), 1);
if(mdos==NULL){
printf("out of memory : map_setipport\n");
exit(1);
}
memcpy(mdos->name,name,24);
mdos->gat = NULL;
mdos->ip = ip;
mdos->port = port;
strdb_insert(map_db,mdos->name,mdos);
} 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;
}
} else { // update
mdos=(struct map_data_other_server *)md;
mdos->ip = ip;
mdos->port = port;
}
}
return 0;
}
// 弶婜壔廃傝
/*==========================================
* 悈応崅偝愝掕
*------------------------------------------
*/
static struct {
char mapname[24];
int waterheight;
} *waterlist=NULL;
#define NO_WATER 1000000
static int map_waterheight(char *mapname)
{
if(waterlist){
int i;
for(i=0;waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER;i++)
if(strcmp(waterlist[i].mapname,mapname)==0)
return waterlist[i].waterheight;
}
return NO_WATER;
}
static void map_readwater(char *watertxt)
{
char line[1024],w1[1024];
FILE *fp;
int n=0;
fp=fopen(watertxt,"r");
if(fp==NULL){
printf("file not found: %s\n",watertxt);
return;
}
if(waterlist==NULL)
waterlist=calloc(MAX_MAP_PER_SERVER,sizeof(*waterlist));
while(fgets(line,1020,fp) && n < MAX_MAP_PER_SERVER){
int wh,count;
if(line[0] == '/' && line[1] == '/')
continue;
if((count=sscanf(line,"%s%d",w1,&wh)) < 1){
continue;
}
strcpy(waterlist[n].mapname,w1);
if(count >= 2)
waterlist[n].waterheight = wh;
else
waterlist[n].waterheight = 3;
n++;
}
fclose(fp);
}
/*==========================================
* 儅僢僾1枃撉傒崬傒
*------------------------------------------
*/
static int map_readmap(int m,char *fn)
{
unsigned char *gat;
int s;
int x,y,xs,ys;
struct gat_1cell {float high[4]; int type;} *p;
int wh;
size_t size;
// read & convert fn
gat=grfio_read(fn);
if(gat==NULL)
return -1;
printf("\rmap reading [%d/%d] %-20s ",m,map_num,fn);
fflush(stdout);
map[m].m=m;
xs=map[m].xs=*(int*)(gat+6);
ys=map[m].ys=*(int*)(gat+10);
map[m].gat = calloc(s = map[m].xs * map[m].ys, 1);
if(map[m].gat==NULL){
printf("out of memory : map_readmap gat\n");
exit(1);
}
map[m].npc_num=0;
map[m].users=0;
memset(&map[m].flag,0,sizeof(map[m].flag));
wh=map_waterheight(map[m].name);
for(y=0;y<ys;y++){
p=(struct gat_1cell*)(gat+y*xs*20+14);
for(x=0;x<xs;x++){
if(wh!=NO_WATER && p->type==0){
// 悈応敾掕
map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
} else {
map[m].gat[x+y*xs]=p->type;
}
p++;
}
}
free(gat);
map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE;
map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE;
size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
map[m].block = calloc(size, 1);
if(map[m].block == NULL){
printf("out of memory : map_readmap block\n");
exit(1);
}
map[m].block_mob = calloc(size, 1);
if (map[m].block_mob == NULL) {
printf("out of memory : map_readmap block_mob\n");
exit(1);
}
size = map[m].bxs*map[m].bys*sizeof(int);
map[m].block_count = calloc(size, 1);
if(map[m].block_count==NULL){
printf("out of memory : map_readmap block\n");
exit(1);
}
memset(map[m].block_count,0,size);
map[m].block_mob_count=calloc(size, 1);
if(map[m].block_mob_count==NULL){
printf("out of memory : map_readmap block_mob\n");
exit(1);
}
memset(map[m].block_mob_count,0,size);
strdb_insert(map_db,map[m].name,&map[m]);
// printf("%s read done\n",fn);
return 0;
}
/*==========================================
* 慡偰偺map僨乕僞傪撉傒崬傓
*------------------------------------------
*/
int map_readallmap(void)
{
int i;
char fn[256];
// 愭偵慡晹偺儅僢僾偺懚嵼傪妋擣
for(i=0;i<map_num;i++){
if(strstr(map[i].name,".gat")==NULL)
continue;
sprintf(fn,"data\\%s",map[i].name);
grfio_size(fn);
}
for(i=0;i<map_num;i++){
if(strstr(map[i].name,".gat")==NULL)
continue;
sprintf(fn,"data\\%s",map[i].name);
map_readmap(i,fn);
}
free(waterlist);
printf("\rmap read done. (%d map) %24s\n",map_num,"");
return 0;
}
/*==========================================
* 撉傒崬傓map傪捛壛偡傞
*------------------------------------------
*/
int map_addmap(char *mapname)
{
if( strcmpi(mapname,"clear")==0 ){
map_num=0;
return 0;
}
if(map_num>=MAX_MAP_PER_SERVER-1){
printf("too many map\n");
return 1;
}
memcpy(map[map_num].name,mapname,24);
map_num++;
return 0;
}
/*==========================================
* 撉傒崬傓map傪嶍彍偡傞
*------------------------------------------
*/
int map_delmap(char *mapname)
{
int i;
if( strcmpi(mapname,"all")==0 ){
map_num=0;
return 0;
}
for(i=0;i<map_num;i++){
if(strcmp(map[i].name,mapname)==0){
memmove(map+i,map+i+1,sizeof(map[0])*(map_num-i-1));
map_num--;
}
}
return 0;
}
/*==========================================
* 愝掕僼傽僀儖傪撉傒崬傓
*------------------------------------------
*/
int map_config_read(char *cfgName)
{
int i;
char line[1024],w1[1024],w2[1024];
FILE *fp;
struct hostent *h=NULL;
fp=fopen(cfgName,"r");
if(fp==NULL){
printf("file not found: %s\n",cfgName);
return 1;
}
while(fgets(line,1020,fp)){
if(line[0] == '/' && line[1] == '/')
continue;
i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
if(i!=2)
continue;
if(strcmpi(w1,"userid")==0){
chrif_setuserid(w2);
} else if(strcmpi(w1,"passwd")==0){
chrif_setpasswd(w2);
} else if(strcmpi(w1,"char_ip")==0){
h = gethostbyname (w2);
if(h != NULL) {
printf("Character sever IP address : %s -> %d.%d.%d.%d\n",w2,(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
sprintf(w2,"%d.%d.%d.%d",(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
}
chrif_setip(w2);
} else if(strcmpi(w1,"char_port")==0){
chrif_setport(atoi(w2));
} else if(strcmpi(w1,"map_ip")==0){
h = gethostbyname (w2);
if(h != NULL) {
printf("Map server IP address : %s -> %d.%d.%d.%d\n",w2,(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
sprintf(w2,"%d.%d.%d.%d",(unsigned char)h->h_addr[0],(unsigned char)h->h_addr[1],(unsigned char)h->h_addr[2],(unsigned char)h->h_addr[3]);
}
clif_setip(w2);
} else if(strcmpi(w1,"map_port")==0){
clif_setport(atoi(w2));
} else if(strcmpi(w1,"water_height")==0){
map_readwater(w2);
} else if(strcmpi(w1,"gm_account_filename")==0){
pc_set_gm_account_fname(w2);
} else if(strcmpi(w1,"map")==0){
map_addmap(w2);
} else if(strcmpi(w1,"delmap")==0){
map_delmap(w2);
} else if(strcmpi(w1,"npc")==0){
npc_addsrcfile(w2);
} else if(strcmpi(w1,"delnpc")==0){
npc_delsrcfile(w2);
} else if(strcmpi(w1,"data_grf")==0){
grfio_setdatafile(w2);
} else if(strcmpi(w1,"sdata_grf")==0){
grfio_setsdatafile(w2);
} else if(strcmpi(w1,"adata_grf")==0){
grfio_setadatafile(w2);
} else if(strcmpi(w1,"autosave_time")==0){
autosave_interval=atoi(w2)*1000;
if(autosave_interval <= 0)
autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
} else if(strcmpi(w1,"motd_txt")==0){
strcpy(motd_txt,w2);
} else if(strcmpi(w1,"help_txt")==0){
strcpy(help_txt,w2);
} else if(strcmpi(w1,"mapreg_txt")==0){
strcpy(mapreg_txt,w2);
} else if(strcmpi(w1,"import")==0){
map_config_read(w2);
}
}
fclose(fp);
return 0;
}
/*==========================================
* map嶪廔椆帪張棟
*------------------------------------------
*/
void do_final(void)
{
do_final_script();
do_final_itemdb();
do_final_storage();
}
/*==========================================
* map嶪弶婜壔偺戝尦
*------------------------------------------
*/
int do_init(int argc,char *argv[])
{
srand(gettick());
if(map_config_read((argc<2)? MAP_CONF_NAME:argv[1]))
exit(1);
battle_config_read((argc>2)? argv[2]:BATTLE_CONF_FILENAME);
atcommand_config_read((argc>3)? argv[3]:ATCOMMAND_CONF_FILENAME);
script_config_read((argc>4)? argv[4]:SCRIPT_CONF_NAME);
msg_config_read((argc>5)? argv[5]:MSG_CONF_NAME);
atexit(do_final);
id_db = numdb_init();
map_db = strdb_init(16);
nick_db = strdb_init(24);
charid_db = numdb_init();
grfio_init((argc>6)? argv[6]:GRF_PATH_FILENAME);
map_readallmap();
add_timer_func_list(map_clearflooritem_timer,"map_clearflooritem_timer");
do_init_chrif();
do_init_clif();
do_init_itemdb();
do_init_mob(); // npc偺弶婜壔帪撪偱mob_spawn偟偰丄mob_db傪嶲徠偡傞偺偱init_npc傛傝愭
do_init_script();
do_init_npc();
do_init_pc();
do_init_party();
do_init_guild();
do_init_storage();
do_init_skill();
do_init_pet();
npc_event_do_oninit(); // npc偺OnInit僀儀儞僩幚峴
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -