From 3f0058a5f0572007be2f256cf87a680939b169ab Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+wintersolstice8@users.noreply.github.com> Date: Sun, 5 May 2024 21:48:09 -0600 Subject: [PATCH] [core] Implement supertanking --- src/map/ai/controllers/mob_controller.cpp | 22 ++++++++++------------ src/map/entities/mobentity.cpp | 4 ++++ src/map/lua/lua_baseentity.cpp | 8 ++++---- src/map/utils/fishingutils.cpp | 2 +- src/map/zone_entities.cpp | 4 ++-- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/map/ai/controllers/mob_controller.cpp b/src/map/ai/controllers/mob_controller.cpp index 1ff5ad2251a..23962ccfced 100644 --- a/src/map/ai/controllers/mob_controller.cpp +++ b/src/map/ai/controllers/mob_controller.cpp @@ -202,7 +202,7 @@ void CMobController::TryLink() // my pet should help as well if (PMob->PPet != nullptr && PMob->PPet->PAI->IsRoaming()) { - ((CMobEntity*)PMob->PPet)->PEnmityContainer->AddBaseEnmity(PTarget); + PMob->PPet->PAI->Engage(PTarget->id); } // Handle monster linking if they are close enough @@ -220,14 +220,7 @@ void CMobController::TryLink() if (PPartyMember->PAI->IsRoaming() && PPartyMember->CanLink(&PMob->loc.p, PMob->getMobMod(MOBMOD_SUPERLINK))) { - PPartyMember->PEnmityContainer->AddBaseEnmity(PTarget); - - if (PPartyMember->m_roamFlags & ROAMFLAG_IGNORE) - { - // force into attack action - // TODO - PPartyMember->PAI->Engage(PTarget->targid); - } + PPartyMember->PAI->Engage(PTarget->targid); } } } @@ -239,7 +232,7 @@ void CMobController::TryLink() if (PMaster->PAI->IsRoaming() && PMaster->CanLink(&PMob->loc.p, PMob->getMobMod(MOBMOD_SUPERLINK))) { - PMaster->PEnmityContainer->AddBaseEnmity(PTarget); + PMaster->PAI->Engage(PTarget->targid); } } } @@ -837,12 +830,11 @@ void CMobController::DoRoamTick(time_point tick) } else if (PMob->m_OwnerID.id != 0 && !(PMob->m_roamFlags & ROAMFLAG_IGNORE)) { - // i'm claimed by someone and need hate towards this person + // i'm claimed by someone and want to be fighting them PTarget = (CBattleEntity*)PMob->GetEntity(PMob->m_OwnerID.targid, TYPE_PC | TYPE_MOB | TYPE_PET | TYPE_TRUST); if (PTarget != nullptr) { - PMob->PEnmityContainer->AddBaseEnmity(PTarget); Engage(PTarget->targid); } @@ -1145,6 +1137,12 @@ bool CMobController::Engage(uint16 targid) m_LastSpecialTime = m_Tick - std::chrono::milliseconds(PMob->getBigMobMod(MOBMOD_SPECIAL_COOL) + xirand::GetRandomNumber(PMob->getBigMobMod(MOBMOD_SPECIAL_DELAY))); } + + // Pet should also fight the target if they can + if (PMob->PPet && !PMob->PPet->PAI->IsEngaged()) + { + PMob->PPet->PAI->Engage(targid); + } } return ret; } diff --git a/src/map/entities/mobentity.cpp b/src/map/entities/mobentity.cpp index b16bbb88b4a..99de5cbb849 100644 --- a/src/map/entities/mobentity.cpp +++ b/src/map/entities/mobentity.cpp @@ -1105,6 +1105,10 @@ void CMobEntity::OnEngage(CAttackState& state) PPet = state.GetTarget(); PTarget = ((CPetEntity*)PTarget)->PMaster; } + + // TODO: Supertanking might be effected by this block when we don't want it to be. + // Things like Ambuscade "don't have" supertanking, though. + // This block apparently only effects rare things like NW apollyon, so might be ok for now. if (PTarget->objtype == TYPE_PC) { // clang-format off diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index 00e56f63f8c..cce50f693e8 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -12124,22 +12124,22 @@ void CLuaBaseEntity::lowerEnmity(CLuaBaseEntity* PEntity, uint8 percent) /************************************************************************ * Function: updateEnmity() - * Purpose : Unlike updateClaim(), this function only generates Enmity toward an Entity + * Purpose : Unlike updateClaim(), this function only causes a mob to fight the target * Example : mob:updateEnmity(target) - * Notes : Mob will aggro an Entity, but be unclaimed until engaged + * Notes : Mob will engage an entity, but be unclaimed until acted upon ************************************************************************/ void CLuaBaseEntity::updateEnmity(CLuaBaseEntity* PEntity) { if (m_PBaseEntity->objtype != TYPE_MOB) { - ShowWarning("Attempting to update enmnity for invalid entity type (%s).", m_PBaseEntity->getName()); + ShowWarning("Attempting to update enmity for invalid entity type (%s).", m_PBaseEntity->getName()); return; } if (PEntity != nullptr && PEntity->GetBaseEntity()->objtype != TYPE_NPC) { - static_cast(m_PBaseEntity)->PEnmityContainer->AddBaseEnmity(static_cast(PEntity->GetBaseEntity())); + m_PBaseEntity->PAI->Engage(PEntity->GetBaseEntity()->targid); } } diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 53d65518c2f..d23262f5c29 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -1627,7 +1627,7 @@ namespace fishingutils // PChar->StatusEffectContainer->CopyConfrontationEffect(PMob); if ((mob->log < 255 && mob->quest < 255) || mob->questOnly || (PMob->m_TrueDetection && PMob->getMobMod(MOBMOD_DETECTION) & DETECT_SCENT) || !PChar->StatusEffectContainer->HasStatusEffect(EFFECT_SNEAK)) { - PMob->PEnmityContainer->AddBaseEnmity(PChar); + PMob->PAI->Engage(PChar->targid); battleutils::ClaimMob(PMob, (CBattleEntity*)PChar); } diff --git a/src/map/zone_entities.cpp b/src/map/zone_entities.cpp index 9168fbd485d..7c06a0493fc 100644 --- a/src/map/zone_entities.cpp +++ b/src/map/zone_entities.cpp @@ -631,7 +631,7 @@ void CZoneEntities::SpawnMOBs(CCharEntity* PChar) if (validAggro && PController->CanAggroTarget(PChar)) { - PCurrentMob->PEnmityContainer->AddBaseEnmity(PChar); + PCurrentMob->PAI->Engage(PChar->targid); } } else if (MOB != PChar->SpawnMOBList.end()) @@ -1552,7 +1552,7 @@ void CZoneEntities::ZoneServer(time_point tick) CMobController* PController = static_cast(PCurrentMob->PAI->GetController()); if (PController != nullptr && PController->CanAggroTarget(PMob)) { - PCurrentMob->PEnmityContainer->AddBaseEnmity(PMob); + PCurrentMob->PAI->Engage(PMob->targid); } } }