Compare commits

..

1161 commits

Author SHA1 Message Date
Xaver
c2e2466fb7
Merge pull request #10915 from WinterSolstice8/petskill_stun_sleep_etc
Some checks failed
Builds / Clang Tidy (push) Has been cancelled
Builds / Build-2 (push) Has been cancelled
Builds / Build-3 (push) Has been cancelled
Builds / Cache Build (push) Has been cancelled
Builds / Cache Build-1 (push) Has been cancelled
Builds / Cache Build-2 (push) Has been cancelled
Builds / Build (push) Has been cancelled
Builds / Build-1 (push) Has been cancelled
[core] Interrupt petskills with sleep/stun/etc during completion
2026-07-27 02:01:37 +02:00
Xaver
d3998777c7
Merge pull request #10906 from Xaver-DaRed/enfeebling
[Combat] Make magic hit rate global function use a table of parameters
2026-07-27 01:54:05 +02:00
Xaver
8fdab6037a
Merge pull request #10910 from ThrisStraizo/lizardblizzard
[lua] [sql] Additional TP move adjustments
2026-07-27 01:33:00 +02:00
WinterSolstice8
ea6b9e66e3 [core] Interrupt petskills with sleep/stun/etc during completion 2026-07-26 17:08:30 -06:00
Xaver
44cbcdb751
Merge pull request #10913 from sruon/candy_shop
[lua] Gate shop items to Astral Candescence availability
2026-07-27 00:01:20 +02:00
sruon
115ec6340e Gate shop items to Astral Candescence availability 2026-07-26 15:19:56 -06:00
ThrisStraizo
f3c6939e52 Additiona TP move adjustments
This PR adjusts the ready/animation lockout time of Lizards, Crabs, Bunnies, and Monke.
2026-07-26 12:57:36 -07:00
Xaver-DaRed
39135f9532 Make magic hit rate global function use a table of parameters 2026-07-26 19:56:58 +02:00
sruon
bd929bdd40
[core] Resolve AI targets through EntityId to fix UAF (#10908)
* Feed EntityId through ChangeTarget controller/state

* Deprecate CState constructor with raw targid

* Remove redundant m_targid from CState

* Remove cached m_PTarget from CState

* Replace CState uint16 target API with EntityId

* Store mob controller targets as EntityId

* Store charmer as EntityId in charm controller

* Remove dead m_LastTopEnmity from trust controller

* Replace state GetTarget with a single EntityId target() accessor
2026-07-26 19:01:11 +02:00
Xaver
ce20393ab9
Merge pull request #10855 from 9001-Solutions/9001/elegy-potency-bug
[lua] Fix elegy potency bug
2026-07-26 13:31:39 +02:00
Xaver
8a350e69c0
Merge pull request #10897 from KiplingFFXI/Various-PH-Fixes
[lua] Various PH Fixes
2026-07-26 13:30:49 +02:00
Zach Toogood
b9cb1ab4f1
Merge pull request #10905 from sruon/states_entityid_t
[core] Construct AI states with EntityId
2026-07-26 08:17:02 +01:00
Xaver
57fcbfbcf9
Merge pull request #10907 from UmeboshiXI/mobskill_fixes
[lua] 2k, 4k, 10k Needles Mobskill Param Adjustment
2026-07-26 06:08:08 +02:00
Xaver
2c03e0bd7b
Merge pull request #10901 from CriticalXI/module_errors
[lua][module] Correct module startup errors
2026-07-26 05:37:35 +02:00
Xaver
424c45b179
Merge pull request #10902 from KiplingFFXI/Goblin-Wolfman-Resistances
[lua] Implement Goblin Wolfman resistances
2026-07-26 05:36:33 +02:00
Umeboshi
c1b81f9221 [lua] 2k, 4k, 10k Needles Mobskill Param Adjustment 2026-07-25 20:35:05 -07:00
Xaver
77d3b3c519
Merge pull request #10904 from WinterSolstice8/drain_weapons
[lua] [sql] implement Deae Gratia, Vampiric Claws, crafted drain weapons. Tweak linear add effect rate formula
2026-07-26 05:00:56 +02:00
sruon
31942963ad Remove SetTarget uint16 shim 2026-07-25 20:35:35 -06:00
sruon
24a49d2443 Feed EntityId through Engage controller/state 2026-07-25 19:58:57 -06:00
sruon
d8fa900a5b Tidy AIContainer codestyle 2026-07-25 19:58:57 -06:00
sruon
19ce7b6f7e Construct TriggerState with EntityId 2026-07-25 19:58:57 -06:00
sruon
16b2679e82 Construct MobSkillState with EntityId 2026-07-25 19:58:57 -06:00
sruon
385a46d671 Construct ItemState with EntityId 2026-07-25 19:58:57 -06:00
sruon
35b353d642 Construct RangeState and MagicState with EntityId 2026-07-25 19:58:56 -06:00
sruon
c6e17543e4 Construct PetSkillState with EntityId 2026-07-25 19:58:56 -06:00
sruon
0eae29dcfa Construct WeaponSkillState with EntityId 2026-07-25 19:58:56 -06:00
sruon
987b397bf3 Construct light states with EntityId 2026-07-25 19:58:56 -06:00
sruon
e10af5a73e Construct AbilityState with EntityId 2026-07-25 19:58:56 -06:00
sruon
8ed324c9d1 Allow construction of states with EntityId 2026-07-25 19:58:56 -06:00
sruon
3eaf824499 Make m_targid private in states 2026-07-25 19:58:56 -06:00
WinterSolstice8
9c1a4b710b
Merge pull request #10898 from sruon/controllers_entityid
[core] Feed EntityId through the controllers
2026-07-25 19:22:52 -06:00
WinterSolstice8
77f233bad1 [lua] dStat linear formula: Subtract out the floor for per stat rate 2026-07-25 19:11:20 -06:00
WinterSolstice8
ed6d43eb50 [lua] [sql] Implement Vampiric Claws/Deae Gratia, crafted drain weapons 2026-07-25 19:09:47 -06:00
Kipling
34e7331aa9 Goblin Wolfman resistances 2026-07-25 16:00:28 -07:00
Critical
cca7d1c2c8 [lua][module] Correct module startup errors 2026-07-25 15:54:06 -06:00
Xaver
2949f26b97
Merge pull request #10596 from sruon/qm_timers
[lua] Remove duplicate QM logic from Zilart Kings QMs
2026-07-25 21:00:31 +02:00
sruon
6e46195a42 Feed EntityId through the controllers 2026-07-25 11:55:46 -06:00
9001-Sols
1692f07bf0 [lua] Fix elegy potency bug 2026-07-25 11:48:48 -04:00
Kipling
55125a2fea NM placeholder fixes and cleanup
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-25 16:47:17 +02:00
Xaver
b4b833512e
Merge pull request #10895 from sruon/ratelimit_config
[core] Load packet rate limits from config
2026-07-25 15:32:41 +02:00
sruon
9efb5449b4 Remove duplicate QM logic in Zilart King scripts 2026-07-25 00:58:59 -06:00
sruon
053b1f700a Load rate limits from config 2026-07-25 00:06:57 -06:00
Xaver
dd5d6c4e42
Merge pull request #10891 from sruon/entityid_t_mig
[core] Rename EntityId, feed to Controller methods
2026-07-25 07:44:39 +02:00
Xaver
59473eff67
Merge pull request #10894 from ThrisStraizo/wyverntpmoveready
[sql] [lua] Adjust several mob TP abilities
2026-07-25 07:38:26 +02:00
sruon
480efca09a Feed EntityId to Controller::WeaponSkill 2026-07-24 18:52:39 -06:00
sruon
bfcbafe3f4 Feed EntityId to Controller::Ability 2026-07-24 18:40:05 -06:00
ThrisStraizo
ad331314a4 Adjust several mob TP abilities
This PR adjusts the TP abilities of Scorpions, Wyverns, Skeletons, Ghosts, and Pugils to reflect their actual ready times.
2026-07-24 17:22:06 -07:00
Xaver
998cf9de9f
Merge pull request #10893 from WinterSolstice8/auto_refresh_setpoints
[sql] Fix BLU Auto Refresh trait value
2026-07-25 01:38:56 +02:00
Xaver
9bf2014a4d
Merge pull request #10668 from Xaver-DaRed/final-damage
[Cleanup] Stoneskin handling and usage
2026-07-25 01:38:17 +02:00
WinterSolstice8
8cacc78ed1 [sql] Fix BLU Auto Refresh trait value 2026-07-24 17:11:39 -06:00
Xaver-DaRed
f9f3d2bbd3 Remove legacy Stoneskin power tracking method
AKA: Remove stupid "stonekin" modifier
2026-07-25 00:24:55 +02:00
Xaver
a5937baa37
Merge pull request #10854 from 9001-Solutions/9001/synth-support-material-loss-bug
[lua] Fix Synthesis Support subPower
2026-07-24 23:58:45 +02:00
Xaver
a3cf278b40
Merge pull request #10889 from PocketDev89/fix-eight-of-cups-mute
[lua] Add Mute additional effect to Eight of Cups
2026-07-24 23:55:21 +02:00
Mobpsycho
9dc71d24b5 [lua] Add Mute additional effect to Eight of Cups
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-24 22:46:01 +02:00
Xaver
ee8d05894f
Merge pull request #10835 from PocketDev89/era-missionary-man-jp-midnight
[Module] Restore era JP midnight wait on Missionary Man
2026-07-24 21:48:50 +02:00
Xaver
38bb162a29
Merge pull request #10876 from Nobutadas/conquest-rank-ties
[C++][lua] Conquest: Set rank of ties for first to lower value
2026-07-24 21:45:06 +02:00
sruon
6c5ec5e6b7 Rename EntityID_t to EntityId 2026-07-24 13:05:10 -06:00
sruon
14ea61834d Feed EntityID_t to Controller::RangedAttack 2026-07-24 12:55:45 -06:00
Xaver
998cdc5985
Merge pull request #10832 from Nobutadas/quest-to-cure-a-cough
[sql][lua] Stop event Raminel from receiving onSpawn
2026-07-24 20:37:43 +02:00
Xaver
77ef5b408b
Merge pull request #10890 from sruon/yaml_jobtype_enum
[core, lua, yaml] Port Job to YAML based enum
2026-07-24 20:36:58 +02:00
Xaver-DaRed
67aba7c85a Cleanup stoneskin handling and usage 2026-07-24 20:35:54 +02:00
sruon
10ad3c8e77 Feed EntityID_t to FaceTarget 2026-07-24 12:27:06 -06:00
Xaver
6574d899ca
Merge pull request #10883 from Skold177/Update-Character-Sheet-with-Skill-Latents
[C++] Refresh character skills when activating a +skill latent effect
2026-07-24 20:08:28 +02:00
sruon
1238aa094b Feed EntityID_t to Controller::Cast 2026-07-24 12:04:51 -06:00
Skold
47453e4675 Handle +Skill Latent Effects
Ensures they are applied/updated when activated
2026-07-24 10:57:36 -06:00
sruon
7c1dd81f30 Port Job to YAML based enum 2026-07-24 10:44:10 -06:00
Xaver
7978595f6c
Merge pull request #10888 from Nobutadas/quest-say-it-with-flowers
[lua] Quest Say It With Flowers: Add title reward
2026-07-24 18:11:42 +02:00
Nobutadas
1261f5feaf [lua] Quest Say It With Flowers: Add title reward 2026-07-24 10:43:31 -05:00
Xaver
0db6d4e83d
Merge pull request #10886 from KiplingFFXI/Sandy-9-1-and-9-2-Audits
[lua] [sql] Sandy 9-1 and 9-2 audits
2026-07-24 16:49:23 +02:00
Kipling
28440aee7e Sandy 9-1 and 9-2 audits
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-24 16:15:42 +02:00
Xaver
0eb7c999a2
Merge pull request #10842 from Skold177/LoadPet-fix
[C++] Update LoadPet with frame check
2026-07-24 14:15:44 +02:00
Xaver
b83e640898
Merge pull request #10761 from WinterSolstice8/adjust_content_tag_npcs
[core] Spawn, but hide content tagged NPCs
2026-07-24 14:13:54 +02:00
Xaver
c3081c830f
Merge pull request #10859 from Hatberg/mamook-aggro-link-audit
[sql] Mamook aggro/link audit
2026-07-24 14:11:33 +02:00
Xaver
9772851cc6
Merge pull request #10867 from sruon/yaml_mod_enum
[core, lua, yaml] Port Mod to YAML based enum
2026-07-24 14:10:43 +02:00
Xaver
a07c2ef99a
Merge pull request #10878 from Skold177/Update-RSE-to-unhidden
[lua] Clean Up / Fix RSE Sachet NM Code
2026-07-24 14:09:37 +02:00
Xaver
5ded01107a
Merge pull request #10879 from Nobutadas/Mokop-Sankop-Fix
[sql] Fix Mokop-Sankop animation in Windurst
2026-07-24 14:07:22 +02:00
Xaver
732a026217
Merge pull request #10882 from sruon/fix_battle2_clipper_flake
[test] Tweak flaky tests; reset weather between tests
2026-07-24 14:03:34 +02:00
Xaver
ec5a3cae9a
Merge pull request #10884 from darco313/fix/explorers-footsteps-shadowreign
[lua] Add Shadowreign support to An Explorer's Footsteps
2026-07-24 14:02:44 +02:00
Xaver
85f9a58ee8
Merge pull request #10887 from sruon/more_entityid_t
[core] Tidy controllers code style
2026-07-24 13:56:33 +02:00
sruon
e2b53585dd Port Mod to YAML based enum 2026-07-24 01:45:45 -06:00
sruon
d868a41b7b Tidy controllers style/const 2026-07-24 01:37:19 -06:00
Xaver
c88b4338a5
Merge pull request #10885 from sruon/yamlfmt
[tools] Custom YAML formatter
2026-07-24 09:24:31 +02:00
sruon
a2fb602f76 Use custom formatter for YAML files 2026-07-24 00:37:00 -06:00
sruon
2af32e9865 Reformat all YAML files with consistent style 2026-07-24 00:12:05 -06:00
sruon
847657cbbf Enforce LF for YAML 2026-07-24 00:10:57 -06:00
darco313
4485b10936 [lua] Add Shadowreign support to An Explorer's Footsteps
Stone Monuments existed only in present-day zones. In the Wings of the
Goddess past ("[S]") zones they were targetable but inert: trading
Selbina Clay gave no Clay Tablet and examining them showed no
inscription. Fixes #10817.

Retail behavior (ffxiclopedia / bg-wiki, cross-checked against the
monument coordinates in npc_list.sql):

- 8 [S] zones hold the same monument as a present-day slot; Abelard
  credits their tablets identically. Each is mapped to its twin's slot
  index and gil in monumentTable and given the trade handler.
- The 3 [S]-only zones (Vunkerl Inlet, Grauberg, Fort Karugo-Narugo)
  are not part of the quest and are left inert. Sources disagree on
  whether clay yields a useless tablet there (bg-wiki) or nothing
  (ffxiclopedia); kept the conservative "nothing", matching current
  behavior.
- Examining any monument reads its inscription (event 900); wired in
  DefaultActions for all 11 [S] zones. Verified in-game that event 900
  renders in Batallia Downs [S] and the three past-only zones.

Adds an xi_test suite covering present-day credit, [S] credit, the
no-double-credit rule, the inert orphan, and the inscription trigger.
2026-07-23 23:46:31 -04:00
sruon
d018fd3594 [test] Fix flaky effect flag and soultrapper tests, reset weather 2026-07-23 18:33:11 -06:00
sruon
29492c00c7 [test] Fix flaky battle2 Clipper and gardening mog safe tests 2026-07-23 18:18:58 -06:00
Skold177
bf4953b6ee Clean Up / Fix RSE Sachet NM Code
Cleans up the RSE Sachet NM Code - uses simplified logic for turning QMs on / off
2026-07-23 20:17:40 -04:00
Nobutadas
d892d5eeaa [sql] Fix Mokop-Sankop animation in Windurst 2026-07-23 16:25:45 -05:00
Xaver
777de3fa6c
Merge pull request #10877 from sruon/xi_test_retry
[test] Support retrying individual tests on failure
2026-07-23 22:23:41 +02:00
sruon
46d84c32e3 Support retrying individual tests on failure 2026-07-23 13:27:09 -06:00
Xaver
d926936635
Merge pull request #10875 from Skold177/Promyvion-Entry-Requirements
[lua] Promyvion Entry Requirements Bugfix
2026-07-23 21:26:28 +02:00
Xaver
e156a05bf4
Merge pull request #10868 from Auzali/add-ROTZ-tags-601-650
[sql] Audit some synthesis content tags (601-650)
2026-07-23 21:25:46 +02:00
Xaver
b8f8075723
Merge pull request #10874 from Nobutadas/ef-nm-buffs
[sql] EF - NM flags plus delay and skill list fixes
2026-07-23 21:24:11 +02:00
Nobutadas
46c8fca5f7 [C++][lua] Conquest: Set rank of ties for first to lower value 2026-07-23 14:12:12 -05:00
Skold177
7abc276d22 Promyvion Fight Requirements
Fixes an edge case where you couldn't help with Promyvion fights if you were on the mission, but had beaten that specific battlefield.
2026-07-23 13:49:00 -04:00
Nobutadas
e0742659d6 [sql] EF - NM flags plus delay and skill list fixes 2026-07-23 12:21:21 -05:00
Xaver
b78832d611
Merge pull request #10866 from cocosolos/alpine-ninja
[docker,alpine] Use ninja-build instead of samurai
2026-07-23 18:53:40 +02:00
Xaver
d7455f460e
Merge pull request #10873 from Skold177/Shadow-Lord-Bug-Fixes
[lua] [sql] Shadow Lord Bug Fixes
2026-07-23 18:52:32 +02:00
Xaver
681c5387a1
Merge pull request #10871 from sruon/entityidt
[core] Validate targets by identity instead of targid / tidy AI states
2026-07-23 18:50:32 +02:00
Xaver
657512d90c
Merge pull request #10872 from sruon/traits-filtering
[core, lua] Start filtering certain traits on monsters
2026-07-23 18:48:10 +02:00
Skold177
7b7a990bc2 Shadow Lord Bug Fixes
Fixes issues with TP move usage, mana cost. Improves performance by caching time variables.
2026-07-23 11:41:01 -04:00
sruon
7dc84274e4 Filter certain traits on monsters 2026-07-23 00:18:37 -06:00
sruon
b6376ecba8 Add EntityID_t overloads for target validation 2026-07-22 22:27:44 -06:00
sruon
f02198e629 CMobEntity::getMobMod const 2026-07-22 21:55:12 -06:00
sruon
c01bd24694 lastAttackerId converted to EntityID_t 2026-07-22 21:54:57 -06:00
sruon
4640ec544c Clean up state files const/style 2026-07-22 21:49:53 -06:00
taylorleary
a22230633f [sql] Audit some synthesis content tags (601-650) 2026-07-22 22:56:22 -04:00
Corey Sotiropoulos
13f4387512
[docker,alpine] Use ninja-build instead of samurai 2026-07-22 22:18:46 -04:00
Xaver
e1b5bea15c
Merge pull request #10864 from sruon/clamming
[lua] Clamming loot tables; Increase Alraune chance
2026-07-23 03:06:52 +02:00
sruon
c71acba110 Add real clamming loot tables 2026-07-22 18:28:33 -06:00
Xaver
f930f93b6d
Merge pull request #10784 from Nobutadas/weapon-break-mixin
[C++, sql, lua] Update general mob break mixins
2026-07-23 02:23:36 +02:00
Nobutadas
cd345bb401 [sql][lua] Rename event Raminel to avoid onSpawn 2026-07-23 02:13:48 +02:00
Xaver
6621e08306
Merge pull request #10863 from Frankie-hz/linkshellfix
[cpp] Fixes broken linkshell query causing errors when wearing a broken linkshell while logged out
2026-07-23 01:49:36 +02:00
Xaver
8b84193c34
Merge pull request #10830 from Nobutadas/blade-of-darkness
[lua] Restrict kill types for Chaosbringer
2026-07-23 01:37:06 +02:00
Xaver
ee4c49dcaf
Merge pull request #10857 from Hatberg/bowho-aggro
[sql] Bo'Who Warmonger aggro behaviour
2026-07-22 23:53:55 +02:00
Xaver
ead0327334
Merge pull request #10862 from sruon/attack_delay_fix
[core] Fix attack timer skipping the tick it swings on
2026-07-22 23:41:46 +02:00
Frank
d94defb80f [cpp] Fixes broken linkshell query 2026-07-22 16:53:55 -04:00
Xaver
6a4f883c75
Merge pull request #10861 from WinterSolstice8/misc_fixes
[lua] Add in minimum value to linear add effect function
2026-07-22 22:32:17 +02:00
sruon
1e11440a8c Fix attack timer skipping the tick it swings on 2026-07-22 14:26:39 -06:00
WinterSolstice8
c740923f20 [lua] Add in the minimum value to the linear add effect rate calc 2026-07-22 14:03:12 -06:00
Xaver
a21732e68c
Merge pull request #10858 from Xaver-DaRed/drb
[Magic] Fix instrument check
2026-07-22 21:55:19 +02:00
Skold177
06912e4f7d Update LoadPet with frame check
Ensures a stored automaton frame never has a stale PetID
2026-07-22 13:55:43 -04:00
Hatberg
0624f1dc53 [sql] Mamook aggro/link audit 2026-07-22 19:51:00 +02:00
Xaver-DaRed
f3a119d497 Magic: fix instrument check 2026-07-22 18:25:45 +02:00
Hatberg
fade5f22b8 [sql] BhoWho Warmonger add aggro 2026-07-22 17:27:34 +02:00
Xaver
6e5b3f5de7
Merge pull request #10851 from UmeboshiXI/mobmod_commands_pets
[lua] Allow Mobmod Commands To Be Used On Pets
2026-07-22 15:57:02 +02:00
WinterSolstice8
5e1f6d99ba
Merge pull request #10856 from Xaver-DaRed/trades2
[Audit] Bastok quest trades
2026-07-22 07:56:21 -06:00
Umeboshi
1c87b55496 [lua] Allow Mobmod Commands To Be Used On Pets 2026-07-22 04:35:25 -07:00
Xaver
2414935811
Merge pull request #10852 from sruon/yaml_mobmod_enum
[core, lua, yaml] Migrate ANIMATIONTYPE / MOBMOD to YAML based enum
2026-07-22 11:48:08 +02:00
sruon
43ceff0c43 Port MobMod to YAML based enum 2026-07-22 10:18:49 +02:00
sruon
555a4d283a Port Animation to YAML based enum 2026-07-22 10:18:49 +02:00
Xaver-DaRed
3af1f2bbb8 Audit Bastok quest trades 2026-07-22 09:45:27 +02:00
Xaver
4b45d57265
Merge pull request #10821 from sruon/ptarget
[core] Improve EntityID_t; Resolve UAF with captured pointers in lua bindings
2026-07-22 08:25:43 +02:00
9001-Sols
87d15607e8 [lua] Fix Synthesis Support subPower 2026-07-22 02:24:55 -04:00
Xaver
328378a925
Merge pull request #10845 from Hatberg/assorted-link-aggro-fixes
[sql] Assorted Bat, Worm, Diatryma Link / Aggro fixes
2026-07-22 08:15:04 +02:00
Xaver
547e0d10f4
Merge pull request #10850 from KiplingFFXI/citipati-and-xolotl-fixes-again
[lua, sql] Citipati and Xolotl despawn fixes
2026-07-22 07:24:41 +02:00
Xaver
fd504670f0
Merge pull request #10847 from Skold177/Ranged-Attack-State-Times-/-Setting
[C++] Adjust Ranged Attack State Delays
2026-07-22 07:21:29 +02:00
Xaver
510eb82ee2
Merge pull request #10846 from Nobutadas/zone-transition-bug
[C++]  Remove NavMesh snap on zone transition
2026-07-22 07:19:19 +02:00
Xaver
2cbbc9ed41
Merge pull request #10849 from sruon/death_zone
[core] Warp players as corpses if dieing during warp
2026-07-22 07:18:32 +02:00
Xaver
fc647ebd32
Merge pull request #10848 from WinterSolstice8/dainslaif_bloodsword
[lua] [sql] Implement Dainslaif's dINT proc rate scaling, implement bloodsword
2026-07-22 07:17:20 +02:00
Nobutadas
fbf353f549 [lua][sql] Update break on mobs 2026-07-21 23:07:55 -05:00
sruon
2624e7e39b Fix UAF with captured pointers in several bindings 2026-07-21 21:52:06 -06:00
sruon
269f55a403 BattleEntity stores EntityID_t instead of targid 2026-07-21 21:52:03 -06:00
sruon
ab25cd14bc Skip teleport if dead 2026-07-21 21:03:22 -06:00
sruon
7c5abe3063 Don't auto-HP warping dead players 2026-07-21 20:00:29 -06:00
Kipling
1efa97c7a0 Citipati and Xol Fixes 2026-07-21 18:49:30 -07:00
Skold
c3ea6ded20 Adjust Ranged Attack State Delays
Adjusts Ranged Attack State Delays to current Retail Values
2026-07-21 21:37:49 -04:00
WinterSolstice8
b96d447f73 [lua] [sql] Implement Bloodsword add effect 2026-07-21 19:18:59 -06:00
WinterSolstice8
34e85e3cd8 [lua] Give Dainslaif it's proper dINT rate scaling 2026-07-21 19:18:59 -06:00
WinterSolstice8
5c37dae39b [lua] Add linear scaling function for add effect dStat 2026-07-21 19:18:59 -06:00
Nobutadas
5c5a068c8e [C++] Remove NavMesh snap on zone transition 2026-07-21 19:54:27 -05:00
WinterSolstice8
440577b7bb
Merge pull request #10841 from Xaver-DaRed/cerb2
[Fix] Ensure Cerberus isnt moving before executing "Roar" and mobskill logic
2026-07-21 16:07:45 -06:00
Zach Toogood
358d1c084b
Merge pull request #10813 from LandSandBoat/feature/cpptrace-tombstones
Core: Rewrite crash tombstone generation
2026-07-21 21:40:34 +01:00
Hatberg
6b5fffdcdc [sql] Assorted Link / Aggro fixes 2026-07-21 22:13:14 +02:00
Xaver
29e26b9ee9
Merge pull request #10843 from Hatberg/ghatsad-levelrequired
[lua] Ghatsad frame/head level requirement fix
2026-07-21 21:37:07 +02:00
Zach Toogood
81a40e08bf CI: Add PkgConfig to docker 2026-07-21 19:47:16 +01:00
Xaver
5b109d8dda
Merge pull request #10839 from UmeboshiXI/Bat_Detection_Fixes
[sql] Bat/Funguar Aggro/Link Behavior Adjustments
2026-07-21 20:23:19 +02:00
Hatberg
a7c5bb7bd9 [lua] Ghatsad frame/head level requirement fix 2026-07-21 20:18:14 +02:00
Zach Toogood
5ed8e5c3a6 Core: Don't use ptrace to detect debugger
It is destructive: it succeeds when nothing is attached, leaving us traced by our own parent (usually the shell),
and the tracee cannot undo that with PTRACE_DETACH. A later fatal signal then stops the process forever,
waiting on a "tracer" that will never continue it.
2026-07-21 19:11:38 +01:00
Xaver-DaRed
e4849671ea Ensure Cerberus isnt moving before executing "Roar" and mobskill logic 2026-07-21 16:27:18 +02:00
Xaver
242ab0d055
Merge pull request #10840 from Nobutadas/shrine-of-ruavitau-teleporters
[lua] Fix Shrine of RuAvitau teleporters
2026-07-21 16:09:32 +02:00
Xaver
9051fe1188
Implement Cerberus Mechanics (#10829)
Co-authored-by: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-21 15:53:44 +02:00
Nobutadas
a89516e32d [lua] Fix Shrine of RuAvitau teleporters 2026-07-21 15:39:22 +02:00
ThrisStraizo
89a9e108fb Implement Cerberus Mechanics
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-21 15:04:54 +02:00
Umeboshi
524b18daa4 [sql] Bat/Funguar Aggro/Link Behavior Adjustments 2026-07-21 06:02:24 -07:00
sruon
d2164ed20c
[lua] Clamming fixes; Remove KI on zone-out; Increase point cooldown (#10837)
* Remove clamming kit when zoning out of Bibiki

* Revert clamming variables to charvar to properly handle disconnects

* Clamming cooldown bumped to 16s but per point
2026-07-21 13:20:53 +02:00
Xaver
769db07f4e
Merge pull request #10836 from sruon/equipset_reset_tp
[core] Only reset TP on legitimate swaps
2026-07-21 13:16:18 +02:00
Xaver
4b8b2f55bd
Merge pull request #10834 from UmeboshiXI/mob_rangedattack_interrupt_fix
[lua] Remove Hit Interrupt For Ranged Mobskills
2026-07-21 13:12:49 +02:00
sruon
de12fa1a7f Only reset TP on legitimate swaps 2026-07-21 01:39:31 -06:00
Mobpsycho
bfe36cbc2e Add trailing newline 2026-07-21 02:47:18 -04:00
Umeboshi
b09c3f4b5f [lua] Remove Hit Interrupt For Ranged Mobskills 2026-07-20 23:34:09 -07:00
Mobpsycho
e62d5a1479 Restore era JP midnight wait on Missionary Man 2026-07-21 02:27:45 -04:00
Xaver
9a7858cbfc
Merge pull request #10828 from Nobutadas/quest-rock-bottom
[lua] Correct Rock Bottom trade requirements
2026-07-21 08:02:06 +02:00
Xaver
cd552bcf55
Merge pull request #10827 from Skold177/Icarus-Wing-Store-TP
[lua] Give Icarus Wing Store TP scaling
2026-07-21 07:34:04 +02:00
Xaver
8c24c9b552
Merge pull request #10831 from sruon/signet_food
[core, lua] Restrict Sanction/Sigil food bonus to relevant regions
2026-07-21 07:33:16 +02:00
Xaver
77c95523cb
Merge pull request #10833 from sruon/item_prices
[lua, sql] Cotton Tofu NPC price; Flask of Vitriol typo
2026-07-21 07:30:52 +02:00
Nobutadas
6fd2f8a4e6 [lua] Restrict kill types for Chaosbringer 2026-07-20 22:41:43 -05:00
sruon
9328afd31e Cotton Tofu sell price
Co-Authored-By: montijin <2160211+montijin@users.noreply.github.com>
2026-07-20 21:39:36 -06:00
sruon
e81dd98d9b Rename flask of vitriol 2026-07-20 21:39:16 -06:00
sruon
14639e79e2 Restrict Sanction/Sigil food bonus to relevant regions 2026-07-20 20:56:36 -06:00
Nobutadas
b5e626a6ad [lua] Correct Rock Bottom trade requirements 2026-07-20 19:13:44 -05:00
Skold
498009c347 Give Icarus Wing Store TP scaling
Found on the JP Wiki
2026-07-20 19:05:46 -04:00
Zach Toogood
28ff08be9c CI: Add libdwarf dependency 2026-07-20 22:10:36 +01:00
Zach Toogood
0ce919df73 Core: Report CMAKE_BUILD_TYPE on startup 2026-07-20 21:48:34 +01:00
Xaver
7425d858f4
Merge pull request #10825 from Skold177/Update-Bane-to-use-effect-addMod
[lua] Update Bane to use effect:addMod
2026-07-20 21:16:13 +02:00
Xaver
d92651b9d6
Merge pull request #10824 from Hatberg/mom-repeat
[lua] Mom the Adventurer - fix Daughter section zone check
2026-07-20 21:12:33 +02:00
Zach Toogood
ab366144c6 Core: Make core dumps opt-in 2026-07-20 19:52:50 +01:00
Xaver
e7f251342f
Merge pull request #10822 from sruon/job_change_item_cancel
[core] Cancel item use on job change
2026-07-20 20:52:23 +02:00
Xaver
d85b11337a
Merge pull request #10823 from Skold177/Atonement
[lua] Move Atonement Clamp
2026-07-20 20:52:04 +02:00
Skold177
5a799eee71 Update Bane to use effect:addMod
Players no longer get double speed down
2026-07-20 14:45:23 -04:00
Hatberg
bc1124be15 [lua] Mom the Adventurer - fix Daughter repeat, Parnika text 2026-07-20 20:44:04 +02:00
Xaver
33ea9577ed
Merge pull request #10785 from Skold177/Era-Exp-Loss
[lua] [C++] Era experience points loss setting
2026-07-20 19:18:07 +02:00
Skold177
fbe9e8aeb0 Move Atonment Clamp
Moves it before damage adjustments so damage modifiers are calculated properly.
2026-07-20 13:12:12 -04:00
sruon
2e57e05400 Cancel item use on job change 2026-07-20 11:00:36 -06:00
Xaver
2b80efd295
Merge pull request #10815 from KiplingFFXI/Gigas-BST-Fixes
[lua] Gigas BST Fixes
2026-07-20 18:58:58 +02:00
Xaver
3613966fd1
Merge pull request #10819 from ThrisStraizo/resranksplus
[Combat] Add Gravity resistance rank
2026-07-20 18:49:19 +02:00
Kipling
a797a734ae Gigas BST Fixes
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-20 18:28:39 +02:00
ThrisStraizo
4c6d16541a Add Gravity resistance rank
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-20 16:19:27 +02:00
Xaver
942c06c070
Merge pull request #10807 from CriticalXI/casket_tags
[sql] Treasure casket default status adjustment
2026-07-20 14:22:21 +02:00
Xaver
b4e6bdfe41
Merge pull request #10793 from ThrisStraizo/charbywarrior
[sql] Adjust Charybdis' job to Warrior
2026-07-20 14:20:20 +02:00
Xaver
4cd9bba164
Merge pull request #10805 from ThrisStraizo/byakkores
[lua] [sql] Adjust Byakko res and stats
2026-07-20 14:19:55 +02:00
WinterSolstice8
4228a18040
Merge pull request #10814 from Xaver-DaRed/trades
[Chore] Audit all mission uses of `npcUtil.tradeHasExactly()`
2026-07-20 06:17:05 -06:00
Xaver
b80867ff6b
Merge pull request #10820 from Skold177/Fix-Reward-Skill
[lua] Fix Reward Mobskill Case
2026-07-20 11:22:14 +02:00
sruon
3cc2ac4ca0 EntityID_t stores more information for accurate lookups 2026-07-20 02:40:42 -06:00
sruon
984bd8bb6b Stamp all entities with an auto-incrementing ID 2026-07-20 02:40:42 -06:00
sruon
1120c0e30d Allow looking up instances by run ID 2026-07-20 02:40:41 -06:00
sruon
f6e8650d0a Stamp instances with a unique auto-incrementing ID 2026-07-20 02:40:31 -06:00
Zach Toogood
6214f806ab CMake: Use libdwarf for symbols on Linux 2026-07-20 08:33:00 +01:00
Skold
178b4cef5f Fix Reward Mobskill Case
Linux Strikes Again
2026-07-20 00:59:23 -04:00
Xaver-DaRed
998fc80d00 Fix incorrect ToAU mission 11 to 12 wait and timer 2026-07-20 03:35:58 +02:00
Zach Toogood
facb3dcc8d CMake: CMAKE_CXX_SCAN_FOR_MODULES: OFF 2026-07-20 01:37:53 +01:00
Zach Toogood
0bc89e1adf Clang: -Wno-nontrivial-memcall 2026-07-20 01:37:41 +01:00
Zach Toogood
459b4d4622 Debug: Fix const-ness of raw_trace.resolve() 2026-07-20 01:33:10 +01:00
Xaver-DaRed
be85f0cb0e Audit and destroy all mission uses of npcUtil.tradeHasExactly() 2026-07-20 02:15:52 +02:00
Zach Toogood
1615216fe0 Chore: Suppress warnings on XI_STRINGIFY 2026-07-20 01:11:48 +01:00
Zach Toogood
41cfd0bad3 Core: Clean up Win-only defines 2026-07-20 00:37:45 +01:00
Zach Toogood
9c229e0e10 Core: Improve tombstone reports on Mac 2026-07-20 00:37:44 +01:00
Zach Toogood
ddeabc42dc Core: Get other-thread traces in tombstone
If we crash on a worker thread, we should try to collect what the main thread was up to and report that too. If we crash on the main thread, only report that.
2026-07-20 00:37:44 +01:00
Zach Toogood
1a0e12ffb4 Core: Mark hang and crash as NOINLINE 2026-07-20 00:37:44 +01:00
Zach Toogood
2771b87b22 Core: Add debug core dump hints 2026-07-20 00:37:43 +01:00
Zach Toogood
223dfdd52b Core: Add more info to tombstones 2026-07-20 00:37:43 +01:00
Zach Toogood
4d5ce01669 Core: Use cpptrace for tombstone generation 2026-07-20 00:37:43 +01:00
Zach Toogood
6e10cb2202 Chore: Un-vendor Wheaty 2026-07-20 00:37:43 +01:00
Zach Toogood
bd4fd739f9 Chore: Un-vendor wepoll 2026-07-20 00:37:31 +01:00
WinterSolstice8
e187df7456
Merge pull request #10801 from Xaver-DaRed/audit-mission-trades
[Proposal] Introduce `npcUtil.tradeMatches()` and apply usage to some missions
2026-07-19 17:00:44 -06:00
Xaver
180bec2d4c
Merge pull request #10802 from sruon/no_sleep_zones
[core] Tick all zones all the time / Grid scheduling
2026-07-20 00:39:00 +02:00
Xaver
6b86852cbe
Merge pull request #10812 from Skold177/Merry-Map-Markers
[lua] Implement Merry Map Markers
2026-07-20 00:37:25 +02:00
Xaver
a0dd4877e6
Merge pull request #10811 from CriticalXI/mining_delay
[lua] Add forced gathering wait server setting
2026-07-20 00:29:56 +02:00
Skold
55e46cb4a0 Implement Merry Map Markers
Implements Merry Map Markers in Bastok, Windurst, Sandy, Jeuno & Ah Zahbi.
2026-07-19 18:06:46 -04:00
Xaver
599141a24d
Merge pull request #10810 from sruon/pit_doors
[lua] Colosseum gate NPCs default actions
2026-07-19 22:49:28 +02:00
Critical
bfbd36d127 [lua] Add forced gathering wait server setting 2026-07-19 14:46:04 -06:00
Zach Toogood
41e7fa215e
Merge pull request #10803 from LandSandBoat/watchdog_crash_updates
Core: Crash directly in Watchdog instead of throwing
2026-07-19 21:43:40 +01:00
Xaver
cd93db71cd
Merge pull request #10809 from cocosolos/homebrew-update
[ci] Only update homebrew once per workflow run
2026-07-19 22:41:52 +02:00
ThrisStraizo
7a60bf8cab Adjust Byakko res and stats
This PR adjusts Byakko according to my testing and Jimmy's sheet.
2026-07-19 13:33:11 -07:00
Xaver
56d6a38a02
Merge pull request #10808 from Skold177/Default-Mog-Locker-State
[lua] Adjust Default Mog Locker State
2026-07-19 22:29:11 +02:00
sruon
4a24574c54 Colosseum gate NPCs default actions 2026-07-19 14:24:47 -06:00
Skold
be4a712ce7 Adjust Default Mog Locker State
Defaults to Al Zahbi only on unlock.
2026-07-19 15:58:46 -04:00
Corey Sotiropoulos
7bc23f138d
[ci] Only update homebrew once per workflow run
Maybe the cause of the following error:
 Error: Another `brew update` process is already running.
2026-07-19 19:44:03 +00:00
Xaver
4cc07da9d5
Merge pull request #10804 from Skold177/Remove-Skillchain-Resistance-Rank-Reduction
[C++] [lua] Remove Skillchain Resistance Rank Reduction + Add Pre SoA Magic Burst Module
2026-07-19 21:35:00 +02:00
Critical
427fe14b37 [sql] Treasure casket default status adjustment 2026-07-19 13:34:48 -06:00
sruon
eaefcc5700 Grid scheduling 2026-07-19 13:29:49 -06:00
Zach Toogood
11cca488bb Chore: Un-vendor backward-cpp 2026-07-19 20:24:56 +01:00
Zach Toogood
ea60e3dacd CMake: Add cpptrace dep 2026-07-19 20:24:25 +01:00
Zach Toogood
f8331b60b8 CMake: Pass XI_BUILD_TYPE into build 2026-07-19 20:23:00 +01:00
Skold
802822f4cd Remove Skillchain Resistance Rank Reduction
Removes the Resistance Rank reduction skillchains were getting.
2026-07-19 14:49:13 -04:00
Zach Toogood
2fbf2296df Core: Crash directly in Watchdog instead of throwing 2026-07-19 18:40:48 +01:00
Xaver-DaRed
ba0769e253 Introduce npcUtil.tradeMatches() and apply usage to some missions 2026-07-19 19:34:25 +02:00
Skold
47a5ef3d18 Era Experience points setting
Adds a new tier for 4-24 that is 10% experience points loss.
2026-07-19 11:38:46 -04:00
Zach Toogood
27154fd497
Merge pull request #10800 from LandSandBoat/tidy_wotg_nation_quests
Quests: Tidy WOTG nation quests
2026-07-19 14:22:24 +01:00
Zach Toogood
caefc4b3c3 Quests: Add tests for WOTG-SAN-01 and 02 2026-07-19 13:45:09 +01:00
Zach Toogood
092083b041 Quests: Add trade reminders for WOTG-WIN-3 2026-07-19 13:44:46 +01:00
Zach Toogood
9f0ecf54bd Quests: Fix WOTG-WIN-1 reminder text 2026-07-19 13:20:04 +01:00
Xaver
2ff24289a2
Merge pull request #10777 from Xaver-DaRed/laughmore
[Fix] Laughing Bison animation for the sign
2026-07-19 14:13:20 +02:00
Zach Toogood
dc3f4b9cb5 Quests: First pass of WOTG nation quests intro tests 2026-07-19 13:08:16 +01:00
Zach Toogood
f89cd10a2f Quests: Tidy headers of WOTG nation quests 2026-07-19 12:57:09 +01:00
Zach Toogood
0b4532b693 Quests: Quick port of WOTG-WIN-03 to IF 2026-07-19 12:49:26 +01:00
Xaver
4a2f7aef51
Merge pull request #10674 from Xaver-DaRed/kakarul
[mixin] Create a separate mixin for "sleep at night" behavior and apply it
2026-07-19 13:30:42 +02:00
Zach Toogood
006e618d06 Chore: Rename WOTG Nation Quests 2026-07-19 12:27:56 +01:00
Xaver-DaRed
da0bcd135c Fix Laughing Bison animation for the sign 2026-07-19 13:21:28 +02:00
Xaver
169f59a5b2
Merge pull request #10791 from KiplingFFXI/SAM-Unlock-Quest-Audits
[lua, sql] SAM Unlock Quest Audits
2026-07-19 12:54:53 +02:00
Xaver
de90d6c821
Merge pull request #10799 from KiplingFFXI/duessa-despawn-fix
[lua] Duessa Death Fixes
2026-07-19 12:50:01 +02:00
Xaver
78c8936e1b
Merge pull request #10789 from Skold177/Update-checkPetCommand
[lua] Fix checkPetCommand
2026-07-19 12:45:05 +02:00
Xaver
05eda58eb9
Merge pull request #10787 from Skold177/Era-Signet-Duration
[lua] Globalize bestowSignet, add Era module
2026-07-19 12:44:05 +02:00
Xaver
bd0e90b266
Merge pull request #10792 from Skold177/Escape-Zone-Masks
[C++] [lua] Fix 5 Zone Masks, Add 3 Escape Locations, Fix Escape message
2026-07-19 12:43:06 +02:00
Kipling
751ff95f45 SAM unlock Quest and NMs audit
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-19 12:26:58 +02:00
Kipling
e1746ea400 Fix Fradubio (NM) pets despawn on death
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-19 12:17:04 +02:00
Xaver
a2a7ea5ec3
Merge pull request #10798 from KiplingFFXI/NIN-DRG-SAM-Quest-Era-Module
[sql] [module] NIN DRG SAM quest era module
2026-07-19 12:11:36 +02:00
Xaver
126470a768
Merge pull request #10796 from Skold177/Don't-allow-Harvests-into-a-locked-Mog-Safe-2
[C++] Disallow Gardening Harvests into Locked Mog Safe 2
2026-07-19 11:56:47 +02:00
Xaver
04bb7255b0
Merge pull request #10790 from sruon/fix-session-hash-collision
[core] Session hash collision, login hardening, rlimits
2026-07-19 11:50:47 +02:00
Xaver
b844cbb540
Merge pull request #10794 from KiplingFFXI/Ding-Bat-Pos-Fix
[sql] Ding Bat POS Fix
2026-07-19 11:49:54 +02:00
Xaver
fc9bd559ca
Merge pull request #10797 from Skold177/Marksmanship-Module-Aftermaths
[lua] Fix Marksmanship Module Aftermaths
2026-07-19 11:49:14 +02:00
Zach Toogood
6f1a7fee86
Merge pull request #10795 from sruon/guild_close
[core] Suppress Guild Close message / Music IDs uint16
2026-07-19 09:49:01 +01:00
sruon
c934bc39ef Disable sleeping empty zones 2026-07-19 00:37:17 -06:00
Kipling
1903632d0c NIN DRG SAM quest era module 2026-07-18 23:08:01 -07:00
Skold
7c809f6d26 Fix Escape Zone Masks / Update Can't Escape Msg.
Updates two zone masks Yugghott Grotto and Sealions Den - Fixes the can't escape message.
2026-07-19 02:07:17 -04:00
Skold
536bff167d Fix Marksmanship Module Aftermaths
Correctly passes xi.slot.RANGED instead of xi.slot.MAIN.
2026-07-19 01:47:40 -04:00
Xaver
e977df5211
Merge pull request #10788 from steed9/fix/gold-musketeer-diabolos-earring-latents
[sql] Fix Gold Musketeer's Ring VIT and Diabolos's Earring ACC latents
2026-07-19 07:33:38 +02:00
Skold
49e5bb54dd Don't allow Harvests into Locked Mog Safe 2
Makes it so you cannot harvest unless it's unlocked.
2026-07-19 01:17:45 -04:00
sruon
e71825e0d3 Retrieve zone musics as uint16 2026-07-18 23:06:29 -06:00
sruon
88015eba58 Set high bit on daily guild close to suppress message
This tells the client to not print the "Shop is closed" message if the shop window isn't presently opened.
2026-07-18 23:04:37 -06:00
Kipling
db1dc709a1 Ding Bat POS Fix 2026-07-18 21:41:56 -07:00
ThrisStraizo
ffa7af13af Adjust Charybdis' job to Warrior
As it turn out, Charybdis is a Warrior.
2026-07-18 21:09:52 -07:00
Spencer Steed
bcea01506a Fix Gold Musketeer's Ring and Diabolos's Torque latents. 2026-07-19 04:39:07 +02:00
Skold
6fe9908423 Fix checkPetCommand
Fix checkPetCommand
2026-07-18 22:25:13 -04:00
Xaver
0ba9ae3db7
Merge pull request #10786 from KiplingFFXI/DRG-Unlock-Quest-Audits
[lua] DRG Unlock Quest Audits
2026-07-19 03:24:28 +02:00
sruon
ab3027f9af Raise open-file soft limit to the hard limit 2026-07-18 19:01:34 -06:00
sruon
0d8a97fd87 Harden charselect reply write and reject 0.0.0.0 map address 2026-07-18 19:01:34 -06:00
sruon
aea694ad15 Fix session hash collision for concurrent same-IP logins 2026-07-18 18:58:22 -06:00
Skold
2de771d590 Globalize bestowSignet, add Era module
Adds a module for the era signet duration.
2026-07-18 20:54:24 -04:00
Kipling
d895ca21e9 DRG Unlock Quest Audits 2026-07-18 17:13:21 -07:00
Nobutadas
6a37270c8c [C++,lua] Critical hit hooks for ranged and BLU 2026-07-18 18:56:21 -05:00
Xaver
d2710742bf
Merge pull request #10783 from Skold177/Fix-Olla-Spawn-Behavior
[lua] [sql] Fix Olla Pequena/Media/Grande spawn location, audit spell list.
2026-07-19 01:38:58 +02:00
Skold
bf1e02b524 Fix Olla Pequena/Media/Grande
Fixes their spawning behavior and spell lists.
2026-07-18 19:11:00 -04:00
Xaver
ae9eefee78
Merge pull request #10782 from Skold177/Era-Gobbiebag-Fame-Requirements
[lua] Gobbiebag Fame Requirement Module
2026-07-19 01:07:02 +02:00
Xaver
aac719a04d
Merge pull request #10779 from KiplingFFXI/More-Content-Tags-and-POS-Fixes
[sql] More Content Tags and POS Fixes
2026-07-19 00:44:06 +02:00
Skold
bdf6c93ddd Era Gobbiebag Fame Requirements
No more free bags.
2026-07-18 18:38:36 -04:00
Kipling
c3d8bdf265 Fix some content tags and mob spawn points 2026-07-18 23:30:54 +02:00
Zach Toogood
a28182e60d
Merge pull request #10780 from LandSandBoat/windows_is_slow_lol
Core: Add speedup options for Windows
2026-07-18 22:19:09 +01:00
Zach Toogood
c26b659858 Chore: Link winmm in StandardProjectSettings 2026-07-18 20:50:55 +01:00
Zach Toogood
e6a7ae498f dbtool: Add WinDefender exclusions task
Co-Authored-By: WinterSolstice8 <60417494+wintersolstice8@users.noreply.github.com>
2026-07-18 20:50:37 +01:00
Zach Toogood
42faedde8a Core: Various Windows tweaks to performance
Co-Authored-By: sruon <sruon@users.noreply.github.com>
2026-07-18 20:50:01 +01:00
Xaver
0e0601e5ef
Merge pull request #10685 from steed9/fix/old-counterstance-def
[cpp] Add USE_OLD_COUNTERSTANCE for era Counterstance DEF
2026-07-18 18:28:14 +02:00
Xaver
3715d3967e
Merge pull request #10707 from Nobutadas/boat-visible-on-depart-bug
[C++, lua] Make player invisible to self during zone-in events and transport events
2026-07-18 18:21:53 +02:00
Zach Toogood
f719a74159
Merge pull request #10776 from LandSandBoat/own_our_own_network_buffers
Core: Own our own network buffers
2026-07-18 15:47:11 +01:00
Nobutadas
f976d4150e [lua] Audit CoP 1-1 and Transport events 2026-07-18 08:21:33 -05:00
Nobutadas
853fdfe3eb [C++] Hide player from own events when marked hidden 2026-07-18 08:20:18 -05:00
Zach Toogood
0cb2ac1a9d Core: Only make 1 SQL query when loading a char
This used to be 3 round trips, and we recently got it down to 2. We can now get it down to a single round trip and let the DB handle the logic for whether or not the session_key is present.
2026-07-18 14:07:00 +01:00
Xaver
9ddaa299f5
Merge pull request #10755 from KiplingFFXI/barge-adjustments-and-NM-fixes
[Barge] Dialogue, Mob Spawning, and NM Adjustments
2026-07-18 14:06:20 +02:00
Kipling
f47090c1de Barge fixes and NM Adjustments 2026-07-18 13:35:27 +02:00
Zach Toogood
225666dd27 dbtool: Support local network from ip menu 2026-07-18 12:34:50 +01:00
Zach Toogood
ad8bd1d4e6 Core: Add Box alias for unique_ptr 2026-07-18 11:48:53 +01:00
Zach Toogood
37b29bc3bd Map: Move socket recv/send to own thread 2026-07-18 11:45:22 +01:00
Xaver
f7ff675271
Merge pull request #10775 from Hatberg/nokkhi-jinjahl-quiver-npc-enums
[lua] Nokkhi Jinjahl quiver npc enums, item luas
2026-07-18 12:39:57 +02:00
Zach Toogood
43a28cce91 Chore: Change stats reporting ordering 2026-07-18 11:31:22 +01:00
Xaver-DaRed
40823b40eb Create a separate mixin for "sleep at night" behavior and apply it 2026-07-18 12:28:27 +02:00
Xaver
9fc48a414b
Merge pull request #10770 from Hatberg/sauro-sabertooth-steal-cockatricemeat
[sql] Sabertooth Tiger Steal tables
2026-07-18 12:24:48 +02:00
Zach Toogood
7d562e4853 Chore: Use Fn in socket.h 2026-07-18 11:18:29 +01:00
Zach Toogood
649497138d Ext: Vendor SPSCQueue 2026-07-18 11:18:16 +01:00
Xaver
a556b30a8b
Merge pull request #10767 from KiplingFFXI/various-mob-pos-fixes
[sql] Various Mob POS Fixes
2026-07-18 12:11:46 +02:00
Xaver
e4fb1422c3
Merge pull request #10769 from KiplingFFXI/Sandy-8-2-Audits
[lua] Sandy 8-2 Fixes
2026-07-18 11:48:32 +02:00
Xaver
21885c9b11
Merge pull request #10773 from KiplingFFXI/NIN-Unlock-Quest-Audits
[lua, sql] NIN Unlock Quest Audits
2026-07-18 11:45:09 +02:00
Hatberg
38281155c2 [sql] Sabertooth Tiger meat steal tables 2026-07-18 11:40:48 +02:00
Xaver
b2e9cf8154
Merge pull request #10766 from cocosolos/smaller-cache
[ci] Remove built exes from build cache
2026-07-18 11:38:54 +02:00
Xaver
214e9b60ea
Merge pull request #10765 from Nobutadas/fix-door
[sql] Allow Mjoll's Goods' door to be closed
2026-07-18 11:38:04 +02:00
Xaver
1d614d5c33
Merge pull request #10772 from sruon/equip_cesti
[core] Fix H2H rendering with weaponless lockstyle
2026-07-18 11:37:26 +02:00
Xaver
dd3c3f7a1b
Merge pull request #10774 from sruon/mog_locker
[lua] Adjust Mog Locker lease when switching access
2026-07-18 11:36:14 +02:00
Xaver
5a8bb3ab95
Merge pull request #10768 from sruon/ghost_ammo_item
[core] Fix ghost item showing in ammo slot
2026-07-18 11:35:01 +02:00
Hatberg
f83a9fe146 [lua] Nokkhi Jinjahl quiver npc enums, item luas 2026-07-18 11:30:08 +02:00
sruon
3891fe732f Adjust Locker lease when switching access 2026-07-18 02:55:01 -06:00
Kipling
dc72a83fd3 NIN Unlock Quest Audits 2026-07-18 01:04:44 -07:00
sruon
313267e3ce Fix H2H rendering with weapon-less lockstyle 2026-07-18 01:54:44 -06:00
Kipling
56ec99819c Sandy 8-2 Fixes 2026-07-17 23:12:57 -07:00
sruon
945246f166 Fix ghost item in ammo slot 2026-07-17 23:34:25 -06:00
Kipling
a5c6d4609a mob pos fixes 2026-07-17 22:11:43 -07:00
Corey Sotiropoulos
15b9686b8d
[ci] Remove built exes from build cache 2026-07-18 04:22:10 +00:00
Xaver
794ec3a369
Merge pull request #10753 from Hatberg/npc-tswe-panipahr-interaction
[lua] NPC Tswe Panipahr (Manaclipper ticket) cleanup
2026-07-18 05:34:03 +02:00
Xaver
4b44f288b9
Merge pull request #10762 from Skold177/Dynamis-Lord
[lua] [sql] Update Dynamis Lord
2026-07-18 05:31:11 +02:00
Nobutadas
c9624e4107 [sql] Start Mjoll's Goods door in closed state 2026-07-17 22:26:33 -05:00
sruon
a306f81ecb Handle onEventUpdate for Manaclipper ticket seller 2026-07-17 21:06:50 -06:00
Skold
24956c5512 Update Dynamis Lord
Updates the script for Dynamis Lord
2026-07-18 05:03:05 +02:00
Xaver
5a69701a16
Merge pull request #10764 from KiplingFFXI/Sandy-Missions-Piece-of-Paper-KI-Fix
[lua] Sandy 6-1 & 6-2 Key Item Fix
2026-07-18 04:15:49 +02:00
Kipling
69e0e8f91a Sandy 6-1 Key Item Fix 2026-07-17 18:39:56 -07:00
Xaver
69fc597c1e
Merge pull request #10763 from sruon/knockback_caps
[sql] Correct animation ID for Steaming Rage / Feather Barrier
2026-07-18 03:36:21 +02:00
sruon
0b4582d766 Correct animation ID for Steaming Rage / Feather Barrier 2026-07-17 19:09:08 -06:00
Xaver
6aa9458fc9
Merge pull request #10746 from Nobutadas/conquest-amount-allow-reducing
[C++] Account for if conquest setting is reduced midweek
2026-07-18 03:08:14 +02:00
Xaver
ad2f679ea6
Merge pull request #10748 from ThrisStraizo/miniavatarfights
[lua] [sql] Trials Size Avatar Fight Res Override
2026-07-18 03:06:23 +02:00
Xaver
3cdbf97811
Merge pull request #10757 from Hatberg/stardust-repeatable-mustzone
[lua] Stardust quest repeatable mustZone and Accept
2026-07-18 03:05:33 +02:00
WinterSolstice8
995f0b6e31
Merge pull request #10743 from Xaver-DaRed/skip
[Combat] Skip SDT checks on absorb
2026-07-17 18:48:25 -06:00
WinterSolstice8
f8bddd99a9
Merge pull request #10714 from Xaver-DaRed/garden
[Chore] Garden of Ru'Hmet minor pass
2026-07-17 18:46:49 -06:00
WinterSolstice8
af6a40ae58
Merge pull request #10702 from Xaver-DaRed/stuff
[Fix] Various item blocking fixes
2026-07-17 18:42:30 -06:00
Xaver
8a6c3d44fe
Merge pull request #10760 from KiplingFFXI/Sandy-6-2-Aggro-Fixes
[lua] Sandy 6-2 Aggro Fixes
2026-07-18 02:13:17 +02:00
Xaver
d0265ec3db
Merge pull request #10756 from ThrisStraizo/kamlanautaggro
[lua] Kamlanaut aggro range fix
2026-07-18 01:56:26 +02:00
WinterSolstice8
d74530918e [core] Spawn, but hide content tagged NPCs
Apparently, some cutscenes contain NPCs in different content tags,
such as WoTG NPCs now appearing in a pre WoTG CS because they are in town now

This will allow the client to request info on those NPCs and the server will reply with their look etc.
2026-07-17 17:52:55 -06:00
Hatberg
da420bb080 [lua] NPC Tswe Panipahr (Manaclipper) cleanup 2026-07-18 01:43:49 +02:00
Hatberg
ebbb161b59 [lua] Stardust quest repeatable mustZone
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-18 01:36:43 +02:00
Xaver
c01b5b32d5
Merge pull request #10754 from Hatberg/habetrot-qm-15min
[lua] Habetrot qm respawn 15 mins
2026-07-18 01:33:23 +02:00
ThrisStraizo
19d90155e4 Kamlanaut aggro range fix
This PR adjusts Kamlanaut's aggro so he doesn't aggro players loading into the fight.
2026-07-17 16:30:25 -07:00
Kipling
23de6a3232 Sandy 6-2 Aggro Fixes 2026-07-17 16:27:37 -07:00
Hatberg
7a7126ae11 [lua] Habetrot qm respawn 15 mins 2026-07-17 21:37:32 +02:00
Xaver
cb80c79906
Merge pull request #10751 from Hatberg/raptors-food-content-tag
[sql] Set Raptor's Food npcs to ROV, hide from widescan
2026-07-17 17:57:22 +02:00
Xaver
1feaa69c70
Merge pull request #10750 from Nobutadas/Add-bartabaq
[lua] Add Bartabaq outpost vendor to Oldton Movalpolos
2026-07-17 17:56:12 +02:00
Nobutadas
8df1f04d8a [lua] Add Bartabaq outpost vendor 2026-07-17 08:20:48 -05:00
Hatberg
78a2a023dc [sql] Set Raptor's Food npcs to ROV, hide from widescan 2026-07-17 15:10:27 +02:00
Xaver
0a8adc8aa5
Merge pull request #10717 from Hatberg/windurst-6-1-cardians
[sql, lua] Fix Windurst Mission 6-1 Jack Cardians
2026-07-17 12:38:43 +02:00
Hatberg
42dd4e6169 [sql, lua] Fix Windurs 6-1 Jack Cardians
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-17 12:07:42 +02:00
Xaver
2673fad6bc
Merge pull request #10741 from Auzali/add-ROTZ-tags-551-600
[sql] Audit some synthesis content tags (551-600)
2026-07-17 11:42:53 +02:00
Xaver
868acf1f2c
Merge pull request #10745 from ThrisStraizo/boreasdmgfix
[lua] [sql] Correct Boreas Cesti AE to 5-7 DMG
2026-07-17 11:39:10 +02:00
Xaver
b24f3f14a4
Merge pull request #10716 from eliroo12/fix/killereffectAudit
[sql] Audit Killer Effects on Items based on BG wiki
2026-07-17 11:35:21 +02:00
Xaver
90cb069b1e
Merge pull request #10744 from ThrisStraizo/claimtarasque
[lua] Make Tarasque claimed on spawn
2026-07-17 11:03:40 +02:00
ThrisStraizo
ad7d8e6c52 Correct Boreas Cesti AE to 5-7 DMG
This PR corrects the AE of Boreas Cesti to random 5-7 of magic wind damage.
2026-07-17 10:48:22 +02:00
ThrisStraizo
1a6b1d7472 Trials Size Avatar Fight Res Override
Recent changes to Avatar SQL res ranks had the unintended consequence of making the Mini fights harder than it should be.
2026-07-16 22:52:30 -07:00
Nobutadas
542ddba843 [C++] Account for if conquest setting is reduced midweek 2026-07-16 22:55:21 -05:00
Xaver-DaRed
046904e127 Combat: Skip SDT checks on absorb 2026-07-17 01:19:29 +02:00
Spencer Steed
d797d2ba25 Add era Counterstance DEF behind USE_OLD_COUNTERSTANCE
Pre-WotG Counterstance used DEF = 1 + VIT/2 (+ Minne), ignoring gear and Protect. Retail half-DEF behavior is unchanged when the setting is false.
2026-07-16 17:54:05 -05:00
ThrisStraizo
5b5ea69a10 Make Tarasque claimed on spawn
This PR deletes unnecessary settings on Tarasque's spawn so he properly claims on spawn.
2026-07-16 15:53:05 -07:00
Xaver
377c206fce
Merge pull request #10742 from Nobutadas/fix-fade-to-black-nation-change
[lua] Fix fade-to-black nation change event
2026-07-16 23:26:42 +02:00
Nobutadas
7d28390b27 [lua] Fix fade-to-black nation change event 2026-07-16 15:57:50 -05:00
Xaver
d3113efbea
Merge pull request #10740 from Xaver-DaRed/check
[Fix] Not checking if pet is nil before fetching pet entity type
2026-07-16 22:43:24 +02:00
taylorleary
37d73695a5 [sql] Audit some synthesis content tags (551-600) 2026-07-16 16:40:24 -04:00
Xaver-DaRed
e6210918ba Fix not checking if pet is nil before fetching pet entity type 2026-07-16 21:43:37 +02:00
Xaver
93d45bddc4
Merge pull request #10737 from Xaver-DaRed/duration-range
[Chore] Make `xi.mobskills.calculateDuration` work like it claims it does
2026-07-16 21:11:14 +02:00
Xaver
ac7e7d1467
Merge pull request #10735 from WinterSolstice8/charvar_lengthen
[core] [lua] Extend charvar to 64 characters, add size check msg
2026-07-16 19:57:56 +02:00
Xaver
f11adb1d84
Merge pull request #10739 from WinterSolstice8/ifrits_mining_point_redux
[sql] Adjust Ifrit's Cauldron's 2nd set of mining points to be visible
2026-07-16 19:49:02 +02:00
Xaver
9e6c062a7e
Merge pull request #10738 from KiplingFFXI/Silk-Caterpillar-Despawn-Fix
[lua] Silk Caterpillar Despawn Fixes
2026-07-16 19:27:16 +02:00
WinterSolstice8
52cc69b57f [sql] Adjust Ifrit's Cauldron's 2nd set of mining points to be visible 2026-07-16 11:24:11 -06:00
Xaver
e7a0ffd802
Merge pull request #10736 from Nobutadas/intro-cs-on-nation-swap
[lua] Perform intro event on nation swap
2026-07-16 19:08:26 +02:00
WinterSolstice8
c25653dd2e [core] [lua] Extend charvar to 64 characters, add size check msg 2026-07-16 11:05:31 -06:00
Kipling
f2cc43d096 Silk Caterpillar Despawn Fixes 2026-07-16 09:52:19 -07:00
Xaver-DaRed
3beb15e4be Make xi.mobskills.calculateDuration work like it claims it does 2026-07-16 18:34:15 +02:00
Xaver
8bd3c5e31e
Merge pull request #10732 from ThrisStraizo/smnmaatdmgtaken
[lua] Update SMN Maat's defenses
2026-07-16 17:38:28 +02:00
Xaver
1971699237
Merge pull request #10730 from ThrisStraizo/stickythreadduration
[lua] Update Sticky Thread TP scaling duration
2026-07-16 17:27:26 +02:00
Xaver
836a0d2d6a
Merge pull request #10733 from UmeboshiXI/Utsusemi_Message_Correction
[lua] Correct Utsusemi Effect Wear Message
2026-07-16 17:23:11 +02:00
Xaver
f3f7843dc1
Merge pull request #10734 from KiplingFFXI/Sandy-8-1-Audits
[lua, sql] San d'Oria Mission 8-1 Audits
2026-07-16 17:22:42 +02:00
Nobutadas
ec1160d230 [lua] Perform intro event on nation swap 2026-07-16 10:22:19 -05:00
Kipling
b44c56f9f3 Sandy 8-1 Audits 2026-07-16 02:19:55 -07:00
Umeboshi
c7fb2f3320 [lua] Correct Utsusemi Effect Wear Message 2026-07-15 22:56:25 -07:00
ThrisStraizo
8fd3720877 Update SMN Maat's defenses
This PR makes it so Maat takes half damage from everything and increases his defense to reflect the auto attack damage received.
2026-07-15 22:18:42 -07:00
ThrisStraizo
b93d7c0d10 Update Sticky Thread TP scaling duration
This PR updates sticky thread to use the same scaling as Sonic Boom.  At 1k, sticky thread's duration will always be exactly 3m.  This scales all the way to 3k, where the duration is 9m
2026-07-15 18:19:57 -07:00
Xaver
34a92a55ff
Merge pull request #10720 from Nobutadas/expeditionary-force-with-one-zone
[lua] Expeditionary Force - Award Influence
2026-07-16 01:50:47 +02:00
Xaver
cc767c0435
Merge pull request #10729 from Nobutadas/event-skipped-gates-toau
[lua] Event Audit: ToAU gates, Sandy 1-2, and THF AF3
2026-07-16 01:38:34 +02:00
Xaver-DaRed
9a1911f852 Delete empty onMobDeath functions with bad parameters 2026-07-16 00:56:53 +02:00
Xaver-DaRed
958b30275d Minor Garden of Ruhmet cleanup 2026-07-16 00:56:53 +02:00
Xaver
35568aa8b5
Merge pull request #10728 from ThrisStraizo/faustreadymsg
[lua] Give Despot 1ms Ready time for Ready Message
2026-07-16 00:56:38 +02:00
Xaver
5935a2ee38
Merge pull request #10725 from WinterSolstice8/south_gusta_qms
Clean up south gustaberg QMs, adjust campfire default action
2026-07-16 00:56:12 +02:00
Nobutadas
4e7bf67d10 [lua] Event Audit: ToAU gates, Sandy 1-2, and THF AF3 2026-07-15 17:54:12 -05:00
Xaver
caac54f426
Merge pull request #10727 from Xaver-DaRed/cop-8-2
[Fix] Add check for CoP 8-2 to disallow entering The garden of Ru'Hmet
2026-07-16 00:53:42 +02:00
WinterSolstice8
1cb7a7645f
Merge pull request #10721 from Xaver-DaRed/s
[Magic] Remove string penalty from song potency
2026-07-15 16:40:29 -06:00
Xaver
0a2825dc95
Merge pull request #10726 from WinterSolstice8/fstr_fix
[lua] Fix mob fstr lower bounds
2026-07-16 00:33:51 +02:00
ThrisStraizo
c9dd1b046e Give Despot 1ms Ready time for Ready Message
This PR gives Despot's subsequent Panzerfausts 1ms of ready time to accurately reflect retail's ready messaging.
2026-07-15 15:29:32 -07:00
Xaver-DaRed
6423f79910 Add check for CoP 8-2 to disallow entering The garden of Ru'Hmet 2026-07-16 00:22:34 +02:00
WinterSolstice8
2b09985334 [lua] fix mob ranged fSTR lower bounds 2026-07-15 16:04:03 -06:00
Xaver
f7a7b370f4
Merge pull request #10724 from Hatberg/ominous-cloud-enums
[lua] Ominous Cloud enums, add missing pouch luas
2026-07-15 23:59:27 +02:00
WinterSolstice8
abb0bd807b [lua] Fix mob fstr lower bounds 2026-07-15 15:55:17 -06:00
Xaver
f11395c345
Merge pull request #10723 from WinterSolstice8/appraisal_fix
[lua] Appraisal: Don't lock items unless they will actually be taken
2026-07-15 23:51:40 +02:00
Xaver
d7355dbd64
Merge pull request #10722 from WinterSolstice8/blu_quest_tradehas_bs
[lua] Adjust BLU quest tradehas order to not lock item accidentally
2026-07-15 23:46:40 +02:00
WinterSolstice8
ee562f1c7c [lua] Adjust campfire default action to match retail in sgusta 2026-07-15 15:41:46 -06:00
WinterSolstice8
694cd7925b [sql] Adjust South Gustaberg QMs to match retail
qm1 = Bubbly Bernie
qm2 = Galkan Sausage campfire

The rest are out of bounds ???s or perma-despawned ones that might be for events.
2026-07-15 15:41:46 -06:00
Xaver
7b89225165
Merge pull request #10719 from WinterSolstice8/sunsand
[lua] Change Sunsand must zone check to ~= 0
2026-07-15 23:23:49 +02:00
Hatberg
14b9e50805 [lua] Ominous Cloud enums, add missing pouch luas 2026-07-15 23:22:38 +02:00
WinterSolstice8
c59df6142a [lua] Appraisal: Don't lock items unless they will actually be taken 2026-07-15 15:09:18 -06:00
Nobutadas
b6915cb5ff [lua] Expeditionary Force - Award Influence 2026-07-15 15:53:56 -05:00
Xaver-DaRed
d03ad7b9f3 Remove string penalty from song potency 2026-07-15 22:53:35 +02:00
Xaver
ec73fd02d7
Merge pull request #10718 from WinterSolstice8/add_10th_point_morion_worm
[lua] Add missing 10th point to Morion Worm QM
2026-07-15 22:37:19 +02:00
WinterSolstice8
8076914c5a [lua] Adjust BLU quest tradehas order to not lock item accidentally 2026-07-15 14:16:30 -06:00
WinterSolstice8
43c2a77f42 [lua] Change Sunsand must zone check to ~= 0 2026-07-15 14:11:41 -06:00
WinterSolstice8
4b6a2577ab [lua] Add missing 10th point to Morion Worm QM 2026-07-15 14:06:39 -06:00
Xaver
2b8fc21d26
Merge pull request #10715 from KiplingFFXI/Faust-Aggro-Fix
[lua] Faust Aggro Fixes
2026-07-15 21:51:46 +02:00
Kipling
4685cb369b Faust Aggro Fixes 2026-07-15 12:17:50 -07:00
Eliroo
0f32dd99aa Correct Killer Effects on Items 2026-07-15 14:16:54 -05:00
Xaver-DaRed
1c4b1d2906 Remove Server Variable usage from Awaerns and Ixaern 2026-07-15 13:21:53 +02:00
Xaver
b7cf888227
Merge pull request #10664 from Skold177/KS99-Wyrm-No-Miss
[lua] Fix KS99 Wyrm Remove All Miss on Spawn
2026-07-15 12:57:50 +02:00
Xaver
4a547799bb
Merge pull request #10709 from SpencerSteed/fix/chi-blast-boost-multiplier
[lua] Fix Chi Blast Boost multiplier
2026-07-15 12:56:59 +02:00
Xaver
abc58c3784
Merge pull request #10713 from KiplingFFXI/Remove-Castle-Zvahl-Baileys-Music
[sql] Remove Castle Zvahl Baileys Music
2026-07-15 12:56:07 +02:00
Kipling
92b8c80020 Remove Castle Zvahl Baileys Music 2026-07-15 00:32:29 -07:00
Xaver
538ae51a38
Merge pull request #10712 from KiplingFFXI/Pirates-Music
[lua] Add Music to Pirates
2026-07-15 09:24:13 +02:00
Spencer Steed
710cb5faec [lua] Fix Chi Blast Boost multiplier
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 08:17:08 +02:00
Kipling
8c8d4bd08c Add Music to Pirates 2026-07-14 23:14:14 -07:00
Xaver
f162dd1abb
Merge pull request #10711 from KiplingFFXI/ZM4-Audits
[lua, sql] ZM4 Fixes and Audits
2026-07-15 08:10:26 +02:00
Xaver
7ab3825a49
Merge pull request #10710 from UmeboshiXI/Utsusemi_Knockback_Fix
[core] Allow Blink/Utsusemi to negate knockback
2026-07-15 07:59:28 +02:00
Xaver
1796bd6255
Merge pull request #10706 from ThrisStraizo/suzyres
[sql] [lua] Audit Suzaku res
2026-07-15 07:54:21 +02:00
ThrisStraizo
cb20325964 Audit Suzaku res
This PR removes bullshit res ranks that don't exist on Suzaku and adds Bind res rank 10 and adjusts silence to rank 10.
2026-07-14 22:29:13 -07:00
Kipling
3edc447413 ZM4 Fixes and Audits 2026-07-14 20:59:53 -07:00
Umeboshi
75dc4a99a8 [core] Allow Blink/Utsusemi to negate knockback 2026-07-14 19:23:05 -07:00
Xaver
fb3b50bb7f
Merge pull request #10708 from Xaver-DaRed/tele
Fix teleport spells
2026-07-15 02:41:38 +02:00
Xaver-DaRed
2afa9aa4b6 Fix teleport spells 2026-07-15 02:13:13 +02:00
Xaver
a7f65d33c2
Merge pull request #10705 from WinterSolstice8/kill_targetlines_setting
[core] Add setting to hide readies target id
2026-07-15 01:56:31 +02:00
Xaver-DaRed
ea9b68dfbf Various item blocking fixes 2026-07-15 01:29:59 +02:00
WinterSolstice8
89720a8900 [core] Add setting to hide readies target id 2026-07-14 14:41:18 -06:00
Xaver
4ff91ad25a
Merge pull request #10703 from Skold177/Change-Pet-getMobHP()-to-int32
[c++] Change Pet getMobHP() to int32
2026-07-14 21:50:48 +02:00
Skold177
b24f30f1d4 Change Pet getMobHP() to int32
Changes getMobHP() to int32 so that hp is accurately returned
2026-07-14 15:04:06 -04:00
Xaver
95ff516e2f
Merge pull request #10701 from Skold177/Content-Tags
[sql] Add Content Tags, Fix Apex Drifer Mob Groups
2026-07-14 19:40:29 +02:00
Xaver
60198381e9
Merge pull request #10700 from Skold177/Harden-Promy-Vahzl-Boss-Engage
[lua] Harden Promy-Vahzl boss engage logic
2026-07-14 19:18:53 +02:00
Xaver
a5ff970ac2
Merge pull request #10699 from WinterSolstice8/store_tp_merits
[lua] Add in store tp merit to tp return calc
2026-07-14 19:03:55 +02:00
Skold177
c8e204cb2e Add Content Tags, Fix Apex Drifer Mob Group
Adds content tags to various NPCs/NMs and fixes the mob group for Apex mobs.
2026-07-14 12:46:45 -04:00
WinterSolstice8
5b4079d940 [lua] Add in store tp merit to tp return calcs 2026-07-14 18:34:39 +02:00
Skold
233c459d95 Fix KS99 Wyrm No Miss
Removes No Miss Effect on Spawn
2026-07-14 12:11:34 -04:00
Skold177
8d194cb073 Harden Promy Vahzl Boss Engage
Adds a check in death to make sure it fires if the target is killed instantly.
2026-07-14 11:47:04 -04:00
Xaver
5390474f67
Merge pull request #10698 from Skold177/Fix-Ark-Angel-MR
[lua] Add guard to Ark Angel MR Pet summoning
2026-07-14 17:43:29 +02:00
Xaver
0ec8235c9f
Merge pull request #10697 from sruon/more_qm_fixes
[lua, sql] Fix Den of Rancor QMs. Add Goblin Footprint in RuAun
2026-07-14 17:33:07 +02:00
Xaver
6d91ce0ded
Merge pull request #10695 from sruon/double_job_fix
[core] Tighten job change checks
2026-07-14 17:27:42 +02:00
Xaver
ca572acc27
Merge pull request #10696 from WinterSolstice8/alwaysrelevant_npc_fix
[core] Skip grid check on UpdateEntityPacket for always relevant npc
2026-07-14 17:23:52 +02:00
Skold177
5f527fe6a4 Fix Ark Angel MR Pet Respawn
Makes it so she cannot summon another pet if current one is alive
2026-07-14 11:10:57 -04:00
sruon
f6cdfdca25 Fix Den of Rancor QMs 2026-07-14 09:03:47 -06:00
sruon
8bcd3b16ee Add Goblin Footprint in RuAun 2026-07-14 09:03:47 -06:00
Xaver
166c884c32
Merge pull request #10694 from Nobutadas/eco-warrior-garrison-xp-fix
[lua] Restrict xp in Eco-Warrior and Garrison
2026-07-14 16:48:03 +02:00
WinterSolstice8
b4ddbea641 [core] Skip grid check on UpdateEntityPacket for always relevant npc 2026-07-14 08:07:33 -06:00
sruon
8b640c8829 Tighten job change checks 2026-07-14 07:46:41 -06:00
Xaver
2eb63e480a
Merge pull request #10684 from sruon/di_culling
[core, lua, sql, yaml] Fence render culling; Domain Invasion POC
2026-07-14 15:19:21 +02:00
Nobutadas
dfa6718450 [lua] Restrict xp in Eco-Warrior and Garrison 2026-07-14 08:18:11 -05:00
Xaver
aad3026a31
Add Final Roll to Pulling the Strings (#10688)
Co-authored-by: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-14 15:01:34 +02:00
Xaver
ae2c2adb8c
Merge pull request #10690 from Skold177/Fix-SMN-Blood-Pact-TP-Consumption
[lua] [sql] Fix SMN BP TP Consumption
2026-07-14 14:51:28 +02:00
UmeboshiXI
d311881879
MNK/PUP Mob Weapon Delay Audits (#10693)
* [sql] Bugbear Delay Audit

* [sql] Gigas Delay Audit

* [sql] Orc Delay Audit

* [sql] Sahagin MNK Delay Audit

* [sql] Tauri Delay Audit

* [sql] Troll MNK/PUP Delay Audit

* [sql] Mandragora Delay Audit

* [sql] Apkallu Delay Audit

* [sql] Fomor/Shade MNK Delay Audit
2026-07-14 14:45:36 +02:00
Skold
b89977cdc1 Add Final Roll to Pulling the Strings
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-14 14:26:38 +02:00
sruon
d38fa1454f Fence rendering culling; Domain Invasion POC 2026-07-14 13:41:43 +02:00
Xaver
0a3f2e3390
Merge pull request #10683 from Aeshur/fix-elevator-name
[chore] Restore Ra'Kaznar elevator retail names
2026-07-14 13:35:55 +02:00
Xaver
88b2f96076
Merge pull request #10686 from sruon/rental_no_zone
[core] Deny zoning with rental chocobo to non-riding zones
2026-07-14 13:35:13 +02:00
Xaver
63b2c41207
Merge pull request #10687 from sruon/modules_yaml
[core, yaml] Rename ZoneMisc::AuctionHouse
2026-07-14 13:34:05 +02:00
Xaver
526aaabab1
Merge pull request #10692 from KiplingFFXI/Mamool-Ja's-Lizard-(Mamook)-Fix
[sql] Mamool Ja's Lizard (Mamook) Fix
2026-07-14 13:33:27 +02:00
Xaver
ed59c7aa1b
Merge pull request #10691 from KiplingFFXI/Sandy-7-1-and-7-2-Audits
[lua, sql] Sandy Mission 7-1 and 7-2 Audits
2026-07-14 13:29:38 +02:00
Xaver
99270513b2
Merge pull request #10689 from sruon/npc_sell_prices_2
[lua] Adjust guild stocks
2026-07-14 13:28:03 +02:00
Xaver
1ec261db89
Merge pull request #10682 from Xaver-DaRed/excalibur
[Combat] Rename `isRanged` to `ignoreEnSpell` and apply to Excalibur
2026-07-14 13:27:28 +02:00
Kipling
633cd2488f Mamool Ja's Lizard Fix 2026-07-14 00:16:49 -07:00
Kipling
db37e3d4ca Sandy 7-1 and 7-2 Audits 2026-07-13 23:24:31 -07:00
Skold177
6c642ed975 Fix SMN BP TP Consumption
Fixes SMN BP TP Consumption
2026-07-14 02:10:53 -04:00
sruon
a50872d468 Rename ZoneMisc::AuctionHouse 2026-07-13 23:58:58 -06:00
sruon
dad9c143f5 Adjust guild stocks 2026-07-13 23:55:55 -06:00
sruon
4c14424658 Deny zoning with rental chocobo to non-riding zones 2026-07-13 23:02:38 -06:00
Aeshur
d6a7795a21 [chore] Restore Ra'Kaznar elevator retail names 2026-07-13 21:07:11 -04:00
Xaver
8288c74708
Merge pull request #10681 from sruon/win_92_cs_params
[core] Don't block REQSUBMAPNUM during CS
2026-07-14 02:16:17 +02:00
Xaver
83510e9e81
Merge pull request #10679 from WinterSolstice8/update_weapon_reset
[core] change resetDelay to use setDelay of base delay
2026-07-14 02:13:49 +02:00
Xaver
c9f2cef286
Merge pull request #10677 from Nobutadas/expeditionary-force-mob-models-skills-audit
[sql] Update Expeditionary Force models and skills
2026-07-14 01:51:12 +02:00
Xaver
392f244f4c
Merge pull request #10680 from Hatberg/fomor-party-onmobinit
[lua] Move fomorParty superlink to onMobInit
2026-07-14 01:45:01 +02:00
Xaver-DaRed
d37bea4ccd Damaging AEs: Rename isRanged to ignoreEnSpell & apply to Excalibur 2026-07-14 01:25:41 +02:00
Nobutadas
955f48f7c6 [sql] Update Expeditionary Force models and skills 2026-07-13 18:23:37 -05:00
sruon
2976131650 Do not block REQSUBMAPNUM while in CS 2026-07-13 17:21:29 -06:00
sruon
e531c00c3c Correct flags for Windurst 9-2 final CS in Walls 2026-07-13 17:21:15 -06:00
WinterSolstice8
a0ad89b54b
Merge pull request #10669 from Xaver-DaRed/getfirstid
[Chore] Convert some raw entity IDs to GetFirstID() methods
2026-07-13 17:11:31 -06:00
WinterSolstice8
0dfda321ca [core] change resetDelay to use setDelay of base delay 2026-07-13 17:07:24 -06:00
Hatberg
1600c6ba9e [lua] Move fomorParty superlink to onMobInit 2026-07-14 00:56:31 +02:00
Xaver
2f8dc79983
Merge pull request #10675 from sruon/khaf_shop
[lua, sql] Khaf Jhifanm shop accounts for Astral Candescence
2026-07-13 23:07:48 +02:00
Xaver
de09f9ff88
Merge pull request #10676 from Nobutadas/Exp-force-zone-and-mobs
[lua][sql] Create Expeditionary Force mobs and enable zones
2026-07-13 22:23:04 +02:00
Nobutadas
65d535d363 [lua][sql] Create Expeditionary Force mobs and enable zones
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-13 14:51:06 -05:00
sruon
ca810e6ab2 Khaf Jhifanm shop accounts for Candescence 2026-07-13 11:36:34 -06:00
Xaver
420af48f25
Merge pull request #10673 from Skold177/Convert-Call-of-the-Wildcat-to-IF
[lua] Convert Lure of the Wildcat to IF
2026-07-13 18:42:36 +02:00
Xaver
8d51560d84
Merge pull request #10672 from KiplingFFXI/Sandy-6-2-Audits
[lua, sql] San d'Oria Mission 6-2 Audits
2026-07-13 17:56:07 +02:00
Skold177
29ffa41366 Convert Call of the Wildcat to IF
Converts the remaining two cities to IF
2026-07-13 11:32:35 -04:00
Kipling
2ead23a552 Sandy 6-2 Audits 2026-07-13 08:22:20 -07:00
Xaver-DaRed
0164ed8eb2 Convert some raw entity IDs to GetFirstID() methods 2026-07-13 15:40:46 +02:00
Xaver
6c69480348
Merge pull request #10510 from Nobutadas/expeditionary-force-battle-logic
[lua] Expeditionary Force Battle Logic
2026-07-13 14:53:34 +02:00
Nobutadas
93b014fa90 [lua] Expeditionary Force Battle Logic
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-13 13:59:16 +02:00
Xaver
b548d95698
Merge pull request #10666 from ThrisStraizo/grahjob
[sql] Update Ghrahs to war main blm sub
2026-07-13 13:45:34 +02:00
ThrisStraizo
952f91f83f Update Ghrahs to war main blm sub
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-13 12:46:30 +02:00
Xaver
305f0bc3fa
Merge pull request #10661 from Nobutadas/ranger-quest-time
[lua] RNG quest: Kill tiger in the correct amount of time
2026-07-13 12:43:59 +02:00
Xaver
efe06ee87f
Merge pull request #10659 from SpencerSteed/fix/typed-stoneskin-rampart
[core, lua] Fix Rampart Magic Shield absorbing physical damage
2026-07-13 12:05:09 +02:00
Xaver
3a72ef5294
Merge pull request #10665 from Skold177/Fix-Meikyo-Shisui-WS-TP-return
[lua] Remove Extra Hits TP from Meikyo Shisui
2026-07-13 11:28:44 +02:00
Xaver
273a84dbca
Merge pull request #10663 from Skold177/Royall-Jelly-Bugfix
[lua] Fix Queen Jelly Spawn HP
2026-07-13 11:08:48 +02:00
Xaver
7171b4a781
Merge pull request #10662 from ThrisStraizo/bunbunjobs
[sql] Update normal rabbits to be warriors
2026-07-13 11:07:42 +02:00
Xaver
6cf9b9259a
Merge pull request #10655 from Skold177/Add-Settings-for-Mog-House-options
[C++] [lua] Add settings for Mog House options
2026-07-13 11:06:58 +02:00
Xaver
b6fc7b3fc0
Merge pull request #10648 from Nobutadas/event-flag-hidden
[C++] Add hidden option for event
2026-07-13 11:05:36 +02:00
Xaver
4529c2c8fb
Merge pull request #10643 from Skold177/Fix-Maidens-Virelai
[C++] [lua] Fix Maidens Virelai
2026-07-13 11:04:58 +02:00
Xaver
1f1045c763
Merge pull request #10667 from sruon/bos_trap_doors
[lua] Enable Bostaunieux trap doors
2026-07-13 11:00:34 +02:00
sruon
bb07bae2b0 Enable Bostaunieux trap doors
Co-Authored-By: Valentine-PHX <231148762+Valentine-PHX@users.noreply.github.com>
2026-07-13 02:05:50 -06:00
Skold
0eedb73ce7 Remove Extra Hits TP from Meikyo Shisui
Makes it so TP Returned = 0.
2026-07-13 01:06:04 -04:00
Skold
8d9b1f9537 Fix Queen Jelly HP
Makes it so she spawns with missing HP
2026-07-13 00:21:14 -04:00
Skold
c08fbb3d9e Add settings to Mog House settings
Adds a setting for Mog House 2F and Mog Garden
2026-07-13 00:13:30 -04:00
ThrisStraizo
6d56c36370 Update normal rabbits to be warriors
Bunnies being thfs is the exception, not the rule.

What in the hell was going on there?
2026-07-12 21:01:40 -07:00
Xaver
33471f0695
Merge pull request #10658 from WinterSolstice8/te_timer
[core] Reduce Third Eye merit recast reduction by half with Seigan
2026-07-13 04:36:14 +02:00
Nobutadas
159a3576f8 [lua] Kill tiger in the correct amount of time 2026-07-12 21:02:34 -05:00
Xaver
7784dc802e
Merge pull request #10656 from WinterSolstice8/get_unkillable
[core] [lua] add getUnkillable to lua bindings
2026-07-13 03:23:25 +02:00
Spencer Steed
6695a94e32 Fix Rampart Magic Shield absorbing physical damage.
Honor existing stoneskin subType 1/2 used by frozen_mist, hydro_wave, and
Rampart. Skip absorption only when attack type is known incompatible.
Refs #9665.
2026-07-12 20:21:45 -05:00
Xaver
fe46dc06ad
Merge pull request #10657 from ThrisStraizo/somestealitemadjusts
[sql] Update some bunnies to have stealable meat
2026-07-13 03:10:32 +02:00
WinterSolstice8
e3b014a206 [core] Reduce Third Eye merit recast reduction by half with Seigan 2026-07-12 18:55:10 -06:00
Xaver
f01acbe70a
Merge pull request #10652 from WinterSolstice8/delay_junk
[core] Don't do silly calculations for no reason for base delay
2026-07-13 02:53:22 +02:00
Xaver
9f36def60c
Merge pull request #10654 from WinterSolstice8/spell_interrupt
[core] Adjust magic state interrupt
2026-07-13 02:46:06 +02:00
ThrisStraizo
4e9c03205c Update some bunnies to have stealable meat
This PR adjusts some bun buns to steal their bun buns.
2026-07-12 17:38:41 -07:00
Skold
f0db19a151 Fix Maidens Virelai
Fixes Maidens Virelai not charming mobs correctly and also adds assist behavior.
2026-07-12 20:32:55 -04:00
WinterSolstice8
1efae911cf [core] [lua] add getUnkillable to lua bindings 2026-07-12 18:28:01 -06:00
Xaver
87ee4d098f
Merge pull request #10653 from ThrisStraizo/mnkmaataccadjust
[lua] Adjust Maat Mnk's accuracy
2026-07-13 02:27:33 +02:00
WinterSolstice8
ce22567821
Merge pull request #10651 from ThrisStraizo/cccadjust
[lua] Gil adjustment for Cargo Crab Colin
2026-07-12 18:22:27 -06:00
WinterSolstice8
cbf05f3163 [core] Don't do silly calculations for no reason for base delay 2026-07-12 18:16:59 -06:00
WinterSolstice8
9fc7761ff8 [core] Adjust magic state interrupt
Stun should interrupt non-song at the end of a cast.
Stun should interrupt songs only if stunned at the end of a cast.
2026-07-12 17:55:47 -06:00
ThrisStraizo
1536315932 Adjust Maat Mnk's accuracy
This PR adjusts Maat Mnk's accuracy to observed levels and should give players the fighting chance they need.
2026-07-12 16:54:13 -07:00
Xaver
9fdd4347bc
Merge pull request #10650 from sruon/vos_qms
[lua, sql] Fix Valley of Sorrows QMs
2026-07-13 01:37:46 +02:00
ThrisStraizo
5cb594e512 Gil adjustment for Cargo Crab Colin
This PR fixes a mistake I made 10 months ago.
2026-07-12 15:43:50 -07:00
sruon
cbbf0f2121 Fix Valley of Sorrows QMs 2026-07-12 16:25:56 -06:00
Xaver
dd76cf94aa
Merge pull request #10649 from Skold177/Add-Bind-to-Mountain-Buster
[lua] Add Bind Effect to Mountain Buster
2026-07-12 23:43:35 +02:00
Skold
c3d3d8fe1b Add Bind to Mountain Buster
Adds a 13-60 seconds Bind to Mountain Buster
2026-07-12 17:16:33 -04:00
Xaver
e2c054fdd1
Merge pull request #10647 from Nobutadas/teleport-do-not-while-chocobo
[lua] Block teleports while mounted
2026-07-12 21:08:05 +02:00
Nobutadas
7c0540d90d [lua] Block teleports while mounted
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-12 20:37:36 +02:00
Xaver
0d18ae3024
Merge pull request #10631 from ThrisStraizo/bstmaatpetfix
[lua] Rewrite freshly summoned pet logic's return pos
2026-07-12 19:20:38 +02:00
ThrisStraizo
eb8aad55b6 Rewrite freshly summoned pet logic's return pos
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-12 18:52:45 +02:00
Nobutadas
9bb70605eb [cpp] Add hidden option for event 2026-07-12 11:08:09 -05:00
Xaver
e17930bd9b
Merge pull request #10638 from whiskeyhughes/fix-bringplayer-homepoint
[ipc] Fix bringPlayer sending target to Home Point instead of specified location
2026-07-12 14:58:10 +02:00
Xaver
6f4d18e48a
Merge pull request #10645 from Hatberg/mom-signpost-fixes
[lua] Fix quest getMustZone, Bastok Mom quests, Konschtat signposts
2026-07-12 12:52:36 +02:00
Joshua Hughes
7f92e6bdee Fix player transport sending target to HP instead of location
handleMessage_SendPlayerToLocation (used when the target is on a different zone-server instance than the caller) always sent the target to their Home Point instead of the caller's location, ignoring the destination coordinates entirely. Only reproducible in a multi-instance setup (multiple xi_map processes). Same-instance transport was unaffected, since it goes through a different code path (setPos()) that already used the correct flag.
2026-07-12 12:36:03 +02:00
Xaver
ba71ff8044
Merge pull request #10640 from ThrisStraizo/oztrojatrapdoor
[lua] Fix Oztroja trap door timing
2026-07-12 12:34:55 +02:00
Xaver
ee1495ea21
Merge pull request #10641 from Skold177/Fix-Windurst-6-1-Cardians-Linking
[sql] Fix Windurst 6-1 Cardians linking
2026-07-12 12:34:01 +02:00
Xaver
365f86d7d3
Merge pull request #10637 from Skold177/Fix-Caster-Check-in-mobUtils
[C++] Fix caster check in mob utils
2026-07-12 12:33:32 +02:00
Xaver
185565a35a
Merge pull request #10639 from sruon/yaml_entity_npc_enums
[core, yaml] Port SkillType / Detects / NameVis / EntityFlags to YAML
2026-07-12 12:32:29 +02:00
Xaver
f15b3aa279
Merge pull request #10635 from Skold177/Fix-Automaton-Healing
[lua] Fix Automaton Healing Calculations
2026-07-12 12:31:50 +02:00
Xaver
e6ba83d48c
Merge pull request #10642 from sruon/hagakoff
[lua] Require Astral Candescence for certain shop items; Hagakoff shop
2026-07-12 12:29:19 +02:00
Xaver-DaRed
5b59cfc2ff Rewrite "Mom the adventurer" and cleanup associated module 2026-07-12 12:23:51 +02:00
Xaver
6efe0c2d79
Merge pull request #10646 from sruon/shops_tweaks
[lua] Tweak Curry Powder and Sabiki Rig guild shop prices
2026-07-12 11:42:27 +02:00
Hatberg
2c729a3bde [lua] Fix quest getMustZone, Bastok Mom quests, Konschtat signposts 2026-07-12 11:06:30 +02:00
sruon
dc07afb62e Tweak Curry Powder and Sabiki Rig guild shop prices 2026-07-12 02:32:17 -06:00
sruon
58e2ef896e Port SkillType to YAML based enum 2026-07-11 23:38:31 -06:00
sruon
18d662bd7a Reorder Hagakoff shop and check for Candescence 2026-07-11 23:17:11 -06:00
sruon
f45a5b901e Require Astral Cadescence for certain shop items 2026-07-11 23:16:41 -06:00
Skold
29bdb5342f Fix Windurst 6-1 Cardians linking
Adds linking to the 6-1 Cardians
2026-07-12 00:56:09 -04:00
Xaver
3edc17c215
Merge pull request #10636 from Skold177/Fix-7-2-Orc-Wyvern
[sql] Fix 7-2 Orcs Wyvern
2026-07-12 06:54:28 +02:00
ThrisStraizo
c089626913 Fix Oztroja trap door timing
This PR fixes the timing of the trap door in Castle Oztroja
2026-07-11 21:46:38 -07:00
Skold
605f295f8a Fix caster check in mob utils
Adds bard to the check
2026-07-12 00:12:37 -04:00
Xaver
ba0d77fff9
Merge pull request #10633 from Nobutadas/Chocobo-sound-fix
[lua] Remove city chocobo sound on event
2026-07-12 06:09:54 +02:00
Xaver
ac2105a344
Merge pull request #10632 from CriticalXI/vendor_era_audit
[lua][module] Adds modules to rework many vendor stocks
2026-07-12 06:05:08 +02:00
Xaver
12658f3429
Merge pull request #10634 from ThrisStraizo/ninleechesaggro
[lua] Force Nin unlock leeches to aggro/claim on spawn
2026-07-12 06:01:06 +02:00
Skold
bf441f5253 Fix 7-2 Orcs Wyvern
Keeps it from casting spells
2026-07-11 23:52:39 -04:00
sruon
9eb69b546c Remove unused CNpcEntity::hpHidden 2026-07-11 21:41:00 -06:00
sruon
f492c0b74c Port Detects to YAML based enum 2026-07-11 21:41:00 -06:00
ThrisStraizo
ffb1ec6e60 Force Nin unlock leeches to aggro/claim on spawn
This PR makes the leeches from the NIN unlock quest to forcibly aggro/claim.
2026-07-11 20:32:07 -07:00
Skold
55014f2d0b Fix Automaton Healing Calculations
Fixes the healing calculations for automatons
2026-07-11 23:32:02 -04:00
Nobutadas
6223d51e06 [lua] Remove city chocobo sound on event 2026-07-11 22:24:48 -05:00
Critical
263a707e31 [lua][module] Adds modules to rework many vendor stocks 2026-07-11 21:10:30 -06:00
Xaver
cce3be6b6f
Merge pull request #10630 from ThrisStraizo/earlybirdki
[lua] Delete KIs at the correct prog for Early Bird Catches the Bookworm
2026-07-12 04:33:17 +02:00
sruon
e9af421f99 Port NameVis and EntityFlags to YAML based enums 2026-07-11 20:16:44 -06:00
ThrisStraizo
e5558d59bd Delete KIs at the correct prog for Early Bird Catches the Bookworm
This PR correctly deletes KIs for the correct progs for Early Bird Catches the Bookworm.
2026-07-11 19:06:44 -07:00
Xaver
5860513aaa
Merge pull request #10626 from Xaver-DaRed/quest
[Interaction] Rewrite "A flash in the pan" and other minor fixes
2026-07-12 04:04:48 +02:00
Xaver
bf52e62ad3
Merge pull request #10627 from sruon/qm_fixes
[sql] Fix Alzadaal QMs
2026-07-12 03:24:25 +02:00
Xaver
7ad150622a
Merge pull request #10538 from Hatberg/promyvion-vahzl-link-aggro
[sql] Promyvion-Vahzl link/aggro audit
2026-07-12 03:14:25 +02:00
Xaver
9ccb1be4a2
Merge pull request #10586 from SpencerSteed/fix/merit-recast-toau-era
[lua, sql][module] Fix ToAU/era merit ability recast bugs
2026-07-12 03:12:05 +02:00
Xaver-DaRed
b2cd6f79e9 Rewrite "A flash in the pan" and other minor fixes 2026-07-12 03:05:13 +02:00
Xaver
02d2c802e2
Merge pull request #10622 from Skold177/Content-Tags
[sql] Additional NPC Content Tags
2026-07-12 02:59:32 +02:00
Xaver
943c66a2a2
Merge pull request #10628 from ThrisStraizo/valorandhonorpos
[sql] Valor and Honor spawn point
2026-07-12 02:58:23 +02:00
Xaver
bff09d984f
Merge pull request #10629 from ThrisStraizo/beachpugilaggro
[sql] Make Beach Pugils not link
2026-07-12 02:47:03 +02:00
sruon
b2924f950b Bump NPC script name column to 64 chars 2026-07-11 18:34:02 -06:00
Skold
022a51cdfa Content Tags
Adds Content Tags to various NPCs

Co-Authored-By: Valentine-PHX <231148762+Valentine-PHX@users.noreply.github.com>
2026-07-11 20:32:17 -04:00
ThrisStraizo
7e7aa2d57b Make Beach Pugils not link
As it turns out, beach pugils shouldn't link.
2026-07-11 17:19:37 -07:00
sruon
1f0ab1815b Fix Wajaom NPC stray position 2026-07-11 18:18:41 -06:00
Xaver
b22190ce1f
Merge pull request #10625 from Skold177/Superlink-BCNMs
[lua] Add Superlink to Kindred Spirits
2026-07-12 02:07:41 +02:00
ThrisStraizo
c1e9145136 Valor and Honor spawn point
Make Valor and Honor spawn in water as Tanaka intended
2026-07-11 17:02:16 -07:00
Xaver
015fca4c1b
Merge pull request #10623 from Skold177/PUP-Module-Attachment-Fixes
[lua] PUP Era Module Bug Fixes
2026-07-12 01:54:44 +02:00
Xaver
701c50380a
Merge pull request #10620 from Aeshur/rakaznar-transit-devices
[lua] Add Ra'Kaznar elevators
2026-07-12 01:54:10 +02:00
Xaver
a8d7283ba3
Merge pull request #10624 from sruon/gs_tweaks
[lua, sql] Guild Shops tweaks
2026-07-12 01:53:03 +02:00
sruon
56d2e7bc07 Fix Alzadaal QMs 2026-07-11 17:51:21 -06:00
Skold
f9d8828dbe Add Superlink to Kindred Spirits
Adds Superlink to Kindred Spirits
2026-07-11 18:38:24 -04:00
sruon
0129055a23 Enable Hocho in guild shops 2026-07-11 16:21:09 -06:00
sruon
c1b430a99f Tweak fishing guild shops 2026-07-11 16:21:09 -06:00
sruon
1109fe03ba Tweak Wahnid guild shop restocks 2026-07-11 16:21:09 -06:00
sruon
cb35499538 Tweak Bornahn supply 2026-07-11 16:19:34 -06:00
Skold
4aadfe2ddb PUP Era Module Bug Fixes
Reduces the Ranged Attack Cooldown Reduction of Drum Magazine. Prevents Economizer from activating without Dark Manuevers.
2026-07-11 18:07:58 -04:00
Aeshur
14bcb059c9 [lua] Add Ra'Kaznar elevators 2026-07-11 17:36:24 -04:00
montijin
e06e433097
Fix the base sell values of 11 more items. (#10621)
* Fix more BaseSell Values

* Fix typo in item_basic.sql price correction
2026-07-11 21:26:48 +00:00
Xaver
8c85f08622
Merge pull request #10619 from sruon/yaml_zone_mob_enums
[core, yaml] Migrate SPAWNTYPE/BEHAVIOR/ROAMFLAG/IMMUNITY/ZONETYPE/ZONEMISC enums to YAML
2026-07-11 22:16:08 +02:00
Xaver
ff8c24ca2e
Merge pull request #10615 from Nobutadas/cutscene-drop-emnity-scent
[C++] Set scent tracking mobs to deaggro on m_Locked
2026-07-11 21:02:10 +02:00
sruon
fd48af3475 Move enum_traits.h to common for cross-module enum use 2026-07-11 12:56:51 -06:00
Xaver
cc80235e8d
Merge pull request #10612 from Xaver-DaRed/Porphyrion
Document Upper Delkfutts Tower Key ??? npc
2026-07-11 20:33:01 +02:00
Xaver
bb24ba0fb6
Merge pull request #10610 from Xaver-DaRed/Konchtat-qms
[Fix] Audit Konchtat Highlands ??? npcs
2026-07-11 20:32:42 +02:00
Xaver
8bb60cb235
Merge pull request #10617 from console08/patch-1
Fix Tutorial Quest Step 10 Copper A.M.A.N. Voucher reward
2026-07-11 19:52:32 +02:00
Xaver
32aa504e2b
Merge pull request #10618 from Frankie-hz/posfixe
[sql] Fixes a few mobs stuck in huts inside Maze of Shakhrami
2026-07-11 19:50:37 +02:00
Frankie-hz
699d97010e [sql] Maze of Shakhrami position fixes 2026-07-11 12:40:10 -04:00
console08
e9eca07d85
Fix Tutorial Quest Step 10 Copper A.M.A.N. Voucher reward 2026-07-11 08:24:58 -07:00
Xaver
47063b98e1
Merge pull request #10614 from Nobutadas/Phuabo-can-rengage-after-dive
[lua] Phuabo AI breaks in disengage
2026-07-11 16:59:04 +02:00
Xaver
d7c55ababa
Merge pull request #10616 from Nobutadas/windurst-2-2-fail-breaks-2-3-cutscene
[lua] Reset mission status for failed Windurst 2-2
2026-07-11 16:44:50 +02:00
Nobutadas
c0a29c8b82 [lua] Fix bug in Phuabo deaggro 2026-07-11 09:06:35 -05:00
Nobutadas
8178fcb358 [lua] Reset mission status of failed Windurst 2-2 2026-07-11 08:49:28 -05:00
Nobutadas
42fdeed3aa [C++] Set all mobs to deaggro on m_Locked 2026-07-11 08:07:20 -05:00
Xaver
72884e46b7
Merge pull request #10613 from Xaver-DaRed/missing-param
[Fix] Add back missing parameter to status AEs deleted on accident
2026-07-11 14:14:16 +02:00
Xaver-DaRed
29587c0c6b Add back missing parameter to status AEs deleted on accident 2026-07-11 13:39:20 +02:00
Xaver-DaRed
59091656d2 Document Upper Delkfutts Tower Key ??? npc 2026-07-11 13:24:20 +02:00
Xaver-DaRed
19859722be Audit Konchtat Highlands ??? npcs and associated quests
Co-Authored-By: Hatberg <Hatberg@users.noreply.github.com>
2026-07-11 13:00:45 +02:00
Xaver
fa9cfec718
Merge pull request #10609 from Aeshur/rala-sluice-gates
[lua] Add Rala Waterways sluice gate handlers
2026-07-11 12:45:52 +02:00
Xaver
27d92620cf
Merge pull request #10575 from Skold177/Fix-Early-Bird-Catches-the-Wyrm
[lua] Fix Wyrm Draw-in Location
2026-07-11 12:38:47 +02:00
sruon
2f21b285f2 Port ZoneMisc to YAML based enum 2026-07-11 02:59:18 -06:00
sruon
1e3fcf944b Port ZoneType to YAML based enum 2026-07-11 02:48:57 -06:00
sruon
7371778b01 Port Immunity to YAML based enum 2026-07-11 02:41:03 -06:00
sruon
0d787f284a Port RoamFlag to YAML based enum 2026-07-11 02:23:21 -06:00
sruon
9757ca7525 Port Behavior to YAML based enum 2026-07-11 02:23:21 -06:00
sruon
0a6004fd61 Port Weather and SpawnType to YAML based enums 2026-07-11 01:45:50 -06:00
Xaver
8c5864634d
Merge pull request #10608 from ThrisStraizo/angrycrabs
[lua] Update Knight Crabs and KA to always Aggro
2026-07-11 09:42:08 +02:00
ThrisStraizo
23188affbe Update Knight Crabs and KA to always Aggro
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-11 09:11:14 +02:00
Aeshur
fe280e6add [lua] Add Rala Waterways sluice gate handlers 2026-07-11 02:46:12 -04:00
Xaver
6e3d46a3dc
Merge pull request #10606 from sruon/flaky_tests_fixes
[test] Tweak flaky tests
2026-07-11 08:40:07 +02:00
Xaver
480fb0abc8
Merge pull request #10607 from ThrisStraizo/frairslanternjobfix
[sql] Friars Lantern (no grow) job fix
2026-07-11 08:40:05 +02:00
Xaver
70c5252ceb
Merge pull request #10605 from Frankie-hz/itemlog
[cpp] Adds extra logging for ITEM_TRANSFER packet on reserved items
2026-07-11 08:36:31 +02:00
ThrisStraizo
a87b0dbefa Friars Lantern (no grow) job fix
Skold's evidence shows ALL are war/blm
2026-07-10 22:56:02 -07:00
Xaver
7fefff75cd
Merge pull request #10599 from ThrisStraizo/frairslanternstandback
[sql] Friars Lantern no standback fix
2026-07-11 07:48:22 +02:00
sruon
37ceb569d8 Tweak flaky tests 2026-07-10 23:31:57 -06:00
Frankie-hz
e1def3711c [cpp] Adds extra logging for ITEM_TRANSFER packet on reserved items 2026-07-11 01:31:18 -04:00
Xaver
d1b913a40c
Merge pull request #10604 from Skold177/Fix-Kuftal-Rock
[sql] Fix Kuftal Rock always being down
2026-07-11 07:03:59 +02:00
Xaver
12b49cf72c
Merge pull request #10600 from Skold177/Fix-Porphyrion
[sql] Fix Porphyrion Mob Family
2026-07-11 06:52:50 +02:00
Xaver
b5c0510729
Merge pull request #10603 from ThrisStraizo/fafres
[sql] Faf/Nidhogg removal of immunities in SQL
2026-07-11 06:24:16 +02:00
Xaver
408ec0779a
Merge pull request #10602 from Skold177/Fix-RSE-Quest-Dialogue
[lua] Fix RSE Quest Dialogue
2026-07-11 06:20:49 +02:00
Xaver
63c603f22a
Merge pull request #10594 from CriticalXI/tiamat_drop_module
[sql][module] Adds module to revert Tiamat to drop Herald's Gaiters
2026-07-11 06:18:32 +02:00
Xaver
4c9ed7641e
Merge pull request #10595 from Skold177/Repair-Message-Fix
Fix PUP Module Repair Message
2026-07-11 06:18:04 +02:00
Skold
cbea124907 Fix Kuftal Rock always being down
Sets the default position to DOOR_CLOSED
2026-07-11 00:06:19 -04:00
Xaver
a89065aef2
Merge pull request #10593 from sruon/paralyze_msg
[core] Tweak Paralyze message; Consume Blood Pact CD on paralyze
2026-07-11 06:05:53 +02:00
Xaver
b39a3f4cd1
Merge pull request #10597 from sruon/bolts_add
[fix] Fix bolts additional effects typo
2026-07-11 06:04:48 +02:00
Xaver
55ffb344c2
Merge pull request #10591 from ThrisStraizo/kaadjust
[lua] [sql] King Arthro adjustments
2026-07-11 06:03:55 +02:00
Xaver
26f50d2f3f
Merge pull request #10601 from sruon/wajaom_tablets
[sql] Fix Wajaom Engraved Tablet models
2026-07-11 06:02:32 +02:00
Xaver
c385ac0241
Merge pull request #10590 from Frankie-hz/abysseamobs
[sql] Adds content tags to Abyssea mobs
2026-07-11 06:00:58 +02:00
ThrisStraizo
10cf025104 Faf/Nidhogg removal of immunities in SQL
Faf/Nidhogg had overlooked immunities to bind/paralyze in SQL.

These mobs have already been thoroughly researched and their immunities have been added to lua
2026-07-10 20:57:54 -07:00
Skold
250a16a337 Fix RSE Quest Dialogue
Fixes RSE Quest Dialogue
2026-07-10 23:31:32 -04:00
Xaver
02d01a3b64
Merge pull request #10592 from Frankie-hz/itgfixes
[sql] Changes seethers in promyvion zones to check as a normal mob
2026-07-11 05:11:44 +02:00
sruon
5636a9ca0d Fix Wajaom Tablet models 2026-07-10 20:45:53 -06:00
ThrisStraizo
537b17e0ad Friars Lantern no standback fix
This PR swaps the job/subjobs of friars lanterns so they don't stand back.
2026-07-10 19:39:20 -07:00
Skold
d05a9d8aae Fix Porphyrion Mob Family
Turns him into a Gigas
2026-07-10 22:38:02 -04:00
sruon
754b27b4a3 Fix bolts addEffect typo 2026-07-10 20:16:14 -06:00
Skold
997d2d5663 Fix PUP Module Repair Message
Changes the message to not display 0 HP
2026-07-10 21:33:54 -04:00
Frankie-hz
43688b4157 [sql] Adds content tags to Abyssea mobs 2026-07-10 21:17:02 -04:00
Critical
66a1cf00b1 [sql][module] Adds module to revert Tiamat to drop Herald's Gaiters 2026-07-10 18:51:45 -06:00
ThrisStraizo
e772cd2c97 King Arthro adjustments
This PR adjusts King Arthro's def, res, casting AI, gil, delay and paralyze power.
2026-07-10 17:46:35 -07:00
sruon
24e0a479ce Apply cooldown to Blood Pact on paralyze proc 2026-07-10 18:22:12 -06:00
sruon
861383ecf4 Single message on paralyze proc 2026-07-10 18:21:58 -06:00
Frankie-hz
cc658b5923 [sql] Adds mob pool for Seethers in regular Promy zones 2026-07-10 20:13:42 -04:00
Xaver
72939618aa
Merge pull request #10577 from Nobutadas/neutral-conquest-state
[cpp][sql][lua] Conquest: add Neutral region control
2026-07-11 02:13:15 +02:00
Skold177
da6e3e05bb Fix Wyrm Draw-in Location
Swaps a - coordinate for a positive one
2026-07-10 19:19:36 -04:00
Xaver
3a88c758f3
Merge pull request #10585 from Xaver-DaRed/modulebs
Update `calculateAbsorbtion` and `calcullateNullification` in modules
2026-07-11 01:00:34 +02:00
Xaver
85688aca65
Merge pull request #10589 from sruon/lockstyle_err
[core] Tighten lockstyle checks
2026-07-11 00:25:10 +02:00
Xaver-DaRed
bb490d3e07 Update modules combat folder location and structure 2026-07-10 23:52:51 +02:00
Xaver-DaRed
4193cadd0d Update calculateAbsorbtion and calcullateNullification in modules 2026-07-10 23:50:22 +02:00
Xaver
8a39084e82
Merge pull request #10588 from Xaver-DaRed/crystal-overflow
[Fix] Cap crystal trade overflow conquest points to 1000
2026-07-10 22:53:17 +02:00
sruon
276039e2bf Reject lockstyle if item can't be equipped / has wrong skill type 2026-07-10 14:49:26 -06:00
Xaver
220cf56dfc
Merge pull request #10587 from KiplingFFXI/Zoredonite-Bug-Fixes
[lua] Zoredonite Bug Fixes
2026-07-10 22:45:01 +02:00
Kipling
a25adffece Zoredonite Bug Fixes 2026-07-10 13:20:46 -07:00
Xaver-DaRed
a828ff707d Cap crystal trade overflow conquest points to 1000 2026-07-10 22:18:57 +02:00
Xaver
4483c3717f
Merge pull request #10584 from Skold177/lua]-Rename-mob-files-to-match-case-of-SQL
[lua] Rename mob files to match SQL
2026-07-10 22:06:41 +02:00
Spencer Steed
6faf88039e [sql, lua][module] Fix ToAU/era merit ability recast bugs
Wire Super Jump and Weapon Bash meritModIDs, use action:setRecast for era Sange/Scavenge, align Snake Eye/Fold/Fealty formulas with 150s merit values, and fix weapon_bash_effect SQL name.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 15:02:27 -05:00
sruon
bb8bbc0042 Reject lockstyle if item is no longer owned 2026-07-10 13:29:31 -06:00
Xaver
04cf10aed5
Merge pull request #10583 from sruon/totd_sleeping_zones
[fix] Handle TOTD despawning differently in sleeping zones
2026-07-10 21:22:53 +02:00
Skold177
040b72b608 [lua] Rename mob files to match SQL
Changed all the ones I found
2026-07-10 15:02:54 -04:00
Xaver
e8f7e6600e
Merge pull request #10581 from Skold177/Add-TP-clamp-to-aftermath-handler
[lua] Add TP Clamp to Aftermath handler
2026-07-10 20:38:48 +02:00
sruon
cb3466db14 Handle TOTD despawning differently in sleeping zones 2026-07-10 12:30:09 -06:00
Xaver
dc4e70b64a
Merge pull request #10579 from Xaver-DaRed/avatarTPspells
[Fix] Ifrit's TP spells
2026-07-10 20:17:18 +02:00
Skold177
449d422eb2 Add TP Clamp to Aftermath handler
Ensures atleast 1000 tp is fed to the handler
2026-07-10 14:09:16 -04:00
Xaver-DaRed
9344a4348e Fix Ifrit's TP spells 2026-07-10 19:47:27 +02:00
Nobutadas
63812beca3 [cpp][sql][lua] Add Neutral region control 2026-07-10 11:34:57 -05:00
Xaver
55b5955109
Merge pull request #10576 from Xaver-DaRed/more
[Bandaid] Blue spell ecosystem being nil
2026-07-10 18:20:30 +02:00
Xaver-DaRed
791af1b250 Bandaid: Blue spell ecosystem being nil 2026-07-10 17:38:47 +02:00
Xaver
bcc4565225
Merge pull request #10564 from Xaver-DaRed/maat
[Fix] Maat testimony check
2026-07-10 17:01:58 +02:00
Xaver
ec6af00b7c
Merge pull request #10570 from Skold177/More-Content-Tags
[sql] Correct Crimson-Toothed Pawberry qm / Content Tag Toppi-Meppi
2026-07-10 16:49:44 +02:00
Xaver
9e1afc51a8
Merge pull request #10566 from Auzali/add-ROTZ-tags-501-550
[sql] Audit some synthesis content tags (501-550)
2026-07-10 16:49:00 +02:00
Xaver
d201f205ca
Merge pull request #10574 from KiplingFFXI/Xolotl-Fixes
[lua] Xolotl Bug Fixes
2026-07-10 16:41:25 +02:00
Xaver
390bf3a238
Merge pull request #10565 from Skold177/Photosynthesis-Bugfix
[lua] [sql] Add Mandragora & Sabotender Photosynthesis
2026-07-10 16:32:36 +02:00
Xaver
6f4bb93579
Merge pull request #10569 from sruon/gshop_tweaks
[lua] Tweak guild shops target stock
2026-07-10 16:31:23 +02:00
Xaver
2cddd6f3dc
Merge pull request #10572 from Skold177/Seiryu-Job
[lua] [sql] Update Seiryu to WAR/RDM
2026-07-10 16:28:16 +02:00
Kipling
1342b15f2b Xolotl Bug Fixes 2026-07-10 01:03:31 -07:00
Zach Toogood
b5c284bc46
Merge pull request #10568 from sruon/chocobo_toteboard
[core, lua] Remaining Chocobo Racing packets; Toteboard NPCs
2026-07-10 09:51:36 +02:00
Zach Toogood
eb0e85d327
Merge pull request #10571 from sruon/item_transfer_log
[core] Log item name and ID when a locked trade happens
2026-07-10 09:50:58 +02:00
Zach Toogood
c75853fe3e
Merge pull request #10573 from sruon/asan_crash_linkshell
[core] Unequip linkshell and rebind new when changing item during promotion
2026-07-10 09:50:14 +02:00
sruon
6c814f7b5d Unequip linkshell and rebind new when changing item during promotion 2026-07-10 00:19:37 -06:00
Skold
b9e43e6809 Update Seiryi to WAR/RDM
Changes the job based on capture.
2026-07-10 02:00:34 -04:00
sruon
6e462ea3ca Log item name and ID when a locked trade happens 2026-07-10 00:00:31 -06:00
Skold
d7d0f4fa8d Fix Crimson Pawberry QM and Toppi-Meppi Content Tag
Adds some more content tags, fixes tonberry mitts NM
2026-07-10 01:56:51 -04:00
sruon
f5f660bb21 Tweak guild shops target stock 2026-07-09 23:15:44 -06:00
WinterSolstice8
aaa1c3082b
Merge pull request #10567 from Skold177/Fix-Tateeya-from-accepting-more-than-1-attachment
[lua] Fix Tateeya Attachment Trade
2026-07-09 23:12:30 -06:00
sruon
cc544e832d Toteboard packets 2026-07-09 22:49:19 -06:00
Skold
6d1a597101 Fix Tateeya Attachment Trade
Prevents more than 1 item from being accepted
2026-07-09 23:46:17 -04:00
Skold
6aab1e5994 Add Mandragora / Sabotender Photosynthesis
Adds Mandragora / Sabotender Photosynthesis
2026-07-09 23:20:02 -04:00
Xaver
ebb2284584
Merge pull request #10542 from Xaver-DaRed/arrows
[Combat] Add physical checks to nullification and absobption, convert Spikes, and audit some Ammo Additional effects
2026-07-10 05:14:12 +02:00
taylorleary
25da384ae3 [sql] Audit some synthesis content tags (501-550) 2026-07-09 22:23:44 -04:00
Xaver-DaRed
c76adfe30f Fix maat testimony check 2026-07-10 03:50:17 +02:00
Xaver
19a6b3511c
Merge pull request #10479 from CriticalXI/summoner_adjust
[lua,sql,cpp][module] Summoner era modules and adjustments
2026-07-10 02:15:42 +02:00
Xaver
9e943a5fe4
Merge pull request #10560 from Skold177/Mog-House-Exit-Module
[lua] Mog House Exit Event Module
2026-07-10 02:00:38 +02:00
Xaver
8ebec83cc6
Merge pull request #10557 from Skold177/Add-some-NPC-Content-Tags
[sql] Content Tag some NPCs
2026-07-10 02:00:19 +02:00
Critical
716edd3d20 [lua,sql,cpp][module] Summoner era modules and adjustments 2026-07-09 17:12:00 -06:00
Skold177
81d17575e0 Content Tag some NPCs
Adds some content tags for outdoor zones and cities.

Co-Authored-By: John Smith <215467762+normalname33@users.noreply.github.com>
2026-07-09 19:09:34 -04:00
Xaver
5d04fa0fe7
Merge pull request #10559 from sruon/30260703_new_entities
[sql] July 2026 new entities + fix QMs
2026-07-10 00:45:00 +02:00
Skold
3949d478e2 Mog House Exit Event Module
Adds a module for the old mog house job change exit prompt.
2026-07-09 18:20:25 -04:00
sruon
2b14759cf4 Fix Uggalepih mismatched QMs 2026-07-09 15:03:35 -06:00
sruon
4366bb16a6 Fix Yhoator mismatched QMs 2026-07-09 15:03:35 -06:00
sruon
bfe844b369 Fix Jugner mismatched QMs 2026-07-09 15:03:35 -06:00
sruon
b0efbca15b Fix SGusta mismatched QMs 2026-07-09 15:03:35 -06:00
sruon
296ec74650 Fix Wajaom mismatched QMs 2026-07-09 15:03:35 -06:00
sruon
1075ee0e03 Fix Bhaflau mismatched QMs 2026-07-09 15:03:35 -06:00
sruon
bc0a41c69a New mobs in Stellar Fulcrum
Stellar Fulcrum new BCNM
2026-07-09 15:03:35 -06:00
sruon
15a2b093c1 Shift NPCs up in Stellar Fulcrum 2026-07-09 15:03:34 -06:00
sruon
492c86ab6f Temenos entities rework 2026-07-09 15:03:34 -06:00
Xaver-DaRed
89c3abef4f Kill finalMagicNonSpellAdjustments() 2026-07-09 20:47:23 +02:00
Xaver-DaRed
66197fbad0 Make mob spikes use their own spikes global system 2026-07-09 20:33:49 +02:00
Xaver-DaRed
7a055dc19f Convert Excalibur to new AE system and normalize parameters 2026-07-09 20:33:48 +02:00
Xaver-DaRed
25112ad6fe Edit calculateNullification() to account for non-magical damage source 2026-07-09 20:33:48 +02:00
Xaver-DaRed
ad00b54ec2 Edit calculateAbsorption() to account for non-magical damage sources 2026-07-09 20:33:48 +02:00
Xaver-DaRed
e2880c6a41 Audit some Arrows/Bolts Additional effect: Elemental damage 2026-07-09 20:33:48 +02:00
Xaver
b6d799f3c4
Merge pull request #10544 from ThrisStraizo/startermobdamage
[lua] Adjust starter mob attack to match retail damage
2026-07-09 19:42:36 +02:00
Xaver
60851c362e
Merge pull request #10555 from montijin/cherry-muffin-recipe-fix
Correct HQ results for Cherry Muffin Recipe
2026-07-09 19:42:10 +02:00
Xaver
2516316dba
Merge pull request #10556 from sruon/post_maint_leather
[lua] Tweak Leather guild shop initial stock
2026-07-09 19:41:41 +02:00
sruon
5e018a4779 Phantom Gem Box NPC in cities 2026-07-09 10:43:54 -06:00
WinterSolstice8
88c6075b57
Merge pull request #10539 from cocosolos/step-limit
Increase constexpr steps limit for clang builds
2026-07-09 10:38:41 -06:00
sruon
f64a9b34a5 Tweak Leather guild shop initial stock 2026-07-09 10:36:03 -06:00
Montijin
f38a1c5106 Correct HQ results for Cherry Muffin Recipe 2026-07-09 10:13:56 -05:00
Xaver
0ffb464acf
Merge pull request #10545 from Skold177/era-skillchain
[lua] Era Skillchain Module
2026-07-09 16:30:02 +02:00
Xaver
ddbd0530b3
Merge pull request #10554 from Skold177/Tiamat-Bugfix
[lua] Tiamat Mighty Strikes Bugfix
2026-07-09 16:20:18 +02:00
Skold177
6f5b60c3e7 Era Skillchain Module
Adds a Era Skillchain Module
2026-07-09 10:03:50 -04:00
Skold
3855c78e96 Tiamat Mighty Strikes Bugfix
Fixes Mighty Strikes
2026-07-09 09:47:05 -04:00
Xaver
05794af70b
Merge pull request #10552 from sruon/post_maint_guild
[lua] Adjust guild initial stocks
2026-07-09 11:28:21 +02:00
Xaver
f7864f2272
Merge pull request #10551 from sruon/30260703_1
[client] July 2026 Version Update 30260703 1
2026-07-09 11:07:48 +02:00
sruon
e5a496c50f Adjust guild initial stocks 2026-07-09 01:10:34 -06:00
sruon
14be6366c0 [July 2026 VU] Cities NPC shifts 2026-07-09 00:37:42 -06:00
Xaver
151d0fcb26
Merge pull request #10550 from Skold177/Jormungand
[lua] [sql] Update Grand Wyrms, add Revilers Helm
2026-07-09 08:26:01 +02:00
sruon
b4f0d85a64 [July 2026 VU] New items
Dark Amood gained MysteryBox flag
2026-07-09 00:20:12 -06:00
sruon
249ae3830f [July 2026 VU] String shifts 2026-07-09 00:20:12 -06:00
sruon
4d311b479d [July 2026 VU] Disable level correction in Stellar Fulcrum 2026-07-09 00:08:22 -06:00
Xaver
11ba14934c
Merge pull request #10546 from KiplingFFXI/Sky-Timer-Cleanups
Sky NM + Vodyanoi Respawn/Cleanup
2026-07-09 08:02:13 +02:00
sruon
2f779f9a01 Bump client version July 2026 VU 2026-07-08 23:57:56 -06:00
Xaver
d4f888c8a4
Merge pull request #10548 from Skold177/capcallskills
[lua] Add Automaton Skills to !capallskills
2026-07-09 07:49:14 +02:00
Xaver
6433dbdc1a
Merge pull request #10549 from WinterSolstice8/rycharde
[lua] Don't lock Dhalmel Meat when not necessary
2026-07-09 07:48:35 +02:00
Skold177
c410cacf43 Update Grand Wyrms, Add Revilers Helm
Refactors Jormungand/Vrtra, also cleans up Tiamat some more after realizing it could be cleaner.
2026-07-09 01:33:21 -04:00
Corey Sotiropoulos
ccd146cd1a
Bump constexpr steps limit for clang builds 2026-07-09 03:42:33 +00:00
WinterSolstice8
2927d1c5ad
Merge pull request #10547 from WinterSolstice8/jakaka_fix
[lua] Fix Jakaka trigger function accessing nil
2026-07-08 21:34:07 -06:00
WinterSolstice8
72d5fbd05c [lua] Don't lock Dhalmel Meat when not necessary 2026-07-08 21:19:01 -06:00
Skold
1e11ee9c45 Add Automaton Skills to !capallskills
Add automaton skills to !calcallskills
2026-07-08 23:18:56 -04:00
WinterSolstice8
acad0e8b44 [lua] Fix Jakaka trigger function accessing nil 2026-07-08 20:20:01 -06:00
Kipling
8dc35237e6 Sky Respawn Timer Cleanup 2026-07-08 18:38:40 -07:00
ThrisStraizo
0868d148c9 Adjust starter mob attack to match retail damage
This PR adjusts the attack of starter mobs to deal the same damage observed on retail.
2026-07-08 17:00:04 -07:00
Zach Toogood
f950fe0076
Merge pull request #10533 from cocosolos/mac-test
[ci] Run xi_test on macOS
2026-07-08 21:04:44 +02:00
Hatberg
059ac98622 Promyvion-Vahzl link/aggro audit 2026-07-08 19:39:20 +02:00
WinterSolstice8
eee6d6d873
Merge pull request #10537 from sruon/npc_sell_prices
[sql] NPC sell prices audit
2026-07-08 10:52:22 -06:00
Xaver
bf22459568
Merge pull request #10534 from sruon/choco_racing_pkt
[core] Chocobo Racing packets and binding
2026-07-08 18:42:11 +02:00
Xaver
affbd99c33
Merge pull request #10536 from Skold177/Attachment-Burdens
[lua] Attachment Burden Penalties
2026-07-08 18:41:43 +02:00
sruon
1e5e6d049b Update NPC sell prices to retail values
Co-Authored-By: montijin <2160211+montijin@users.noreply.github.com>
2026-07-08 10:25:32 -06:00
Skold
2f61c8fa48 Attachment Burden Values
Adds Attachment Burden Values for Flame Holder, Ice Maker, Barrage Turbine, Economizer, Eraser, Heat Capacitor, and Replicator.
2026-07-08 10:31:07 -04:00
Xaver
65e308fe50
Merge pull request #10530 from Xaver-DaRed/combat3
[lua] Move `combat` folder outside `globals` and make it load before it
2026-07-08 15:37:56 +02:00
Xaver-DaRed
0fb133ed39 Cleanup requires and hook to lua loading
Co-Authored-By: sruon <sruon@users.noreply.github.com>
2026-07-08 14:07:25 +02:00
sruon
1494a9978c Chocobo racing packets/bindings 2026-07-07 19:30:37 -06:00
Xaver
0573193955
Merge pull request #10532 from Skold177/Refactor-Tiamat
[lua] Refactor Tiamat
2026-07-08 02:55:08 +02:00
Xaver
540b63aeff
Merge pull request #10529 from Skold177/Puppetmaster-Modules
[sql] [lua] ToAU Era PUP Module Suite
2026-07-08 02:32:18 +02:00
Skold
8f24765549 Refactor Tiamat
Cleans up code, caches extra locals, make it easier to read. No changes.
2026-07-07 20:23:43 -04:00
Xaver
cb4ec8bb51
Merge pull request #10531 from Nobutadas/ulhpemde-no-dive
[lua] Stop Ul'hpemde from diving
2026-07-08 02:03:46 +02:00
Skold177
5dfabb93d4 ToAU Era PUP Module Suite
Recreates ToAU Era Puppetmaster.
2026-07-07 17:58:07 -04:00
Nobutadas
a5e540db62 [lua] Stop Ul'hpemde from diving 2026-07-07 15:57:29 -05:00
Xaver-DaRed
852d89ff9b Move Combat folder outside globals folder 2026-07-07 20:28:23 +02:00
Xaver
666feae62e
Merge pull request #10528 from Nobutadas/can-not-redeem-exp-voucher
[lua] Allow purchase of exp ring with voucher
2026-07-07 19:53:05 +02:00
WinterSolstice8
b03c54d860
Merge pull request #10523 from Xaver-DaRed/sc-cleanup
[Cleanup] Old skillchain code
2026-07-07 11:40:44 -06:00
Nobutadas
150d7cb6d6 [lua] Allow purchase of exp ring with voucher 2026-07-07 10:37:06 -05:00
Xaver
94e1231146
Merge pull request #10500 from Nobutadas/conquest-guards-reward-expeditionary-force
[lua] Enable EF conversations with conquest guards
2026-07-07 14:58:03 +02:00
Nobutadas
cc49e49f3c [lua] Enable EF conversations with conquest guards
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-07-07 13:11:20 +02:00
Xaver
b1ec7ad858
Merge pull request #10524 from Auzali/add-ROTZ-tags-451-500
[sql] Audit some synthesis content tags (451-500)
2026-07-07 10:11:06 +02:00
Xaver
8e48ad1306
Merge pull request #10525 from KiplingFFXI/Cyranuce-M-Cutauleon-Audits
Cyranuce M Cutauleon Audits
2026-07-07 09:59:46 +02:00
Xaver
89bbc7b68e
Merge pull request #10527 from ThrisStraizo/crossattackboost
[lua] Update Glyryvilu's Cross Attack
2026-07-07 09:59:23 +02:00
ThrisStraizo
8859bb47ae Update Glyryvilu's Cross Attack
This PR appropriately juices Glyryvilu's Cross Attack to send adventurers into the shadow realm.
2026-07-06 22:30:52 -07:00
Kipling
18bd8fb860 DRG Job Quest NM Audits 2026-07-06 22:19:52 -07:00
Xaver
51fedb9f8d
Merge pull request #10520 from Skold177/Skill_FTP_Modifier
[core] [C++] [lua] Mobskill specific fTP adjustment bindings
2026-07-07 06:42:18 +02:00
Xaver
8c7ab50653
Merge pull request #10522 from ThrisStraizo/khimmyadjust
[lua] [sql] Add Khimaira res ranks
2026-07-07 06:09:06 +02:00
taylorleary
7095c79d16 [sql] Audit some synthesis content tags (451-500) 2026-07-06 23:39:35 -04:00
Xaver
39d127a795
Merge pull request #10519 from WinterSolstice8/login_otp_display
[login] Set OTP features bit if account has OTP enabled
2026-07-07 05:37:35 +02:00
Xaver-DaRed
6081d81522 Cleanup old skillchain code 2026-07-07 05:36:46 +02:00
Skold
ec936a6b35 Skill Specific fTP Binding
Adds a lua binding to increase the fTP modifier of mobskills.
2026-07-06 23:32:02 -04:00
ThrisStraizo
ab94cec20e Add Khimaira res ranks
This PR adjusts Khimairas res ranks and correct gil drop value.
2026-07-06 19:29:36 -07:00
Xaver
3a95395b65
Merge pull request #10521 from Xaver-DaRed/interruption
[Fix] Prevent interruption during chainspell
2026-07-07 03:05:13 +02:00
Xaver-DaRed
e10c72ac99 Prevent interruption during chainspell 2026-07-07 01:58:13 +02:00
Xaver
cb8aa9e206
Merge pull request #10517 from Xaver-DaRed/combat
[Combat] General cleanup and prep work for other changes
2026-07-07 01:54:24 +02:00
WinterSolstice8
2fc73083ae [login] Set OTP features bit if account has OTP enabled 2026-07-06 17:14:35 -06:00
Xaver-DaRed
94e43ac5a7 Audit status effect removal location for spell-specific effects 2026-07-06 22:30:45 +02:00
Zach Toogood
f90cc5836b
Merge pull request #10508 from LandSandBoat/cpp23
Core: Upgrade to C++23
2026-07-06 20:39:17 +01:00
Zach Toogood
9868e8ee82 Test: Init Catch2 after TestApplication 2026-07-06 11:34:07 -06:00
Zach Toogood
7b721271d5 Test: Add Catch2 tests 2026-07-06 11:34:07 -06:00
Zach Toogood
9248f142ea Core: Tidy Variant 2026-07-06 11:34:07 -06:00
Zach Toogood
eba66c5f0e Core: Introduce Heap 2026-07-06 11:34:07 -06:00
Zach Toogood
8fd37f9a15 Core: Add lint exception for pq.pop() 2026-07-06 11:34:07 -06:00
Zach Toogood
e1eca269b0 Chore: Run and tidy a chunk of IWYU warnings 2026-07-06 11:34:07 -06:00
Zach Toogood
47e1618820 Core: Upgrade to C++23
- Add Fn = std::move_only_function alias (as a polyfill)
- Fix lifetime issues in ConsoleService handoff
- Propagate use of Fn, HashMap, FlatHashMap, Maybe, ErrorOr
- Find (and kind of force) the use of deducing this
2026-07-06 11:34:06 -06:00
Zach Toogood
17cc7389ad Core: Upgrade build to C++23 2026-07-06 11:33:21 -06:00
Xaver
836c113fe0
Merge pull request #10518 from sruon/yaml_claim_spawn_enums
[core, lua, yaml] Convert ClaimType, SpawnAnimation, AttackType, MobType to YAML based enums
2026-07-06 19:28:53 +02:00
sruon
86f73d04e8 Port MobType to YAML based enum 2026-07-06 10:25:32 -06:00
sruon
a4a25ca765 Port AttackType to YAML based enum 2026-07-06 10:25:32 -06:00
sruon
2c7fc37eae Port SpawnAnimation to YAML based enum 2026-07-06 10:25:32 -06:00
sruon
fd0caff31b Port ClaimType to YAML based enum 2026-07-06 10:25:32 -06:00
Xaver-DaRed
9a78254070 Audit some requires 2026-07-06 15:47:53 +02:00
Xaver-DaRed
0b36e6bc14 Rework magic burst multiplier function 2026-07-06 15:47:33 +02:00
Xaver-DaRed
42e0613c87 Move magic burst script to combat folder and update usage and requires 2026-07-06 15:35:18 +02:00
Xaver-DaRed
6045f90b6e Globalize 2 spell tables
Dont push it
2026-07-06 14:51:33 +02:00
Xaver-DaRed
fd7a828c65 Move job points enum file to the enum folder 2026-07-06 12:35:55 +02:00
Xaver
e84e5f873a
Merge pull request #10514 from Auzali/add-ROTZ-tags-401-450
[sql] Audit some synthesis content tags (401-450)
2026-07-06 11:01:34 +02:00
Xaver
b5473a51cb
Merge pull request #10516 from sruon/ability_failed_ja_freeze
[core] Skip animation lock if JA couldnt be fired
2026-07-06 11:00:12 +02:00
Xaver
ab488be5fb
Merge pull request #10513 from Skold177/Reduce-Ranged-Attack-Damage
[lua] Reduce Ranged Attack to 1.0 fTP
2026-07-06 10:59:25 +02:00
Xaver
702e0b0135
Merge pull request #10512 from ThrisStraizo/treechests
[lua] Retail Accurate Boyahda Tree Coffer Positions
2026-07-06 10:58:33 +02:00
Xaver
0fe2d13ba8
Merge pull request #10511 from sruon/yaml_entity_enums
[core, lua, yaml] Port Allegiance and Status to YAML based enums
2026-07-06 10:58:13 +02:00
sruon
32ffaff292 Skip animation lock if JA couldnt be fired 2026-07-05 23:50:52 -06:00
taylorleary
c5657d02b7 [sql] Audit some synthesis content tags (401-450) 2026-07-05 23:54:06 -04:00
Skold
782a25b5ab Reduce Ranged Attack Damage
Reduces the fTP of Ranged Attack to 1.0 from 1.5
2026-07-05 22:48:59 -04:00
ThrisStraizo
d198a1a3ff Retail Accurate Boyahda Tree Coffer Positions
This PR updates the coffer positions to be in retail accurate positions in the tree.
2026-07-05 19:10:08 -07:00
sruon
3d6ee87468 Port Allegiance and Status to YAML based enums 2026-07-05 20:00:10 -06:00
WinterSolstice8
1dd38e3fef
Merge pull request #10463 from sruon/spawn_time_rework
[core, sql] Allow customized spawn times for TOTD mobs
2026-07-05 19:36:46 -06:00
sruon
1cc1b82dbb Allow customized spawn times for TOTD mobs
Co-Authored-By: Valentine-PHX <231148762+Valentine-PHX@users.noreply.github.com>
2026-07-05 18:45:07 -06:00
Xaver
2b5f10f14d
Merge pull request #10507 from Xaver-DaRed/macc66
[Proposal] [Magic] Edit instrument macc and remove day macc bonuses
2026-07-06 01:57:32 +02:00
Xaver
4c47ab09e2
Merge pull request #10509 from Nobutadas/expeditionary-force-treasure-coffers
[lua] Add Expeditionary Force reward for treasures
2026-07-06 00:00:50 +02:00
Nobutadas
9d695fb764 [lua] Enable Expeditionary Force with Treasure 2026-07-05 16:36:22 -05:00
Xaver-DaRed
4a411e5944 Edit instrument macc and remove day macc bonuses 2026-07-05 22:09:17 +02:00
Zach Toogood
3c7bfaa48a
Merge pull request #10506 from LandSandBoat/more_udp_stats
Core: Add UDP backpressure stats
2026-07-05 19:22:35 +01:00
Xaver
a12fa4de66
Merge pull request #10505 from sruon/guild_holidays
[core, lua] Support optional holiday setting for guild shops
2026-07-05 19:52:34 +02:00
Xaver
9e19298081
Merge pull request #10498 from Nobutadas/remove-expeditionary-force-key-items-on-nation-swap
[lua] Remove Expeditionary Force KI on Nation Swap
2026-07-05 19:20:41 +02:00
Zach Toogood
ab7466d241 Core: Add UDP backpressure stats 2026-07-05 18:09:40 +01:00
sruon
dee8d92131 Optional holiday setting for guild shops 2026-07-05 10:44:05 -06:00
Xaver
f1cde8f17e
Merge pull request #10501 from sruon/test/gardening
[core, test] Tweak Moghancement tiebreaking; gardening/moghancements tests
2026-07-05 18:09:43 +02:00
sruon
8f9d0e81c9 Gardening tests 2026-07-05 09:15:42 -06:00
Zach Toogood
9e34680cbf
Merge pull request #10504 from LandSandBoat/random_improvements
Lua: Migrate to math.randomInt and math.randomFloat 💣💣💣
2026-07-05 16:13:57 +01:00
Nobutadas
11e91561ae [lua] Remove Expeditionary Force KI on Nation Swap 2026-07-05 08:56:48 -05:00
Zach Toogood
e1cab1c894 Lua: Migrate to math.randomInt and math.randomFloat 2026-07-05 14:55:22 +01:00
Zach Toogood
6591fa6ac0 Lua: Add math.randomInt and math.randomFloat
For clarity
2026-07-05 14:33:55 +01:00
Zach Toogood
94cced67ed Core/Lua: Add math.randomNormal() 2026-07-05 14:08:12 +01:00
Zach Toogood
866795648b Test: Add more math.random() tests 2026-07-05 13:49:00 +01:00
Zach Toogood
b518961aca Core: Harden synthutils to use only doubles 2026-07-05 13:48:34 +01:00
Zach Toogood
8cdaa6965c xirand: Add narrow-to-float safety 2026-07-05 13:47:59 +01:00
Zach Toogood
ef25799939 Core: Make math.random() binding resolution clear 2026-07-05 13:24:50 +01:00
Zach Toogood
129b82e47d
Merge pull request #10503 from LandSandBoat/remove_elision
Core: Remove Lua empty function elision
2026-07-05 12:44:33 +01:00
Zach Toogood
14a6dbf80f Core: Manually clear authenticatedSessions_ on shutdown 2026-07-05 11:56:59 +01:00
Zach Toogood
e91068d080 Tests: Harden 'Item use' test
Co-authored-by: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com>
2026-07-05 11:56:13 +01:00
Zach Toogood
2c2882ec09 Core: Remove Lua empty function elision
From the big comment:

// NOTE: We previously experimented with empty-handler elision here: using LuaJIT's bytecode
// introspection to detect stub handlers (`function() end` JIT-ing to a single `RET0` op),
// cache them as nil, and skip the C++ -> Lua call entirely on lookup.
//
// It was difficult and fiddly: several call sites use a handler's validity as an existence check
// or pass the handler onward as an Interaction Framework fallback, so eliding silently broke
// them (e.g. food items stopped applying stats) in ways that were hard to debug.
//
// Measured under an insane synthetic load (~5000 active status effects), the total saving was
// only ~0.25ms of main-loop time per second. Cool concept, but not worth the effort.
2026-07-05 11:55:10 +01:00
Xaver
bf8a779eae
Merge pull request #10499 from Skold177/Shadow_Lord-Fixes
[lua] [sql] Update Shadow Lord spell list
2026-07-05 09:12:26 +02:00
Skold
1f2d8d500e Update Shadow Lord spell list
Updates Shadow Lord Spell list
2026-07-05 00:00:12 -04:00
Xaver
88beeeb9bf
Merge pull request #10497 from Nobutadas/audit-expeditionary-force-mob-levels
[sql] Update Expeditionary Force mob levels and spawns
2026-07-05 04:23:38 +02:00
Xaver
e53b7e2290
Merge pull request #10496 from Nobutadas/add-lua-hooks-for-conquest
[C++] Add lua hooks to modify conquest influence
2026-07-05 04:13:02 +02:00
Nobutadas
227e880c9e [sql] Update Expeditionary Force levels and spawn 2026-07-04 20:01:35 -05:00
Nobutadas
ad886c6ef8 [C++] Add lua hooks to modify conquest influence 2026-07-04 19:05:08 -05:00
Xaver
2a1591b5ba
Merge pull request #10488 from Xaver-DaRed/killer
[Combat] Implement ecosystem damage multipliers
2026-07-05 02:03:04 +02:00
Xaver-DaRed
1218a14533 Implement ecosystem damage multipliers
Circle effects. Blue spell ecosystem properties, etc...
2026-07-05 00:59:26 +02:00
Xaver
72a8ab9bc3
Merge pull request #10484 from sruon/renamef
[core, sql] Support forced rename flow in lobby; Add retail vulgar name check
2026-07-05 00:48:40 +02:00
Xaver
140dc9f52a
Merge pull request #10495 from Auzali/fix-several-synth-recipe-tags
fix several tags that were initially overlooked during ROTZ tag batches
2026-07-04 23:59:32 +02:00
Xaver
eba02d4f41
Merge pull request #10494 from ThrisStraizo/coraf3fix
[lua] COR AF3 Fight (Against All Odds) bugfix
2026-07-04 22:15:41 +02:00
Corey Sotiropoulos
ba209c9299
[ci] Run xi_test on macOS 2026-07-04 15:33:38 -04:00
Xaver
5deacbb912
Merge pull request #10492 from Nobutadas/Add-Subpower-Hook-to-Base-XP-on-Unrestricted-Level
[C++] Add Level Restriction Subpower Hook to Allow XP Based on True Level
2026-07-04 21:33:28 +02:00
taylorleary
d10a28b2bf fix several tags that were initially overlooked during ROTZ tag batches 2026-07-04 15:31:35 -04:00
ThrisStraizo
3e51a63740 COR AF3 Fight (Against All Odds) bugfix
This PR makes it so the fight is winnable and the death message doesn't play multiple times per player.
2026-07-04 12:31:30 -07:00
Xaver
c0ad180ecd
Merge pull request #10491 from Nobutadas/lua]-Update-and-add-gate-glyph-teleport-items-for-Expeditionary-Force
[lua] Update and add gate glyph teleport items for Expeditionary Force
2026-07-04 21:24:55 +02:00
WinterSolstice8
6045fd5879
Merge pull request #10490 from Nobutadas/dynamic-entities-in-instances
[C++] Fix ally NPCs not spawning in instances
2026-07-04 11:49:15 -06:00
Nobutadas
a46e335e79 [C++] Add Subpower Hook to Base XP on True Level 2026-07-04 11:59:37 -05:00
sruon
24af747f9b Explicitly state badnames.bin is not a retail file 2026-07-04 10:56:32 -06:00
Nobutadas
1e8875c5f9 [lua] Update and add gate glyph teleport items 2026-07-04 11:38:29 -05:00
Nobutadas
d8cfbebd2c [C++] Fix ally NPCs not spawning in instances 2026-07-04 11:09:21 -05:00
Xaver
29e2c03817
Merge pull request #10489 from WinterSolstice8/granite_door
[sql] [lua] Audit Temple Guardian and its Granite Door
2026-07-04 17:24:29 +02:00
WinterSolstice8
af8be49950 [sql] [lua] Audit Temple Guardian and its Granite Door 2026-07-04 08:24:12 -06:00
Zach Toogood
e7c8403b18
Merge pull request #10487 from LandSandBoat/xi_rand_improvements
xirand: Make usage deterministic on all platforms
2026-07-04 15:10:23 +01:00
Zach Toogood
a3f1ec5534 xirand: Add compile-time tests for skew 2026-07-04 14:16:27 +01:00
Zach Toogood
b9a14dc2e9 xirand: Fix integer promotion issue in GetRandomNumber 2026-07-04 13:15:39 +01:00
Zach Toogood
e6aabae622 xirand: Make usage deterministic on all platforms
- Replace default engine with Squirrel5
- Replace distribution helpers with techniques taken from Rust, NumPy, etc.
- Fix long-standing workaround for open/closed intervals
- Updates test seeds and outputs to match
- Reformat
2026-07-04 12:49:08 +01:00
Zach Toogood
b1d4c8ac76
Merge pull request #10486 from LandSandBoat/update_clang_format_rules
Chore: Update clang format rules
2026-07-04 11:56:49 +01:00
Xaver
df543b1a2a
Merge pull request #10478 from Auzali/add-ROTZ-tags-351-400
[sql] Audit some synthesis content tags (351-400)
2026-07-04 12:25:02 +02:00
Zach Toogood
8c56629924
Merge pull request #10485 from LandSandBoat/map_exit
Core: Slightly cleaner exit for xi_map
2026-07-04 11:21:38 +01:00
Zach Toogood
d26022395b Chore: Run new clang-format rules
- West const
- Lambda alignment
- Spacing around scopes and namespaces

This makes some things a little worse (packing, unions), but it makes many things much better
2026-07-04 10:56:27 +01:00
Zach Toogood
981ff1193e Chore: Update clang-format rules 2026-07-04 10:52:23 +01:00
Xaver
85c0386e4b
Merge pull request #10483 from Skold177/Son_of_Anansi_Skill_List
[sql] Fix Son of Anansi Animations
2026-07-04 11:45:18 +02:00
Zach Toogood
497e2fb7a8 Core: Slightly cleaner exit for xi_map 2026-07-04 10:38:16 +01:00
sruon
ba1d033e06 Skip binary files in CI general checks 2026-07-03 22:37:45 -06:00
sruon
35dbd73d86 Support forced rename flow in lobby 2026-07-03 21:57:53 -06:00
WinterSolstice8
40ffb3957b
Merge pull request #10482 from WinterSolstice8/remove_forced_aggro_los_test
[test] Remove changing wall groundskeeper aggro from aggro test
2026-07-03 20:53:04 -06:00
Skold
86ad2105f1 Fix Son of Anansi Animations
Do Come Into My Parlor, see right animations used
2026-07-03 22:49:34 -04:00
WinterSolstice8
31aed360f2 [test] Remove changing wall groundskeeper aggro from aggro test 2026-07-03 19:45:51 -06:00
Xaver
12a8a2a93b
Merge pull request #10481 from WinterSolstice8/groundskeeper_stuff
[lua] Set wall groundskeepers to aggro
2026-07-04 03:22:03 +02:00
WinterSolstice8
ec9a17d90d [lua] Set wall groundskeepers to aggro 2026-07-03 18:25:40 -06:00
taylorleary
9a424ada80 [sql] Audit some synthesis content tags (351-400) 2026-07-03 14:53:37 -04:00
Xaver
89fadbe1ff
Merge pull request #10477 from Xaver-DaRed/interruptcleanup
[Fix] Trusts not getting interrupted
2026-07-03 19:12:30 +02:00
Xaver-DaRed
1d1c9dd6ed Fix Trusts not getting interrupted
Also: cleanup
2026-07-03 18:01:43 +02:00
Xaver
a8a85b3dde
Merge pull request #10473 from Xaver-DaRed/tutorial
[Interaction] Convert tutorial mini-questline to a hidden quest and modernize it
2026-07-03 17:33:34 +02:00
Xaver-DaRed
1a67a808fa Fix aiso CI: Use new aiso directory instead of old one
Co-Authored-By: WinterSolstice8 <WinterSolstice8@users.noreply.github.com>
2026-07-03 16:33:20 +02:00
Xaver-DaRed
b3b0deed53 Convert tutorial mini-questline to a hidden quest and modernize it
Co-Authored-By: greentchristian-LSB <greentchristian-LSB@users.noreply.github.com>
2026-07-03 13:57:03 +02:00
Xaver
4acc9ea57f
Merge pull request #10471 from WinterSolstice8/sirens_tear_gusta
[lua] [sql] Reorder some QMs in North Gustaberg (and [S]), audit Siren's Tear
2026-07-03 03:22:24 +02:00
Xaver
88a9affefe
Merge pull request #10472 from ThrisStraizo/coraf2fixes
[lua] COR AF2 Bugfix
2026-07-03 03:14:04 +02:00
Xaver
3c89e2ba27
Merge pull request #10474 from Xaver-DaRed/missing
[Fix] Add missing require in the healing effect script
2026-07-03 03:06:07 +02:00
Zach Toogood
4057c36eb4
Merge pull request #10476 from LandSandBoat/misc_findings
Core: Ensure binding of const CLuaBaseEntity*
2026-07-03 02:05:36 +01:00
Zach Toogood
4886906a60 Core: More safety in ~CTrustController() 2026-07-03 01:04:24 +01:00
Zach Toogood
4ab82eb0ae Core: Ensure binding of const CLuaBaseEntity* 2026-07-03 01:03:50 +01:00
Xaver-DaRed
d0d48cecd4 Add missing require in the healing effect script 2026-07-03 01:52:20 +02:00
WinterSolstice8
69f51e3ea4 [lua] Set qm2 default action in North Gustaberg 2026-07-02 17:27:24 -06:00
WinterSolstice8
48066c0cc2 [lua] Audit Siren's Tear QM 2026-07-02 17:27:17 -06:00
ThrisStraizo
9c6473eea5 COR AF2 Bugfix
This PR makes it so trading the Hydrogauge to Leleroon does not consume the Hydrogauge.
2026-07-02 16:18:22 -07:00
WinterSolstice8
39f7ea8706 [sql] Reorder QMs in North Gustaberg and Shadowreign version 2026-07-02 16:34:03 -06:00
Zach Toogood
73e379eda1
Merge pull request #10470 from LandSandBoat/bump_deps
Ext: Bump all dependencies
2026-07-02 22:44:48 +01:00
Zach Toogood
5f5f029513
Merge pull request #10469 from LandSandBoat/remove_mariadb_cpp_connector
Ext: Remove Mariadb CPP connector
2026-07-02 22:27:04 +01:00
Zach Toogood
372336b20a Ext: Bump all dependencies 2026-07-02 21:38:26 +01:00
Zach Toogood
2459ddac33 Ext: Remove Mariadb CPP connector 2026-07-02 21:10:05 +01:00
Zach Toogood
0539cd69a4
Merge pull request #10468 from LandSandBoat/more_perf
Tracy: Build capture tools on Mac/Linux + Capture Instructions
2026-07-02 20:35:30 +01:00
Zach Toogood
d279951a3a Tracy: Add port support to capture.py 2026-07-02 19:15:10 +01:00
Zach Toogood
aeb8432018 Tracy: Build capture tools on Mac/Linux 2026-07-02 19:06:10 +01:00
Zach Toogood
9e539e3a24 Misc: Add tracy* to gitignore 2026-07-02 18:47:14 +01:00
Zach Toogood
86c19197a6 Entities: Remove unused members 2026-07-02 18:45:58 +01:00
Xaver
5fe06d7218
Merge pull request #10467 from ThrisStraizo/maattweaks
[lua] Additional Maat damage adjustments
2026-07-02 12:51:16 +02:00
ThrisStraizo
54af93d7d3 Additional Maat damage adjustments
This PR adjusts Maats damage to bring in more in line with reality for a level 70 doing the fight.
2026-07-01 20:42:13 -07:00
Xaver
559d8f8e54
Merge pull request #10466 from Auzali/add-ROTZ-tags-301-350
[sql] Audit some synthesis content tags (301-350)
2026-07-02 05:19:33 +02:00
Xaver
77c91353af
Merge pull request #10464 from sruon/traverser_stone_fix
[core, sql] Tweak Traverser Stone default column value, add tests
2026-07-02 04:55:37 +02:00
taylorleary
50bbad9173 [sql] Audit some synthesis content tags (301-350) 2026-07-01 22:45:25 -04:00
sruon
0aafb8025d Add tests for Abyssea Traverser Stones
Co-Authored-By: lefneer311 <142682619+lefneer311@users.noreply.github.com>
2026-07-01 19:30:49 -06:00
WinterSolstice8
d6633baf2a
Merge pull request #10461 from Skold177/Fix-Meikyo-Shisui-sequence-on-interrupt
[core] [C++] Fix Meikyo Shisui sequence on interrupt
2026-07-01 18:53:20 -06:00
WinterSolstice8
9bd03f53ef
Merge pull request #10457 from sruon/depr_cguildshop
[core, sql] Deprecate legacy guild shop system
2026-07-01 18:50:36 -06:00
WinterSolstice8
b67cae9c16
Merge pull request #10456 from Xaver-DaRed/fixsc
[Skillchain] Fix out of bounds table data fetching
2026-07-01 18:50:24 -06:00
WinterSolstice8
1b416850ca
Merge pull request #10458 from sruon/alter_ego_cats
[core] New Alter ego upgrade categories, minor CHAT_NAME names update
2026-07-01 18:50:15 -06:00
WinterSolstice8
67bfd418e3
Merge pull request #10460 from WinterSolstice8/unset_no_despawn_battlefield
[core] Unset no despawn in battlefield cleanup
2026-07-01 18:50:04 -06:00
WinterSolstice8
94863b5bd2
Merge pull request #10459 from WinterSolstice8/update_exp_table_comment
[modules] update comment in exp sql module
2026-07-01 18:49:47 -06:00
Skold
723df05222 Fix Meikyo Shisui sequence on interrupt
Ensures Meikyo Shisui sequence continues even after being interrupted.

Co-Authored-By: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com>
2026-07-01 19:43:08 -04:00
WinterSolstice8
9b05174c15 [core] Unset no despawn in battlefield cleanup
Some BCs may use NMs that don't despawn, so handle this automatically
2026-07-01 16:04:40 -06:00
WinterSolstice8
8307cbb093 [modules] update comment in exp sql module 2026-07-01 16:00:36 -06:00
sruon
c0c7eeaffb Update CHAT_NAME documentation to match XiPackets 2026-07-01 14:37:00 -06:00
sruon
080f1e593e Add newer Alter Ego categories 2026-07-01 14:14:05 -06:00
sruon
51034e95ed Deprecate legacy guild shop system 2026-07-01 13:49:59 -06:00
Xaver
02463324f6
Merge pull request #10453 from WinterSolstice8/update_shared_status_names
[yaml] Update names of some statuses that share the same script
2026-07-01 21:30:43 +02:00
Xaver
9b66ab6f43
Merge pull request #10454 from sruon/guild_chiyo
[lua, sql] Remaining Guild Shops converted to Lua
2026-07-01 21:30:22 +02:00
Xaver
839d4824eb
Merge pull request #10455 from Skold177/Add-isEngaged()-to-Dispel-scripts
[lua] Add isEngaged() to Dispel lua spell lists
2026-07-01 21:28:40 +02:00
Xaver-DaRed
428b5869eb Skillchain: Fix out of bounds table data fetching 2026-07-01 21:25:07 +02:00
Skold177
aee9b1d247 Add isEngaged() to Dispel lua spell lists
Adds isEngaged() to Dispel so it cannot be returned out of combat.
2026-07-01 14:23:29 -04:00
sruon
1db6cc5629 Reorder guild shop entries to match expected order 2026-07-01 12:01:16 -06:00
WinterSolstice8
88e2542d8b [yaml] Update names of some statuses that share the same script 2026-07-01 11:13:06 -06:00
Xaver
b3c521ecd2
Merge pull request #10447 from Xaver-DaRed/Cascade
[Magic] Implement Cascade JA and effect properly
2026-07-01 19:08:00 +02:00
WinterSolstice8
61ffc95c2b
Merge pull request #10452 from LandSandBoat/small_perf
Core: Don't walk RTTI tree in updateEntityPacket
2026-07-01 10:54:52 -06:00
Xaver
754351bcfc
Merge pull request #10451 from Skold177/Correct-some-SQL-Spell-Lists
[sql] Correct remaining spell lists for mobs with lua overrides
2026-07-01 18:44:26 +02:00
sruon
f9ebe55b01 Fishing guild shops converted to Lua 2026-07-01 10:44:13 -06:00
Xaver-DaRed
419298bc23 Implement Cascade JA and effect properly 2026-07-01 18:22:54 +02:00
Zach Toogood
6ed8665274 Core: Don't walk RTTI tree in updateEntityPacket 2026-07-01 16:43:57 +01:00
Skold
928f4da819 Correct some SQL spell list entries
Sets some additional monsters with lua overrides to the default spell list (2)
2026-07-01 11:29:07 -04:00
Xaver
3b1970a8ab
Merge pull request #10450 from WinterSolstice8/spawnlist_erase_fixup
[core] Remove pending deleted pets from players spawnlists
2026-07-01 15:40:54 +02:00
WinterSolstice8
60ea100ba8 [core] Remove pending deleted pets from players spawnlists
Adjust condition for removing trusts from players spawnlists
2026-07-01 06:02:54 -06:00
Xaver
a0d00fd082
Merge pull request #10443 from Skold177/Clean-Up-Avatar.lua-/-Refactor-Light-Spirit
[core] [C++] [lua] Restore optional targeting to TryCastSpell() / Cleanup Avatar.lua
2026-07-01 13:30:11 +02:00
Xaver
ad110f06e5
Merge pull request #10440 from KiplingFFXI/Sacrarium-NM-Audits
[lua, sql] Sacrarium NM Audits
2026-07-01 13:27:59 +02:00
Xaver
adc0aa1e70
Merge pull request #10449 from Xaver-DaRed/nill-check
[Fix] Add nil check to shadow lord listener
2026-07-01 13:00:46 +02:00
Xaver-DaRed
32141ea192 Add nil check to shadow lord listener 2026-07-01 12:31:01 +02:00
Kipling
85be2c7445 Sacrarium NM Audits
Co-authored-by: Skold177 <113406182+Skold177@users.noreply.github.com>
2026-06-30 22:09:35 -07:00
Skold
2d157e991d Restore Optional Targeting to TryCastSpell() Refactor Avatar.lua
Restores optional targeting inside of tryCastSpell() and cleans up avatar.lua/light spirit logic.
2026-07-01 00:44:25 -04:00
Xaver
c533e126ab
Merge pull request #10448 from Skold177/Correct-Automaton-Spawn-Animation
[lua] Fix Automaton Spawn Animation
2026-07-01 06:43:44 +02:00
Xaver
33d5069928
Merge pull request #10446 from Skold177/Add-spell-lists-for-lua-casters-that-do-not-buff
[SQL] [Lua] Create default spell list for lua overrides that do not cast buffs
2026-07-01 06:11:18 +02:00
Skold
b50ee79813 Fix Automaton Spawn Animation
Sets them to spawn animation 1.
2026-06-30 23:55:44 -04:00
Skold
077cbf5c88 Create new default spell list for non-buffing mobs
Creates a new default spelll list for non-buffing mobs so that they are not woken up outside of combat.
2026-06-30 21:48:07 -04:00
Xaver
d1bded2760
Merge pull request #10442 from WinterSolstice8/zoning_cleanup
[core] [lua] Add some zoning guardrails & remove unused/broken function, fix dropped 0x00As
2026-06-30 20:37:56 +02:00
WinterSolstice8
c94e1ca575
Merge pull request #10437 from Xaver-DaRed/aura
[Chore] Minor cleanup of GEO related effects and job util
2026-06-30 12:06:42 -06:00
WinterSolstice8
01c66ec923 [core] Fix no-resend with dropped 0x00As 2026-06-30 09:40:19 -06:00
WinterSolstice8
ed36e44e05 [core] Add some guardrails to some zoning logic 2026-06-30 09:11:27 -06:00
WinterSolstice8
eaa0d5389d
Merge pull request #10441 from Xaver-DaRed/magic-order
[Magic] General damage spell maintenance
2026-06-30 08:53:41 -06:00
WinterSolstice8
80053c3a61
Merge pull request #10433 from Xaver-DaRed/skillchain
[Proposal] [Combat] Convert skillchain damage calculations to lua
2026-06-30 08:51:58 -06:00
WinterSolstice8
48790dde2b [core] [lua] Remove unused and broken function 2026-06-30 08:35:35 -06:00
Xaver-DaRed
97b1af14f6 General damage spell maintenance 2026-06-30 13:11:23 +02:00
Xaver
0d249ea832
Merge pull request #10429 from CriticalXI/beastmaster_adjust
[lua, sql, cpp] Beastmaster Sic bugfix; Sic Era Module
2026-06-30 10:51:39 +02:00
Xaver
4470d6c1b4
Merge pull request #10439 from Auzali/add-ROTZ-tags-251-300
[sql] Audit some synthesis content tags (251-300)
2026-06-30 10:29:22 +02:00
taylorleary
2caeabd88f [sql] Audit some synthesis content tags (251-300) 2026-06-30 01:15:07 -04:00
Critical
ee8131a2ff [lua, sql, cpp] Beastmaster Sic bugfix; Sic Era Module 2026-06-29 21:32:34 -06:00
sruon
db5a8fc66d Goldsmithing guild shops converted to Lua 2026-06-29 21:02:06 -06:00
Xaver
53a25d1d31
Merge pull request #10436 from Nobutadas/event-audit-cop5-3-until-end
[lua] Event updates for CoP 5-3 until end of CoP
2026-06-30 01:54:21 +02:00
Xaver-DaRed
ca1f1c1681 Cleanup Geo effects 2026-06-30 01:24:45 +02:00
Xaver-DaRed
a640623bd1 Style changes 2026-06-30 01:07:40 +02:00
Nobutadas
3452b4c77a [lua] Event updates for CoP 5-3 Until End 2026-06-29 18:03:10 -05:00
sruon
87279ae651 Clothcraft guild shops converted to Lua 2026-06-29 15:19:24 -06:00
sruon
4ba342d0a9 Shih Tayuun guild shop converted to Lua 2026-06-29 13:21:25 -06:00
Xaver-DaRed
8df4dea7b3 Convert skillchain damage calculations to lua
Co-Authored-By: WinterSolstice8 <WinterSolstice8@users.noreply.github.com>
2026-06-29 19:34:56 +02:00
Xaver
654a876638
Merge pull request #10430 from Skold177/Remove-SQL-lookup-for-valid-lua-overrides
[C++] [lua] Disable SQL Fallback for valid lua spell overrides
2026-06-29 17:53:38 +02:00
Zach Toogood
496aace238
Merge pull request #10431 from LandSandBoat/aggro_retap_test
Tests: Add Aggro-LOS test and Aggro-tap test
2026-06-29 16:50:10 +01:00
Zach Toogood
52b836d76a Tests: Add Aggro-tap test 2026-06-29 15:58:41 +01:00
Zach Toogood
a7b9a120ae Tests: Add Aggro-LOS test 2026-06-29 12:21:53 +01:00
Xaver
d28d6016e7
Merge pull request #10427 from WinterSolstice8/aqueducts_doors
[lua] Audit Aqueducts locked doors
2026-06-29 11:52:34 +02:00
Zach Toogood
450d7ba660 Core: Add steps checking to rayIntersect
Without this, if garbage or "outside mesh" coords are passed in, we'll get a 2^40+ number to try and raycast again, making us essentially spin forever. This bounds that scenario so we come out at worst in under a second. No ideal, but better than death
2026-06-29 10:03:51 +01:00
Zach Toogood
7c3867cf30
Merge pull request #10426 from WinterSolstice8/fix_aggro
[core] Add onUpdate to spawn list functions
2026-06-29 09:36:44 +01:00
sruon
a5748e532b Kueh Igunahmori guild shop converted to Lua 2026-06-28 23:55:14 -06:00
Xaver
49942536d6
Merge pull request #10266 from Nobutadas/update-conquest-influence-limit
[C++][sql][lua] Raise influence cap and reset weekly influence
2026-06-29 07:50:10 +02:00
sruon
3b59388e0a Dehbi Moshal guild shop converted to Lua 2026-06-28 22:47:18 -06:00
Skold
fb2f6a4da6 Disable SQL Fallback for valid lua spell overrides
Removes SQL lookup for valid lua overrides that return 0.
2026-06-28 23:22:30 -04:00
sruon
6a050f923c Ndego guild shop converted to lua 2026-06-28 20:58:48 -06:00
sruon
5c52eaca97 Gathweeda / Wahraga guild shops converted to Lua 2026-06-28 20:29:19 -06:00
Nobutadas
ce928bf782 [cpp,sql,lua] Raise influence cap and reset weekly 2026-06-28 20:12:49 -06:00
sruon
3690de4bc9 Chaupire guild shop converted to Lua 2026-06-28 18:48:58 -06:00
sruon
9750b40184 Doggomehr guild shop converted to Lua 2026-06-28 18:48:58 -06:00
sruon
10c913d9ed Tsutsuroon guild shop converted to lua 2026-06-28 18:48:58 -06:00
sruon
9bdc95f2ca Silver Owl guild shop converted to Lua 2026-06-28 18:48:58 -06:00
sruon
f2bb78a945 Maymunah guild shop converted to Lua 2026-06-28 18:48:58 -06:00
WinterSolstice8
badd18713f [lua] Audit Aqueducts locked doors 2026-06-28 18:46:08 -06:00
WinterSolstice8
814d000316 [core] Add onUpdate to spawn list functions 2026-06-28 18:19:43 -06:00
Xaver
8b86eb22df
Merge pull request #10422 from ThrisStraizo/blmthfmaatadjust
[lua] [sql] Small Maat tweaks
2026-06-29 01:47:39 +02:00
Xaver
03e050c240
Merge pull request #10416 from Aeshur/survival-skills
[lua] Add SoA survival skill obstacle traversing
2026-06-29 01:47:07 +02:00
Xaver
b0950b25e0
Merge pull request #10424 from CriticalXI/cor_audit
[lua, sql][module] COR Era Adjustment Modules; COR and module bug fix
2026-06-29 01:44:02 +02:00
Xaver
f6f0ca3f7e
Merge pull request #10425 from Auzali/add-ROTZ-tags-201-250
[sql] Audit some synthesis content tags (201-250)
2026-06-29 01:43:45 +02:00
taylorleary
e7eb2f691d [sql] Audit some synthesis content tags (201-250) 2026-06-28 19:00:52 -04:00
ThrisStraizo
b41373ecd9 Small Maat tweaks
This PR makes sure THF Maat cannot be hidden from and BLM Maat appropriately takes half magic damage to make up for his very small health pool.
2026-06-28 14:46:20 -07:00
Aeshur
a39b72a899 [lua] Add SoA survival skill obstacle traversing 2026-06-28 17:43:38 -04:00
Xaver
d12e7cee9c
Merge pull request #10418 from Skold177/Prevent-Patrolling-Mobs-From-Buffing
[C++] Prevent mobs with path flag patrol from buffing.
2026-06-28 23:07:27 +02:00
sruon
cdc7c7886a Jabbar guild shop converted to Lua 2026-06-28 14:57:16 -06:00
sruon
632b3db30a Jirokichi guild shop converted to Lua 2026-06-28 14:57:16 -06:00
sruon
44f877dd63 Achika guild shop converted to lua 2026-06-28 14:57:16 -06:00
sruon
22836b9ce3 Vuliaie guild shop converted to Lua 2026-06-28 14:57:16 -06:00
Xaver
0b62ed4726
Merge pull request #9962 from Skold177/AutomatonMixin
[lua] [sql] Troll Automaton Mixin
2026-06-28 21:51:58 +02:00
Critical
ac57b7ad21 [lua, sql][module] COR Era Adjustment Modules; COR and module bug fix 2026-06-28 13:51:36 -06:00
Skold
6ebd915731 Prevent Patrolling mobs from buffing
Prevents mobs with pathflag patrol from casting buffs.
2026-06-28 15:47:30 -04:00
Xaver
34682b0724
Merge pull request #10411 from Xaver-DaRed/magic
[Magic] Code Theurgic focus, Addle fixes, Introduce Addle II and Enspell duration bonus
2026-06-28 21:32:12 +02:00
Xaver
c70f20d971
Merge pull request #10419 from Skold177/Meikyo-Shisui-Fix
[C++] Fix Meikyo Shisui / Sekkanoki TP spent Interactions
2026-06-28 21:29:22 +02:00
Skold
0ef9a90ce9 [lua] [sql] Troll Automaton Mixin
Adds a mixin to randomize troll automatons.
2026-06-28 15:24:12 -04:00
Skold
4b7c91ff1f Fix Meikyo Shisui / Sekkanoki Interactions
Fixes Meikyo Shisui / Sekkanoki interactions with TP costs.

Co-Authored-By: WinterSolstice8 <60417494+WinterSolstice8@users.noreply.github.com>
2026-06-28 00:00:16 -04:00
Xaver
8d460cae60
Merge pull request #10417 from Xaver-DaRed/empty2
[Chore] Remove empty functions from npc scripts
2026-06-28 00:39:28 +02:00
Xaver-DaRed
cf04fcb15b Remove empty functions from npc scripts 2026-06-28 00:11:05 +02:00
Xaver
947f0bed47
Merge pull request #10414 from Aeshur/yahse-adoulin-ferry
[lua] Implement Yahse-Adoulin Ferry
2026-06-27 19:35:47 +02:00
Xaver
34c3d79562
Merge pull request #10385 from Aeshur/snakes-on-the-plains-if
[lua] Convert Snake on the Plains to IF
2026-06-27 19:06:01 +02:00
Xaver
8a71ecc8cb
Merge pull request #10413 from Skold177/Cryptonberry
[sql] Add Cryptonberry skill list
2026-06-27 18:58:25 +02:00
Aeshur
6723c3318d [lua] Implement Yahse-Adoulin Ferry 2026-06-27 12:52:36 -04:00
Xaver
672179f107
Merge pull request #10410 from LandSandBoat/state_stack
Core: Refactor use of AI::StateStack
2026-06-27 18:44:39 +02:00
Skold
2d48e0daad Add Cryptonberry skill list
Adds a skill list for Cryptonberries that excludes Everyones Grudge / Rancor
2026-06-27 12:27:42 -04:00
Zach Toogood
6ab71f2bac Core: Refactor use of AI::StateStack
- Removes direct use of the top of the state stack, in favour of a seperate member where we keep the current state.
- Adds tests to reproduce previous ASan errors and a few other logical tests - now all passing
- General tidying
2026-06-27 17:48:53 +02:00
Xaver-DaRed
808f8ea9e3 Add "Enspell Duration Bonus" modifier and apply it to items and code 2026-06-27 13:31:36 +02:00
Xaver-DaRed
701075e759 Handle Addle properly and Implement Addle II 2026-06-27 13:31:36 +02:00
Xaver-DaRed
04bd22c4f3 Implement Theurgic Focus MAB bonus 2026-06-27 12:30:48 +02:00
Zach Toogood
26ec91e0f8 Test: Track exit status
Fix ASAN complaint on exit
2026-06-27 10:56:16 +01:00
Xaver
6bbf612c09
Merge pull request #10409 from ThrisStraizo/moreselfdestruct
[lua] [sql] Self-Destruct and Hypothermal Combustion adjustments
2026-06-27 11:53:24 +02:00
ThrisStraizo
ac40555987 Self-Destruct and Hypothermal Combustion adjustments
This adjusts Self-Destruct and Hypothermal Combustion to ignore MDB as Tanaka intended.  It also adjusts Hypothermal Combustion to be the same as Self-Destruct and adjusts cluster single explosions.
2026-06-26 21:50:50 -07:00
Xaver
f106015623
Merge pull request #10407 from Auzali/add-ROTZ-tags-151-200
[sql] Audit some synthesis content tags (151-200)
2026-06-27 02:14:19 +02:00
Xaver
9c4957017c
Merge pull request #10381 from Xaver-DaRed/Lamia-19
[Chore] Make Lamia 19 script readable by humans.
2026-06-27 02:12:20 +02:00
Xaver-DaRed
2b5f62a5c3 Use listener to try to not to call all players in a zone every tick 2026-06-27 01:43:36 +02:00
taylorleary
795c1fef28 [sql] Audit some synthesis content tags (151-200) 2026-06-26 18:06:08 -04:00
Xaver
0e109d2c51
Merge pull request #10406 from Skold177/Add-medicated-effect-to-!reset
[lua] Adds medicine/food removal to !reset
2026-06-26 20:48:10 +02:00
Skold177
0f462d5210 Adds medicine/food removal to !reset
Adds medicine/food effect removal to !reset for easier testing.
2026-06-26 14:07:21 -04:00
Zach Toogood
8218cdf58f
Merge pull request #10405 from LandSandBoat/raycast_broad_phase_cull
XiMesh: Speed up raycast with broad-phase culling
2026-06-26 18:36:15 +01:00
sruon
d7ed78d4d5 Chiyo Guild Shop converted to Lua 2026-06-26 11:23:18 -06:00
Xaver
3fafd9981d
Merge pull request #10402 from KiplingFFXI/Shen-Audits
[lua, sql] Shen Audits
2026-06-26 19:03:54 +02:00
Xaver
c3e4387c53
Merge pull request #10404 from UmeboshiXI/Era_Avatar_Adjustments
[core][lua][sql] Avatar Weapon/Bloodpact Damage Modules
2026-06-26 18:36:42 +02:00
Kipling
70cca2df9b Shen Audits
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-06-26 18:36:42 +02:00
Zach Toogood
f177cffb9d XiMesh: Speed up raycast with broad-phase culling 2026-06-26 17:29:29 +01:00
Zach Toogood
91ad4dabbf
Merge pull request #10403 from LandSandBoat/spatial_hashing
Core: Add SpatialGrid to reduce work in ZoneServer (plus many other performance goodies)
2026-06-26 14:35:06 +01:00
Umeboshi
f95916e166 [core][lua][sql] Avatar Weapon/Bloodpact Damage Modules 2026-06-26 05:06:01 -07:00
Zach Toogood
514d543f49 Core: Add SpatialGrid to reduce work in ZoneServer 2026-06-26 12:47:57 +01:00
Zach Toogood
6602ccdba7 Core: Extract tapMobAggro from the SpawnMOBs aggro lambda 2026-06-26 12:41:05 +01:00
Zach Toogood
23ca4c3ad0 Core: Remove TaskGroup usage in ZoneEntities
The setup cost of TaskGroup was much higher than the benefits.
Will be worth revisiting if we ever manage to have multiple threads and Lua states working within a single zone.
Replaced with tickEntityScratch_ and loops.
2026-06-26 12:40:41 +01:00
Zach Toogood
55b8d609a9 Core: Use FlatHashMap for EntityList_t 2026-06-26 12:40:41 +01:00
Zach Toogood
82f7334faf Core: Use FlatHashMap for SpawnIDList_t 2026-06-26 12:40:41 +01:00
Zach Toogood
e2de5aa909 Core: Optimise zlib_{compress, decompress} 2026-06-26 12:40:41 +01:00
Zach Toogood
5e114579af Core: Re-use a scratch packet in networking
Instead of constantly re-allocating a new one :)
2026-06-26 12:40:17 +01:00
Zach Toogood
1f307345a8 Core: Collapse queries in recv_parse
The previous standalone "SELECT charid" existence check was a redundant round-trip.The accid query already validates the char exists.
2026-06-26 09:46:43 +01:00
Zach Toogood
3ed5d5dd48 Core: Add blowfish_{encipher, decipher}_blocks 2026-06-26 09:45:26 +01:00
Zach Toogood
e26b3d8b2b Chore: Add .cpm-cache/ to gitignore 2026-06-26 09:40:23 +01:00
Xaver
d8bda8cbe9
Merge pull request #10398 from CriticalXI/cor_audit
[lua] Route quick draw logic through corsair job util
2026-06-26 10:30:46 +02:00
Xaver
64cbba5244
Merge pull request #10401 from Auzali/add-ROTZ-tags-101-150
[sql] Audit some synthesis content tags (101-150)
2026-06-26 10:17:50 +02:00
Xaver
c7928e9ee9
Merge pull request #10400 from WinterSolstice8/pal_mines_audit
[sql] Quadav Fetich droplist audit + a few others in pal mines
2026-06-26 10:10:13 +02:00
taylorleary
5ec7f6201a [sql] ROTZ Content Tags 101-150 2026-06-25 23:50:39 -04:00
WinterSolstice8
172feae427 [sql] Quadav Fetich droplist audit + a few others in pal mines 2026-06-25 20:41:29 -06:00
Critical
9eba401df5 [lua] Route quick draw logic through corsair job util
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-06-25 20:32:27 +02:00
Xaver
13ea78ae40
Merge pull request #10399 from Auzali/add-ROTZ-tags-51-100
[sql] Audit some synthesis content tags (51-100)
2026-06-25 11:22:00 +02:00
Xaver
afa6915bd8
Merge pull request #10392 from Xaver-DaRed/empty
[Chore] Remove all cases of empty mob functions inside scripts/zones folder
2026-06-25 08:23:59 +02:00
taylorleary
337f0adbd6 [sql] ROTZ Content Tags 51-100 2026-06-25 01:57:49 -04:00
Aeshur
eebb71208a [lua] Convert Snake on the Plains to IF 2026-06-24 22:35:08 -04:00
Xaver
7fd08e9a17
Merge pull request #10397 from ThrisStraizo/warmaatadjustment
[lua] Additional Maat Adjustments
2026-06-24 23:59:30 +02:00
ThrisStraizo
dbd44101d1 Additional Maat Adjustments
This PR adjusts Maats damage to be more in line with 66-70 engagement of the fight.
2026-06-24 13:30:21 -07:00
Xaver
64a8f3dafc
Merge pull request #10393 from UmeboshiXI/Mob_BaseDamage_Refactor
[core][lua] Mob Weapon Damage Refactor
2026-06-24 20:27:36 +02:00
Zach Toogood
0899465bb6
Merge pull request #10391 from LandSandBoat/empty_handler_elision
Core: Add basic level of Lua empty-handler elision
2026-06-24 16:34:56 +01:00
Zach Toogood
3b0b963617 Test: Add test to verify default Horro module 2026-06-24 15:49:22 +01:00
Xaver
601470126d
Merge pull request #10394 from Xaver-DaRed/fixes
[Fix] 2 cases of missing parameters and a quest not propely written
2026-06-24 14:46:21 +02:00
Xaver-DaRed
95bb204a96 Fixes 2 cases of missing parameters and a quest not propely written 2026-06-24 13:53:56 +02:00
Umeboshi
721e3d1985 [core][lua] Mob Weapon Damage Refactor 2026-06-24 03:59:11 -07:00
Xaver-DaRed
88dc1b6dcc Remove all cases of empty mob functions inside scripts/zones folder
(That I could find)
2026-06-24 12:30:13 +02:00
Zach Toogood
09ac8a5e89 Core: Add basic level of Lua empty-handler elision
This is not a crutch to start being lazy with how we lay out our Lua files and what we put into the Lua state!
2026-06-24 09:43:59 +01:00
Zach Toogood
f5392bfd75
Merge pull request #10389 from LandSandBoat/fix-debugger-dir
Set DEBUGGER_WORKING_DIRECTORY for Ninja debug sessions
2026-06-23 23:45:42 +01:00
Xaver
5732c6bd1e
Merge pull request #10386 from lapislosh/base
Add mimeo stone hidden quest and update rewards
2026-06-23 21:28:31 +02:00
Xaver
060f07895d
Merge pull request #10380 from ThrisStraizo/selfdestructfix
[lua] Self Destruct damage fix
2026-06-23 21:26:29 +02:00
Xaver
2e394ff025
Merge pull request #10357 from CriticalXI/cor_audit
[lua, c++] Corsair job util enhancements
2026-06-23 21:24:00 +02:00
claywar
1c38e88138
Set DEBUGGER_WORKING_DIRECTORY for Ninja debug sessions 2026-06-23 14:02:02 -04:00
Xaver
295ac78528
Merge pull request #10384 from Skold177/DoBuffTick
[C++] [lua] Removed nested buffing logic from doRoamTick, add doBuffTick
2026-06-23 18:17:14 +02:00
Zach Toogood
847d643d99
Merge pull request #10382 from LandSandBoat/performance_improvements
Core: Reinstate and improve 2nd-level Lua caching
2026-06-23 17:02:14 +01:00
hapro
1c65b73953 add mimeo stone quest and update rewards 2026-06-23 11:31:05 -04:00
Skold
50b1662462 Change Sweep test enemy from BRD to MNK
This test could sometimes fail as the Yagudo BRD could be busy casting a song when this test runs.
2026-06-23 11:14:38 -04:00
Skold177
95441da5fc Removed nested buffing logic from doRoamTick, add doBuffTIck
Removes out of combat spell casting from being nested inside of mob roam.
2026-06-23 10:55:21 -04:00
Zach Toogood
4787c5acf1 Core: Refactor "2nd-level" caching to be the only cache
This was a sort of misnomer from when we moved from constantly re-reading Lua from the disk to storing everything in the Lua state. Now we don't constantly walk the Lua state - we jump right to our cached Lua functions.
2026-06-23 15:43:11 +01:00
Zach Toogood
01b2beb72f Core: Throttle TryLink() 2026-06-23 14:22:53 +01:00
Zach Toogood
7009d0fb72 Core: Replace xi:eraseIf with stdlib version 2026-06-23 14:21:45 +01:00
Zach Toogood
f6434f362d Build: Tidy up default build config selection 2026-06-23 14:21:14 +01:00
Zach Toogood
e711fc8e04 Core: Reinstate and improve 2nd-level Lua caching 2026-06-23 12:28:00 +01:00
Zach Toogood
bef2342f9b Core: Tidy event handler 2026-06-23 12:28:00 +01:00
Zach Toogood
1aed28a22d Deps: Add FlatHashMap 2026-06-23 12:28:00 +01:00
Zach Toogood
f81e77c8ff Scripts: Add tracy capture helper script 2026-06-23 12:28:00 +01:00
Zach Toogood
f72ddee704 Scripts: Add build helper script (for CLI help) 2026-06-23 12:28:00 +01:00
Zach Toogood
a847dd01be Build: Add CMakePresets for easier CLI builds 2026-06-23 12:27:59 +01:00
ThrisStraizo
cf81279e43 Self Destruct damage fix
This PR adjusts Self Destruct damage to reflect retail accurate behavior.
2026-06-22 19:15:12 -07:00
Xaver
c02531ddaf
Merge pull request #10379 from CriticalXI/battlefield_bugfix
[lua, cpp] Pulling the Plug fixes; OnSpellCastStart fix
2026-06-23 00:02:05 +02:00
Critical
05c00d3bb8 [lua, cpp] Pulling the Plug fixes; OnSpellCastStart fix 2026-06-22 15:19:43 -06:00
Xaver
ddce6298f5
Merge pull request #10370 from cwalke39/base
[lua] Adding CrystalWar Quest 7 70
2026-06-22 21:25:57 +02:00
Xaver
264bd2b41d
Merge pull request #10383 from LandSandBoat/los_cache
Core: Add LosCache to CanSeeTarget
2026-06-22 21:16:38 +02:00
Zach Toogood
dd538ecf6c
Merge pull request #10375 from MoombaDS/graceful-shutdown-on-signal
[C++] Core: Fix map server shutdown crash on SIGINT/SIGTERM
2026-06-22 19:22:51 +01:00
Zach Toogood
6240e3bf3c Core: Add LosCache to CanSeeTarget 2026-06-22 19:01:33 +01:00
Xaver-DaRed
d655041a28 Make Lamia 19 script readable by humans. 2026-06-22 16:38:43 +02:00
Xaver
7632a4e99d
Merge pull request #10261 from KiplingFFXI/Arrapago-Reef-NM-Audits
[lua] [sql] Arrapago Reef NM Audits
2026-06-22 16:28:00 +02:00
Kipling
66013b70f1 Arrapago Reef NM Audits 2026-06-22 14:01:04 +02:00
Zach Toogood
03cb598c5b
Merge pull request #10378 from LandSandBoat/logging_improvements
Core: Logging improvements
2026-06-22 10:44:50 +01:00
Zach Toogood
e8dbb246fa
Merge pull request #10377 from LandSandBoat/db_c_backend
DB: Extract out interface, implement C-connector backend
2026-06-22 10:28:37 +01:00
Critical
53299bdbcd [lua, sql] Corsair job util enhancements
Co-Authored-By: Xaver-DaRed <Xaver-DaRed@users.noreply.github.com>
2026-06-22 11:14:20 +02:00
Zach Toogood
d58978daa5 DB: Extract out interface, implement C-connector backend 2026-06-22 09:21:44 +01:00
Zach Toogood
09b262bfc1 Scripts: Add LLVM windows path to run_clang_format.py 2026-06-22 09:16:45 +01:00
Xaver
ded72c7b00
Merge pull request #10364 from CriticalXI/leujaoam_cleansing
[lua, cpp] Leujaoam Cleansing Assault; Lootbox Logic
2026-06-22 08:10:55 +02:00
Critical
4e07f64f99 [lua, cpp] Leujaoam Cleansing Assault; Lootbox Logic 2026-06-21 18:10:56 -06:00
Zach Toogood
614fef3a33 Core: Improve logging
- Invert settings/string building checks
- Improve backtrace circular buffer
- Improve custom formatters
- Cache loggers for quick lookup
- Memoize settings access and results
2026-06-21 22:43:41 +01:00
Zach Toogood
61ab350399 Core: Improve to_upper, to_lower 2026-06-21 22:38:38 +01:00
Xaver
74a5384439
Merge pull request #10371 from Skold177/Heady-Artifice
[sql] [lua] Implement Overdrive, Tactical Switch, Correct Burden Calculations
2026-06-21 21:09:48 +02:00
Xaver
ad85890e35
Merge pull request #10374 from TeoTwawki/base
Strip comment that has not aged well
2026-06-21 21:04:27 +02:00
Skold
41c52121b7 Implement Overdrive / Tactical Switch
Implements Overdrive / Tactical Switch / Cleans up some functions in automaton.lua / Fixes burden calculations.
2026-06-21 14:12:56 -04:00
TeoTwawki
c594e84511
Strip comment that has not aged well
Back when I wrote these comments, they were easy to prove true. Most of it even still applies in many cases. But more and more exceptions have piled up after the level cap increased and new gear was added. Individual items can have different behaviors in regard to proc rate, damage values, and base stats being used in their math. Back in the old 75 cap era no amount  of MND affected my Holy Mauls. No Amount of INT affected my fire sword. Today there are very definitely melee weapons that use these stats, and more. Even a dagger or 2 using AGI in their math.
2026-06-21 16:53:42 +00:00
Xaver
20ed074b0f
Merge pull request #10367 from Xaver-DaRed/shadow-lord-1
[Fix] Table data fetching for Shadow Lord phases
2026-06-21 18:22:21 +02:00
Zach Toogood
b092ed90f3
Merge pull request #10373 from LandSandBoat/mock_socket_interface
Core: Add mockable socket interface
2026-06-21 17:21:03 +01:00
Zach Toogood
83078e00c2
Merge pull request #10372 from LandSandBoat/status_effect_refactor
Core: Refactor StatusEffectContainer to hide allocations
2026-06-21 17:11:21 +01:00
Joe Griffith (Moomba)
848adc0ca2 Core: Fix crash on shutdown via SIGINT/SIGTERM 2026-06-21 15:56:03 +00:00
Zach Toogood
1e2ec9c3a7 Core: Add mockable socket interface 2026-06-21 15:44:54 +01:00
Zach Toogood
8334db98ce Lua: Add second-level caching for status effect scripts 2026-06-21 14:42:15 +01:00
Zach Toogood
1c30434a18 Test: Rename constants in status benchmark 2026-06-21 13:08:48 +01:00
Zach Toogood
efa445c0c6 Core: Add more tracy scopes to StatusEffectContainer 2026-06-21 12:24:59 +01:00
Zach Toogood
6f7e0c4d9e Core: Refactor StatusEffectContainer to hide allocations 2026-06-21 12:10:24 +01:00
Zach Toogood
eb7c9f9032 Test: Add estimated network drain to status benchmark 2026-06-21 12:09:24 +01:00
Zach Toogood
9d8949f9e9 Test: Add Status Effect benchmark test 2026-06-21 11:59:46 +01:00
Zach Toogood
4fc8d28ba7 Core: Fix xi_map tracy linkage 2026-06-21 11:57:35 +01:00
Crazyalextrebek
e4b9e51af2 [lua] Adding CrystalWar Quest 7 70 2026-06-20 21:31:31 -06:00
Xaver
d8a950d33c
Merge pull request #10369 from Skold177/Implement-Heady-Artifice
[lua] [sql] Implement JA Heady Artifice
2026-06-21 04:38:05 +02:00
Skold
e331b2c55b Implement JA Heady Artifice
Implements JA Heady Artifice, which allows automatons to use 2-hour abilities. Retires the automaton abilities ENUM and moves them into mobskills.
2026-06-20 22:11:02 -04:00
Xaver-DaRed
fbae82c2ea Cleanup Shadow Lord (phase 1) lua file 2026-06-21 00:22:59 +02:00
Xaver-DaRed
890cfb0036 Fix table data fetching for Shadow Lord phases 2026-06-21 00:09:44 +02:00
Zach Toogood
55230ff2a6
Merge pull request #10368 from LandSandBoat/zone_interface
Core: Add WeatherContainer, clean up Zone interface surface
2026-06-20 22:41:19 +01:00
Zach Toogood
f3276a28cf
Merge pull request #10366 from LandSandBoat/tidy_entities
Core: Rename entity files (charentity.h -> char_entity.h, etc.)
2026-06-20 20:11:46 +01:00
4787 changed files with 162202 additions and 146373 deletions

View file

@ -1,7 +1,7 @@
---
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
# We base things of WebKit + Allman braces
# Compatible with clang-format-20
# Compatible with clang-format-22 (enforced by tools/run_clang_format.py)
Language: Cpp
# Access modifiers
@ -28,8 +28,7 @@ AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: None
AllowShortLoopsOnASingleLine: false
# Note: LambdaBodyIndentation not available in clang-format-20
LambdaBodyIndentation: Signature
# Template declarations
AlwaysBreakTemplateDeclarations: Yes
@ -71,6 +70,8 @@ BinPackParameters: false
# Namespaces
CompactNamespaces: false
NamespaceIndentation: None
WrapNamespaceBodyWithEmptyLines: Always
SeparateDefinitionBlocks: Always
# Braced lists and initializers
Cpp11BracedListStyle: false
@ -89,8 +90,7 @@ MaxEmptyLinesToKeep: 1
# Pointer and reference alignment
PointerAlignment: Left
ReferenceAlignment: Pointer
# Note: QualifierAlignment not available in clang-format-20, use manual const placement
QualifierAlignment: Left # West Const
# Comments
ReflowComments: Always

2
.gitattributes vendored
View file

@ -12,6 +12,8 @@
*.h text eol=lf
*.sql text eol=lf
*.sh text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
# Retaining CRLF line ends in the documentation dir (for now..)
*.txt text eol=crlf

View file

@ -41,7 +41,7 @@ jobs:
- name: Install Dependencies
run: |
sudo apt-get update
sudo apt-get install -y software-properties-common cmake libmariadb-dev-compat libluajit-5.1-dev libzmq3-dev zlib1g-dev libssl-dev binutils-dev libzstd-dev
sudo apt-get install -y software-properties-common cmake libmariadb-dev-compat libluajit-5.1-dev libzmq3-dev zlib1g-dev libssl-dev binutils-dev libzstd-dev libdwarf-dev
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL

View file

@ -119,7 +119,7 @@ jobs:
- name: Run xi_test
id: xi_test
continue-on-error: true
run: docker exec test-server /bin/bash -c './xi_test --keep-going --output log/tests.ctrf.json'
run: docker exec test-server /bin/bash -c './xi_test --keep-going --retry 5 --output log/tests.ctrf.json'
- name: Publish Test Report
if: ${{ !cancelled() }}

View file

@ -196,31 +196,50 @@ jobs:
id: changed
run: |
mapfile -t changed_files < changed-files.txt
data_files=()
yaml_files=()
other_files=()
for f in "${changed_files[@]}"; do
if [[ $f == data/* ]]; then
data_files+=("$f")
if [[ $f == data/*.yaml || $f == data/*.yml ]]; then
yaml_files+=("$f")
elif [[ $f == data/* ]]; then
other_files+=("$f")
fi
done
echo "files=${data_files[*]}" >> "$GITHUB_OUTPUT"
echo "Changed data files: ${data_files[*]}"
echo "yaml=${yaml_files[*]}" >> "$GITHUB_OUTPUT"
echo "other=${other_files[*]}" >> "$GITHUB_OUTPUT"
echo "Changed YAML: ${yaml_files[*]}"
echo "Changed other: ${other_files[*]}"
- uses: actions/checkout@v6
if: steps.changed.outputs.files != ''
if: steps.changed.outputs.yaml != '' || steps.changed.outputs.other != ''
- name: Setup Python
if: steps.changed.outputs.yaml != ''
uses: actions/setup-python@v6
with:
python-version: "3.14"
- name: Install Python dependencies
if: steps.changed.outputs.yaml != ''
run: python -m pip install pyyaml ruamel.yaml
- name: Check YAML formatting
if: steps.changed.outputs.yaml != ''
run: python tools/yaml/format.py ${{ steps.changed.outputs.yaml }} --check
- name: Cache prettier results
if: steps.changed.outputs.files != ''
if: steps.changed.outputs.other != ''
uses: actions/cache@v5
with:
path: /tmp/prettier-cache
key: prettier-cache-${{ hashFiles('data/**/*.yaml', 'data/**/*.json') }}
key: prettier-cache-${{ hashFiles('data/**/*.json') }}
restore-keys: prettier-cache-
- name: Run prettier
if: steps.changed.outputs.files != ''
if: steps.changed.outputs.other != ''
run: |
set +e
FAILED=$(npx --yes prettier@3 --cache --cache-strategy content --cache-location /tmp/prettier-cache --list-different ${{ steps.changed.outputs.files }})
FAILED=$(npx --yes prettier@3 --cache --cache-strategy content --cache-location /tmp/prettier-cache --list-different ${{ steps.changed.outputs.other }})
set -e
if [ -z "$FAILED" ]; then
echo "All files use Prettier code style!"
@ -297,7 +316,7 @@ jobs:
- runner: macos-26
test_modules: false
multi_process: false
xi_test: false
xi_test: true
startup_checks: true
- runner: ubuntu-26.04
test_modules: false

View file

@ -99,7 +99,7 @@ jobs:
- name: Install dependencies (macOS)
if: ${{ runner.os == 'macOS' && env.SKIP_BUILD != 'true' }}
run: |
brew update && brew install --quiet \
brew install --quiet \
mariadb \
zeromq \
luajit \
@ -108,7 +108,7 @@ jobs:
- name: Setup LLVM Clang (macOS)
if: ${{ runner.os == 'macOS' && startsWith(inputs.compiler, 'clang') && env.SKIP_BUILD != 'true' }}
run: |
brew update && brew install --quiet \
brew install --quiet \
llvm@${{ inputs.compiler_version }} \
lld@${{ inputs.compiler_version }}
@ -128,7 +128,7 @@ jobs:
- name: Setup GCC (macOS)
if: ${{ runner.os == 'macOS' && startsWith(inputs.compiler, 'gcc') && env.SKIP_BUILD != 'true' }}
run: |
brew update && brew install --quiet gcc@${{ inputs.compiler_version }}
brew install --quiet gcc@${{ inputs.compiler_version }}
GCC_PREFIX=$(brew --prefix gcc@${{ inputs.compiler_version }})
echo "PATH=$GCC_PREFIX/bin:$PATH" >> $GITHUB_ENV
echo "CC=$GCC_PREFIX/bin/gcc-${{ inputs.compiler_version }}" >> $GITHUB_ENV
@ -139,6 +139,7 @@ jobs:
run: |
sudo apt-get update && sudo apt-get install --assume-yes --no-install-recommends --quiet \
binutils-dev \
libdwarf-dev \
libluajit-5.1-dev \
libmariadb-dev-compat \
libssl-dev \
@ -242,6 +243,15 @@ jobs:
xi_*
tracy.tar.gz
- name: Remove exes from build cache
if: ${{ inputs.save_cache && env.SKIP_BUILD != 'true' && steps.restore_build.outputs.cache-hit != 'true' }}
run: |
rm -f build/src/login/xi_connect*
rm -f build/src/map/xi_map*
rm -f build/src/search/xi_search*
rm -f build/src/test/xi_test*
rm -f build/src/world/xi_world*
- name: Cache build
if: ${{ inputs.save_cache && env.SKIP_BUILD != 'true' && steps.restore_build.outputs.cache-hit != 'true' }}
uses: actions/cache/save@v5

View file

@ -80,6 +80,7 @@ jobs:
sudo apt-get update && sudo apt-get install --assume-yes --no-install-recommends --quiet \
binutils \
git \
libdwarf1 \
libmariadb-dev-compat \
libzmq5 \
lua5.1 \
@ -167,7 +168,7 @@ jobs:
if: ${{ inputs.xi_test }}
id: xi_test
continue-on-error: true
run: ./xi_test --keep-going --output tests.ctrf.json
run: ./xi_test --keep-going --retry 5 --output tests.ctrf.json
- name: Publish Test Report
if: ${{ !cancelled() && inputs.xi_test }}

View file

@ -101,7 +101,7 @@ jobs:
build_type: Release
test_modules: false
multi_process: true
xi_test: ${{ !startsWith(matrix.runner, 'macos') }}
xi_test: true
startup_checks: true
Docker_Test:

3
.gitignore vendored
View file

@ -14,6 +14,7 @@
# Build results
build/
build*/
.cpm-cache/
lbuild/
build_mariadb_32/
build_mariadb_64/
@ -218,6 +219,8 @@ ip.txt
# Tracy download
ext/tracy/
tracy.tar.gz
tracy*
**/*.tracy
# Valgrind
*.memcheck.log

View file

@ -1,6 +1,10 @@
*.codegen.json
*.codegen.lua
# YAML is formatted by tools/yaml/format.py
*.yaml
*.yml
build/
build*/
cmake-*/

View file

@ -2,14 +2,5 @@
"tabWidth": 2,
"useTabs": false,
"printWidth": 120,
"endOfLine": "lf",
"overrides": [
{
"files": ["**/*.yaml", "**/*.yml"],
"options": {
"singleQuote": false,
"bracketSpacing": true
}
}
]
"endOfLine": "lf"
}

View file

@ -13,6 +13,7 @@
"jeff-hykin.better-cpp-syntax",
"bierner.github-markdown-preview",
"esbenp.prettier-vscode",
"redhat.vscode-yaml"
"redhat.vscode-yaml",
"jkillian.custom-local-formatters"
]
}

View file

@ -356,12 +356,19 @@
"editor.formatOnSave": true
},
"[yaml]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.defaultFormatter": "jkillian.custom-local-formatters",
"editor.formatOnSave": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"yaml.format.enable": false,
"customLocalFormatters.formatters": [
{
"command": "python tools/yaml/format.py --stdin",
"languages": ["yaml"]
}
],
"files.associations": {
"algorithm": "cpp",
"any": "cpp",

View file

@ -4,15 +4,35 @@ cmake_minimum_required(VERSION 3.25)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
# On macOS, pin the deployment target to the host OS version (must happen before
# project()). Without this, some compilers infer it from the Darwin kernel version
# using the pre-macOS-26 numbering scheme (e.g. Homebrew LLVM 20 maps Darwin 25 to
# "macOS 16.0" instead of 26), and every link against a Homebrew dylib stamped with
# the real version warns:
# ld: warning: building for macOS-16.0, but linking with dylib built for newer version 26.0
# Overridable as usual via -DCMAKE_OSX_DEPLOYMENT_TARGET or MACOSX_DEPLOYMENT_TARGET.
if(CMAKE_HOST_APPLE AND "${CMAKE_OSX_DEPLOYMENT_TARGET}" STREQUAL "" AND "$ENV{MACOSX_DEPLOYMENT_TARGET}" STREQUAL "")
execute_process(
COMMAND sw_vers -productVersion
OUTPUT_VARIABLE host_macos_version
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(REGEX MATCH "^[0-9]+" host_macos_major "${host_macos_version}")
if(host_macos_major)
set(CMAKE_OSX_DEPLOYMENT_TARGET "${host_macos_major}.0")
endif()
endif()
project(server C CXX)
# https://cmake.org/cmake/help/latest/policy/CMP0069.html
cmake_policy(SET CMP0069 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
set(LINKER_LANGUAGE CXX)
set(USE_FOLDERS ON)
@ -98,7 +118,6 @@ endif()
# Find MariaDB
find_package(MariaDB REQUIRED)
find_package(MariaDBCPP REQUIRED)
# Find ZMQ
find_package(ZeroMQ REQUIRED)
@ -113,29 +132,39 @@ find_package(OpenSSLlibcrypto REQUIRED)
find_package(OpenSSLlibssl REQUIRED)
if(UNIX AND NOT APPLE)
# zstd is sometimes a prereq for binutils
# zstd is sometimes a prereq for binutils
find_package(Zstd REQUIRED)
find_package(Binutils REQUIRED)
endif()
# Link this 'library' to set the c++ standard / compile-time options requested
add_library(project_options INTERFACE)
target_compile_features(project_options INTERFACE cxx_std_17)
target_compile_features(project_options INTERFACE cxx_std_23)
# Windows-only preprocessor defines for our first-party code ONLY.
if(WIN32)
target_compile_definitions(project_options INTERFACE
NOMINMAX
WIN32_LEAN_AND_MEAN
_CRT_SECURE_NO_WARNINGS
)
endif()
# Link this 'library' to use the warnings specified in CompilerWarnings.cmake
add_library(project_warnings INTERFACE)
set_project_warnings(project_warnings)
# Globally define SOL_ALL_SAFETIES_ON so sol can be included anywhere
# If SOL_NO_CHECK_NUMBER_PRECISION is defined, turns off number precision and integer
# precision fitting when pushing numbers into sol
# add_compile_definitions() comes with CMake 3.12
add_definitions(
-DSOL_ALL_SAFETIES_ON=1
-DSOL_NO_CHECK_NUMBER_PRECISION=1
-DSOL_DEFAULT_PASS_ON_ERROR=1
-DSOL_PRINT_ERRORS=0
-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG
add_compile_definitions(
# Globally define SOL_ALL_SAFETIES_ON so sol can be included anywhere.
SOL_ALL_SAFETIES_ON=1
# If SOL_NO_CHECK_NUMBER_PRECISION is defined, turns off number precision and integer
# precision fitting when pushing numbers into sol.
SOL_NO_CHECK_NUMBER_PRECISION=1
SOL_DEFAULT_PASS_ON_ERROR=1
SOL_PRINT_ERRORS=0
SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG
XI_CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}"
XI_BUILD_TYPE="$<CONFIG>"
)
# For external libs

42
CMakePresets.json Normal file
View file

@ -0,0 +1,42 @@
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 21,
"patch": 0
},
"configurePresets": [
{
"name": "default",
"displayName": "Default (RelWithDebInfo)",
"description": "Optimized build with debug info. The standard configuration.",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
}
},
{
"name": "debug",
"displayName": "Debug",
"description": "Unoptimized build with full debug info.",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
}
],
"buildPresets": [
{
"name": "default",
"displayName": "Default (RelWithDebInfo)",
"configurePreset": "default",
"configuration": "RelWithDebInfo"
},
{
"name": "debug",
"displayName": "Debug",
"configurePreset": "debug",
"configuration": "Debug"
}
]
}

View file

@ -81,6 +81,7 @@ function(set_project_warnings project_name)
CLANG_WARNINGS
-Wno-nan-infinity-disabled # TODO: fmt triggers this, a combination of the fast-math flag and `isfinite`
-Wunused-private-field # warn on unused private fields
-Wno-nontrivial-memcall # recastnavigation memsets non-trivially-copyable types (e.g. dtMeshTile)
)
endif()

View file

@ -1,275 +0,0 @@
if(NOT WIN32)
message(STATUS "Building MariaDB Connector/C++ from source")
CPMAddPackage(
NAME mariadb-connector-cpp
GITHUB_REPOSITORY zach2good/mariadb-connector-cpp
GIT_TAG efffd81c9c9cd806703b84ee7f0913d4de93e2ee
DOWNLOAD_ONLY YES
)
if(mariadb-connector-cpp_ADDED)
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 0)
set(PROJECT_VERSION_PATCH 0)
configure_file(
${mariadb-connector-cpp_SOURCE_DIR}/src/Version.h.in
${mariadb-connector-cpp_SOURCE_DIR}/src/Version.h
)
configure_file(
${mariadb-connector-cpp_SOURCE_DIR}/src/maconncpp.def.in
${mariadb-connector-cpp_SOURCE_DIR}/src/maconncpp.def
)
set(MACPP_SOURCES
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbDriver.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/DriverManager.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/UrlParser.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbDatabaseMetaData.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/HostAddress.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/Consts.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/SQLString.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbConnection.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbStatement.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDBException.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDBWarning.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/Identifier.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbSavepoint.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/SqlStates.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/Results.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/ColumnType.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/ColumnDefinition.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/MasterProtocol.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/QueryProtocol.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/ConnectProtocol.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/capi/ColumnDefinitionCapi.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/cache/CallableStatementCache.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/cache/CallableStatementCacheKey.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/Value.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/Utils.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/String.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/NoLogger.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/LoggerFactory.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/ProtocolLoggingProxy.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ParameterHolder.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/options/Options.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/options/DefaultOptions.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/pool/GlobalStateInfo.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/pool/Pools.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/failover/FailoverProxy.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/credential/CredentialPluginLoader.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/SelectResultSet.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/capi/SelectResultSetCapi.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/ColumnNameMap.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/io/StandardPacketInputStream.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/Charset.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/ClientSidePreparedStatement.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/BasePrepareStatement.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbFunctionStatement.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbProcedureStatement.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/ServerSidePreparedStatement.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/BigDecimalParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/BooleanParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ByteArrayParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ByteParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/DateParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/DefaultParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/DoubleParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/FloatParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/IntParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/LongParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ULongParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/NullParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ParameterHolder.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ReaderParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ShortParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/StreamParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/TimeParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/TimestampParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/StringParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbPooledConnection.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbParameterMetaData.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbResultSetMetaData.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/CallParameter.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/CallableParameterMetaData.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/Packet.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/credential/Credential.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/LogQueryTool.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ClientPrepareResult.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ServerPrepareResult.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ServerPrepareStatementCache.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformationSingle.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformationBatch.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformationMultiple.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/com/RowProtocol.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/BinRowProtocolCapi.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/TextRowProtocolCapi.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/ExceptionFactory.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/StringImp.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/CArray.cpp
${mariadb-connector-cpp_SOURCE_DIR}/src/SimpleParameterMetaData.cpp
)
# NOTE: Keep this around if we ever want to rebuild the mariadb-connector-cpp library
if(WIN32)
set(MACPP_SOURCES
${MACPP_SOURCES}
${mariadb-connector-cpp_SOURCE_DIR}/src/Dll.c
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDBConnCpp.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbDriver.h
${mariadb-connector-cpp_SOURCE_DIR}/src/UrlParser.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbDatabaseMetaData.h
${mariadb-connector-cpp_SOURCE_DIR}/src/HostAddress.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Version.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Consts.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbConnection.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbStatement.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDBWarning.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Protocol.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Identifier.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbSavepoint.h
${mariadb-connector-cpp_SOURCE_DIR}/src/SqlStates.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Results.h
${mariadb-connector-cpp_SOURCE_DIR}/src/ColumnDefinition.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbServerCapabilities.h
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/MasterProtocol.h
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/QueryProtocol.h
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/ConnectProtocol.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/capi/ColumnDefinitionCapi.h
${mariadb-connector-cpp_SOURCE_DIR}/src/cache/CallableStatementCache.h
${mariadb-connector-cpp_SOURCE_DIR}/src/cache/CallableStatementCacheKey.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/Value.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ClassField.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/Utils.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/StateChange.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/String.h
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/NoLogger.h
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/LoggerFactory.h
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/Logger.h
${mariadb-connector-cpp_SOURCE_DIR}/src/logger/ProtocolLoggingProxy.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ParameterHolder.h
${mariadb-connector-cpp_SOURCE_DIR}/src/options/Options.h
${mariadb-connector-cpp_SOURCE_DIR}/src/options/DefaultOptions.h
${mariadb-connector-cpp_SOURCE_DIR}/src/options/DriverPropertyInfo.h
${mariadb-connector-cpp_SOURCE_DIR}/src/io/PacketOutputStream.h
${mariadb-connector-cpp_SOURCE_DIR}/src/io/PacketInputStream.h
${mariadb-connector-cpp_SOURCE_DIR}/src/io/StandardPacketInputStream.h
${mariadb-connector-cpp_SOURCE_DIR}/src/credential/CredentialPlugin.h
${mariadb-connector-cpp_SOURCE_DIR}/src/credential/CredentialPluginLoader.h
${mariadb-connector-cpp_SOURCE_DIR}/src/pool/GlobalStateInfo.h
${mariadb-connector-cpp_SOURCE_DIR}/src/pool/Pools.h
${mariadb-connector-cpp_SOURCE_DIR}/src/pool/Pool.h
${mariadb-connector-cpp_SOURCE_DIR}/src/failover/FailoverProxy.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Listener.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformation.h
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/Connection.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/Statement.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/ResultSet.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/PreparedStatement.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/ParameterMetaData.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/ResultSetMetaData.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/DatabaseMetaData.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/CallableStatement.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/SQLString.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/Warning.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/Exception.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/jdbccompat.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/Driver.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/DriverManager.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/Types.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/buildconf.hpp
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp/CArray.hpp
${mariadb-connector-cpp_SOURCE_DIR}/src/SelectResultSet.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/capi/SelectResultSetCapi.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/SelectResultSetPacket.h
${mariadb-connector-cpp_SOURCE_DIR}/src/ColumnType.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/ColumnDefinitionPacket.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/ColumnNameMap.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Charset.h
${mariadb-connector-cpp_SOURCE_DIR}/src/ClientSidePreparedStatement.h
${mariadb-connector-cpp_SOURCE_DIR}/src/BasePrepareStatement.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbFunctionStatement.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbProcedureStatement.h
${mariadb-connector-cpp_SOURCE_DIR}/src/ServerSidePreparedStatement.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/BigDecimalParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/BooleanParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ByteArrayParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ByteParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/DateParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/DefaultParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/DoubleParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/FloatParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/IntParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/LongParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ULongParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/NullParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ReaderParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/ShortParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/StreamParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/TimeParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/TimestampParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/parameters/StringParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/Parameters.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbPooledConnection.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbParameterMetaData.h
${mariadb-connector-cpp_SOURCE_DIR}/src/CallParameter.h
${mariadb-connector-cpp_SOURCE_DIR}/src/CallableParameterMetaData.h
${mariadb-connector-cpp_SOURCE_DIR}/src/MariaDbResultSetMetaData.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/Packet.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ServerStatus.h
${mariadb-connector-cpp_SOURCE_DIR}/src/credential/Credential.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/LogQueryTool.h
${mariadb-connector-cpp_SOURCE_DIR}/src/PrepareResult.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ClientPrepareResult.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ServerPrepareResult.h
${mariadb-connector-cpp_SOURCE_DIR}/src/util/ServerPrepareStatementCache.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformationSingle.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformationBatch.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/CmdInformationMultiple.h
${mariadb-connector-cpp_SOURCE_DIR}/src/com/RowProtocol.h
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/BinRowProtocolCapi.h
${mariadb-connector-cpp_SOURCE_DIR}/src/protocol/capi/TextRowProtocolCapi.h
${mariadb-connector-cpp_SOURCE_DIR}/src/ExceptionFactory.h
${mariadb-connector-cpp_SOURCE_DIR}/src/StringImp.h
${mariadb-connector-cpp_SOURCE_DIR}/src/CArrayImp.h
${mariadb-connector-cpp_SOURCE_DIR}/src/SimpleParameterMetaData.h
${mariadb-connector-cpp_SOURCE_DIR}/src/maconncpp.def
)
endif()
add_library(mariadbclientcpp STATIC ${MACPP_SOURCES})
target_include_directories(mariadbclientcpp
PUBLIC
${mariadb-connector-cpp_SOURCE_DIR}/include
PRIVATE
${mariadb-connector-cpp_SOURCE_DIR}/include/conncpp
${mariadb-connector-cpp_SOURCE_DIR}/src/
)
target_link_libraries(mariadbclientcpp PRIVATE mariadbclient)
set(MARIADBCPP_FOUND TRUE)
set(MARIADBCPP_LIBRARY mariadbclientcpp)
set(MARIADBCPP_INCLUDE_DIR ${mariadb-connector-cpp_SOURCE_DIR}/include)
endif()
else() # WIN32
message(STATUS "Looking for prebuilt MariaDB Connector/C++")
find_library(MARIADBCPP_LIBRARY
NAMES
mariadbcpp
PATHS
${PROJECT_SOURCE_DIR}/ext/mariadbcpp/${lib_dir}/
)
set(MARIADBCPP_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/ext/mariadbcpp/include/) # Only look internally
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MariaDBCPP DEFAULT_MSG MARIADBCPP_LIBRARY MARIADBCPP_INCLUDE_DIR)
endif()
message(STATUS "MARIADBCPP_FOUND: ${MARIADBCPP_FOUND}")
message(STATUS "MARIADBCPP_LIBRARY: ${MARIADBCPP_LIBRARY}")
message(STATUS "MARIADBCPP_INCLUDE_DIR: ${MARIADBCPP_INCLUDE_DIR}")
add_library(mariadbcpp INTERFACE)
target_link_libraries(mariadbcpp INTERFACE ${MARIADBCPP_LIBRARY})
target_include_directories(mariadbcpp SYSTEM INTERFACE ${MARIADBCPP_INCLUDE_DIR})

View file

@ -1,12 +1,12 @@
message(STATUS "CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
if(${CMAKE_SOURCE_DIR} MATCHES " +")
set(STRIPPED_PATH "")
STRING(REGEX REPLACE " +" "_" STRIPPED_PATH "${CMAKE_SOURCE_DIR}")
set(STRIPPED_PATH "")
STRING(REGEX REPLACE " +" "_" STRIPPED_PATH "${CMAKE_SOURCE_DIR}")
message(STATUS
"Current path: ${CMAKE_SOURCE_DIR}\n"
"Suggested path: ${STRIPPED_PATH}\n"
"Your path contains spaces, this is not recommended.")
message(STATUS
"Current path: ${CMAKE_SOURCE_DIR}\n"
"Suggested path: ${STRIPPED_PATH}\n"
"Your path contains spaces, this is not recommended.")
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@ -33,3 +33,15 @@ set(libpath "lib${platform_suffix}")
if(WIN32)
set(CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH OFF)
endif()
if(APPLE)
# The modern Apple linker (ld_prime, Xcode 15+) warns when the same library
# appears more than once on the link line. CMake's dependency propagation
# legitimately repeats static libs (historically required by classic ld64),
# so the warning is pure noise: silence it where the linker supports the flag.
include(CheckLinkerFlag)
check_linker_flag(CXX "-Wl,-no_warn_duplicate_libraries" LINKER_SUPPORTS_NO_WARN_DUPLICATE_LIBRARIES)
if(LINKER_SUPPORTS_NO_WARN_DUPLICATE_LIBRARIES)
add_link_options("-Wl,-no_warn_duplicate_libraries")
endif()
endif()

View file

@ -1,5 +1,14 @@
# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE)
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(isMultiConfig)
set(CMAKE_CONFIGURATION_TYPES
"RelWithDebInfo;Debug;Release;MinSizeRel"
CACHE STRING "Available build configurations" FORCE)
if(CMAKE_GENERATOR STREQUAL "Ninja Multi-Config")
set(CMAKE_DEFAULT_BUILD_TYPE "RelWithDebInfo")
endif()
elseif(NOT CMAKE_BUILD_TYPE)
message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
set(CMAKE_BUILD_TYPE
"RelWithDebInfo"
@ -8,10 +17,11 @@ if(NOT CMAKE_BUILD_TYPE)
set_property(
CACHE CMAKE_BUILD_TYPE
PROPERTY STRINGS
"Debug"
"Release"
"MinSizeRel"
"RelWithDebInfo")
"RelWithDebInfo"
"Debug"
"Release"
"MinSizeRel"
)
endif()
option(ENABLE_IPO "Enable Interprocedural Optimization, aka Link Time Optimization (LTO)" ON)
@ -41,8 +51,6 @@ if(MSVC)
list(APPEND FLAGS_AND_DEFINES
-D_CONSOLE
-D_MBCS
-DNOMINMAX
-D_CRT_SECURE_NO_WARNINGS
-D_CRT_NONSTDC_NO_DEPRECATE
# TODO: This is being overwritten by /Ob0
# /Ob2 # Inline Function Expansion
@ -68,7 +76,7 @@ if(MSVC)
)
endif()
link_libraries(WS2_32 dbghelp Shlwapi)
link_libraries(ws2_32 dbghelp shlwapi winmm shell32 user32)
endif()
if(UNIX)
@ -87,33 +95,48 @@ string(REPLACE ";" " " FLAGS_AND_DEFINES_STR "${FLAGS_AND_DEFINES}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS_AND_DEFINES_STR}")
function(set_target_output_directory target)
message(STATUS "Setting output directory for ${target} to ${CMAKE_SOURCE_DIR}")
# Run from the repo root: data, scripts, settings and the runtime DLLs all live there.
# DEBUGGER_WORKING_DIRECTORY (CMake 4.0+): Ninja and other non-VS generators.
# VS_DEBUGGER_WORKING_DIRECTORY: Visual Studio generator (takes precedence there).
set_target_properties(${target} PROPERTIES
VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_ASAN "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_UBSAN "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_TSAN "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_MSAN "${CMAKE_SOURCE_DIR}"
RUNTIME_OUTPUT_DIRECTORY_LSAN "${CMAKE_SOURCE_DIR}"
)
DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
message(STATUS "${target}: staging build artifact to ${CMAKE_SOURCE_DIR} after build")
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"$<TARGET_FILE:${target}>"
"${CMAKE_SOURCE_DIR}/$<TARGET_FILE_NAME:${target}>"
VERBATIM)
if(MSVC)
add_custom_command(TARGET ${target} POST_BUILD
COMMAND "$<$<CONFIG:Debug,RelWithDebInfo>:${CMAKE_COMMAND};-E;copy_if_different;$<TARGET_PDB_FILE:${target}>;${CMAKE_SOURCE_DIR}/$<TARGET_PDB_FILE_NAME:${target}>>"
COMMAND_EXPAND_LISTS
VERBATIM)
endif()
if(APPLE)
# Under LTO the linker merges codegen objects into temp files and deletes after linking.
# We need to preserve those for the next step!
# -object_path_lto persists those codegen objects to a real, per-target directory so
# dsymutil can gather their DWARF into the .dSYM.
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
set(lto_object_dir "${CMAKE_BINARY_DIR}/lto-objects/${target}")
file(MAKE_DIRECTORY "${lto_object_dir}")
target_link_options(${target} PRIVATE "-Wl,-object_path_lto,${lto_object_dir}")
endif()
# dsymutil consolidates the DWARF into a self-contained .dSYM that travels with the
# binary, and atos picks it up automatically.
add_custom_command(TARGET ${target} POST_BUILD
COMMAND "$<$<CONFIG:Debug,RelWithDebInfo>:dsymutil;$<TARGET_FILE:${target}>;-o;${CMAKE_SOURCE_DIR}/$<TARGET_FILE_NAME:${target}>.dSYM>"
COMMAND_EXPAND_LISTS
VERBATIM)
endif()
endfunction()
function(disable_lto target)
target_compile_options(${target} PRIVATE -fno-lto)
target_link_options(${target} PRIVATE -fno-lto)
endfunction()
# If we're on Unix and the system is 32-bit (void* is 4-bytes wide),
# then there's a good chance we're compiling for Raspberry Pi.
# Currently, CMake doesn't detect this properly and needs some help
# to link libatomic.
# Source: https://gitlab.kitware.com/cmake/cmake/-/issues/21174
#
# TODO: Use include(CheckCXXSourceCompiles) to make this check better.
if(UNIX AND CMAKE_SIZEOF_VOID_P EQUAL 4)
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -latomic")
endif()

View file

@ -0,0 +1,16 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.allegiance
values:
mob: 0
player: 1
san_doria: 2
bastok: 3
windurst: 4
wyverns: 5
griffons: 6

53
data/enums/animation.yaml Normal file
View file

@ -0,0 +1,53 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.animation
values:
none: 0
attack: 1
despawn: 2
death: 3
event: 4
chocobo: 5
fishing: 6
open_door: 8
close_door: 9
elevator_up: 10
elevator_down: 11
fishing_npc: 32
healing: 33
fishing_fish: 38
fishing_caught: 39
fishing_rod_break: 40
fishing_line_break: 41
fishing_monster: 42
fishing_stop: 43
synth: 44
sit: 47
ranged: 48
fishing_start: 50
new_fishing_start: 56
new_fishing_fish: 57
new_fishing_caught: 58
new_fishing_rod_break: 59
new_fishing_line_break: 60
new_fishing_monster: 61
new_fishing_stop: 62
# 63 through 73 are used with /sitchair
sitchair_0: 63
sitchair_1: 64
sitchair_2: 65
sitchair_3: 66
sitchair_4: 67
sitchair_5: 68
sitchair_6: 69
sitchair_7: 70
sitchair_8: 71
sitchair_9: 72
sitchair_10: 73
mount: 85
trust: 90 # trust NPC spawn-in animation

View file

@ -0,0 +1,15 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.attackType
values:
none: 0
physical: 1
magical: 2
ranged: 3
breath: 4
special: 5

17
data/enums/behavior.yaml Normal file
View file

@ -0,0 +1,17 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint16_t
lua:
table: xi.behavior
values:
none: 0x000
no_despawn: 0x001 # mob does not despawn on death
standback: 0x002 # mob will standback forever
raisable: 0x004 # mob can be raised via Raise spells
no_assist: 0x008 # mob can not be targeted by helpful magic from players (cure, protect, etc)
aggro_ambush: 0x200 # mob aggroes by ambush
no_turn: 0x400 # mob does not turn to face target

View file

@ -0,0 +1,12 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.claimType
values:
exclusive: 0 # Regular exclusive claim behavior. Only one entity and related group can attack.
non_exclusive: 1 # Regular claim behavior but multiple unrelated entities can attack and compete for claim. Rewards distributed to last claiming entity.
unclaimable: 2 # Mob cannot be claimed. Multiple unrelated entities can attack. Rewards will not be distributed.

View file

@ -7,17 +7,17 @@ meta:
table: xi.damageType
values:
none: 0
piercing: 1
slashing: 2
blunt: 3
none: 0
piercing: 1
slashing: 2
blunt: 3
hand_to_hand: 4
elemental: 5
fire: 6
ice: 7
wind: 8
earth: 9
thunder: 10
water: 11
light: 12
dark: 13
elemental: 5
fire: 6
ice: 7
wind: 8
earth: 9
thunder: 10
water: 11
light: 12
dark: 13

21
data/enums/detects.yaml Normal file
View file

@ -0,0 +1,21 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint16_t
lua:
table: xi.detects
values:
none: 0x000
sight: 0x001
hearing: 0x002
sight_and_hearing: 0x003
lowhp: 0x004
none1: 0x008
none2: 0x010
magic: 0x020
weaponskill: 0x040
jobability: 0x080
scent: 0x100

View file

@ -7,26 +7,26 @@ meta:
table: xi.ecosystem
values:
unclassified: 0
amorph: 1
aquan: 2
arcana: 3
unclassified: 0
amorph: 1
aquan: 2
arcana: 3
archaic_machine: 4
beast: 5
beastmen: 6
bird: 7
demon: 8
dragon: 9
elemental: 10
empty: 11
humanoid: 12
lizard: 13
luminian: 14
luminion: 15
plantoid: 16
supreme_beings: 17
undead: 18
vermin: 19
voragean: 20
structures: 21
weapons: 22
beast: 5
beastmen: 6
bird: 7
demon: 8
dragon: 9
elemental: 10
empty: 11
humanoid: 12
lizard: 13
luminian: 14
luminion: 15
plantoid: 16
supreme_beings: 17
undead: 18
vermin: 19
voragean: 20
structures: 21
weapons: 22

View file

@ -7,9 +7,9 @@ meta:
table: xi.effectOverwrite
values:
equal_higher: 0 # only overwrite if equal or higher (tier, power)
higher: 1 # only overwrite if higher (tier, power)
never: 2 # never overwrite
always: 3 # always overwrite no matter
equal_higher: 0 # only overwrite if equal or higher (tier, power)
higher: 1 # only overwrite if higher (tier, power)
never: 2 # never overwrite
always: 3 # always overwrite no matter
ignore_duplicate: 4 # ignore dupes
tier_higher: 5 # only overwrite if tier is higher (regardless of power)
tier_higher: 5 # only overwrite if tier is higher (regardless of power)

View file

@ -7,12 +7,12 @@ meta:
table: xi.element
values:
none: 0
fire: 1
ice: 2
wind: 3
earth: 4
none: 0
fire: 1
ice: 2
wind: 3
earth: 4
thunder: 5
water: 6
light: 7
dark: 8
water: 6
light: 7
dark: 8

View file

@ -0,0 +1,21 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint32_t
lua:
table: xi.entityFlags
values:
none: 0x000
info_icon: 0x001 # (I) Icon next to name
# TODO: Flags 0x002, 0x004 and 0x008 do different things for different entities.
# : It isn't one-size-fits-all, and different combinations may do different things.
# : It'll need to be researched more.
# alt_appearance: 0x002
hide_name: 0x008
call_for_help: 0x020
hide_model: 0x080
hide_hp: 0x100
untargetable: 0x800

29
data/enums/immunity.yaml Normal file
View file

@ -0,0 +1,29 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint32_t
lua:
table: xi.immunity
values:
none: 0x00000000
addle: 0x00000001
gravity: 0x00000002
bind: 0x00000004
stun: 0x00000008
silence: 0x00000010
paralyze: 0x00000020
blind: 0x00000040
slow: 0x00000080
poison: 0x00000100
elegy: 0x00000200
requiem: 0x00000400
light_sleep: 0x00000800
dark_sleep: 0x00001000
aspir: 0x00002000
terror: 0x00004000
dispel: 0x00008000
petrify: 0x00010000
plague: 0x00020000

34
data/enums/job.yaml Normal file
View file

@ -0,0 +1,34 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
case: screaming
lua:
table: xi.job
values:
none: 0
war: 1
mnk: 2
whm: 3
blm: 4
rdm: 5
thf: 6
pld: 7
drk: 8
bst: 9
brd: 10
rng: 11
sam: 12
nin: 13
drg: 14
smn: 15
blu: 16
cor: 17
pup: 18
dnc: 19
sch: 20
geo: 21
run: 22
mon: 23 # NOTE: MON is not a full job

View file

@ -7,67 +7,69 @@ meta:
table: xi.latent
values:
hp_under_percent: 0 # hp less than or equal to % - PARAM: HP PERCENT
hp_over_percent: 1 # hp more than % - PARAM: HP PERCENT
hp_under_tp_under_100: 2 # hp less than or equal to %, tp under 100 - PARAM: HP PERCENT
hp_over_tp_under_100: 3 # hp more than %, tp over 100 - PARAM: HP PERCENT
mp_under_percent: 4 # mp less than or equal to % - PARAM: MP PERCENT
mp_under: 5 # mp less than # - PARAM: MP #
tp_under: 6 # tp under # and during WS - PARAM: TP VALUE
tp_over: 7 # tp over # - PARAM: TP VALUE
subjob: 8 # subjob - PARAM: JOBTYPE
pet_id: 9 # pettype - PARAM: PETID
weapon_drawn: 10 # weapon drawn
weapon_sheathed: 11 # weapon sheathed
signet_bonus: 12 # While in conquest region and engaged to an even match or less target
status_effect_active: 13 # status effect on player - PARAM: EFFECTID
no_food_active: 14 # no food effects active on player
party_members: 15 # party size # - PARAM: # OF MEMBERS
party_members_in_zone: 16 # party size # and members in zone - PARAM: # OF MEMBERS
sanction_regen_bonus: 17 # While in besieged region and HP is less than PARAM%
hp_under_percent: 0 # hp less than or equal to % - PARAM: HP PERCENT
hp_over_percent: 1 # hp more than % - PARAM: HP PERCENT
hp_under_tp_under_100: 2 # hp less than or equal to %, tp under 100 - PARAM: HP PERCENT
hp_over_tp_under_100: 3 # hp more than %, tp over 100 - PARAM: HP PERCENT
mp_under_percent: 4 # mp less than or equal to % - PARAM: MP PERCENT
mp_under: 5 # mp less than # - PARAM: MP #
tp_under: 6 # tp under # and during WS - PARAM: TP VALUE
tp_over: 7 # tp over # - PARAM: TP VALUE
subjob: 8 # subjob - PARAM: JOBTYPE
pet_id: 9 # pettype - PARAM: PETID
weapon_drawn: 10 # weapon drawn
weapon_sheathed: 11 # weapon sheathed
signet_bonus: 12 # While in conquest region and engaged to an even match or less target
status_effect_active: 13 # status effect on player - PARAM: EFFECTID
no_food_active: 14 # no food effects active on player
party_members: 15 # party size # - PARAM: # OF MEMBERS
party_members_in_zone: 16 # party size # and members in zone - PARAM: # OF MEMBERS
sanction_regen_bonus: 17 # While in besieged region and HP is less than PARAM%
sanction_refresh_bonus: 18 # While in besieged region and MP is less than PARAM%
sigil_regen_bonus: 19 # While in campaign region and HP is less than PARAM%
sigil_refresh_bonus: 20 # While in campaign region and MP is less than PARAM%
avatar_in_party: 21 # party has a specific avatar - PARAM: same as globals/pets.lua (21 for any avatar)
job_in_party: 22 # party has job - PARAM: JOBTYPE
zone: 23 # in zone - PARAM: zoneid
synth_trainee: 24 # synth skill under 40 + no support: PARAM: 48: FISH, 49: WOOD, 50: SMITH, 51: GOLDSMITH, 52: CLOTH, 53: LEATHER, 54: BONE, 55: ALCHEMY, 56: COOKING
song_roll_active: 25 # any song or roll active
time_of_day: 26 # PARAM: 0: DAYTIME 1: NIGHTTIME 2: DUSK-DAWN
hour_of_day: 27 # PARAM: 1: NEW DAY, 2: DAWN, 3: DAY, 4: DUSK, 5: EVENING, 6: DEAD OF NIGHT
firesday: 28
earthsday: 29
watersday: 30
windsday: 31
darksday: 32
iceday: 34
lightningsday: 35
lightsday: 36
moon_phase: 37 # PARAM: 0: New Moon, 1: Waxing Crescent, 2: First Quarter, 3: Waxing Gibbous, 4: Full Moon, 5: Waning Gibbous, 6: Last Quarter, 7: Waning Crescent
job_multiple: 38 # PARAM: 0: ODD, 2: EVEN, 3-X: DIVISOR
job_multiple_at_night: 39 # PARAM: 0: ODD, 2: EVEN, 3-X: DIVISOR
equipped_in_slot: 40 # When item is equipped in the specified slot (e.g. Dweomer Knife, Erlking's Sword, etc.) PARAM: slotID
during_ws: 41 # During WS
weather_condition: 42 # See Weather.h for WEATHER enum
weapon_drawn_hp_under: 43 # PARAM: HP PERCENT
nation_citizen: 44 # Triggered by player being citizen of nation matching param: 0 San d'Oria, 1 Bastok, 2 Windurst
mp_under_visible_gear: 45 # mp less than or equal to %, calculated using MP bonuses from visible gear only
hp_over_visible_gear: 46 # hp more than or equal to %, calculated using HP bonuses from visible gear only
weapon_broken: 47
in_dynamis: 48
food_active: 49 # food effect (foodId) active - PARAM: FOOD ITEMID
job_level_below: 50 # PARAM: level
job_level_above: 51 # PARAM: level
weather_element: 52 # PARAM: 0: NONE, 1: FIRE, 2: ICE, 3: WIND 4: EARTH, 5: THUNDER, 6: WATER, 7: LIGHT, 8: DARK
nation_control: 53 # checks if player region is under nation's control - PARAM: 0: Under own nation's control, 1: Outside own nation's control
zone_home_nation: 54 # in zone and citizen of nation (aketons)
mp_over: 55 # mp greater than # - PARAM: MP #
weapon_drawn_mp_over: 56 # while weapon is drawn and mp greater than # - PARAM: MP #
eleven_roll_active: 57 # corsair roll of 11 active
in_assault: 58 # is in an Instance battle in a TOAU zone
vs_ecosystem: 59 # Vs. Specific Ecosystem ID (e.g. Vs. Plantoid: Accuracy+3)
vs_species: 60 # Vs. Specific Species ID (e.g. Vs. Korrigan: Accuracy+3)
vs_family: 61 # Vs. Specific Family ID (e.g. Vs. Mandragora: Accuracy+3)
mainjob: 62 # mainjob - PARAM: JOBTYPE
in_adoulin: 63
in_garrison: 64 # while in an active Garrison
sigil_regen_bonus: 19 # While in campaign region and HP is less than PARAM%
sigil_refresh_bonus: 20 # While in campaign region and MP is less than PARAM%
avatar_in_party: 21 # party has a specific avatar - PARAM: same as globals/pets.lua (21 for any avatar)
job_in_party: 22 # party has job - PARAM: JOBTYPE
zone: 23 # in zone - PARAM: zoneid
synth_trainee: 24 # synth skill under 40 + no support: PARAM: 48: FISH, 49: WOOD, 50: SMITH, 51: GOLDSMITH, 52: CLOTH, 53: LEATHER, 54: BONE, 55: ALCHEMY, 56: COOKING
song_roll_active: 25 # any song or roll active
time_of_day: 26 # PARAM: 0: DAYTIME 1: NIGHTTIME 2: DUSK-DAWN
hour_of_day: 27 # PARAM: 1: NEW DAY, 2: DAWN, 3: DAY, 4: DUSK, 5: EVENING, 6: DEAD OF NIGHT
firesday: 28
earthsday: 29
watersday: 30
windsday: 31
darksday: 32
iceday: 34
lightningsday: 35
lightsday: 36
moon_phase: 37 # PARAM: 0: New Moon, 1: Waxing Crescent, 2: First Quarter, 3: Waxing Gibbous, 4: Full Moon, 5: Waning Gibbous, 6: Last Quarter, 7: Waning Crescent
job_multiple: 38 # PARAM: 0: ODD, 2: EVEN, 3-X: DIVISOR
job_multiple_at_night: 39 # PARAM: 0: ODD, 2: EVEN, 3-X: DIVISOR
equipped_in_slot: 40 # When item is equipped in the specified slot (e.g. Dweomer Knife, Erlking's Sword, etc.) PARAM: slotID
during_ws: 41 # During WS
weather_condition: 42 # See Weather.h for WEATHER enum
weapon_drawn_hp_under: 43 # PARAM: HP PERCENT
nation_citizen: 44 # Triggered by player being citizen of nation matching param: 0 San d'Oria, 1 Bastok, 2 Windurst
mp_under_visible_gear: 45 # mp less than or equal to %, calculated using MP bonuses from visible gear only
hp_over_visible_gear: 46 # hp more than or equal to %, calculated using HP bonuses from visible gear only
weapon_broken: 47
in_dynamis: 48
food_active: 49 # food effect (foodId) active - PARAM: FOOD ITEMID
job_level_below: 50 # PARAM: level
job_level_above: 51 # PARAM: level
weather_element: 52 # PARAM: 0: NONE, 1: FIRE, 2: ICE, 3: WIND 4: EARTH, 5: THUNDER, 6: WATER, 7: LIGHT, 8: DARK
nation_control: 53 # checks if player region is under nation's control - PARAM: 0: Under own nation's control, 1: Outside own nation's control
zone_home_nation: 54 # in zone and citizen of nation (aketons)
mp_over: 55 # mp greater than # - PARAM: MP #
weapon_drawn_mp_over: 56 # while weapon is drawn and mp greater than # - PARAM: MP #
eleven_roll_active: 57 # corsair roll of 11 active
in_assault: 58 # is in an Instance battle in a TOAU zone
vs_ecosystem: 59 # Vs. Specific Ecosystem ID (e.g. Vs. Plantoid: Accuracy+3)
vs_species: 60 # Vs. Specific Species ID (e.g. Vs. Korrigan: Accuracy+3)
vs_family: 61 # Vs. Specific Family ID (e.g. Vs. Mandragora: Accuracy+3)
mainjob: 62 # mainjob - PARAM: JOBTYPE
in_adoulin: 63
in_garrison: 64 # while in an active Garrison
sanction_food_bonus: 65 # While in besieged region
sigil_food_bonus: 66 # While in campaign region

107
data/enums/mob_mod.yaml Normal file
View file

@ -0,0 +1,107 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint16_t
lua:
table: xi.mobMod
values:
none: 0
gil_min: 1 # minimum gil drop -- spawn mod only
gil_max: 2 # maximum gil drop -- spawn mod only
mp_base: 3 # Give mob mp. Used for mobs that are not mages, wyverns, avatars
sight_range: 4 # sight range
sound_range: 5 # sound range
buff_chance: 6 # % chance to buff (combat only)
ga_chance: 7 # % chance to use -ga spell
heal_chance: 8 # % chance to use heal
hp_heal_chance: 9 # can cast cures below this HP %
sublink: 10 # Sub link group. Enables mobs from different families to link if they share a SUBLINK value.
link_radius: 11 # link radius
sees_through_illusion: 12 # Mob can see through the Illusion effect that grants effects similar to Sneak & Invisible without this mod and allows aggro (see Viscious Liquid in mamook)
severe_spell_chance: 13 # % chance to use a severe spell like death or impact
skill_list: 14 # uses given mob skill list
mug_gil: 15 # amount gil carried for mugging
detection: 16 # Overrides mob family's detection method. In order to set to override to none an unused bit must be set such as xi::Detects::None1.
no_despawn: 17 # do not despawn when too far from spawn. Gob Diggers have this.
var: 18 # temp var for whatever. Gets cleared on spawn
can_shield_block: 19 # toggle shield use for mobs without physical shields (trusts)
no_h2h_penalty: 20 # Disables H2H penalty in base damage calculation when set to non-zero
pet_spell_list: 21 # set pet spell list
na_chance: 22 # % chance to cast -na
immunity: 23 # immune to set status effects. This only works from the db, not scripts
gradual_rage: 24 # (!) TODO: NOT YET IMPLEMENTED -- gradually rages
build_resist: 25 # (!) TODO: NOT YET IMPLEMENTED -- builds resistance to given effects
superlink: 26 # super link group. Only use this in scripts! Must be defined in onMobInitialize if relevant mobs are different families
spell_list: 27 # set spell list
exp_bonus: 28 # bonus exp (bonus / 100) negative values reduce exp.
assist: 29 # mobs will assist me
special_skill: 30 # give special skill
roam_distance: 31 # distance allowed to roam from spawn
dont_roam_home: 32 # Allow mobs to roam any distance from spawn. Useful for mobs with scripted roaming behavior.
special_cool: 33 # cool down for special
magic_cool: 34 # cool down for magic
standback_cool: 35 # cool down time for standing back (casting spell while not in attack range)
roam_cool: 36 # cool down time in seconds after roaming
always_aggro: 37 # aggro regardless of level. Spheroids
no_drops: 38 # If set monster cannot drop any items, not even seals.
share_pos: 39 # share a pos with another mob (eald'narche exoplates)
teleport_cd: 40 # cooldown for teleport abilities (tarutaru AA, angra mainyu, eald'narche)
teleport_start: 41 # mobskill ID to begin teleport
teleport_end: 42 # mobskill ID to end teleport
teleport_type: 43 # teleport type - 1: on cooldown, 2 - to close distance
dual_wield: 44 # enables a mob to use their offhand in attacks
add_effect: 45 # enables additional effect script to process on mobs attacks
auto_spikes: 46 # enables additional effect script to process when mob is attacked
spawn_leash: 47 # forces a mob to not move farther from its spawn than its leash distance
share_target: 48 # mob always targets same target as ID in this var
check_as_nm: 49 # If set , mob will check as a NM
roam_reset_facing: 50 # Resume facing the default spawn rotation after roaming home.
roam_turns: 51 # Maximum amount of turns during a roam
roam_rate: 52 # Roaming frequency. roam_cool - rand(roam_cool / (roam_rate / 10))
behavior: 53 # Add behaviors to mob
gil_bonus: 54 # Allow mob to drop gil. Multiplier to gil dropped by mob (bonus / 100) * total
idle_despawn: 55 # Time (in seconds) to despawn after being idle
hp_standback: 56 # mob will always standback with hp % higher to value
magic_delay: 57 # Amount of seconds mob waits before casting first spell
special_delay: 58 # Amount of seconds mob waits before using first special
base_damage_modifier: 59 # Add a flat modifer mob a mob's base damage. This is subject to multiplication by MOBMOD_BASE_DAMAGE_MULTIPLIER.
spawn_animationsub: 60 # reset animationsub to this on spawn
hp_scale: 61 # Scale the mobs max HP. ( hp_scale / 100 ) * maxhp
no_standback: 62 # Mob will never standback
attack_skill_list: 63 # skill list to use in place of regular attacks
charmable: 64 # mob is charmable
no_move: 65 # Mob will not be able to move
multi_hit: 66 # Mob will have as many swings as defined.
no_aggro: 67 # If set, mob cannot aggro until unset.
alli_hate: 68 # Range around target to add alliance member to enmity list.
no_link: 69 # If set, mob cannot link until unset.
no_rest: 70 # Mob cannot regain hp (e.g. re-burrowing antlions during ENM).
leader: 71 # Used for mob following. Positive number is how many followers a leader has. A negative number is the distance from this mob ID to the leader ID.
magic_range: 72 # magic aggro range
target_distance_offset: 73 # Adjusts how close a mob will move to it's target. 12 = 1.2 yalm. Positive values to go closer, negative farther.
one_way_linking: 74 # Will link with other mobs in its party (typically the same mob family) while roaming, but will not let others link with it once engaged
can_parry: 75 # Check if a mob is allowed to have parry rank (Rank Value 1-5)
no_widescan: 76 # Disables widescan for a specific mob
trust_distance: 77 # TRUSTS ONLY: Set movement type/distance. See trust.lua for details.
standback_range: 78 # Applies a specific standback range for the mob
cannot_guard: 79 # Check if the mob does not guard(despite being a MNK or PUP mob)
skip_allegiance_check: 80 # Skip the allegiance check for valid target (allows for example a mob to cast a TARGET_ENEMY spell on itself)
ability_response: 81 # Mob can respond to player ability use with onPlayerAbilityUse()
run_speed_mult: 82 # Multiplier for the speed of a mob while running (generally when the target is out of range) 100 = 1.00x
claim_type: 83 # Changes the claim behavior of the mob. See xi::ClaimType enum.
no_spell_cost: 84 # Mob does not use MP when casting spells
astral_pet_offset: 85 # If non-zero, defines the offset from main mob's ID for astral flow (if zero, will assume offset of 2)
base_damage_multiplier: 86 # Multiplies the mob's base damage. Example: 150 = x1.5. MOBMOD_DAMAGE_OFFSET/MOBMOD_RANGED_DAMAGE_OFFSET are not subject to multiplication.
damage_offset: 87 # Adds or subtracts the mob's base damage offset.
ranged_damage_offset: 88 # Adds or subtracts the mob's ranged base damage offset.
avatar_petid: 89 # A value from xi.petId to select model/ability from when owner uses astral flow
avatar_astral_delay: 90 # Number of milliseconds to delay AF after avatar spawn
h2h_single_swing: 91 # Mob will have only one swing per attack even as MNK with H2H skill
aoe_hit_all: 92 # Mob AoE can hit any player regardless of enmity
ranged_attack_range: 93 # Max range for ranged auto attacks. Mob will move closer if target is beyond this range.
follow_leash_range: 94 # Distance the leader can walk before their followers start moving. Applied to followers.
follow_stop_range: 95 # Distance the followers attempt to stop at once their leader stops moving. Applied to followers.
trust_shield_size: 96 # TRUSTS ONLY: Set the size of the mob's shield. 3 = Default size, only used for trusts that use shields.
bodyguard: 97 # Charmed mob defends its master similar to an avatar. (Maiden's Virelai)

17
data/enums/mob_type.yaml Normal file
View file

@ -0,0 +1,17 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint8_t
lua:
table: xi.mobType
values:
normal: 0x00
unused: 0x01 # available for use
notorious: 0x02
fished: 0x04
called: 0x08
battlefield: 0x10
event: 0x20

1275
data/enums/mod.yaml Normal file

File diff suppressed because it is too large Load diff

14
data/enums/name_vis.yaml Normal file
View file

@ -0,0 +1,14 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint8_t
lua:
table: xi.nameVis
values:
none: 0x00
icon: 0x01 # (I) Icon next to name
hide_name: 0x08
ghost_phase: 0x80

23
data/enums/roam_flag.yaml Normal file
View file

@ -0,0 +1,23 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint16_t
lua:
table: xi.roamFlag
values:
none: 0x000
none0: 0x001
none1: 0x002
none2: 0x004
none3: 0x008
none4: 0x010
none5: 0x020
worm: 0x040 # pop up and down when moving
ambush: 0x080 # stays hidden until someone comes close (antlion)
scripted: 0x100 # calls lua method for roaming logic
ignore: 0x200 # ignore all hate, except linking hate
stealth: 0x400 # stays name hidden and untargetable until someone comes close (chigoe)
follow: 0x800 # follows a player when sighted for a little while

View file

@ -0,0 +1,65 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.skill
values:
# Combat Skills
none: 0
hand_to_hand: 1
dagger: 2
sword: 3
great_sword: 4
axe: 5
great_axe: 6
scythe: 7
polearm: 8
katana: 9
great_katana: 10
club: 11
staff: 12
# 13-21 unused
automaton_melee: 22
automaton_ranged: 23
automaton_magic: 24
archery: 25
marksmanship: 26
throwing: 27
# Defensive Skills
guard: 28
evasion: 29
shield: 30
parry: 31
# Magic Skills
divine_magic: 32
healing_magic: 33
enhancing_magic: 34
enfeebling_magic: 35
elemental_magic: 36
dark_magic: 37
summoning_magic: 38
ninjutsu: 39
singing: 40
string_instrument: 41
wind_instrument: 42
blue_magic: 43
geomancy: 44
handbell: 45
# 46-47 unused
# Crafting Skills
fishing: 48
woodworking: 49
smithing: 50
goldsmithing: 51
clothcraft: 52
leathercraft: 53
bonecraft: 54
alchemy: 55
cooking: 56
synergy: 57
# Other Skills
rid: 58
dig: 59

View file

@ -0,0 +1,11 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.spawnAnimation
values:
normal: 0
special: 1

View file

@ -0,0 +1,19 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint8_t
lua:
table: xi.spawnType
values:
normal: 0x00 # 00:00-24:00
at_night: 0x01 # 20:00-04:00
at_evening: 0x02 # 18:00-06:00
weather: 0x04
fog: 0x08 # 02:00-07:00
moonphase: 0x10
lottery: 0x20
windowed: 0x40
scripted: 0x80 # scripted spawn

17
data/enums/status.yaml Normal file
View file

@ -0,0 +1,17 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint8_t
lua:
table: xi.status
values:
normal: 0
update: 1
disappear: 2
invisible: 3
status_4: 4
cutscene_only: 6
status_18: 18
shutdown: 20

View file

@ -8,35 +8,35 @@ meta:
table: xi.effectFlag
values:
none: 0x00000000
dispelable: 0x00000001
erasable: 0x00000002
attack: 0x00000004
empathy: 0x00000008
damage: 0x00000010
death: 0x00000020
magic_begin: 0x00000040
magic_end: 0x00000080
on_zone: 0x00000100
none: 0x00000000
dispelable: 0x00000001
erasable: 0x00000002
attack: 0x00000004
empathy: 0x00000008
damage: 0x00000010
death: 0x00000020
magic_begin: 0x00000040
magic_end: 0x00000080
on_zone: 0x00000100
no_loss_message: 0x00000200
invisible: 0x00000400
detectable: 0x00000800
no_rest: 0x00001000
prevent_action: 0x00002000
waltzable: 0x00004000
food: 0x00008000
song: 0x00010000
roll: 0x00020000
synth_support: 0x00040000
confrontation: 0x00080000
logout: 0x00100000
bloodpact: 0x00200000
on_jobchange: 0x00400000
no_cancel: 0x00800000
influence: 0x01000000
offline_tick: 0x02000000
aura: 0x04000000
hide_timer: 0x08000000
on_zone_pathos: 0x10000000
invisible: 0x00000400
detectable: 0x00000800
no_rest: 0x00001000
prevent_action: 0x00002000
waltzable: 0x00004000
food: 0x00008000
song: 0x00010000
roll: 0x00020000
synth_support: 0x00040000
confrontation: 0x00080000
logout: 0x00100000
bloodpact: 0x00200000
on_jobchange: 0x00400000
no_cancel: 0x00800000
influence: 0x01000000
offline_tick: 0x02000000
aura: 0x04000000
hide_timer: 0x08000000
on_zone_pathos: 0x10000000
always_expiring: 0x20000000
on_attack: 0x40000000
on_attack: 0x40000000

29
data/enums/weather.yaml Normal file
View file

@ -0,0 +1,29 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
cpp:
underlying: uint16_t
lua:
table: xi.weather
values:
none: 0
sunshine: 1
clouds: 2
fog: 3
hot_spell: 4
heat_wave: 5
rain: 6
squall: 7
dust_storm: 8
sand_storm: 9
wind: 10
gales: 11
snow: 12
blizzards: 13
thunder: 14
thunderstorms: 15
auroras: 16
stellar_glare: 17
gloom: 18
darkness: 19

26
data/enums/zone_misc.yaml Normal file
View file

@ -0,0 +1,26 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint16_t
lua:
table: xi.zoneMisc
values:
none: 0x0000 # Able to be used in any area
escape: 0x0001 # Ability to use Escape Spell
fellow: 0x0002 # Ability to summon Fellow NPC
mount: 0x0004 # Ability to use Chocobos and mounts
mazurka: 0x0008 # Ability to use Mazurka Spell
tractor: 0x0010 # Ability to use Tractor Spell
mogmenu: 0x0020 # Ability to communicate with Nomad Moogle (menu access mog house)
costume: 0x0040 # Ability to use a Costumes
pet: 0x0080 # Ability to summon Pets
treasure: 0x0100 # Presence in the global zone TreasurePool
auction_house: 0x0200 # Ability to use the auction house
yell: 0x0400 # Send and receive /yell commands
trust: 0x0800 # Ability to summon Trust NPC
los_player_block: 0x1000 # Players can't use magic/JAs through walls if this is set
los_off: 0x2000 # Zone should not have LoS checks
assist: 0x4000 # Send and receive /assiste, /assistj commands

20
data/enums/zone_type.yaml Normal file
View file

@ -0,0 +1,20 @@
# yaml-language-server: $schema=../schemas/enums/_enum.schema.json
meta:
flags: true
cpp:
underlying: uint16_t
lua:
table: xi.zoneType
values:
unknown: 0x0000
city: 0x0001
outdoors: 0x0002
dungeon: 0x0004
signet: 0x0008
sanction: 0x0010
sigil: 0x0020
ionis: 0x0040
dynamis: 0x0080
instanced: 0x0100

File diff suppressed because it is too large Load diff

View file

@ -12,6 +12,7 @@ apk --update-cache add \
bash \
binutils \
git \
libdwarf \
lua5.1-dev \
luajit \
mariadb-client \
@ -65,13 +66,15 @@ apk --update-cache add \
ccache \
cmake \
g++ \
libdwarf-dev \
linux-headers \
luajit-dev \
make \
mariadb-dev \
ninja-build \
ninja-is-really-ninja \
openssl-dev \
python3-dev \
samurai \
zeromq-dev \
zlib-dev \
zstd-dev

View file

@ -19,6 +19,7 @@ apt-get update && apt-get install --assume-yes --no-install-recommends --quiet \
binutils \
ca-certificates \
git \
libdwarf1 \
libzmq5 \
lua5.1 \
luajit \
@ -74,12 +75,14 @@ apt-get update && apt-get install --assume-yes --no-install-recommends --quiet \
ccache \
cmake \
g++-$GCC_VERSION \
libdwarf-dev \
libluajit-5.1-dev \
libmariadb-dev-compat \
libssl-dev \
libzmq3-dev \
make \
ninja-build \
pkg-config \
python3-dev \
python3-venv \
zlib1g-dev \

View file

@ -1,9 +1,9 @@
# add_subdirectory(lua) # Handled globally
# add_subdirectory(mariadb) # Handled globally
# add_subdirectory(mariadbcpp) # Handled globally
# add_subdirectory(zmq) # Handled globally
# add_subdirectory(openssl) # Handled globally
add_subdirectory(concurrentqueue)
add_subdirectory(SPSCQueue)
add_subdirectory(sol)
# CPM Modules
@ -42,24 +42,48 @@ if(TRACY_ENABLE)
tar xvf "${CMAKE_SOURCE_DIR}/tracy.tar.gz"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/
)
else() # UNIX
# TODO: Auto-build Tracy and capture executables on Linux
# sudo apt-get -y install libglfw3-dev libdbus-1-dev libcapstone-dev libtbb-dev libdebuginfod-dev libfreetype-dev
else() # UNIX (Linux / macOS)
include(ExternalProject)
# execute_process(COMMAND "make"
# WORKING_DIRECTORY ${tracy_SOURCE_DIR}/profiler/build/unix
# )
# target name:source subdirectory
set(TRACY_TOOLS
"tracy-capture:capture"
"tracy-csvexport:csvexport"
)
# execute_process(COMMAND "make"
# WORKING_DIRECTORY ${tracy_SOURCE_DIR}/capture/build/unix
# )
foreach(_tracy_tool ${TRACY_TOOLS})
string(REPLACE ":" ";" _tracy_tool "${_tracy_tool}")
list(GET _tracy_tool 0 _tracy_tool_name)
list(GET _tracy_tool 1 _tracy_tool_dir)
message(STATUS "Configuring Tracy tool: ${_tracy_tool_name}")
set(_tracy_tool_bindir ${CMAKE_BINARY_DIR}/tracy-tools/${_tracy_tool_name})
ExternalProject_Add(${_tracy_tool_name}
SOURCE_DIR ${TracyClient_SOURCE_DIR}/${_tracy_tool_dir}
BINARY_DIR ${_tracy_tool_bindir}
CMAKE_ARGS
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}
-DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${_tracy_tool_bindir}
BUILD_ALWAYS TRUE
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different
${_tracy_tool_bindir}/${_tracy_tool_name}
${CMAKE_SOURCE_DIR}/${_tracy_tool_name}
)
endforeach()
endif()
endif(TRACY_ENABLE)
CPMAddPackage(
NAME fmt
GITHUB_REPOSITORY fmtlib/fmt
GIT_TAG 12.1.0
GIT_TAG 12.2.0
SYSTEM ON
) # defines: fmt::fmt
@ -108,7 +132,7 @@ endif()
CPMAddPackage(
NAME rapidyaml
GITHUB_REPOSITORY biojppm/rapidyaml
GIT_TAG v0.12.0
GIT_TAG v0.15.2
SYSTEM ON
OPTIONS
"RYML_BUILD_TOOLS OFF"
@ -147,7 +171,7 @@ CPMAddPackage(
CPMAddPackage(
NAME cpp-httplib
GITHUB_REPOSITORY yhirose/cpp-httplib
GIT_TAG v0.18.3
GIT_TAG v0.49.0
SYSTEM ON
OPTIONS
"HTTPLIB_REQUIRE_ZLIB OFF"
@ -157,7 +181,7 @@ CPMAddPackage(
CPMAddPackage(
NAME json
GITHUB_REPOSITORY nlohmann/json
GIT_TAG 9f60e855576bb1e95f39ab23b3821982cccb0bab
GIT_TAG v3.12.0
SYSTEM ON
) # defines: nlohmann_json::nlohmann_json
@ -173,9 +197,9 @@ endif()
CPMAddPackage(
NAME asio
VERSION 1.36.0
VERSION 1.38.0
GITHUB_REPOSITORY chriskohlhoff/asio
GIT_TAG asio-1-36-0 # asio uses non-standard version tag, we must specify GIT_TAG
GIT_TAG asio-1-38-0 # asio uses non-standard version tag, we must specify GIT_TAG
) #defines asio
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
@ -185,7 +209,7 @@ CPMAddPackage(
if(asio_ADDED)
add_library(asio INTERFACE)
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/asio/include)
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/include)
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
@ -257,7 +281,7 @@ CPMAddPackage(
CPMAddPackage(
NAME magic_enum
GITHUB_REPOSITORY Neargye/magic_enum
GIT_TAG 1a1824df7ac798177a521eed952720681b0bf482
GIT_TAG v0.9.8
SYSTEM ON
) # defines: magic_enum
@ -268,12 +292,56 @@ CPMAddPackage(
SYSTEM ON
) # defines: termcolor::termcolor
CPMAddPackage(
NAME unordered_dense
GITHUB_REPOSITORY martinus/unordered_dense
GIT_TAG v4.8.1
SYSTEM ON
) # defines: unordered_dense::unordered_dense (aliased to FlatHashMap, see src/common/flat_hash_map.h)
# TODO: std::move_only_function lands in C++23, but libc++ (macOS) has not implemented
# : it yet. Remove this once all compilers for all platforms implement.
CPMAddPackage(
NAME function2
GITHUB_REPOSITORY Naios/function2
GIT_TAG 4.2.4
SYSTEM ON
) # defines: function2 (aliased to Fn, see src/common/types/fn.h)
# How cpptrace turns a crash address into function + file:line, per platform:
set(CPPTRACE_SYMBOL_OPTIONS "")
if(APPLE)
# macOS binaries carry a "debug map" pointing at the .o files rather than embedded DWARF;
# atos resolves against the staged .dSYM (see set_target_output_directory) and is fast.
list(APPEND CPPTRACE_SYMBOL_OPTIONS
"CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF OFF"
"CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE ON"
)
elseif(UNIX)
# Linux: resolve in-process with libdwarf.
list(APPEND CPPTRACE_SYMBOL_OPTIONS
"CPPTRACE_GET_SYMBOLS_WITH_ADDR2LINE OFF"
"CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF ON"
"CPPTRACE_USE_EXTERNAL_LIBDWARF ON"
"CPPTRACE_FIND_LIBDWARF_WITH_PKGCONFIG ON"
)
endif()
CPMAddPackage(
NAME cpptrace
GITHUB_REPOSITORY jeremy-rifkin/cpptrace
GIT_TAG v1.0.4
SYSTEM ON
OPTIONS
${CPPTRACE_SYMBOL_OPTIONS}
) # defines: cpptrace::cpptrace
set(SHARED_EXTERNAL_LIBS
fmt::fmt
spdlog
concurrentqueue
spscqueue
mariadbclient
mariadbcpp
sol2_single
argparse
efsw
@ -283,25 +351,16 @@ set(SHARED_EXTERNAL_LIBS
alpaca
magic_enum
utf8cpp
unordered_dense::unordered_dense
function2
cpptrace::cpptrace
)
if(WIN32)
# add wepoll for epoll support on windows
add_subdirectory(wepoll)
list(APPEND SHARED_EXTERNAL_LIBS
wepoll
)
# backwards needs these to add to linker
elseif(APPLE)
# MacOS has bfd built in clang
if(APPLE)
list(APPEND SHARED_EXTERNAL_LIBS
dl
)
elseif(UNIX)
# Linux needs bfd as it's not native like MacOS
# bfd may link zstd
list(APPEND SHARED_EXTERNAL_LIBS
bfd
dl

View file

@ -0,0 +1,3 @@
add_library(spscqueue INTERFACE)
target_sources(spscqueue INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include/rigtorp/SPSCQueue.h)
target_include_directories(spscqueue SYSTEM INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include/)

View file

@ -0,0 +1,237 @@
/*
Copyright (c) 2020 Erik Rigtorp <erik@rigtorp.se>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#pragma once
#include <atomic>
#include <cassert>
#include <cstddef>
#include <memory> // std::allocator
#include <new> // std::hardware_destructive_interference_size
#include <stdexcept>
#include <type_traits> // std::enable_if, std::is_*_constructible
#ifdef __has_cpp_attribute
#if __has_cpp_attribute(nodiscard)
#define RIGTORP_NODISCARD [[nodiscard]]
#endif
#endif
#ifndef RIGTORP_NODISCARD
#define RIGTORP_NODISCARD
#endif
namespace rigtorp {
template <typename T, typename Allocator = std::allocator<T>> class SPSCQueue {
#if defined(__cpp_if_constexpr) && defined(__cpp_lib_void_t)
template <typename Alloc2, typename = void>
struct has_allocate_at_least : std::false_type {};
template <typename Alloc2>
struct has_allocate_at_least<
Alloc2, std::void_t<typename Alloc2::value_type,
decltype(std::declval<Alloc2 &>().allocate_at_least(
size_t{}))>> : std::true_type {};
#endif
public:
explicit SPSCQueue(const size_t capacity,
const Allocator &allocator = Allocator())
: capacity_(capacity), allocator_(allocator) {
// The queue needs at least one element
if (capacity_ < 1) {
capacity_ = 1;
}
capacity_++; // Needs one slack element
// Prevent overflowing size_t
if (capacity_ > SIZE_MAX - 2 * kPadding) {
capacity_ = SIZE_MAX - 2 * kPadding;
}
#if defined(__cpp_if_constexpr) && defined(__cpp_lib_void_t)
if constexpr (has_allocate_at_least<Allocator>::value) {
auto res = allocator_.allocate_at_least(capacity_ + 2 * kPadding);
slots_ = res.ptr;
capacity_ = res.count - 2 * kPadding;
} else {
slots_ = std::allocator_traits<Allocator>::allocate(
allocator_, capacity_ + 2 * kPadding);
}
#else
slots_ = std::allocator_traits<Allocator>::allocate(
allocator_, capacity_ + 2 * kPadding);
#endif
static_assert(alignof(SPSCQueue<T>) == kCacheLineSize, "");
static_assert(sizeof(SPSCQueue<T>) >= 3 * kCacheLineSize, "");
assert(reinterpret_cast<char *>(&readIdx_) -
reinterpret_cast<char *>(&writeIdx_) >=
static_cast<std::ptrdiff_t>(kCacheLineSize));
}
~SPSCQueue() {
while (front()) {
pop();
}
std::allocator_traits<Allocator>::deallocate(allocator_, slots_,
capacity_ + 2 * kPadding);
}
// non-copyable and non-movable
SPSCQueue(const SPSCQueue &) = delete;
SPSCQueue &operator=(const SPSCQueue &) = delete;
template <typename... Args>
void emplace(Args &&...args) noexcept(
std::is_nothrow_constructible<T, Args &&...>::value) {
static_assert(std::is_constructible<T, Args &&...>::value,
"T must be constructible with Args&&...");
auto const writeIdx = writeIdx_.load(std::memory_order_relaxed);
auto nextWriteIdx = writeIdx + 1;
if (nextWriteIdx == capacity_) {
nextWriteIdx = 0;
}
while (nextWriteIdx == readIdxCache_) {
readIdxCache_ = readIdx_.load(std::memory_order_acquire);
}
new (&slots_[writeIdx + kPadding]) T(std::forward<Args>(args)...);
writeIdx_.store(nextWriteIdx, std::memory_order_release);
}
template <typename... Args>
RIGTORP_NODISCARD bool try_emplace(Args &&...args) noexcept(
std::is_nothrow_constructible<T, Args &&...>::value) {
static_assert(std::is_constructible<T, Args &&...>::value,
"T must be constructible with Args&&...");
auto const writeIdx = writeIdx_.load(std::memory_order_relaxed);
auto nextWriteIdx = writeIdx + 1;
if (nextWriteIdx == capacity_) {
nextWriteIdx = 0;
}
if (nextWriteIdx == readIdxCache_) {
readIdxCache_ = readIdx_.load(std::memory_order_acquire);
if (nextWriteIdx == readIdxCache_) {
return false;
}
}
new (&slots_[writeIdx + kPadding]) T(std::forward<Args>(args)...);
writeIdx_.store(nextWriteIdx, std::memory_order_release);
return true;
}
void push(const T &v) noexcept(std::is_nothrow_copy_constructible<T>::value) {
static_assert(std::is_copy_constructible<T>::value,
"T must be copy constructible");
emplace(v);
}
template <typename P, typename = typename std::enable_if<
std::is_constructible<T, P &&>::value>::type>
void push(P &&v) noexcept(std::is_nothrow_constructible<T, P &&>::value) {
emplace(std::forward<P>(v));
}
RIGTORP_NODISCARD bool
try_push(const T &v) noexcept(std::is_nothrow_copy_constructible<T>::value) {
static_assert(std::is_copy_constructible<T>::value,
"T must be copy constructible");
return try_emplace(v);
}
template <typename P, typename = typename std::enable_if<
std::is_constructible<T, P &&>::value>::type>
RIGTORP_NODISCARD bool
try_push(P &&v) noexcept(std::is_nothrow_constructible<T, P &&>::value) {
return try_emplace(std::forward<P>(v));
}
RIGTORP_NODISCARD T *front() noexcept {
auto const readIdx = readIdx_.load(std::memory_order_relaxed);
if (readIdx == writeIdxCache_) {
writeIdxCache_ = writeIdx_.load(std::memory_order_acquire);
if (writeIdxCache_ == readIdx) {
return nullptr;
}
}
return &slots_[readIdx + kPadding];
}
void pop() noexcept {
static_assert(std::is_nothrow_destructible<T>::value,
"T must be nothrow destructible");
auto const readIdx = readIdx_.load(std::memory_order_relaxed);
assert(writeIdx_.load(std::memory_order_acquire) != readIdx &&
"Can only call pop() after front() has returned a non-nullptr");
slots_[readIdx + kPadding].~T();
auto nextReadIdx = readIdx + 1;
if (nextReadIdx == capacity_) {
nextReadIdx = 0;
}
readIdx_.store(nextReadIdx, std::memory_order_release);
}
RIGTORP_NODISCARD size_t size() const noexcept {
std::ptrdiff_t diff = writeIdx_.load(std::memory_order_acquire) -
readIdx_.load(std::memory_order_acquire);
if (diff < 0) {
diff += capacity_;
}
return static_cast<size_t>(diff);
}
RIGTORP_NODISCARD bool empty() const noexcept {
return writeIdx_.load(std::memory_order_acquire) ==
readIdx_.load(std::memory_order_acquire);
}
RIGTORP_NODISCARD size_t capacity() const noexcept { return capacity_ - 1; }
private:
#ifdef __cpp_lib_hardware_interference_size
static constexpr size_t kCacheLineSize =
std::hardware_destructive_interference_size;
#else
static constexpr size_t kCacheLineSize = 64;
#endif
// Padding to avoid false sharing between slots_ and adjacent allocations
static constexpr size_t kPadding = (kCacheLineSize - 1) / sizeof(T) + 1;
private:
size_t capacity_;
T *slots_;
#if defined(__has_cpp_attribute) && __has_cpp_attribute(no_unique_address)
Allocator allocator_ [[no_unique_address]];
#else
Allocator allocator_;
#endif
// Align to cache line size in order to avoid false sharing
// readIdxCache_ and writeIdxCache_ is used to reduce the amount of cache
// coherency traffic
alignas(kCacheLineSize) std::atomic<size_t> writeIdx_ = {0};
alignas(kCacheLineSize) size_t readIdxCache_ = 0;
alignas(kCacheLineSize) std::atomic<size_t> readIdx_ = {0};
alignas(kCacheLineSize) size_t writeIdxCache_ = 0;
};
} // namespace rigtorp

View file

@ -1,21 +0,0 @@
Copyright 2013 Google Inc. All Rights Reserved.
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,42 +0,0 @@
// Pick your poison.
//
// On GNU/Linux, you have few choices to get the most out of your stack trace.
//
// By default you get:
// - object filename
// - function name
//
// In order to add:
// - source filename
// - line and column numbers
// - source code snippet (assuming the file is accessible)
// Install one of the following libraries then uncomment one of the macro (or
// better, add the detection of the lib and the macro definition in your build
// system)
// - apt-get install libdw-dev ...
// - g++/clang++ -ldw ...
// #define BACKWARD_HAS_DW 1
// - apt-get install binutils-dev ...
// - g++/clang++ -lbfd ...
// #define BACKWARD_HAS_BFD 1
// - apt-get install libdwarf-dev ...
// - g++/clang++ -ldwarf ...
// #define BACKWARD_HAS_DWARF 1
// Regardless of the library you choose to read the debug information,
// for potentially more detailed stack traces you can use libunwind
// - apt-get install libunwind-dev
// - g++/clang++ -lunwind
// #define BACKWARD_HAS_LIBUNWIND 1
#include "backward.hpp"
namespace backward {
backward::SignalHandling sh;
} // namespace backward

File diff suppressed because it is too large Load diff

View file

@ -1,9 +0,0 @@
set(SOURCES
wepoll.c
wepoll.h
)
add_library(wepoll STATIC ${SOURCES})
target_include_directories(wepoll SYSTEM PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)

View file

@ -1,28 +0,0 @@
wepoll - epoll for Windows
https://github.com/piscisaureus/wepoll
Copyright 2012-2020, Bert Belder <bertbelder@gmail.com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -1,202 +0,0 @@
# wepoll - epoll for windows
[![][ci status badge]][ci status link]
This library implements the [epoll][man epoll] API for Windows
applications. It is fast and scalable, and it closely resembles the API
and behavior of Linux' epoll.
## Rationale
Unlike Linux, OS X, and many other operating systems, Windows doesn't
have a good API for receiving socket state notifications. It only
supports the `select` and `WSAPoll` APIs, but they
[don't scale][select scale] and suffer from
[other issues][wsapoll broken].
Using I/O completion ports isn't always practical when software is
designed to be cross-platform. Wepoll offers an alternative that is
much closer to a drop-in replacement for software that was designed
to run on Linux.
## Features
* Can poll 100000s of sockets efficiently.
* Fully thread-safe.
* Multiple threads can poll the same epoll port.
* Sockets can be added to multiple epoll sets.
* All epoll events (`EPOLLIN`, `EPOLLOUT`, `EPOLLPRI`, `EPOLLRDHUP`)
are supported.
* Level-triggered and one-shot (`EPOLLONESTHOT`) modes are supported
* Trivial to embed: you need [only two files][dist].
## Limitations
* Only works with sockets.
* Edge-triggered (`EPOLLET`) mode isn't supported.
## How to use
The library is [distributed][dist] as a single source file
([wepoll.c][wepoll.c]) and a single header file ([wepoll.h][wepoll.h]).<br>
Compile the .c file as part of your project, and include the header wherever
needed.
## Compatibility
* Requires Windows Vista or higher.
* Can be compiled with recent versions of MSVC, Clang, and GCC.
## API
### General remarks
* The epoll port is a `HANDLE`, not a file descriptor.
* All functions set both `errno` and `GetLastError()` on failure.
* For more extensive documentation, see the [epoll(7) man page][man epoll],
and the per-function man pages that are linked below.
### epoll_create/epoll_create1
```c
HANDLE epoll_create(int size);
HANDLE epoll_create1(int flags);
```
* Create a new epoll instance (port).
* `size` is ignored but most be greater than zero.
* `flags` must be zero as there are no supported flags.
* Returns `NULL` on failure.
* [Linux man page][man epoll_create]
### epoll_close
```c
int epoll_close(HANDLE ephnd);
```
* Close an epoll port.
* Do not attempt to close the epoll port with `close()`,
`CloseHandle()` or `closesocket()`.
### epoll_ctl
```c
int epoll_ctl(HANDLE ephnd,
int op,
SOCKET sock,
struct epoll_event* event);
```
* Control which socket events are monitored by an epoll port.
* `ephnd` must be a HANDLE created by
[`epoll_create()`](#epoll_createepoll_create1) or
[`epoll_create1()`](#epoll_createepoll_create1).
* `op` must be one of `EPOLL_CTL_ADD`, `EPOLL_CTL_MOD`, `EPOLL_CTL_DEL`.
* `sock` must be a valid socket created by [`socket()`][msdn socket],
[`WSASocket()`][msdn wsasocket], or [`accept()`][msdn accept].
* `event` should be a pointer to a [`struct epoll_event`](#struct-epoll_event).<br>
If `op` is `EPOLL_CTL_DEL` then the `event` parameter is ignored, and it
may be `NULL`.
* Returns 0 on success, -1 on failure.
* It is recommended to always explicitly remove a socket from its epoll
set using `EPOLL_CTL_DEL` *before* closing it.<br>
As on Linux, closed sockets are automatically removed from the epoll set, but
wepoll may not be able to detect that a socket was closed until the next call
to [`epoll_wait()`](#epoll_wait).
* [Linux man page][man epoll_ctl]
### epoll_wait
```c
int epoll_wait(HANDLE ephnd,
struct epoll_event* events,
int maxevents,
int timeout);
```
* Receive socket events from an epoll port.
* `events` should point to a caller-allocated array of
[`epoll_event`](#struct-epoll_event) structs, which will receive the
reported events.
* `maxevents` is the maximum number of events that will be written to the
`events` array, and must be greater than zero.
* `timeout` specifies whether to block when no events are immediately available.
- `<0` block indefinitely
- `0` report any events that are already waiting, but don't block
- `≥1` block for at most N milliseconds
* Return value:
- `-1` an error occurred
- `0` timed out without any events to report
- `≥1` the number of events stored in the `events` buffer
* [Linux man page][man epoll_wait]
### struct epoll_event
```c
typedef union epoll_data {
void* ptr;
int fd;
uint32_t u32;
uint64_t u64;
SOCKET sock; /* Windows specific */
HANDLE hnd; /* Windows specific */
} epoll_data_t;
```
```c
struct epoll_event {
uint32_t events; /* Epoll events and flags */
epoll_data_t data; /* User data variable */
};
```
* The `events` field is a bit mask containing the events being
monitored/reported, and optional flags.<br>
Flags are accepted by [`epoll_ctl()`](#epoll_ctl), but they are not reported
back by [`epoll_wait()`](#epoll_wait).
* The `data` field can be used to associate application-specific information
with a socket; its value will be returned unmodified by
[`epoll_wait()`](#epoll_wait).
* [Linux man page][man epoll_ctl]
| Event | Description |
|---------------|----------------------------------------------------------------------|
| `EPOLLIN` | incoming data available, or incoming connection ready to be accepted |
| `EPOLLOUT` | ready to send data, or outgoing connection successfully established |
| `EPOLLRDHUP` | remote peer initiated graceful socket shutdown |
| `EPOLLPRI` | out-of-band data available for reading |
| `EPOLLERR` | socket error<sup>1</sup> |
| `EPOLLHUP` | socket hang-up<sup>1</sup> |
| `EPOLLRDNORM` | same as `EPOLLIN` |
| `EPOLLRDBAND` | same as `EPOLLPRI` |
| `EPOLLWRNORM` | same as `EPOLLOUT` |
| `EPOLLWRBAND` | same as `EPOLLOUT` |
| `EPOLLMSG` | never reported |
| Flag | Description |
|------------------|---------------------------|
| `EPOLLONESHOT` | report event(s) only once |
| `EPOLLET` | not supported by wepoll |
| `EPOLLEXCLUSIVE` | not supported by wepoll |
| `EPOLLWAKEUP` | not supported by wepoll |
<sup>1</sup>: the `EPOLLERR` and `EPOLLHUP` events may always be reported by
[`epoll_wait()`](#epoll_wait), regardless of the event mask that was passed to
[`epoll_ctl()`](#epoll_ctl).
[ci status badge]: https://ci.appveyor.com/api/projects/status/github/piscisaureus/wepoll?branch=master&svg=true
[ci status link]: https://ci.appveyor.com/project/piscisaureus/wepoll/branch/master
[dist]: https://github.com/piscisaureus/wepoll/tree/dist
[man epoll]: http://man7.org/linux/man-pages/man7/epoll.7.html
[man epoll_create]: http://man7.org/linux/man-pages/man2/epoll_create.2.html
[man epoll_ctl]: http://man7.org/linux/man-pages/man2/epoll_ctl.2.html
[man epoll_wait]: http://man7.org/linux/man-pages/man2/epoll_wait.2.html
[msdn accept]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
[msdn socket]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
[msdn wsasocket]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms742212(v=vs.85).aspx
[select scale]: https://daniel.haxx.se/docs/poll-vs-select.html
[wsapoll broken]: https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
[wepoll.c]: https://github.com/piscisaureus/wepoll/blob/dist/wepoll.c
[wepoll.h]: https://github.com/piscisaureus/wepoll/blob/dist/wepoll.h

File diff suppressed because it is too large Load diff

View file

@ -1,113 +0,0 @@
/*
* wepoll - epoll for Windows
* https://github.com/piscisaureus/wepoll
*
* Copyright 2012-2020, Bert Belder <bertbelder@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef WEPOLL_H_
#define WEPOLL_H_
#ifndef WEPOLL_EXPORT
#define WEPOLL_EXPORT
#endif
#include <stdint.h>
enum EPOLL_EVENTS {
EPOLLIN = (int) (1U << 0),
EPOLLPRI = (int) (1U << 1),
EPOLLOUT = (int) (1U << 2),
EPOLLERR = (int) (1U << 3),
EPOLLHUP = (int) (1U << 4),
EPOLLRDNORM = (int) (1U << 6),
EPOLLRDBAND = (int) (1U << 7),
EPOLLWRNORM = (int) (1U << 8),
EPOLLWRBAND = (int) (1U << 9),
EPOLLMSG = (int) (1U << 10), /* Never reported. */
EPOLLRDHUP = (int) (1U << 13),
EPOLLONESHOT = (int) (1U << 31)
};
#define EPOLLIN (1U << 0)
#define EPOLLPRI (1U << 1)
#define EPOLLOUT (1U << 2)
#define EPOLLERR (1U << 3)
#define EPOLLHUP (1U << 4)
#define EPOLLRDNORM (1U << 6)
#define EPOLLRDBAND (1U << 7)
#define EPOLLWRNORM (1U << 8)
#define EPOLLWRBAND (1U << 9)
#define EPOLLMSG (1U << 10)
#define EPOLLRDHUP (1U << 13)
#define EPOLLONESHOT (1U << 31)
#define EPOLL_CTL_ADD 1
#define EPOLL_CTL_MOD 2
#define EPOLL_CTL_DEL 3
typedef void* HANDLE;
typedef uintptr_t SOCKET;
typedef union epoll_data {
void* ptr;
int fd;
uint32_t u32;
uint64_t u64;
SOCKET sock; /* Windows specific */
HANDLE hnd; /* Windows specific */
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events and flags */
epoll_data_t data; /* User data variable */
};
#ifdef __cplusplus
extern "C" {
#endif
WEPOLL_EXPORT HANDLE epoll_create(int size);
WEPOLL_EXPORT HANDLE epoll_create1(int flags);
WEPOLL_EXPORT int epoll_close(HANDLE ephnd);
WEPOLL_EXPORT int epoll_ctl(HANDLE ephnd,
int op,
SOCKET sock,
struct epoll_event* event);
WEPOLL_EXPORT int epoll_wait(HANDLE ephnd,
struct epoll_event* events,
int maxevents,
int timeout);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* WEPOLL_H_ */

Binary file not shown.

View file

@ -89,7 +89,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.Zone.onInitialize', function(zone)
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.random(1, 48) * 1800
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Fafnir', hnmPopTime) -- Save pop time.
end
@ -99,7 +99,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.Zone.onInitialize', function(zone)
if
hnmKillCount > 3 and
(math.random(1, 5) == 3 or hnmKillCount > 6)
(math.randomInt(1, 5) == 3 or hnmKillCount > 6)
then
monster = dragonsAeryID.mob.NIDHOGG
end
@ -122,7 +122,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.mobs.Fafnir.onMobDespawn', function
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
local hnmKillCount = GetServerVariable('[HNM]Fafnir_C') + 1
SetServerVariable('[HNM]Fafnir', GetSystemTime() + randomPopTime) -- Save next pop time.
@ -133,7 +133,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.mobs.Fafnir.onMobDespawn', function
if
hnmKillCount > 3 and
(math.random(1, 5) == 3 or hnmKillCount > 6)
(math.randomInt(1, 5) == 3 or hnmKillCount > 6)
then
monster = dragonsAeryID.mob.NIDHOGG
end
@ -146,7 +146,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.mobs.Nidhogg.onMobDespawn', functio
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Fafnir', GetSystemTime() + randomPopTime) -- Save next pop time.
SetServerVariable('[HNM]Fafnir_C', 0) -- Save kill count.
@ -222,7 +222,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.Zone.onInitialize', function(z
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.random(1, 48) * 1800
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Adamantoise', hnmPopTime) -- Save pop time.
end
@ -232,7 +232,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.Zone.onInitialize', function(z
if
hnmKillCount > 3 and
(math.random(1, 5) == 3 or hnmKillCount > 6)
(math.randomInt(1, 5) == 3 or hnmKillCount > 6)
then
monster = valleySorrowsID.mob.ASPIDOCHELONE
end
@ -255,7 +255,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.mobs.Adamantoise.onMobDespawn'
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
local hnmKillCount = GetServerVariable('[HNM]Adamantoise_C') + 1
SetServerVariable('[HNM]Adamantoise', GetSystemTime() + randomPopTime) -- Save next pop time.
@ -266,7 +266,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.mobs.Adamantoise.onMobDespawn'
if
hnmKillCount > 3 and
(math.random(1, 5) == 3 or hnmKillCount > 6)
(math.randomInt(1, 5) == 3 or hnmKillCount > 6)
then
monster = valleySorrowsID.mob.ASPIDOCHELONE
end
@ -279,7 +279,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.mobs.Aspidochelone.onMobDespaw
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Adamantoise', GetSystemTime() + randomPopTime) -- Save next pop time.
SetServerVariable('[HNM]Adamantoise_C', 0) -- Save kill count.
@ -355,7 +355,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.Zone.onInitialize', function(
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.random(1, 48) * 1800
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Behemoth', hnmPopTime) -- Save pop time.
end
@ -365,7 +365,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.Zone.onInitialize', function(
if
hnmKillCount > 3 and
(math.random(1, 5) == 3 or hnmKillCount > 6)
(math.randomInt(1, 5) == 3 or hnmKillCount > 6)
then
monster = behemothDomID.mob.KING_BEHEMOTH
end
@ -388,7 +388,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.mobs.Behemoth.onMobDespawn',
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
local hnmKillCount = GetServerVariable('[HNM]Behemoth_C') + 1
SetServerVariable('[HNM]Behemoth', GetSystemTime() + randomPopTime) -- Save next pop time.
@ -399,7 +399,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.mobs.Behemoth.onMobDespawn',
if
hnmKillCount > 3 and
(math.random(1, 5) == 3 or hnmKillCount > 6)
(math.randomInt(1, 5) == 3 or hnmKillCount > 6)
then
monster = behemothDomID.mob.KING_BEHEMOTH
end
@ -412,7 +412,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.mobs.King_Behemoth.onMobDespa
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Behemoth', GetSystemTime() + randomPopTime) -- Save next pop time.
SetServerVariable('[HNM]Behemoth_C', 0) -- Save kill count.

View file

@ -0,0 +1,19 @@
-----------------------------------
-- NIN/DRG/SAM Quest Mobs Original Difficulty Module
-- Reverts the nerfs to the NIN/DRG/SAM quest mobs in the May 10, 2011 version update
-- Source: https://forum.square-enix.com/ffxi/threads/7257
-----------------------------------
-- Level: set all six spawns to level 32 (min == max => fixed level)
UPDATE mob_spawn_points SET minLevel = 32, maxLevel = 32 WHERE mobid = 17486187; -- Korroloka Leech (Korroloka Tunnel)
UPDATE mob_spawn_points SET minLevel = 32, maxLevel = 32 WHERE mobid = 17486188; -- Korroloka Leech (Korroloka Tunnel)
UPDATE mob_spawn_points SET minLevel = 32, maxLevel = 32 WHERE mobid = 17486189; -- Korroloka Leech (Korroloka Tunnel)
UPDATE mob_spawn_points SET minLevel = 32, maxLevel = 32 WHERE mobid = 17350928; -- Cyranuce M Cutauleon (Ghelsba Outpost)
UPDATE mob_spawn_points SET minLevel = 32, maxLevel = 32 WHERE mobid = 17219999; -- Forger (Konschtat Highlands)
UPDATE mob_spawn_points SET minLevel = 32, maxLevel = 32 WHERE mobid = 17272838; -- Guardian Treant (The Sanctuary of Zi'Tah)
-- HP: per-group override, keyed by (groupid, zoneid)
UPDATE mob_groups SET HP = 900 WHERE groupid = 28 AND zoneid = 173; -- Korroloka Leech x3 (Korroloka Tunnel)
UPDATE mob_groups SET HP = 2700 WHERE groupid = 26 AND zoneid = 140; -- Cyranuce M Cutauleon (Ghelsba Outpost)
UPDATE mob_groups SET HP = 2000 WHERE groupid = 33 AND zoneid = 108; -- Forger (Konschtat Highlands)
UPDATE mob_groups SET HP = 2000 WHERE groupid = 5 AND zoneid = 121; -- Guardian Treant (The Sanctuary of Zi'Tah)

View file

@ -69,7 +69,8 @@ UPDATE merits SET value = 20 WHERE name = 'arcane_circle_recast';
UPDATE abilities SET recastTime = 300 WHERE name = 'weapon_bash';
-- Weapon Bash merit: Revert value to 10 seconds per level
UPDATE merits SET value = 10 WHERE name = 'weapon_bash_recast';
-- Note: merit is named weapon_bash_effect (provides both recast reduction and effect)
UPDATE merits SET value = 10 WHERE name = 'weapon_bash_effect';
-- Dark Seal: Revert recast from 5 to 15 minutes
-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(03/26/2012)
@ -138,6 +139,10 @@ UPDATE abilities SET recastTime = 900 WHERE name = 'killer_instinct';
-- Killer Instinct merit: Revert value to 150 seconds per level
UPDATE merits SET value = 150 WHERE name = 'killer_instinct';
------------------------------------
-- Bard
------------------------------------
-- Mazurka: Revert to town/field only
-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(09/08/2010)
SET @TYPE_CITY = 1;
@ -246,3 +251,35 @@ UPDATE abilities SET recastTime = 900 WHERE name = 'deep_breathing';
-- Deep Breathing merit: Revert value to 150 seconds per level
UPDATE merits SET value = 150 WHERE name = 'deep_breathing';
-----------------------------------
-- Summoner
-----------------------------------
-- Summoning Magic Casting Time Merit: Repurposed to Spirit MP cost merit. Revert merit value from 5 to 1 per level.
-- Source: https://forum.square-enix.com/ffxi/threads/22099-March-27-2012-%28JST%29-Version-Update
UPDATE merits SET value = 1 WHERE name = 'summoning_magic_cast_time';
-----------------------------------
-- Corsair
-----------------------------------
-- Double-Up: Revert recast from 5 to 7 seconds
-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(09/19/2011)
UPDATE abilities SET recastTime = 7 WHERE name = 'double-up';
-- Snake Eye: Revert recast from 5 to 15 minutes
-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(05/15/2012)
UPDATE abilities SET recastTime = 900 WHERE name = 'snake_eye';
-- Snake Eye merit: Revert value to 150 seconds per level
UPDATE merits SET value = 150 WHERE name = 'snake_eye';
-- Fold: Revert recast from 5 to 15 minutes
UPDATE abilities SET recastTime = 900 WHERE name = 'fold';
-- Fold merit: Revert value to 150 seconds per level
UPDATE merits SET value = 150 WHERE name = 'fold';
-- Quick Draw: Revert range from 22 to 15 yalms
UPDATE abilities SET `range` = 15 WHERE name = 'quick_draw';

View file

@ -45,7 +45,7 @@ class AHPaginationModule : public CPPModule
return false;
}
if (PChar->m_GMlevel == 0 && !PChar->loc.zone->CanUseMisc(MISC_AH))
if (PChar->m_GMlevel == 0 && !PChar->loc.zone->CanUseMisc(xi::ZoneMisc::AuctionHouse))
{
ShowWarning("[AH PAGES] %s is trying to use the auction house in a disallowed zone [%s]", PChar->getName(), PChar->loc.zone->getName());
return true;

View file

@ -35,7 +35,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.Zone.onInitialize', function(zone)
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.random(1, 48) * 1800
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Fafnir', hnmPopTime) -- Save pop time.
end
@ -54,7 +54,7 @@ hnmSystem:addOverride('xi.zones.Dragons_Aery.mobs.Fafnir.onMobDespawn', function
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Fafnir', GetSystemTime() + randomPopTime) -- Save next pop time.
@ -85,7 +85,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.Zone.onInitialize', function(z
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.random(1, 48) * 1800
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Adamantoise', hnmPopTime) -- Save pop time.
end
@ -104,7 +104,7 @@ hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.mobs.Adamantoise.onMobDespawn'
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Adamantoise', GetSystemTime() + randomPopTime) -- Save next pop time.
@ -135,7 +135,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.Zone.onInitialize', function(
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.random(1, 48) * 1800
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Behemoth', hnmPopTime) -- Save pop time.
end
@ -154,7 +154,7 @@ hnmSystem:addOverride('xi.zones.Behemoths_Dominion.mobs.Behemoth.onMobDespawn',
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.random(0, 6) * 1800
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Behemoth', GetSystemTime() + randomPopTime) -- Save next pop time.

View file

@ -1,20 +0,0 @@
-----------------------------------
-- Module to make 'Mom the Adventurer?' quest missable.
-----------------------------------
require('modules/module_utils')
-----------------------------------
local m = Module:new('missable_mom_the_adventurer')
m:addOverride('xi.server.onServerStart', function()
super()
xi.module.modifyInteractionEntry('scripts/quests/bastok/Mom_the_Adventurer', function(quest)
quest.sections[1].check = function(player, status, vars)
return status ~= xi.questStatus.QUEST_ACCEPTED and
player:getFameLevel(xi.fameArea.BASTOK) < 2 and
vars.Prog == 0
end
end)
end)
return m

View file

@ -0,0 +1,92 @@
-----------------------------------
-- Mog House Exit Home Point Prompt Module
-----------------------------------
-- Restores the prompt to set your home point when exiting the Mog House after changing jobs.
-----------------------------------
require('modules/module_utils')
require('scripts/globals/moghouse')
-----------------------------------
local m = Module:new('moghouse_exit_homepoint')
-- Variable used for this module to store the job snapshot in the player's character variables.
local jobSnapshot = 'moghouseExitJobSnapshot'
-- The current event ID for the Mog House exit prompt. May change with future updates. If this module ever breaks, check here first.
local exitEventId = 30004
-- Zones to prompt players to set their home point upon exiting the Mog House.
local exitZones =
{
['Southern_San_dOria' ] = xi.zone.SOUTHERN_SAN_DORIA,
['Northern_San_dOria' ] = xi.zone.NORTHERN_SAN_DORIA,
['Port_San_dOria' ] = xi.zone.PORT_SAN_DORIA,
['Bastok_Mines' ] = xi.zone.BASTOK_MINES,
['Bastok_Markets' ] = xi.zone.BASTOK_MARKETS,
['Port_Bastok' ] = xi.zone.PORT_BASTOK,
['Windurst_Waters' ] = xi.zone.WINDURST_WATERS,
['Windurst_Walls' ] = xi.zone.WINDURST_WALLS,
['Port_Windurst' ] = xi.zone.PORT_WINDURST,
['Windurst_Woods' ] = xi.zone.WINDURST_WOODS,
['RuLude_Gardens' ] = xi.zone.RULUDE_GARDENS,
['Upper_Jeuno' ] = xi.zone.UPPER_JEUNO,
['Lower_Jeuno' ] = xi.zone.LOWER_JEUNO,
['Port_Jeuno' ] = xi.zone.PORT_JEUNO,
['Al_Zahbi' ] = xi.zone.AL_ZAHBI,
['Aht_Urhgan_Whitegate' ] = xi.zone.AHT_URHGAN_WHITEGATE,
['Southern_San_dOria_[S]'] = xi.zone.SOUTHERN_SAN_DORIA_S,
['Bastok_Markets_[S]' ] = xi.zone.BASTOK_MARKETS_S,
['Windurst_Waters_[S]' ] = xi.zone.WINDURST_WATERS_S,
}
local promptZoneIds = {}
for _, zoneId in pairs(exitZones) do
promptZoneIds[zoneId] = true
end
local currentJob = function(player)
return player:getMainJob() * 100 + player:getSubJob()
end
m:addOverride('xi.moghouse.onMoghouseZoneEvent', function(player, prevZone)
-- Create a snapshot of the players current job when entering the mog house.
if player:inMogHouse() then
player:setCharVar(jobSnapshot, currentJob(player))
return super(player, prevZone)
end
local moghouseExitPos = player:getXPos() == 0 and player:getYPos() == 0 and player:getZPos() == 0
local baseCsId = super(player, prevZone)
local storedJob = player:getCharVar(jobSnapshot)
if moghouseExitPos and storedJob > 0 then
player:setCharVar(jobSnapshot, 0)
if
baseCsId == -1 and
promptZoneIds[player:getZoneID()] and
storedJob ~= currentJob(player)
then
return exitEventId
end
end
return baseCsId
end)
for zoneName in pairs(exitZones) do
m:addOverride(string.format('xi.zones.%s.Zone.onEventFinish', zoneName), function(player, csid, option, npc)
if csid == exitEventId then
if option == 0 then
player:setHomePoint()
player:messageSpecial(zones[player:getZoneID()].text.HOMEPOINT_SET)
end
return
end
super(player, csid, option, npc)
end)
end
return m

View file

@ -20,7 +20,7 @@ local nmsToPersist =
'Behemoths_Dominion',
'Behemoth',
function()
return 75600 + math.random(0, 6) * 1800
return 75600 + math.randomInt(0, 6) * 1800
end
},
}

View file

@ -0,0 +1,297 @@
-----------------------------------
-- Reverts blood pacts to no longer have a duration based on summoning magic.
-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(09/08/2010)
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'abyssea_avatar_bloodpacts'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
-----------------------------------
-- Shining Ruby
-----------------------------------
m:addOverride('xi.actions.abilities.pets.shining_ruby.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
target:delStatusEffect(xi.effect.SHINING_RUBY)
target:addStatusEffect(xi.effect.SHINING_RUBY, { power = 1, duration = duration, origin = pet })
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
return xi.effect.SHINING_RUBY
end)
-----------------------------------
-- Hastega
-----------------------------------
m:addOverride('xi.actions.abilities.pets.hastega.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
-- Reverts Garuda's Hastega to use 102/1024 or 9.96%
local typeEffect = xi.effect.HASTE
if target:addStatusEffect(typeEffect, { power = 996, duration = duration, origin = pet }) then
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
else
petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2)
return
end
return typeEffect
end)
-----------------------------------
-- Crimson Howl
-----------------------------------
m:addOverride('xi.actions.abilities.pets.crimson_howl.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 60
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local typeEffect = xi.effect.WARCRY
if target:addStatusEffect(typeEffect, { power = 9, duration = duration, origin = pet }) then
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
else
petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2)
return
end
return typeEffect
end)
-----------------------------------
-- Frost Armor
-----------------------------------
m:addOverride('xi.actions.abilities.pets.frost_armor.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local typeEffect = xi.effect.ICE_SPIKES
target:delStatusEffect(typeEffect)
if target:addStatusEffect(typeEffect, { power = 15, duration = duration, origin = pet }) then
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
else
petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2)
return
end
return typeEffect
end)
-----------------------------------
-- Rolling Thunder
-----------------------------------
m:addOverride('xi.actions.abilities.pets.rolling_thunder.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 120
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local magicskill = xi.data.skillLevel.getSkillCap(target:getMainLvl(), xi.skillRank.A_PLUS)
local potency = 3 + 6 * magicskill / 100
if magicskill > 200 then
potency = 5 + 5 * magicskill / 100
end
xi.mobskills.mobBuffMove(target, xi.effect.ENTHUNDER, potency, 0, duration)
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.JA_RECEIVES_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_RECEIVES_EFFECT)
end
return xi.effect.ENTHUNDER
end)
-----------------------------------
-- Lightning Armor
-----------------------------------
m:addOverride('xi.actions.abilities.pets.lightning_armor.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local typeEffect = xi.effect.SHOCK_SPIKES
target:delStatusEffect(typeEffect)
if target:addStatusEffect(typeEffect, { power = 15, duration = duration, origin = pet }) then
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
else
petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2)
return
end
return typeEffect
end)
-----------------------------------
-- Ecliptic Growl
-----------------------------------
m:addOverride('xi.actions.abilities.pets.ecliptic_growl.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local moonCycle = getVanadielMoonCycle()
local cycleBuffs =
{
[xi.moonCycle.NEW_MOON] = 1,
[xi.moonCycle.LESSER_WAXING_CRESCENT] = 2,
[xi.moonCycle.GREATER_WAXING_CRESCENT] = 3,
[xi.moonCycle.FIRST_QUARTER] = 4,
[xi.moonCycle.LESSER_WAXING_GIBBOUS] = 5,
[xi.moonCycle.GREATER_WAXING_GIBBOUS] = 6,
[xi.moonCycle.FULL_MOON] = 7,
[xi.moonCycle.GREATER_WANING_GIBBOUS] = 6,
[xi.moonCycle.LESSER_WANING_GIBBOUS] = 5,
[xi.moonCycle.THIRD_QUARTER] = 4,
[xi.moonCycle.GREATER_WANING_CRESCENT] = 3,
[xi.moonCycle.LESSER_WANING_CRESCENT] = 2,
}
local buffValue = cycleBuffs[moonCycle]
target:delStatusEffect(xi.effect.STR_BOOST)
target:delStatusEffect(xi.effect.DEX_BOOST)
target:delStatusEffect(xi.effect.VIT_BOOST)
target:delStatusEffect(xi.effect.AGI_BOOST)
target:delStatusEffect(xi.effect.MND_BOOST)
target:delStatusEffect(xi.effect.CHR_BOOST)
target:addStatusEffect(xi.effect.STR_BOOST, { power = buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.DEX_BOOST, { power = buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.VIT_BOOST, { power = buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.AGI_BOOST, { power = 8 - buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.INT_BOOST, { power = 8 - buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.MND_BOOST, { power = 8 - buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.CHR_BOOST, { power = 8 - buffValue, duration = duration, origin = pet })
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.STATUS_BOOST)
else
petskill:setMsg(xi.msg.basic.STATUS_BOOST_2)
end
return 0
end)
-----------------------------------
-- Ecliptic Howl
-----------------------------------
m:addOverride('xi.actions.abilities.pets.ecliptic_howl.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local moonCycle = getVanadielMoonCycle()
local cycleBuffs =
{
[xi.moonCycle.NEW_MOON] = 1,
[xi.moonCycle.LESSER_WAXING_CRESCENT] = 5,
[xi.moonCycle.GREATER_WAXING_CRESCENT] = 9,
[xi.moonCycle.FIRST_QUARTER] = 13,
[xi.moonCycle.LESSER_WAXING_GIBBOUS] = 17,
[xi.moonCycle.GREATER_WAXING_GIBBOUS] = 21,
[xi.moonCycle.FULL_MOON] = 25,
[xi.moonCycle.GREATER_WANING_GIBBOUS] = 21,
[xi.moonCycle.LESSER_WANING_GIBBOUS] = 17,
[xi.moonCycle.THIRD_QUARTER] = 13,
[xi.moonCycle.GREATER_WANING_CRESCENT] = 9,
[xi.moonCycle.LESSER_WANING_CRESCENT] = 5,
}
local buffValue = cycleBuffs[moonCycle]
target:delStatusEffect(xi.effect.ACCURACY_BOOST)
target:delStatusEffect(xi.effect.EVASION_BOOST)
target:addStatusEffect(xi.effect.ACCURACY_BOOST, { power = buffValue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.EVASION_BOOST, { power = 25 - buffValue, duration = duration, origin = pet })
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.ACC_EVA_BOOST)
else
petskill:setMsg(xi.msg.basic.ACC_EVA_BOOST_2)
end
return 0
end)
-----------------------------------
-- Noctoshield
-----------------------------------
m:addOverride('xi.actions.abilities.pets.noctoshield.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local duration = 180
if target:addStatusEffect(xi.effect.PHALANX, { power = 13, duration = duration, origin = pet }) then
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
else
petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2)
return
end
return xi.effect.PHALANX
end)
-----------------------------------
-- Dream Shroud
-----------------------------------
m:addOverride('xi.actions.abilities.pets.dream_shroud.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local duration = 180
local hour = VanadielHour()
local buffvalue = math.abs(12 - hour) + 1
target:delStatusEffect(xi.effect.MAGIC_ATK_BOOST)
target:delStatusEffect(xi.effect.MAGIC_DEF_BOOST)
target:addStatusEffect(xi.effect.MAGIC_ATK_BOOST, { power = buffvalue, duration = duration, origin = pet })
target:addStatusEffect(xi.effect.MAGIC_DEF_BOOST, { power = 14 - buffvalue, duration = duration, origin = pet })
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.JA_RECEIVES_MAB_MDB)
else
petskill:setMsg(xi.msg.basic.JA_RECEIVES_MAB_MDB_2)
end
return 0
end)
return m

View file

@ -1,110 +0,0 @@
-----------------------------------
-- Analyzer (Pre 2012)
-- Reduces damage taken from repeated TP moves by 10%, with an additional 10% per Earth Maneuver.
-- Resets after a new skill is used.
-- Was changed March 27th, 2012 to analyze multiple TP moves based off earth maneuvers, with a 40% damage reduction.
-- NOTE: This module touches both the attachment, and the combat utility. Both are needed for this attachment to function correctly.
-- https://wiki.ffo.jp/html/10746.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_analyzer'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
-----------------------------------
-- Attachment Module
-----------------------------------
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onEquip', function(pet, attachment)
-- Analyzed skills do not carry over between zones, onEquip is called when rebuilding the automaton after zoning.
pet:setLocalVar('analyzedSkill1', 0)
pet:addListener('WEAPONSKILL_TAKE', 'ANALYZER_WEAPONSKILL_TAKE', function(mob, target, skill, tp, action)
local analyzerModifier = target:getMod(xi.mod.AUTO_ANALYZER)
local incomingSkill = skill:getID()
-- If Analyzer modifier is 0, return. (Should be impossible since the attachment wouldn't be equipped, but just in case.)
if analyzerModifier <= 0 then
return
end
local analyzedSkill = target:getLocalVar('analyzedSkill1')
-- If the incoming skill is the one we have already analyzed, return.
if incomingSkill == analyzedSkill then
return
end
-- If the incoming skill is different from the analyzed skill, update the analyzed skill ID.
if incomingSkill ~= analyzedSkill then
target:setLocalVar('analyzedSkill1', incomingSkill)
end
end)
xi.automaton.onAttachmentEquip(pet, attachment)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onUnequip', function(pet, attachment)
-- Clear analyzed skill on unequip, and remove the listener.
pet:setLocalVar('analyzedSkill1', 0)
pet:removeListener('ANALYZER_WEAPONSKILL_TAKE')
xi.automaton.onAttachmentUnequip(pet, attachment)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onManeuverGain', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onManeuverLose', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onUpdate', function(pet, attachment, maneuvers)
end)
-----------------------------------
-- Combat Utility Override
-----------------------------------
m:addOverride('utils.handleAutomatonAutoAnalyzer', function(actor, skill, damage)
local analyzerModifier = actor:getMod(xi.mod.AUTO_ANALYZER)
-- If no Analyzer equipped, return unmodified damage.
if analyzerModifier <= 0 then
return damage
end
local automatonId = actor:getID()
-- If we can't track this automaton, return unmodified damage.
if not automatonId then
return damage
end
local automatonMaster = actor:getMaster()
-- If we can't get the master of this automaton, return unmodified damage.
if not automatonMaster then
return damage
end
local incomingSkill = skill:getID()
local analyzedSkill = actor:getLocalVar('analyzedSkill1')
-- If the incoming skill is the same ID as the analyzed skill, apply the Analyzer damage reduction and return.
if incomingSkill == analyzedSkill then
local earthManeuvers = automatonMaster:countEffect(xi.effect.EARTH_MANEUVER)
local damageReduction = 10 + 10 * earthManeuvers
return math.floor(damage * (100 - damageReduction) / 100)
end
-- If we somehow make it here, return unmodified damage.
return damage
end)
return m

View file

@ -1,113 +0,0 @@
-----------------------------------
-- Flame Holder
-- Reverts Flame Holder to its pre-2015 functionality - Where it consumed Fire Maneuvers on skill execution.
-- Flame Holder Bonus increased on August 5th, 2015.
-- Changed to no longer consume Fire Maneuvers on August 6th, 2019.
-- Source : https://wiki.ffo.jp/html/11183.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_flame_holder'
if xi.module.isContentEnabled('SOA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
local validSkills = set
{
xi.automaton.abilities.ARCUBALLISTA,
xi.automaton.abilities.ARMOR_PIERCER,
xi.automaton.abilities.ARMOR_SHATTERER,
xi.automaton.abilities.BONE_CRUSHER,
xi.automaton.abilities.CANNIBAL_BLADE,
xi.automaton.abilities.CHIMERA_RIPPER,
xi.automaton.abilities.DAZE,
xi.automaton.abilities.KNOCKOUT,
xi.automaton.abilities.MAGIC_MORTAR,
xi.automaton.abilities.SLAPSTICK,
xi.automaton.abilities.STRING_CLIPPER,
xi.automaton.abilities.STRING_SHREDDER,
}
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onEquip', function(pet, attachment)
pet:addListener('WEAPONSKILL_STATE_ENTER', 'AUTO_FLAME_HOLDER_START', function(automaton, skillId)
-- Not a valid skill for Flame Holder
if not validSkills[skillId] then
return
end
local master = automaton:getMaster()
if not master then
return
end
-- Fetch the amount of active Fire Maneuvers on weaponskill state entry.
local fireManeuvers = master:countEffect(xi.effect.FIRE_MANEUVER)
-- No Fire Maneuvers
if fireManeuvers == 0 then
return
end
-- Set the WEAPONSKILL_DAMAGE_BASE mod to 125% / 150% / 175% based on the number of Fire Maneuvers active.
local flameHolderAmount = 100 + 25 * fireManeuvers
automaton:setLocalVar('fireManeuvers', fireManeuvers)
automaton:setLocalVar('flameHolderAmount', flameHolderAmount)
automaton:addMod(xi.mod.WEAPONSKILL_DAMAGE_BASE, flameHolderAmount)
end)
pet:addListener('WEAPONSKILL_STATE_EXIT', 'AUTO_FLAME_HOLDER_END', function(automaton, skillId, wasExecuted)
local flameHolderAmount = automaton:getLocalVar('flameHolderAmount')
-- If no Flame Holder bonus is active, do nothing.
if flameHolderAmount == 0 then
return
end
local fireManeuvers = automaton:getLocalVar('fireManeuvers')
local master = automaton:getMaster()
if not master then
return
end
-- Consume all Fire Maneuvers on execution.
for i = 1, fireManeuvers do
master:delStatusEffectSilent(xi.effect.FIRE_MANEUVER)
end
-- Remove the Flame Holder bonus and reset local variables.
automaton:delMod(xi.mod.WEAPONSKILL_DAMAGE_BASE, flameHolderAmount)
automaton:setLocalVar('flameHolderAmount', 0)
automaton:setLocalVar('fireManeuvers', 0)
end)
end)
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onUnequip', function(pet, attachment)
local amount = pet:getLocalVar('flameHolderAmount')
-- Should be nearly impossible, but just in case.
if amount ~= 0 then
pet:delMod(xi.mod.WEAPONSKILL_DAMAGE_BASE, amount)
end
pet:setLocalVar('flameHolderAmount', 0)
pet:setLocalVar('fireManeuvers', 0)
pet:removeListener('AUTO_FLAME_HOLDER_START')
pet:removeListener('AUTO_FLAME_HOLDER_END')
end)
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onManeuverGain', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onManeuverLose', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onUpdate', function(pet, attachment, maneuvers)
end)
return m

View file

@ -1,87 +0,0 @@
-----------------------------------
-- Ice Maker
-- Reverts Ice Maker to its pre-2015 functionality - Where it consumed Ice Maneuvers on skill execution.
-- Icemaker MAB Coefficients increased on August 5th, 2015.
-- Changed to no longer consume Ice Maneuvers on August 6th, 2019.
-- Source : https://wiki.ffo.jp/html/11198.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_ice_maker'
if xi.module.isContentEnabled('SOA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onEquip', function(pet, attachment)
pet:addListener('MAGIC_START', 'AUTO_ICE_MAKER_START', function(automaton, skillId)
local master = automaton:getMaster()
if not master then
return
end
local iceManeuvers = master:countEffect(xi.effect.ICE_MANEUVER)
if iceManeuvers == 0 then
return
end
local iceMakerAmount = 20 * iceManeuvers
automaton:setLocalVar('iceManeuvers', iceManeuvers)
automaton:setLocalVar('iceMakerAmount', iceMakerAmount)
automaton:addMod(xi.mod.AUTO_MAB_COEFFICIENT, iceMakerAmount)
end)
pet:addListener('MAGIC_STATE_EXIT', 'AUTO_ICE_MAKER_END', function(automaton, skillId, wasExecuted)
local iceMakerAmount = automaton:getLocalVar('iceMakerAmount')
-- If no Ice Maker bonus, do nothing.
if iceMakerAmount == 0 then
return
end
local iceManeuvers = automaton:getLocalVar('iceManeuvers')
local master = automaton:getMaster()
if not master then
return
end
-- Consume all Ice Maneuvers on magic state exit.
for i = 1, iceManeuvers do
master:delStatusEffectSilent(xi.effect.ICE_MANEUVER)
end
automaton:delMod(xi.mod.AUTO_MAB_COEFFICIENT, iceMakerAmount)
automaton:setLocalVar('iceMakerAmount', 0)
automaton:setLocalVar('iceManeuvers', 0)
end)
end)
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onUnequip', function(pet, attachment)
local amount = pet:getLocalVar('iceMakerAmount')
if amount ~= 0 then
pet:delMod(xi.mod.AUTO_MAB_COEFFICIENT, amount)
end
pet:setLocalVar('iceMakerAmount', 0)
pet:setLocalVar('iceManeuvers', 0)
pet:removeListener('AUTO_ICE_MAKER_START')
pet:removeListener('AUTO_ICE_MAKER_END')
end)
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onManeuverGain', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onManeuverLose', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onUpdate', function(pet, attachment, maneuvers)
end)
return m

View file

@ -0,0 +1,552 @@
-----------------------------------
-- Attachment module
-- Recreates attachment effects in the WoTG Era.
-----------------------------------
require('modules/module_utils')
require('scripts/globals/automaton')
-----------------------------------
local moduleName = 'attachments'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
-- Reduces Enmity boost from Strobe : https://wiki.ffo.jp/html/8610.html
-- Reduces Store TP from Inhibitor : https://wiki.ffo.jp/html/8625.html
-- Changes Armor Plate and Armor Plate II to Defense instead of PDT : https://wiki.ffo.jp/html/9070.html
-- Adds a Ranged Attack Penalty to Drum Magazine. : https://wiki.ffo.jp/html/8882.html
-- Changes Turbo Charger Haste to Gear Haste instead of Magic : https://wiki.ffo.jp/html/8627.html
-- Adds Burden to Tactical Processor : https://wiki.ffo.jp/html/13527.html
-- Reduces scaling from Volt Gun : https://wiki.ffo.jp/html/8752.html
-- Reduces Burden Decay From Heatsink : https://wiki.ffo.jp/html/8629.html
-- Reduces the potency of Steam Jackets Damage Reduction : https://wiki.ffo.jp/html/15352.html
xi.automaton.attachmentModifiers['strobe' ] = { { modifier = xi.mod.ENMITY, values = { 5, 15, 25, 40 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['inhibitor' ] = { { modifier = xi.mod.STORETP, values = { 5, 10, 15, 20 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['armor_plate' ] = { { modifier = xi.mod.DEFP, values = { 10, 15, 20, 25 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['armor_plate_ii' ] = { { modifier = xi.mod.DEFP, values = { 20, 25, 30, 35 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['drum_magazine' ] = { { modifier = xi.mod.AUTO_RANGED_DELAY, values = { 2, 4, 6, 8 }, opticFiber = false },
{ modifier = xi.mod.RACC, values = { -15, -30, -50, -75 }, opticFiber = false }, }
xi.automaton.attachmentModifiers['flame_holder' ] = { { modifier = xi.mod.WEAPONSKILL_DAMAGE_BASE, values = { 0, 125, 150, 175 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['ice_maker' ] = { { modifier = xi.mod.AUTO_MAB_COEFFICIENT, values = { 0, 20, 40, 60 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['turbo_charger' ] = { { modifier = xi.mod.HASTE_GEAR, values = { 500, 1500, 2000, 2500 }, opticFiber = true }, }
xi.automaton.attachmentModifiers['tactical_processor'] = { { modifier = xi.mod.AUTO_DECISION_DELAY, values = { 50, 70, 85, 115 }, opticFiber = false },
{ modifier = xi.mod.OVERLOAD_THRESH, values = { -5, -5, -5, -5 }, opticFiber = false }, }
xi.automaton.attachmentModifiers['volt_gun' ] = { { modifier = xi.mod.VOLT_GUN_POTENCY, values = { 0, 0, 0, 0 }, opticFiber = false }, }
xi.automaton.attachmentModifiers['heatsink' ] = { { modifier = xi.mod.BURDEN_DECAY, values = { 1, 1, 1, 1 }, opticFiber = false }, }
xi.automaton.attachmentModifiers['steam_jacket' ] = { { modifier = xi.mod.AUTO_STEAM_JACKET_REDUCTION, values = { 25, 35, 40, 60 }, opticFiber = true }, }
-- Reduces potency of Auto Repair Kit II and removed level based scaling from Mana Tank : https://wiki.ffo.jp/html/19739.html
xi.automaton.repairKit.data['auto-repair_kit_ii' ] = { id = 196, hpBoost = 2, regenBase = { 0, 2, 3, 4 }, regenMultiplier = { 0, 0.4, 0.6, 0.8 } }
xi.automaton.manaTank.data ['mana_tank' ] = { id = 225, mpBoost = 1, refreshBase = { 0, 1, 2, 3 }, refreshMultiplier = { 0, 0.0, 0.0, 0.0 } }
xi.automaton.manaTank.data ['mana_tank_ii' ] = { id = 228, mpBoost = 2, refreshBase = { 0, 2, 3, 4 }, refreshMultiplier = { 0, 0.0, 0.0, 0.0 } }
-----------------------------------
-- Flame Holder - Reduces Flame Holder Scaling, and consumes all Fire Maneuvers on weaponskill execution. https://wiki.ffo.jp/html/11183.html
-----------------------------------
local validFlameHolderSkills = set
{
xi.mobSkill.ARCUBALLISTA_AUTOMATON,
xi.mobSkill.ARMOR_PIERCER_AUTOMATON,
xi.mobSkill.ARMOR_SHATTERER_AUTOMATON,
xi.mobSkill.BONE_CRUSHER_AUTOMATON,
xi.mobSkill.CANNIBAL_BLADE_AUTOMATON,
xi.mobSkill.CHIMERA_RIPPER_AUTOMATON,
xi.mobSkill.DAZE_AUTOMATON,
xi.mobSkill.KNOCKOUT_AUTOMATON,
xi.mobSkill.MAGIC_MORTAR_AUTOMATON,
xi.mobSkill.SLAPSTICK_AUTOMATON,
xi.mobSkill.STRING_CLIPPER_AUTOMATON,
xi.mobSkill.STRING_SHREDDER_AUTOMATON,
}
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onEquip', function(pet, attachment)
pet:addListener('WEAPONSKILL_STATE_EXIT', 'AUTO_FLAME_HOLDER_END', function(automaton, skillId, wasExecuted)
if not validFlameHolderSkills[skillId] then
return
end
if not wasExecuted then
return
end
local master = automaton:getMaster()
if not master then
return
end
-- Consume all Fire Maneuvers on weaponskill execution.
local fireManeuvers = master:countEffect(xi.effect.FIRE_MANEUVER)
for i = 1, fireManeuvers do
master:delStatusEffectSilent(xi.effect.FIRE_MANEUVER)
end
master:updateAttachments()
end)
xi.automaton.onAttachmentEquip(pet, attachment)
end)
m:addOverride('xi.actions.abilities.pets.attachments.flame_holder.onUnequip', function(pet, attachment)
xi.automaton.onAttachmentUnequip(pet, attachment)
pet:removeListener('AUTO_FLAME_HOLDER_END')
end)
-----------------------------------
-- Ice Maker - Reduces Magic Attack Bonus from Ice Maker, and consumes all Ice Maneuvers on magic attack execution. https://wiki.ffo.jp/html/11198.html
-----------------------------------
local validIceMakerSpells = set
{
xi.magic.spell.FIRE,
xi.magic.spell.FIRE_II,
xi.magic.spell.FIRE_III,
xi.magic.spell.FIRE_IV,
xi.magic.spell.FIRE_V,
xi.magic.spell.BLIZZARD,
xi.magic.spell.BLIZZARD_II,
xi.magic.spell.BLIZZARD_III,
xi.magic.spell.BLIZZARD_IV,
xi.magic.spell.BLIZZARD_V,
xi.magic.spell.AERO,
xi.magic.spell.AERO_II,
xi.magic.spell.AERO_III,
xi.magic.spell.AERO_IV,
xi.magic.spell.AERO_V,
xi.magic.spell.STONE,
xi.magic.spell.STONE_II,
xi.magic.spell.STONE_III,
xi.magic.spell.STONE_IV,
xi.magic.spell.STONE_V,
xi.magic.spell.THUNDER,
xi.magic.spell.THUNDER_II,
xi.magic.spell.THUNDER_III,
xi.magic.spell.THUNDER_IV,
xi.magic.spell.THUNDER_V,
xi.magic.spell.WATER,
xi.magic.spell.WATER_II,
xi.magic.spell.WATER_III,
xi.magic.spell.WATER_IV,
xi.magic.spell.WATER_V,
}
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onEquip', function(pet, attachment)
pet:addListener('MAGIC_USE', 'AUTO_ICE_MAKER_USE', function(automaton, target, spell, action)
if not validIceMakerSpells[spell:getID()] then
return
end
local master = automaton:getMaster()
if not master then
return
end
local iceManeuvers = master:countEffect(xi.effect.ICE_MANEUVER)
for i = 1, iceManeuvers do
master:delStatusEffectSilent(xi.effect.ICE_MANEUVER)
end
master:updateAttachments()
end)
xi.automaton.onAttachmentEquip(pet, attachment)
end)
m:addOverride('xi.actions.abilities.pets.attachments.ice_maker.onUnequip', function(pet, attachment)
xi.automaton.onAttachmentUnequip(pet, attachment)
pet:removeListener('AUTO_ICE_MAKER_USE')
end)
-----------------------------------
-- Replicator - Reduces amount of absorbs granted by Replicator, and changes them to Blink from Utsusemi. Also consumes Wind Maneuvers. https://wiki.ffo.jp/html/12225.html
-----------------------------------
local shadowTable =
{
[1] = 2,
[2] = 3,
[3] = 4,
}
m:addOverride('xi.actions.abilities.pets.automaton.replicator.onAutomatonAbilityCheck', function(target, automaton, skill)
return 0
end)
m:addOverride('xi.actions.abilities.pets.automaton.replicator.onAutomatonAbility', function(target, automaton, skill, master, action)
local windManeuvers = xi.automaton.getManeuverCount(master, master:countEffect(xi.effect.WIND_MANEUVER))
local shadows = shadowTable[windManeuvers]
automaton:addRecast(xi.recast.ABILITY, skill:getID(), 60)
for i = 1, windManeuvers do
master:delStatusEffectSilent(xi.effect.WIND_MANEUVER)
end
master:updateAttachments()
if
shadows and
target:addStatusEffect(xi.effect.BLINK, { power = shadows, duration = 300, origin = automaton })
then
skill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT)
else
skill:setMsg(xi.msg.basic.SKILL_NO_EFFECT)
end
return xi.effect.BLINK
end)
-----------------------------------
-- Shock Absorber - Reduces the potency of the stoneskin effect and removes scaling. https://wiki.ffo.jp/html/12927.html
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.shock_absorber.onAutomatonAbilityCheck', function(target, automaton, skill)
return 0
end)
m:addOverride('xi.actions.abilities.pets.automaton.shock_absorber.onAutomatonAbility', function(target, automaton, skill, master, action)
automaton:addRecast(xi.recast.ABILITY, skill:getID(), 180)
if target:addStatusEffect(xi.effect.STONESKIN, { power = 100, duration = 180, origin = automaton, tier = 4 }) then
skill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT)
else
skill:setMsg(xi.msg.basic.SKILL_NO_EFFECT)
end
return xi.effect.STONESKIN
end)
-----------------------------------
-- Shield Bash - Removes gaurunteed hit chance while Hammermill is equipped. https://wiki.ffo.jp/html/12156.html
-----------------------------------
local shieldBashSlowTable =
{
[1] = { tier = 4, duration = 30 },
[2] = { tier = 5, duration = 50 },
[3] = { tier = 6, duration = 70 },
}
local function applyHammermillSlow(automaton, target, skill, master)
local power = automaton:getMod(xi.mod.AUTO_SHIELD_BASH_SLOW) * 100
if power <= 0 then
return
end
local slowTier = shieldBashSlowTable[master and xi.automaton.getManeuverCount(master, master:countEffect(xi.effect.EARTH_MANEUVER)) or 0]
local params =
{
[1] = { effectId = xi.effect.SLOW, power = power, duration = slowTier.duration, tier = slowTier.tier },
}
xi.combat.action.executeMobskillStatusEffect(automaton, target, skill, params, { messageBypass = true })
end
m:addOverride('xi.actions.abilities.pets.automaton.shield_bash.onAutomatonAbilityCheck', function(target, automaton, skill)
return 0
end)
-----------------------------------
-- Hammermill
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.shield_bash.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = automaton:getWeaponDmg()
params.numHits = utils.clamp(1 + xi.automaton.getExtraHits(automaton, 1), 1, 8)
params.fTP = { 1.0, 1.0, 1.0 }
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = params.numHits
local hammermillEquipped = automaton:hasAttachmentSet(xi.item.HAMMERMILL_ATTACHMENT)
if hammermillEquipped then
local shieldBashBonus = 1.0 + automaton:getMod(xi.mod.SHIELD_BASH) / 100
params.fTP =
{
params.fTP[1] * shieldBashBonus,
params.fTP[2] * shieldBashBonus,
params.fTP[3] * shieldBashBonus,
}
end
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
xi.mobskills.mobStatusEffectMove(automaton, target, xi.effect.STUN, 1, 0, 6)
if hammermillEquipped then
applyHammermillSlow(automaton, target, skill, master)
end
end
return info.damage
end)
-----------------------------------
-- Analyzer - Caps the amount of skills that can be analyzed to 1. https://wiki.ffo.jp/html/10746.html
-----------------------------------
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onEquip', function(pet, attachment)
pet:setLocalVar('analyzedSkill1', 0)
pet:addListener('WEAPONSKILL_TAKE', 'ANALYZER_WEAPONSKILL_TAKE', function(mob, target, skill, tp, action)
local analyzerModifier = target:getMod(xi.mod.AUTO_ANALYZER)
local incomingSkill = skill:getID()
if analyzerModifier <= 0 then
return
end
local analyzedSkill = target:getLocalVar('analyzedSkill1')
if incomingSkill == analyzedSkill then
return
end
if incomingSkill ~= analyzedSkill then
target:setLocalVar('analyzedSkill1', incomingSkill)
end
end)
xi.automaton.onAttachmentEquip(pet, attachment)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onUnequip', function(pet, attachment)
pet:setLocalVar('analyzedSkill1', 0)
pet:removeListener('ANALYZER_WEAPONSKILL_TAKE')
xi.automaton.onAttachmentUnequip(pet, attachment)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onManeuverGain', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onManeuverLose', function(pet, attachment, maneuvers)
end)
m:addOverride('xi.actions.abilities.pets.attachments.analyzer.onUpdate', function(pet, attachment, maneuvers)
end)
m:addOverride('utils.handleAutomatonAutoAnalyzer', function(actor, skill, damage)
local analyzerModifier = actor:getMod(xi.mod.AUTO_ANALYZER)
if analyzerModifier <= 0 then
return damage
end
local automatonId = actor:getID()
if not automatonId then
return damage
end
local automatonMaster = actor:getMaster()
if not automatonMaster then
return damage
end
local incomingSkill = skill:getID()
local analyzedSkill = actor:getLocalVar('analyzedSkill1')
if incomingSkill == analyzedSkill then
local earthManeuvers = xi.automaton.getManeuverCount(automatonMaster, automatonMaster:countEffect(xi.effect.EARTH_MANEUVER))
local damageReduction = 10 + 10 * earthManeuvers
return math.floor(damage * (100 - damageReduction) / 100)
end
return damage
end)
-----------------------------------
-- Eraser - Changes Eraser to consume all Maneuvers on activation. https://wiki.ffo.jp/html/5365.html
-----------------------------------
local maneuvers =
{
xi.effect.FIRE_MANEUVER,
xi.effect.ICE_MANEUVER,
xi.effect.WIND_MANEUVER,
xi.effect.EARTH_MANEUVER,
xi.effect.THUNDER_MANEUVER,
xi.effect.WATER_MANEUVER,
xi.effect.LIGHT_MANEUVER,
xi.effect.DARK_MANEUVER,
}
local function removeAllManeuvers(master)
-- Era Eraser consumes all active maneuvers, not just Light Maneuvers.
for _, maneuverId in ipairs(maneuvers) do
for _ = 1, master:countEffect(maneuverId) do
master:delStatusEffectSilent(maneuverId)
end
end
end
local removables =
{
-- Songs
xi.effect.ELEGY,
xi.effect.REQUIEM,
xi.effect.THRENODY,
-- Enfeebling
xi.effect.BLINDNESS,
xi.effect.PARALYSIS,
xi.effect.SILENCE,
xi.effect.POISON,
xi.effect.CURSE_I,
xi.effect.CURSE_II,
xi.effect.DISEASE,
xi.effect.PLAGUE,
xi.effect.WEIGHT,
xi.effect.BIND,
xi.effect.ADDLE,
xi.effect.SLOW,
xi.effect.PETRIFICATION,
-- DoTs
xi.effect.BIO,
xi.effect.DIA,
xi.effect.BURN,
xi.effect.FROST,
xi.effect.CHOKE,
xi.effect.RASP,
xi.effect.SHOCK,
xi.effect.DROWN,
-- Main Stat Downs
xi.effect.STR_DOWN,
xi.effect.DEX_DOWN,
xi.effect.VIT_DOWN,
xi.effect.AGI_DOWN,
xi.effect.INT_DOWN,
xi.effect.MND_DOWN,
xi.effect.CHR_DOWN,
-- Combat Stat Downs
xi.effect.ACCURACY_DOWN,
xi.effect.ATTACK_DOWN,
xi.effect.EVASION_DOWN,
xi.effect.DEFENSE_DOWN,
-- Magic Stat Downs
xi.effect.MAGIC_ACC_DOWN,
xi.effect.MAGIC_ATK_DOWN,
xi.effect.MAGIC_EVASION_DOWN,
xi.effect.MAGIC_DEF_DOWN,
-- HP/MP/TP Stat Downs
xi.effect.MAX_TP_DOWN,
xi.effect.MAX_MP_DOWN,
xi.effect.MAX_HP_DOWN,
}
m:addOverride('xi.actions.abilities.pets.automaton.eraser.onAutomatonAbilityCheck', function(target, automaton, skill)
return 0
end)
m:addOverride('xi.actions.abilities.pets.automaton.eraser.onAutomatonAbility', function(target, automaton, skill, master, action)
automaton:addRecast(xi.recast.ABILITY, skill:getID(), 30)
local lightManeuvers = xi.automaton.getManeuverCount(master, master:countEffect(xi.effect.LIGHT_MANEUVER))
local effectsRemoved = 0
for _, effectId in ipairs(removables) do
if target:hasStatusEffect(effectId) then
target:delStatusEffectSilent(effectId)
effectsRemoved = effectsRemoved + 1
if effectsRemoved >= lightManeuvers then
break
end
end
end
removeAllManeuvers(master)
master:updateAttachments()
if effectsRemoved > 0 then
skill:setMsg(xi.msg.basic.DISAPPEAR_NUM)
else
skill:setMsg(xi.msg.basic.USES)
end
return effectsRemoved
end)
-----------------------------------
-- Economizer - Changes Economizer to consume all Dark Maneuvers on activation. : https://wiki.ffo.jp/html/10435.html
-----------------------------------
local activationThresholds =
{
[0] = 30,
[1] = 40,
[2] = 50,
[3] = 60,
}
m:addOverride('xi.actions.abilities.pets.automaton.economizer.onEquip', function(pet)
pet:addListener('AUTOMATON_ATTACHMENT_CHECK', 'ATTACHMENT_ECONOMIZER', function(automaton, target)
-- If Economizer is still on cooldown, do nothing.
if automaton:hasRecast(xi.recast.ABILITY, xi.mobSkill.ECONOMIZER_AUTOMATON) then
return
end
local master = automaton:getMaster()
if not master then
return
end
local darkManeuvers = master:countEffect(xi.effect.DARK_MANEUVER)
if darkManeuvers == 0 then
return
end
local maxMP = automaton:getMaxMP()
-- If this automaton has no MP, do nothing.
if maxMP == 0 then
return
end
local mpPercent = automaton:getMPP()
local mpThreshold = activationThresholds[darkManeuvers] or 30
-- If the automaton's MP is above the threshold, do nothing.
if mpPercent > mpThreshold then
return
end
automaton:useMobAbility(xi.mobSkill.ECONOMIZER_AUTOMATON, automaton)
end)
end)
m:addOverride('xi.actions.abilities.pets.automaton.economizer.onAutomatonAbility', function(target, automaton, skill, master, action)
automaton:addRecast(xi.recast.ABILITY, skill:getID(), 180)
local darkManeuvers = master:countEffect(xi.effect.DARK_MANEUVER)
local mpRecovered = math.floor(automaton:getMaxMP() * 0.2 * darkManeuvers)
for _ = 1, darkManeuvers do
master:delStatusEffectSilent(xi.effect.DARK_MANEUVER)
end
master:updateAttachments()
skill:setMsg(xi.msg.basic.SKILL_RECOVERS_MP)
return automaton:addMP(mpRecovered)
end)
return m

View file

@ -1,129 +0,0 @@
-----------------------------------
-- Eraser (Pre-2011)
-- Removes up to 3 status effects from the Automaton or its Master based on the number of Light Maneuvers active.
-- Consumes all maneuvers on use.
-- Eraser cannot remove Venom, Death Sentence, Charm or Gradual Petrification.
-- Prioritizes removing effects from the Automaton over the Master.
-- Updated to consume only Light Maneuvers on December 15th, 2011.
-- Updated to consume no maneuvers on March 11th, 2019.
-- https://wiki.ffo.jp/html/5365.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_eraser'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
local maneuvers =
{
xi.effect.FIRE_MANEUVER,
xi.effect.ICE_MANEUVER,
xi.effect.WIND_MANEUVER,
xi.effect.EARTH_MANEUVER,
xi.effect.THUNDER_MANEUVER,
xi.effect.WATER_MANEUVER,
xi.effect.LIGHT_MANEUVER,
xi.effect.DARK_MANEUVER,
}
local removables =
{
-- Songs
xi.effect.ELEGY,
xi.effect.REQUIEM,
xi.effect.THRENODY,
-- Enfeebling
xi.effect.BLINDNESS,
xi.effect.PARALYSIS,
xi.effect.SILENCE,
xi.effect.POISON,
xi.effect.CURSE_I,
xi.effect.CURSE_II,
xi.effect.DISEASE,
xi.effect.PLAGUE,
xi.effect.WEIGHT,
xi.effect.BIND,
xi.effect.ADDLE,
xi.effect.SLOW,
xi.effect.PETRIFICATION,
-- DoTs
xi.effect.BIO,
xi.effect.DIA,
xi.effect.BURN,
xi.effect.FROST,
xi.effect.CHOKE,
xi.effect.RASP,
xi.effect.SHOCK,
xi.effect.DROWN,
-- Main Stat Downs
xi.effect.STR_DOWN,
xi.effect.DEX_DOWN,
xi.effect.VIT_DOWN,
xi.effect.AGI_DOWN,
xi.effect.INT_DOWN,
xi.effect.MND_DOWN,
xi.effect.CHR_DOWN,
-- Combat Stat Downs
xi.effect.ACCURACY_DOWN,
xi.effect.ATTACK_DOWN,
xi.effect.EVASION_DOWN,
xi.effect.DEFENSE_DOWN,
-- Magic Stat Downs
xi.effect.MAGIC_ACC_DOWN,
xi.effect.MAGIC_ATK_DOWN,
xi.effect.MAGIC_EVASION_DOWN,
xi.effect.MAGIC_DEF_DOWN,
-- HP/MP/TP Stat Downs
xi.effect.MAX_TP_DOWN,
xi.effect.MAX_MP_DOWN,
xi.effect.MAX_HP_DOWN,
}
m:addOverride('xi.actions.abilities.pets.automaton.eraser.onAutomatonAbilityCheck', function(target, automaton, skill)
return 0
end)
m:addOverride('xi.actions.abilities.pets.automaton.eraser.onAutomatonAbility', function(target, automaton, skill, master, action)
automaton:addRecast(xi.recast.ABILITY, skill:getID(), 30)
local lightManeuvers = master:countEffect(xi.effect.LIGHT_MANEUVER)
local effectsRemoved = 0
for _, effectId in ipairs(removables) do
if target:hasStatusEffect(effectId) then
target:delStatusEffectSilent(effectId)
effectsRemoved = effectsRemoved + 1
if effectsRemoved >= lightManeuvers then
break
end
end
end
for _, maneuverId in ipairs(maneuvers) do
for _ = 1, master:countEffect(maneuverId) do
master:delStatusEffectSilent(maneuverId)
end
end
if effectsRemoved > 0 then
skill:setMsg(xi.msg.basic.DISAPPEAR_NUM)
else
skill:setMsg(xi.msg.basic.USES)
end
return effectsRemoved
end)
return m

View file

@ -1,51 +0,0 @@
-----------------------------------
-- Replicator (Pre-2011)
-- Description : Applies Blink based on Wind Maneuvers when HP is below a certain threshold. Cooldown of 1 minute. Consumes all Wind Maneuvers on use.
-- If Automaton has a Damage Gauge equipped, activation threshold is increased to 75% HP.
-- Amount of images increased on December 15th, 2011.
-- Changed from Blink to Copy Image on August 5th, 2015.
-- Changed to not consume Wind Maneuvers on August 6th, 2019.
-- https://wiki.ffo.jp/html/12225.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_replicator'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
local shadowTable =
{
[1] = 2,
[2] = 3,
[3] = 4,
}
m:addOverride('xi.actions.abilities.pets.automaton.replicator.onAutomatonAbilityCheck', function(target, automaton, skill)
return 0
end)
m:addOverride('xi.actions.abilities.pets.automaton.replicator.onAutomatonAbility', function(target, automaton, skill, master, action)
local windManeuvers = master:countEffect(xi.effect.WIND_MANEUVER)
local shadows = shadowTable[windManeuvers]
automaton:addRecast(xi.recast.ABILITY, skill:getID(), 60)
for i = 1, windManeuvers do
master:delStatusEffectSilent(xi.effect.WIND_MANEUVER)
end
if target:addStatusEffect(xi.effect.BLINK, { power = shadows, duration = 300, origin = automaton }) then
skill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT)
else
skill:setMsg(xi.msg.basic.SKILL_NO_EFFECT)
end
return xi.effect.BLINK
end)
return m

View file

@ -0,0 +1,37 @@
-----------------------------------
-- Reverts Hastega to no longer have a duration based on summoning magic and reduces haste power
-- Source: https://www.bg-wiki.com/ffxi/Version_Update_(04/08/2009)
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'hastega'
if xi.module.isContentEnabled('WOTG') then
return { name = moduleName }
end
local m = Module:new(moduleName)
m:addOverride('xi.actions.abilities.pets.hastega.onPetAbility', function(target, pet, petskill, summoner, action)
local duration = 180
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
-- Reverts Garuda's Hastega to use 102/1024 or 9.96%
local typeEffect = xi.effect.HASTE
if target:addStatusEffect(typeEffect, { power = 996, duration = duration, origin = pet }) then
if target:getID() == action:getPrimaryTargetID() then
petskill:setMsg(xi.msg.basic.SKILL_GAIN_EFFECT_2)
else
petskill:setMsg(xi.msg.basic.JA_GAIN_EFFECT)
end
else
petskill:setMsg(xi.msg.basic.JA_NO_EFFECT_2)
return
end
return typeEffect
end)
return m

View file

@ -0,0 +1,838 @@
-----------------------------------
-- Date : 2016 November 10th Patch
-- Notes: https://wiki.ffo.jp/html/35795.html
-- Multihit skills' fTPs were lowered but the first hit fTP carried over into subsequent hits.
-- In 75 era, the subsequent hits had a 1.0 multiplier.
-- Old fTPs might be lost to time unless there new data is uncovered through online documentation or client data.
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'rov_avatar_bloodpacts'
if xi.module.isContentEnabled('ROV') then
return { name = moduleName }
end
local m = Module:new(moduleName)
-----------------------------------
-- Axe Kick
-----------------------------------
m:addOverride('xi.actions.abilities.pets.axe_kick.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Barracuda Dive
-----------------------------------
m:addOverride('xi.actions.abilities.pets.barracuda_dive.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Blindside
-----------------------------------
m:addOverride('xi.actions.abilities.pets.blindside.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
-- params.str_wSC = 0.20 -- TODO: Capture wSCs
-- params.mnd_wSC = 0.20
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Burning Strike
-----------------------------------
m:addOverride('xi.actions.abilities.pets.burning_strike.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.75, 2.75, 2.75 }
params.fTPSubsequentHits = { 2.75, 2.75, 2.75 }
params.str_wSC = 0.20
params.int_wSC = 0.20
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.hybridSkill = true
params.hybridSkillElement = xi.element.FIRE
params.hybridAttackType = xi.attackType.MAGICAL
params.hybridDamageType = xi.damageType.FIRE
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
local totalDamage = 0
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
if info.damage > 0 then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
totalDamage = totalDamage + info.damage
end
if info.hybridDamage > 0 and target:getHP() > 0 then
target:takeDamage(info.hybridDamage, pet, info.hybridAttackType, info.hybridDamageType)
totalDamage = totalDamage + info.hybridDamage
end
end
return totalDamage
end)
-----------------------------------
-- Camisado
-----------------------------------
m:addOverride('xi.actions.abilities.pets.camisado.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.0, 2.0, 2.0 }
params.fTPSubsequentHits = { 2.0, 2.0, 2.0 }
params.str_wSC = 0.20
params.mnd_wSC = 0.20
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
-- TODO: Knockback may not yet be hooked up to abilities.
-- action:knockback(target:getID(), xi.action.knockback.LEVEL3)
-- TODO: Some equipment that reduces movement speed can reduce knockback distance. (Example: Plumb Boots)
-- https://discord.com/channels/392903136336936960/883227978002206751/1280243231635804262
-- https://discord.com/channels/443544205206355968/443893540922064896/1376405495845355661
end
return info.damage
end)
-----------------------------------
-- Chaotic Strike
-----------------------------------
m:addOverride('xi.actions.abilities.pets.chaotic_strike.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 3
params.fTP = { 10.00, 10.00, 10.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.20
params.int_wSC = 0.20
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.STUN, power = 1, duration = 12, origin = pet },
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Claw
-----------------------------------
m:addOverride('xi.actions.abilities.pets.claw.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.dex_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.PIERCING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Crag Throw
-----------------------------------
-- TODO: Not currently coded at time of this comment. Does not gain an accuracy bonus based on fTP.
-----------------------------------
-- Crescent Fang
-----------------------------------
m:addOverride('xi.actions.abilities.pets.crescent_fang.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 1.50, 1.50, 1.50 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.PIERCING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.PARALYSIS, power = 22, duration = 60, origin = pet }, -- TODO: Capture power
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Double Punch
-----------------------------------
m:addOverride('xi.actions.abilities.pets.double_punch.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 2
params.fTP = { 5.00, 5.00, 5.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Double Slap
-----------------------------------
m:addOverride('xi.actions.abilities.pets.double_slap.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 2
params.fTP = { 6.328125, 6.328125, 6.328125 }
params.fTPSubsequentHits = { 1.000000, 1.000000, 1.000000 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Eclipse Bite
-----------------------------------
m:addOverride('xi.actions.abilities.pets.eclipse_bite.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 3
params.fTP = { 3.269531, 3.269531, 3.269531 }
params.fTPSubsequentHits = { 1.000000, 1.000000, 1.000000 }
params.dex_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Flaming Crush
-----------------------------------
m:addOverride('xi.actions.abilities.pets.flaming_crush.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 2
params.fTP = { 6.00, 6.00, 6.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.20
params.int_wSC = 0.20
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.hybridSkill = true
params.hybridSkillElement = xi.element.FIRE
params.hybridAttackType = xi.attackType.MAGICAL
params.hybridDamageType = xi.damageType.FIRE
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_2
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
local totalDamage = 0
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
if info.damage > 0 then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
totalDamage = totalDamage + info.damage
end
if info.hybridDamage > 0 and target:getHP() > 0 then
target:takeDamage(info.hybridDamage, pet, info.hybridAttackType, info.hybridDamageType)
totalDamage = totalDamage + info.hybridDamage
end
end
return totalDamage
end)
-----------------------------------
-- Megalith Throw
-----------------------------------
m:addOverride('xi.actions.abilities.pets.megalith_throw.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getRangedDmg()
params.numHits = 1
params.fTP = { 2.375, 2.375, 2.375 }
params.fTPSubsequentHits = { 1.000, 1.000, 1.000 }
params.str_wSC = 0.20
params.agi_wSC = 0.20
params.skipParry = true
params.skipGuard = true
params.skipBlock = true
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobRangedMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.SLOW, power = 3000, duration = 120, tier = 8, origin = pet }, -- TODO: Capture Slow tier
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Moonlit Charge
-----------------------------------
m:addOverride('xi.actions.abilities.pets.moonlit_charge.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 1.00, 1.00, 1.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.vit_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.BLINDNESS, power = 25, duration = 60, origin = pet },
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Mountain Buster
-----------------------------------
m:addOverride('xi.actions.abilities.pets.mountain_buster.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 7.25, 7.25, 7.25 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.vit_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobRangedMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Poison Nails
-----------------------------------
m:addOverride('xi.actions.abilities.pets.poison_nails.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.dex_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.PIERCING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.POISON, power = 1, tick = 3, duration = 90, tier = 1, origin = pet },
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Predator Claws
-----------------------------------
m:addOverride('xi.actions.abilities.pets.predator_claws.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 3
params.fTP = { 10.00, 10.00, 10.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.dex_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Punch
-----------------------------------
m:addOverride('xi.actions.abilities.pets.punch.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Regal Gash
-----------------------------------
-- TODO: Not coded at time of this comment. Loses accuracy ftp scaling.
-----------------------------------
-- Regal Scratch
-----------------------------------
m:addOverride('xi.actions.abilities.pets.regal_scratch.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
-- https://wiki.ffo.jp/html/26384.html
-- JP Wiki states that this skill was excluded from carrying first hit fTP to subsequent hits.
-- (See Patch note history for November 10th, 2016 in above link.)
params.baseDamage = pet:getWeaponDmg()
params.numHits = 3
params.fTP = { 3.00, 3.00, 3.00 } -- TODO: Capture fTPs
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
-- params.dex_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_3
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Rock Buster
-----------------------------------
m:addOverride('xi.actions.abilities.pets.rock_buster.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.25, 2.25, 2.25 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.vit_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.BIND, power = 1, duration = 120, origin = pet }, -- TODO: Capture duration
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Rock Throw
-----------------------------------
m:addOverride('xi.actions.abilities.pets.rock_throw.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getRangedDmg()
params.numHits = 1
params.fTP = { 1.00, 1.00, 1.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.20
params.agi_wSC = 0.20
params.skipParry = true
params.skipGuard = true
params.skipBlock = true
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobRangedMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.SLOW, power = 3000, duration = 120, tier = 8, origin = pet }, -- TODO: Capture Slow tier
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Rush
-----------------------------------
m:addOverride('xi.actions.abilities.pets.rush.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 5
params.fTP = { 3.50, 3.50, 3.50 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_5
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Shock Strike
-----------------------------------
m:addOverride('xi.actions.abilities.pets.shock_strike.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 2.00, 2.00, 2.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.20
params.int_wSC = 0.20
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.STUN, power = 1, duration = 12, origin = pet },
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Spinning Dive
-----------------------------------
m:addOverride('xi.actions.abilities.pets.spinning_dive.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 7.01171, 7.01171, 7.01171 }
params.fTPSubsequentHits = { 1.00000, 1.00000, 1.00000 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Tail Whip
-----------------------------------
m:addOverride('xi.actions.abilities.pets.tail_whip.onPetAbility', function(target, pet, petskill, summoner, action)
xi.job_utils.summoner.onUseBloodPact(target, petskill, summoner, action)
local params = {}
params.baseDamage = pet:getWeaponDmg()
params.numHits = 1
params.fTP = { 3.00, 3.00, 3.00 }
params.fTPSubsequentHits = { 1.00, 1.00, 1.00 }
params.str_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.attackMultiplier = { 2.0, 2.0, 2.0 }
params.primaryMessage = xi.msg.basic.USES_JA_TAKE_DAMAGE
local info = xi.mobskills.mobPhysicalMove(pet, target, petskill, action, params)
if xi.mobskills.processDamage(pet, target, petskill, action, info) then
target:takeDamage(info.damage, pet, info.attackType, info.damageType)
local effectTable =
{
[1] = { effectId = xi.effect.WEIGHT, power = 50, duration = 120, tier = 1, origin = pet }, -- TODO: Capture power/duration/tier
}
xi.combat.action.executeMobskillStatusEffect(pet, target, petskill, effectTable, { messageBypass = true })
end
return info.damage
end)
-----------------------------------
-- Volt Strike
-----------------------------------
-- TODO: Volt Strike is not currently coded at time of this comment but should be set to 1.0 for fTPSubsequentHits. Loses Crit Scaling.
return m

View file

@ -145,10 +145,11 @@ m:addOverride('xi.actions.weaponskills.namas_arrow.onUseWeaponSkill', function(p
params.overrideVE = 480
params.rangedAccuracyBonus = 100
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doRangedWeaponskill(player, target, wsID, params, tp, action, primary)
-- Apply aftermath
xi.aftermath.addStatusEffect(player, tp, xi.slot.RANGED, xi.aftermath.type.RELIC)
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doRangedWeaponskill(player, target, wsID, params, tp, action, primary)
return tpHits, extraHits, criticalHit, damage
end)

View file

@ -0,0 +1,305 @@
-----------------------------------
-- WoTG Era Automaton Weaponskills
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'wotg_automaton'
local m = Module:new(moduleName)
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
-----------------------------------
-- Arcuballista
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.arcuballista.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = xi.automaton.getRangedBaseDamage(automaton)
params.numHits = 1
params.fTP = { 2.5, 3.0, 4.0 }
params.dex_wSC = 0.30
params.accuracyModifier = { 100, 100, 100 }
params.attackType = xi.attackType.RANGED
params.damageType = xi.damageType.PIERCING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.skipParry = true
params.skipGuard = true
params.skipBlock = true
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobRangedMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Armor Piercer
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.armor_piercer.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = xi.automaton.getRangedBaseDamage(automaton)
params.numHits = 1
params.fTP = { 3.0, 3.5, 4.0 }
params.dex_wSC = 0.30
params.ignoreDefense = { 0.5, 0.5, 0.5 }
params.accuracyModifier = { 100, 100, 100 }
params.attackType = xi.attackType.RANGED
params.damageType = xi.damageType.PIERCING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.skipParry = true
params.skipGuard = true
params.skipBlock = true
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobRangedMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Bone Crusher
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.bone_crusher.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = automaton:getWeaponDmg()
params.numHits = utils.clamp(3 + xi.automaton.getExtraHits(automaton, 3), 1, 8)
params.fTP = { 1.5, 1.5, 1.5 }
params.vit_wSC = 0.30
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = params.numHits
if target:isUndead() then
params.fTP = { 2.5, 2.5, 2.5 }
end
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
xi.mobskills.mobStatusEffectMove(automaton, target, xi.effect.STUN, 1, 0, 4)
end
return info.damage
end)
-----------------------------------
-- Cannibal Blade
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.cannibal_blade.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = automaton:getSkillLevel(xi.skill.AUTOMATON_MELEE) / 9.2
params.numHits = 1
params.fTP = { 11.0, 12.5, 14.0 }
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.guaranteedFirstHit = true
params.skipFSTR = true
params.skipPDIF = true
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
if not target:isUndead() then
automaton:addHP(info.damage)
end
end
-- Does not return TP.
automaton:setTP(0)
return info.damage
end)
-----------------------------------
-- Chimera Ripper
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.chimera_ripper.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = automaton:getWeaponDmg()
params.numHits = utils.clamp(1 + xi.automaton.getExtraHits(automaton, 1), 1, 8)
params.fTP = { 2.0, 2.5, 3.0 }
params.str_wSC = 0.30
params.accuracyModifier = { 100, 100, 100 }
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = params.numHits
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Daze
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.daze.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = xi.automaton.getRangedBaseDamage(automaton)
params.numHits = 1
params.fTP = { 5.0, 5.5, 6.0 }
params.dex_wSC = 0.30
params.accuracyModifier = { 150, 150, 150 }
params.attackType = xi.attackType.RANGED
params.damageType = xi.damageType.PIERCING
params.shadowBehavior = xi.mobskills.shadowBehavior.NUMSHADOWS_1
params.skipParry = true
params.skipGuard = true
params.skipBlock = true
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobRangedMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
xi.mobskills.mobStatusEffectMove(automaton, target, xi.effect.STUN, 1, 0, 4)
end
return info.damage
end)
-----------------------------------
-- Knockout
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.knockout.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.numHits = utils.clamp(1 + xi.automaton.getExtraHits(automaton, 1), 1, 8)
params.fTP = { 4.0, 4.5, 5.0 }
params.agi_wSC = 0.40
params.accuracyModifier = { 50, 50, 50 }
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = params.numHits
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
xi.mobskills.mobStatusEffectMove(automaton, target, xi.effect.EVASION_DOWN, 20, 0, 30)
end
return info.damage
end)
-----------------------------------
-- Magic Mortar
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.magic_mortar.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = automaton:getMaxHP() - automaton:getHP()
params.fTP = { 0.50, 0.75, 1.00 }
params.element = xi.element.NONE
params.attackType = xi.attackType.MAGICAL
params.damageType = xi.damageType.ELEMENTAL
params.shadowBehavior = xi.mobskills.shadowBehavior.IGNORE_SHADOWS
-- Flame Holder multiplies the base damage of Magic Mortar. Gives a 25% boost at 3 Fire Maneuvers.
local flameHolderModifier = 1.0 + (automaton:getMod(xi.mod.WEAPONSKILL_DAMAGE_BASE) - 100) / 1000
if flameHolderModifier > 1.0 then
params.baseDamage = math.floor(params.baseDamage * flameHolderModifier)
end
local info = xi.mobskills.mobMagicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- Slapstick
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.slapstick.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.numHits = utils.clamp(3 + xi.automaton.getExtraHits(automaton, 3), 1, 8)
params.fTP = { 1.0, 1.0, 1.0 }
params.str_wSC = 0.20
params.dex_wSC = 0.20
params.accuracyModifier = { 0, 30, 50 }
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.BLUNT
params.shadowBehavior = params.numHits
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
end
return info.damage
end)
-----------------------------------
-- String Clipper
-----------------------------------
m:addOverride('xi.actions.abilities.pets.automaton.string_clipper.onAutomatonAbility', function(target, automaton, skill, master, action)
local params = {}
params.baseDamage = automaton:getWeaponDmg()
params.numHits = utils.clamp(2 + xi.automaton.getExtraHits(automaton, 2), 1, 8)
params.fTP = { 2.0, 2.0, 2.0 }
params.str_wSC = 0.15
params.dex_wSC = 0.15
params.attackMultiplier = { 1.5, 1.5, 1.5 }
params.accuracyModifier = { 0, 50, 100 }
params.attackType = xi.attackType.PHYSICAL
params.damageType = xi.damageType.SLASHING
params.shadowBehavior = params.numHits
xi.automaton.applyFlameHolder(automaton, params.fTP)
local info = xi.mobskills.mobPhysicalMove(automaton, target, skill, action, params)
if xi.mobskills.processDamage(automaton, target, skill, action, info) then
target:takeDamage(info.damage, automaton, info.attackType, info.damageType)
end
return info.damage
end)
return m

View file

@ -37,7 +37,7 @@ m:addOverride('xi.actions.weaponskills.smash_axe.onUseWeaponSkill', function(pla
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.STUN
local actionElement = xi.element.THUNDER
local power = 1
@ -63,7 +63,7 @@ m:addOverride('xi.actions.weaponskills.gale_axe.onUseWeaponSkill', function(play
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.CHOKE
local actionElement = xi.element.WIND
local power = 5

View file

@ -56,7 +56,7 @@ m:addOverride('xi.actions.weaponskills.brainshaker.onUseWeaponSkill', function(p
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.STUN
local actionElement = xi.element.THUNDER
local power = 1
@ -106,7 +106,7 @@ m:addOverride('xi.actions.weaponskills.skullbreaker.onUseWeaponSkill', function(
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.INT_DOWN
local actionElement = xi.element.FIRE
local power = 10

View file

@ -63,7 +63,7 @@ m:addOverride('xi.actions.weaponskills.shadowstitch.onUseWeaponSkill', function(
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.BIND
local actionElement = xi.element.ICE
local power = 1
@ -270,7 +270,7 @@ m:addOverride('xi.actions.weaponskills.mordant_rime.onUseWeaponSkill', function(
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.WEIGHT
local actionElement = xi.element.WIND
local power = 25

View file

@ -37,7 +37,7 @@ m:addOverride('xi.actions.weaponskills.tachi_hobaku.onUseWeaponSkill', function(
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.STUN
local actionElement = xi.element.THUNDER
local power = 1

View file

@ -92,7 +92,7 @@ m:addOverride('xi.actions.weaponskills.shockwave.onUseWeaponSkill', function(pla
local power = 1
local skillType = xi.skill.GREAT_SWORD
local resist = xi.combat.magicHitRate.calculateResistRate(player, target, 0, skillType, 0, actionElement, 0, effectId, 0)
local duration = math.floor((math.random(0, 30) + tp * 0.01) * resist)
local duration = math.floor((math.randomInt(0, 30) + tp * 0.01) * resist)
xi.weaponskills.handleWeaponskillEffect(player, target, effectId, actionElement, damage, power, duration)
return tpHits, extraHits, criticalHit, damage

View file

@ -37,7 +37,7 @@ m:addOverride('xi.actions.weaponskills.shoulder_tackle.onUseWeaponSkill', functi
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.STUN
local actionElement = xi.element.THUNDER
local power = 1

View file

@ -138,9 +138,11 @@ m:addOverride('xi.actions.weaponskills.coronach.onUseWeaponSkill', function(play
params.overrideVE = 240
params.rangedAccuracyBonus = 100
xi.aftermath.addStatusEffect(player, tp, xi.slot.MAIN, xi.aftermath.type.RELIC)
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doRangedWeaponskill(player, target, wsID, params, tp, action, primary)
-- Apply aftermath
xi.aftermath.addStatusEffect(player, tp, xi.slot.RANGED, xi.aftermath.type.RELIC)
return tpHits, extraHits, criticalHit, damage
end)
@ -156,7 +158,8 @@ m:addOverride('xi.actions.weaponskills.trueflight.onUseWeaponSkill', function(pl
params.includemab = true
params.dStat = xi.mod.AGI
xi.aftermath.addStatusEffect(player, tp, xi.slot.MAIN, xi.aftermath.type.MYTHIC)
-- Apply aftermath
xi.aftermath.addStatusEffect(player, tp, xi.slot.RANGED, xi.aftermath.type.MYTHIC)
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doMagicWeaponskill(player, target, wsID, params, tp, action, primary)
return tpHits, extraHits, criticalHit, damage
@ -174,7 +177,8 @@ m:addOverride('xi.actions.weaponskills.leaden_salute.onUseWeaponSkill', function
params.includemab = true
params.dStat = xi.mod.AGI
xi.aftermath.addStatusEffect(player, tp, xi.slot.MAIN, xi.aftermath.type.MYTHIC)
-- Apply aftermath
xi.aftermath.addStatusEffect(player, tp, xi.slot.RANGED, xi.aftermath.type.MYTHIC)
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doMagicWeaponskill(player, target, wsID, params, tp, action, primary)
return tpHits, extraHits, criticalHit, damage

View file

@ -69,7 +69,7 @@ m:addOverride('xi.actions.weaponskills.leg_sweep.onUseWeaponSkill', function(pla
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 33, 66, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 33, 66, 100 }) then
local effectId = xi.effect.STUN
local actionElement = xi.element.THUNDER
local power = 1

View file

@ -182,7 +182,7 @@ m:addOverride('xi.actions.weaponskills.catastrophe.onUseWeaponSkill', function(p
-- Handle HP Drain
if not target:isUndead() then
local drain = math.floor(damage * math.random(30, 70) / 100)
local drain = math.floor(damage * math.randomInt(30, 70) / 100)
drain = utils.clamp(drain, 0, targetHP)

View file

@ -70,7 +70,7 @@ m:addOverride('xi.actions.weaponskills.starburst.onUseWeaponSkill', function(pla
params.ele = xi.element.LIGHT
params.dStat = xi.mod.INT
if math.random(1, 100) <= 50 then
if math.randomInt(1, 100) <= 50 then
params.ele = xi.element.DARK
end
@ -89,7 +89,7 @@ m:addOverride('xi.actions.weaponskills.sunburst.onUseWeaponSkill', function(play
params.ele = xi.element.LIGHT
params.dStat = xi.mod.INT
if math.random(1, 100) <= 50 then
if math.randomInt(1, 100) <= 50 then
params.ele = xi.element.DARK
end

View file

@ -72,7 +72,7 @@ m:addOverride('xi.actions.weaponskills.flat_blade.onUseWeaponSkill', function(pl
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.STUN
local actionElement = xi.element.THUNDER
local power = 1
@ -166,8 +166,8 @@ m:addOverride('xi.actions.weaponskills.spirits_within.onUseWeaponSkill', functio
local damage = dmg
damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true))
damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, false, false, true))
damage = math.floor(target:handleSevereDamage(damage, false))
if damage > 0 then
@ -298,21 +298,19 @@ m:addOverride('xi.actions.weaponskills.atonement.onUseWeaponSkill', function(pla
return calcParams.tpHitsLanded, calcParams.extraHitsLanded, calcParams.criticalHit, damage
end
-- Regular damage formula
local dmg = target:getCE(player) * cePercent + target:getVE(player) * vePercent
-- Calculate damage based on target's CE and VE, clamped to the global damage cap.
damage = utils.clamp(target:getCE(player) * cePercent + target:getVE(player) * vePercent, 0, globalDamageCap)
-- This is here to account for damage adjustments needed because it is breath damage.
damage = dmg
damage = math.floor(damage * xi.combat.damage.calculateDamageAdjustment(target, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, true))
damage = math.floor(damage * xi.spells.damage.calculateAbsorption(target, xi.element.NONE, false, false, false, true))
damage = math.floor(damage * xi.spells.damage.calculateNullification(target, xi.element.NONE, false, false, false, true))
damage = math.floor(target:handleSevereDamage(damage, false))
if player:getMod(xi.mod.WEAPONSKILL_DAMAGE_BASE + wsID) > 0 then
damage = damage * (100 + player:getMod(xi.mod.WEAPONSKILL_DAMAGE_BASE + wsID)) / 100
end
damage = utils.clamp(damage, 0, globalDamageCap)
calcParams.finalDmg = damage
-- If one or more hits land, Atonement always counts as landing both hits.
@ -354,7 +352,7 @@ m:addOverride('xi.actions.weaponskills.death_blossom.onUseWeaponSkill', function
local damage, criticalHit, tpHits, extraHits = xi.weaponskills.doPhysicalWeaponskill(player, target, wsID, params, tp, action, primary, taChar)
-- Handle status effect
if math.random(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
if math.randomInt(1, 100) <= xi.weaponskills.fTP(tp, { 50, 75, 100 }) then
local effectId = xi.effect.MAGIC_EVASION_DOWN
local actionElement = xi.element.THUNDER
local power = 10

View file

@ -0,0 +1,24 @@
-----------------------------------
-- Pre-SoA Magic Burst Module
-- Restores the pre-2015 magic burst multiplier: 1.25 + 0.05 per skillchain step.
-- https://forum.square-enix.com/ffxi/threads/46531
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_magic_burst'
if xi.module.isContentEnabled('SOA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
m:addOverride('xi.spells.damage.calculateIfMagicBurst', function(caster, target, spellElement, magicBurstTier)
if spellElement <= xi.element.NONE then
return 1
end
return 1.25 + 0.05 * utils.clamp(magicBurstTier, 1, 5)
end)
return m

View file

@ -0,0 +1,132 @@
-----------------------------------
-- Era Skillchain Module
-- Adds a resistance check back to skillchain damage calculations.
-- https://wiki.ffo.jp/html/32936.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_skillchain'
if xi.module.isContentEnabled('SOA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
local chainMultipliers =
{
[1] = { 0.50, 0.60, 0.70, 0.80, 0.90, 1.00 }, -- Level 1
[2] = { 0.60, 0.75, 1.00, 1.25, 1.50, 1.75 }, -- Level 2
[3] = { 1.00, 1.50, 1.75, 2.00, 2.25, 2.50 }, -- Level 3
[4] = { 1.50, 1.80, 2.10, 2.40, 2.70, 3.00 }, -- Level 4 "Radiance/Umbra"
}
local function getSkillchainElementToUse(target, skillchainType)
-- Build skillchain available elements table.
local elementTable = {}
for i = xi.element.FIRE, xi.element.DARK do
if xi.data.element.skillchainElementTable[i][skillchainType] > 0 then
table.insert(elementTable, #elementTable + 1, i)
end
end
-- Early return: Single elemental SC. No need to continue.
if #elementTable == 1 then
return elementTable[1]
end
-- Get lowest resistance rank value.
local lowestResRank = 11
local lowestElement = xi.element.FIRE
for j = #elementTable, 1, -1 do
local resRankValue = target:getMod(xi.data.element.getElementalResistanceRankModifier(elementTable[j]))
if resRankValue <= lowestResRank then
lowestResRank = resRankValue
lowestElement = elementTable[j]
end
end
return lowestElement
end
m:addOverride('xi.combat.skillchain.calculateSkillchainDamage', function(actor, target, baseDamage)
local skillchainEffect = target:getStatusEffect(xi.effect.SKILLCHAIN)
if not skillchainEffect then
return 0
end
local skillchainType = skillchainEffect:getPower()
if skillchainType == 0 then
return 0
end
local skillchainLevel = skillchainEffect:getTier()
if skillchainLevel < 1 or skillchainLevel > 4 then
return 0
end
local skillchainCount = skillchainEffect:getSubPower()
if skillchainCount < 1 or skillchainCount > 6 then
return 0
end
local skillchainElement = getSkillchainElementToUse(target, skillchainType)
if not skillchainElement then
return 0
end
if xi.spells.damage.calculateNullification(target, skillchainElement, false, true, false, false) == 0 then
return 0
end
-- Calculate resist, base damage and multipliers.
local finalDamage = math.abs(baseDamage) -- Damage from skillchain, no matter if absorbed or not.
local levelMultiplier = chainMultipliers[skillchainLevel][skillchainCount]
local bonusMultiplier = 1 + actor:getMod(xi.mod.SKILLCHAINBONUS) / 100
local damageMultiplier = 1 + actor:getMod(xi.mod.SKILLCHAINDMG) / 10000
local dayWeatherMultiplier = xi.spells.damage.calculateDayAndWeather(actor, skillchainElement, false)
local staffMultiplier = xi.spells.damage.calculateElementalStaffBonus(actor, skillchainElement)
local affinityMultiplier = xi.spells.damage.calculateElementalAffinityBonus(actor, skillchainElement)
local resistRate = xi.combat.magicHitRate.calculateResistRate(actor, target, 0, 0, xi.skillRank.A_PLUS, skillchainElement, 0, 0, 0)
local magicTakenMultiplier = xi.combat.damage.calculateDamageAdjustment(target, false, true, false, false)
-- Unconfirmed order.
local inninMultiplier = 1 + actor:getMerit(xi.merit.INNIN_EFFECT) / 100
local sengikoriMultiplier = 1 + target:getMod(xi.mod.SENGIKORI_SC_DMG_DEBUFF) / 100
local absorptionMultiplier = xi.spells.damage.calculateAbsorption(target, skillchainElement, false, true, false, false)
-- Apply multipliers in order and floor after each step.
finalDamage = math.floor(finalDamage * levelMultiplier)
finalDamage = math.floor(finalDamage * bonusMultiplier) + actor:getMod(xi.mod.MAGIC_DAMAGE)
finalDamage = math.floor(finalDamage * damageMultiplier)
finalDamage = math.floor(finalDamage * dayWeatherMultiplier)
finalDamage = math.floor(finalDamage * staffMultiplier)
finalDamage = math.floor(finalDamage * affinityMultiplier)
finalDamage = math.floor(finalDamage * resistRate)
finalDamage = math.floor(finalDamage * magicTakenMultiplier)
finalDamage = math.floor(finalDamage * inninMultiplier)
finalDamage = math.floor(finalDamage * sengikoriMultiplier)
finalDamage = math.floor(finalDamage * absorptionMultiplier)
-- Handle (reset) Sengikori.
target:setMod(xi.mod.SENGIKORI_SC_DMG_DEBUFF, 0)
-- Handle other damage alterations.
if finalDamage > 0 then
finalDamage = utils.clamp(utils.handlePhalanx(target, finalDamage), 0, 99999)
finalDamage = utils.clamp(utils.handleOneForAll(target, finalDamage), 0, 99999)
finalDamage = utils.clamp(utils.handleStoneskin(target, finalDamage), 0, 99999)
finalDamage = target:checkDamageCap(finalDamage)
target:takeDamage(finalDamage, actor, xi.attackType.SPECIAL, xi.damageType.ELEMENTAL + skillchainElement)
-- Handle absorbption.
else
target:addHP(-finalDamage)
end
return finalDamage
end)
return m

View file

@ -0,0 +1,25 @@
-----------------------------------
-- Era Signet Duration Module - Reduces duration of Signet effects by 3 hours.
-- Changed May 10th, 2011 : https://wiki.ffo.jp/html/564.html
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_signet_duration'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
m:addOverride('xi.conquest.bestowSignet', function(player, pNation, pRank, mOffset)
super(player, pNation, pRank, mOffset)
local signet = player:getStatusEffect(xi.effect.SIGNET)
if signet then
signet:setDuration(signet:getDuration() - 3 * 3600 * 1000)
end
end)
return m

View file

@ -0,0 +1,26 @@
-----------------------------------
-- Module: Elemental Spirit Perpetuation Cost (level restriction)
-- Reverts perpetuation cost which is recalculated on level restriction if a summoned elemental spirit is present.
-- Source: https://forum.square-enix.com/ffxi/threads/22099-March-27-2012-%28JST%29-Version-Update
-----------------------------------
require('modules/module_utils')
-----------------------------------
local moduleName = 'era_effect_level_restriction'
if xi.module.isContentEnabled('ABYSSEA') then
return { name = moduleName }
end
local m = Module:new(moduleName)
m:addOverride('xi.effects.level_restriction.onEffectGain', function(target, effect)
super(target, effect)
xi.job_utils.summoner.applySpiritPerpetuationCost(target)
end)
m:addOverride('xi.effects.level_restriction.onEffectLose', function(target, effect)
super(target, effect)
xi.job_utils.summoner.applySpiritPerpetuationCost(target)
end)
return m

View file

@ -0,0 +1,108 @@
-----------------------------------
-- Automaton Utility Module
-----------------------------------
-- https://wiki.ffo.jp/html/19739.html
-- https://wiki.ffo.jp/html/32936.html
-----------------------------------
require('modules/module_utils')
require('scripts/globals/automaton')
require('scripts/globals/pets/automaton')
-----------------------------------
local moduleName = 'automaton_global'
if not xi.module.isContentEnabled('WOTG') then
return { name = moduleName }
end
local m = Module:new(moduleName)
local maneuverList =
{
[xi.jobAbility.FIRE_MANEUVER ] = { effect = xi.effect.FIRE_MANEUVER, element = xi.element.FIRE, stat = xi.mod.STR },
[xi.jobAbility.ICE_MANEUVER ] = { effect = xi.effect.ICE_MANEUVER, element = xi.element.ICE, stat = xi.mod.INT },
[xi.jobAbility.WIND_MANEUVER ] = { effect = xi.effect.WIND_MANEUVER, element = xi.element.WIND, stat = xi.mod.AGI },
[xi.jobAbility.EARTH_MANEUVER ] = { effect = xi.effect.EARTH_MANEUVER, element = xi.element.EARTH, stat = xi.mod.VIT },
[xi.jobAbility.THUNDER_MANEUVER] = { effect = xi.effect.THUNDER_MANEUVER, element = xi.element.THUNDER, stat = xi.mod.DEX },
[xi.jobAbility.WATER_MANEUVER ] = { effect = xi.effect.WATER_MANEUVER, element = xi.element.WATER, stat = xi.mod.MND },
[xi.jobAbility.LIGHT_MANEUVER ] = { effect = xi.effect.LIGHT_MANEUVER, element = xi.element.LIGHT, stat = xi.mod.CHR },
[xi.jobAbility.DARK_MANEUVER ] = { effect = xi.effect.DARK_MANEUVER, element = xi.element.DARK, stat = nil },
}
local function getAddBurdenValue(player, maneuverElement, maneuverStat)
-- Dark Maneuvers
if maneuverElement == xi.element.DARK then
local frameEquipped = player:getAutomatonFrame()
if
frameEquipped == xi.automaton.frame.VALOREDGE or
frameEquipped == xi.automaton.frame.SHARPSHOT
then
return 8
end
return 14
else
-- Fire, Ice, Wind, Earth, Lightning, Water, Light Maneuvers
local statDifference = player:getStat(maneuverStat) - player:getPet():getStat(maneuverStat)
if statDifference >= 4 then
return 14
elseif statDifference >= 0 then
return 19 - statDifference
else
return 20
end
end
end
-- Remove Overdrive returning 3 maneuvers while active.
m:addOverride('xi.automaton.getManeuverCount', function(master, maneuvers)
if not master then
return 0
end
return math.min(maneuvers, 3)
end)
-- Remove level scaling maneuver stat bonus.
m:addOverride('xi.automaton.onUseManeuver', function(player, target, ability, action)
local pet = player:getPet()
if not pet then
return
end
local maneuverInfo = maneuverList[ability:getID()]
local element = maneuverInfo.element - 1
local burdenValue = getAddBurdenValue(player, maneuverInfo.element, maneuverInfo.stat)
local overload = target:addBurden(element, burdenValue)
if
overload ~= 0 and
(player:getMod(xi.mod.PREVENT_OVERLOAD) > 0 or pet:getMod(xi.mod.PREVENT_OVERLOAD) > 0) and
player:delStatusEffectSilent(xi.effect.WATER_MANEUVER)
then
overload = 0
end
action:messageID(player:getID(), xi.msg.basic.AUTO_OVERLOAD_CHANCE)
if overload ~= 0 then
target:removeAllManeuvers()
target:addStatusEffect(xi.effect.OVERLOAD, { duration = overload, origin = player })
pet:addStatusEffect(xi.effect.OVERLOAD, { duration = overload, origin = pet })
action:messageID(player:getID(), xi.msg.basic.AUTO_OVERLOADED)
else
if target:getActiveManeuverCount() == 3 then
target:removeOldestManeuver()
end
local maneuverBonus = 1 + target:getMod(xi.mod.MANEUVER_BONUS)
target:addStatusEffect(maneuverInfo.effect, { power = maneuverBonus, duration = utils.clamp(pet:getLocalVar('MANEUVER_DURATION'), 60, 300), origin = player })
end
return target:getOverloadChance(element)
end)
return m

Some files were not shown because too many files have changed in this diff Show more