Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add PLAYER_EVENT_ON_GROUP_ROLL_REWARD_ITEM and roll methods #119

Merged
merged 3 commits into from
Apr 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ Eluna API for AC:
- Added `RegisterPlayerEvent` `53` (`PLAYER_EVENT_ON_STORE_NEW_ITEM`): https://github.com/azerothcore/mod-eluna/pull/88
- Added `RegisterPlayerEvent` `54` (`PLAYER_EVENT_ON_COMPLETE_QUEST`): https://github.com/azerothcore/mod-eluna/pull/90
- Added `RegisterPlayerEvent` `55` (`PLAYER_EVENT_ON_CAN_GROUP_INVITE`): https://github.com/azerothcore/mod-eluna/pull/100
- Added `RegisterPlayerEvent` `56` (`PLAYER_EVENT_ON_GROUP_ROLL_REWARD_ITEM`): https://github.com/azerothcore/mod-eluna/pull/119
- Added `Player:GetMailCount()`: https://github.com/azerothcore/mod-eluna/pull/76
- Added `Player:GetXP()`: https://github.com/azerothcore/mod-eluna/pull/77
- Added `Player:GetAchievementCriteriaProgress()`: https://github.com/azerothcore/mod-eluna/pull/78
Expand Down Expand Up @@ -118,6 +119,7 @@ Eluna API for AC:
- Added `GetItemTemplate(itemEntry)`: https://github.com/azerothcore/mod-eluna/pull/84
- Added `ChatHandler` methods: https://github.com/azerothcore/mod-eluna/pull/23
- Added `ItemTemplate` methods: https://github.com/azerothcore/mod-eluna/pull/84
- Added `Roll` methods: https://github.com/azerothcore/mod-eluna/pull/119
- Added logging with `ELUNA_LOG_INFO` for `RunCommand()`: https://github.com/azerothcore/mod-eluna/pull/75
- Added `GetOwnerHalaa` and `SetOwnerHalaa`: https://github.com/azerothcore/mod-eluna/pull/79
- Added `WorldDBQueryAsync`, `CharDBQueryAsync` and `AuthDBQueryAsync`: https://github.com/azerothcore/mod-eluna/pull/113
5 changes: 5 additions & 0 deletions src/ElunaLuaEngine_SC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,11 @@ class Eluna_PlayerScript : public PlayerScript
sEluna->OnQuestRewardItem(player, item, count);
}

void OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll) override
{
sEluna->OnGroupRollRewardItem(player, item, count, voteType, roll);
}

void OnCreateItem(Player* player, Item* item, uint32 count) override
{
sEluna->OnCreateItem(player, item, count);
Expand Down
1 change: 1 addition & 0 deletions src/LuaEngine/GlobalMethods.h
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,7 @@ namespace LuaGlobalFunctions
* PLAYER_EVENT_ON_STORE_NEW_ITEM = 53, // (event, player, item, count)
* PLAYER_EVENT_ON_COMPLETE_QUEST = 54, // (event, player, quest)
* PLAYER_EVENT_ON_CAN_GROUP_INVITE = 55, // (event, player, memberName) - Can return false to prevent inviting
* PLAYER_EVENT_ON_GROUP_ROLL_REWARD_ITEM = 56, // (event, player, item, count, voteType, roll)
* };
* </pre>
*
Expand Down
1 change: 1 addition & 0 deletions src/LuaEngine/Hooks.h
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ namespace Hooks
PLAYER_EVENT_ON_STORE_NEW_ITEM = 53, // (event, player, item, count)
PLAYER_EVENT_ON_COMPLETE_QUEST = 54, // (event, player, quest)
PLAYER_EVENT_ON_CAN_GROUP_INVITE = 55, // (event, player, memberName) - Can return false to prevent inviting
PLAYER_EVENT_ON_GROUP_ROLL_REWARD_ITEM = 56, // (event, player, item, count, voteType, roll)

