#ifndef EQEMU_LUA_CLIENT_H
#define EQEMU_LUA_CLIENT_H
#ifdef LUA_EQEMU

#include "lua_mob.h"

class Client;
class Lua_Expedition;
class Lua_Group;
class Lua_Raid;
class Lua_Inventory;
class Lua_Packet;

namespace luabind {
	struct scope;
}

luabind::scope lua_register_client();
luabind::scope lua_register_inventory_where();

class Lua_Client : public Lua_Mob
{
	typedef Client NativeType;
public:
	Lua_Client() { SetLuaPtrData(nullptr); }
	Lua_Client(Client *d) { SetLuaPtrData(reinterpret_cast<Entity*>(d)); }
	virtual ~Lua_Client() { }

	operator Client*() {
		return reinterpret_cast<Client*>(GetLuaPtrData());
	}

	void SendSound();
	void Sit();
	void Save();
	void Save(int commit_now);
	bool Connected();
	bool InZone();
	void Kick();
	void Disconnect();
	bool IsLD();
	void WorldKick();
	void SendToGuildHall();
	void SendToInstance(std::string instance_type, std::string zone_short_name, uint32 instance_version, float x, float y, float z, float heading, std::string instance_identifier, uint32 duration);
	int GetAnon();
	void SetAnon(uint8 anon_flag);
	int GetAFK();
	void SetAFK(uint8 afk_flag);
	void Duck();
	void DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue);
	void DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue, uint8 use_tint);
	void Stand();
	void SetGM(bool v);
	void SetPVP(bool v);
	bool GetPVP();
	bool GetGM();
	void SetBaseClass(int v);
	void SetBaseRace(int v);
	void SetBaseGender(int v);
	uint16 GetClassBitmask();
	uint32 GetDeityBitmask();
	uint16 GetRaceBitmask();
	int GetBaseFace();
	int GetLanguageSkill(int skill_id);
	int GetLDoNPointsTheme(int theme);
	int GetBaseSTR();
	int GetBaseSTA();
	int GetBaseCHA();
	int GetBaseDEX();
	int GetBaseINT();
	int GetBaseAGI();
	int GetBaseWIS();
	int GetWeight();
	uint32 GetEXP();
	float GetEXPModifier();
	float GetEXPModifier(uint32 zone_id);
	float GetEXPModifier(uint32 zone_id, int16 instance_version);
	float GetAAEXPModifier();
	float GetAAEXPModifier(uint32 zone_id);
	float GetAAEXPModifier(uint32 zone_id, int16 instance_version);
	void SetAAEXPModifier(float aa_modifier);
	void SetAAEXPModifier(uint32 zone_id, float aa_modifier);
	void SetAAEXPModifier(uint32 zone_id, float aa_modifier, int16 instance_version);
	void SetEXPModifier(float exp_modifier);
	void SetEXPModifier(uint32 zone_id, float exp_modifier);
	void SetEXPModifier(uint32 zone_id, float exp_modifier, int16 instance_version);
	uint32 GetAAExp();
	uint32 GetAAPercent();
	uint32 GetTotalSecondsPlayed();
	void AddLDoNLoss(uint32 theme_id);
	void AddLDoNWin(uint32 theme_id);
	void RemoveLDoNLoss(uint32 theme_id);
	void RemoveLDoNWin(uint32 theme_id);
	void UpdateLDoNPoints(uint32 theme_id, int points);
	void SetDeity(int v);
	void AddEXP(uint32 add_exp);
	void AddEXP(uint32 add_exp, int conlevel);
	void AddEXP(uint32 add_exp, int conlevel, bool resexp);
	void SetEXP(uint64 set_exp, uint64 set_aaxp);
	void SetEXP(uint64 set_exp, uint64 set_aaxp, bool resexp);
	void SetBindPoint();
	void SetBindPoint(int to_zone);
	void SetBindPoint(int to_zone, int to_instance);
	void SetBindPoint(int to_zone, int to_instance, float new_x);
	void SetBindPoint(int to_zone, int to_instance, float new_x, float new_y);
	void SetBindPoint(int to_zone, int to_instance, float new_x, float new_y, float new_z);
	void SetBindPoint(int to_zone, int to_instance, float new_x, float new_y, float new_z, float new_heading);
	float GetBindX();
	float GetBindX(int index);
	float GetBindY();
	float GetBindY(int index);
	float GetBindZ();
	float GetBindZ(int index);
	float GetBindHeading();
	float GetBindHeading(int index);
	uint32 GetBindZoneID();
	uint32 GetBindZoneID(int index);
	float GetTargetRingX();
	float GetTargetRingY();
	float GetTargetRingZ();
	void MovePC(int zone, float x, float y, float z, float heading);
	void MovePCInstance(int zone, int instance, float x, float y, float z, float heading);
	void MoveZone(const char *zone_short_name);
	void MoveZone(const char *zone_short_name, float x, float y, float z);
	void MoveZone(const char *zone_short_name, float x, float y, float z, float heading);
	void MoveZoneGroup(const char *zone_short_name);
	void MoveZoneGroup(const char *zone_short_name, float x, float y, float z);
	void MoveZoneGroup(const char *zone_short_name, float x, float y, float z, float heading);
	void MoveZoneRaid(const char *zone_short_name);
	void MoveZoneRaid(const char *zone_short_name, float x, float y, float z);
	void MoveZoneRaid(const char *zone_short_name, float x, float y, float z, float heading);
	void MoveZoneInstance(uint16 instance_id);
	void MoveZoneInstance(uint16 instance_id, float x, float y, float z);
	void MoveZoneInstance(uint16 instance_id, float x, float y, float z, float heading);
	void MoveZoneInstanceGroup(uint16 instance_id);
	void MoveZoneInstanceGroup(uint16 instance_id, float x, float y, float z);
	void MoveZoneInstanceGroup(uint16 instance_id, float x, float y, float z, float heading);
	void MoveZoneInstanceRaid(uint16 instance_id);
	void MoveZoneInstanceRaid(uint16 instance_id, float x, float y, float z);
	void MoveZoneInstanceRaid(uint16 instance_id, float x, float y, float z, float heading);
	bool TeleportToPlayerByCharID(uint32 character_id);
	bool TeleportToPlayerByName(std::string player_name);
	bool TeleportGroupToPlayerByCharID(uint32 character_id);
	bool TeleportGroupToPlayerByName(std::string player_name);
	bool TeleportRaidToPlayerByCharID(uint32 character_id);
	bool TeleportRaidToPlayerByName(std::string player_name);
	void ChangeLastName(std::string last_name);
	int GetFactionLevel(uint32 char_id, uint32 npc_id, uint32 race, uint32 class_, uint32 deity, uint32 faction, Lua_NPC npc);
	void SetFactionLevel(uint32 char_id, uint32 npc_faction_id, int char_class, int char_race, int char_deity);
	void SetFactionLevel2(uint32 char_id, int faction_id, int char_class, int char_race, int char_deity, int value, int temp);
	void RewardFaction(int id, int amount);
	int GetRawItemAC();
	uint32 AccountID();
	const char *AccountName();
	int16 Admin();
	uint32 CharacterID();
	int GuildRank();
	uint32 GuildID();
	int GetFace();
	void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum);
	void AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client);
	void AddPlatinum(uint32 platinum);
	void AddPlatinum(uint32 platinum, bool update_client);
	bool TakeMoneyFromPP(uint64 copper);
	bool TakeMoneyFromPP(uint64 copper, bool update_client);
	bool TakePlatinum(uint32 platinum);
	bool TakePlatinum(uint32 platinum, bool update_client);
	bool TGB();
	int GetSkillPoints();
	void SetSkillPoints(int skill);
	void IncreaseSkill(int skill_id);
	void IncreaseSkill(int skill_id, int value);
	void IncreaseLanguageSkill(uint8 language_id);
	void IncreaseLanguageSkill(uint8 language_id, uint8 increase);
	int GetRawSkill(int skill_id);
	bool HasSkill(int skill_id);
	bool CanHaveSkill(int skill_id);
	void SetSkill(int skill_id, int value);
	void AddSkill(int skill_id, int value);
	void CheckSpecializeIncrease(int spell_id);
	void CheckIncreaseSkill(int skill_id, Lua_Mob target);
	void CheckIncreaseSkill(int skill_id, Lua_Mob target, int chance_mod);
	void SetLanguageSkill(uint8 language_id, uint8 language_skill);
	int MaxSkill(int skill_id);
	bool IsMedding();
	int GetDuelTarget();
	bool IsDueling();
	void SetDuelTarget(int c);
	void SetDueling(bool v);
	void ResetAA();
	void MemSpell(int spell_id, int slot);
	void MemSpell(int spell_id, int slot, bool update_client);
	void UnmemSpell(int slot);
	void UnmemSpell(int slot, bool update_client);
	void UnmemSpellBySpellID(int32 spell_id);
	void UnmemSpellAll();
	void UnmemSpellAll(bool update_client);
	int FindEmptyMemSlot();
	uint16 FindMemmedSpellBySlot(int slot);
	int FindMemmedSpellBySpellID(uint16 spell_id);
	int MemmedCount();
	luabind::object GetLearnableDisciplines(lua_State* L);
	luabind::object GetLearnableDisciplines(lua_State* L, uint8 min_level);
	luabind::object GetLearnableDisciplines(lua_State* L, uint8 min_level, uint8 max_level);
	luabind::object GetLearnedDisciplines(lua_State* L);
	luabind::object GetMemmedSpells(lua_State* L);
	luabind::object GetScribedSpells(lua_State* L);
	luabind::object GetScribeableSpells(lua_State* L);
	luabind::object GetScribeableSpells(lua_State* L, uint8 min_level);
	luabind::object GetScribeableSpells(lua_State* L, uint8 min_level, uint8 max_level);
	void ScribeSpell(int spell_id, int slot);
	void ScribeSpell(int spell_id, int slot, bool update_client);
	uint16 ScribeSpells(uint8 min_level, uint8 max_level);
	void UnscribeSpell(int slot);
	void UnscribeSpell(int slot, bool update_client);
	void UnscribeSpellAll();
	void UnscribeSpellAll(bool update_client);
	void UnscribeSpellBySpellID(uint16 spell_id);
	void UnscribeSpellBySpellID(uint16 spell_id, bool update_client);
	void TrainDisc(int itemid);
	uint16 LearnDisciplines(uint8 min_level, uint8 max_level);
	void TrainDiscBySpellID(int32 spell_id);
	int GetDiscSlotBySpellID(int32 spell_id);
	void UntrainDisc(int slot);
	void UntrainDisc(int slot, bool update_client);
	void UntrainDiscBySpellID(uint16 spell_id);
	void UntrainDiscBySpellID(uint16 spell_id, bool update_client);
	void UntrainDiscAll();
	void UntrainDiscAll(bool update_client);
	bool IsStanding();
	bool IsSitting();
	bool IsCrouching();
	void SetFeigned(bool v);
	bool GetFeigned();
	bool AutoSplitEnabled();
	void SetHorseId(int id);
	int GetHorseId();
	void NukeItem(uint32 item_num);
	void NukeItem(uint32 item_num, int where_to_check);
	void SetTint(int slot_id, uint32 color);
	void SetMaterial(int slot_id, uint32 item_id);
	void Undye();
	int GetItemIDAt(int slot_id);
	int GetAugmentIDAt(int slot_id, int aug_slot);
	void DeleteItemInInventory(int slot_id, int quantity);
	void DeleteItemInInventory(int slot_id, int quantity, bool update_client);
	void SummonItem(uint32 item_id);
	void SummonItem(uint32 item_id, int charges);
	void SummonItem(uint32 item_id, int charges, uint32 aug1);
	void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2);
	void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3);
	void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4);
	void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5);
	void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5,
		bool attuned);
	void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5,
		bool attuned, int to_slot);
	void SummonBaggedItems(uint32 bag_item_id, luabind::adl::object bag_items_table);
	void SetStats(int type, int value);
	void IncStats(int type, int value);
	void DropItem(int slot_id);
	void BreakInvis();
	void LeaveGroup();
	bool IsGrouped();
	bool IsRaidGrouped();
	bool Hungry();
	bool Thirsty();
	int GetInstrumentMod(int spell_id);
	bool DecreaseByID(uint32 type, int amt);
	void Escape();
	void GoFish();
	void ForageItem();
	void ForageItem(bool guarantee);
	float CalcPriceMod(Lua_Mob other, bool reverse);
	void ResetTrade();
	uint32 GetDisciplineTimer(uint32 timer_id);
	void ResetDisciplineTimer(uint32 timer_id);
	void ResetCastbarCooldownBySlot(int slot);
	void ResetAllCastbarCooldowns();
	void ResetCastbarCooldownBySpellID(uint32 spell_id);
	void ResetAllDisciplineTimers();
	bool UseDiscipline(int spell_id, int target_id);
	bool HasDisciplineLearned(uint16 spell_id);
	int GetCharacterFactionLevel(int faction_id);
	void ClearZoneFlag(uint32 zone_id);
	bool HasZoneFlag(uint32 zone_id);
	void LoadZoneFlags();
	void SendZoneFlagInfo(Lua_Client to);
	void SetZoneFlag(uint32 zone_id);
	void ClearPEQZoneFlag(uint32 zone_id);
	bool HasPEQZoneFlag(uint32 zone_id);
	void LoadPEQZoneFlags();
	void SendPEQZoneFlagInfo(Lua_Client to);
	void SetPEQZoneFlag(uint32 zone_id);
	void SetAATitle(std::string title);
	void SetAATitle(std::string title, bool save_to_database);
	int GetClientVersion();
	uint32 GetClientVersionBit();
	void SetTitleSuffix(const char *text);
	void EnableTitleSet(uint32 title_set);
	void SetAAPoints(int points);
	int GetAAPoints();
	int GetSpentAA();
	void AddAAPoints(int points);
	void RefundAA();
	int GetModCharacterFactionLevel(int faction);
	int GetLDoNWins();
	int GetLDoNLosses();
	int GetLDoNWinsTheme(int theme);
	int GetLDoNLossesTheme(int theme);
	int GetStartZone();
	void SetStartZone(int zone_id);
	void SetStartZone(int zone_id, float x);
	void SetStartZone(int zone_id, float x, float y);
	void SetStartZone(int zone_id, float x, float y, float z);
	void SetStartZone(int zone_id, float x, float y, float z, float heading);
	void AddPVPPoints(uint32 points);
	void AddCrystals(uint32 radiant_count, uint32 ebon_count);
	void SetEbonCrystals(uint32 value);
	void SetRadiantCrystals(uint32 value);
	uint32 GetPVPPoints();
	uint32 GetRadiantCrystals();
	uint32 GetEbonCrystals();
	void QuestReadBook(const char *text, int type);
	void ReadBookByName(std::string book_name, uint8 book_type);
	void UpdateGroupAAs(int points, uint32 type);
	uint32 GetGroupPoints();
	uint32 GetRaidPoints();
	void LearnRecipe(uint32 recipe_id);
	int GetRecipeMadeCount(uint32 recipe_id);
	bool HasRecipeLearned(uint32 recipe_id);
	int GetEndurance();
	int GetMaxEndurance();
	int GetEndurancePercent();
	void SetEndurance(int endur);
	void SendOPTranslocateConfirm(Lua_Mob caster, int spell_id);
	uint32 GetIP();
	std::string GetIPString();
	int GetIPExemption();
	void SetIPExemption(int exemption_amount);
	void AddLevelBasedExp(int exp_pct);
	void AddLevelBasedExp(int exp_pct, int max_level);
	void AddLevelBasedExp(int exp_pct, int max_level, bool ignore_mods);
	void IncrementAA(int aa);
	bool GrantAlternateAdvancementAbility(int aa_id, int points);
	bool GrantAlternateAdvancementAbility(int aa_id, int points, bool ignore_cost);
	void ResetAlternateAdvancementRank(int aa_id);
	void MarkSingleCompassLoc(float in_x, float in_y, float in_z);
	void MarkSingleCompassLoc(float in_x, float in_y, float in_z, int count);
	void ClearCompassMark();
	int GetNextAvailableSpellBookSlot();
	int GetNextAvailableSpellBookSlot(int start);
	int GetNextAvailableDisciplineSlot();
	int GetNextAvailableDisciplineSlot(int starting_slot);
	uint32 GetSpellIDByBookSlot(int book_slot);
	int FindSpellBookSlotBySpellID(int spell_id);
	void UpdateTaskActivity(int task, int activity, int count);
	void AssignTask(int task_id);
	void AssignTask(int task_id, int npc_id);
	void AssignTask(int task_id, int npc_id, bool enforce_level_requirement);
	void FailTask(int task);
	bool IsTaskCompleted(int task_id);
	bool IsTaskActive(int task);
	bool IsTaskActivityActive(int task, int activity);
	void LockSharedTask(bool lock);
	void EndSharedTask();
	void EndSharedTask(bool send_fail);
	int64 GetCorpseCount();
	int GetCorpseID(int corpse);
	int GetCorpseItemAt(int corpse, int slot);
	void AssignToInstance(int instance_id);
	void Freeze();
	void UnFreeze();
	uint32 GetAggroCount();
	uint64 GetCarriedMoney();
	uint32 GetCarriedPlatinum();
	uint64 GetAllMoney();
	uint32 GetMoney(uint8 type, uint8 subtype);
	void OpenLFGuildWindow();
	void NotifyNewTitlesAvailable();
	void Signal(int signal_id);
	void AddAlternateCurrencyValue(uint32 currency, int amount);
	void SetAlternateCurrencyValue(uint32 currency, uint32 amount);
	uint32 GetAlternateCurrencyValue(uint32 currency);
	void SendWebLink(const char *site);
	bool HasSpellScribed(int spell_id);
	void ClearAccountFlag(const std::string& flag);
	void SetAccountFlag(const std::string& flag, const std::string& value);
	std::string GetAccountFlag(const std::string& flag);
	luabind::object GetAccountFlags(lua_State* L);
	int GetAccountAge();
	Lua_Group GetGroup();
	Lua_Raid GetRaid();
	bool PutItemInInventory(int slot_id, Lua_ItemInst inst);
	bool PushItemOnCursor(Lua_ItemInst inst);
	Lua_Inventory GetInventory();
	void SendItemScale(Lua_ItemInst inst);
	void QueuePacket(Lua_Packet app);
	void QueuePacket(Lua_Packet app, bool ack_req);
	void QueuePacket(Lua_Packet app, bool ack_req, int client_connection_status);
	void QueuePacket(Lua_Packet app, bool ack_req, int client_connection_status, int filter);
	int GetHunger();
	int GetThirst();
	int GetIntoxication();
	void SetHunger(int in_hunger);
	void SetThirst(int in_thirst);
	void SetConsumption(int in_hunger, int in_thirst);
	void SendMarqueeMessage(uint32 type, std::string message);
	void SendMarqueeMessage(uint32 type, std::string message, uint32 duration);
	void SendMarqueeMessage(uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, std::string message);
	void SendColoredText(uint32 type, std::string msg);
	void PlayMP3(std::string file);
	void QuestReward(Lua_Mob target);
	void QuestReward(Lua_Mob target, uint32 copper);
	void QuestReward(Lua_Mob target, uint32 copper, uint32 silver);
	void QuestReward(Lua_Mob target, uint32 copper, uint32 silver, uint32 gold);
	void QuestReward(Lua_Mob target, uint32 copper, uint32 silver, uint32 gold, uint32 platinum);
	void QuestReward(Lua_Mob target, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, uint32 itemid);
	void QuestReward(Lua_Mob target, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, uint32 itemid, uint32 exp);
	void QuestReward(Lua_Mob target, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, uint32 itemid, uint32 exp, bool faction);
	void QuestReward(Lua_Mob target, luabind::adl::object reward);
	void CashReward(uint32 copper, uint32 silver, uint32 gold, uint32 platinum);
	bool IsDead();
	int CalcCurrentWeight();
	int CalcATK();
	void FilteredMessage(Lua_Mob sender, uint32 type, int filter, const char* message);
	void EnableAreaHPRegen(int value);
	void DisableAreaHPRegen();
	void EnableAreaManaRegen(int value);
	void DisableAreaManaRegen();
	void EnableAreaEndRegen(int value);
	void DisableAreaEndRegen();
	void EnableAreaRegens(int value);
	void DisableAreaRegens();
	void SetHideMe(bool hide_me_state);
	void Popup(const char* title, const char* text);
	void Popup(const char* title, const char* text, uint32 popup_id);
	void Popup(const char* title, const char* text, uint32 popup_id, uint32 negative_id);
	void Popup(const char* title, const char* text, uint32 popup_id, uint32 negative_id, uint32 button_type);
	void Popup(const char* title, const char* text, uint32 popup_id, uint32 negative_id, uint32 button_type, uint32 duration);
	void Popup(const char* title, const char* text, uint32 popup_id, uint32 negative_id, uint32 button_type, uint32 duration, const char* button_name_one, const char* button_name_two);
	void Popup(const char* title, const char* text, uint32 popup_id, uint32 negative_id, uint32 button_type, uint32 duration, const char* button_name_one, const char* button_name_two, uint32 sound_controls);
	uint32 CountItem(uint32 item_id);
	void RemoveItem(uint32 item_id);
	void RemoveItem(uint32 item_id, uint32 quantity);
	void SetGMStatus(int new_status);
	int16 GetGMStatus();
	void AddItem(luabind::object item_table);
	uint32 CountAugmentEquippedByID(uint32 item_id);
	uint32 CountItemEquippedByID(uint32 item_id);
	bool HasAugmentEquippedByID(uint32 item_id);
	bool HasItemEquippedByID(uint32 item_id);
	int GetHealAmount();
	int GetSpellDamage();
	void UpdateAdmin();
	void UpdateAdmin(bool from_database);
	luabind::object GetPEQZoneFlags(lua_State* L);
	luabind::object GetZoneFlags(lua_State* L);
	void SendPayload(int payload_id);
	void SendPayload(int payload_id, std::string payload_value);
	std::string GetGuildPublicNote();
	void MaxSkills();
	luabind::object GetAugmentIDsBySlotID(lua_State* L, int16 slot_id);
	bool IsEXPEnabled();
	void SetEXPEnabled(bool is_exp_enabled);
	uint64 CalcEXP(uint8 consider_level);
	uint64 CalcEXP(uint8 consider_level, bool ignore_modifiers);
	bool CanEnterZone(std::string zone_short_name);
	bool CanEnterZone(std::string zone_short_name, int16 instance_version);
	void SendPath(Lua_Mob target);
	void ResetItemCooldown(uint32 item_id);
	void SetItemCooldown(uint32 item_id, uint32 in_time);
	uint32 GetItemCooldown(uint32 item_id);
	void UseAugmentContainer(int container_slot);
	bool IsAutoAttackEnabled();
	bool IsAutoFireEnabled();
	uint32 GetEXPForLevel(uint16 check_level);
	std::string GetClassAbbreviation();
	std::string GetRaceAbbreviation();
	void SetLDoNPoints(uint32 theme_id, uint32 points);
	void DeleteBucket(std::string bucket_name);
	std::string GetBucket(std::string bucket_name);
	std::string GetBucketExpires(std::string bucket_name);
	std::string GetBucketRemaining(std::string bucket_name);
	void SetBucket(std::string bucket_name, std::string bucket_value);
	void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration);
	void GrantAllAAPoints();
	void GrantAllAAPoints(uint8 unlock_level);
	void GrantAllAAPoints(uint8 unlock_level, bool skip_grant_only);
	void AddEbonCrystals(uint32 amount);
	void AddRadiantCrystals(uint32 amount);
	void RemoveEbonCrystals(uint32 amount);
	void RemoveRadiantCrystals(uint32 amount);
	void SummonItemIntoInventory(luabind::object item_table);
	bool HasItemOnCorpse(uint32 item_id);
	void ClearXTargets();
	int GetAAEXPPercentage();
	int GetEXPPercentage();
	bool IsInAGuild();
	luabind::object GetRaidOrGroupOrSelf(lua_State* L);
	luabind::object GetRaidOrGroupOrSelf(lua_State* L, bool clients_only);
	std::string GetAutoLoginCharacterName();
	bool SetAutoLoginCharacterName();
	bool SetAutoLoginCharacterName(std::string character_name);
	void DescribeSpecialAbilities(Lua_NPC n);
	void ResetLeadershipAA();
	uint8 GetSkillTrainLevel(int skill_id);
	void AreaTaunt();
	void AreaTaunt(float range);
	void AreaTaunt(float range, int bonus_hate);
	luabind::object GetInventorySlots(lua_State* L);
	void SetAAEXPPercentage(uint8 percentage);
	std::string GetBandolierName(uint8 bandolier_slot);
	uint32 GetBandolierItemIcon(uint8 bandolier_slot, uint8 slot_id);
	uint32 GetBandolierItemID(uint8 bandolier_slot, uint8 slot_id);
	std::string GetBandolierItemName(uint8 bandolier_slot, uint8 slot_id);
	uint32 GetPotionBeltItemIcon(uint8 slot_id);
	uint32 GetPotionBeltItemID(uint8 slot_id);
	std::string GetPotionBeltItemName(uint8 slot_id);
	bool KeyRingAdd(uint32 item_id);
	bool KeyRingCheck(uint32 item_id);
	bool KeyRingClear();
	void KeyRingList();
	void KeyRingList(Lua_Client c);
	bool KeyRingRemove(uint32 item_id);
	bool CompleteTask(int task_id);
	bool UncompleteTask(int task_id);
	luabind::object GetKeyRing(lua_State* L);

	// account data buckets
	void SetAccountBucket(std::string bucket_name, std::string bucket_value);
	void SetAccountBucket(std::string bucket_name, std::string bucket_value, std::string expiration = "");
	void DeleteAccountBucket(std::string bucket_name);
	std::string GetAccountBucket(std::string bucket_name);
	std::string GetAccountBucketExpires(std::string bucket_name);
	std::string GetAccountBucketRemaining(std::string bucket_name);

	void ApplySpell(int spell_id);
	void ApplySpell(int spell_id, int duration);
	void ApplySpell(int spell_id, int duration, int level);
	void ApplySpell(int spell_id, int duration, int level, bool allow_pets);
	void ApplySpell(int spell_id, int duration, int level, bool allow_pets, bool allow_bots);

	void ApplySpellGroup(int spell_id);
	void ApplySpellGroup(int spell_id, int duration);
	void ApplySpellGroup(int spell_id, int duration, int level);
	void ApplySpellGroup(int spell_id, int duration, int level, bool allow_pets);
	void ApplySpellGroup(int spell_id, int duration, int level, bool allow_pets, bool allow_bots);

	void ApplySpellRaid(int spell_id);
	void ApplySpellRaid(int spell_id, int duration);
	void ApplySpellRaid(int spell_id, int duration, int level);
	void ApplySpellRaid(int spell_id, int duration, int level, bool allow_pets);
	void ApplySpellRaid(int spell_id, int duration, int level, bool allow_pets, bool is_raid_group_only);
	void ApplySpellRaid(int spell_id, int duration, int level, bool allow_pets, bool is_raid_group_only, bool allow_bots);

	void SetSpellDuration(int spell_id);
	void SetSpellDuration(int spell_id, int duration);
	void SetSpellDuration(int spell_id, int duration, int level);
	void SetSpellDuration(int spell_id, int duration, int level, bool allow_pets);
	void SetSpellDuration(int spell_id, int duration, int level, bool allow_pets, bool allow_bots);

	void SetSpellDurationGroup(int spell_id);
	void SetSpellDurationGroup(int spell_id, int duration);
	void SetSpellDurationGroup(int spell_id, int duration, int level);
	void SetSpellDurationGroup(int spell_id, int duration, int level, bool allow_pets);
	void SetSpellDurationGroup(int spell_id, int duration, int level, bool allow_pets, bool allow_bots);

	void SetSpellDurationRaid(int spell_id);
	void SetSpellDurationRaid(int spell_id, int duration);
	void SetSpellDurationRaid(int spell_id, int duration, int level);
	void SetSpellDurationRaid(int spell_id, int duration, int level, bool allow_pets);
	void SetSpellDurationRaid(int spell_id, int duration, int level, bool allow_pets, bool is_raid_group_only);
	void SetSpellDurationRaid(int spell_id, int duration, int level, bool allow_pets, bool is_raid_group_only, bool allow_bots);


	int GetEnvironmentDamageModifier();
	void SetEnvironmentDamageModifier(int value);
	bool GetInvulnerableEnvironmentDamage();
	void SetInvulnerableEnvironmentDamage(bool value);

	void SetPrimaryWeaponOrnamentation(uint32 model_id);
	void SetSecondaryWeaponOrnamentation(uint32 model_id);
	void TaskSelector(luabind::adl::object table);
	void TaskSelector(luabind::adl::object table, bool ignore_cooldown);

	void SetClientMaxLevel(uint8 max_level);
	uint8 GetClientMaxLevel();

	bool SendGMCommand(std::string message);
	bool SendGMCommand(std::string message, bool ignore_status);

	int GetBotRequiredLevel();
	int GetBotRequiredLevel(uint8 class_id);
	uint32 GetBotCreationLimit();
	uint32 GetBotCreationLimit(uint8 class_id);
	int GetBotSpawnLimit();
	int GetBotSpawnLimit(uint8 class_id);
	void SetBotRequiredLevel(int new_required_level);
	void SetBotRequiredLevel(int new_required_level, uint8 class_id);
	void SetBotCreationLimit(uint32 new_creation_limit);
	void SetBotCreationLimit(uint32 new_creation_limit, uint8 class_id);
	void SetBotSpawnLimit(int new_spawn_limit);
	void SetBotSpawnLimit(int new_spawn_limit, uint8 class_id);
	void CampAllBots();
	void CampAllBots(uint8 class_id);
	bool RemoveAAPoints(uint32 points);
	bool RemoveAlternateCurrencyValue(uint32 currency_id, uint32 amount);
	bool AreTasksCompleted(luabind::object task_ids);

	void DialogueWindow(std::string markdown);

	bool ReloadDataBuckets();
	void ShowZoneShardMenu();
	void GrantPetNameChange();

	void GrantNameChange();
	bool IsNameChangeAllowed();
	bool ClearNameChange();

	Lua_Expedition  CreateExpedition(luabind::object expedition_info);
	Lua_Expedition  CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players);
	Lua_Expedition  CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool disable_messages);
	Lua_Expedition  CreateExpeditionFromTemplate(uint32_t dz_template_id);
	Lua_Expedition  GetExpedition();
	luabind::object GetExpeditionLockouts(lua_State* L);
	luabind::object GetExpeditionLockouts(lua_State* L, std::string expedition_name);
	std::string     GetLockoutExpeditionUUID(std::string expedition_name, std::string event_name);
	void            AddExpeditionLockout(std::string expedition_name, std::string event_name, uint32 seconds);
	void            AddExpeditionLockout(std::string expedition_name, std::string event_name, uint32 seconds, std::string uuid);
	void            AddExpeditionLockoutDuration(std::string expedition_name, std::string event_name, int seconds);
	void            AddExpeditionLockoutDuration(std::string expedition_name, std::string event_name, int seconds, std::string uuid);
	void            RemoveAllExpeditionLockouts();
	void            RemoveAllExpeditionLockouts(std::string expedition_name);
	void            RemoveExpeditionLockout(std::string expedition_name, std::string event_name);
	bool            HasExpeditionLockout(std::string expedition_name, std::string event_name);
	void            MovePCDynamicZone(uint32 zone_id);
	void            MovePCDynamicZone(uint32 zone_id, int zone_version);
	void            MovePCDynamicZone(uint32 zone_id, int zone_version, bool msg_if_invalid);
	void            MovePCDynamicZone(std::string zone_name);
	void            MovePCDynamicZone(std::string zone_name, int zone_version);
	void            MovePCDynamicZone(std::string zone_name, int zone_version, bool msg_if_invalid);
	void            CreateTaskDynamicZone(int task_id, luabind::object dz_table);
	void            Fling(float target_x, float target_y, float target_z);
	void            Fling(float target_x, float target_y, float target_z, bool ignore_los);
	void            Fling(float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls);
	void            Fling(float value, float target_x, float target_y, float target_z);
	void            Fling(float value, float target_x, float target_y, float target_z, bool ignore_los);
	void            Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls);
};

#endif
#endif
