Skip to content

Implementation of Era Dynamis **READ CAREFULLY**#31

Draft
Frankie-hz wants to merge 22 commits intophoenixffxi:betafrom
Frankie-hz:eradyna
Draft

Implementation of Era Dynamis **READ CAREFULLY**#31
Frankie-hz wants to merge 22 commits intophoenixffxi:betafrom
Frankie-hz:eradyna

Conversation

@Frankie-hz
Copy link
Copy Markdown

@Frankie-hz Frankie-hz commented Feb 8, 2026

I affirm:

  • I understand that if I do not agree to the following points by completing the checkboxes my PR will be ignored.
  • I understand I should leave resolving conversations to the LandSandBoat team so that reviewers won't miss what was said.
  • I have read and understood the Contributing Guide and the Code of Conduct.
  • I have tested my code and the things my code has changed since the last commit in the PR and will test after any later commits.

What does this pull request do?

Implementation of Era Dynamis as a full ID based system.

Zone TODOs:

  • Dynamis-San_dOria
  • Dynamis-Bastok
  • Dynamis-Windurst
  • Dynamis-Jeuno
  • Dynamis-Beaucedine
  • Dynamis-Xarcabard
  • Dynamis-Valkurm
  • Dynamis-Buburimu
  • Dynamis-Qufim
  • Dynamis-Tavnazia

Mobskills:

  • Dynamis-San_dOria
  • Dynamis-Bastok
  • Dynamis-Windurst
  • Dynamis-Jeuno
  • Dynamis-Beaucedine (In progress)
  • Dynamis-Xarcabard
  • Dynamis-Valkurm
  • Dynamis-Buburimu
  • Dynamis-Qufim
  • Dynamis-Tavnazia

Zone Boss Mechanics:

  • Dynamis-San_dOria
  • Dynamis-Bastok
  • Dynamis-Windurst
  • Dynamis-Jeuno
  • Dynamis-Beaucedine (In progress)
  • Dynamis-Xarcabard
  • Dynamis-Valkurm
  • Dynamis-Buburimu
  • Dynamis-Qufim
  • Dynamis-Tavnazia

@Frankie-hz Frankie-hz added the hold Do not merge this PR label Feb 8, 2026
@phoenixffxi phoenixffxi deleted a comment from github-actions bot Feb 8, 2026
@Frankie-hz Frankie-hz force-pushed the eradyna branch 8 times, most recently from 18e2cd4 to cbc294c Compare February 11, 2026 02:49
@Frankie-hz Frankie-hz force-pushed the eradyna branch 2 times, most recently from 4edb0a5 to 66fbd3f Compare March 3, 2026 03:36
@Frankie-hz Frankie-hz removed the hold Do not merge this PR label Mar 8, 2026
@Frankie-hz Frankie-hz force-pushed the eradyna branch 10 times, most recently from 068c550 to 223b9db Compare March 9, 2026 22:47
@Frankie-hz Frankie-hz force-pushed the eradyna branch 7 times, most recently from d4886e5 to 2b7f2b6 Compare March 21, 2026 03:04
@Frankie-hz Frankie-hz force-pushed the eradyna branch 4 times, most recently from 765d63f to 14fc932 Compare April 1, 2026 22:42
Copy link
Copy Markdown
Member

@CriticalXI CriticalXI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First review session, more to come! Generally seeing a lot of debug prints throughout the files still that could be cleaned up, and a lot of commented out chunks of code unless you plan to come back to those soon.

}
}

-- local currencyHaggle =
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Large section commented out here, is this still needed? Could use a comment explaining if this needs to stay here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Havent gotten to the currency portion of this yet. It might not even be needed. Its from my old code for the time being. I'll add a TODO


m:addOverride(mobPath .. '.onMobEngage', function(mob, target)
xi.dynamis.mobOnEngage(mob, target) -- This is for spawning statues on boss aggro
xi.dynamis.onBossEngage(mob, target) -- TODO: for qufim maybe
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What exactly is the TODO for qufim here?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The main boss does certain things, certain resistances based on whats killed in the zone. The only way to update those would be on engage since the mob is up when the instance starts

-- 5sec less than 10min to prevent zone idle before cleanup fires
zone:setLocalVar(varNoPlayerTimer, currentTime + 595)
-- Sync with zone expiration to handle valid hourglass edge cases
SetServerVariable(varExpiration, currentTime + 595)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is this varExpiration reset back to the normal value if someone comes backs into the zone? The logic seems like the varNoPlayerTimer var would never get cleared because it's changing the varExpiration here.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain what you mean by reset to the normal value?

The varExpiration is the server var that updates the hourglasses for everyone. Once there are no members left in dynamis the hourlgasses are then set to have a 10 minute timer. If they happen to go back into the zone -> kill a TE then the time will update accordingly.

Once there is 10 minutes left this block of code wont ever be hit again.

Comment on lines +305 to +306
local zoneTimeRemaining = xi.dynamis.getDynaTimeRemaining(zoneExpiration)
local newZoneExpiration = zoneExpiration + (60 * minutes) -- Add more time to increase previous expiration point.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think newZoneExpiration should be passed to getDynaTimeRemaining for the correct time to check for the warnings below. The new time might push it past a threshold and it's still checking the old time.

end

-- Cleanup Done
xi.dynamis.cleanupDynamis = function(zone)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm seeing some things regarding Dynamis aren't cleaned up properly in this function.

  1. I don't see player char vars being wiped from players when the zone is cleaned up while they're still in the zone.
    local playersInZone = zone:getPlayers()
    for _, player in pairs(playersInZone) do
        xi.dynamis.resetPlayerVars(player, zoneId)
    end
  1. Entries in dynamis_participants, and dynamis_instances SQL tables aren't being cleaned up from what I can find.


-- Always register first
-- luacheck: ignore 113
local instanceID = RegisterDynamisInstance(zoneId, player:getID())
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this matter that you're passing the outside zone ID here vs the dynamis zone?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants