Преглед на файлове

Bugfixes
* Fixed WE_MALE and WE_FEMALE up to You to not consume HP/SP when it's below 10%. (bugreport:3546)
* Fixed WE_CALLPARTNER, WE_CALLPARENT, and WE_CALLBABY to not recall target if they are autotrading. (bugreport:2479)
* Fixed WE_BABY not checking for parents if they are in the same party and in the area. (bugreport:2518)
* Fixed Dragon Breath - Water not requiring a dragon. (bugreport:8237)
* Added a new config 'char_del_option' to set whether email or birthdate should be used for deleting characters. (bugreport:8240)
* Follow up to 9a5a6b9. Fixed a missing define check for 2013 clients when deleting a character. (bugreport:8399)
* Fixed Weapon Refining to use clif_upgrademessage. (bugreport:2135)
* Fixed script command 'prompt' not ending script state when player selects Cancel from menu. (bugreport:7932)
* Fixed nomineeffect display on GvG enabled maps. (bugreport:7754)
Others
* All items, except for Cash items, can no longer be used when storage is open.
* Defined constants for a lot of item and monster IDs used throughout the source.
* Follow up to 0f2dd7f. Corrected a change to the wrong hostname array.

aleos89 преди 11 години
родител
ревизия
7a9aa7fbcf
променени са 16 файла, в които са добавени 477 реда и са изтрити 215 реда
  1. 8 0
      conf/char_athena.conf
  2. 3 1
      conf/msg_conf/map_msg.conf
  3. 1 1
      db/re/skill_require_db.txt
  4. 13 4
      src/char/char.c
  5. 2 2
      src/login/account_sql.c
  6. 9 15
      src/map/clif.c
  7. 12 12
      src/map/elemental.c
  8. 15 0
      src/map/elemental.h
  9. 1 1
      src/map/guild.c
  10. 233 25
      src/map/itemdb.h
  11. 17 0
      src/map/mob.h
  12. 46 48
      src/map/pc.c
  13. 1 1
      src/map/script.c
  14. 115 95
      src/map/skill.c
  15. 0 10
      src/map/skill.h
  16. 1 0
      src/map/status.c

+ 8 - 0
conf/char_athena.conf

@@ -152,6 +152,14 @@ char_del_level: 0
 // NOTE: Requires client 2010-08-03aragexeRE or newer.
 char_del_delay: 86400
 
+// Restrict character deletion by email address or birthdate.
+// This restricts players from changing the langtype and deleting characters.
+// For birthdate, the client must be 20100803 or newer.
+// 1: Email address
+// 2: Birthdate (default)
+// 3: Email address or Birthdate
+char_del_option: 2
+
 // What folder the DB files are in (item_db.txt, etc.)
 db_path: db
 

+ 3 - 1
conf/msg_conf/map_msg.conf

@@ -406,7 +406,9 @@
 385: You're not allowed to change emblem during WOE
 386: The chosen emblem was detected invalid
 387: The chosen emblem was detected invalid as it contain too much transparency (limit=%d)
-//388-389 free
+//etc
+388: You cannot use this item while storage is open.
+//389-389 free
 //NoAsk
 390: Autorejecting is activated.
 391: Autorejecting is deactivated.

+ 1 - 1
db/re/skill_require_db.txt

@@ -960,7 +960,7 @@
 5001,0,0,22:34:46:58:70,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GC_DARKCROW#Dark Claw#
 5002,0,0,100:120:140:160:180,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RA_UNLIMIT#Unlimited#
 5003,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,970,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GN_ILLUSIONDOPING#Illusion Doping#
-5004,0,0,30:35:40:45:50:55:60:65:70:75,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RK_DRAGONBREATH_WATER#Dragon Breath - Water#
+5004,0,0,30:35:40:45:50:55:60:65:70:75,0,0,0,99,0,0,dragon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RK_DRAGONBREATH_WATER#Dragon Breath - Water#
 5005,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//RK_LUXANIMA#Lux Anima#
 5006,0,0,60:70:80:90:100,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//NC_MAGMA_ERUPTION#Magma Eruption#
 5007,0,0,200:230:260:290:320,0,0,0,13:14,0,0,none,0,0,6144,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WM_FRIGG_SONG#Frigg's Song#

+ 13 - 4
src/char/char.c

@@ -110,8 +110,9 @@ char unknown_char_name[NAME_LENGTH] = "Unknown"; // Name to use when the request
 #define TRIM_CHARS "\255\xA0\032\t\x0A\x0D " //The following characters are trimmed regardless because they cause confusion and problems on the servers. [Skotlex]
 char char_name_letters[1024] = ""; // list of letters/symbols allowed (or not) in a character name. by [Yor]
 
-int char_del_level = 0; //From which level u can delete character [Lupus]
+int char_del_level = 0; //From which level you can delete character [Lupus]
 int char_del_delay = 86400;
+int char_del_option = 2; // Character deletion type, email = 1, birthdate = 2 (default)
 
 int log_char = 1;	// loggin char or not [devil]
 int log_inter = 1;	// loggin inter or not [devil]
@@ -1924,7 +1925,11 @@ int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
 	offset += MAP_NAME_LENGTH_EXT;
 #endif
 #if PACKETVER >= 20100803
+#if PACKETVER > 201300000
 	WBUFL(buf,124) = (p->delete_date?TOL(p->delete_date-time(NULL)):0);
+#else
+	WBUFL(buf,124) = TOL(p->delete_date);
+#endif
 	offset += 4;
 #endif
 #if PACKETVER >= 20110111
@@ -4132,7 +4137,7 @@ static void char_delete2_accept(int fd, struct char_session_data* sd)
 		return;
 	}
 
