Cleanup of bot raid work and inclusion of bot_raid in cmake

This commit is contained in:
neckkola
2022-02-23 15:58:13 -04:00
parent ff3cd08189
commit d67fa473a2
12 changed files with 135 additions and 126 deletions
+83 -80
View File
@@ -24,7 +24,7 @@
#include "groups.h"
#include "mob.h"
#include "raids.h"
#include "bot.h" //Mitch
#include "bot.h"
#include "worldserver.h"
@@ -96,13 +96,22 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo
if(!c)
return;
#ifdef BOTS
std::string query = StringFormat("INSERT INTO raid_members SET raidid = %lu, charid = %lu, "
"groupid = %lu, _class = %d, level = %d, name = '%s', "
"isgroupleader = %d, israidleader = %d, islooter = %d, isbot = 0",
(unsigned long)GetID(), (unsigned long)c->CharacterID(),
(unsigned long)group, c->GetClass(), c->GetLevel(),
c->GetName(), groupleader, rleader, looter);
auto results = database.QueryDatabase(query);
#else
std::string query = StringFormat("INSERT INTO raid_members SET raidid = %lu, charid = %lu, "
"groupid = %lu, _class = %d, level = %d, name = '%s', "
"isgroupleader = %d, israidleader = %d, islooter = %d",
(unsigned long)GetID(), (unsigned long)c->CharacterID(),
(unsigned long)group, c->GetClass(), c->GetLevel(),
c->GetName(), groupleader, rleader, looter);
#endif
auto results = database.QueryDatabase(query);
if(!results.Success()) {
LogError("Error inserting into raid members: [{}]", results.ErrorMessage().c_str());
@@ -171,7 +180,8 @@ void Raid::AddMember(Client *c, uint32 group, bool rleader, bool groupleader, bo
worldserver.SendPacket(pack);
safe_delete(pack);
}
//Mitch
#ifdef BOTS
void Raid::AddBot(Bot* b, uint32 group, bool rleader, bool groupleader, bool looter) {
if (!b)
return;
@@ -190,17 +200,6 @@ void Raid::AddBot(Bot* b, uint32 group, bool rleader, bool groupleader, bool loo
LearnMembers();
VerifyRaid();
// Bots are being invited and cannot be the raid leader
// if (rleader) {
// database.SetRaidGroupLeaderInfo(RAID_GROUPLESS, GetID());
// UpdateRaidAAs();
// }
// Bots can be group leaders, though they do not have GroupAA
// if (group != RAID_GROUPLESS && groupleader) {
// database.SetRaidGroupLeaderInfo(group, GetID());
// UpdateGroupAAs(group); //Mitch Jan 22
// }
if (group < 12) //Jan22
GroupUpdate(group); //Jan22
@@ -210,36 +209,7 @@ void Raid::AddBot(Bot* b, uint32 group, bool rleader, bool groupleader, bool loo
b->SetRaidGrouped(true);
b->p_raid_instance = this;
//SendRaidMOTD(b->GetOwner()->CastToClient());
// Mitch What to do here?
// xtarget shit ..........
//if (group == RAID_GROUPLESS) {
// if (rleader) {
// GetXTargetAutoMgr()->merge(*c->GetXTargetAutoMgr());
// c->GetXTargetAutoMgr()->clear();
// c->SetXTargetAutoMgr(GetXTargetAutoMgr());
// }
// else {
// if (!c->GetXTargetAutoMgr()->empty()) {
// GetXTargetAutoMgr()->merge(*c->GetXTargetAutoMgr());
// c->GetXTargetAutoMgr()->clear();
// c->RemoveAutoXTargets();
// }
// c->SetXTargetAutoMgr(GetXTargetAutoMgr());
// if (!c->GetXTargetAutoMgr()->empty())
// c->SetDirtyAutoHaters();
// }
//}
// Raid* raid_update = nullptr;
// raid_update = b->GetOwner()->GetRaid();
// if (raid_update) {
// raid_update->SendHPManaEndPacketsTo(b->GetOwner()->CastToClient());
// raid_update->SendHPManaEndPacketsFrom(b->GetOwner()->CastToClient());
// }
auto pack = new ServerPacket(ServerOP_RaidAdd, sizeof(ServerRaidGeneralAction_Struct));
ServerRaidGeneralAction_Struct* rga = (ServerRaidGeneralAction_Struct*)pack->pBuffer;
@@ -250,6 +220,7 @@ void Raid::AddBot(Bot* b, uint32 group, bool rleader, bool groupleader, bool loo
worldserver.SendPacket(pack);
safe_delete(pack);
}
#endif
void Raid::RemoveMember(const char *characterName)
@@ -1063,7 +1034,7 @@ void Raid::SendRaidAdd(const char *who, Client *to)
for(int x = 0; x < MAX_RAID_MEMBERS; x++)
{
if(strcmp(members[x].membername, who) == 0)// || !members[x].SentToBotOwner) //Mitch
if(strcmp(members[x].membername, who) == 0)
{
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(RaidAddMember_Struct));
RaidAddMember_Struct *ram = (RaidAddMember_Struct*)outapp->pBuffer;
@@ -1212,8 +1183,10 @@ void Raid::SendBulkRaid(Client *to)
if(!to)
return;
#ifdef BOTS
if (members[GetPlayerIndex(to)].IsBot)
return;
#endif
for(int x = 0; x < MAX_RAID_MEMBERS; x++)
{
@@ -1228,7 +1201,11 @@ void Raid::QueuePacket(const EQApplicationPacket *app, bool ack_req)
{
for(int x = 0; x < MAX_RAID_MEMBERS; x++)
{
#ifdef BOTS
if(members[x].member && !members[x].IsBot)
#else
if(members[x].member)
#endif
{
members[x].member->QueuePacket(app, ack_req);
}
@@ -1238,9 +1215,10 @@ void Raid::QueuePacket(const EQApplicationPacket *app, bool ack_req)
void Raid::SendMakeLeaderPacket(const char *who) //30
{
//if (entity_list.GetBotByBotName(who) && IsRaidMemberBot(entity_list.GetBotByBotName(who)->CastToClient()))
#ifdef BOTS
if (entity_list.GetBotByBotName(who) && members[GetPlayerIndex(who)].IsBot)
return;
#endif
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(RaidLeadershipUpdate_Struct));
RaidLeadershipUpdate_Struct *rg = (RaidLeadershipUpdate_Struct*)outapp->pBuffer;
@@ -1257,8 +1235,10 @@ void Raid::SendMakeLeaderPacketTo(const char *who, Client *to)
if(!to)
return;
#ifdef BOTS
if (members[GetPlayerIndex(who)].IsBot)
return;
#endif
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(RaidLeadershipUpdate_Struct));
RaidLeadershipUpdate_Struct *rg = (RaidLeadershipUpdate_Struct*)outapp->pBuffer;
@@ -1290,8 +1270,10 @@ void Raid::SendGroupUpdate(Client *to)
if(!to)
return;
#ifdef BOTS
if (members[GetPlayerIndex(to)].IsBot)
return;
#endif
auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupUpdate2_Struct));
GroupUpdate2_Struct* gu = (GroupUpdate2_Struct*)outapp->pBuffer;
@@ -1481,8 +1463,10 @@ void Raid::SendRaidMOTDToWorld()
void Raid::SendGroupLeadershipAA(Client *c, uint32 gid)
{
#ifdef BOTS
if (members[GetPlayerIndex(c)].IsBot)
return;
#endif
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(RaidLeadershipUpdate_Struct));
RaidLeadershipUpdate_Struct *rlaa = (RaidLeadershipUpdate_Struct *)outapp->pBuffer;
@@ -1499,45 +1483,25 @@ void Raid::SendGroupLeadershipAA(Client *c, uint32 gid)
void Raid::SendGroupLeadershipAA(uint32 gid)
{
for (uint32 i = 0; i < MAX_RAID_MEMBERS; i++)
#ifdef BOTS
if (members[i].member && members[i].GroupNumber == gid && !members[i].IsBot)
#else
if (members[i].member && members[i].GroupNumber == gid)
#endif
SendGroupLeadershipAA(members[i].member, gid);
}
void Raid::SendAllRaidLeadershipAA()
{
for (uint32 i = 0; i < MAX_RAID_MEMBERS; i++)
#ifdef BOTS
if (members[i].member && !members[i].IsBot)
SendGroupLeadershipAA(members[i].member, members[i].GroupNumber);
#else
if (members[i].member)
#endif
SendGroupLeadershipAA(members[i].member, members[i].GroupNumber);
}
bool Raid::IsRaidMemberBot(Client* client)
{
std::string query = StringFormat("SELECT mob_type FROM vw_bot_character_mobs WHERE name = '%s' LIMIT 1",
client->GetCleanName());
auto results = database.QueryDatabase(query);
if (!results.Success())
return true; //return true to avoid sending a packet to a non-existant client as a failsafe
if (results.RowCount() == 0) {
LogError(
"Error getting B/C info for character name [{}] for IsRaidMemberBot. Error [{}]",
client->GetCleanName(),
results.ErrorMessage().c_str()
);
return true;//return true to avoid sending a packet to a non-existant client as a failsafe
}
auto row = results.begin();
const char* c = "C";
const char* b = "B";
if (strcmp(row[0], c) == 0) {
return false; // client is a client
}
else if (strcmp(row[0], b) == 0) {
return true; // client is actually a bot
}
}
void Raid::LockRaid(bool lockFlag)
{
@@ -1604,11 +1568,18 @@ bool Raid::LearnMembers()
{
memset(members, 0, (sizeof(RaidMember)*MAX_RAID_MEMBERS));
#ifdef BOTS
std::string query = StringFormat("SELECT name, groupid, _class, level, "
"isgroupleader, israidleader, islooter, isbot "
"FROM raid_members WHERE raidid = %lu",
(unsigned long)GetID());
auto results = database.QueryDatabase(query);
#else
std::string query = StringFormat("SELECT name, groupid, _class, level, "
"isgroupleader, israidleader, islooter "
"FROM raid_members WHERE raidid = %lu",
(unsigned long)GetID());
#endif
auto results = database.QueryDatabase(query);
if (!results.Success())
return false;
@@ -1636,8 +1607,10 @@ bool Raid::LearnMembers()
members[index].IsGroupLeader = atoi(row[4]);
members[index].IsRaidLeader = atoi(row[5]);
members[index].IsLooter = atoi(row[6]);
members[index].IsBot = atoi(row[7]); //Mitch
++index;
#ifdef BOTS
members[index].IsBot = atoi(row[7]);
#endif
++index;
}
return true;
@@ -1653,21 +1626,28 @@ void Raid::VerifyRaid()
else{
Client *c = entity_list.GetClientByName(members[x].membername);
#ifdef BOTS
Bot* b = entity_list.GetBotByBotName(members[x].membername); //Mitch
Bot* b = entity_list.GetBotByBotName(members[x].membername);
#endif
if(c){
members[x].member = c;
#ifdef BOTS
members[x].IsBot = false;
#endif
}
#ifdef BOTS
else if(b){
members[x].member = b->CastToClient(); //Raid requires client* we are forcing it here to be a BOT
//Raid requires client* we are forcing it here to be a BOT. Care is needed here as any client function that
//does not exist within the Bot Class will likely corrupt memory for the member object. Good practice to test the IsBot
//attribute before calling a client function or casting to client.
members[x].member = b->CastToClient();
members[x].IsBot = true; //Used to identify those members who are Bots
}
#endif
else {
members[x].member = nullptr;
#ifdef BOTS
members[x].IsBot = false;
#endif
}
}
if(members[x].IsRaidLeader){
@@ -1720,7 +1700,11 @@ void Raid::SendHPManaEndPacketsTo(Client *client)
EQApplicationPacket outapp(OP_MobManaUpdate, sizeof(MobManaUpdate_Struct));
for(int x = 0; x < MAX_RAID_MEMBERS; x++) {
#ifdef BOTS
if(members[x].member && !members[x].IsBot) {
#else
if (members[x].member) {
#endif
if((members[x].member != client) && (members[x].GroupNumber == group_id)) {
members[x].member->CreateHPPacket(&hp_packet);
@@ -1762,7 +1746,11 @@ void Raid::SendHPManaEndPacketsFrom(Mob *mob)
mob->CreateHPPacket(&hpapp);
for(int x = 0; x < MAX_RAID_MEMBERS; x++) {
#ifdef BOTS
if(members[x].member && !members[x].IsBot) {
#else
if (members[x].member) {
#endif
if(!mob->IsClient() || ((members[x].member != mob->CastToClient()) && (members[x].GroupNumber == group_id))) {
members[x].member->QueuePacket(&hpapp, false);
if (members[x].member->ClientVersion() >= EQ::versions::ClientVersion::SoD) {
@@ -1795,7 +1783,11 @@ void Raid::SendManaPacketFrom(Mob *mob)
EQApplicationPacket outapp(OP_MobManaUpdate, sizeof(MobManaUpdate_Struct));
for (int x = 0; x < MAX_RAID_MEMBERS; x++) {
#ifdef BOTS
if (members[x].member && !members[x].IsBot) {
#else
if (members[x].member) {
#endif
if (!mob->IsClient() || ((members[x].member != mob->CastToClient()) && (members[x].GroupNumber == group_id))) {
if (members[x].member->ClientVersion() >= EQ::versions::ClientVersion::SoD) {
outapp.SetOpcode(OP_MobManaUpdate);
@@ -1822,7 +1814,11 @@ void Raid::SendEndurancePacketFrom(Mob *mob)
EQApplicationPacket outapp(OP_MobManaUpdate, sizeof(MobManaUpdate_Struct));
for (int x = 0; x < MAX_RAID_MEMBERS; x++) {
#ifdef BTOS
if (members[x].member && !members[x].IsBot) {
#else
if (members[x].member) {
#endif
if (!mob->IsClient() || ((members[x].member != mob->CastToClient()) && (members[x].GroupNumber == group_id))) {
if (members[x].member->ClientVersion() >= EQ::versions::ClientVersion::SoD) {
outapp.SetOpcode(OP_MobEnduranceUpdate);
@@ -1929,11 +1925,15 @@ void Raid::CheckGroupMentor(uint32 group_id, Client *c)
void Raid::SetDirtyAutoHaters()
{
for (int i = 0; i < MAX_RAID_MEMBERS; ++i)
#ifdef BOTS
if (members[i].member && members[i].IsBot)
{
members[i].member->CastToBot()->SetDirtyAutoHaters();
}
else if (members[i].member && !members[i].IsBot)
#else
if (members[i].member)
#endif
{
members[i].member->SetDirtyAutoHaters();
}
@@ -1955,9 +1955,10 @@ void Raid::QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_re
if (!members[i].member->IsClient())
continue;
#ifdef BOTS
if (members[i].IsBot)
continue;
#endif
if (ignore_sender && members[i].member == sender)
continue;
@@ -2020,6 +2021,7 @@ bool Raid::DoesAnyMemberHaveExpeditionLockout(
return Expedition::HasLockoutByCharacterName(raid_member.membername, expedition_name, event_name);
});
}
#ifdef BOTS
Mob* Raid::GetRaidMainAssistOneByName(const char* name)
{
Raid* raid = entity_list.GetRaidByBotName(name);
@@ -2032,3 +2034,4 @@ Mob* Raid::GetRaidMainAssistOneByName(const char* name)
}
return nullptr;
}
#endif