@go

From Hercules Wiki
Jump to: navigation, search

A lot of people like to change the @go command so that they can add in any new Custom Maps they like or even change the coordinates for old maps. This guide will show you how to add new maps to @go. However, it's extremely easy to change the coordinates of an existing map as well.


Contents

Adding a New Map to @go

Head on over to .../src/map/atcommand.c and search for @go so that you'll get this:

 /*==========================================
  * @go [city_number or city_name] - Updated by Harbin
  *------------------------------------------*/
 ACMD_FUNC(go)
 {
	int i;
	int town;
	char map_name[MAP_NAME_LENGTH];
	int m;
 
	const struct {
		char map[MAP_NAME_LENGTH];
		int x, y;
	} data[] = {
		{ MAP_PRONTERA,    156, 191 }, //  0=Prontera
		{ MAP_MORROC,      156,  93 }, //  1=Morroc
		{ MAP_GEFFEN,      119,  59 }, //  2=Geffen
		{ MAP_PAYON,       162, 233 }, //  3=Payon
		{ MAP_ALBERTA,     192, 147 }, //  4=Alberta
		{ MAP_IZLUDE,      128, 114 }, //  5=Izlude
		{ MAP_ALDEBARAN,   140, 131 }, //  6=Al de Baran
		{ MAP_LUTIE,       147, 134 }, //  7=Lutie
		{ MAP_COMODO,      209, 143 }, //  8=Comodo
		{ MAP_YUNO,        157,  51 }, //  9=Yuno
		{ MAP_AMATSU,      198,  84 }, // 10=Amatsu
		{ MAP_GONRYUN,     160, 120 }, // 11=Gonryun
		{ MAP_UMBALA,       89, 157 }, // 12=Umbala
		{ MAP_NIFLHEIM,     21, 153 }, // 13=Niflheim
		{ MAP_LOUYANG,     217,  40 }, // 14=Louyang
		{ MAP_NOVICE,       53, 111 }, // 15=Training Grounds
		{ MAP_JAIL,         23,  61 }, // 16=Prison
		{ MAP_JAWAII,      249, 127 }, // 17=Jawaii
		{ MAP_AYOTHAYA,    151, 117 }, // 18=Ayothaya
		{ MAP_EINBROCH,     64, 200 }, // 19=Einbroch
		{ MAP_LIGHTHALZEN, 158,  92 }, // 20=Lighthalzen
		{ MAP_EINBECH,      70,  95 }, // 21=Einbech
		{ MAP_HUGEL,        96, 145 }, // 22=Hugel
		{ MAP_RACHEL,      130, 110 }, // 23=Rachel
		{ MAP_VEINS,       216, 123 }, // 24=Veins
		{ MAP_MOSCOVIA,    223, 184 }, // 25=Moscovia
		{ MAP_MIDCAMP,    180, 240 }, // 26=Midgard Camp
		{ MAP_MANUK,       282, 138 }, // 27=Manuk
		{ MAP_SPLENDIDE,   197, 176 }, // 28=Splendide
		{ MAP_BRASILIS,    182, 239 }, // 29=Brasilis
		{ MAP_DICASTES,   198, 187 }, // 30=El Dicastes
		{ MAP_MORA,   44, 151 }, // 31=Mora
		{ MAP_DEWATA,   200, 180 }, // 32=Dewata
		{ MAP_MALANGDO,   140, 114 }, // 33=Malangdo Island
		{ MAP_MALAYA,   242, 211 }, // 34=Malaya Port
		{ MAP_ECLAGE,   110, 39 }, // 35=Eclage
	};

Now, for the purpose of this guide, I'll be adding Glast Heim as a map I want in my @go function. Since Eclage is the last map, I will add my new map after Eclage.


So, find:

 { MAP_ECLAGE,   110, 39 }, // 35=Eclage

and I will add:

<tab><tab>{ MAP_GLAST_01,<tab>123, 234 }, // 36=Glast Heim

right after so that it would look like this (after I've filled in my tabs):

 { MAP_ECLAGE,   110, 39 }, // 35=Eclage
 { MAP_GLAST_01,   123, 234 }, // 36=Glast Heim


Please note that the structure of it is as followed:

<tab><tab>{ MAP_MAPNAME,<tab>Coordinate X, Coordinate Y }, // Number=the location name

Note: As it's C language and not emulator's scripting language, <tab> mentioned above is not really needed. Tabs in the source is just to make the code visually more appealing.


Getting @go to Work

To get the town name as well as with the number working, you need to scroll down a little bit till you see such code:

// get possible name of the city
	map_name[MAP_NAME_LENGTH-1] = '\0';
	for (i = 0; map_name[i]; i++)
		map_name[i] = TOLOWER(map_name[i]);
	// try to identify the map name
	if (strncmp(map_name, "prontera", 3) == 0) {
		town = 0;
	} else if (strncmp(map_name, "morocc", 3) == 0) {
		town = 1;
	} else if (strncmp(map_name, "geffen", 3) == 0) {
		town = 2;
	} else if (strncmp(map_name, "payon", 3) == 0 ||
	           strncmp(map_name, "paion", 3) == 0) {
		town = 3;
	} else if (strncmp(map_name, "alberta", 3) == 0) {
		town = 4;
	} else if (strncmp(map_name, "izlude", 3) == 0 ||
	           strncmp(map_name, "islude", 3) == 0) {
		town = 5;
	} else if (strncmp(map_name, "aldebaran", 3) == 0 ||
	           strcmp(map_name,  "al") == 0) {
		town = 6;
	} else if (strncmp(map_name, "lutie", 3) == 0 ||
	           strcmp(map_name,  "christmas") == 0 ||
	           strncmp(map_name, "xmas", 3) == 0 ||
	           strncmp(map_name, "x-mas", 3) == 0) {
		town = 7;
	} else if (strncmp(map_name, "comodo", 3) == 0) {
		town = 8;
	} else if (strncmp(map_name, "yuno", 3) == 0) {
		town = 9;
	} else if (strncmp(map_name, "amatsu", 3) == 0) {
		town = 10;
	} else if (strncmp(map_name, "gonryun", 3) == 0) {
		town = 11;
	} else if (strncmp(map_name, "umbala", 3) == 0) {
		town = 12;
	} else if (strncmp(map_name, "niflheim", 3) == 0) {
		town = 13;
	} else if (strncmp(map_name, "louyang", 3) == 0) {
		town = 14;
	} else if (strncmp(map_name, "new_1-1", 3) == 0 ||
	           strncmp(map_name, "startpoint", 3) == 0 ||
	           strncmp(map_name, "begining", 3) == 0) {
		town = 15;
	} else if (strncmp(map_name, "sec_pri", 3) == 0 ||
	           strncmp(map_name, "prison", 3) == 0 ||
	           strncmp(map_name, "jails", 3) == 0) {
		town = 16;
	} else if (strncmp(map_name, "jawaii", 3) == 0 ||
	           strncmp(map_name, "jawai", 3) == 0) {
		town = 17;
	} else if (strncmp(map_name, "ayothaya", 3) == 0 ||
	           strncmp(map_name, "ayotaya", 3) == 0) {
		town = 18;
	} else if (strncmp(map_name, "einbroch", 5) == 0 ||
	           strncmp(map_name, "ainbroch", 5) == 0) {
		town = 19;
	} else if (strncmp(map_name, "lighthalzen", 3) == 0) {
		town = 20;
	} else if (strncmp(map_name, "einbech", 3) == 0) {
		town = 21;
	} else if (strncmp(map_name, "hugel", 3) == 0) {
		town = 22;
	} else if (strncmp(map_name, "rachel", 3) == 0) {
		town = 23;
	} else if (strncmp(map_name, "veins", 3) == 0) {
		town = 24;
	} else if (strncmp(map_name, "moscovia", 3) == 0) {
		town = 25;
	} else if (strncmp(map_name, "mid_camp", 3) == 0) {
		town = 26;
	} else if (strncmp(map_name, "manuk", 3) == 0) {
		town = 27;
	} else if (strncmp(map_name, "splendide", 3) == 0) {
		town = 28;
	} else if (strncmp(map_name, "brasilis", 3) == 0) {
		town = 29;
	} else if (strncmp(map_name, "dicastes01", 3) == 0) {
		town = 30;
	} else if (strncmp(map_name, "mora", 3) == 0) {
		town = 31;
	} else if (strncmp(map_name, "dewata", 3) == 0) {
		town = 32;
	} else if (strncmp(map_name, "malangdo", 3) == 0) {
		town = 33;
	} else if (strncmp(map_name, "malaya", 3) == 0) {
		town = 34;
	} else if (strncmp(map_name, "eclage", 3) == 0) {
		town = 35;
	}

Before the last bracket, add the following:

	} else if (strncmp(map_name, "<mapname>", <number of characters required>) == 0) {
		town = <town number>;

Your "<mapname>" is your map's name while <number of characters required> is the number of characters of the name required to be typed so that the town is recognized in @go.

So, for my Glast Heim map, it would be:

} else if (strncmp(map_name, "eclage", 3) == 0) {
 		town = 35;
} else if (strncmp(map_name, "glast_01", 3) == 0) {
 		town = 36;
 	}


Working with mapindex.h

Now, moving forward. Back out from your .../src/map folder and go into .../src/common/mapindex.h. Find:

//Some definitions for the mayor city maps.
#define MAP_PRONTERA "prontera"
#define MAP_GEFFEN "geffen"
#define MAP_MORROC "morocc"
#define MAP_ALBERTA "alberta"
#define MAP_PAYON "payon"
#define MAP_IZLUDE "izlude"
#define MAP_ALDEBARAN "aldebaran"
#define MAP_LUTIE "xmas"
#define MAP_COMODO "comodo"
#define MAP_YUNO "yuno"
#define MAP_AMATSU "amatsu"
#define MAP_GONRYUN "gonryun"
#define MAP_UMBALA "umbala"
#define MAP_NIFLHEIM "niflheim"
#define MAP_LOUYANG "louyang"
#define MAP_JAWAII "jawaii"
#define MAP_AYOTHAYA "ayothaya"
#define MAP_EINBROCH "einbroch"
#define MAP_LIGHTHALZEN "lighthalzen"
#define MAP_EINBECH "einbech"
#define MAP_HUGEL "hugel"
#define MAP_RACHEL "rachel"
#define MAP_VEINS "veins"
#define MAP_JAIL "sec_pri"
#define MAP_NOVICE "new_1-1"
#define MAP_MOSCOVIA "moscovia"
#define MAP_MIDCAMP "mid_camp"
#define MAP_MANUK "manuk"
#define MAP_SPLENDIDE "splendide"
#define MAP_BRASILIS "brasilis"
#define MAP_DICASTES "dicastes01"
#define MAP_MORA "mora"
#define MAP_DEWATA "dewata"
#define MAP_MALANGDO "malangdo"
#define MAP_MALAYA "malaya"
#define MAP_ECLAGE "eclage"

The structure for this is as followed:

#define MAP_MAPNAME "mapname"

In the case of me adding my map, I will do it as so:

#define MAP_GLAST_01 "glast_01"

So that it would look like:

#define MAP_ECLAGE "eclage"
#define MAP_GLAST_01 "glast_01"

Note: There are no tabs

Now, save the source files and recompile the server. And you will have your own custom @go location.

Additional Steps

If you want your map to show up in @go when you do @go, you would need to add it to one more file and this file is called the help.txt. You can find such file by heading to .../conf/help.txt. Search for go: so that you can find this code:

go: "Params: <number/city_name>\n" "Warps you to a city.\n"
	"  -3: (Memo point 2)  14: louyang         31: mora\n"
	"  -2: (Memo point 1)  15: start point     32: dewata\n"
	"  -1: (Memo point 0)  16: prison/jail     33: malangdo island\n"
	"   0: prontera        17: jawaii          34: malaya port\n"
	"   1: morocc          18: ayothaya        35: eclage\n"
	"   2: geffen          19: einbroch\n"
	"   3: payon           20: lighthalzen\n"
	"   4: alberta         21: einbech\n"
	"   5: izlude          22: hugel\n"
	"   6: aldebaran       23: rachel\n"
	"   7: xmas (lutie)    24: veins\n"
	"   8: comodo          25: moscovia\n"
	"   9: yuno            26: midgard camp\n"
	"  10: amatsu          27: manuk\n"
	"  11: gonryun         28: splendide\n"
	"  12: umbala          29: brasilis\n"
	"  13: niflheim        30: el dicastes"

Now, since I want to keep the structure of my maps still intact, I will add my new map right after Eclage once again. To do so, I will just expand the line where geffen and einbroch are by doing such:

"   2: geffen         19: einbroch       36: glast heim\n"

So that after I'm done it would look like this:

go: "Params: <number/city_name>\n" "Warps you to a city.\n"
	"  -3: (Memo point 2)  14: louyang         31: mora\n"
	"  -2: (Memo point 1)  15: start point     32: dewata\n"
	"  -1: (Memo point 0)  16: prison/jail     33: malangdo island\n"
	"   0: prontera        17: jawaii          34: malaya port\n"
	"   1: morocc          18: ayothaya        35: eclage\n"
	"   2: geffen          19: einbroch        36: glast heim\n"
	"   3: payon           20: lighthalzen\n"
	"   4: alberta         21: einbech\n"
	"   5: izlude          22: hugel\n"
	"   6: aldebaran       23: rachel\n"
	"   7: xmas (lutie)    24: veins\n"
	"   8: comodo          25: moscovia\n"
	"   9: yuno            26: midgard camp\n"
	"  10: amatsu          27: manuk\n"
	"  11: gonryun         28: splendide\n"
	"  12: umbala          29: brasilis\n"
	"  13: niflheim        30: el dicastes"

Note: Make sure that you align everything by adding spaces!