Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
341 lines (312 sloc) 8.79 KB
/*
* 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 GUILDMETHODS_H
#define GUILDMETHODS_H
/***
* Inherits all methods from: none
*/
namespace LuaGuild
{
/**
* Returns a table with the [Player]s in this [Guild]
*
* @return table guildPlayers : table of [Player]s
*/
int GetMembers(Eluna* /*E*/, lua_State* L, Guild* guild)
{
lua_newtable(L);
int tbl = lua_gettop(L);
uint32 i = 0;
{
#ifdef TRINITY
boost::shared_lock<boost::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
#else
#ifdef MANGOS
ACE_READ_GUARD_RETURN(HashMapHolder<Player>::LockType, g, HashMapHolder<Player>::GetLock(), 0)
#else
HashMapHolder<Player>::ReadGuard g(HashMapHolder<Player>::GetLock());
#endif
#endif
const HashMapHolder<Player>::MapType& m = eObjectAccessor()GetPlayers();
for (HashMapHolder<Player>::MapType::const_iterator it = m.begin(); it != m.end(); ++it)
{
if (Player* player = it->second)
{
if (player->GetSession() && (player->GetGuildId() == guild->GetId()))
{
++i;
Eluna::Push(L, i);
Eluna::Push(L, player);
lua_settable(L, tbl);
}
}
}
}
lua_settop(L, tbl); // push table to top of stack
return 1;
}
/**
* Returns the member count of this [Guild]
*
* @return uint32 memberCount
*/
int GetMemberCount(Eluna* /*E*/, lua_State* L, Guild* guild)
{
#ifdef TRINITY
Eluna::Push(L, guild->GetMemberCount());
#else
Eluna::Push(L, guild->GetMemberSize());
#endif
return 1;
}
/**
* Finds and returns the [Guild] leader by their GUID if logged in
*
* @return [Player] leader
*/
int GetLeader(Eluna* /*E*/, lua_State* L, Guild* guild)
{
#ifndef TRINITY
Eluna::Push(L, eObjectAccessor()FindPlayer(guild->GetLeaderGuid()));
#else
Eluna::Push(L, eObjectAccessor()FindPlayer(guild->GetLeaderGUID()));
#endif
return 1;
}
/**
* Returns [Guild] leader GUID
*
* @return uint64 leaderGUID
*/
int GetLeaderGUID(Eluna* /*E*/, lua_State* L, Guild* guild)
{
#ifndef TRINITY
Eluna::Push(L, guild->GetLeaderGuid());
#else
Eluna::Push(L, guild->GetLeaderGUID());
#endif
return 1;
}
/**
* Returns the [Guild]s entry ID
*
* @return uint32 entryId
*/
int GetId(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Eluna::Push(L, guild->GetId());
return 1;
}
/**
* Returns the [Guild]s name
*
* @return string guildName
*/
int GetName(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Eluna::Push(L, guild->GetName());
return 1;
}
/**
* Returns the [Guild]s current Message Of The Day
*
* @return string guildMOTD
*/
int GetMOTD(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Eluna::Push(L, guild->GetMOTD());
return 1;
}
/**
* Returns the [Guild]s current info
*
* @return string guildInfo
*/
int GetInfo(Eluna* /*E*/, lua_State* L, Guild* guild)
{
#ifndef TRINITY
Eluna::Push(L, guild->GetGINFO());
#else
Eluna::Push(L, guild->GetInfo());
#endif
return 1;
}
#ifndef CATA
/**
* Sets the leader of this [Guild]
*
* @param [Player] leader : the [Player] leader to change
*/
int SetLeader(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Player* player = Eluna::CHECKOBJ<Player>(L, 2);
#ifndef TRINITY
guild->SetLeader(player->GET_GUID());
#else
guild->HandleSetLeader(player->GetSession(), player->GetName());
#endif
return 0;
}
#endif
#ifndef CLASSIC
/**
* Sets the information of the bank tab specified
*
* @param uint8 tabId : the ID of the tab specified
* @param string info : the information to be set to the bank tab
*/
int SetBankTabText(Eluna* /*E*/, lua_State* L, Guild* guild)
{
uint8 tabId = Eluna::CHECKVAL<uint8>(L, 2);
const char* text = Eluna::CHECKVAL<const char*>(L, 3);
#ifndef TRINITY
guild->SetGuildBankTabText(tabId, text);
#else
guild->SetBankTabText(tabId, text);
#endif
return 0;
}
#endif
// SendPacketToGuild(packet)
/**
* Sends a [WorldPacket] to all the [Player]s in the [Guild]
*
* @param [WorldPacket] packet : the [WorldPacket] to be sent to the [Player]s
*/
int SendPacket(Eluna* /*E*/, lua_State* L, Guild* guild)
{
WorldPacket* data = Eluna::CHECKOBJ<WorldPacket>(L, 2);
#ifdef CMANGOS
guild->BroadcastPacket(*data);
#else
guild->BroadcastPacket(data);
#endif
return 0;
}
// SendPacketToRankedInGuild(packet, rankId)
/**
* Sends a [WorldPacket] to all the [Player]s at the specified rank in the [Guild]
*
* @param [WorldPacket] packet : the [WorldPacket] to be sent to the [Player]s
* @param uint8 rankId : the rank ID
*/
int SendPacketToRanked(Eluna* /*E*/, lua_State* L, Guild* guild)
{
WorldPacket* data = Eluna::CHECKOBJ<WorldPacket>(L, 2);
uint8 ranked = Eluna::CHECKVAL<uint8>(L, 3);
#ifdef CMANGOS
guild->BroadcastPacketToRank(*data, ranked);
#else
guild->BroadcastPacketToRank(data, ranked);
#endif
return 0;
}
/**
* Disbands the [Guild]
*/
int Disband(Eluna* /*E*/, lua_State* /*L*/, Guild* guild)
{
guild->Disband();
return 0;
}
/**
* Adds the specified [Player] to the [Guild] at the specified rank.
*
* If no rank is specified, defaults to none.
*
* @param [Player] player : the [Player] to be added to the guild
* @param uint8 rankId : the rank ID
*/
int AddMember(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Player* player = Eluna::CHECKOBJ<Player>(L, 2);
uint8 rankId = Eluna::CHECKVAL<uint8>(L, 3, GUILD_RANK_NONE);
#ifdef TRINITY
SQLTransaction trans(nullptr);
guild->AddMember(trans, player->GET_GUID(), rankId);
#else
guild->AddMember(player->GET_GUID(), rankId);
#endif
return 0;
}
/**
* Removes the specified [Player] from the [Guild].
*
* @param [Player] player : the [Player] to be removed from the guild
* @param bool isDisbanding : default 'false', should only be set to 'true' if the guild is triggered to disband
*/
int DeleteMember(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Player* player = Eluna::CHECKOBJ<Player>(L, 2);
bool isDisbanding = Eluna::CHECKVAL<bool>(L, 3, false);
#ifdef TRINITY
SQLTransaction trans(nullptr);
guild->DeleteMember(trans, player->GET_GUID(), isDisbanding);
#else
guild->DelMember(player->GET_GUID(), isDisbanding);
#endif
return 0;
}
/**
* Promotes/demotes the [Player] to the specified rank.
*
* @param [Player] player : the [Player] to be promoted/demoted
* @param uint8 rankId : the rank ID
*/
int SetMemberRank(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Player* player = Eluna::CHECKOBJ<Player>(L, 2);
uint8 newRank = Eluna::CHECKVAL<uint8>(L, 3);
#ifdef TRINITY
SQLTransaction trans(nullptr);
guild->ChangeMemberRank(trans, player->GET_GUID(), newRank);
#else
guild->ChangeMemberRank(player->GET_GUID(), newRank);
#endif
return 0;
}
#ifndef CLASSIC
// Move to Player methods
/**
* Windraws money from the [Guild] bank
*
* @param [Player] player
* @param uint32 money
*/
int WithdrawBankMoney(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Player* player = Eluna::CHECKOBJ<Player>(L, 2);
uint32 money = Eluna::CHECKVAL<uint32>(L, 3);
#ifndef TRINITY
if (guild->GetGuildBankMoney() < money)
return 0;
guild->SetBankMoney(guild->GetGuildBankMoney() - money);
#else
guild->HandleMemberWithdrawMoney(player->GetSession(), money);
#endif
return 0;
}
// Move to Player methods
/**
* Deposits money to the [Guild] bank
*
* @param [Player] player
* @param uint32 money
*/
int DepositBankMoney(Eluna* /*E*/, lua_State* L, Guild* guild)
{
Player* player = Eluna::CHECKOBJ<Player>(L, 2);
uint32 money = Eluna::CHECKVAL<uint32>(L, 3);
#ifndef TRINITY
guild->SetBankMoney(guild->GetGuildBankMoney() + money);
#else
guild->HandleMemberDepositMoney(player->GetSession(), money);
#endif
return 0;
}
#endif
};
#endif