mirror of
https://github.com/azerothcore/mod-ale
synced 2025-11-29 15:38:17 +08:00
3061 lines
82 KiB
C++
3061 lines
82 KiB
C++
/*
|
|
* Copyright (C) 2010 - 2016 Eluna Lua Engine <http://emudevs.com/>
|
|
* This program is free software licensed under GPL version 3
|
|
* Please see the included DOCS/LICENSE.md for more information
|
|
*/
|
|
|
|
#ifndef UNITMETHODS_H
|
|
#define UNITMETHODS_H
|
|
|
|
/***
|
|
* Inherits all methods from: [Object], [WorldObject]
|
|
*/
|
|
namespace LuaUnit
|
|
{
|
|
/**
|
|
* The [Unit] tries to attack a given target
|
|
*
|
|
* @param [Unit] who : [Unit] to attack
|
|
* @param bool meleeAttack = false: attack with melee or not
|
|
* @return didAttack : if the [Unit] did not attack
|
|
*/
|
|
int Attack(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* who = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
bool meleeAttack = Eluna::CHECKVAL<bool>(L, 3, false);
|
|
|
|
Eluna::Push(L, unit->Attack(who, meleeAttack));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] stops attacking its target
|
|
*
|
|
* @return bool isAttacking : if the [Unit] wasn't attacking already
|
|
*/
|
|
int AttackStop(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->AttackStop());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is standing.
|
|
*
|
|
* @return bool isStanding
|
|
*/
|
|
int IsStandState(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsStandState());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is mounted.
|
|
*
|
|
* @return bool isMounted
|
|
*/
|
|
int IsMounted(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsMounted());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is rooted.
|
|
*
|
|
* @return bool isRooted
|
|
*/
|
|
int IsRooted(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef AZEROTHCORE
|
|
Eluna::Push(L, unit->isInRoots() || unit->HasUnitMovementFlag(MOVEMENTFLAG_ROOT));
|
|
#endif
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->IsRooted() || unit->HasUnitMovementFlag(MOVEMENTFLAG_ROOT));
|
|
#endif
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isInRoots() || unit->IsRooted());
|
|
#endif
|
|
#ifdef MANGOS
|
|
Eluna::Push(L, unit->IsInRoots() || unit->IsRooted());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] has full health.
|
|
*
|
|
* @return bool hasFullHealth
|
|
*/
|
|
int IsFullHealth(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsFullHealth());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is in an accessible place for the given [Creature].
|
|
*
|
|
* @param [WorldObject] obj
|
|
* @param float radius
|
|
* @return bool isAccessible
|
|
*/
|
|
int IsInAccessiblePlaceFor(lua_State* L, Unit* unit)
|
|
{
|
|
Creature* creature = Eluna::CHECKOBJ<Creature>(L, 2);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->isInAccessiblePlaceFor(creature));
|
|
#else
|
|
Eluna::Push(L, unit->isInAccessablePlaceFor(creature));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] an auctioneer.
|
|
*
|
|
* @return bool isAuctioneer
|
|
*/
|
|
int IsAuctioneer(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->IsAuctioner());
|
|
#else
|
|
Eluna::Push(L, unit->isAuctioner());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] a guild master.
|
|
*
|
|
* @return bool isGuildMaster
|
|
*/
|
|
int IsGuildMaster(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isGuildMaster());
|
|
#else
|
|
Eluna::Push(L, unit->IsGuildMaster());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] an innkeeper.
|
|
*
|
|
* @return bool isInnkeeper
|
|
*/
|
|
int IsInnkeeper(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isInnkeeper());
|
|
#else
|
|
Eluna::Push(L, unit->IsInnkeeper());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] a trainer.
|
|
*
|
|
* @return bool isTrainer
|
|
*/
|
|
int IsTrainer(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isTrainer());
|
|
#else
|
|
Eluna::Push(L, unit->IsTrainer());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is able to show a gossip window.
|
|
*
|
|
* @return bool hasGossip
|
|
*/
|
|
int IsGossip(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isGossip());
|
|
#else
|
|
Eluna::Push(L, unit->IsGossip());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a taxi master.
|
|
*
|
|
* @return bool isTaxi
|
|
*/
|
|
int IsTaxi(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isTaxi());
|
|
#else
|
|
Eluna::Push(L, unit->IsTaxi());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a spirit healer.
|
|
*
|
|
* @return bool isSpiritHealer
|
|
*/
|
|
int IsSpiritHealer(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isSpiritHealer());
|
|
#else
|
|
Eluna::Push(L, unit->IsSpiritHealer());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a spirit guide.
|
|
*
|
|
* @return bool isSpiritGuide
|
|
*/
|
|
int IsSpiritGuide(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isSpiritGuide());
|
|
#else
|
|
Eluna::Push(L, unit->IsSpiritGuide());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a tabard designer.
|
|
*
|
|
* @return bool isTabardDesigner
|
|
*/
|
|
int IsTabardDesigner(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isTabardDesigner());
|
|
#else
|
|
Eluna::Push(L, unit->IsTabardDesigner());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] provides services like vendor, training and auction.
|
|
*
|
|
* @return bool isTabardDesigner
|
|
*/
|
|
int IsServiceProvider(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isServiceProvider());
|
|
#else
|
|
Eluna::Push(L, unit->IsServiceProvider());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a spirit guide or spirit healer.
|
|
*
|
|
* @return bool isSpiritService
|
|
*/
|
|
int IsSpiritService(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isSpiritService());
|
|
#else
|
|
Eluna::Push(L, unit->IsSpiritService());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is alive.
|
|
*
|
|
* @return bool isAlive
|
|
*/
|
|
int IsAlive(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isAlive());
|
|
#else
|
|
Eluna::Push(L, unit->IsAlive());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is dead.
|
|
*
|
|
* @return bool isDead
|
|
*/
|
|
int IsDead(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef MANGOS
|
|
Eluna::Push(L, unit->IsDead());
|
|
#else
|
|
Eluna::Push(L, unit->isDead());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is dying.
|
|
*
|
|
* @return bool isDying
|
|
*/
|
|
int IsDying(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef MANGOS
|
|
Eluna::Push(L, unit->IsDying());
|
|
#else
|
|
Eluna::Push(L, unit->isDying());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a banker.
|
|
*
|
|
* @return bool isBanker
|
|
*/
|
|
int IsBanker(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isBanker());
|
|
#else
|
|
Eluna::Push(L, unit->IsBanker());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a vendor.
|
|
*
|
|
* @return bool isVendor
|
|
*/
|
|
int IsVendor(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isVendor());
|
|
#else
|
|
Eluna::Push(L, unit->IsVendor());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a battle master.
|
|
*
|
|
* @return bool isBattleMaster
|
|
*/
|
|
int IsBattleMaster(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isBattleMaster());
|
|
#else
|
|
Eluna::Push(L, unit->IsBattleMaster());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a charmed.
|
|
*
|
|
* @return bool isCharmed
|
|
*/
|
|
int IsCharmed(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isCharmed());
|
|
#else
|
|
Eluna::Push(L, unit->IsCharmed());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is an armorer and can repair equipment.
|
|
*
|
|
* @return bool isArmorer
|
|
*/
|
|
int IsArmorer(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isArmorer());
|
|
#else
|
|
Eluna::Push(L, unit->IsArmorer());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is attacking a player.
|
|
*
|
|
* @return bool isAttackingPlayer
|
|
*/
|
|
int IsAttackingPlayer(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->isAttackingPlayer());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] flagged for PvP.
|
|
*
|
|
* @return bool isPvP
|
|
*/
|
|
int IsPvPFlagged(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsPvP());
|
|
return 1;
|
|
}
|
|
|
|
#ifndef CLASSIC
|
|
/**
|
|
* Returns true if the [Unit] is on a [Vehicle].
|
|
*
|
|
* @return bool isOnVehicle
|
|
*/
|
|
int IsOnVehicle(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetVehicle());
|
|
#else
|
|
Eluna::Push(L, unit->IsBoarded());
|
|
#endif
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Returns true if the [Unit] is in combat.
|
|
*
|
|
* @return bool inCombat
|
|
*/
|
|
int IsInCombat(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isInCombat());
|
|
#else
|
|
Eluna::Push(L, unit->IsInCombat());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is under water.
|
|
*
|
|
* @return bool underWater
|
|
*/
|
|
int IsUnderWater(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsUnderWater());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is in water.
|
|
*
|
|
* @return bool inWater
|
|
*/
|
|
int IsInWater(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsInWater());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is not moving.
|
|
*
|
|
* @return bool notMoving
|
|
*/
|
|
int IsStopped(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsStopped());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is a quest giver.
|
|
*
|
|
* @return bool questGiver
|
|
*/
|
|
int IsQuestGiver(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef CMANGOS
|
|
Eluna::Push(L, unit->isQuestGiver());
|
|
#else
|
|
Eluna::Push(L, unit->IsQuestGiver());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit]'s health is below the given percentage.
|
|
*
|
|
* @param int32 healthpct : percentage in integer from
|
|
* @return bool isBelow
|
|
*/
|
|
int HealthBelowPct(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->HealthBelowPct(Eluna::CHECKVAL<int32>(L, 2)));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit]'s health is above the given percentage.
|
|
*
|
|
* @param int32 healthpct : percentage in integer from
|
|
* @return bool isAbove
|
|
*/
|
|
int HealthAbovePct(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->HealthAbovePct(Eluna::CHECKVAL<int32>(L, 2)));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] has an aura from the given spell entry.
|
|
*
|
|
* @param uint32 spell : entry of the aura spell
|
|
* @return bool hasAura
|
|
*/
|
|
int HasAura(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
Eluna::Push(L, unit->HasAura(spell));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] is casting a spell
|
|
*
|
|
* @return bool isCasting
|
|
*/
|
|
int IsCasting(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->HasUnitState(UNIT_STATE_CASTING));
|
|
#else
|
|
Eluna::Push(L, unit->IsNonMeleeSpellCasted(false));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the [Unit] has the given unit state.
|
|
*
|
|
* @param [UnitState] state : an unit state
|
|
* @return bool hasState
|
|
*/
|
|
int HasUnitState(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 state = Eluna::CHECKVAL<uint32>(L, 2);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->HasUnitState(state));
|
|
#else
|
|
Eluna::Push(L, unit->hasUnitState(state));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/*int IsVisible(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsVisible());
|
|
return 1;
|
|
}*/
|
|
|
|
/*int IsMoving(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->isMoving());
|
|
return 1;
|
|
}*/
|
|
|
|
/*int IsFlying(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->IsFlying());
|
|
return 1;
|
|
}*/
|
|
|
|
/**
|
|
* Returns the [Unit]'s owner.
|
|
*
|
|
* @return [Unit] owner
|
|
*/
|
|
int GetOwner(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetOwner());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s owner's GUID.
|
|
*
|
|
* @return ObjectGuid ownerGUID
|
|
*/
|
|
int GetOwnerGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetOwnerGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetOwnerGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s mount's modelID.
|
|
*
|
|
* @return uint32 mountId : displayId of the mount
|
|
*/
|
|
int GetMountId(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetMountID());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s creator's GUID.
|
|
*
|
|
* @return ObjectGuid creatorGUID
|
|
*/
|
|
int GetCreatorGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetCreatorGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetCreatorGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s charmer's GUID.
|
|
*
|
|
* @return ObjectGuid charmerGUID
|
|
*/
|
|
int GetCharmerGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetCharmerGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetCharmerGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the GUID of the [Unit]'s charmed entity.
|
|
*
|
|
* @return ObjectGuid charmedGUID
|
|
*/
|
|
int GetCharmGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined AZEROTHCORE
|
|
Eluna::Push(L, unit->GetCharmGUID());
|
|
#elif defined TRINITY
|
|
Eluna::Push(L, unit->GetCharmedGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetCharmGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the GUID of the [Unit]'s pet.
|
|
*
|
|
* @return ObjectGuid petGUID
|
|
*/
|
|
int GetPetGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetPetGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetPetGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the GUID of the [Unit]'s charmer or owner.
|
|
*
|
|
* @return ObjectGuid controllerGUID
|
|
*/
|
|
int GetControllerGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetCharmerOrOwnerGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetCharmerOrOwnerGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the GUID of the [Unit]'s charmer or owner or its own GUID.
|
|
*
|
|
* @return ObjectGuid controllerGUID
|
|
*/
|
|
int GetControllerGUIDS(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetCharmerOrOwnerOrOwnGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetCharmerOrOwnerOrOwnGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns [Unit]'s specified stat
|
|
*
|
|
* @param uint32 statType
|
|
* @return float stat
|
|
*/
|
|
int GetStat(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 stat = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
if (stat >= MAX_STATS)
|
|
return 1;
|
|
|
|
Eluna::Push(L, unit->GetStat((Stats)stat));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s base spell power
|
|
*
|
|
* @param uint32 spellSchool
|
|
* @return uint32 spellPower
|
|
*/
|
|
int GetBaseSpellPower(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 spellschool = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
if (spellschool >= MAX_SPELL_SCHOOL)
|
|
return 1;
|
|
|
|
Eluna::Push(L, unit->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + spellschool));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s current victim target or nil.
|
|
*
|
|
* @return [Unit] victim
|
|
*/
|
|
int GetVictim(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetVictim());
|
|
#else
|
|
Eluna::Push(L, unit->getVictim());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the currently casted [Spell] of given type or nil.
|
|
*
|
|
* <pre>
|
|
* enum CurrentSpellTypes
|
|
* {
|
|
* CURRENT_MELEE_SPELL = 0,
|
|
* CURRENT_GENERIC_SPELL = 1,
|
|
* CURRENT_CHANNELED_SPELL = 2,
|
|
* CURRENT_AUTOREPEAT_SPELL = 3
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @param [CurrentSpellTypes] spellType
|
|
* @return [Spell] castedSpell
|
|
*/
|
|
int GetCurrentSpell(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 type = Eluna::CHECKVAL<uint32>(L, 2);
|
|
if (type >= CURRENT_MAX_SPELL)
|
|
return luaL_argerror(L, 2, "valid CurrentSpellTypes expected");
|
|
|
|
Eluna::Push(L, unit->GetCurrentSpell(type));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s current stand state.
|
|
*
|
|
* @return uint8 standState
|
|
*/
|
|
int GetStandState(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetStandState());
|
|
#else
|
|
Eluna::Push(L, unit->getStandState());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s current display ID.
|
|
*
|
|
* @return uint32 displayId
|
|
*/
|
|
int GetDisplayId(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetDisplayId());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s native/original display ID.
|
|
*
|
|
* @return uint32 displayId
|
|
*/
|
|
int GetNativeDisplayId(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetNativeDisplayId());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s level.
|
|
*
|
|
* @return uint8 level
|
|
*/
|
|
int GetLevel(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetLevel());
|
|
#else
|
|
Eluna::Push(L, unit->getLevel());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s health amount.
|
|
*
|
|
* @return uint32 healthAmount
|
|
*/
|
|
int GetHealth(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetHealth());
|
|
return 1;
|
|
}
|
|
|
|
Powers PowerSelectorHelper(lua_State* L, Unit* unit, int powerType = -1)
|
|
{
|
|
#ifdef TRINITY
|
|
if (powerType == -1)
|
|
return unit->GetPowerType();
|
|
#elif AZEROTHCORE
|
|
if (powerType == -1)
|
|
return unit->getPowerType();
|
|
#else
|
|
if (powerType == -1)
|
|
return unit->GetPowerType();
|
|
#endif
|
|
|
|
if (powerType < 0 || powerType >= int(MAX_POWERS))
|
|
luaL_argerror(L, 2, "valid Powers expected");
|
|
|
|
return (Powers)powerType;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s power amount for given power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param int type = -1 : a valid power type from [Powers] or -1 for the [Unit]'s current power type
|
|
* @return uint32 powerAmount
|
|
*/
|
|
int GetPower(lua_State* L, Unit* unit)
|
|
{
|
|
int type = Eluna::CHECKVAL<int>(L, 2, -1);
|
|
Powers power = PowerSelectorHelper(L, unit, type);
|
|
|
|
Eluna::Push(L, unit->GetPower(power));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s max power amount for given power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param int type = -1 : a valid power type from [Powers] or -1 for the [Unit]'s current power type
|
|
* @return uint32 maxPowerAmount
|
|
*/
|
|
int GetMaxPower(lua_State* L, Unit* unit)
|
|
{
|
|
int type = Eluna::CHECKVAL<int>(L, 2, -1);
|
|
Powers power = PowerSelectorHelper(L, unit, type);
|
|
|
|
Eluna::Push(L, unit->GetMaxPower(power));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s power percent for given power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param int type = -1 : a valid power type from [Powers] or -1 for the [Unit]'s current power type
|
|
* @return float powerPct
|
|
*/
|
|
int GetPowerPct(lua_State* L, Unit* unit)
|
|
{
|
|
int type = Eluna::CHECKVAL<int>(L, 2, -1);
|
|
Powers power = PowerSelectorHelper(L, unit, type);
|
|
|
|
#if (!defined(TRINITY) && defined(WOTLK))
|
|
float percent = ((float)unit->GetPower(power) / (float)unit->GetMaxPower(power)) * 100.0f;
|
|
#else
|
|
float percent = ((float)unit->GetPower(power) / (float)unit->GetMaxPower(power)) * 100.0f;
|
|
#endif
|
|
Eluna::Push(L, percent);
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s current power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @return [Powers] powerType
|
|
*/
|
|
int GetPowerType(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetPowerType());
|
|
#elif AZEROTHCORE
|
|
Eluna::Push(L, unit->getPowerType());
|
|
#else
|
|
Eluna::Push(L, unit->GetPowerType());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s max health.
|
|
*
|
|
* @return uint32 maxHealth
|
|
*/
|
|
int GetMaxHealth(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetMaxHealth());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s health percent.
|
|
*
|
|
* @return float healthPct
|
|
*/
|
|
int GetHealthPct(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetHealthPct());
|
|
#else
|
|
Eluna::Push(L, unit->GetHealthPercent());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s gender.
|
|
*
|
|
* @return uint8 gender : 0 for male, 1 for female and 2 for none
|
|
*/
|
|
int GetGender(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetGender());
|
|
#else
|
|
Eluna::Push(L, unit->getGender());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s race ID.
|
|
*
|
|
* @return [Races] race
|
|
*/
|
|
int GetRace(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetRace());
|
|
#else
|
|
Eluna::Push(L, unit->getRace());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s class ID.
|
|
*
|
|
* @return [Classes] class
|
|
*/
|
|
int GetClass(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetClass());
|
|
#else
|
|
Eluna::Push(L, unit->getClass());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the race mask
|
|
*
|
|
* @return uint32 racemask
|
|
*/
|
|
int GetRaceMask(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetRaceMask());
|
|
#else
|
|
Eluna::Push(L, unit->getRaceMask());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the class mask
|
|
*
|
|
* @return uint32 classmask
|
|
*/
|
|
int GetClassMask(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetClassMask());
|
|
#else
|
|
Eluna::Push(L, unit->getClassMask());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s creature type ID (enumerated in CreatureType.dbc).
|
|
*
|
|
* <pre>
|
|
* enum CreatureType
|
|
* {
|
|
* CREATURE_TYPE_BEAST = 1,
|
|
* CREATURE_TYPE_DRAGONKIN = 2,
|
|
* CREATURE_TYPE_DEMON = 3,
|
|
* CREATURE_TYPE_ELEMENTAL = 4,
|
|
* CREATURE_TYPE_GIANT = 5,
|
|
* CREATURE_TYPE_UNDEAD = 6,
|
|
* CREATURE_TYPE_HUMANOID = 7,
|
|
* CREATURE_TYPE_CRITTER = 8,
|
|
* CREATURE_TYPE_MECHANICAL = 9,
|
|
* CREATURE_TYPE_NOT_SPECIFIED = 10,
|
|
* CREATURE_TYPE_TOTEM = 11,
|
|
* CREATURE_TYPE_NON_COMBAT_PET = 12, // This and below is TBC+
|
|
* CREATURE_TYPE_GAS_CLOUD = 13
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @return [CreatureType] creatureType
|
|
*/
|
|
int GetCreatureType(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetCreatureType());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s class' name in given or default locale or nil.
|
|
*
|
|
* <pre>
|
|
* enum LocaleConstant
|
|
* {
|
|
* LOCALE_enUS = 0,
|
|
* LOCALE_koKR = 1,
|
|
* LOCALE_frFR = 2,
|
|
* LOCALE_deDE = 3,
|
|
* LOCALE_zhCN = 4,
|
|
* LOCALE_zhTW = 5,
|
|
* LOCALE_esES = 6,
|
|
* LOCALE_esMX = 7,
|
|
* LOCALE_ruRU = 8
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @param [LocaleConstant] locale = DEFAULT_LOCALE
|
|
* @return string className : class name or nil
|
|
*/
|
|
int GetClassAsString(lua_State* L, Unit* unit)
|
|
{
|
|
uint8 locale = Eluna::CHECKVAL<uint8>(L, 2, DEFAULT_LOCALE);
|
|
if (locale >= TOTAL_LOCALES)
|
|
return luaL_argerror(L, 2, "valid LocaleConstant expected");
|
|
|
|
#ifdef TRINITY
|
|
const ChrClassesEntry* entry = sChrClassesStore.LookupEntry(unit->GetClass());
|
|
#else
|
|
const ChrClassesEntry* entry = sChrClassesStore.LookupEntry(unit->getClass());
|
|
#endif
|
|
if (!entry)
|
|
return 1;
|
|
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, entry->Name[locale]);
|
|
#else
|
|
Eluna::Push(L, entry->name[locale]);
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s race's name in given or default locale or nil.
|
|
*
|
|
* <pre>
|
|
* enum LocaleConstant
|
|
* {
|
|
* LOCALE_enUS = 0,
|
|
* LOCALE_koKR = 1,
|
|
* LOCALE_frFR = 2,
|
|
* LOCALE_deDE = 3,
|
|
* LOCALE_zhCN = 4,
|
|
* LOCALE_zhTW = 5,
|
|
* LOCALE_esES = 6,
|
|
* LOCALE_esMX = 7,
|
|
* LOCALE_ruRU = 8
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @param [LocaleConstant] locale = DEFAULT_LOCALE : locale to return the race name in
|
|
* @return string raceName : race name or nil
|
|
*/
|
|
int GetRaceAsString(lua_State* L, Unit* unit)
|
|
{
|
|
uint8 locale = Eluna::CHECKVAL<uint8>(L, 2, DEFAULT_LOCALE);
|
|
if (locale >= TOTAL_LOCALES)
|
|
return luaL_argerror(L, 2, "valid LocaleConstant expected");
|
|
|
|
#ifdef TRINITY
|
|
const ChrRacesEntry* entry = sChrRacesStore.LookupEntry(unit->GetRace());
|
|
#else
|
|
const ChrRacesEntry* entry = sChrRacesStore.LookupEntry(unit->getRace());
|
|
#endif
|
|
if (!entry)
|
|
return 1;
|
|
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, entry->Name[locale]);
|
|
#else
|
|
Eluna::Push(L, entry->name[locale]);
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Unit]'s faction ID.
|
|
*
|
|
* @return uint32 faction
|
|
*/
|
|
int GetFaction(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Eluna::Push(L, unit->GetFaction());
|
|
#else
|
|
Eluna::Push(L, unit->getFaction());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the [Aura] of the given spell entry on the [Unit] or nil.
|
|
*
|
|
* @param uint32 spellID : entry of the aura spell
|
|
* @return [Aura] aura : aura object or nil
|
|
*/
|
|
int GetAura(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 spellID = Eluna::CHECKVAL<uint32>(L, 2);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetAura(spellID));
|
|
#else
|
|
Eluna::Push(L, unit->GetAura(spellID, EFFECT_INDEX_0));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns a table containing friendly [Unit]'s within given range of the [Unit].
|
|
*
|
|
* @param float range = 533.333 : search radius
|
|
* @return table friendyUnits : table filled with friendly units
|
|
*/
|
|
int GetFriendlyUnitsInRange(lua_State* L, Unit* unit)
|
|
{
|
|
float range = Eluna::CHECKVAL<float>(L, 2, SIZE_OF_GRIDS);
|
|
|
|
std::list<Unit*> list;
|
|
#ifdef TRINITY
|
|
Trinity::AnyFriendlyUnitInObjectRangeCheck checker(unit, unit, range);
|
|
Trinity::UnitListSearcher<Trinity::AnyFriendlyUnitInObjectRangeCheck> searcher(unit, list, checker);
|
|
Cell::VisitAllObjects(unit, searcher, range);
|
|
#elif AZEROTHCORE
|
|
Acore::AnyFriendlyUnitInObjectRangeCheck checker(unit, unit, range);
|
|
Acore::UnitListSearcher<Acore::AnyFriendlyUnitInObjectRangeCheck> searcher(unit, list, checker);
|
|
Cell::VisitAllObjects(unit, searcher, range);
|
|
#else
|
|
MaNGOS::AnyFriendlyUnitInObjectRangeCheck checker(unit, range);
|
|
MaNGOS::UnitListSearcher<MaNGOS::AnyFriendlyUnitInObjectRangeCheck> searcher(list, checker);
|
|
Cell::VisitGridObjects(unit, searcher, range);
|
|
#endif
|
|
ElunaUtil::ObjectGUIDCheck guidCheck(unit->GET_GUID());
|
|
list.remove_if(guidCheck);
|
|
|
|
lua_createtable(L, list.size(), 0);
|
|
int tbl = lua_gettop(L);
|
|
uint32 i = 0;
|
|
|
|
for (std::list<Unit*>::const_iterator it = list.begin(); it != list.end(); ++it)
|
|
{
|
|
Eluna::Push(L, *it);
|
|
lua_rawseti(L, tbl, ++i);
|
|
}
|
|
|
|
lua_settop(L, tbl);
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns a table containing unfriendly [Unit]'s within given range of the [Unit].
|
|
*
|
|
* @param float range = 533.333 : search radius
|
|
* @return table unfriendyUnits : table filled with unfriendly units
|
|
*/
|
|
int GetUnfriendlyUnitsInRange(lua_State* L, Unit* unit)
|
|
{
|
|
float range = Eluna::CHECKVAL<float>(L, 2, SIZE_OF_GRIDS);
|
|
|
|
std::list<Unit*> list;
|
|
#ifdef TRINITY
|
|
Trinity::AnyUnfriendlyUnitInObjectRangeCheck checker(unit, unit, range);
|
|
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(unit, list, checker);
|
|
Cell::VisitAllObjects(unit, searcher, range);
|
|
#elif AZEROTHCORE
|
|
Acore::AnyUnfriendlyUnitInObjectRangeCheck checker(unit, unit, range);
|
|
Acore::UnitListSearcher<Acore::AnyUnfriendlyUnitInObjectRangeCheck> searcher(unit, list, checker);
|
|
Cell::VisitAllObjects(unit, searcher, range);
|
|
#else
|
|
MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck checker(unit, range);
|
|
MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck> searcher(list, checker);
|
|
Cell::VisitGridObjects(unit, searcher, range);
|
|
#endif
|
|
ElunaUtil::ObjectGUIDCheck guidCheck(unit->GET_GUID());
|
|
list.remove_if(guidCheck);
|
|
|
|
lua_createtable(L, list.size(), 0);
|
|
int tbl = lua_gettop(L);
|
|
uint32 i = 0;
|
|
|
|
for (std::list<Unit*>::const_iterator it = list.begin(); it != list.end(); ++it)
|
|
{
|
|
Eluna::Push(L, *it);
|
|
lua_rawseti(L, tbl, ++i);
|
|
}
|
|
|
|
lua_settop(L, tbl);
|
|
return 1;
|
|
}
|
|
|
|
#if (!defined(TBC) && !defined(CLASSIC))
|
|
/**
|
|
* Returns [Unit]'s [Vehicle] methods
|
|
*
|
|
* @return [Vehicle] vehicle
|
|
*/
|
|
int GetVehicleKit(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetVehicleKit());
|
|
#else
|
|
Eluna::Push(L, unit->GetVehicleInfo());
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
int GetVehicle(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetVehicle());
|
|
return 1;
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* Returns the Critter Guid
|
|
*
|
|
* @return ObjectGuid critterGuid
|
|
*/
|
|
int GetCritterGUID(lua_State* L, Unit* unit)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->GetCritterGUID());
|
|
#else
|
|
Eluna::Push(L, unit->GetCritterGuid());
|
|
#endif
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Returns the [Unit]'s speed of given [UnitMoveType].
|
|
*
|
|
* <pre>
|
|
* enum UnitMoveType
|
|
* {
|
|
* MOVE_WALK = 0,
|
|
* MOVE_RUN = 1,
|
|
* MOVE_RUN_BACK = 2,
|
|
* MOVE_SWIM = 3,
|
|
* MOVE_SWIM_BACK = 4,
|
|
* MOVE_TURN_RATE = 5,
|
|
* MOVE_FLIGHT = 6,
|
|
* MOVE_FLIGHT_BACK = 7,
|
|
* MOVE_PITCH_RATE = 8
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @param [UnitMoveType] type
|
|
* @return float speed
|
|
*/
|
|
int GetSpeed(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 type = Eluna::CHECKVAL<uint32>(L, 2);
|
|
if (type >= MAX_MOVE_TYPE)
|
|
return luaL_argerror(L, 2, "valid UnitMoveType expected");
|
|
|
|
#ifndef TRINITY
|
|
Eluna::Push(L, unit->GetSpeedRate((UnitMoveType)type));
|
|
#else
|
|
Eluna::Push(L, unit->GetSpeed((UnitMoveType)type));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns the current movement type for this [Unit].
|
|
*
|
|
* <pre>
|
|
* enum MovementGeneratorType
|
|
* {
|
|
* IDLE_MOTION_TYPE = 0,
|
|
* RANDOM_MOTION_TYPE = 1,
|
|
* WAYPOINT_MOTION_TYPE = 2,
|
|
* MAX_DB_MOTION_TYPE = 3,
|
|
* ANIMAL_RANDOM_MOTION_TYPE = 3, // TC
|
|
*
|
|
* CONFUSED_MOTION_TYPE = 4,
|
|
* CHASE_MOTION_TYPE = 5,
|
|
* HOME_MOTION_TYPE = 6,
|
|
* FLIGHT_MOTION_TYPE = 7,
|
|
* POINT_MOTION_TYPE = 8,
|
|
* FLEEING_MOTION_TYPE = 9,
|
|
* DISTRACT_MOTION_TYPE = 10,
|
|
* ASSISTANCE_MOTION_TYPE = 11,
|
|
* ASSISTANCE_DISTRACT_MOTION_TYPE = 12,
|
|
* TIMED_FLEEING_MOTION_TYPE = 13,
|
|
* FOLLOW_MOTION_TYPE = 14,
|
|
* EFFECT_MOTION_TYPE = 15, // mangos
|
|
* ROTATE_MOTION_TYPE = 15, // TC
|
|
* EFFECT_MOTION_TYPE = 16, // TC
|
|
* NULL_MOTION_TYPE = 17, // TC
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @return [MovementGeneratorType] movementType
|
|
*/
|
|
int GetMovementType(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->GetMotionMaster()->GetCurrentMovementGeneratorType());
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s owner GUID to given GUID.
|
|
*
|
|
* @param ObjectGuid guid : new owner guid
|
|
*/
|
|
int SetOwnerGUID(lua_State* L, Unit* unit)
|
|
{
|
|
ObjectGuid guid = Eluna::CHECKVAL<ObjectGuid>(L, 2);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetOwnerGUID(guid);
|
|
#else
|
|
unit->SetOwnerGuid(guid);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s PvP on or off.
|
|
*
|
|
* @param bool apply = true : true if set on, false if off
|
|
*/
|
|
int SetPvP(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
|
|
unit->SetPvP(apply);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s sheath state.
|
|
*
|
|
* enum SheathState
|
|
* {
|
|
* SHEATH_STATE_UNARMED = 0, // non prepared weapon
|
|
* SHEATH_STATE_MELEE = 1, // prepared melee weapon
|
|
* SHEATH_STATE_RANGED = 2 // prepared ranged weapon
|
|
* };
|
|
*
|
|
* @param [SheathState] sheathState : valid SheathState
|
|
*/
|
|
int SetSheath(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 sheathed = Eluna::CHECKVAL<uint32>(L, 2);
|
|
if (sheathed >= MAX_SHEATH_STATE)
|
|
return luaL_argerror(L, 2, "valid SheathState expected");
|
|
|
|
unit->SetSheath((SheathState)sheathed);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s name internally.
|
|
*
|
|
* @param string name : new name
|
|
*/
|
|
int SetName(lua_State* L, Unit* unit)
|
|
{
|
|
const char* name = Eluna::CHECKVAL<const char*>(L, 2);
|
|
if (std::string(name).length() > 0)
|
|
unit->SetName(name);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s speed of given [UnitMoveType] to given rate.
|
|
* If forced, packets sent to clients forcing the visual change.
|
|
*
|
|
* <pre>
|
|
* enum UnitMoveType
|
|
* {
|
|
* MOVE_WALK = 0,
|
|
* MOVE_RUN = 1,
|
|
* MOVE_RUN_BACK = 2,
|
|
* MOVE_SWIM = 3,
|
|
* MOVE_SWIM_BACK = 4,
|
|
* MOVE_TURN_RATE = 5,
|
|
* MOVE_FLIGHT = 6,
|
|
* MOVE_FLIGHT_BACK = 7,
|
|
* MOVE_PITCH_RATE = 8
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @param [UnitMoveType] type
|
|
* @param float rate
|
|
* @param bool forced = false
|
|
*/
|
|
int SetSpeed(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 type = Eluna::CHECKVAL<uint32>(L, 2);
|
|
float rate = Eluna::CHECKVAL<float>(L, 3);
|
|
bool forced = Eluna::CHECKVAL<bool>(L, 4, false);
|
|
(void)forced; // ensure that the variable is referenced in order to pass compiler checks
|
|
if (type >= MAX_MOVE_TYPE)
|
|
return luaL_argerror(L, 2, "valid UnitMoveType expected");
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetSpeedRate((UnitMoveType)type, rate);
|
|
#else
|
|
unit->SetSpeedRate((UnitMoveType)type, rate, forced);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s faction.
|
|
*
|
|
* @param uint32 faction : new faction ID
|
|
*/
|
|
int SetFaction(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 factionId = Eluna::CHECKVAL<uint32>(L, 2);
|
|
#ifdef TRINITY
|
|
unit->SetFaction(factionId);
|
|
#else
|
|
unit->setFaction(factionId);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s level.
|
|
*
|
|
* @param uint8 level : new level
|
|
*/
|
|
int SetLevel(lua_State* L, Unit* unit)
|
|
{
|
|
uint8 newlevel = Eluna::CHECKVAL<uint8>(L, 2);
|
|
|
|
if (newlevel < 1)
|
|
return luaL_argerror(L, 2, "level cannot be below 1");
|
|
|
|
if (Player* player = unit->ToPlayer())
|
|
{
|
|
player->GiveLevel(newlevel);
|
|
player->InitTalentForLevel();
|
|
player->SetUInt32Value(PLAYER_XP, 0);
|
|
}
|
|
else
|
|
unit->SetLevel(newlevel);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s health.
|
|
*
|
|
* @param uint32 health : new health
|
|
*/
|
|
int SetHealth(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 amt = Eluna::CHECKVAL<uint32>(L, 2);
|
|
unit->SetHealth(amt);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s max health.
|
|
*
|
|
* @param uint32 maxHealth : new max health
|
|
*/
|
|
int SetMaxHealth(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 amt = Eluna::CHECKVAL<uint32>(L, 2);
|
|
unit->SetMaxHealth(amt);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s power amount for the given power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param uint32 amount : new power amount
|
|
* @param int type = -1 : a valid power type from [Powers] or -1 for the [Unit]'s current power type
|
|
*/
|
|
int SetPower(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 amt = Eluna::CHECKVAL<uint32>(L, 2);
|
|
int type = Eluna::CHECKVAL<int>(L, 3, -1);
|
|
Powers power = PowerSelectorHelper(L, unit, type);
|
|
|
|
unit->SetPower(power, amt);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* modifies the [Unit]'s power amount for the given power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param int32 amount : amount to modify
|
|
* @param int type = -1 : a valid power type from [Powers] or -1 for the [Unit]'s current power type
|
|
*/
|
|
int ModifyPower(lua_State* L, Unit* unit)
|
|
{
|
|
int32 amt = Eluna::CHECKVAL<int32>(L, 2);
|
|
int type = Eluna::CHECKVAL<int>(L, 3, -1);
|
|
Powers power = PowerSelectorHelper(L, unit, type);
|
|
|
|
unit->ModifyPower(power, amt);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s max power amount for the given power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param int type = -1 : a valid power type from [Powers] or -1 for the [Unit]'s current power type
|
|
* @param uint32 maxPower : new max power amount
|
|
*/
|
|
int SetMaxPower(lua_State* L, Unit* unit)
|
|
{
|
|
int type = Eluna::CHECKVAL<int>(L, 2, -1);
|
|
uint32 amt = Eluna::CHECKVAL<uint32>(L, 3);
|
|
Powers power = PowerSelectorHelper(L, unit, type);
|
|
|
|
unit->SetMaxPower(power, amt);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s power type.
|
|
*
|
|
* enum Powers
|
|
* {
|
|
* POWER_MANA = 0,
|
|
* POWER_RAGE = 1,
|
|
* POWER_FOCUS = 2,
|
|
* POWER_ENERGY = 3,
|
|
* POWER_HAPPINESS = 4,
|
|
* POWER_RUNE = 5,
|
|
* POWER_RUNIC_POWER = 6,
|
|
* MAX_POWERS = 7,
|
|
* POWER_ALL = 127, // default for class?
|
|
* POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
|
|
* };
|
|
*
|
|
* @param [Powers] type : a valid power type
|
|
*/
|
|
int SetPowerType(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 type = Eluna::CHECKVAL<uint32>(L, 2);
|
|
if (type >= int(MAX_POWERS))
|
|
return luaL_argerror(L, 2, "valid Powers expected");
|
|
|
|
#ifdef TRINITY
|
|
unit->SetPowerType((Powers)type);
|
|
#elif AZEROTHCORE
|
|
unit->setPowerType((Powers)type);
|
|
#else
|
|
unit->SetPowerType((Powers)type);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s modelID.
|
|
*
|
|
* @param uint32 displayId
|
|
*/
|
|
int SetDisplayId(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 model = Eluna::CHECKVAL<uint32>(L, 2);
|
|
unit->SetDisplayId(model);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s native/default modelID.
|
|
*
|
|
* @param uint32 displayId
|
|
*/
|
|
int SetNativeDisplayId(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 model = Eluna::CHECKVAL<uint32>(L, 2);
|
|
unit->SetNativeDisplayId(model);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s facing/orientation.
|
|
*
|
|
* @param uint32 orientation
|
|
*/
|
|
int SetFacing(lua_State* L, Unit* unit)
|
|
{
|
|
float o = Eluna::CHECKVAL<float>(L, 2);
|
|
unit->SetFacingTo(o);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit] to face the given [WorldObject]'s direction.
|
|
*
|
|
* @param [WorldObject] target
|
|
*/
|
|
int SetFacingToObject(lua_State* L, Unit* unit)
|
|
{
|
|
WorldObject* obj = Eluna::CHECKOBJ<WorldObject>(L, 2);
|
|
unit->SetFacingToObject(obj);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets creator GUID
|
|
*
|
|
* @param ObjectGuid guid
|
|
*/
|
|
int SetCreatorGUID(lua_State* L, Unit* unit)
|
|
{
|
|
ObjectGuid guid = Eluna::CHECKVAL<ObjectGuid>(L, 2);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetCreatorGUID(guid);
|
|
#else
|
|
unit->SetCreatorGuid(guid);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets pet GUID
|
|
*
|
|
* @param ObjectGuid guid
|
|
*/
|
|
int SetPetGUID(lua_State* L, Unit* unit)
|
|
{
|
|
ObjectGuid guid = Eluna::CHECKVAL<ObjectGuid>(L, 2);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetPetGUID(guid);
|
|
#else
|
|
unit->SetPetGuid(guid);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Toggles (Sets) [Unit]'s water walking
|
|
*
|
|
* @param bool enable = true
|
|
*/
|
|
int SetWaterWalk(lua_State* L, Unit* unit)
|
|
{
|
|
bool enable = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetWaterWalking(enable);
|
|
#else
|
|
unit->SetWaterWalk(enable);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s stand state
|
|
*
|
|
* @param uint8 state : stand state
|
|
*/
|
|
int SetStandState(lua_State* L, Unit* unit)
|
|
{
|
|
uint8 state = Eluna::CHECKVAL<uint8>(L, 2);
|
|
unit->SetStandState(state);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit] in combat with the `enemy` [Unit].
|
|
*
|
|
* @param [Unit] enemy : the [Unit] to start combat with
|
|
*/
|
|
int SetInCombatWith(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* enemy = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
unit->SetInCombatWith(enemy);
|
|
return 0;
|
|
}
|
|
|
|
#if (!defined(TBC) && !defined(CLASSIC))
|
|
/**
|
|
* Sets the [Unit]'s FFA flag on or off.
|
|
*
|
|
* @param bool apply = true
|
|
*/
|
|
int SetFFA(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
|
|
#ifdef TRINITY
|
|
if (apply)
|
|
{
|
|
unit->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
for (Unit::ControlList::iterator itr = unit->m_Controlled.begin(); itr != unit->m_Controlled.end(); ++itr)
|
|
(*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
}
|
|
else
|
|
{
|
|
unit->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
for (Unit::ControlList::iterator itr = unit->m_Controlled.begin(); itr != unit->m_Controlled.end(); ++itr)
|
|
(*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
}
|
|
#elif AZEROTHCORE
|
|
if (apply)
|
|
{
|
|
unit->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
for (Unit::ControlSet::iterator itr = unit->m_Controlled.begin(); itr != unit->m_Controlled.end(); ++itr)
|
|
(*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
}
|
|
else
|
|
{
|
|
unit->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
for (Unit::ControlSet::iterator itr = unit->m_Controlled.begin(); itr != unit->m_Controlled.end(); ++itr)
|
|
(*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
|
}
|
|
#else
|
|
unit->SetFFAPvP(apply);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Sets the [Unit]'s sanctuary flag on or off.
|
|
*
|
|
* @param bool apply = true
|
|
*/
|
|
int SetSanctuary(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
|
|
if (apply)
|
|
{
|
|
unit->SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);
|
|
unit->CombatStop();
|
|
unit->CombatStopWithPets();
|
|
}
|
|
else
|
|
unit->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int SetCritterGUID(lua_State* L, Unit* unit)
|
|
{
|
|
ObjectGuid guid = Eluna::CHECKVAL<ObjectGuid>(L, 2);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetCritterGUID(guid);
|
|
#else
|
|
unit->SetCritterGuid(guid);
|
|
#endif
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/*int SetStunned(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
unit->SetControlled(apply, UNIT_STATE_STUNNED);
|
|
return 0;
|
|
}*/
|
|
|
|
/**
|
|
* Roots the [Unit] to the ground, if 'false' specified, unroots the [Unit].
|
|
*
|
|
* @param bool apply = true
|
|
*/
|
|
int SetRooted(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetControlled(apply, UNIT_STATE_ROOT);
|
|
#else
|
|
unit->SetRoot(apply);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Confuses the [Unit], if 'false' specified, the [Unit] is no longer confused.
|
|
*
|
|
* @param bool apply = true
|
|
*/
|
|
int SetConfused(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetControlled(apply, UNIT_STATE_CONFUSED);
|
|
#else
|
|
unit->SetConfused(apply);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Fears the [Unit], if 'false' specified, the [Unit] is no longer feared.
|
|
*
|
|
* @param bool apply = true
|
|
*/
|
|
int SetFeared(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->SetControlled(apply, UNIT_STATE_FLEEING);
|
|
#else
|
|
unit->SetFeared(apply);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/*int SetCanFly(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
unit->SetCanFly(apply);
|
|
return 0;
|
|
}*/
|
|
|
|
/*int SetVisible(lua_State* L, Unit* unit)
|
|
{
|
|
bool x = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
unit->SetVisible(x);
|
|
return 0;
|
|
}*/
|
|
|
|
/**
|
|
* Clears the [Unit]'s threat list.
|
|
*/
|
|
int ClearThreatList(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
unit->GetThreatManager().ClearAllThreat();
|
|
#elif AZEROTHCORE
|
|
unit->getThreatMgr().clearReferences();
|
|
#else
|
|
unit->GetThreatManager().clearReferences();
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Mounts the [Unit] on the given displayID/modelID.
|
|
*
|
|
* @param uint32 displayId
|
|
*/
|
|
int Mount(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 displayId = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
unit->Mount(displayId);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Dismounts the [Unit].
|
|
*/
|
|
int Dismount(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
if (unit->IsMounted())
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->Dismount();
|
|
unit->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
|
#else
|
|
unit->Unmount();
|
|
unit->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
|
|
#endif
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] perform the given emote.
|
|
*
|
|
* @param uint32 emoteId
|
|
*/
|
|
int PerformEmote(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
Emote emote = static_cast<Emote>(Eluna::CHECKVAL<uint32>(L, 2));
|
|
unit->HandleEmoteCommand(emote);
|
|
#else
|
|
unit->HandleEmoteCommand(Eluna::CHECKVAL<uint32>(L, 2));
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] perform the given emote continuously.
|
|
*
|
|
* @param uint32 emoteId
|
|
*/
|
|
int EmoteState(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 emoteId = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
unit->SetUInt32Value(UNIT_NPC_EMOTESTATE, emoteId);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Returns calculated percentage from Health
|
|
*
|
|
* @return int32 percentage
|
|
*/
|
|
int CountPctFromCurHealth(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->CountPctFromCurHealth(Eluna::CHECKVAL<int32>(L, 2)));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Returns calculated percentage from Max Health
|
|
*
|
|
* @return int32 percentage
|
|
*/
|
|
int CountPctFromMaxHealth(lua_State* L, Unit* unit)
|
|
{
|
|
Eluna::Push(L, unit->CountPctFromMaxHealth(Eluna::CHECKVAL<int32>(L, 2)));
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Sends chat message to [Player]
|
|
*
|
|
* @param uint8 type : chat, whisper, etc
|
|
* @param uint32 lang : language to speak
|
|
* @param string msg
|
|
* @param [Player] target
|
|
*/
|
|
int SendChatMessageToPlayer(lua_State* L, Unit* unit)
|
|
{
|
|
uint8 type = Eluna::CHECKVAL<uint8>(L, 2);
|
|
uint32 lang = Eluna::CHECKVAL<uint32>(L, 3);
|
|
std::string msg = Eluna::CHECKVAL<std::string>(L, 4);
|
|
Player* target = Eluna::CHECKOBJ<Player>(L, 5);
|
|
|
|
if (type >= MAX_CHAT_MSG_TYPE)
|
|
return luaL_argerror(L, 2, "valid ChatMsg expected");
|
|
if (lang >= LANGUAGES_COUNT)
|
|
return luaL_argerror(L, 3, "valid Language expected");
|
|
|
|
WorldPacket data;
|
|
#if defined TRINITY || AZEROTHCORE
|
|
ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), unit, target, msg);
|
|
#else
|
|
ChatHandler::BuildChatPacket(data, ChatMsg(type), msg.c_str(), Language(lang), 0, unit->GET_GUID(), unit->GetName(), target->GET_GUID(), target->GetName());
|
|
#endif
|
|
#ifdef CMANGOS
|
|
target->GetSession()->SendPacket(data);
|
|
#else
|
|
target->GetSession()->SendPacket(&data);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/*static void PrepareMove(Unit* unit)
|
|
{
|
|
unit->GetMotionMaster()->MovementExpired(); // Chase
|
|
unit->StopMoving(); // Some
|
|
unit->GetMotionMaster()->Clear(); // all
|
|
}*/
|
|
|
|
/**
|
|
* Stops the [Unit]'s movement
|
|
*/
|
|
int MoveStop(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->StopMoving();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit]'s movement expires and clears movement
|
|
*
|
|
* @param bool reset = true : cleans movement
|
|
*/
|
|
int MoveExpire(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
(void) L; // ensure that the variable is referenced in order to pass compiler checks
|
|
unit->GetMotionMaster()->Clear();
|
|
#else
|
|
bool reset = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
unit->GetMotionMaster()->MovementExpired(reset);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Clears the [Unit]'s movement
|
|
*
|
|
* @param bool reset = true : clean movement
|
|
*/
|
|
int MoveClear(lua_State* L, Unit* unit)
|
|
{
|
|
#ifdef TRINITY
|
|
(void) L; // ensure that the variable is referenced in order to pass compiler checks
|
|
unit->GetMotionMaster()->Clear();
|
|
#else
|
|
bool reset = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
unit->GetMotionMaster()->Clear(reset);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will be idle
|
|
*/
|
|
int MoveIdle(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->GetMotionMaster()->MoveIdle();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will move at random
|
|
*
|
|
* @param float radius : limit on how far the [Unit] will move at random
|
|
*/
|
|
int MoveRandom(lua_State* L, Unit* unit)
|
|
{
|
|
float radius = Eluna::CHECKVAL<float>(L, 2);
|
|
float x, y, z;
|
|
unit->GetPosition(x, y, z);
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->GetMotionMaster()->MoveRandom(radius);
|
|
#else
|
|
unit->GetMotionMaster()->MoveRandomAroundPoint(x, y, z, radius);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will move to its set home location
|
|
*/
|
|
int MoveHome(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->GetMotionMaster()->MoveTargetedHome();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will follow the target
|
|
*
|
|
* @param [Unit] target : target to follow
|
|
* @param float dist = 0 : distance to start following
|
|
* @param float angle = 0
|
|
*/
|
|
int MoveFollow(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
float dist = Eluna::CHECKVAL<float>(L, 3, 0.0f);
|
|
float angle = Eluna::CHECKVAL<float>(L, 4, 0.0f);
|
|
unit->GetMotionMaster()->MoveFollow(target, dist, angle);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will chase the target
|
|
*
|
|
* @param [Unit] target : target to chase
|
|
* @param float dist = 0 : distance start chasing
|
|
* @param float angle = 0
|
|
*/
|
|
int MoveChase(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
float dist = Eluna::CHECKVAL<float>(L, 3, 0.0f);
|
|
float angle = Eluna::CHECKVAL<float>(L, 4, 0.0f);
|
|
unit->GetMotionMaster()->MoveChase(target, dist, angle);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will move confused
|
|
*/
|
|
int MoveConfused(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->GetMotionMaster()->MoveConfused();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will flee
|
|
*
|
|
* @param [Unit] target
|
|
* @param uint32 time = 0 : flee delay
|
|
*/
|
|
int MoveFleeing(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
uint32 time = Eluna::CHECKVAL<uint32>(L, 3, 0);
|
|
unit->GetMotionMaster()->MoveFleeing(target, time);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will move to the coordinates
|
|
*
|
|
* @param uint32 id : unique waypoint Id
|
|
* @param float x
|
|
* @param float y
|
|
* @param float z
|
|
* @param bool genPath = true : if true, generates path
|
|
*/
|
|
int MoveTo(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 id = Eluna::CHECKVAL<uint32>(L, 2);
|
|
float x = Eluna::CHECKVAL<float>(L, 3);
|
|
float y = Eluna::CHECKVAL<float>(L, 4);
|
|
float z = Eluna::CHECKVAL<float>(L, 5);
|
|
bool genPath = Eluna::CHECKVAL<bool>(L, 6, true);
|
|
unit->GetMotionMaster()->MovePoint(id, x, y, z, genPath);
|
|
return 0;
|
|
}
|
|
|
|
#if (!defined(TBC) && !defined(CLASSIC))
|
|
/**
|
|
* Makes the [Unit] jump to the coordinates
|
|
*
|
|
* @param float x
|
|
* @param float y
|
|
* @param float z
|
|
* @param float zSpeed : start velocity
|
|
* @param float maxHeight : maximum height
|
|
* @param uint32 id = 0 : unique movement Id
|
|
*/
|
|
int MoveJump(lua_State* L, Unit* unit)
|
|
{
|
|
float x = Eluna::CHECKVAL<float>(L, 2);
|
|
float y = Eluna::CHECKVAL<float>(L, 3);
|
|
float z = Eluna::CHECKVAL<float>(L, 4);
|
|
float zSpeed = Eluna::CHECKVAL<float>(L, 5);
|
|
float maxHeight = Eluna::CHECKVAL<float>(L, 6);
|
|
uint32 id = Eluna::CHECKVAL<uint32>(L, 7, 0);
|
|
|
|
#if (defined(CMANGOS) || defined(MANGOS)) && defined(WOTLK)
|
|
unit->GetMotionMaster()->MoveJump(x, y, z, zSpeed, maxHeight, id);
|
|
#else
|
|
Position pos(x, y, z);
|
|
unit->GetMotionMaster()->MoveJump(pos, zSpeed, maxHeight, id);
|
|
#endif
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* The [Unit] will whisper the message to a [Player]
|
|
*
|
|
* @param string msg : message for the [Unit] to emote
|
|
* @param uint32 lang : language for the [Unit] to speak
|
|
* @param [Player] receiver : specific [Unit] to receive the message
|
|
* @param bool bossWhisper = false : is a boss whisper
|
|
*/
|
|
int SendUnitWhisper(lua_State* L, Unit* unit)
|
|
{
|
|
const char* msg = Eluna::CHECKVAL<const char*>(L, 2);
|
|
uint32 lang = Eluna::CHECKVAL<uint32>(L, 3);
|
|
(void)lang; // ensure that the variable is referenced in order to pass compiler checks
|
|
Player* receiver = Eluna::CHECKOBJ<Player>(L, 4);
|
|
bool bossWhisper = Eluna::CHECKVAL<bool>(L, 5, false);
|
|
if (std::string(msg).length() > 0)
|
|
#if defined(TRINITY) || defined(AZEROTHCORE)
|
|
unit->Whisper(msg, (Language)lang, receiver, bossWhisper);
|
|
#else
|
|
unit->MonsterWhisper(msg, receiver, bossWhisper);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will emote the message
|
|
*
|
|
* @param string msg : message for the [Unit] to emote
|
|
* @param [Unit] receiver = nil : specific [Unit] to receive the message
|
|
* @param bool bossEmote = false : is a boss emote
|
|
*/
|
|
int SendUnitEmote(lua_State* L, Unit* unit)
|
|
{
|
|
const char* msg = Eluna::CHECKVAL<const char*>(L, 2);
|
|
Unit* receiver = Eluna::CHECKOBJ<Unit>(L, 3, false);
|
|
bool bossEmote = Eluna::CHECKVAL<bool>(L, 4, false);
|
|
if (std::string(msg).length() > 0)
|
|
#if defined(TRINITY) || defined(AZEROTHCORE)
|
|
unit->TextEmote(msg, receiver, bossEmote);
|
|
#else
|
|
unit->MonsterTextEmote(msg, receiver, bossEmote);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will say the message
|
|
*
|
|
* @param string msg : message for the [Unit] to say
|
|
* @param uint32 language : language for the [Unit] to speak
|
|
*/
|
|
int SendUnitSay(lua_State* L, Unit* unit)
|
|
{
|
|
const char* msg = Eluna::CHECKVAL<const char*>(L, 2);
|
|
uint32 language = Eluna::CHECKVAL<uint32>(L, 3);
|
|
if (std::string(msg).length() > 0)
|
|
#if defined(TRINITY) || defined(AZEROTHCORE)
|
|
unit->Say(msg, (Language)language, unit);
|
|
#else
|
|
unit->MonsterSay(msg, language, unit);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* The [Unit] will yell the message
|
|
*
|
|
* @param string msg : message for the [Unit] to yell
|
|
* @param uint32 language : language for the [Unit] to speak
|
|
*/
|
|
int SendUnitYell(lua_State* L, Unit* unit)
|
|
{
|
|
const char* msg = Eluna::CHECKVAL<const char*>(L, 2);
|
|
uint32 language = Eluna::CHECKVAL<uint32>(L, 3);
|
|
if (std::string(msg).length() > 0)
|
|
#if defined(TRINITY) || defined(AZEROTHCORE)
|
|
unit->Yell(msg, (Language)language, unit);
|
|
#else
|
|
unit->MonsterYell(msg, language, unit);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Unmorphs the [Unit] setting it's display ID back to the native display ID.
|
|
*/
|
|
int DeMorph(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->DeMorph();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] cast the spell on the target.
|
|
*
|
|
* @param [Unit] target = nil : can be self or another unit
|
|
* @param uint32 spell : entry of a spell
|
|
* @param bool triggered = false : if true the spell is instant and has no cost
|
|
*/
|
|
int CastSpell(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2, false);
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 3);
|
|
bool triggered = Eluna::CHECKVAL<bool>(L, 4, false);
|
|
#ifdef CMANGOS
|
|
SpellEntry const* spellEntry = GetSpellStore()->LookupEntry<SpellEntry>(spell);
|
|
#endif
|
|
#ifdef MANGOS
|
|
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spell);
|
|
#endif
|
|
#if defined TRINITY || AZEROTHCORE
|
|
SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(spell);
|
|
#endif
|
|
if (!spellEntry)
|
|
return 0;
|
|
|
|
#ifdef CMANGOS
|
|
unit->CastSpell(target, spell, TRIGGERED_OLD_TRIGGERED);
|
|
#else
|
|
unit->CastSpell(target, spell, triggered);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Casts the [Spell] at target [Unit] with custom basepoints or casters.
|
|
* See also [Unit:CastSpell].
|
|
*
|
|
* @param [Unit] target = nil
|
|
* @param uint32 spell
|
|
* @param bool triggered = false
|
|
* @param int32 bp0 = nil : custom basepoints for [Spell] effect 1. If nil, no change is made
|
|
* @param int32 bp1 = nil : custom basepoints for [Spell] effect 2. If nil, no change is made
|
|
* @param int32 bp2 = nil : custom basepoints for [Spell] effect 3. If nil, no change is made
|
|
* @param [Item] castItem = nil
|
|
* @param ObjectGuid originalCaster = ObjectGuid()
|
|
*/
|
|
int CastCustomSpell(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2, false);
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 3);
|
|
bool triggered = Eluna::CHECKVAL<bool>(L, 4, false);
|
|
bool has_bp0 = !lua_isnoneornil(L, 5);
|
|
int32 bp0 = Eluna::CHECKVAL<int32>(L, 5, 0);
|
|
bool has_bp1 = !lua_isnoneornil(L, 6);
|
|
int32 bp1 = Eluna::CHECKVAL<int32>(L, 6, 0);
|
|
bool has_bp2 = !lua_isnoneornil(L, 7);
|
|
int32 bp2 = Eluna::CHECKVAL<int32>(L, 7, 0);
|
|
Item* castItem = Eluna::CHECKOBJ<Item>(L, 8, false);
|
|
ObjectGuid originalCaster = Eluna::CHECKVAL<ObjectGuid>(L, 9, ObjectGuid());
|
|
|
|
#ifdef TRINITY
|
|
CastSpellExtraArgs args;
|
|
if (has_bp0)
|
|
args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0);
|
|
if (has_bp1)
|
|
args.AddSpellMod(SPELLVALUE_BASE_POINT1, bp1);
|
|
if (has_bp2)
|
|
args.AddSpellMod(SPELLVALUE_BASE_POINT2, bp2);
|
|
if (triggered)
|
|
args.TriggerFlags = TRIGGERED_FULL_MASK;
|
|
if (castItem)
|
|
args.SetCastItem(castItem);
|
|
if (originalCaster)
|
|
args.SetOriginalCaster(originalCaster);
|
|
unit->CastSpell(target, spell, args);
|
|
#else
|
|
unit->CastCustomSpell(target, spell, has_bp0 ? &bp0 : NULL, has_bp1 ? &bp1 : NULL, has_bp2 ? &bp2 : NULL, triggered, castItem, NULL, ObjectGuid(originalCaster));
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] cast the spell to the given coordinates, used for area effect spells.
|
|
*
|
|
* @param float x
|
|
* @param float y
|
|
* @param float z
|
|
* @param uint32 spell : entry of a spell
|
|
* @param bool triggered = false : if true the spell is instant and has no cost
|
|
*/
|
|
int CastSpellAoF(lua_State* L, Unit* unit)
|
|
{
|
|
float _x = Eluna::CHECKVAL<float>(L, 2);
|
|
float _y = Eluna::CHECKVAL<float>(L, 3);
|
|
float _z = Eluna::CHECKVAL<float>(L, 4);
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 5);
|
|
bool triggered = Eluna::CHECKVAL<bool>(L, 6, true);
|
|
#ifdef CMANGOS
|
|
unit->CastSpell(_x, _y, _z, spell, TRIGGERED_OLD_TRIGGERED);
|
|
#endif
|
|
#ifdef MANGOS
|
|
unit->CastSpell(_x, _y, _z, spell, triggered);
|
|
#endif
|
|
#ifdef AZEROTHCORE
|
|
unit->CastSpell(_x, _y, _z, spell, triggered);
|
|
#endif
|
|
#ifdef TRINITY
|
|
CastSpellExtraArgs args;
|
|
if (triggered)
|
|
args.TriggerFlags = TRIGGERED_FULL_MASK;
|
|
unit->CastSpell(Position(_x, _y, _z), spell, args);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Clears the [Unit]'s combat
|
|
*/
|
|
int ClearInCombat(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->ClearInCombat();
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Stops the [Unit]'s current spell cast
|
|
*
|
|
* @param uint32 spell = 0 : entry of a spell
|
|
*/
|
|
int StopSpellCast(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 spellId = Eluna::CHECKVAL<uint32>(L, 2, 0);
|
|
unit->CastStop(spellId);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Interrupts [Unit]'s spell state, casting, etc.
|
|
*
|
|
* if spell is not interruptible, it will return
|
|
*
|
|
* @param int32 spellType : type of spell to interrupt
|
|
* @param bool delayed = true : skips if the spell is delayed
|
|
*/
|
|
int InterruptSpell(lua_State* L, Unit* unit)
|
|
{
|
|
int spellType = Eluna::CHECKVAL<int>(L, 2);
|
|
bool delayed = Eluna::CHECKVAL<bool>(L, 3, true);
|
|
switch (spellType)
|
|
{
|
|
case 0:
|
|
spellType = CURRENT_MELEE_SPELL;
|
|
break;
|
|
case 1:
|
|
spellType = CURRENT_GENERIC_SPELL;
|
|
break;
|
|
case 2:
|
|
spellType = CURRENT_CHANNELED_SPELL;
|
|
break;
|
|
case 3:
|
|
spellType = CURRENT_AUTOREPEAT_SPELL;
|
|
break;
|
|
default:
|
|
return luaL_argerror(L, 2, "valid CurrentSpellTypes expected");
|
|
}
|
|
|
|
unit->InterruptSpell((CurrentSpellTypes)spellType, delayed);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Adds the [Aura] of the given spell entry on the given target from the [Unit].
|
|
*
|
|
* @param uint32 spell : entry of a spell
|
|
* @param [Unit] target : aura will be applied on the target
|
|
* @return [Aura] aura
|
|
*/
|
|
int AddAura(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 2);
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 3);
|
|
#ifdef CMANGOS
|
|
SpellEntry const* spellEntry = GetSpellStore()->LookupEntry<SpellEntry>(spell);
|
|
#endif
|
|
#ifdef MANGOS
|
|
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spell);
|
|
#endif
|
|
#ifdef TRINITY
|
|
SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(spell);
|
|
#endif
|
|
#ifdef AZEROTHCORE
|
|
SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(spell);
|
|
#endif
|
|
if (!spellEntry)
|
|
return 1;
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Eluna::Push(L, unit->AddAura(spell, target));
|
|
#else
|
|
if (!IsSpellAppliesAura(spellEntry) && !IsSpellHaveEffect(spellEntry, SPELL_EFFECT_PERSISTENT_AREA_AURA))
|
|
return 1;
|
|
|
|
SpellAuraHolder* holder = CreateSpellAuraHolder(spellEntry, target, unit);
|
|
|
|
for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i)
|
|
{
|
|
uint8 eff = spellEntry->Effect[i];
|
|
if (eff >= TOTAL_SPELL_EFFECTS)
|
|
continue;
|
|
if (IsAreaAuraEffect(eff) ||
|
|
eff == SPELL_EFFECT_APPLY_AURA ||
|
|
eff == SPELL_EFFECT_PERSISTENT_AREA_AURA)
|
|
{
|
|
Aura* aur = CreateAura(spellEntry, SpellEffIndex(i), NULL, holder, target);
|
|
holder->AddAura(aur, SpellEffIndex(i));
|
|
}
|
|
}
|
|
Eluna::Push(L, target->AddSpellAuraHolder(holder));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* Removes [Aura] of the given spell entry from the [Unit].
|
|
*
|
|
* @param uint32 spell : entry of a spell
|
|
*/
|
|
int RemoveAura(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 spellId = Eluna::CHECKVAL<uint32>(L, 2);
|
|
unit->RemoveAurasDueToSpell(spellId);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Removes all [Aura]'s from the [Unit].
|
|
*
|
|
* Note: talents and racials are also auras, use with caution
|
|
*/
|
|
int RemoveAllAuras(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->RemoveAllAuras();
|
|
return 0;
|
|
}
|
|
|
|
#if !defined(CLASSIC)
|
|
/**
|
|
* Removes all positive visible [Aura]'s from the [Unit].
|
|
*/
|
|
int RemoveArenaAuras(lua_State* /*L*/, Unit* unit)
|
|
{
|
|
unit->RemoveArenaAuras();
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Adds the given unit state for the [Unit].
|
|
*
|
|
* @param [UnitState] state
|
|
*/
|
|
int AddUnitState(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 state = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->AddUnitState(state);
|
|
#else
|
|
unit->addUnitState(state);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Removes the given unit state from the [Unit].
|
|
*
|
|
* @param [UnitState] state
|
|
*/
|
|
int ClearUnitState(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 state = Eluna::CHECKVAL<uint32>(L, 2);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
unit->ClearUnitState(state);
|
|
#else
|
|
unit->clearUnitState(state);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] teleport to given coordinates within same map.
|
|
*
|
|
* @param float x
|
|
* @param float y
|
|
* @param float z
|
|
* @param float o : orientation
|
|
*/
|
|
int NearTeleport(lua_State* L, Unit* unit)
|
|
{
|
|
float x = Eluna::CHECKVAL<float>(L, 2);
|
|
float y = Eluna::CHECKVAL<float>(L, 3);
|
|
float z = Eluna::CHECKVAL<float>(L, 4);
|
|
float o = Eluna::CHECKVAL<float>(L, 5);
|
|
|
|
unit->NearTeleportTo(x, y, z, o);
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] damage the target [Unit]
|
|
*
|
|
* <pre>
|
|
* enum SpellSchools
|
|
* {
|
|
* SPELL_SCHOOL_NORMAL = 0,
|
|
* SPELL_SCHOOL_HOLY = 1,
|
|
* SPELL_SCHOOL_FIRE = 2,
|
|
* SPELL_SCHOOL_NATURE = 3,
|
|
* SPELL_SCHOOL_FROST = 4,
|
|
* SPELL_SCHOOL_SHADOW = 5,
|
|
* SPELL_SCHOOL_ARCANE = 6,
|
|
* MAX_SPELL_SCHOOL = 7
|
|
* };
|
|
* </pre>
|
|
*
|
|
* @param [Unit] target : [Unit] to damage
|
|
* @param uint32 damage : amount to damage
|
|
* @param bool durabilityloss = true : if false, the damage does not do durability damage
|
|
* @param [SpellSchools] school = MAX_SPELL_SCHOOL : school the damage is done in or MAX_SPELL_SCHOOL for direct damage
|
|
* @param uint32 spell = 0 : spell that inflicts the damage
|
|
*/
|
|
int DealDamage(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
uint32 damage = Eluna::CHECKVAL<uint32>(L, 3);
|
|
bool durabilityloss = Eluna::CHECKVAL<bool>(L, 4, true);
|
|
uint32 school = Eluna::CHECKVAL<uint32>(L, 5, MAX_SPELL_SCHOOL);
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 6, 0);
|
|
if (school > MAX_SPELL_SCHOOL)
|
|
return luaL_argerror(L, 6, "valid SpellSchool expected");
|
|
|
|
// flat melee damage without resistence/etc reduction
|
|
if (school == MAX_SPELL_SCHOOL)
|
|
{
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Unit::DealDamage(unit, target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, durabilityloss);
|
|
unit->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0);
|
|
#else
|
|
unit->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, durabilityloss);
|
|
unit->SendAttackStateUpdate(HITINFO_NORMALSWING2, target, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_NORMAL, 0);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
SpellSchoolMask schoolmask = SpellSchoolMask(1 << school);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
if (Unit::IsDamageReducedByArmor(schoolmask))
|
|
damage = Unit::CalcArmorReducedDamage(unit, target, damage, NULL, BASE_ATTACK);
|
|
#else
|
|
if (schoolmask & SPELL_SCHOOL_MASK_NORMAL)
|
|
damage = unit->CalcArmorReducedDamage(target, damage);
|
|
#endif
|
|
|
|
#ifdef TRINITY
|
|
// melee damage by specific school
|
|
if (!spell)
|
|
{
|
|
DamageInfo dmgInfo(unit, target, damage, nullptr, schoolmask, SPELL_DIRECT_DAMAGE, BASE_ATTACK);
|
|
unit->CalcAbsorbResist(dmgInfo);
|
|
|
|
if (!dmgInfo.GetDamage())
|
|
damage = 0;
|
|
else
|
|
damage = dmgInfo.GetDamage();
|
|
|
|
uint32 absorb = dmgInfo.GetAbsorb();
|
|
uint32 resist = dmgInfo.GetResist();
|
|
unit->DealDamageMods(target, damage, &absorb);
|
|
#ifdef TRINITY
|
|
Unit::DealDamage(unit, target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false);
|
|
#else
|
|
unit->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false);
|
|
#endif
|
|
unit->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 0, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0);
|
|
return 0;
|
|
}
|
|
|
|
if (!spell)
|
|
return 0;
|
|
|
|
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell);
|
|
if (!spellInfo)
|
|
return 0;
|
|
|
|
SpellNonMeleeDamage dmgInfo(unit, target, spell, spellInfo->GetSchoolMask());
|
|
#ifdef TRINITY
|
|
Unit::DealDamageMods(dmgInfo.target, dmgInfo.damage, &dmgInfo.absorb);
|
|
#else
|
|
damage = unit->SpellDamageBonusDone(target, spellInfo, damage, SPELL_DIRECT_DAMAGE;
|
|
damage = target->SpellDamageBonusTaken(unit, spellInfo, damage, SPELL_DIRECT_DAMAGE);
|
|
unit->CalculateSpellDamageTaken(&dmgInfo, damage, spellInfo);
|
|
unit->DealDamageMods(dmgInfo.target, dmgInfo.damage, &dmgInfo.absorb);
|
|
#endif
|
|
|
|
unit->SendSpellNonMeleeDamageLog(&dmgInfo);
|
|
unit->DealSpellDamage(&dmgInfo, true);
|
|
return 0;
|
|
#elif AZEROTHCORE
|
|
if (!spell)
|
|
{
|
|
DamageInfo dmgInfo(unit, target, damage, nullptr, schoolmask, SPELL_DIRECT_DAMAGE);
|
|
unit->CalcAbsorbResist(dmgInfo);
|
|
|
|
if (!dmgInfo.GetDamage())
|
|
damage = 0;
|
|
else
|
|
damage = dmgInfo.GetDamage();
|
|
|
|
uint32 absorb = dmgInfo.GetAbsorb();
|
|
uint32 resist = dmgInfo.GetResist();
|
|
unit->DealDamageMods(target, damage, &absorb);
|
|
Unit::DealDamage(unit, target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false);
|
|
unit->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 0, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0);
|
|
return 0;
|
|
}
|
|
|
|
if (!spell)
|
|
return 0;
|
|
|
|
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell);
|
|
if (!spellInfo)
|
|
return 0;
|
|
|
|
SpellNonMeleeDamage dmgInfo(unit, target, spellInfo, spellInfo->GetSchoolMask());
|
|
Unit::DealDamageMods(dmgInfo.target, dmgInfo.damage, &dmgInfo.absorb);
|
|
unit->SendSpellNonMeleeDamageLog(&dmgInfo);
|
|
unit->DealSpellDamage(&dmgInfo, true);
|
|
return 0;
|
|
#else
|
|
// melee damage by specific school
|
|
if (!spell)
|
|
{
|
|
uint32 absorb = 0;
|
|
uint32 resist = 0;
|
|
target->CalculateDamageAbsorbAndResist(unit, schoolmask, SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
|
|
|
|
if (damage <= absorb + resist)
|
|
damage = 0;
|
|
else
|
|
damage -= absorb + resist;
|
|
|
|
unit->DealDamageMods(target, damage, &absorb);
|
|
unit->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false);
|
|
unit->SendAttackStateUpdate(HITINFO_NORMALSWING2, target, schoolmask, damage, absorb, resist, VICTIMSTATE_NORMAL, 0);
|
|
return 0;
|
|
}
|
|
|
|
// non-melee damage
|
|
unit->SpellNonMeleeDamageLog(target, spell, damage);
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] heal the target [Unit] with given spell
|
|
*
|
|
* @param [Unit] target : [Unit] to heal
|
|
* @param uint32 spell : spell that causes the healing
|
|
* @param uint32 amount : amount to heal
|
|
* @param bool critical = false : if true, heal is logged as critical
|
|
*/
|
|
int DealHeal(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 3);
|
|
uint32 amount = Eluna::CHECKVAL<uint32>(L, 4);
|
|
bool critical = Eluna::CHECKVAL<bool>(L, 5, false);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
if (const SpellInfo* info = sSpellMgr->GetSpellInfo(spell))
|
|
{
|
|
HealInfo healInfo(unit, target, amount, info, info->GetSchoolMask());
|
|
unit->HealBySpell(healInfo, critical);
|
|
}
|
|
#else
|
|
#ifdef CMANGOS
|
|
SpellEntry const* spellEntry = GetSpellStore()->LookupEntry<SpellEntry>(spell);
|
|
#else
|
|
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spell);
|
|
#endif
|
|
if (spellEntry)
|
|
unit->DealHeal(target, amount, spellEntry, critical);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Makes the [Unit] kill the target [Unit]
|
|
*
|
|
* @param [Unit] target : [Unit] to kill
|
|
* @param bool durLoss = true : when true, the target's items suffer durability loss
|
|
*/
|
|
int Kill(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* target = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
bool durLoss = Eluna::CHECKVAL<bool>(L, 3, true);
|
|
|
|
#if defined TRINITY || AZEROTHCORE
|
|
Unit::Kill(unit, target, durLoss);
|
|
#else
|
|
unit->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, durLoss);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Adds threat to the [Unit] from the victim.
|
|
*
|
|
* <pre>
|
|
* enum SpellSchoolMask
|
|
* {
|
|
* SPELL_SCHOOL_MASK_NONE = 0,
|
|
* SPELL_SCHOOL_MASK_NORMAL = 1,
|
|
* SPELL_SCHOOL_MASK_HOLY = 2,
|
|
* SPELL_SCHOOL_MASK_FIRE = 4,
|
|
* SPELL_SCHOOL_MASK_NATURE = 8,
|
|
* SPELL_SCHOOL_MASK_FROST = 16,
|
|
* SPELL_SCHOOL_MASK_SHADOW = 32,
|
|
* SPELL_SCHOOL_MASK_ARCANE = 64,
|
|
* }
|
|
* </pre>
|
|
*
|
|
* @param [Unit] victim : [Unit] that caused the threat
|
|
* @param float threat : threat amount
|
|
* @param [SpellSchoolMask] schoolMask = 0 : [SpellSchoolMask] of the threat causer
|
|
* @param uint32 spell = 0 : spell entry used for threat
|
|
*/
|
|
int AddThreat(lua_State* L, Unit* unit)
|
|
{
|
|
Unit* victim = Eluna::CHECKOBJ<Unit>(L, 2);
|
|
float threat = Eluna::CHECKVAL<float>(L, 3, true);
|
|
uint32 spell = Eluna::CHECKVAL<uint32>(L, 4, 0);
|
|
|
|
#ifdef TRINITY
|
|
unit->GetThreatManager().AddThreat(victim, threat, spell ? sSpellMgr->GetSpellInfo(spell) : NULL, true, true);
|
|
#elif AZEROTHCORE
|
|
uint32 schoolMask = Eluna::CHECKVAL<uint32>(L, 5, 0);
|
|
if (schoolMask > SPELL_SCHOOL_MASK_ALL)
|
|
{
|
|
return luaL_argerror(L, 4, "valid SpellSchoolMask expected");
|
|
}
|
|
unit->AddThreat(victim, threat, (SpellSchoolMask)schoolMask, spell ? sSpellMgr->GetSpellInfo(spell) : NULL);
|
|
#else
|
|
#ifdef CMANGOS
|
|
SpellEntry const* spellEntry = GetSpellStore()->LookupEntry<SpellEntry>(spell);
|
|
unit->AddThreat(victim, threat, false, spellEntry ? spellEntry->SchoolMask : SPELL_SCHOOL_MASK_NONE, spellEntry);
|
|
#else
|
|
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spell);
|
|
#ifdef CLASSIC
|
|
unit->AddThreat(victim, threat, false, spellEntry ? GetSchoolMask(spellEntry->School) : SPELL_SCHOOL_MASK_NONE, spellEntry);
|
|
#else
|
|
unit->AddThreat(victim, threat, false, spellEntry ? static_cast<SpellSchoolMask>(spellEntry->SchoolMask) : SPELL_SCHOOL_MASK_NONE, spellEntry);
|
|
#endif
|
|
#endif
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/*int RestoreDisplayId(lua_State* L, Unit* unit)
|
|
{
|
|
unit->RestoreDisplayId();
|
|
return 0;
|
|
}*/
|
|
|
|
/*int RestoreFaction(lua_State* L, Unit* unit)
|
|
{
|
|
unit->RestoreFaction();
|
|
return 0;
|
|
}*/
|
|
|
|
/*int RemoveBindSightAuras(lua_State* L, Unit* unit)
|
|
{
|
|
unit->RemoveBindSightAuras();
|
|
return 0;
|
|
}*/
|
|
|
|
/*int RemoveCharmAuras(lua_State* L, Unit* unit)
|
|
{
|
|
unit->RemoveCharmAuras();
|
|
return 0;
|
|
}*/
|
|
|
|
/*int DisableMelee(lua_State* L, Unit* unit)
|
|
{
|
|
bool apply = Eluna::CHECKVAL<bool>(L, 2, true);
|
|
|
|
if (apply)
|
|
unit->AddUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
|
else
|
|
unit->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
|
return 0;
|
|
}*/
|
|
|
|
/*int SummonGuardian(lua_State* L, Unit* unit)
|
|
{
|
|
uint32 entry = Eluna::CHECKVAL<uint32>(L, 2);
|
|
float x = Eluna::CHECKVAL<float>(L, 3);
|
|
float y = Eluna::CHECKVAL<float>(L, 4);
|
|
float z = Eluna::CHECKVAL<float>(L, 5);
|
|
float o = Eluna::CHECKVAL<float>(L, 6);
|
|
uint32 desp = Eluna::CHECKVAL<uint32>(L, 7, 0);
|
|
|
|
SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(61);
|
|
if (!properties)
|
|
return 1;
|
|
Position pos;
|
|
pos.Relocate(x,y,z,o);
|
|
TempSummon* summon = unit->GetMap()->SummonCreature(entry, pos, properties, desp, unit);
|
|
|
|
if (!summon)
|
|
return 1;
|
|
|
|
if (summon->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
|
|
((Guardian*)summon)->InitStatsForLevel(unit->getLevel());
|
|
|
|
if (properties && properties->Category == SUMMON_CATEGORY_ALLY)
|
|
summon->setFaction(unit->getFaction());
|
|
if (summon->GetEntry() == 27893)
|
|
{
|
|
if (uint32 weapon = unit->GetUInt32Value(PLAYER_VISIBLE_ITEM_16_ENTRYID))
|
|
{
|
|
summon->SetDisplayId(11686);
|
|
summon->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, weapon);
|
|
}
|
|
else
|
|
summon->SetDisplayId(1126);
|
|
}
|
|
summon->AI()->EnterEvadeMode();
|
|
|
|
Eluna::Push(L, summon);
|
|
return 1;
|
|
}*/
|
|
};
|
|
#endif
|