PLAYER_EVENT_COUNT
};
Expand Down
2 changes: 1 addition & 1 deletion src/LuaEngine/ItemMethods.h
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ namespace LuaItem
/**
* Returns the [ItemTemplate] for this [Item].
*
* @return ItemTemplate itemTemplate
* @return [ItemTemplate] itemTemplate
*/
int GetItemTemplate(lua_State* L, Item* item)
{
Expand Down
1 change: 1 addition & 0 deletions src/LuaEngine/LuaEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,7 @@ class ELUNA_GAME_API Eluna
bool OnCanSendMail(Player* player, ObjectGuid receiverGuid, ObjectGuid mailbox, std::string& subject, std::string& body, uint32 money, uint32 cod, Item* item);
bool OnCanJoinLfg(Player* player, uint8 roles, lfg::LfgDungeonSet& dungeons, const std::string& comment);
bool OnCanGroupInvite(Player* player, std::string& memberName);
void OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll);

#ifndef CLASSIC
#ifndef TBC
Expand Down
23 changes: 23 additions & 0 deletions src/LuaEngine/LuaFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ extern "C"
#include "ChatHandlerMethods.h"
#include "AchievementMethods.h"
#include "ItemTemplateMethods.h"
#include "RollMethods.h"

luaL_Reg GlobalMethods[] =
{
Expand Down Expand Up @@ -1365,6 +1366,25 @@ ElunaRegister<AchievementEntry> AchievementMethods[] =
{ NULL, NULL }
};

ElunaRegister<Roll> RollMethods[] =
{
{ "GetItemGUID", &LuaRoll::GetItemGUID },
{ "GetItemId", &LuaRoll::GetItemId },
{ "GetItemRandomPropId", &LuaRoll::GetItemRandomPropId },
{ "GetItemRandomSuffix", &LuaRoll::GetItemRandomSuffix },
{ "GetItemCount", &LuaRoll::GetItemCount },
{ "GetPlayerVote", &LuaRoll::GetPlayerVote },
{ "GetPlayerVoteGUIDs", &LuaRoll::GetPlayerVoteGUIDs },
{ "GetTotalPlayersRolling", &LuaRoll::GetTotalPlayersRolling },
{ "GetTotalNeed", &LuaRoll::GetTotalNeed },
{ "GetTotalGreed", &LuaRoll::GetTotalGreed },
{ "GetTotalPass", &LuaRoll::GetTotalPass },
{ "GetItemSlot", &LuaRoll::GetItemSlot },
{ "GetRollVoteMask", &LuaRoll::GetRollVoteMask },

{ NULL, NULL }
};

#if (!defined(TBC) && !defined(CLASSIC))
// fix compile error about accessing vehicle destructor
template<> int ElunaTemplate<Vehicle>::CollectGarbage(lua_State* L)
Expand Down Expand Up @@ -1513,6 +1533,9 @@ void RegisterFunctions(Eluna* E)
ElunaTemplate<AchievementEntry>::Register(E, "AchievementEntry");
ElunaTemplate<AchievementEntry>::SetMethods(E, AchievementMethods);

ElunaTemplate<Roll>::Register(E, "Roll");
ElunaTemplate<Roll>::SetMethods(E, RollMethods);

ElunaTemplate<long long>::Register(E, "long long", true);

ElunaTemplate<unsigned long long>::Register(E, "unsigned long long", true);
Expand Down
11 changes: 11 additions & 0 deletions src/LuaEngine/PlayerHooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -678,3 +678,14 @@ bool Eluna::OnCanGroupInvite(Player* player, std::string& memberName)
Push(memberName);
return CallAllFunctionsBool(PlayerEventBindings, key);
}

void Eluna::OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll)
{
START_HOOK(PLAYER_EVENT_ON_GROUP_ROLL_REWARD_ITEM);
Push(player);
Push(item);
Push(count);
Push(voteType);
Push(roll);
CallAllFunctions(PlayerEventBindings, key);
}
212 changes: 212 additions & 0 deletions src/LuaEngine/RollMethods.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
/*
* 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 ROLLMETHODS_H
#define ROLLMETHODS_H

#include "Group.h"

namespace LuaRoll
{
/**
* Returns the rolled [Item]'s GUID.
*
* @return ObjectGuid guid
*/
int GetItemGUID(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->itemGUID.GetCounter());
return 1;
}

