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

[core] Fix conquest logs / latent effects not applying when zoning into non conquest areas #4624

Merged
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
xkoredev marked this conversation as resolved.
Show resolved Hide resolved
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 @@ -1212,4 +1212,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 @@ -57,8 +57,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
Loading