-	if( ( char_del_level > 0 && base_level >= (unsigned int)char_del_level ) || ( char_del_level < 0 && base_level <= (unsigned int)(-char_del_level) ) )
+	if( ( char_del_level > 0 && base_level >= (unsigned int)char_del_level ) || ( char_del_level < 0 && base_level <= (unsigned int)(-char_del_level) ) || !char_del_option&2 )
 	{// character level config restriction
 		char_delete2_accept_ack(fd, char_id, 2);
 		return;
@@ -4522,11 +4527,13 @@ int parse_char(int fd)
 			RFIFOSKIP(fd,( cmd == 0x68) ? 46 : 56);
 
 			// Check if e-mail is correct
-			if(strcmpi(email, sd->email) && //email does not matches and
+			if((strcmpi(email, sd->email) && //email does not matches and
 			(
 				strcmp("a@a.com", sd->email) || //it is not default email, or
 				(strcmp("a@a.com", email) && strcmp("", email)) //email sent does not matches default
-			)) {	//Fail
+			))
+				|| !char_del_option&1
+			) {	//Fail
 				WFIFOHEAD(fd,3);
 				WFIFOW(fd,0) = 0x70;
 				WFIFOB(fd,2) = 0; // 00 = Incorrect Email address
@@ -5602,6 +5609,8 @@ int char_config_read(const char* cfgName)
 			char_del_level = atoi(w2);
 		} else if (strcmpi(w1, "char_del_delay") == 0) {
 			char_del_delay = atoi(w2);
+		} else if (strcmpi(w1, "char_del_option") == 0) {
+			char_del_option = atoi(w2);
 		} else if(strcmpi(w1,"db_path")==0) {
 			safestrncpy(db_path, w2, sizeof(db_path));
 		} else if (strcmpi(w1, "console") == 0) {

+ 2 - 2
src/login/account_sql.c

@@ -23,14 +23,14 @@ typedef struct AccountDB_SQL
 	Sql* accounts;       // SQL accounts storage
 
 	// global sql settings
-	char   global_db_hostname[64]; // Doubled for long hostnames (bugreport:8003)
+	char   global_db_hostname[32];
 	uint16 global_db_port;
 	char   global_db_username[32];
 	char   global_db_password[32];
 	char   global_db_database[32];
 	char   global_codepage[32];
 	// local sql settings
-	char   db_hostname[32];
+	char   db_hostname[64]; // Doubled for long hostnames (bugreport:8003)
 	uint16 db_port;
 	char   db_username[32];
 	char   db_password[32];

+ 9 - 15
src/map/clif.c

@@ -5710,7 +5710,7 @@ void clif_maptypeproperty2(struct block_list *bl,enum send_target t) {
 	WBUFB(buf,4) = ((map_flag_vs(bl->m))?0x01:0); //tvt ?
 	WBUFB(buf,4) |= ((map_flag_gvg(bl->m))?0x02:0); //gvg
 	WBUFB(buf,4) |= ((map_flag_gvg2(bl->m))?0x04:0); //siege
-	WBUFB(buf,4) |= ((map[bl->m].flag.nomineeffect)?0:0x08); //mineffect @FIXME what this do
+	WBUFB(buf,4) |= (map[bl->m].flag.nomineeffect || !map_flag_gvg2(bl->m))?0:0x08; //disable mine effect on nomineeffect map and enable it on gvgmap by default
 	WBUFB(buf,4) |= ((map[bl->m].flag.nolockon)?0x10:0); //nolockon 0x10 @FIXME what this do
 	WBUFB(buf,4) |= ((map[bl->m].flag.pvp)?0x20:0); //countpk
 	WBUFB(buf,4) |= 0; //nopartyformation 0x40
@@ -6084,9 +6084,9 @@ void clif_item_refine_list(struct map_session_data *sd)
 	fd=sd->fd;
 
 	refine_item[0] = -1;
-	refine_item[1] = pc_search_inventory(sd,1010);
-	refine_item[2] = pc_search_inventory(sd,1011);
-	refine_item[3] = refine_item[4] = pc_search_inventory(sd,984);
+	refine_item[1] = pc_search_inventory(sd,ITEMID_PHARCON);
+	refine_item[2] = pc_search_inventory(sd,ITEMID_EMVERETARCON);
+	refine_item[3] = refine_item[4] = pc_search_inventory(sd,ITEMID_ORIDECON);
 
 	WFIFOHEAD(fd, MAX_INVENTORY * 13 + 4);
 	WFIFOW(fd,0)=0x221;
@@ -8201,20 +8201,14 @@ void clif_callpartner(struct map_session_data *sd)
 
 	WBUFW(buf,0) = 0x1e6;
 
-	if( sd->status.partner_id )
-	{
-		const char *p;
-		if( ( p = map_charid2nick(sd->status.partner_id) ) != NULL )
-		{
+	if( sd->status.partner_id ) {
+		const char *p = map_charid2nick(sd->status.partner_id);
+		struct map_session_data *p_sd = pc_get_partner(sd);
+		if( p != NULL && p_sd != NULL && !p_sd->state.autotrade )
 			memcpy(WBUFP(buf,2), p, NAME_LENGTH);
-		}
 		else
-		{
 			WBUFB(buf,2) = 0;
-		}
-	}
-	else
-	{// Send zero-length name if no partner, to initialize the client buffer.
+	} else {// Send zero-length name if no partner, to initialize the client buffer.
 		WBUFB(buf,2) = 0;
 	}
 

+ 12 - 12
src/map/elemental.c

@@ -101,24 +101,24 @@ int elemental_create(struct map_session_data *sd, int class_, unsigned int lifet
 
 	//per individual bonuses
 	switch(db->class_){
-	case 2114:	case 2115:
-	case 2116: //ATK + (Summon Agni Skill Level x 20) / HIT + (Summon Agni Skill Level x 10)
+	case ELEMENTALID_AGNI_S:	case ELEMENTALID_AGNI_M:
+	case ELEMENTALID_AGNI_L: //ATK + (Summon Agni Skill Level x 20) / HIT + (Summon Agni Skill Level x 10)
 		ele.atk += i * 20;
 		ele.atk2 += i * 20;
 		ele.hit += i * 10;
 		break;
-	case 2117:	case 2118:
-	case 2119: //MDEF + (Summon Aqua Skill Level x 10) / MATK + (Summon Aqua Skill Level x 20)
+	case ELEMENTALID_AQUA_S:	case ELEMENTALID_AQUA_M:
+	case ELEMENTALID_AQUA_L: //MDEF + (Summon Aqua Skill Level x 10) / MATK + (Summon Aqua Skill Level x 20)
 		ele.mdef += i * 10;
 		ele.matk += i * 20;
 		break;
-	case 2120:	case 2121:
-	case 2122: //FLEE + (Summon Ventus Skill Level x 20) / MATK + (Summon Ventus Skill Level x 10)
+	case ELEMENTALID_VENTUS_S:	case ELEMENTALID_VENTUS_M:
+	case ELEMENTALID_VENTUS_L: //FLEE + (Summon Ventus Skill Level x 20) / MATK + (Summon Ventus Skill Level x 10)
 		ele.flee += i * 20;
 		ele.matk += i * 10;
 		break;
-	case 2123:	case 2124:
-	case 2125: //DEF + (Summon Tera Skill Level x 25) / ATK + (Summon Tera Skill Level x 5)
+	case ELEMENTALID_TERA_S:	case ELEMENTALID_TERA_M:
+	case ELEMENTALID_TERA_L: //DEF + (Summon Tera Skill Level x 25) / ATK + (Summon Tera Skill Level x 5)
 		ele.def += i * 25;
 		ele.atk += i * 5;
 		ele.atk2 += i * 5;
@@ -659,12 +659,12 @@ static int elemental_ai_sub_timer(struct elemental_data *ed, struct map_session_
 		int sp = 5;
 
 		switch(ed->vd->class_){
-			case 2115:	case 2118:
-			case 2121:	case 2124:
+			case ELEMENTALID_AGNI_M:	case ELEMENTALID_AQUA_M:
+			case ELEMENTALID_VENTUS_M:	case ELEMENTALID_TERA_M:
 				sp = 8;
 				break;
-			case 2116:	case 2119:
-			case 2122:	case 2125:
+			case ELEMENTALID_AGNI_L:	case ELEMENTALID_AQUA_L:
+			case ELEMENTALID_VENTUS_L:	case ELEMENTALID_TERA_L:
 				sp = 11;
 				break;
 		}

+ 15 - 0
src/map/elemental.h

@@ -19,6 +19,21 @@
 #define EL_SKILLMODE_ASSIST 0x2
 #define EL_SKILLMODE_AGGRESSIVE 0x4
 
+elemental_elementalid {
+	ELEMENTALID_AGNI_S = 2114,
+	ELEMENTALID_AGNI_M,
+	ELEMENTALID_AGNI_L,
+	ELEMENTALID_AQUA_S,
+	ELEMENTALID_AQUA_M,
+	ELEMENTALID_AQUA_L,
+	ELEMENTALID_VENTUS_S,
+	ELEMENTALID_VENTUS_M,
+	ELEMENTALID_VENTUS_L,
+	ELEMENTALID_TERA_S,
+	ELEMENTALID_TERA_M,
+	ELEMENTALID_TERA_L,
+};
+
 struct elemental_skill {
 	unsigned short id, lv;
 	short mode;

+ 1 - 1
src/map/guild.c

@@ -383,7 +383,7 @@ int guild_create(struct map_session_data *sd, const char *name)
 		clif_guild_created(sd,1);
 		return 0;
 	}
-	if( battle_config.guild_emperium_check && pc_search_inventory(sd,714) == -1 )
+	if( battle_config.guild_emperium_check && pc_search_inventory(sd,ITEMID_EMPERIUM) == -1 )
 	{// item required
 		clif_guild_created(sd,3);
 		return 0;

+ 233 - 25
src/map/itemdb.h

@@ -41,26 +41,128 @@
 
 ///Enum of item id (for hardcoded purpose)
 enum item_itemid {
-	ITEMID_EMPERIUM = 714,
-	ITEMID_YELLOW_GEMSTONE = 715,
-	ITEMID_RED_GEMSTONE = 716,
-	ITEMID_BLUE_GEMSTONE = 717,
-	ITEMID_TRAP = 1065,
-	ITEMID_STRANGE_EMBRYO = 6415,
-	ITEMID_STONE = 7049,
-	ITEMID_SKULL_ = 7420,
-	ITEMID_TOKEN_OF_SIEGFRIED = 7621,
-	ITEMID_TRAP_ALLOY = 7940,
-	ITEMID_ANCILLA = 12333,
-	ITEMID_REINS_OF_MOUNT = 12622,
+	ITEMID_RED_POTION					= 501,
+	ITEMID_YELLOW_POTION				= 503,
+	ITEMID_WHITE_POTION					= 504,
+	ITEMID_BLUE_POTION					= 505,
+	ITEMID_RED_SLIM_POTION				= 545,
+	ITEMID_YELLOW_SLIM_POTION			= 546,
+	ITEMID_WHITE_SLIM_POTION			= 547,
+	ITEMID_WING_OF_FLY					= 601,
+	ITEMID_WING_OF_BUTTERFLY			= 602,
+	ITEMID_BRANCH_OF_DEAD_TREE			= 604,
+	ITEMID_ANODYNE						= 605,
+	ITEMID_ALOEBERA						= 606,
+	ITEMID_EMPTY_BOTTLE					= 713,
+	ITEMID_EMPERIUM						= 714,
+	ITEMID_YELLOW_GEMSTONE				= 715,
+	ITEMID_RED_GEMSTONE					= 716,
+	ITEMID_BLUE_GEMSTONE				= 717,
+	ITEMID_ALCOHOL						= 970,
+	ITEMID_ORIDECON						= 984,
+	ITEMID_ANVIL						= 986
+	ITEMID_ORIDECON_AVNIL				= 987,
+	ITEMID_GOLDEN_ANVIL					= 988,
+	ITEMID_EMPERIUM_ANVIL				= 989,
+	ITEMID_BLOODY_RED					= 990,
+	ITEMID_CRYSTAL_BLUE					= 991,
+	ITEMID_WIND_OF_VERDURE				= 992,
+	ITEMID_YELLOW_LIVE					= 993,
+	ITEMID_FLAME_HEART					= 994,
+	ITEMID_MISTIC_FROZEN				= 995,
+	ITEMID_ROUGH_WIND					= 996,
+	ITEMID_GREAT_NATURE					= 997,
+	ITEMID_IRON							= 998,
+	ITEMID_STEEL						= 999,
+	ITEMID_STAR_CRUMB					= 1000,
+	ITEMID_PHRACON						= 1010,
+	ITEMID_EMVERETARCON					= 1011,
+	ITEMID_TRAP							= 1065,
+	ITEMID_STRANGE_EMBRYO				= 6415,
+	ITEMID_STONE						= 7049,
+	ITEMID_FIRE_BOTTLE					= 7135,
+	ITEMID_ACID_BOTTLE					= 7136,
+	ITEMID_MAN_EATER_BOTTLE				= 7137,
+	ITEMID_MINI_BOTTLE					= 7138,
+	ITEMID_COATING_BOTTLE				= 7139,
+	ITEMID_FRAGMENT_OF_CRYSTAL			= 7321,
+	ITEMID_SKULL_						= 7420,
+	ITEMID_TOKEN_OF_SIEGFRIED			= 7621,
+	ITEMID_TRAP_ALLOY					= 7940,
+	ITEMID_RED_POUCH_OF_SURPRISE		= 12024,
+	ITEMID_BLOODY_DEAD_BRANCH			= 12103,
+	ITEMID_PORING_BOX					= 12109,
+	ITEMID_MERCENARY_RED_POTION			= 12184,
+	ITEMID_MERCENARY_BLUE_POTION		= 12185,
+	ITEMID_BATTLE_MANUAL				= 12208,
+	ITEMID_BUBBLE_GUM					= 12210,
+	ITEMID_GIANT_FLY_WING				= 12212,
+	ITEMID_NEURALIZER					= 12213,
+	ITEMID_M_CENTER_POTION				= 12241,
+	ITEMID_M_AWAKENING_POTION			= 12242,
+	ITEMID_M_BERSERK_POTION				= 12243,
+	ITEMID_COMP_BATTLE_MANUAL			= 12263,
+	ITEMID_THICK_BATTLE_MANUAL			= 12312,
+	ITEMID_ANCILLA						= 12333,
+	ITEMID_DUN_TELE_SCROLL3				= 12352,
+	ITEMID_REINS_OF_MOUNT				= 12622,
+	ITEMID_COMP_BUBBLE_GUM				= 12264,
+	ITEMID_NOBLE_NAMEPLATE				= 12705,
+	ITEMID_TREASURE_CHEST_SUMMONED_II	= 12863,
+	ITEMID_DUN_TELE_SCROLL1				= 14527,
+	ITEMID_BATTLE_MANUAL25				= 14532,
+	ITEMID_BATTLE_MANUAL100				= 14533,
+	ITEMID_BATTLE_MANUAL300				= 14545,
+	ITEMID_DUN_TELE_SCROLL2				= 14581,
+	ITEMID_WOB_RUNE						= 14582,
+	ITEMID_WOB_SCHWALTZ					= 14583,
+	ITEMID_WOB_RACHEL					= 14584,
+	ITEMID_WOB_LOCAL					= 14585,
+	ITEMID_SIEGE_TELEPORT_SCROLL		= 14591,
+	ITEMID_JOB_MANUAL50					= 14592,
 };
 
 /**
- * Rune Knight
- **/
+ * Mercenary Scrolls
+ */
+enum mercenary_scroll_item_list {
+	ITEMID_BOW_MERCENARY_SCROLL1 = 12153,
+	ITEMID_BOW_MERCENARY_SCROLL2,
+	ITEMID_BOW_MERCENARY_SCROLL3,
+	ITEMID_BOW_MERCENARY_SCROLL4,
+	ITEMID_BOW_MERCENARY_SCROLL5,
+	ITEMID_BOW_MERCENARY_SCROLL6,
+	ITEMID_BOW_MERCENARY_SCROLL7,
+	ITEMID_BOW_MERCENARY_SCROLL8,
+	ITEMID_BOW_MERCENARY_SCROLL9,
+	ITEMID_BOW_MERCENARY_SCROLL10,
+	ITEMID_SWORDMERCENARY_SCROLL1,
+	ITEMID_SWORDMERCENARY_SCROLL2,
+	ITEMID_SWORDMERCENARY_SCROLL3,
+	ITEMID_SWORDMERCENARY_SCROLL4,
+	ITEMID_SWORDMERCENARY_SCROLL5,
+	ITEMID_SWORDMERCENARY_SCROLL6,
+	ITEMID_SWORDMERCENARY_SCROLL7,
+	ITEMID_SWORDMERCENARY_SCROLL8,
+	ITEMID_SWORDMERCENARY_SCROLL9,
+	ITEMID_SWORDMERCENARY_SCROLL10,
+	ITEMID_SPEARMERCENARY_SCROLL1,
+	ITEMID_SPEARMERCENARY_SCROLL2,
+	ITEMID_SPEARMERCENARY_SCROLL3,
+	ITEMID_SPEARMERCENARY_SCROLL4,
+	ITEMID_SPEARMERCENARY_SCROLL5,
+	ITEMID_SPEARMERCENARY_SCROLL6,
+	ITEMID_SPEARMERCENARY_SCROLL7,
+	ITEMID_SPEARMERCENARY_SCROLL8,
+	ITEMID_SPEARMERCENARY_SCROLL9,
+	ITEMID_SPEARMERCENARY_SCROLL10,
+};
 
-enum rune_list {
-	ITEMID_NAUTHIZ = 12725,
+/**
+ * Rune Knight
+ */
+enum rune_item_list {
+	ITEMID_NAUTHIZ		= 12725,
 	ITEMID_RAIDO,
 	ITEMID_BERKANA,
 	ITEMID_ISA,
@@ -69,13 +171,13 @@ enum rune_list {
 	ITEMID_THURISAZ,
 	ITEMID_WYRD,
 	ITEMID_HAGALAZ,
-	ITEMID_LUX_ANIMA = 22540
+	ITEMID_LUX_ANIMA	= 22540,
 };
 
 /**
  * Mechanic
- **/
-enum mecha_item_list {
+ */
+enum mechanic_item_list {
 	ITEMID_ACCELERATOR = 2800,
 	ITEMID_HOVERING_BOOSTER,
 	ITEMID_SUICIDAL_DEVICE,
@@ -89,6 +191,112 @@ enum mecha_item_list {
 	ITEMID_SPECIAL_COOLER,
 };
 
+/**
+ * Genetic
+ */
+enum genetic_item_list {
+	ITEMID_SEED_OF_HORNY_PLANT			= 6210,
+	ITEMID_BLOODSUCK_PLANT_SEED			= 6211,
+	ITEMID_BOMB_MUSHROOM_SPORE			= 6212,
+	ITEMID_HP_INCREASE_POTION_SMALL		= 12422,
+	ITEMID_HP_INCREASE_POTION_MEDIUM,
+	ITEMID_HP_INCREASE_POTION_LARGE,
+	ITEMID_SP_INCREASE_POTION_SMALL,
+	ITEMID_SP_INCREASE_POTION_MEDIUM,
+	ITEMID_SP_INCREASE_POTION_LARGE,
+	ITEMID_CONCENTRATED_WHITE_POTION_Z,
+	ITEMID_SAVAGE_FULL_ROAST,
+	ITEMID_COCKTAIL_WARG_BLOOD,
+	ITEMID_MINOR_STEW,
+	ITEMID_SIROMA_ICED_TEA,
+	ITEMID_DROSERA_HERB_SALAD,
+	ITEMID_PETITE_TAIL_NOODLES,
+	ITEMID_BLACK_MASS,
+	ITEMID_VITATA500,
+	ITEMID_CONCENTRATED_CEROMAIN_SOUP,
+	ITEMID_CURE_FREE					= 12475,
+	ITEMID_APPLE_BOMB					= 13260,
+	ITEMID_COCONUT_BOMB,
+	ITEMID_MELON_BOMB,
+	ITEMID_PINEAPPLE_BOMB,
+	ITEMID_BANANA_BOMB,
+	ITEMID_BLACK_LUMP,
+	ITEMID_BLACK_HARD_LUMP,
+	ITEMID_VERY_HARD_LUMP,
+	ITEMID_MYSTERIOUS_POWDER,
+	ITEMID_BOOST500_TO_THROW,
+	ITEMID_FULL_SWINGK_TO_THROW,
+	ITEMID_MANA_PLUS_TO_THROW,
+	ITEMID_CURE_FREE_TO_THROW,
+	ITEMID_STAMINA_UP_M_TO_THROW,
+	ITEMID_DIGESTIVE_F_TO_THROW,
+	ITEMID_HP_INC_POTS_TO_THROW,
+	ITEMID_HP_INC_POTM_TO_THROW,
+	ITEMID_HP_INC_POTL_TO_THROW,
+	ITEMID_SP_INC_POTS_TO_THROW,
+	ITEMID_SP_INC_POTM_TO_THROW,
+	ITEMID_SP_INC_POTL_TO_THROW,
+	ITEMID_EN_WHITE_POTZ_TO_THROW,
+	ITEMID_VITATA500_TO_THROW,
+	ITEMID_EN_CEL_JUICE_TO_THROW,
+	ITEMID_SAVAGE_BBQ_TO_THROW,
+	ITEMID_WUG_COCKTAIL_TO_THROW,
+	ITEMID_M_BRISKET_TO_THROW,
+	ITEMID_SIROMA_ICETEA_TO_THROW,
+	ITEMID_DROCERA_STEW_TO_THROW,
+	ITEMID_PETTI_NOODLE_TO_THROW,
+	ITEMID_BLACK_THING_TO_THROW,
+};
+
+/**
+ * Guillotine Cross
+ */
+enum poison_item_list {
+	ITEMID_PARALYSE = 12717,
+	ITEMID_LEECHESEND,
+	ITEMID_OBLIVIONCURSE,
+	ITEMID_DEATHHURT,
+	ITEMID_TOXIN,
+	ITEMID_PYREXIA,
+	ITEMID_MAGICMUSHROOM,
+	ITEMID_VENOMBLEED,
+};
+
+/**
+ * Spell Books
+ */
+enum spell_book_item_list {
+	ITEMID_MAGIC_BOOK_FB = 6189,
+	ITEMID_MAGIC_BOOK_CB,
+	ITEMID_MAGIC_BOOK_LB,
+	ITEMID_MAGIC_BOOK_SG,
+	ITEMID_MAGIC_BOOK_LOV,
+	ITEMID_MAGIC_BOOK_MS,
+	ITEMID_MAGIC_BOOK_CM,
+	ITEMID_MAGIC_BOOK_TV,
+	ITEMID_MAGIC_BOOK_TS,
+	ITEMID_MAGIC_BOOK_JT,
+	ITEMID_MAGIC_BOOK_WB,
+	ITEMID_MAGIC_BOOK_HD,
+	ITEMID_MAGIC_BOOK_ES,
+	ITEMID_MAGIC_BOOK_ES_,
+	ITEMID_MAGIC_BOOK_CL,
+	ITEMID_MAGIC_BOOK_CR,
+	ITEMID_MAGIC_BOOK_DL,
+};
+
+/**
+ * Cash Food
+ */
+enum cash_food_item_list {
+	ITEMID_STR_DISH10_  = 12202,
+	ITEMID_AGI_DISH10_,
+	ITEMID_INT_DISH10_,
+	ITEMID_DEX_DISH10_,
+	ITEMID_LUK_DISH10_,
+	ITEMID_VIT_DISH10_,
+};
+
 enum item_nouse_list {
 	NOUSE_SITTING = 0x01,
 };
@@ -213,13 +421,13 @@ struct item_data* itemdb_exists(int nameid);
 #define itemdb_viewid(n) (itemdb_search(n)->view_id)
 #define itemdb_autoequip(n) (itemdb_search(n)->flag.autoequip)
 #define itemdb_is_rune(n) ((n >= ITEMID_NAUTHIZ && n <= ITEMID_HAGALAZ) || n == ITEMID_LUX_ANIMA)
-#define itemdb_is_element(n) (n >= 990 && n <= 993)
-#define itemdb_is_spellbook(n) (n >= 6188 && n <= 6205)
-#define itemdb_is_poison(n) (n >= 12717 && n <= 12724)
+#define itemdb_is_element(n) (n >= ITEMID_CRYSTAL_BLUE && n <= ITEMID_YELLOW_LIVE)
+#define itemdb_is_spellbook(n) (n >= ITEMID_MAGIC_BOOK_FB && n <= ITEMID_MAGIC_BOOK_DL)
+#define itemdb_is_poison(n) (n >= ITEMID_PARALYSE && n <= ITEMID_VENOMBLEED)
 #define itemid_isgemstone(id) ( (id) >= ITEMID_YELLOW_GEMSTONE && (id) <= ITEMID_BLUE_GEMSTONE )
-#define itemdb_iscashfood(id) ( (id) >= 12202 && (id) <= 12207 )
-#define itemdb_is_GNbomb(n) (n >= 13260 && n <= 13267)
-#define itemdb_is_GNthrowable(n) (n >= 13268 && n <= 13290)
+#define itemdb_iscashfood(id) ( (id) >= ITEMID_STR_DISH10_ && (id) <= ITEMID_VIT_DISH10_ )
+#define itemdb_is_GNbomb(n) (n >= ITEMID_APPLE_BOMB && n <= ITEMID_VERY_HARD_LUMP)
+#define itemdb_is_GNthrowable(n) (n >= ITEMID_MYSTERIOUS_POWDER && n <= ITEMID_BLACK_THING_TO_THROW)
 const char* itemdb_typename(int type);
 
 int itemdb_group_bonus(struct map_session_data* sd, int itemid);

+ 17 - 0
src/map/mob.h

@@ -42,6 +42,23 @@
 extern const int mob_manuk[8];
 extern const int mob_splendide[5];
 
+mob_mobid {
+	MOBID_MARINE_SPHERE		= 1142,
+	MOBID_G_PARASITE		= 1555,
+	MOBID_G_FLORA			= 1575,
+	MOBID_G_HYDRA			= 1579,
+	MOBID_G_MANDRAGORA		= 1589,
+	MOBID_G_GEOGRAPHER		= 1590,
+	MOBID_SILVERSNIPER		= 2042,
+	MOBID_MAGICDECOY_FIRE,
+	MOBID_MAGICDECOY_WATER,
+	MOBID_MAGICDECOY_EARTH,
+	MOBID_MAGICDECOY_WIND,
+	MOBID_S_HORNET			= 2158,
+	MOBID_S_GIANT_HORNET,
+	MOBID_S_LUCIOLA_VESPA,
+};
+
 //Mob skill states.
 enum MobSkillState {
 	MSS_ANY = -1,

+ 46 - 48
src/map/pc.c

@@ -4288,91 +4288,90 @@ int pc_isUseitem(struct map_session_data *sd,int n)
 		return 0; // You cannot use this item while sitting.
 	}
 
-	switch( nameid ) //@TODO, lot of hardcoded nameid here
-	{
-		case 605: // Anodyne
+	if (sd->state.storage_flag && item->type != IT_CASH) {
+		clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd,388));
+		return 0; // You cannot use this item while storage is open.
+	}
+
+	switch( nameid ) {
+		case ITEMID_ANODYNE:
 			if( map_flag_gvg(sd->bl.m) )
 				return 0;
-		case 606:
+		case ITEMID_ALOEBERA:
 			if( pc_issit(sd) )
 				return 0;
 			break;
-		case 601: // Fly Wing
-		case 12212: // Giant Fly Wing
-			if( map[sd->bl.m].flag.noteleport || map_flag_gvg(sd->bl.m) )
-			{
+		case ITEMID_WING_OF_FLY:
+		case ITEMID_GIANT_FLY_WING:
+			if( map[sd->bl.m].flag.noteleport || map_flag_gvg(sd->bl.m) ) {
 				clif_skill_teleportmessage(sd,0);
 				return 0;
 			}
-		case 602: // ButterFly Wing
-		case 14527: // Dungeon Teleport Scroll
-		case 14581: // Dungeon Teleport Scroll 2
-		case 12352: // Dungeon Teleport Scroll 3
-		case 14582: // Yellow Butterfly Wing
-		case 14583: // Green Butterfly Wing
-		case 14584: // Red Butterfly Wing
-		case 14585: // Blue Butterfly Wing
-		case 14591: // Siege Teleport Scroll
-			if( sd->duel_group && !battle_config.duel_allow_teleport )
-			{
+		case ITEMID_WING_OF_BUTTERFLY:
+		case ITEMID_DUN_TELE_SCROLL1:
+		case ITEMID_DUN_TELE_SCROLL2:
+		case ITEMID_DUN_TELE_SCROLL3:
+		case ITEMID_WOB_RUNE:
+		case ITEMID_WOB_SCHWALTZ:
+		case ITEMID_WOB_RACHEL:
+		case ITEMID_WOB_LOCAL:
+		case ITEMID_SIEGE_TELEPORT_SCROLL:
+			if( sd->duel_group && !battle_config.duel_allow_teleport ) {
 				clif_displaymessage(sd->fd, msg_txt(sd,663));
 				return 0;
 			}
 			if( nameid != 601 && nameid != 12212 && map[sd->bl.m].flag.noreturn )
 				return 0;
 			break;
-		case 604: // Dead Branch
-		case 12024: // Red Pouch
-		case 12103: // Bloody Branch
-		case 12109: // Poring Box
-		case 12863: // Treasure_Chest_Summoned_II
+		case ITEMID_BRANCH_OF_DEAD_TREE:
+		case ITEMID_RED_POUCH_OF_SURPRISE:
+		case ITEMID_BLOODY_DEAD_BRANCH:
+		case ITEMID_PORING_BOX:
+		case ITEMID_TREASURE_CHEST_SUMMONED_II:
 			if( map[sd->bl.m].flag.nobranch || map_flag_gvg(sd->bl.m) )
 				return 0;
 			break;
-		case 12210: // Bubble Gum
-		case 12264: // Comp Bubble Gum
+		case ITEMID_BUBBLE_GUM:
+		case ITEMID_COMP_BUBBLE_GUM:
 			if( sd->sc.data[SC_ITEMBOOST] )
 				return 0;
 			break;
-		case 12208: // Battle Manual
-		case 12263: // Comp Battle Manual
-		case 12312: // Thick Battle Manual
-		case 12705: // Noble Nameplate
-		case 14532: // Battle_Manual25
-		case 14533: // Battle_Manual100
-		case 14545: // Battle_Manual300
+		case ITEMID_BATTLE_MANUAL:
+		case ITEMID_COMP_BATTLE_MANUAL:
+		case ITEMID_THICK_BATTLE_MANUAL:
+		case ITEMID_NOBLE_NAMEPLATE:
+		case ITEMID_BATTLE_MANUAL25:
+		case ITEMID_BATTLE_MANUAL100:
+		case ITEMID_BATTLE_MANUAL300:
 			if( sd->sc.data[SC_EXPBOOST] )
 				return 0;
 			break;
-		case 14592: // JOB_Battle_Manual
+		case ITEMID_JOB_MANUAL50:
 			if( sd->sc.data[SC_JEXPBOOST] )
 				return 0;
 			break;
-
-		// Mercenary Items
-
-		case 12184: // Mercenary's Red Potion
-		case 12185: // Mercenary's Blue Potion
-		case 12241: // Mercenary's Concentration Potion
-		case 12242: // Mercenary's Awakening Potion
-		case 12243: // Mercenary's Berserk Potion
+		case ITEMID_MERCENARY_RED_POTION:
+		case ITEMID_MERCENARY_BLUE_POTION:
+		case ITEMID_M_CENTER_POTION:
+		case ITEMID_M_AWAKENING_POTION:
+		case ITEMID_M_BERSERK_POTION:
 			if( sd->md == NULL || sd->md->db == NULL )
 				return 0;
 			if (sd->md->sc.data[SC_BERSERK] || sd->md->sc.data[SC_SATURDAYNIGHTFEVER])
 				return 0;
-			if( nameid == 12242 && sd->md->db->lv < 40 )
+			if( nameid == ITEMID_M_AWAKENING_POTION && sd->md->db->lv < 40 )
 				return 0;
-			if( nameid == 12243 && sd->md->db->lv < 80 )
+			if( nameid == ITEMID_M_BERSERK_POTION && sd->md->db->lv < 80 )
 				return 0;
 			break;
 
-		case 12213: //Neuralizer
+		case ITEMID_NEURALIZER:
 			if( !map[sd->bl.m].flag.reset )
 				return 0;
 			break;
 	}
 
-	if( nameid >= 12153 && nameid <= 12182 && sd->md != NULL )
+	if( nameid >= ITEMID_BOW_MERCENARY_SCROLL1 && nameid <= ITEMID_SPEARMERCENARY_SCROLL10 && sd->md != NULL )
 		return 0; // Mercenary Scrolls
 
 	/**
@@ -4422,8 +4421,7 @@ int pc_isUseitem(struct map_session_data *sd,int n)
 		return 0;
 
 	//Dead Branch & Bloody Branch & Porings Box
-	// FIXME: outdated, use constants or database
-	if( nameid == 604 || nameid == 12103 || nameid == 12109 || nameid == 12863 )
+	if( nameid == ITEMID_BRANCH_OF_DEAD_TREE || nameid == ITEMID_BLOODY_DEAD_BRANCH || nameid == ITEMID_PORING_BOX || nameid == ITEMID_TREASURE_CHEST_SUMMONED_II )
 		log_branch(sd);
 
 	return 1;

+ 1 - 1
src/map/script.c

@@ -4796,7 +4796,7 @@ BUILDIN_FUNC(prompt)
 		sd->state.menu_or_input = 0;
 		pc_setreg(sd, add_str("@menu"), 0xff);
 		script_pushint(st, 0xff);
-		st->state = RUN;
+		st->state = END;
 	}
 	else
 	{// return selected option

+ 115 - 95
src/map/skill.c

@@ -2619,7 +2619,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 			//Spirit of Wizard blocks Kaite's reflection
 			if( type == 2 && tsc && tsc->data[SC_SPIRIT] && tsc->data[SC_SPIRIT]->val2 == SL_WIZARD )
 			{	//Consume one Fragment per hit of the casted skill? [Skotlex]
-				type = tsd?pc_search_inventory (tsd, 7321):0;
+				type = tsd?pc_search_inventory (tsd, ITEMID_FRAGMENT_OF_CRYSTAL):0;
 				if (type >= 0) {
 					if ( tsd ) pc_delitem(tsd, type, 1, 0, 1, LOG_TYPE_CONSUME);
 					dmg.damage = dmg.damage2 = 0;
@@ -6784,7 +6784,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		if (sd) {
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 			//Prepare 200 White Potions.
-			if (!skill_produce_mix(sd, skill_id, 504, 0, 0, 0, 200))
+			if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_POTION, 0, 0, 0, 200))
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 		}
 		break;
@@ -6792,28 +6792,28 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		if (sd) {
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 			//Prepare 200 Slim White Potions.
-			if (!skill_produce_mix(sd, skill_id, 547, 0, 0, 0, 200))
+			if (!skill_produce_mix(sd, skill_id, ITEMID_WHITE_SLIM_POTION, 0, 0, 0, 200))
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 		}
 		break;
 	case AM_TWILIGHT3:
 		if (sd) {
-			int ebottle = pc_search_inventory(sd,713);
+			int ebottle = pc_search_inventory(sd,ITEMID_EMPTY_BOTTLE);
 			if( ebottle >= 0 )
 				ebottle = sd->status.inventory[ebottle].amount;
 			//check if you can produce all three, if not, then fail:
-			if (!skill_can_produce_mix(sd,970,-1, 100) //100 Alcohol
-				|| !skill_can_produce_mix(sd,7136,-1, 50) //50 Acid Bottle
-				|| !skill_can_produce_mix(sd,7135,-1, 50) //50 Flame Bottle
+			if (!skill_can_produce_mix(sd,ITEMID_ALCOHOL,-1, 100) //100 Alcohol
+				|| !skill_can_produce_mix(sd,ITEMID_ACID_BOTTLE,-1, 50) //50 Acid Bottle
+				|| !skill_can_produce_mix(sd,ITEMID_FIRE_BOTTLE,-1, 50) //50 Flame Bottle
 				|| ebottle < 200 //200 empty bottle are required at total.
 			) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				break;
 			}
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
-			skill_produce_mix(sd, skill_id, 970, 0, 0, 0, 100);
-			skill_produce_mix(sd, skill_id, 7136, 0, 0, 0, 50);
-			skill_produce_mix(sd, skill_id, 7135, 0, 0, 0, 50);
+			skill_produce_mix(sd, skill_id, ITEMID_ALCOHOL, 0, 0, 0, 100);
+			skill_produce_mix(sd, skill_id, ITEMID_ACID_BOTTLE, 0, 0, 0, 50);
+			skill_produce_mix(sd, skill_id, ITEMID_FIRE_BOTTLE, 0, 0, 0, 50);
 		}
 		break;
 	case SA_DISPELL:
@@ -7253,14 +7253,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		break;
 
 	case WE_MALE:
-		{
+		if( status_get_hp(bl) < status_get_max_hp(bl) / 10 ) {
 			int hp_rate=(!skill_lv)? 0:skill_get_hp_rate(skill_id, skill_lv);
 			int gain_hp= tstatus->max_hp*abs(hp_rate)/100; // The earned is the same % of the target HP than it costed the caster. [Skotlex]
 			clif_skill_nodamage(src,bl,skill_id,status_heal(bl, gain_hp, 0, 0),1);
 		}
 		break;
 	case WE_FEMALE:
-		{
+		if( status_get_sp(bl) < status_get_max_sp(bl) / 10 ) {
 			int sp_rate=(!skill_lv)? 0:skill_get_sp_rate(skill_id, skill_lv);
 			int gain_sp=tstatus->max_sp*abs(sp_rate)/100;// The earned is the same % of the target SP than it costed the caster. [Skotlex]
 			clif_skill_nodamage(src,bl,skill_id,status_heal(bl, 0, gain_sp, 0),1);
@@ -7272,8 +7272,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		if(sd){
 			struct map_session_data *f_sd = pc_get_father(sd);
 			struct map_session_data *m_sd = pc_get_mother(sd);
+			struct block_list *b_bl = map_id2bl(sd->bl.id);
+			struct block_list *f_bl = map_id2bl(f_sd->bl.id);
+			struct block_list *m_bl = map_id2bl(m_sd->bl.id);
 			// if neither was found
-			if(!f_sd && !m_sd){
+			if( (!f_sd && !m_sd) || (sd->status.party_id != 0 && sd->status.party_id != f_sd->status.party_id && sd->status.party_id != m_sd->status.party_id) || (!check_distance_bl(b_bl, f_bl, AREA_SIZE) && !check_distance_bl(b_bl, m_bl, AREA_SIZE)) ) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				map_freeblock_unlock();
 				return 0;
@@ -9728,7 +9731,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		   skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv));
 	   break;
 	case MH_SUMMON_LEGION: {
-		int summons[5] = {2158, 2159, 2159, 2160, 2160};
+		int summons[5] = {MOBID_S_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_GIANT_HORNET, MOBID_S_LUCIOLA_VESPA, MOBID_S_LUCIOLA_VESPA};
 		int qty[5] =     {3   , 3   , 4   , 4   , 5};
 		struct mob_data *sum_md;
 		int i,c=0;
@@ -9914,7 +9917,20 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 			case WE_CALLPARTNER:
 				if(sd) clif_callpartner(sd);
 			case WE_CALLPARENT:
+				if(sd) {
+					struct map_session_data *f_sd = pc_get_father(sd);
+					struct map_session_data *m_sd = pc_get_mother(sd);
+
+					if( f_sd->state.autotrade || m_sd->state.autotrade )
+						break;
+				}
 			case WE_CALLBABY:
+				if(sd) {
+					struct map_session_data *c_sd = pc_get_child(sd);
+
+					if( c_sd->state.autotrade )
+						break;
+				}
 			case AM_RESURRECTHOMUN:
 			case PF_SPIDERWEB:
 				//Find a random spot to place the skill. [Skotlex]
@@ -10652,9 +10668,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 	case AM_SPHEREMINE:
 	case AM_CANNIBALIZE:
 		{
-			int summons[5] = { 1589, 1579, 1575, 1555, 1590 };
-			//int summons[5] = { 1020, 1068, 1118, 1500, 1368 };
-			int class_ = skill_id==AM_SPHEREMINE?1142:summons[skill_lv-1];
+			int summons[5] = { MOBID_G_MANDRAGORA, MOBID_G_HYDRA, MOBID_G_FLORA, , MOBID_G_GEOGRAPHER };
+			int class_ = skill_id==AM_SPHEREMINE?MOBID_MARINE_SPHERE:summons[skill_lv-1];
 			int ai = (skill_id == AM_SPHEREMINE) ? AI_SPHERE : AI_FLORA;
 			struct mob_data *md;
 
@@ -14135,10 +14150,9 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
 		case AM_CANNIBALIZE:
 		case AM_SPHEREMINE: {
 			int c=0;
-			int summons[5] = { 1589, 1579, 1575, 1555, 1590 };
-			//int summons[5] = { 1020, 1068, 1118, 1500, 1368 };
+			int summons[5] = { MOBID_G_MANDRAGORA, MOBID_G_HYDRA, MOBID_G_FLORA, MOBID_G_PARASITE, MOBID_G_MANDRAGORA };
 			int maxcount = (skill_id==AM_CANNIBALIZE)? 6-skill_lv : skill_get_maxcount(skill_id,skill_lv);
-			int mob_class = (skill_id==AM_CANNIBALIZE)? summons[skill_lv-1] :1142;
+			int mob_class = (skill_id==AM_CANNIBALIZE)? summons[skill_lv-1] :MOBID_MARINE_SPHERE;
 			if(battle_config.land_skill_limit && maxcount>0 && (battle_config.land_skill_limit&BL_PC)) {
 				i = map_foreachinmap(skill_check_condition_mob_master_sub ,sd->bl.m, BL_MOB, sd->bl.id, mob_class, skill_id, &c);
 				if(c >= maxcount ||
@@ -14154,13 +14168,13 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
 		case NC_MAGICDECOY: {
 				int c = 0, j;
 				int maxcount = skill_get_maxcount(skill_id,skill_lv);
-				int mob_class = 2042;
+				int mob_class = MOBID_SILVERSNIPER;
 				if( skill_id == NC_MAGICDECOY )
-					mob_class = 2043;
+					mob_class = MOBID_MAGICDECOY_FIRE;
 
 				if( battle_config.land_skill_limit && maxcount > 0 && ( battle_config.land_skill_limit&BL_PC ) ) {
 					if( skill_id == NC_MAGICDECOY ) {
-						for( j = mob_class; j <= 2046; j++ )
+						for( j = mob_class; j <= MOBID_MAGICDECOY_WIND; j++ )
 							map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, j, skill_id, &c);
 					} else
 						map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, mob_class, skill_id, &c);
@@ -15212,21 +15226,25 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
 	if (idx >= 0 && idx < MAX_INVENTORY)
 	{
 		int i = 0, ep = 0, per;
-		int material[5] = { 0, 1010, 1011, 984, 984 };
+		int material[5] = { 0, ITEMID_PHRACON, ITEMID_EMVERETARCON, ITEMID_ORIDECON, ITEMID_ORIDECON, };
 		struct item *item;
 		struct item_data *ditem = sd->inventory_data[idx];
 		item = &sd->status.inventory[idx];
 
 		if(item->nameid > 0 && ditem->type == IT_WEAPON)
 		{
-			if( item->refine >= sd->menuskill_val
-			||  item->refine >= 10		// if it's no longer refineable
-			||  ditem->flag.no_refine 	// if the item isn't refinable
-			||  (i = pc_search_inventory(sd, material [ditem->wlv])) < 0 )
-			{
+			if( ditem->flag.no_refine ) { 	// if the item isn't refinable
 				clif_skill_fail(sd,sd->menuskill_id,USESKILL_FAIL_LEVEL,0);
 				return;
 			}
+			if( item->refine >= sd->menuskill_val || item->refine >= 10 ) {
+				clif_upgrademessage(sd->fd, 2, item->nameid);
+				return;
+			}
+			if( (i = pc_search_inventory(sd, material [ditem->wlv])) < 0 ) {
+				clif_upgrademessage(sd->fd, 3, material[ditem->wlv]);
+				return;
+			}
 			per = status_get_refine_chance(ditem->wlv, (int)item->refine);
 			if( sd->class_&JOBL_THIRD )
 				per += 10;
@@ -15242,9 +15260,10 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
 					ep = item->equip;
 					pc_unequipitem(sd,idx,3);
 				}
-				clif_refine(sd->fd,0,idx,item->refine);
 				clif_delitem(sd,idx,1,3);
-				clif_additem(sd,idx,1,0);
+				clif_upgrademessage(sd->fd, 0, item->nameid);
+				clif_inventorylist(sd);
+				clif_refine(sd->fd,0,idx,item->refine);
 				if (ep)
 					pc_equipitem(sd,idx,ep);
 				clif_misceffect(&sd->bl,3);
@@ -15268,6 +15287,7 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
 				item->refine = 0;
 				if(item->equip)
 					pc_unequipitem(sd,idx,3);
+				clif_upgrademessage(sd->fd, 1, item->nameid);
 				clif_refine(sd->fd,1,idx,item->refine);
 				pc_delitem(sd,idx,1,0,2, LOG_TYPE_OTHER);
 				clif_misceffect(&sd->bl,2);
@@ -16964,14 +16984,14 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 		j = pc_search_inventory(sd,slot[i]);
 		if(j < 0)
 			continue;
-		if(slot[i]==1000){	/* Star Crumb */
+		if(slot[i]==ITEMID_STAR_CRUMB){
 			pc_delitem(sd,j,1,1,0,LOG_TYPE_PRODUCE);
 			sc++;
 		}
-		if(slot[i]>=994 && slot[i]<=997 && ele==0){	/* Flame Heart . . . Great Nature */
+		if(slot[i]>=ITEMID_FLAME_HEART && slot[i]<=ITEMID_GREAT_NATURE && ele==0){
 			static const int ele_table[4]={3,1,4,2};
 			pc_delitem(sd,j,1,1,0,LOG_TYPE_PRODUCE);
-			ele=ele_table[slot[i]-994];
+			ele=ele_table[slot[i]-ITEMID_FLAME_HEART];
 		}
 	}
 
@@ -17037,13 +17057,13 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 				i = pc_checkskill(sd,skill_id);
 				make_per = sd->status.job_level*20 + status->dex*10 + status->luk*10; //Base chance
 				switch(nameid){
-					case 998: // Iron
+					case ITEMID_IRON:
 						make_per += 4000+i*500; // Temper Iron bonus: +26/+32/+38/+44/+50
 						break;
-					case 999: // Steel
+					case ITEMID_STEEL:
 						make_per += 3000+i*500; // Temper Steel bonus: +35/+40/+45/+50/+55
 						break;
-					case 1000: //Star Crumb
+					case ITEMID_STAR_CRUMB:
 						make_per = 100000; // Star Crumbs are 100% success crafting rate? (made 1000% so it succeeds even after penalties) [Skotlex]
 						break;
 					default: // Enchanted Stones
@@ -17074,32 +17094,32 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 						make_per += skill*100; //+1% bonus per level
 				}
 				switch(nameid){
-					case 501: // Red Potion
-					case 503: // Yellow Potion
-					case 504: // White Potion
+					case ITEMID_RED_POTION:
+					case ITEMID_YELLOW_POTION:
+					case ITEMID_WHITE_POTION:
 						make_per += (1+rnd()%100)*10 + 2000;
 						break;
-					case 970: // Alcohol
+					case ITEMID_ALCOHOL:
 						make_per += (1+rnd()%100)*10 + 1000;
 						break;
-					case 7135: // Bottle Grenade
-					case 7136: // Acid Bottle
-					case 7137: // Plant Bottle
-					case 7138: // Marine Sphere Bottle
+					case ITEMID_FIRE_BOTTLE:
+					case ITEMID_ACID_BOTTLE:
+					case ITEMID_MAN_EATER_BOTTLE:
+					case ITEMID_MINI_BOTTLE:
 						make_per += (1+rnd()%100)*10;
 						break;
-					case 546: // Condensed Yellow Potion
+					case ITEMID_YELLOW_SLIM_POTION:
 						make_per -= (1+rnd()%50)*10;
 						break;
-					case 547: // Condensed White Potion
-					case 7139: // Glistening Coat
+					case ITEMID_WHITE_SLIM_POTION:
+					case ITEMID_COATING_BOTTLE:
 						make_per -= (1+rnd()%100)*10;
 						break;
 					//Common items, recieve no bonus or penalty, listed just because they are commonly produced
-					case 505: // Blue Potion
-					case 545: // Condensed Red Potion
-					case 605: // Anodyne
-					case 606: // Aloevera
+					case ITEMID_BLUE_POTION:
+					case ITEMID_RED_SLIM_POTION:
+					case ITEMID_ANODYNE:
+					case ITEMID_ALOEBERA:
 					default:
 						break;
 				}
@@ -17166,22 +17186,22 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 								(sd->status.base_level-100) + pc_checkskill(sd, AM_LEARNINGPOTION) + pc_checkskill(sd, CR_FULLPROTECTION)*(4+rnd()%6); // (Caster?s Base Level - 100) + (Potion Research x 5) + (Full Chemical Protection Skill Level) x (Random number between 4 ~ 10)
 
 					switch(nameid){// difficulty factor
-						case 12422:	case 12425:
-						case 12428:
+						case ITEMID_HP_INCREASE_POTION_SMALL:	case ITEMID_SP_INCREASE_POTION_SMALL:
+						case ITEMID_CONCENTRATED_WHITE_POTION_Z:
 							difficulty += 10;
 							break;
-						case 6212:	case 12426:
+						case ITEMID_BOMB_MUSHROOM_SPORE:		case ITEMID_SP_INCREASE_POTION_MEDIUM:
 							difficulty += 15;
 							break;
-						case 13264:	case 12423:
-						case 12427:	case 12436:
+						case ITEMID_BANANA_BOMB:				case ITEMID_HP_INCREASE_POTION_MEDIUM:
+						case ITEMID_SP_INCREASE_POTION_LARGE:	case ITEMID_VITATA500:
 							difficulty += 20;
 							break;
-						case 6210:	case 6211:
-						case 12437:
+						case ITEMID_SEED_OF_HORNY_PLANT:		case ITEMID_BLOODSUCK_PLANT_SEED:
+						case ITEMID_CONCENTRATED_CEROMAIN_SOUP:
 							difficulty += 30;
 							break;
-						case 12424:	case 12475:
+						case ITEMID_HP_INCREASE_POTION_LARGE:	case ITEMID_CURE_FREE:
 							difficulty += 40;
 							break;
 					}
@@ -17208,18 +17228,18 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 					qty = ~(5 + rnd()%5) + 1;
 
 					switch(nameid){// difficulty factor
-						case 13260:
+						case ITEMID_APPLE_BOMB:
 							difficulty += 5;
 							break;
-						case 13261:	case 13262:
+						case ITEMID_COCONUT_BOMB:	case ITEMID_MELON_BOMB:
 							difficulty += 10;
 							break;
-						case 12429:	case 12430:	case 12431:
-						case 12432:	case 12433:	case 12434:
-						case 13263:
+						case ITEMID_SAVAGE_FULL_ROAST:	case ITEMID_COCKTAIL_WARG_BLOOD:	case ITEMID_MINOR_STEW:
+						case ITEMID_SIROMA_ICED_TEA:	case ITEMID_DROSERA_HERB_SALAD:		case ITEMID_PETITE_TAIL_NOODLES:
+						case ITEMID_PINEAPPLE_BOMB:
 							difficulty += 15;
 							break;
-						case 13264:
+						case ITEMID_BANANA_BOMB:
 							difficulty += 20;
 							break;
 					}
@@ -17268,10 +17288,10 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 		make_per += pc_checkskill(sd,skill_id)*500; // Smithing skills bonus: +5/+10/+15
 		make_per += pc_checkskill(sd,BS_WEAPONRESEARCH)*100 +((wlv >= 3)? pc_checkskill(sd,BS_ORIDEOCON)*100:0); // Weaponry Research bonus: +1/+2/+3/+4/+5/+6/+7/+8/+9/+10, Oridecon Research bonus (custom): +1/+2/+3/+4/+5
 		make_per -= (ele?2000:0) + sc*1500 + (wlv>1?wlv*1000:0); // Element Stone: -20%, Star Crumb: -15% each, Weapon level malus: -0/-20/-30
-		if(pc_search_inventory(sd,989) > 0) make_per+= 1000; // Emperium Anvil: +10
-		else if(pc_search_inventory(sd,988) > 0) make_per+= 500; // Golden Anvil: +5
-		else if(pc_search_inventory(sd,987) > 0) make_per+= 300; // Oridecon Anvil: +3
-		else if(pc_search_inventory(sd,986) > 0) make_per+= 0; // Anvil: +0?
+		if(pc_search_inventory(sd,ITEMID_EMPERIUM_ANVIL) > 0) make_per+= 1000; // Emperium Anvil: +10
+		else if(pc_search_inventory(sd,ITEMID_GOLDEN_AVNIL) > 0) make_per+= 500; // Golden Anvil: +5
+		else if(pc_search_inventory(sd,ITEMID_ORIDECON_ANVIL) > 0) make_per+= 300; // Oridecon Anvil: +3
+		else if(pc_search_inventory(sd,ITEMID_ANVIL) > 0) make_per+= 0; // Anvil: +0?
 		if(battle_config.wp_rate != 100)
 			make_per = make_per * battle_config.wp_rate / 100;
 	}
@@ -17353,7 +17373,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 				}
 				if (rnd()%10000 < make_per || qty == 1) { //Success
 					tmp_item.amount++;
-					if(nameid < 545 || nameid > 547)
+					if(nameid < ITEMID_RED_SLIM_POTION || nameid > ITEMID_WHITE_SLIM_POTION)
 						continue;
 					if( skill_id != AM_PHARMACY &&
 						skill_id != AM_TWILIGHT1 &&
@@ -17476,7 +17496,7 @@ int skill_produce_mix (struct map_session_data *sd, uint16 skill_id, int nameid,
 				break;
 			case GN_MIX_COOKING: {
 					struct item tmp_item;
-					const int compensation[5] = {13265, 13266, 13267, 12435, 13268};
+					const int compensation[5] = {ITEMID_BLACK_LUMP, ITEMID_BLACK_HARD_LUMP, ITEMID_VERY_HARD_LUMP, ITEMID_BLACK_MASS, ITEMID_MYSTERIOUS_POWDER};
 					int rate = rnd()%500;
 					memset(&tmp_item,0,sizeof(tmp_item));
 					if( rate < 50) i = 4;
@@ -17561,14 +17581,14 @@ int skill_poisoningweapon( struct map_session_data *sd, int nameid) {
 	}
 	switch( nameid )
 	{ // t_lv used to take duration from skill_get_time2
-		case PO_PARALYSE:      type = SC_PARALYSE;      break;
-		case PO_PYREXIA:       type = SC_PYREXIA;		break;
-		case PO_DEATHHURT:     type = SC_DEATHHURT;     break;
-		case PO_LEECHESEND:    type = SC_LEECHESEND;    break;
-		case PO_VENOMBLEED:    type = SC_VENOMBLEED;    break;
-		case PO_TOXIN:         type = SC_TOXIN;         break;
-		case PO_MAGICMUSHROOM: type = SC_MAGICMUSHROOM; break;
-		case PO_OBLIVIONCURSE: type = SC_OBLIVIONCURSE; break;
+		case ITEMID_PARALYSE:      type = SC_PARALYSE;      break;
+		case ITEMID_PYREXIA:       type = SC_PYREXIA;		break;
+		case ITEMID_DEATHHURT:     type = SC_DEATHHURT;     break;
+		case ITEMID_LEECHESEND:    type = SC_LEECHESEND;    break;
+		case ITEMID_VENOMBLEED:    type = SC_VENOMBLEED;    break;
+		case ITEMID_TOXIN:         type = SC_TOXIN;         break;
+		case ITEMID_MAGICMUSHROOM: type = SC_MAGICMUSHROOM; break;
+		case ITEMID_OBLIVIONCURSE: type = SC_OBLIVIONCURSE; break;
 		default:
 			clif_skill_fail(sd,GC_POISONINGWEAPON,USESKILL_FAIL_LEVEL,0);
 			return 0;
@@ -17626,9 +17646,9 @@ int skill_magicdecoy(struct map_session_data *sd, int nameid) {
 
 	// Item picked decides the mob class
 	switch(nameid) {
-		case 990: class_ = 2043; break;
-		case 991: class_ = 2044; break;
-		case 992: class_ = 2046; break;
+		case ITEMID_BLOODY_RED:			class_ = 2043; break;
+		case ITEMID_CRYSTAL_BLUE:		class_ = 2044; break;
+		case ITEMID_WIND_OF_VERDURE:	class_ = 2046; break;
 		default: class_ = 2045; break;
 	}
 
@@ -17748,15 +17768,15 @@ int skill_elementalanalysis(struct map_session_data* sd, int n, uint16 skill_lv,
 
 		switch( nameid ) {
 				// Level 1
-			case 994: product = 990; break;	// Flame Heart -> Red Blood.
-			case 995: product = 991; break;	// Mystic Frozen -> Crystal Blue.
-			case 996: product = 992; break; // Rough Wind -> Wind of Verdure.
-			case 997: product = 993; break; // Great Nature -> Green Live.
+			case ITEMID_FLAME_HEART:		product = ITEMID_BLOODY_RED;		break;
+			case ITEMID_MISTIC_FROZEN:		product = ITEMID_CRYSTAL_BLUE;		break;
+			case ITEMID_ROUGH_WIND:			product = ITEMID_WIND_OF_VERDURE;	break;
+			case ITEMID_GREAT_NATURE:		product = ITEMID_YELLOW_LIVE;		break;
 				// Level 2
-			case 990: product = 994; break;	// Red Blood -> Flame Heart.
-			case 991: product = 995; break;	// Crystal Blue -> Mystic Frozen.
-			case 992: product = 996; break; // Wind of Verdure -> Rough Wind.
-			case 993: product = 997; break; // Green Live -> Great Nature.
+			case ITEMID_BLOODY_RED:			product = ITEMID_FLAME_HEART;		break;
+			case ITEMID_CRYSTAL_BLUE:		product = ITEMID_MISTIC_FROZEN;		break;
+			case ITEMID_WIND_OF_VERDURE:	product = ITEMID_ROUGH_WIND;		break;
+			case ITEMID_YELLOW_LIVE:		product = ITEMID_GREAT_NATURE;		break;
 			default:
 				clif_skill_fail(sd,SO_EL_ANALYSIS,USESKILL_FAIL_LEVEL,0);
 				return 1;
@@ -18453,10 +18473,10 @@ int skill_get_elemental_type( uint16 skill_id , uint16 skill_lv ) {
 	int type = 0;
 
 	switch( skill_id ) {
-		case SO_SUMMON_AGNI:	type = 2114; break;
-		case SO_SUMMON_AQUA:	type = 2117; break;
-		case SO_SUMMON_VENTUS:	type = 2120; break;
-		case SO_SUMMON_TERA:	type = 2123; break;
+		case SO_SUMMON_AGNI:	type = ELEMENTALID_AGNI_S;		break;
+		case SO_SUMMON_AQUA:	type = ELEMENTALID_AQUA_S;		break;
+		case SO_SUMMON_VENTUS:	type = ELEMENTALID_VENTUS_S;	break;
+		case SO_SUMMON_TERA:	type = ELEMENTALID_TERA_S;		break;
 	}
 
 	type += skill_lv - 1;

+ 0 - 10
src/map/skill.h

@@ -1979,16 +1979,6 @@ int skill_magicdecoy(struct map_session_data *sd, int nameid);
  * Guiltoine Cross
  **/
 int skill_poisoningweapon( struct map_session_data *sd, int nameid);
-enum gx_poison {
-	PO_PARALYSE = 12717,
-	PO_LEECHESEND,
-	PO_OBLIVIONCURSE,
-	PO_DEATHHURT,
-	PO_TOXIN,
-	PO_PYREXIA,
-	PO_MAGICMUSHROOM,
-	PO_VENOMBLEED
-};
 /**
  * Auto Shadow Spell (Shadow Chaser)
  **/

+ 1 - 0
src/map/status.c

@@ -9932,6 +9932,7 @@ int status_change_clear(struct block_list* bl, int type)
 			case SC_WEIGHT90:
 			case SC_EDP:
 			case SC_MELTDOWN:
+			case SC_WEDDING:
 			case SC_XMAS:
 			case SC_SUMMER:
 			case SC_HANBOK: