Exemplo n.º 1
0
struct npc_extra_data *nsd_search(struct npc_data *nd, bool create) {
	struct npc_extra_data *nsd = NULL;
	if (nd == NULL)
		return NULL;
	nsd = getFromNPCD(nd, 0);
	if (create == true && nsd == NULL) {
		CREATE(nsd, struct npc_extra_data, 1);
		nsd->items = 0;
		addToNPCD(nd, nsd, 0, true);
	}
Exemplo n.º 2
0
bool atcommand_createnavigationlua_sub(void) {
	int global_mob_idx = 17104;
	int n=0;
	int m;
	int mobidx, npcidx, warpidx;
	FILE *fp_mob, *fp_map, *fp_link, *fp_npc, *fp_npcdist, *fp_linkdist;
	int nlink = 0, nnpc = 0;

	struct s_map_npcdata *map_npcdata = NULL;

	struct walkpath_data_navi wpd;
	memset(&wpd, '\0', sizeof(wpd));

	ShowStatus("Creating navigation LUA files. This can take several minutes.\n");

	if (!createdirectory(DIRECTORYNAME)) {
		ShowError("do_navigationlua: Unable to create output directory.\n");
		return false;
	}

	fp_mob = fopen(DIRECTORYNAME PATHSEP_STR "navi_mob_" NAMESUFFIX ".lua", "wt+");
	fp_map = fopen(DIRECTORYNAME PATHSEP_STR "navi_map_" NAMESUFFIX ".lua", "wt+");
	fp_link = fopen(DIRECTORYNAME PATHSEP_STR "navi_link_" NAMESUFFIX ".lua", "wt+");
	fp_npc = fopen(DIRECTORYNAME PATHSEP_STR "navi_npc_" NAMESUFFIX ".lua", "wt+");
	fp_npcdist = fopen(DIRECTORYNAME PATHSEP_STR "navi_npcdistance_" NAMESUFFIX ".lua", "wt+");
	fp_linkdist = fopen(DIRECTORYNAME PATHSEP_STR "navi_linkdistance_" NAMESUFFIX ".lua", "wt+");

	if( !fp_mob || !fp_map || !fp_link || !fp_npc || !fp_npcdist || !fp_linkdist ) {
		ShowError("do_navigationlua: Unable to open output file.\n");
		return false;
	}

	map_npcdata = (struct s_map_npcdata *)aCalloc(sizeof(struct s_map_npcdata), map->count);

	ShowStatus("Stage 1: creating maps and objects list...\n");

	writeheader(fp_map, "Navi_Map");
	writeheader(fp_mob, "Navi_Mob");
	writeheader(fp_npc, "Navi_Npc");
	writeheader(fp_link, "Navi_Link");
	writeheader(fp_npcdist, "Navi_NpcDistance");
	writeheader(fp_linkdist, "Navi_Distance");

	for( m=0; m < map->count; m++ ) {
		//int nmapnpc=0;

		atcommand_createnavigationlua_sub_map(fp_map, m);

		// Warps/NPCs
		for( npcidx = 0; npcidx < map->list[m].npc_num; npcidx++ ) {
			TBL_NPC *nd = map->list[m].npc[npcidx];
			struct npc_data_append *nda;

			if( !nd )
				continue;

			if( !(nda = getFromNPCD(nd, 0)) ) {
				CREATE(nda,struct npc_data_append,1);
				addToNPCD(nd, nda, 0, true);
			}

			if( nd->subtype == WARP ) {
				int mnext = map->mapindex2mapid(nd->u.warp.mapindex);
				if( mnext < 0 )
					continue;
				nda->npcid = 13350 + nlink;

				atcommand_createnavigationlua_sub_warp(fp_link, nd, mnext, nlink);

				map_npcdata[mnext].inner_warps[map_npcdata[mnext].ninner_warps++] = nd;
				map_npcdata[m].outer_warps[map_npcdata[m].nouter_warps++] = nd;

				nlink++;
			} else {
				if( nd->class_ == -1 || nd->class_ == INVISIBLE_CLASS || nd->class_ == HIDDEN_WARP_CLASS || nd->class_ == FLAG_CLASS )
					continue;

				nda->npcid = 11984 + nnpc;

				atcommand_createnavigationlua_sub_npc(fp_npc, nd, nnpc);

				map_npcdata[m].npcs[map_npcdata[m].nnpcs] = nd;
				map_npcdata[m].nnpcs++;

				nnpc++;
			}
		}

		// Mobs
		for( mobidx=0; mobidx < MAX_MOB_LIST_PER_MAP; mobidx++ ) {
			struct mob_db *mobinfo;

			if( !map->list[m].moblist[mobidx] )
				continue;

			mobinfo = mob->db(map->list[m].moblist[mobidx]->class_);
			if( mobinfo == mob->dummy )
				continue;

			atcommand_createnavigationlua_sub_mob(fp_mob, m, mobinfo, map->list[m].moblist[mobidx]->num, global_mob_idx+n);

			n++;
		}
		ShowStatus("Created %s objects list (%d/%d)\n", map->list[m].name, m+1, map->count);
	}