/*  
    EQ2Emulator:  Everquest II Server Emulator
    Copyright (C) 2007  EQ2EMulator Development Team (http://www.eq2emulator.net)

    This file is part of EQ2Emulator.

    EQ2Emulator is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    EQ2Emulator is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with EQ2Emulator.  If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __EQ2_ITEMS__
#define __EQ2_ITEMS__
#include <map>
#include <vector>
#include "../../common/types.h"
#include "../../common/DataBuffer.h"
#include "../../common/MiscFunctions.h"
#include "../Commands/Commands.h"
#include "../../common/ConfigReader.h"

using namespace std;
class MasterItemList;
class Player;
class Entity;
extern MasterItemList master_item_list;
#define EQ2_PRIMARY_SLOT 0
#define EQ2_SECONDARY_SLOT 1
#define EQ2_HEAD_SLOT 2
#define EQ2_CHEST_SLOT 3
#define EQ2_SHOULDERS_SLOT 4
#define EQ2_FOREARMS_SLOT 5
#define EQ2_HANDS_SLOT 6
#define EQ2_LEGS_SLOT 7
#define EQ2_FEET_SLOT 8
#define EQ2_LRING_SLOT 9
#define EQ2_RRING_SLOT 10
#define EQ2_EARS_SLOT_1 11
#define EQ2_EARS_SLOT_2 12
#define EQ2_NECK_SLOT 13
#define EQ2_LWRIST_SLOT 14
#define EQ2_RWRIST_SLOT 15
#define EQ2_RANGE_SLOT 16
#define EQ2_AMMO_SLOT 17
#define EQ2_WAIST_SLOT 18
#define EQ2_CLOAK_SLOT 19
#define EQ2_CHARM_SLOT_1 20
#define EQ2_CHARM_SLOT_2 21
#define EQ2_FOOD_SLOT 22
#define EQ2_DRINK_SLOT 23
#define EQ2_TEXTURES_SLOT 24
#define EQ2_HAIR_SLOT 25
#define EQ2_BEARD_SLOT 26
#define EQ2_WINGS_SLOT 27
#define EQ2_NAKED_CHEST_SLOT 28
#define EQ2_NAKED_LEGS_SLOT 29
#define EQ2_BACK_SLOT 30

#define PRIMARY_SLOT 1
#define SECONDARY_SLOT 2
#define HEAD_SLOT 4
#define CHEST_SLOT 8
#define SHOULDERS_SLOT 16
#define FOREARMS_SLOT 32
#define HANDS_SLOT 64
#define LEGS_SLOT 128
#define FEET_SLOT 256
#define LRING_SLOT 512
#define RRING_SLOT 1024
#define EARS_SLOT_1 2048
#define EARS_SLOT_2 4096
#define NECK_SLOT 8192
#define LWRIST_SLOT 16384
#define RWRIST_SLOT 32768
#define RANGE_SLOT 65536
#define AMMO_SLOT 131072
#define WAIST_SLOT 262144
#define CLOAK_SLOT 524288
#define CHARM_SLOT_1 1048576
#define CHARM_SLOT_2 2097152
#define FOOD_SLOT 4194304
#define DRINK_SLOT 8388608
#define TEXTURES_SLOT 16777216
#define HAIR_SLOT 33554432
#define BEARD_SLOT 67108864
#define WINGS_SLOT 134217728
#define NAKED_CHEST_SLOT 268435456
#define NAKED_LEGS_SLOT 536870912
#define BACK_SLOT 1073741824

#define NUM_BANK_SLOTS 12
#define NUM_SHARED_BANK_SLOTS 8
#define NUM_SLOTS 25
#define NUM_INV_SLOTS 6
#define INV_SLOT1 0
#define INV_SLOT2 50
#define INV_SLOT3 100
#define INV_SLOT4 150
#define INV_SLOT5 200
#define INV_SLOT6 250
#define BANK_SLOT1 1000
#define BANK_SLOT2 1100
#define BANK_SLOT3 1200
#define BANK_SLOT4 1300
#define BANK_SLOT5 1400
#define BANK_SLOT6 1500
#define BANK_SLOT7 1600
#define BANK_SLOT8 1700
#define ATTUNED			1
#define ATTUNEABLE		2
#define ARTIFACT		4
#define LORE			8
#define TEMPORARY		16
#define NO_TRADE		32
#define NO_VALUE		64
#define NO_ZONE			128
#define NO_DESTROY		256
#define CRAFTED			512
#define GOOD_ONLY		1024
#define EVIL_ONLY		2048
#define STACK_LORE		4096  
#define LORE_EQUIP		8192  
#define FLAGS_16384		16384
#define FLAGS_32768		32768

#define ORNATE			1
#define HEIRLOOM		2
#define APPEARANCE_ONLY	4
#define UNLOCKED		8
#define REFORGED		16
#define NO_REPAIR		32
#define ETHERAL			64
#define REFINED			128
#define FLAGS2_256		256 //not used at this time
#define FLAGS2_512		512//not used at this time
#define FLAGS2_1024		1024//not used at this time
#define FLAGS2_2048		2048//not used at this time
#define FLAGS2_4096		4096//not used at this time
#define FLAGS2_8192		8192//not used at this time
#define FLAGS2_16384	16384//not used at this time
#define FLAGS2_32768	32768//not used at this time


#define ITEM_WIELD_TYPE_DUAL		1
#define ITEM_WIELD_TYPE_SINGLE		2
#define ITEM_WIELD_TYPE_TWO_HAND	4

#define ITEM_TYPE_NORMAL		  0
#define ITEM_TYPE_WEAPON		  1
#define ITEM_TYPE_RANGED		  2
#define ITEM_TYPE_ARMOR			  3
#define ITEM_TYPE_SHIELD		  4
#define ITEM_TYPE_BAG			  5
#define ITEM_TYPE_SKILL		      6
#define ITEM_TYPE_RECIPE		  7
#define ITEM_TYPE_FOOD			  8
#define ITEM_TYPE_BAUBLE		  9
#define ITEM_TYPE_HOUSE			  10
#define ITEM_TYPE_THROWN		  11
#define ITEM_TYPE_HOUSE_CONTAINER 12
#define ITEM_TYPE_ADORNMENT       13
#define ITEM_TYPE_GENERIC_ADORNMENT 14
#define ITEM_TYPE_PROFILE         16
#define ITEM_TYPE_PATTERN         17
#define ITEM_TYPE_ARMORSET        18
#define ITEM_TYPE_ITEMCRATE		  18
#define ITEM_TYPE_BOOK            19
#define ITEM_TYPE_DECORATION      20
#define ITEM_TYPE_DUNGEON_MAKER   21
#define ITEM_TYPE_MARKETPLACE     22


//DOV defines everything till 13 is the same
//#define ITEM_TYPE_BOOK			  13
//#define ITEM_TYPE_ADORNMENT		  14
//#define ITEM_TYPE_PATTERN		  15
//#define ITEM_TYPE_ARMORSET		  16



#define ITEM_MENU_TYPE_GENERIC			1 //0
#define ITEM_MENU_TYPE_EQUIP			2 //1
#define ITEM_MENU_TYPE_BAG				4//2
#define ITEM_MENU_TYPE_HOUSE			8 //3 Place
#define ITEM_MENU_TYPE_TEST12			16	//4
#define ITEM_MENU_TYPE_SCRIBE			32//5
#define ITEM_MENU_TYPE_TEST13			64//6
#define ITEM_MENU_TYPE_INVALID			128//7
#define ITEM_MENU_TYPE_TEST14			256//8
#define ITEM_MENU_TYPE_BROKEN			512//9
#define ITEM_MENU_TYPE_TEST15			1024//10
#define ITEM_MENU_TYPE_ATTUNED			2048//11
#define ITEM_MENU_TYPE_ATTUNEABLE		4096//12 
#define ITEM_MENU_TYPE_BOOK				8192//13
#define ITEM_MENU_TYPE_DISPLAY_CHARGES  16384//14
#define ITEM_MENU_TYPE_TEST1			32768//15 Possibly toogle decorator mode
#define ITEM_MENU_TYPE_NAMEPET		    65536 //16 Right CLick Menu
#define ITEM_MENU_TYPE_TEST2			131072 //sets a purple background on item
#define ITEM_MENU_TYPE_CONSUME			262144//18
#define ITEM_MENU_TYPE_USE			    524288//19
#define ITEM_MENU_TYPE_CONSUME_OFF		1048576//20
#define ITEM_MENU_TYPE_TEST3			1310720// bad number combo of 2 bits
#define ITEM_MENU_TYPE_TEST4			2097152//21
#define ITEM_MENU_TYPE_TEST5			4194304//22 infusable
#define ITEM_MENU_TYPE_TEST6			8388608 //drink option on menu
#define ITEM_MENU_TYPE_TEST7			16777216//24
#define ITEM_MENU_TYPE_TEST8			33554432 // bit 25 use option in bags
#define ITEM_MENU_TYPE_TEST9			67108864//26
#define ITEM_MENU_TYPE_DAMAGED			134217728 //27
#define ITEM_MENU_TYPE_BROKEN2			268435456 //28
#define ITEM_MENU_TYPE_REDEEM	        536870912 //29 //READ??
#define ITEM_MENU_TYPE_TEST10			1073741824 //30
#define ITEM_MENU_TYPE_UNPACK			2147483648//31 * on items i found this unpack is used at same time as UNPACK below

#define ITEM_MENU_TYPE2_TEST1			1 //0 auto consume on
#define ITEM_MENU_TYPE2_TEST2			2 //1
#define ITEM_MENU_TYPE2_UNPACK			4//2
#define ITEM_MENU_TYPE2_TEST4			8 //3 
#define ITEM_MENU_TYPE2_TEST5			16	//4
#define ITEM_MENU_TYPE2_TEST6			32//5
#define ITEM_MENU_TYPE2_TEST7			64//6
#define ITEM_MENU_TYPE2_TEST8			128//7
#define ITEM_MENU_TYPE2_TEST9			256//8
#define ITEM_MENU_TYPE2_TEST10			512//9
#define ITEM_MENU_TYPE2_TEST11			1024//10
#define ITEM_MENU_TYPE2_TEST12			2048//11
#define ITEM_MENU_TYPE2_TEST13			4096//12 
#define ITEM_MENU_TYPE2_TEST14				8192//13
#define ITEM_MENU_TYPE2_TEST15		 16384//14
#define ITEM_MENU_TYPE2_TEST16			32768//15

#define ITEM_TAG_UNCOMMON				3 //tier tags
#define ITEM_TAG_TREASURED				4
#define ITEM_TAG_LEGENDARY				7
#define ITEM_TAG_FABLED					9
#define ITEM_TAG_MYTHICAL				12

#define ITEM_BROKER_TYPE_ANY			0xFFFFFFFF
#define ITEM_BROKER_TYPE_ADORNMENT		134217728
#define ITEM_BROKER_TYPE_AMMO			1024
#define ITEM_BROKER_TYPE_ATTUNEABLE		16384
#define ITEM_BROKER_TYPE_BAG			2048
#define ITEM_BROKER_TYPE_BAUBLE			16777216
#define ITEM_BROKER_TYPE_BOOK			128
#define ITEM_BROKER_TYPE_CHAINARMOR		2097152
#define ITEM_BROKER_TYPE_CLOAK			1073741824
#define ITEM_BROKER_TYPE_CLOTHARMOR		524288
#define ITEM_BROKER_TYPE_COLLECTABLE	67108864
#define ITEM_BROKER_TYPE_CRUSHWEAPON	4
#define ITEM_BROKER_TYPE_DRINK			131072
#define ITEM_BROKER_TYPE_FOOD			4096
#define ITEM_BROKER_TYPE_HOUSEITEM		512
#define ITEM_BROKER_TYPE_JEWELRY		262144
#define ITEM_BROKER_TYPE_LEATHERARMOR	1048576
#define ITEM_BROKER_TYPE_LORE			8192
#define ITEM_BROKER_TYPE_MISC			1
#define ITEM_BROKER_TYPE_PIERCEWEAPON	8
#define ITEM_BROKER_TYPE_PLATEARMOR		4194304
#define ITEM_BROKER_TYPE_POISON			65536
#define ITEM_BROKER_TYPE_POTION			32768
#define ITEM_BROKER_TYPE_RECIPEBOOK		8388608
#define ITEM_BROKER_TYPE_SALESDISPLAY	33554432
#define ITEM_BROKER_TYPE_SHIELD			32
#define ITEM_BROKER_TYPE_SLASHWEAPON	2
#define ITEM_BROKER_TYPE_SPELLSCROLL	64
#define ITEM_BROKER_TYPE_TINKERED		268435456
#define ITEM_BROKER_TYPE_TRADESKILL		256

#define ITEM_BROKER_SLOT_ANY			0xFFFFFFFF
#define ITEM_BROKER_SLOT_AMMO			65536
#define ITEM_BROKER_SLOT_CHARM			524288
#define ITEM_BROKER_SLOT_CHEST			32
#define ITEM_BROKER_SLOT_CLOAK			262144
#define ITEM_BROKER_SLOT_DRINK			2097152
#define ITEM_BROKER_SLOT_EARS			4096
#define ITEM_BROKER_SLOT_FEET			1024
#define ITEM_BROKER_SLOT_FOOD			1048576
#define ITEM_BROKER_SLOT_FOREARMS		128
#define ITEM_BROKER_SLOT_HANDS			256
#define ITEM_BROKER_SLOT_HEAD			16
#define ITEM_BROKER_SLOT_LEGS			512
#define ITEM_BROKER_SLOT_NECK			8192
#define ITEM_BROKER_SLOT_PRIMARY		1
#define ITEM_BROKER_SLOT_PRIMARY_2H		2
#define ITEM_BROKER_SLOT_RANGE_WEAPON	32768
#define ITEM_BROKER_SLOT_RING			2048
#define ITEM_BROKER_SLOT_SECONDARY		8
#define ITEM_BROKER_SLOT_SHOULDERS		64
#define ITEM_BROKER_SLOT_WAIST			131072
#define ITEM_BROKER_SLOT_WRIST			16384

#define ITEM_BROKER_STAT_TYPE_NONE			0
#define ITEM_BROKER_STAT_TYPE_DEF			2
#define ITEM_BROKER_STAT_TYPE_STR			4
#define ITEM_BROKER_STAT_TYPE_STA			8
#define ITEM_BROKER_STAT_TYPE_AGI			16
#define ITEM_BROKER_STAT_TYPE_WIS			32
#define ITEM_BROKER_STAT_TYPE_INT			64
#define ITEM_BROKER_STAT_TYPE_HEALTH		128
#define ITEM_BROKER_STAT_TYPE_POWER			256
#define ITEM_BROKER_STAT_TYPE_HEAT			512
#define ITEM_BROKER_STAT_TYPE_COLD			1024
#define ITEM_BROKER_STAT_TYPE_MAGIC			2048
#define ITEM_BROKER_STAT_TYPE_MENTAL		4096
#define ITEM_BROKER_STAT_TYPE_DIVINE		8192
#define ITEM_BROKER_STAT_TYPE_POISON		16384
#define ITEM_BROKER_STAT_TYPE_DISEASE		32768
#define ITEM_BROKER_STAT_TYPE_CRUSH			65536
#define ITEM_BROKER_STAT_TYPE_SLASH			131072
#define ITEM_BROKER_STAT_TYPE_PIERCE		262144
#define ITEM_BROKER_STAT_TYPE_CRITICAL		524288
#define ITEM_BROKER_STAT_TYPE_DBL_ATTACK	1048576
#define ITEM_BROKER_STAT_TYPE_ABILITY_MOD	2097152
#define ITEM_BROKER_STAT_TYPE_POTENCY		4194304



#define OVERFLOW_SLOT 0xFFFFFFFE
#define SLOT_INVALID 0xFFFF

#define ITEM_STAT_STR					0
#define ITEM_STAT_STA					1
#define ITEM_STAT_AGI					2
#define ITEM_STAT_WIS					3
#define ITEM_STAT_INT					4

#define ITEM_STAT_VS_PHYSICAL			200
#define ITEM_STAT_VS_HEAT				201 //elemental
#define ITEM_STAT_VS_POISON				202 //noxious
#define ITEM_STAT_VS_MAGIC				203 //arcane
#define ITEM_STAT_VS_DROWNING			210
#define ITEM_STAT_VS_FALLING			211
#define ITEM_STAT_VS_PAIN				212
#define ITEM_STAT_VS_MELEE				213

#define ITEM_STAT_VS_SLASH				204
#define ITEM_STAT_VS_CRUSH				205
#define ITEM_STAT_VS_PIERCE				206
//#define ITEM_STAT_VS_HEAT				203 //just so no build error
#define ITEM_STAT_VS_COLD				207
//#define ITEM_STAT_VS_MAGIC			205 //just so no build error
#define ITEM_STAT_VS_MENTAL				208
#define ITEM_STAT_VS_DIVINE				209
#define ITEM_STAT_VS_DISEASE			214
//#define ITEM_STAT_VS_POISON			209 //just so no build error
//#define ITEM_STAT_VS_DROWNING			210 //just so no build error
//#define ITEM_STAT_VS_FALLING			211 //just so no build error
//#define ITEM_STAT_VS_PAIN				212 //just so no build error
//#define ITEM_STAT_VS_MELEE			213 //just so no build error

#define ITEM_STAT_DMG_SLASH				300
#define ITEM_STAT_DMG_CRUSH				301
#define ITEM_STAT_DMG_PIERCE			302
#define ITEM_STAT_DMG_HEAT				303
#define ITEM_STAT_DMG_COLD 				304
#define ITEM_STAT_DMG_MAGIC				305
#define ITEM_STAT_DMG_MENTAL			306
#define ITEM_STAT_DMG_DIVINE			307
#define ITEM_STAT_DMG_DISEASE			308
#define ITEM_STAT_DMG_POISON			309
#define ITEM_STAT_DMG_DROWNING			310
#define ITEM_STAT_DMG_FALLING			311
#define ITEM_STAT_DMG_PAIN				312
#define ITEM_STAT_DMG_MELEE				313

#define ITEM_STAT_DEFLECTIONCHANCE 		400 //just so no build error

#define ITEM_STAT_HEALTH				500
#define ITEM_STAT_POWER					501
#define ITEM_STAT_CONCENTRATION			502
#define ITEM_STAT_SAVAGERY				503

//this is the master stat list you should be using and names match what is in census. it is based off of DoV. the comment is what is displayed on items when examining
//the itemstats table will maintain the custom lists per expansion
// emu # is digits after the 6

#define ITEM_STAT_HPREGEN				600 //Health Regeneration
#define ITEM_STAT_MANAREGEN				601 //Power Regeneration
#define ITEM_STAT_HPREGENPPT			602 //Out-of-Combat Health Regeneration  %%?
#define ITEM_STAT_MPREGENPPT			603 //Out-of-Combat Power Regeneration   %%?
#define ITEM_STAT_COMBATHPREGENPPT		604 //In-Combat Health Regeneration       %%?
#define ITEM_STAT_COMBATMPREGENPPT		605 //In-Combat Power Regeneration        %%?
#define ITEM_STAT_MAXHP					606 //Max Health
#define ITEM_STAT_MAXHPPERC				607 
#define ITEM_STAT_MAXHPPERCFINAL		608 //% Max Mealth
#define ITEM_STAT_SPEED					609 //Out of Combat Run Speed
#define ITEM_STAT_SLOW					610 //Slow
#define ITEM_STAT_MOUNTSPEED			611 //Ground Mount Speed
#define ITEM_STAT_MOUNTAIRSPEED			612 //Mount Air Speed
#define ITEM_STAT_LEAPSPEED				613 
#define ITEM_STAT_LEAPTIME				614
#define ITEM_STAT_GLIDEEFFICIENCY		615
#define ITEM_STAT_OFFENSIVESPEED		616	//In Combat Run Speed
#define ITEM_STAT_ATTACKSPEED			617 //% Attack Speed
#define ITEM_STAT_SPELLWEAPONATTACKSPEED 618
#define ITEM_STAT_MAXMANA				619 //Max Power
#define ITEM_STAT_MAXMANAPERC			620 //% Max Power
#define ITEM_STAT_MAXATTPERC			621 //All Attributes    //is this a percent or is it a stat change
#define ITEM_STAT_BLURVISION			622 //Blurs Vision
#define ITEM_STAT_MAGICLEVELIMMUNITY	623 //Magic Level Immunity
#define ITEM_STAT_HATEGAINMOD			624 //% Hate Gain
#define ITEM_STAT_COMBATEXPMOD			625 //Combat XP Gain
#define ITEM_STAT_TRADESKILLEXPMOD		626 //Tradeskill XP Gain
#define ITEM_STAT_ACHIEVEMENTEXPMOD		627 //AA XP Gain
#define ITEM_STAT_SIZEMOD				628 //Size
#define ITEM_STAT_DPS					629 //%Damage Per Second
#define ITEM_STAT_SPELLWEAPONDPS		630 //%Damage Per Second
#define ITEM_STAT_STEALTH				631 //Stealth
#define ITEM_STAT_INVIS					632 //Invisibility
#define ITEM_STAT_SEESTEALTH			633 //See Stealth
#define ITEM_STAT_SEEINVIS				634 //See Invisible 
#define ITEM_STAT_EFFECTIVELEVELMOD		635 //Effective Level
#define ITEM_STAT_RIPOSTECHANCE			636 //%Extra Riposte Chance
#define ITEM_STAT_PARRYCHANCE			637 //%Extra Parry Chance
#define ITEM_STAT_DODGECHANCE			638 //%Extra Dodge Chance
#define ITEM_STAT_AEAUTOATTACKCHANCE	639 //% AE Autoattck Chance
#define ITEM_STAT_SPELLWEAPONAEAUTOATTACKCHANCE		640 //
#define ITEM_STAT_MULTIATTACKCHANCE					641 //% Multi Attack Chance  // inconsistant with db
#define ITEM_STAT_PVPDOUBLEATTACKCHANCE				642
#define ITEM_STAT_SPELLWEAPONDOUBLEATTACKCHANCE		643 // missing in db
#define ITEM_STAT_PVPSPELLWEAPONDOUBLEATTACKCHANCE  644
#define ITEM_STAT_SPELLMULTIATTACKCHANCE			645 //% Spell Multi Atttack Chance
#define ITEM_STAT_PVPSPELLDOUBLEATTACKCHANCE		646
#define ITEM_STAT_FLURRY					647 //%Flurry
#define ITEM_STAT_SPELLWEAPONFLURRY			648
#define ITEM_STAT_MELEEDAMAGEMULTIPLIER		649 //Melee Damage Multiplier
#define ITEM_STAT_EXTRAHARVESTCHANCE		650 //Extra Harvest Chance
#define ITEM_STAT_EXTRASHIELDBLOCKCHANCE	651 //Block Chance
#define ITEM_STAT_ITEMHPREGENPPT	  		652 //In-Combat Health Regeneration
#define ITEM_STAT_ITEMPPREGENPPT			653 //In-Combat Power Regeneration
#define ITEM_STAT_MELEECRITCHANCE			654 //% Crit Chance
#define ITEM_STAT_CRITAVOIDANCE				655 //% Crit Avoidance
#define ITEM_STAT_BENEFICIALCRITCHANCE		656 //% Beneficial Crit Chance
#define ITEM_STAT_CRITBONUS					657 //% Crit Bonus
#define ITEM_STAT_PVPCRITBONUS				658 
#define ITEM_STAT_POTENCY				    659 //% Potency
#define ITEM_STAT_PVPPOTENCY				660 
#define ITEM_STAT_UNCONSCIOUSHPMOD			661 //Unconcious Health
#define ITEM_STAT_ABILITYREUSESPEED			662 //% Ability Reuse Speed
#define ITEM_STAT_ABILITYRECOVERYSPEED		663 //% Ability Recovery Speed
#define ITEM_STAT_ABILITYCASTINGSPEED		664 //% Ability Casting Speed
#define ITEM_STAT_SPELLREUSESPEED			665 //% Spell Reuse Speed
#define ITEM_STAT_MELEEWEAPONRANGE			666 //% Melee Weapon Range Increase
#define ITEM_STAT_RANGEDWEAPONRANGE			667 //% Ranged Weapon Range Increase
#define ITEM_STAT_FALLINGDAMAGEREDUCTION	668 //Fallling Damage Reduction
#define ITEM_STAT_RIPOSTEDAMAGE				669 //% Riposte Damage
#define ITEM_STAT_MINIMUMDEFLECTIONCHANCE	670 //% Minimum Block Chance
#define ITEM_STAT_MOVEMENTWEAVE				671 //Movement Weave
#define ITEM_STAT_COMBATHPREGEN				672 //Combat HP Regen
#define ITEM_STAT_COMBATMANAREGEN			673 //Combat Mana Regen
#define ITEM_STAT_CONTESTSPEEDBOOST			674 //Contest Only Speed
#define ITEM_STAT_TRACKINGAVOIDANCE			675 //Tracking avoidance
#define ITEM_STAT_STEALTHINVISSPEEDMOD		676 //Movement Bonus whie Stealthed or Invisible
#define ITEM_STAT_LOOT_COIN					677 //Loot Coin
#define ITEM_STAT_ARMORMITIGATIONINCREASE   678 //% Mitigation Increase
#define ITEM_STAT_AMMOCONSERVATION			679 // Ammo Conservation
#define ITEM_STAT_STRIKETHROUGH				680 //Strikethrough
#define ITEM_STAT_STATUSBONUS				681 //Status Bonus
#define ITEM_STAT_ACCURACY					682 //% Accuracy
#define ITEM_STAT_COUNTERSTRIKE				683  //CounterStrike
#define ITEM_STAT_SHIELDBASH				684 //Shield Bash
#define ITEM_STAT_WEAPONDAMAGEBONUS			685 //Weapon Damage Bonus
#define ITEM_STAT_WEAPONDAMAGEBONUSMELEEONLY  686 //additional chance to Riposte
#define ITEM_STAT_ADDITIONALRIPOSTECHANCE     687 //additional chance to Riposte
#define ITEM_STAT_CRITICALMITIGATION		688 //Critical Mitigation
#define ITEM_STAT_PVPTOUGHNESS				689 //Toughness
#define ITEM_STAT_PVPLETHALITY				690 //
#define ITEM_STAT_STAMINABONUS				691 //Stamina Bonus
#define ITEM_STAT_WISDOMMITBONUS			692 //Wisdom Mitigation Bonus
#define ITEM_STAT_HEALRECEIVE				693 //Applied Heals
#define ITEM_STAT_HEALRECEIVEPERC			694 //% Applied Heals
#define ITEM_STAT_PVPCRITICALMITIGATION		695 //PvP Critical Mitigation
#define ITEM_STAT_BASEAVOIDANCEBONUS		696
#define ITEM_STAT_INCOMBATSAVAGERYREGEN		697
#define ITEM_STAT_OUTOFCOMBATSAVAGERYREGEN  698
#define ITEM_STAT_SAVAGERYREGEN				699
#define ITEM_STAT_SAVAGERYGAINMOD			6100
#define ITEM_STAT_MAXSAVAGERYLEVEL			6101
#define ITEM_STAT_SPELLWEAPONDAMAGEBONUS	6102
#define ITEM_STAT_INCOMBATDISSONANCEREGEN	6103
#define ITEM_STAT_OUTOFCOMBATDISSONANCEREGEN 6104
#define ITEM_STAT_DISSONANCEREGEN			6105
#define ITEM_STAT_DISSONANCEGAINMOD			6106	
#define ITEM_STAT_AEAUTOATTACKAVOID			6107
#define ITEM_STAT_AGNOSTICDAMAGEBONUS		6108
#define ITEM_STAT_AGNOSTICHEALBONUS			6109	
#define ITEM_STAT_TITHEGAIN					6110
#define ITEM_STAT_FERVER					6111
#define ITEM_STAT_RESOLVE					6112
#define ITEM_STAT_COMBATMITIGATION			6113
#define ITEM_STAT_ABILITYMITIGATION			6114
#define ITEM_STAT_MULTIATTACKAVOIDANCE		6115
#define ITEM_STAT_DOUBLECASTAVOIDANCE		6116
#define ITEM_STAT_ABILITYDOUBLECASTAVOIDANCE 6117
#define ITEM_STAT_DAMAGEPERSECONDMITIGATION	6118
#define ITEM_STAT_FERVERMITIGATION			6119
#define ITEM_STAT_FLURRYAVOIDANCE			6120
#define ITEM_STAT_WEAPONDAMAGEBONUSMITIGATION	6121
#define ITEM_STAT_ABILITYDOUBLECASTCHANCE	6122	
#define ITEM_STAT_ABILITYMODIFIERMITIGATATION	6123
#define ITEM_STAT_STATUSEARNED				6124




#define ITEM_STAT_SPELL_DAMAGE			700
#define ITEM_STAT_HEAL_AMOUNT			701
#define ITEM_STAT_SPELL_AND_HEAL		702
#define ITEM_STAT_COMBAT_ART_DAMAGE		703
#define ITEM_STAT_SPELL_AND_COMBAT_ART_DAMAGE			704
#define ITEM_STAT_TAUNT_AMOUNT			705
#define ITEM_STAT_TAUNT_AND_COMBAT_ART_DAMAGE			706
#define ITEM_STAT_ABILITY_MODIFIER			707

// Other stats not listed above (not sent from the server), never send these to the client
// using type 8 as it is not used by the client as far as we know
#define ITEM_STAT_DURABILITY_MOD		800
#define ITEM_STAT_DURABILITY_ADD		801
#define ITEM_STAT_PROGRESS_ADD			802
#define ITEM_STAT_PROGRESS_MOD			803
#define ITEM_STAT_SUCCESS_MOD			804
#define ITEM_STAT_CRIT_SUCCESS_MOD		805
#define ITEM_STAT_EX_DURABILITY_MOD		806
#define ITEM_STAT_EX_DURABILITY_ADD		807
#define ITEM_STAT_EX_PROGRESS_MOD		808
#define ITEM_STAT_EX_PROGRESS_ADD		809
#define ITEM_STAT_EX_SUCCESS_MOD		810
#define ITEM_STAT_EX_CRIT_SUCCESS_MOD	811
#define ITEM_STAT_EX_CRIT_FAILURE_MOD	812
#define ITEM_STAT_RARE_HARVEST_CHANCE	813
#define ITEM_STAT_MAX_CRAFTING			814
#define ITEM_STAT_COMPONENT_REFUND		815
#define ITEM_STAT_BOUNTIFUL_HARVEST		816

#define ITEM_STAT_UNCONTESTED_PARRY     850
#define ITEM_STAT_UNCONTESTED_BLOCK     851
#define ITEM_STAT_UNCONTESTED_DODGE     852
#define ITEM_STAT_UNCONTESTED_RIPOSTE     853

#pragma pack(1)
struct ItemStatsValues{
	sint16			str;
	sint16			sta;
	sint16			agi;
	sint16			wis;
	sint16			int_;
	sint16			vs_slash;
	sint16			vs_crush;
	sint16			vs_pierce;
	sint16			vs_heat;
	sint16			vs_cold;
	sint16			vs_magic;
	sint16			vs_mental;
	sint16			vs_divine;
	sint16			vs_disease;
	sint16			vs_poison;
	sint16			health;
	sint16			power;
	sint8			concentration;
	sint16			ability_modifier;
	sint16			criticalmitigation;
	sint16			extrashieldblockchance;
	sint16			beneficialcritchance;
	sint16			critbonus;
	sint16			potency;
	sint16			hategainmod;
	sint16			abilityreusespeed;
	sint16			abilitycastingspeed;
	sint16			abilityrecoveryspeed;
	sint16			spellreusespeed;
	sint16			spellmultiattackchance;
	sint16			dps;
	sint16			attackspeed;
	sint16			multiattackchance;
	sint16			flurry;
	sint16			aeautoattackchance;
	sint16			strikethrough;
	sint16			accuracy;
	sint16			offensivespeed;
	float			uncontested_parry;
	float			uncontested_block;
	float			uncontested_dodge;
	float			uncontested_riposte;


};
struct ItemCore{
	int32	item_id;
	sint32	soe_id;
	int32	bag_id;
	sint32	inv_slot_id;
	sint16	slot_id;
	int8	index;
	int16	icon;
	int16	count;
	int8	tier;
	int8	num_slots;
	int32	unique_id;
	int8	num_free_slots;
	int16	recommended_level;
};
#pragma pack()
struct ItemStat{
	string					stat_name;
	int8					stat_type;
	sint16					stat_subtype;
	int16					stat_type_combined;
	float					value;
};
struct ItemSet{
	int32					item_id;
	int32					item_crc;
	int16					item_icon;
	int16					item_stack_size;
	int32					item_list_color;
	
};
struct Classifications{
	int32					classification_id;  //classifications MJ
	string					classification_name;
};
struct ItemLevelOverride{
	int8					adventure_class;
	int8					tradeskill_class;
	int16					level;
};
struct ItemClass{
	int8					adventure_class;
	int8					tradeskill_class;
	int16					level;
};
struct ItemAppearance{
	int16					type;
	int8					red;
	int8					green;
	int8					blue;
	int8					highlight_red;
	int8					highlight_green;
	int8					highlight_blue;
};
class PlayerItemList;
class Item{
public:
	#pragma pack(1)
	struct ItemStatString{
		EQ2_8BitString			stat_string;
	};
	struct Generic_Info{
		int8					show_name;
		int8					creator_flag;
		int16					item_flags;
		int16					item_flags2;
		int8					condition;
		int32					weight; // num/10
		int32					skill_req1;
		int32					skill_req2;
		int16					skill_min;
		int8					item_type; //0=normal, 1=weapon, 2=range, 3=armor, 4=shield, 5=bag, 6=scroll, 7=recipe, 8=food, 9=bauble, 10=house item, 11=thrown, 12=house container, 13=adormnet, 14=??, 16=profile, 17=patter set, 18=item set, 19=book, 20=decoration, 21=dungeon maker, 22=marketplace
		int16					appearance_id;
		int8					appearance_red;
		int8					appearance_green;
		int8					appearance_blue;
		int8					appearance_highlight_red;
		int8					appearance_highlight_green;
		int8					appearance_highlight_blue;
		int8					collectable;
		int32					offers_quest_id;
		int32					part_of_quest_id;
		int16					max_charges;
		int8					display_charges;
		int64					adventure_classes;
		int64					tradeskill_classes;
		int16					adventure_default_level;
		int16					tradeskill_default_level;
		int8					usable;
		int8					harvest;
	};
	struct Armor_Info {
		int16					mitigation_low;
		int16					mitigation_high;
	};
	struct Adornment_Info {
		float					duration;
		int16					item_types;
		int16					slot_type;
	};
	struct Weapon_Info {
		int16					wield_type;
		int16					damage_low1;
		int16					damage_high1;
		int16					damage_low2;
		int16					damage_high2;
		int16					damage_low3;
		int16					damage_high3;
		int16					delay;
		float					rating;
	};
	struct Shield_Info {
		Armor_Info				armor_info;
	};
	struct Ranged_Info {
		Weapon_Info				weapon_info;
		int16					range_low;
		int16					range_high;
	};
	struct Bag_Info {
		int8					num_slots;
		int16					weight_reduction;
	};
	struct Food_Info{
		int8					type; //0=water, 1=food
		int8					level;
		float					duration;
		int8					satiation;
	};
	struct Bauble_Info{
		int16					cast;
		int16					recovery;
		int32					duration;
		float					recast;
		int8					display_slot_optional;
		int8					display_cast_time;
		int8					display_bauble_type;
		float					effect_radius;
		int32					max_aoe_targets;
		int8					display_until_cancelled;
	};
	struct Book_Info{
		int8					language;
		EQ2_16BitString			author;
		EQ2_16BitString			title;
	};
	struct Book_Info_Pages {
		int8					page;
		EQ2_16BitString			page_text;
		int8					page_text_valign;
		int8					page_text_halign;
	};
	struct Skill_Info{
		int32					spell_id;
		int32					spell_tier;
	};
	struct HouseItem_Info{
		int32					status_rent_reduction;
		float					coin_rent_reduction;
		int8					house_only;
	};
	struct HouseContainer_Info{
		int64                   allowed_types;
		int8                    num_slots;
		int8                    broker_commission;
		int8                    fence_commission;
	};
	struct RecipeBook_Info{
		vector<string>			recipes;
		int8					uses;
	};
	struct ItemSet_Info{
		int32					item_id;
		int32					item_crc;
		int16					item_icon;
		int32					item_stack_size;
		int32					item_list_color;
		
	};
	struct Thrown_Info{
		sint32					range;
		sint32					damage_modifier;
		float					hit_bonus;
		int32					damage_type;
	};
	struct ItemEffect{
		EQ2_16BitString			effect;
		int8					percentage;
		int8					subbulletflag;
	};
	struct BookPage {
		int8					page;
		EQ2_16BitString			page_text;
		int8					valign;
		int8					halign;
	};
	#pragma pack()
	Item();
	Item(Item* in_item);
	~Item();
	string					lowername;
	string					name;
	string					description;
	int16					stack_count;
	int32					sell_price;
	int32					sell_status;
	int32					max_sell_value;
	bool					save_needed;
	int8					weapon_type;
	string					adornment;
	string					creator;
	int32					adorn0;
	int32					adorn1;
	int32					adorn2;
	vector<Classifications*>classifications;  //classifications MJ
	vector<ItemStat*>		item_stats;
	vector<ItemSet*>		item_sets;
	vector<ItemStatString*>	item_string_stats;
	vector<ItemLevelOverride*> item_level_overrides;
	vector<ItemEffect*>		item_effects;
	vector<BookPage*>		book_pages;
	Generic_Info			generic_info;
	Weapon_Info*			weapon_info;
	Ranged_Info*			ranged_info;
	Armor_Info*				armor_info;
	Adornment_Info*			adornment_info;
	Bag_Info*				bag_info;
	Food_Info*				food_info;
	Bauble_Info*			bauble_info;
	Book_Info*				book_info;
	Book_Info_Pages*		book_info_pages;
	HouseItem_Info*			houseitem_info;
	HouseContainer_Info*    housecontainer_info;
	Skill_Info*				skill_info;
	RecipeBook_Info*		recipebook_info;
	ItemSet_Info*			itemset_info;
	Thrown_Info*			thrown_info;
	vector<int8>			slot_data;
	ItemCore				details;
	int32					spell_id;
	int8					spell_tier;
	string					item_script;

	void AddEffect(string effect, int8 percentage, int8 subbulletflag);
	void AddBookPage(int8 page, string page_text,int8 valign, int8 halign);
	int32 GetMaxSellValue();
	void SetMaxSellValue(int32 val);
	void SetItem(Item* old_item);
	int16 GetOverrideLevel(int8 adventure_class, int8 tradeskill_class);
	void AddLevelOverride(int8 adventure_class, int8 tradeskill_class, int16 level);
	void AddLevelOverride(ItemLevelOverride* class_);
	bool CheckClassLevel(int8 adventure_class, int8 tradeskill_class, int16 level);
	bool CheckClass(int8 adventure_class, int8 tradeskill_class);
	bool CheckLevel(int8 adventure_class, int8 tradeskill_class, int16 level);
	void SetAppearance(int16 type, int8 red, int8 green, int8 blue, int8 highlight_red, int8 highlight_green, int8 highlight_blue);
	void SetAppearance(ItemAppearance* appearance);
	void AddStat(ItemStat* in_stat);
	void AddSet(ItemSet* in_set);
	void AddStatString(ItemStatString* in_stat);
	void AddStat(int8 type, int16 subtype, float value, char* name = 0);
	void AddSet(int32 item_id, int32 item_crc, int16 item_icon, int32 item_stack_size, int32 item_list_color);
	void SetWeaponType(int8 type);
	int8 GetWeaponType();
	bool HasSlot(int8 slot, int8 slot2 = 255);
	bool HasAdorn0();
	bool HasAdorn1();
	bool HasAdorn2();
	bool IsNormal();
	bool IsWeapon();
	bool IsArmor();
	bool IsRanged();
	bool IsBag();
	bool IsFood();
	bool IsBauble();
	bool IsSkill();
	bool IsHouseItem();
	bool IsHouseContainer();
	bool IsShield();
	bool IsAdornment();
	bool IsAmmo();
	bool IsBook();
	bool IsChainArmor();
	bool IsClothArmor();
	bool IsCollectable();
	bool IsCloak();
	bool IsCrushWeapon();
	bool IsFoodFood();
	bool IsFoodDrink();
	bool IsJewelry();
	bool IsLeatherArmor();
	bool IsMisc();
	bool IsPierceWeapon();
	bool IsPlateArmor();
	bool IsPoison();
	bool IsPotion();
	bool IsRecipeBook();
	bool IsSalesDisplay();
	bool IsSlashWeapon();
	bool IsSpellScroll();
	bool IsTinkered();
	bool IsTradeskill();
	bool IsThrown();
	bool IsHarvest();
	void SetItemScript(string name);
	const char*	GetItemScript();
	int32 CalculateRepairCost();

	void SetItemType(int8 in_type);
	void serialize(PacketStruct* packet, bool show_name = false, Player* player = 0, int16 packet_type = 0, int8 subtype = 0, bool loot_item = false);
	EQ2Packet* serialize(int16 version, bool show_name = false, Player* player = 0, bool include_twice = true, int16 packet_type = 0, int8 subtype = 0, bool merchant_item = false, bool loot_item = false);
	PacketStruct* PrepareItem(int16 version, bool merchant_item = false, bool loot_item = false);
	bool CheckFlag(int32 flag);
	bool CheckFlag2(int32 flag);
	void AddSlot(int8 slot_id);
	void SetSlots(int32 slots);
	bool needs_deletion;
};
class MasterItemList{
public:
	~MasterItemList();
	map<int32,Item*> items;

	Item* GetItem(int32 id);
	Item* GetItemByName(const char *name);
	ItemStatsValues* CalculateItemBonuses(int32 item_id, Entity* entity = 0);
	ItemStatsValues* CalculateItemBonuses(Item* desc, Entity* entity = 0, ItemStatsValues* values = 0);
	vector<Item*>* GetItems(string name, int32 itype, int32 ltype, int32 btype, int64 minprice, int64 maxprice, int8 minskill, int8 maxskill, string seller, string adornment, int8 mintier, int8 maxtier, int16 minlevel, int16 maxlevel, sint8 itemclass);
	vector<Item*>* GetItems(map<string, string> criteria);
	void AddItem(Item* item);
	bool IsBag(int32 item_id);
	void RemoveAll();
	static int32 NextUniqueID();
	static void ResetUniqueID(int32 new_id);
	static int32 next_unique_id;
};
class PlayerItemList {
public:
	PlayerItemList();
	~PlayerItemList();
//	int16 number;
	map<int32, Item*> indexed_items;
	map<sint32, map<int16, Item*> > items;
//	map< int8, Item* > inv_items;
//	map< int8, Item* > bank_items;
	bool  SharedBankAddAllowed(Item* item);
	vector<Item*>* GetItemsFromBagID(sint32 bag_id);
	vector<Item*>* GetItemsInBag(Item* bag);
	Item* GetBag(int8 inventory_slot, bool lock = true);
	bool  HasItem(int32 id, bool include_bank = false);
	Item* GetItemFromIndex(int32 index);
	void  MoveItem(Item* item, sint32 inv_slot, int16 slot, bool erase_old = true);
	bool  MoveItem(sint32 to_bag_id, int16 from_index, sint8 to, int8 charges);
	Item* GetItemFromUniqueID(int32 item_id, bool include_bank = false, bool lock = true);
	Item* GetItemFromID(int32 item_id, int8 count = 0, bool include_bank = false, bool lock = true);
	bool  AssignItemToFreeSlot(Item* item);
	int16 GetNumberOfFreeSlots();
	int16 GetNumberOfItems();
	bool  HasFreeSlot();
	bool  HasFreeBagSlot();
	void DestroyItem(int16 index);
	Item* CanStack(Item* item, bool include_bank = false);
	
	void RemoveItem(Item* item, bool delete_item = false);
	void AddItem(Item* item);

	Item* GetItem(sint32 bag_slot, int16 slot);
	
	EQ2Packet*	serialize(Player* player, int16 version);
	uchar* xor_packet;
	uchar* orig_packet;
	map<int32, Item*>* GetAllItems();
	bool HasFreeBankSlot();
	int8 FindFreeBankSlot();

	///<summary>Get the first free slot and store them in the provided variables</summary>
	///<param name='bag_id'>Will contain the bag id of the first free spot</param>
	///<param name='slot'>Will contain the slot id of the first free slot</param>
	///<returns>True if a free slot was found</returns>
	bool GetFirstFreeSlot(sint32* bag_id, sint16* slot);

	/// <summary>Get the first free slot in the bank and store it in the provided variables
	/// <param name='bag_id'>Will contain the bag id of the first free bank slot</param>
	/// <param name='slot'>Will contain the slot id of the first free bank slot</param>
	/// <returns>True if a free bank slot was found</returns>
	bool GetFirstFreeBankSlot(sint32* bag_id, sint16* slot);

	/// <summary></summary>
	Item* GetBankBag(int8 inventory_slot, bool lock = true);

	/// <summary></summary>
	bool AddOverflowItem(Item* item);

	Item* GetOverflowItem();

	void RemoveOverflowItem(Item* item);

	vector<Item*>* GetOverflowItemList();

private:
	void AddItemToPacket(PacketStruct* packet, Player* player, Item* item, int16 i, bool overflow = false);
	void Stack(Item* orig_item, Item* item);
	Mutex MPlayerItems;
	int16 packet_count;
	vector<Item*> overflowItems;
};
class EquipmentItemList{
public:
	EquipmentItemList();
	EquipmentItemList(const EquipmentItemList& list);
	~EquipmentItemList();
	Item* items[NUM_SLOTS];

	vector<Item*>* GetAllEquippedItems();

	bool	HasItem(int32 id);
	int8	GetNumberOfItems();
	Item*	GetItemFromUniqueID(int32 item_id);
	Item*	GetItemFromItemID(int32 item_id);
	void	SetItem(int8 slot_id, Item* item);
	void	RemoveItem(int8 slot, bool delete_item = false);
	Item*	GetItem(int8 slot_id);
	bool	AddItem(int8 slot, Item* item);
	bool	CheckEquipSlot(Item* tmp, int8 slot);
	bool	CanItemBeEquippedInSlot(Item* tmp, int8 slot);
	int8	GetFreeSlot(Item* tmp, int8 slot_id = 255);
	int8	GetSlotByItem(Item* item);
	ItemStatsValues*	CalculateEquipmentBonuses(Entity* entity = 0);
	EQ2Packet* serialize(int16 version, Player* player = 0);
	uchar* xor_packet;
	uchar* orig_packet;
private:
	Mutex MEquipmentItems;
};

#endif

