2013-07-29 07:13:03 -04:00
|
|
|
// Enchantments.h
|
|
|
|
|
|
|
|
// Declares the cEnchantments class representing a storage for item enchantments and stored-enchantments
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2014-04-17 07:15:35 -04:00
|
|
|
#include "Defines.h"
|
2014-01-19 11:52:45 -05:00
|
|
|
#include "WorldStorage/EnchantmentSerializer.h"
|
2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// fwd: WorldStorage/FastNBT.h
|
|
|
|
class cFastNBTWriter;
|
|
|
|
class cParsedNBT;
|
|
|
|
|
|
|
|
|
2014-04-17 13:31:43 -04:00
|
|
|
// fwd:
|
|
|
|
struct cWeightedEnchantment;
|
|
|
|
|
|
|
|
typedef std::vector<cWeightedEnchantment> cWeightedEnchantments;
|
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Class that stores item enchantments or stored-enchantments
|
|
|
|
The enchantments may be serialized to a stringspec and read back from such stringspec.
|
|
|
|
The format for the stringspec is "id=lvl;id=lvl;id=lvl...", with an optional semicolon at the end,
|
|
|
|
mapping each enchantment's id onto its level. ID may be either a number or the enchantment name.
|
|
|
|
Level value of 0 means no such enchantment, and it will not be stored in the m_Enchantments.
|
|
|
|
Serialization will never put zero-level enchantments into the stringspec and will always use numeric IDs.
|
|
|
|
*/
|
2014-01-31 13:46:51 -05:00
|
|
|
|
|
|
|
|
2014-01-19 11:52:45 -05:00
|
|
|
// tolua_begin
|
2013-07-29 07:13:03 -04:00
|
|
|
class cEnchantments
|
|
|
|
{
|
|
|
|
public:
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Individual enchantment IDs, corresponding to their NBT IDs ( http://www.minecraftwiki.net/wiki/Data_Values#Enchantment_IDs )
|
|
|
|
*/
|
2014-01-19 11:52:45 -05:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
enchProtection = 0,
|
|
|
|
enchFireProtection = 1,
|
|
|
|
enchFeatherFalling = 2,
|
|
|
|
enchBlastProtection = 3,
|
|
|
|
enchProjectileProtection = 4,
|
|
|
|
enchRespiration = 5,
|
|
|
|
enchAquaAffinity = 6,
|
|
|
|
enchThorns = 7,
|
|
|
|
enchSharpness = 16,
|
|
|
|
enchSmite = 17,
|
|
|
|
enchBaneOfArthropods = 18,
|
|
|
|
enchKnockback = 19,
|
|
|
|
enchFireAspect = 20,
|
|
|
|
enchLooting = 21,
|
|
|
|
enchEfficiency = 32,
|
|
|
|
enchSilkTouch = 33,
|
|
|
|
enchUnbreaking = 34,
|
|
|
|
enchFortune = 35,
|
|
|
|
enchPower = 48,
|
|
|
|
enchPunch = 49,
|
|
|
|
enchFlame = 50,
|
|
|
|
enchInfinity = 51,
|
2013-11-13 02:16:35 -05:00
|
|
|
enchLuckOfTheSea = 61,
|
|
|
|
enchLure = 62,
|
2013-07-29 07:13:03 -04:00
|
|
|
} ;
|
2014-01-31 13:46:51 -05:00
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Creates an empty enchantments container */
|
2013-07-29 07:13:03 -04:00
|
|
|
cEnchantments(void);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Creates an enchantments container filled with enchantments parsed from stringspec */
|
2013-07-29 07:13:03 -04:00
|
|
|
cEnchantments(const AString & a_StringSpec);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Adds the enchantments contained in a_Other into this object.
|
|
|
|
Existing enchantments are preserved, unless a_Other specifies a different level, in which case the level is changed. */
|
|
|
|
void Add(const cEnchantments & a_Other);
|
|
|
|
|
|
|
|
/** Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it */
|
2013-07-29 07:13:03 -04:00
|
|
|
void AddFromString(const AString & a_StringSpec);
|
|
|
|
|
2014-04-30 18:47:57 -04:00
|
|
|
/** Get the count of enchantments */
|
2014-05-06 13:38:09 -04:00
|
|
|
size_t Count(void);
|
2014-04-30 18:47:57 -04:00
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Serializes all the enchantments into a string */
|
2013-07-29 07:13:03 -04:00
|
|
|
AString ToString(void) const;
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Returns the level for the specified enchantment; 0 if not stored */
|
2013-07-29 07:13:03 -04:00
|
|
|
int GetLevel(int a_EnchantmentID) const;
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Sets the level for the specified enchantment, adding it if not stored before or removing it if level <= 0 */
|
2013-07-29 07:13:03 -04:00
|
|
|
void SetLevel(int a_EnchantmentID, int a_Level);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Removes all enchantments */
|
2013-07-29 07:13:03 -04:00
|
|
|
void Clear(void);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Returns true if there are no enchantments */
|
2013-07-29 07:13:03 -04:00
|
|
|
bool IsEmpty(void) const;
|
|
|
|
|
2014-04-23 17:06:29 -04:00
|
|
|
/** Converts enchantment name or ID (number in string) to the numeric representation; returns -1 if enchantment name not found; case insensitive */
|
2013-07-29 07:13:03 -04:00
|
|
|
static int StringToEnchantmentID(const AString & a_EnchantmentName);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Returns true if a_Other contains exactly the same enchantments and levels */
|
2013-07-29 07:13:03 -04:00
|
|
|
bool operator ==(const cEnchantments & a_Other) const;
|
2014-04-17 07:15:35 -04:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
// tolua_end
|
2014-04-17 07:15:35 -04:00
|
|
|
|
|
|
|
/** Add enchantment weights from item to the vector */
|
2014-04-19 09:10:50 -04:00
|
|
|
static void AddItemEnchantmentWeights(cWeightedEnchantments & a_Enchantments, short a_ItemType, int a_EnchantmentLevel);
|
2014-04-17 07:15:35 -04:00
|
|
|
|
2014-04-19 16:37:29 -04:00
|
|
|
/** Add a enchantment with weight to the vector */
|
|
|
|
static void AddEnchantmentWeightToVector(cWeightedEnchantments & a_Enchantments, int a_Weight, int a_EnchantmentID, int a_EnchantmentLevel);
|
|
|
|
|
|
|
|
/** Remove the entire enchantment (with weight) from the vector */
|
2014-04-19 09:10:50 -04:00
|
|
|
static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, int a_EnchantmentID);
|
2014-04-19 16:37:29 -04:00
|
|
|
|
|
|
|
/** Remove the entire enchantment (with weight) from the vector */
|
2014-04-19 09:10:50 -04:00
|
|
|
static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments & a_Enchantments, const cEnchantments & a_Enchantment);
|
2014-04-17 07:15:35 -04:00
|
|
|
|
|
|
|
/** Check enchantment conflicts from enchantments from the vector */
|
|
|
|
static void CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment);
|
|
|
|
|
|
|
|
/** Gets random enchantment from Vector and returns it */
|
|
|
|
static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Returns true if a_Other doesn't contain exactly the same enchantments and levels */
|
2013-07-29 07:13:03 -04:00
|
|
|
bool operator !=(const cEnchantments & a_Other) const;
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Writes the enchantments into the specified NBT writer; begins with the LIST tag of the specified name ("ench" or "StoredEnchantments") */
|
2014-01-19 11:52:45 -05:00
|
|
|
friend void EnchantmentSerializer::WriteToNBTCompound(cEnchantments const& a_Enchantments, cFastNBTWriter & a_Writer, const AString & a_ListTagName);
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Reads the enchantments from the specified NBT list tag (ench or StoredEnchantments) */
|
2014-01-19 11:52:45 -05:00
|
|
|
friend void EnchantmentSerializer::ParseFromNBT(cEnchantments& a_Enchantments, const cParsedNBT & a_NBT, int a_EnchListTagIdx);
|
2014-04-12 08:58:46 -04:00
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
protected:
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Maps enchantment ID -> enchantment level */
|
2013-07-29 07:13:03 -04:00
|
|
|
typedef std::map<int, int> cMap;
|
|
|
|
|
2014-04-20 08:16:26 -04:00
|
|
|
/** Currently stored enchantments */
|
2013-07-29 07:13:03 -04:00
|
|
|
cMap m_Enchantments;
|
|
|
|
} ; // tolua_export
|
|
|
|
|
|
|
|
|
2014-04-17 13:31:43 -04:00
|
|
|
|
|
|
|
|
2014-04-19 16:37:29 -04:00
|
|
|
// Define the cWeightedEnchantment struct for the Enchanting System to store the EnchantmentWeights:
|
2014-04-17 07:15:35 -04:00
|
|
|
struct cWeightedEnchantment
|
|
|
|
{
|
|
|
|
int m_Weight;
|
|
|
|
cEnchantments m_Enchantments;
|
|
|
|
};
|
|
|
|
|
2013-07-29 07:13:03 -04:00
|
|
|
|
|
|
|
|