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 ;
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 */
2013-06-01 03:54:04 -04:00
cItem ( void ) :
m_ItemType ( E_ITEM_EMPTY ) ,
m_ItemCount ( 0 ) ,
2014-01-15 17:38:03 -05:00
m_ItemDamage ( 0 ) ,
m_CustomName ( " " ) ,
2014-02-26 18:29:14 -05:00
m_Lore ( " " ) ,
2014-05-07 06:30:30 -04:00
m_RepairCost ( 0 ) ,
2015-07-13 20:15:37 -04:00
m_FireworkItem ( ) ,
m_ItemColor ( )
2013-06-01 03:54:04 -04:00
{
}
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 = " " ,
const AString & a_Lore = " "
2013-06-01 03:54:04 -04:00
) :
2013-06-02 06:40:20 -04:00
m_ItemType ( a_ItemType ) ,
m_ItemCount ( a_ItemCount ) ,
m_ItemDamage ( a_ItemDamage ) ,
2014-01-15 17:38:03 -05:00
m_Enchantments ( a_Enchantments ) ,
m_CustomName ( a_CustomName ) ,
2014-02-26 18:29:14 -05:00
m_Lore ( a_Lore ) ,
2014-05-07 06:30:30 -04:00
m_RepairCost ( 0 ) ,
2015-07-13 20:15:37 -04:00
m_FireworkItem ( ) ,
m_ItemColor ( )
2012-06-14 09:06:06 -04:00
{
2013-01-11 23:46:01 -05:00
if ( ! IsValidItem ( m_ItemType ) )
{
2014-04-30 11:36:51 -04:00
if ( ( m_ItemType ! = E_BLOCK_AIR ) & & ( m_ItemType ! = E_ITEM_EMPTY ) )
2013-08-04 10:06:28 -04:00
{
LOGWARNING ( " %s: creating an invalid item type (%d), resetting to empty. " , __FUNCTION__ , a_ItemType ) ;
}
2013-06-01 03:54:04 -04:00
Empty ( ) ;
2013-01-11 23:46:01 -05:00
}
2012-06-14 09:06:06 -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
#if 0
2016-02-05 16:45:45 -05:00
2014-02-11 05:30:11 -05:00
/** Creates an exact copy of the item */
2013-06-04 07:54:44 -04:00
cItem ( const cItem & a_CopyFrom ) :
m_ItemType ( a_CopyFrom . m_ItemType ) ,
m_ItemCount ( a_CopyFrom . m_ItemCount ) ,
m_ItemDamage ( a_CopyFrom . m_ItemDamage ) ,
2014-01-15 17:38:03 -05:00
m_Enchantments ( a_CopyFrom . m_Enchantments ) ,
m_CustomName ( a_CopyFrom . m_CustomName ) ,
2014-02-26 18:29:14 -05:00
m_Lore ( a_CopyFrom . m_Lore ) ,
2014-05-07 15:32:52 -04:00
m_RepairCost ( a_CopyFrom . m_RepairCost ) ,
m_FireworkItem ( a_CopyFrom . m_FireworkItem )
2013-06-04 07:54:44 -04:00
{
}
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
2013-04-10 17:40:30 -04:00
void Empty ( void )
2012-06-14 09:06:06 -04:00
{
2013-01-11 23:46:01 -05:00
m_ItemType = E_ITEM_EMPTY ;
2012-06-14 09:06:06 -04:00
m_ItemCount = 0 ;
2013-01-11 23:46:01 -05:00
m_ItemDamage = 0 ;
2013-06-02 06:40:20 -04:00
m_Enchantments . Clear ( ) ;
2014-01-15 17:38:03 -05:00
m_CustomName = " " ;
m_Lore = " " ;
2014-05-07 06:30:30 -04:00
m_RepairCost = 0 ;
2014-02-26 18:29:14 -05:00
m_FireworkItem . EmptyData ( ) ;
2015-07-13 20:15:37 -04:00
m_ItemColor . Clear ( ) ;
2012-06-14 09:06:06 -04:00
}
2016-02-05 16:45:45 -05:00
2012-06-14 09:06:06 -04:00
void Clear ( void )
{
2013-01-11 23:46:01 -05:00
m_ItemType = E_ITEM_EMPTY ;
2012-06-14 09:06:06 -04:00
m_ItemCount = 0 ;
2013-01-11 23:46:01 -05:00
m_ItemDamage = 0 ;
2014-05-07 06:30:30 -04:00
m_RepairCost = 0 ;
2015-07-13 20:15:37 -04:00
m_ItemColor . Clear ( ) ;
2012-06-14 09:06:06 -04:00
}
2016-02-05 16:45:45 -05:00
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 ) & &
2014-02-26 18:29:14 -05:00
( m_Lore = = a_Item . m_Lore ) & &
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
{
return ( m_CustomName . empty ( ) & & m_Lore . empty ( ) ) ;
}
bool IsCustomNameEmpty ( void ) const { return ( m_CustomName . empty ( ) ) ; }
2014-07-17 10:33:09 -04:00
bool IsLoreEmpty ( void ) const { return ( m_Lore . 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 ;
AString m_Lore ;
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 :
// 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
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 ;
} ;