2013-06-02 06:40:20 -04:00
// Item.h
// Declares the cItem class representing an item (in the inventory sense)
2012-06-14 09:06:06 -04:00
# pragma once
# include "Defines.h"
2013-06-02 06:40:20 -04:00
# include "Enchantments.h"
2014-02-26 18:29:14 -05:00
# include "WorldStorage/FireworksSerializer.h"
2015-07-13 20:15:37 -04:00
# include "Color.h"
2013-06-02 06:40:20 -04:00
2012-06-14 09:06:06 -04:00
2013-06-16 10:12:25 -04:00
// fwd:
class cItemHandler ;
2019-10-16 04:06:34 -04:00
class cItemGrid ;
2015-07-13 20:15:37 -04:00
class cColor ;
2013-06-16 10:12:25 -04:00
2012-06-14 09:06:06 -04:00
namespace Json
{
class Value ;
2012-08-03 07:53:11 -04:00
}
2012-06-14 09:06:06 -04:00
// tolua_begin
class cItem
{
public :
2014-02-11 05:30:11 -05:00
/** Creates an empty item */
2020-04-03 02:57:01 -04:00
cItem ( void ) ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Creates an item of the specified type, by default 1 piece with no damage and no enchantments */
2013-06-01 03:54:04 -04:00
cItem (
short a_ItemType ,
char a_ItemCount = 1 ,
2013-06-02 06:40:20 -04:00
short a_ItemDamage = 0 ,
2014-01-15 17:38:03 -05:00
const AString & a_Enchantments = " " ,
const AString & a_CustomName = " " ,
2017-08-18 06:29:54 -04:00
const AStringVector & a_LoreTable = { }
2020-04-03 02:57:01 -04:00
) ;
2016-02-05 16:45:45 -05:00
2014-05-01 16:02:25 -04:00
// The constructor is disabled in code, because the compiler generates it anyway,
// but it needs to stay because ToLua needs to generate the binding for it
2017-08-28 09:36:23 -04:00
# ifdef TOLUA_EXPOSITION
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Creates an exact copy of the item */
2017-08-28 09:36:23 -04:00
cItem ( const cItem & a_CopyFrom ) ;
2016-02-05 16:45:45 -05:00
2014-05-01 16:02:25 -04:00
# endif
2016-02-05 16:45:45 -05:00
2020-04-03 02:57:01 -04:00
/** Empties the item and frees up any dynamic storage used by the internals. */
void Empty ( void ) ;
2016-02-05 16:45:45 -05:00
2020-04-03 02:57:01 -04:00
/** Empties the item and frees up any dynamic storage used by the internals.
TODO : What is the usage difference ? Merge with Empty ( ) ? */
void Clear ( void ) ;
2016-02-05 16:45:45 -05:00
2020-04-03 02:57:01 -04:00
/** Returns true if the item represents an empty stack - either the type is invalid, or count is zero. */
2012-06-14 09:06:06 -04:00
bool IsEmpty ( void ) const
{
2013-04-10 17:40:30 -04:00
return ( ( m_ItemType < = 0 ) | | ( m_ItemCount < = 0 ) ) ;
2012-06-14 09:06:06 -04:00
}
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/* Returns true if this itemstack can stack with the specified stack (types match, enchantments etc.)
ItemCounts are ignored . */
2012-08-18 05:56:28 -04:00
bool IsEqual ( const cItem & a_Item ) const
{
2013-06-04 07:54:44 -04:00
return (
IsSameType ( a_Item ) & &
( m_ItemDamage = = a_Item . m_ItemDamage ) & &
2014-01-15 17:38:03 -05:00
( m_Enchantments = = a_Item . m_Enchantments ) & &
( m_CustomName = = a_Item . m_CustomName ) & &
2017-08-18 06:29:54 -04:00
( m_LoreTable = = a_Item . m_LoreTable ) & &
2014-02-26 18:29:14 -05:00
m_FireworkItem . IsEqualTo ( a_Item . m_FireworkItem )
2013-06-04 07:54:44 -04:00
) ;
2012-08-18 05:56:28 -04:00
}
2016-02-05 16:45:45 -05:00
2012-08-18 05:56:28 -04:00
bool IsSameType ( const cItem & a_Item ) const
2012-06-14 09:06:06 -04:00
{
2013-01-11 23:46:01 -05:00
return ( m_ItemType = = a_Item . m_ItemType ) | | ( IsEmpty ( ) & & a_Item . IsEmpty ( ) ) ;
2012-06-14 09:06:06 -04:00
}
2014-01-15 17:38:03 -05:00
bool IsBothNameAndLoreEmpty ( void ) const
{
2017-08-18 06:29:54 -04:00
return ( m_CustomName . empty ( ) & & m_LoreTable . empty ( ) ) ;
2014-01-15 17:38:03 -05:00
}
bool IsCustomNameEmpty ( void ) const { return ( m_CustomName . empty ( ) ) ; }
2017-08-18 06:29:54 -04:00
bool IsLoreEmpty ( void ) const { return ( m_LoreTable . empty ( ) ) ; }
2012-06-14 09:06:06 -04:00
2014-02-11 05:30:11 -05:00
/** Returns a copy of this item with m_ItemCount set to 1. Useful to preserve enchantments etc. on stacked items */
2013-04-10 17:40:30 -04:00
cItem CopyOne ( void ) const ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Adds the specified count to this object and returns the reference to self (useful for chaining) */
2013-06-16 10:12:25 -04:00
cItem & AddCount ( char a_AmountToAdd ) ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Returns the maximum damage value that this item can have; zero if damage is not applied */
2013-04-11 06:05:53 -04:00
short GetMaxDamage ( void ) const ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Damages a weapon / tool. Returns true when damage reaches max value and the item should be destroyed */
2013-05-19 14:22:37 -04:00
bool DamageItem ( short a_Amount = 1 ) ;
2012-06-14 09:06:06 -04:00
2013-04-11 06:05:53 -04:00
inline bool IsDamageable ( void ) const { return ( GetMaxDamage ( ) > 0 ) ; }
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Returns true if the item is stacked up to its maximum stacking. */
2013-06-16 10:12:25 -04:00
bool IsFullStack ( void ) const ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Returns the maximum amount of stacked items of this type. */
2013-11-10 12:41:26 -05:00
char GetMaxStackSize ( void ) const ;
2012-06-14 09:06:06 -04:00
2012-06-19 17:31:00 -04:00
// tolua_end
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Returns the cItemHandler responsible for this item type */
2013-06-16 10:12:25 -04:00
cItemHandler * GetHandler ( void ) const ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Saves the item data into JSON representation */
2013-06-16 10:12:25 -04:00
void GetJson ( Json : : Value & a_OutValue ) const ;
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Loads the item data from JSON representation */
2013-06-16 10:12:25 -04:00
void FromJson ( const Json : : Value & a_Value ) ;
2016-02-05 16:45:45 -05:00
2014-08-30 09:06:43 -04:00
/** Returns true if the specified item type is enchantable.
2017-07-28 13:00:20 -04:00
If FromBook is true , the function is used in the anvil inventory with book enchantments .
2014-09-02 14:17:31 -04:00
So it checks the " only book enchantments " too . Example : You can only enchant a hoe with a book . */
2017-07-28 13:00:20 -04:00
static bool IsEnchantable ( short a_ItemType , bool a_FromBook = false ) ; // tolua_export
2012-06-14 09:06:06 -04:00
2014-04-17 07:15:35 -04:00
/** Returns the enchantability of the item. When the item hasn't a enchantability, it will returns 0 */
2014-07-17 10:33:09 -04:00
int GetEnchantability ( ) ; // tolua_export
2014-04-17 07:15:35 -04:00
2016-09-12 17:21:15 -04:00
/** Randomly enchants the item using the specified number of XP levels.
Returns true if the item was enchanted , false if not ( not enchantable / too many enchantments already ) . */
2014-07-17 10:33:09 -04:00
bool EnchantByXPLevels ( int a_NumXPLevels ) ; // tolua_export
2014-04-17 07:15:35 -04:00
2017-07-28 13:00:20 -04:00
/** Adds this specific enchantment to this item, returning the cost.
FromBook specifies whether the enchantment should be treated as coming
from a book . If true , then the cost returned uses the book values , if
false it uses the normal item multipliers . */
int AddEnchantment ( int a_EnchantmentID , unsigned int a_Level , bool a_FromBook ) ; // tolua_export
/** Adds the enchantments on a_Other to this item, returning the
XP cost of the transfer . */
int AddEnchantmentsFromItem ( const cItem & a_Other ) ; // tolua_export
/** Returns whether or not this item is allowed to have the given enchantment. Note: Does not check whether the enchantment is exclusive with the current enchantments on the item. */
bool CanHaveEnchantment ( int a_EnchantmentID ) ;
2013-06-16 10:12:25 -04:00
// tolua_begin
2016-02-05 16:45:45 -05:00
2014-05-07 06:30:30 -04:00
short m_ItemType ;
char m_ItemCount ;
short m_ItemDamage ;
cEnchantments m_Enchantments ;
AString m_CustomName ;
2017-08-18 06:29:54 -04:00
// tolua_end
AStringVector m_LoreTable ; // Exported in ManualBindings.cpp
// tolua_begin
2014-05-07 06:30:30 -04:00
2014-05-07 14:43:37 -04:00
int m_RepairCost ;
2014-05-07 06:45:20 -04:00
cFireworkItem m_FireworkItem ;
2015-07-13 20:15:37 -04:00
cColor m_ItemColor ;
2012-06-14 09:06:06 -04:00
} ;
// tolua_end
2013-01-26 22:45:40 -05:00
2013-05-12 11:58:29 -04:00
/** This class bridges a vector of cItem for safe access via Lua. It checks boundaries for all accesses
Note that this class is zero - indexed !
*/
2013-01-26 22:45:40 -05:00
class cItems // tolua_export
: public std : : vector < cItem >
{ // tolua_export
public :
2019-10-16 04:06:34 -04:00
cItems ( const cItems & ) = default ;
cItems ( cItems & & ) = default ;
cItems & operator = ( const cItems & ) = default ;
cItems & operator = ( cItems & & ) = default ;
/** Constructs a new instance containing the specified item. */
cItems ( cItem & & a_InitialItem ) ;
2013-01-26 22:45:40 -05:00
// tolua_begin
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Need a Lua-accessible constructor */
2013-05-09 10:32:27 -04:00
cItems ( void ) { }
2016-02-05 16:45:45 -05:00
2013-05-12 11:58:29 -04:00
cItem * Get ( int a_Idx ) ;
void Set ( int a_Idx , const cItem & a_Item ) ;
2013-01-26 22:45:40 -05:00
void Add ( const cItem & a_Item ) { push_back ( a_Item ) ; }
2013-05-12 11:58:29 -04:00
void Delete ( int a_Idx ) ;
2013-01-26 22:45:40 -05:00
void Clear ( void ) { clear ( ) ; }
2014-05-12 14:38:52 -04:00
size_t Size ( void ) const { return size ( ) ; }
2014-01-06 16:22:33 -05:00
void Set ( int a_Idx , short a_ItemType , char a_ItemCount , short a_ItemDamage ) ;
2015-11-14 10:42:26 -05:00
bool Contains ( const cItem & a_Item ) ;
bool ContainsType ( const cItem & a_Item ) ;
2013-01-26 22:45:40 -05:00
2014-01-06 16:22:33 -05:00
void Add ( short a_ItemType , char a_ItemCount , short a_ItemDamage )
2013-01-26 22:45:40 -05:00
{
2013-01-26 23:04:18 -05:00
push_back ( cItem ( a_ItemType , a_ItemCount , a_ItemDamage ) ) ;
2013-01-26 22:45:40 -05:00
}
2016-02-05 16:45:45 -05:00
2019-10-16 04:06:34 -04:00
/** Adds a copy of all items in a_ItemGrid. */
void AddItemGrid ( const cItemGrid & a_ItemGrid ) ;
2013-01-26 22:45:40 -05:00
// tolua_end
} ; // tolua_export
2012-06-14 09:06:06 -04:00
2013-04-06 17:21:57 -04:00
2014-02-11 05:30:11 -05:00
/** Used to store loot probability tables */
2013-04-06 17:21:57 -04:00
class cLootProbab
{
public :
cItem m_Item ;
int m_MinAmount ;
int m_MaxAmount ;
int m_Weight ;
} ;