Просмотр исходного кода

Added an item group for Token of Siegfried (#4047)

* Fixes #4041.
* Created an item group used to remove hard coding of Token of Siegfried.
* Added the other Token of Siegfried's to work with this feature.
Thanks to @daisyanne1380!
Aleos 6 лет назад
Родитель
Сommit
53f5013149
6 измененных файлов с 41 добавлено и 8 удалено
  1. 4 0
      db/pre-re/item_misc.txt
  2. 4 0
      db/re/item_misc.txt
  3. 5 7
      src/map/clif.cpp
  4. 25 0
      src/map/itemdb.cpp
  5. 2 1
      src/map/itemdb.hpp
  6. 1 0
      src/map/script_constants.hpp

+ 4 - 0
db/pre-re/item_misc.txt

@@ -644,3 +644,7 @@ IG_Mercenary,12179,1 // SpearMercenary_Scroll7
 IG_Mercenary,12180,1 // SpearMercenary_Scroll8
 IG_Mercenary,12181,1 // SpearMercenary_Scroll9
 IG_Mercenary,12182,1 // SpearMercenary_Scroll10
+// Token of Siegfried
+IG_Token_Of_Siegfried,6293,1	// F_Token_Of_Siegfried
+IG_Token_Of_Siegfried,6316,1	// E_Token_Of_Siegfried
+IG_Token_Of_Siegfried,7621,1	// Token_Of_Siegfried

+ 4 - 0
db/re/item_misc.txt

@@ -1403,3 +1403,7 @@ IG_PrizeOfHero,22037,2		// Vet_Ungo_Boots
 // Private Airship items
 IG_PRIVATE_AIRSHIP,6909,1 // Actinidia_Cat_Fruit
 IG_PRIVATE_AIRSHIP,25464,1 // World_Moving_Rights
+// Token of Siegfried
+IG_Token_Of_Siegfried,6293,1	// F_Token_Of_Siegfried
+IG_Token_Of_Siegfried,6316,1	// E_Token_Of_Siegfried
+IG_Token_Of_Siegfried,7621,1	// Token_Of_Siegfried

+ 5 - 7
src/map/clif.cpp

@@ -14935,22 +14935,20 @@ void clif_parse_HomMenu(int fd, struct map_session_data *sd)
 /// 0292
 void clif_parse_AutoRevive(int fd, struct map_session_data *sd)
 {
-	short item_position = pc_search_inventory(sd, ITEMID_TOKEN_OF_SIEGFRIED);
+	if (sd->sc.data[SC_HELLPOWER]) // Cannot resurrect while under the effect of SC_HELLPOWER.
+		return;
+
+	int16 item_position = itemdb_group_item_exists_pc(sd, IG_TOKEN_OF_SIEGFRIED);
 	uint8 hp = 100, sp = 100;
 
 	if (item_position < 0) {
 		if (sd->sc.data[SC_LIGHT_OF_REGENE]) {
-			// HP restored
 			hp = sd->sc.data[SC_LIGHT_OF_REGENE]->val2;
 			sp = 0;
-		}
-		else
+		} else
 			return;
 	}
 
-	if (sd->sc.data[SC_HELLPOWER]) //Cannot res while under the effect of SC_HELLPOWER.
-		return;
-
 	if (!status_revive(&sd->bl, hp, sp))
 		return;
 

+ 25 - 0
src/map/itemdb.cpp

@@ -51,6 +51,7 @@ struct s_item_group_db *itemdb_group_exists(unsigned short group_id) {
 
 /**
  * Check if an item exists in a group
+ * @param group_id: Item Group ID
  * @param nameid: Item to check for in group
  * @return True if item is in group, else false
  */
@@ -70,6 +71,30 @@ bool itemdb_group_item_exists(unsigned short group_id, unsigned short nameid)
 	return false;
 }
 
+/**
+ * Check if an item exists from a group in a player's inventory
+ * @param group_id: Item Group ID
+ * @return Item's index if found or -1 otherwise
+ */
+int16 itemdb_group_item_exists_pc(struct map_session_data *sd, unsigned short group_id)
+{
+	struct s_item_group_db *group = (struct s_item_group_db *)uidb_get(itemdb_group, group_id);
+
+	if (!group)
+		return -1;
+
+	for (int i = 0; i < MAX_ITEMGROUP_RANDGROUP; i++) {
+		for (int j = 0; j < group->random[i].data_qty; j++) {
+			int16 item_position = pc_search_inventory(sd, group->random[i].data[j].nameid);
+
+			if (item_position != -1)
+				return item_position;
+		}
+	}
+
+	return -1;
+}
+
 /**
  * Search for item name
  * name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)

+ 2 - 1
src/map/itemdb.hpp

@@ -87,7 +87,6 @@ enum item_itemid
 	ITEMID_COATING_BOTTLE				= 7139,
 	ITEMID_FRAGMENT_OF_CRYSTAL			= 7321,
 	ITEMID_SKULL_						= 7420,
-	ITEMID_TOKEN_OF_SIEGFRIED			= 7621,
 	ITEMID_TRAP_ALLOY					= 7940,
 	ITEMID_MERCENARY_RED_POTION			= 12184,
 	ITEMID_MERCENARY_BLUE_POTION		= 12185,
@@ -732,6 +731,7 @@ enum e_random_item_group {
 	IG_SANTA_GIFT,
 	IG_PRIZEOFHERO,
 	IG_PRIVATE_AIRSHIP,
+	IG_TOKEN_OF_SIEGFRIED,
 };
 
 /// Enum for bound/sell restricted selling
@@ -953,6 +953,7 @@ struct item_combo *itemdb_combo_exists(unsigned short combo_id);
 
 struct s_item_group_db *itemdb_group_exists(unsigned short group_id);
 bool itemdb_group_item_exists(unsigned short group_id, unsigned short nameid);
+int16 itemdb_group_item_exists_pc(struct map_session_data *sd, unsigned short group_id);
 char itemdb_pc_get_itemgroup(uint16 group_id, bool identify, struct map_session_data *sd);
 
 bool itemdb_parse_roulette_db(void);

+ 1 - 0
src/map/script_constants.hpp

@@ -4823,6 +4823,7 @@
 	export_constant(IG_SANTA_GIFT);
 	export_constant(IG_PRIZEOFHERO);
 	export_constant(IG_PRIVATE_AIRSHIP);
+	export_constant(IG_TOKEN_OF_SIEGFRIED);
 
 	/* unit stop walking */
 	export_constant(USW_NONE);