/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef MODULE_AOELOOT_H
#define MODULE_AOELOOT_H
#include "ScriptMgr.h"
#include "Config.h"
#include "Chat.h"
#include "Player.h"
#include "ScriptedGossip.h"
#include "Group.h"
#include "LootMgr.h"
#include "Creature.h"
#include "Log.h"
#include
#include
#include
#include
#define MODULE_STRING "mod-aoe-loot"
// Maximum loot items count
constexpr size_t MAX_LOOT_ITEMS = 16;
using namespace Acore::ChatCommands;
enum AoeLootString
{
AOE_LOGIN_MESSAGE = 1, // Login message
AOE_ITEM_IN_THE_MAIL = 2, // Mail notification
AOE_MODULE_ACTIVE = 3, // unused
AOE_QUEST_ITEM_SENT = 4, // unused
AOE_LOOT_ALREADY_ENABLED = 5, // Already enabled message
AOE_LOOT_ENABLED = 6, // Enabled confirmation
AOE_LOOT_ALREADY_DISABLED = 7, // Already disabled message
AOE_LOOT_DISABLED = 8 // Disabled confirmation
};
class AOELootPlayer : public PlayerScript
{
public:
AOELootPlayer() : PlayerScript("AOELootPlayer", { PLAYERHOOK_ON_LOGIN }) {}
void OnPlayerLogin(Player* player) override;
};
class AOELootServer : public ServerScript
{
public:
AOELootServer() : ServerScript("AOELootServer", { SERVERHOOK_CAN_PACKET_RECEIVE }) {}
bool CanPacketReceive(WorldSession* session, WorldPacket& packet) override;
private:
// Helper function - Check if loot is valid
bool IsLootValid(Loot* loot) const;
// Check if loot can be merged
bool CanMergeLoot(Player* player, Creature* creature) const;
// Safely get item count
size_t GetSafeItemCount(Loot* loot) const;
// Safely merge loot items
bool SafeMergeLootItems(Loot* mainLoot, Loot* sourceLoot, size_t& remainingSlots);
};
// Configuration options structure (optional, for better config management)
struct AOELootConfig
{
bool enabled = true;
bool messageOnLogin = true;
bool allowInGroup = true;
float range = 55.0f;
uint32 maxCorpses = 20;
static AOELootConfig* instance()
{
static AOELootConfig instance;
return &instance;
}
void Load()
{
enabled = sConfigMgr->GetOption("AOELoot.Enable", true);
messageOnLogin = sConfigMgr->GetOption("AOELoot.Message", true);
allowInGroup = sConfigMgr->GetOption("AOELoot.Group", true);
range = sConfigMgr->GetOption("AOELoot.Range", 55.0f);
maxCorpses = sConfigMgr->GetOption("AOELoot.MaxCorpses", 20);
// Validate configuration values
if (range < 5.0f) range = 5.0f;
if (range > 100.0f) range = 100.0f;
if (maxCorpses < 1) maxCorpses = 1;
if (maxCorpses > 50) maxCorpses = 50;
}
};
class AoeLootCommandScript : public CommandScript
{
public:
AoeLootCommandScript() : CommandScript("AoeLootCommandScript") {}
ChatCommandTable GetCommands() const override;
static bool HandleAoeLootOnCommand(ChatHandler* handler, Optional args);
static bool HandleAoeLootOffCommand(ChatHandler* handler, Optional args);
// Getters and setters for player AOE loot settings
static bool getPlayerAoeLootEnabled(uint64 guid);
static void setPlayerAoeLootEnabled(uint64 guid, bool mode);
static bool hasPlayerAoeLootEnabled(uint64 guid);
private:
static std::map playerAoeLootEnabled;
};
void AddSC_AoeLoot()
{
new AOELootPlayer();
new AOELootServer();
new AoeLootCommandScript();
}
#endif //MODULE_AOELOOT_H