/**
* Returns the rolled [Item]'s entry.
*
* @return uint32 entry
*/
int GetItemId(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->itemid);
return 1;
}

/**
* Returns the rolled [Item]'s random property ID.
*
* @return int32 randomPropId
*/
int GetItemRandomPropId(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->itemRandomPropId);
return 1;
}

/**
* Returns the rolled [Item]'s random suffix ID.
*
* @return uint32 randomSuffix
*/
int GetItemRandomSuffix(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->itemRandomSuffix);
return 1;
}

/**
* Returns the rolled [Item]'s count.
*
* @return uint8 count
*/
int GetItemCount(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->itemCount);
return 1;
}

/**
* Returns the vote type for a [Player] on this [Roll].
* See [Roll:GetPlayerVoteGUIDs] to obtain the GUIDs of the [Player]s who rolled.
*
* <pre>
* enum RollVote
* {
* PASS = 0,
* NEED = 1,
* GREED = 2,
* DISENCHANT = 3,
* NOT_EMITED_YET = 4,
* NOT_VALID = 5
* };
* </pre>
*
* @param ObjectGuid guid
* @return [RollVote] vote
*/
int GetPlayerVote(lua_State* L, Roll* roll)
{
ObjectGuid guid = Eluna::CHECKVAL<ObjectGuid>(L, 2);

bool found = false;
for (std::pair<const ObjectGuid, RollVote>& pair : roll->playerVote)
{
if (pair.first == guid)
{
Eluna::Push(L, pair.second);
found = true;
}
}

if (!found)
{
Eluna::Push(L);
}

return 1;
}

/**
* Returns the GUIDs of the [Player]s who rolled.
* See [Roll:GetPlayerVote] to obtain the vote type of a [Player].
*
* @return table guids
*/
int GetPlayerVoteGUIDs(lua_State* L, Roll* roll)
{
lua_newtable(L);
int table = lua_gettop(L);
uint32 i = 1;
for (std::pair<const ObjectGuid, RollVote>& pair : roll->playerVote)
{
Eluna::Push(L, pair.first);
lua_rawseti(L, table, i);
++i;
}

lua_settop(L, table); // push table to top of stack
return 1;
}

/**
* Returns the total number of players who rolled.
*
* @return uint8 playersCount
*/
int GetTotalPlayersRolling(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->totalPlayersRolling);
return 1;
}

/**
* Returns the total number of players who rolled need.
*
* @return uint8 playersCount
*/
int GetTotalNeed(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->totalNeed);
return 1;
}

/**
* Returns the total number of players who rolled greed.
*
* @return uint8 playersCount
*/
int GetTotalGreed(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->totalGreed);
return 1;
}

/**
* Returns the total number of players who passed.
*
* @return uint8 playersCount
*/
int GetTotalPass(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->totalPass);
return 1;
}

/**
* Returns the rolled [Item]'s slot in the loot window.
*
* @return uint8 slot
*/
int GetItemSlot(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->itemSlot);
return 1;
}

/**
* Returns the mask applied to this [Roll].
*
* <pre>
* enum RollMask
* {
* ROLL_FLAG_TYPE_PASS = 0x01,
* ROLL_FLAG_TYPE_NEED = 0x02,
* ROLL_FLAG_TYPE_GREED = 0x04,
* ROLL_FLAG_TYPE_DISENCHANT = 0x08,
*
* ROLL_ALL_TYPE_NO_DISENCHANT = 0x07,
* ROLL_ALL_TYPE_MASK = 0x0F
* };
* </pre>
*
* @return [RollMask] rollMask
*/
int GetRollVoteMask(lua_State* L, Roll* roll)
{
Eluna::Push(L, roll->rollVoteMask);
return 1;
}
}

#endif