Skip to content

Commit

Permalink
Merge pull request #4624 from xkoredev/kore/lsb-cherry-pick-latent-cp
Browse files Browse the repository at this point in the history
[core] Fix conquest logs / latent effects not applying when zoning into non conquest areas
  • Loading branch information
zach2good authored Nov 21, 2023
2 parents 0d86ef2 + bf5e93a commit 47ef443
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 27 deletions.
1 change: 1 addition & 0 deletions documentation/wiki
Submodule wiki added at e38c5e
52 changes: 27 additions & 25 deletions src/map/latent_effect_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,18 @@ bool CLatentEffectContainer::ProcessLatentEffect(CLatentEffect& latentEffect)
auto expression = false;
auto latentFound = true;

if (m_POwner == nullptr)
{
return false;
}

// this gets the current zone ID or destination zone ID if zoning
uint16 playerZoneID = m_POwner->getZone();
if (playerZoneID == 0)
{
return false;
}

// find the latent type from the enum and find the expression to tests againts
switch (latentEffect.GetConditionsID())
{
Expand Down Expand Up @@ -1039,53 +1051,43 @@ bool CLatentEffectContainer::ProcessLatentEffect(CLatentEffect& latentEffect)
break;
case LATENT::NATION_CONTROL:
{
// player is logging in/zoning
if (m_POwner->loc.zone == nullptr)
{
break;
}

auto region = m_POwner->loc.zone->GetRegionID();
auto hasSignet = m_POwner->StatusEffectContainer->HasStatusEffect(EFFECT_SIGNET);
auto hasSanction = m_POwner->StatusEffectContainer->HasStatusEffect(EFFECT_SANCTION);
auto hasSigil = m_POwner->StatusEffectContainer->HasStatusEffect(EFFECT_SIGIL);

// playerZoneId represents the player's destination if they're zoning.
// Otherwise, it represents their current zone.
auto region = zoneutils::GetCurrentRegion(playerZoneID);
auto hasSignet = m_POwner->StatusEffectContainer->HasStatusEffect(EFFECT_SIGNET);
auto hasSanction = m_POwner->StatusEffectContainer->HasStatusEffect(EFFECT_SANCTION);
auto hasSigil = m_POwner->StatusEffectContainer->HasStatusEffect(EFFECT_SIGIL);
auto regionAlwaysOutOfControl = zoneutils::IsAlwaysOutOfNationControl(region);
switch (latentEffect.GetConditionsValue())
{
case 0:
// under own nation's control
expression = region < REGION_TYPE::WEST_AHT_URHGAN && conquest::GetRegionOwner(region) == m_POwner->profile.nation &&
expression = region < REGION_TYPE::WEST_AHT_URHGAN && (!regionAlwaysOutOfControl || conquest::GetRegionOwner(region) == m_POwner->profile.nation) &&
(hasSignet || hasSanction || hasSigil);
break;
case 1:
// outside of own nation's control
expression = region < REGION_TYPE::WEST_AHT_URHGAN && m_POwner->profile.nation != conquest::GetRegionOwner(region) &&
expression = region < REGION_TYPE::WEST_AHT_URHGAN && (regionAlwaysOutOfControl || m_POwner->profile.nation != conquest::GetRegionOwner(region)) &&
(hasSignet || hasSanction || hasSigil);
break;
}
break;
}
case LATENT::ZONE_HOME_NATION:
{
// player is logging in/zoning
if (m_POwner->loc.zone == nullptr)
{
break;
}

auto* PZone = m_POwner->loc.zone;
auto region = static_cast<REGION_TYPE>(latentEffect.GetConditionsValue());
auto nationRegion = static_cast<REGION_TYPE>(latentEffect.GetConditionsValue());
auto region = zoneutils::GetCurrentRegion(playerZoneID);

switch (region)
switch (nationRegion)
{
case REGION_TYPE::SANDORIA:
expression = m_POwner->profile.nation == 0 && PZone->GetRegionID() == region;
expression = m_POwner->profile.nation == 0 && region == nationRegion;
break;
case REGION_TYPE::BASTOK:
expression = m_POwner->profile.nation == 1 && PZone->GetRegionID() == region;
expression = m_POwner->profile.nation == 1 && region == nationRegion;
break;
case REGION_TYPE::WINDURST:
expression = m_POwner->profile.nation == 2 && PZone->GetRegionID() == region;
expression = m_POwner->profile.nation == 2 && region == nationRegion;
break;
default:
break;
Expand Down
5 changes: 5 additions & 0 deletions src/map/utils/zoneutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1211,4 +1211,9 @@ namespace zoneutils
luautils::AfterZoneIn(PChar);
}

bool IsAlwaysOutOfNationControl(REGION_TYPE region)
{
return region >= REGION_TYPE::SANDORIA && region <= REGION_TYPE::LIMBUS;
}

}; // namespace zoneutils
5 changes: 3 additions & 2 deletions src/map/utils/zoneutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ namespace zoneutils
CCharEntity* GetChar(uint32 id); // returns pointer to character by id
CCharEntity* GetCharToUpdate(uint32 primary, uint32 ternary); // returns pointer to preferred char to update for party changes
void ForEachZone(const std::function<void(CZone*)>& func);
uint64 GetZoneIPP(uint16 zoneid); // returns IPP for zone ID
bool IsResidentialArea(CCharEntity*); // returns whether or not the area is a residential zone
uint64 GetZoneIPP(uint16 zoneid); // returns IPP for zone ID
bool IsResidentialArea(CCharEntity*); // returns whether or not the area is a residential zone
bool IsAlwaysOutOfNationControl(REGION_TYPE region); // returns true if a region should never trigger "in areas outside own nation's control" latent effect; false otherwise.

void AfterZoneIn(CBaseEntity* PEntity); // triggers after a player has finished zoning in

Expand Down

0 comments on commit 47ef443

Please sign in to comment.