Skip to content
This repository was archived by the owner on May 24, 2026. It is now read-only.
Merged

735 #219

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cactbot-build",
"version": "99.168.0",
"version": "99.170.0",
"license": "Apache-2.0",
"type": "module",
"types": "./types",
Expand Down
21 changes: 11 additions & 10 deletions plugin/CactbotEventSource/FFXIVProcessKo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace Cactbot {
public class FFXIVProcessKo : FFXIVProcess {
// Last updated for FFXIV 7.2
// Last updated for FFXIV 7.3
// Per aers/FFXIVClientStructs, what we call EntityMemory is actually:
// Client::Game::Character::Character (0x22E0)
// Client::Game::Object::GameObject (0x190)
Expand All @@ -25,28 +25,28 @@ public unsafe struct EntityMemory {
[FieldOffset(0x30)]
public fixed byte Name[nameBytes];

[FieldOffset(0x74)]
[FieldOffset(0x78)]
public uint id;

[FieldOffset(0x8C)]
[FieldOffset(0x90)]
public EntityType type;

[FieldOffset(0x92)]
[FieldOffset(0x96)]
public ushort distance;

[FieldOffset(0xA0)]
[FieldOffset(0xB0)]
public Single pos_x;

[FieldOffset(0xA4)]
[FieldOffset(0xB4)]
public Single pos_z;

[FieldOffset(0xA8)]
[FieldOffset(0xB8)]
public Single pos_y;

[FieldOffset(0xB0)]
[FieldOffset(0xC0)]
public Single rotation;

[FieldOffset(0x190)]
[FieldOffset(0x1A0)]
public CharacterDetails charDetails;
}

Expand Down Expand Up @@ -106,7 +106,8 @@ public FFXIVProcessKo(ILogger logger) : base(logger) { }
// In combat boolean.
// This address is written to by "mov [rax+rcx],bl" and has three readers.
// This reader is "cmp byte ptr [ffxiv_dx11.exe+????????],00 { (0),0 }"
private static String kInCombatSignature = "803D??????????74??488B03488BCBFF50";
// Updated in 7.3, signature was no longer unique, include the preceeding "jz LAB_?????????"
private static String kInCombatSignature = "74??803D??????????74??488B03488BCBFF50";

Copilot AI Nov 14, 2025

Copy link

Choose a reason for hiding this comment

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

Field 'kInCombatSignature' can be 'readonly'.

Suggested change
private static String kInCombatSignature = "74??803D??????????74??488B03488BCBFF50";
private static readonly String kInCombatSignature = "74??803D??????????74??488B03488BCBFF50";

Copilot uses AI. Check for mistakes.
private static int kInCombatSignatureOffset = -15;

Copilot AI Nov 14, 2025

Copy link

Choose a reason for hiding this comment

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

Field 'kInCombatSignatureOffset' can be 'readonly'.

Suggested change
private static int kInCombatSignatureOffset = -15;
private static readonly int kInCombatSignatureOffset = -15;

Copilot uses AI. Check for mistakes.
private static bool kInCombatSignatureRIP = true;

Copilot AI Nov 14, 2025

Copy link

Choose a reason for hiding this comment

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

Field 'kInCombatSignatureRIP' can be 'readonly'.

Suggested change
private static bool kInCombatSignatureRIP = true;
private static readonly bool kInCombatSignatureRIP = true;

Copilot uses AI. Check for mistakes.
// Because this line is a cmp byte line, the signature is not at the end of the line.
Expand Down
4 changes: 2 additions & 2 deletions plugin/CactbotEventSource/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@
// - Revision
// GitHub has only 3 version components, so Revision should always be 0.
// CactbotOverlay and CactbotEventSource version should match.
[assembly: AssemblyVersion("99.168.0.0")]
[assembly: AssemblyFileVersion("99.168.0.0")]
[assembly: AssemblyVersion("99.170.0.0")]
[assembly: AssemblyFileVersion("99.170.0.0")]
4 changes: 2 additions & 2 deletions plugin/CactbotOverlay/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
// - Build Number
// - Revision
// GitHub has only 3 version components, so Revision should always be 0.
[assembly: AssemblyVersion("99.168.0.0")]
[assembly: AssemblyFileVersion("99.168.0.0")]
[assembly: AssemblyVersion("99.170.0.0")]
[assembly: AssemblyFileVersion("99.170.0.0")]
6 changes: 6 additions & 0 deletions resources/netlog_defs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1413,9 +1413,15 @@ const latestLogDefinitions = {
blankFields: [6, 7, 8],
playerIds: {
2: null,
10: null,
},
canAnonymize: true,
firstOptionalField: undefined,
analysisOptions: {
include: 'filter',
filters: { sourceId: '4.{7}' }, // NPC casts only
combatantIdFields: [2, 10],
},
},
ContentFinderSettings: {
type: '265',
Expand Down
22 changes: 22 additions & 0 deletions resources/zone_info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10674,6 +10674,7 @@ const data: ZoneInfoType = {
'en': 'Vault Oneiron',
'fr': 'Le coffre d\'Oneiron',
'ja': '宝物庫 ボルト・オネイロン',
'ko': '보물고 볼트 오네이론',
},
'offsetX': -100,
'offsetY': -100,
Expand All @@ -10684,6 +10685,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第1~10朝圣路',
'de': 'Pilgers Pfad (Ebenen 1-10)',
'en': 'Pilgrim\'s Traverse (Stones 1-10)',
'fr': 'Le Sanctuaire des pèlerins (zones 1-10)',
Expand All @@ -10698,6 +10700,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第11~20朝圣路',
'de': 'Pilgers Pfad (Ebenen 11-20)',
'en': 'Pilgrim\'s Traverse (Stones 11-20)',
'fr': 'Le Sanctuaire des pèlerins (zones 11-20)',
Expand All @@ -10712,6 +10715,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第21~30朝圣路',
'de': 'Pilgers Pfad (Ebenen 21-30)',
'en': 'Pilgrim\'s Traverse (Stones 21-30)',
'fr': 'Le Sanctuaire des pèlerins (zones 21-30)',
Expand All @@ -10726,6 +10730,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第31~40朝圣路',
'de': 'Pilgers Pfad (Ebenen 31-40)',
'en': 'Pilgrim\'s Traverse (Stones 31-40)',
'fr': 'Le Sanctuaire des pèlerins (zones 31-40)',
Expand All @@ -10740,6 +10745,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第41~50朝圣路',
'de': 'Pilgers Pfad (Ebenen 41-50)',
'en': 'Pilgrim\'s Traverse (Stones 41-50)',
'fr': 'Le Sanctuaire des pèlerins (zones 41-50)',
Expand All @@ -10754,6 +10760,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第51~60朝圣路',
'de': 'Pilgers Pfad (Ebenen 51-60)',
'en': 'Pilgrim\'s Traverse (Stones 51-60)',
'fr': 'Le Sanctuaire des pèlerins (zones 51-60)',
Expand All @@ -10768,6 +10775,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第61~70朝圣路',
'de': 'Pilgers Pfad (Ebenen 61-70)',
'en': 'Pilgrim\'s Traverse (Stones 61-70)',
'fr': 'Le Sanctuaire des pèlerins (zones 61-70)',
Expand All @@ -10782,6 +10790,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第71~80朝圣路',
'de': 'Pilgers Pfad (Ebenen 71-80)',
'en': 'Pilgrim\'s Traverse (Stones 71-80)',
'fr': 'Le Sanctuaire des pèlerins (zones 71-80)',
Expand All @@ -10796,6 +10805,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第81~90朝圣路',
'de': 'Pilgers Pfad (Ebenen 81-90)',
'en': 'Pilgrim\'s Traverse (Stones 81-90)',
'fr': 'Le Sanctuaire des pèlerins (zones 81-90)',
Expand All @@ -10810,6 +10820,7 @@ const data: ZoneInfoType = {
'contentType': 21,
'exVersion': 5,
'name': {
'cn': '朝圣交错路 第91~100朝圣路',
'de': 'Pilgers Pfad (Ebenen 91-100)',
'en': 'Pilgrim\'s Traverse (Stones 91-100)',
'fr': 'Le Sanctuaire des pèlerins (zones 91-100)',
Expand All @@ -10829,6 +10840,7 @@ const data: ZoneInfoType = {
'en': 'The Meso Terminal',
'fr': 'Le Mésoterminal',
'ja': '永久幽界 メインターミナル',
'ko': '메인 터미널',
},
'offsetX': -132,
'offsetY': -113,
Expand All @@ -10844,6 +10856,7 @@ const data: ZoneInfoType = {
'en': 'The Bayside Battleground',
'fr': 'Le Rivage redoutable',
'ja': 'ベイサイド・バトルグラウンド',
'ko': '바닷가 전투장',
},
'offsetX': -100,
'offsetY': -100,
Expand All @@ -10859,6 +10872,7 @@ const data: ZoneInfoType = {
'en': 'Crystalline Conflict (Custom Match - The Bayside Battleground)',
'fr': 'Crys. Conflict (partie perso. - Le Rivage redoutable)',
'ja': 'クリスタルコンフリクト(ベイサイド・バトルグラウンド:カスタムマッチ)',
'ko': '크리스탈라인 컨플릭트(바닷가 전투장: 친선 경기)',
},
'offsetX': -100,
'offsetY': -100,
Expand All @@ -10874,6 +10888,7 @@ const data: ZoneInfoType = {
'en': 'The Ageless Necropolis',
'fr': 'La Nécropole intemporelle',
'ja': '永遠の闇討滅戦',
'ko': '영원한 어둠 토벌전',
},
'offsetX': -100,
'offsetY': -100,
Expand All @@ -10889,6 +10904,7 @@ const data: ZoneInfoType = {
'en': 'The Minstrel\'s Ballad: Necron\'s Embrace',
'fr': 'La Nécropole intemporelle (extrême)',
'ja': '極永遠の闇討滅戦',
'ko': '극 영원한 어둠 토벌전',
},
'offsetX': -100,
'offsetY': -100,
Expand All @@ -10899,6 +10915,7 @@ const data: ZoneInfoType = {
'contentType': 4,
'exVersion': 5,
'name': {
'cn': '护锁刃龙狩猎战',
'de': 'Jagd auf Wächter-Arkveld',
'en': 'The Windward Wilds',
'fr': 'Chasse à l\'Arkveld Gardien',
Expand All @@ -10918,6 +10935,7 @@ const data: ZoneInfoType = {
'en': 'The Wreath of Snakes (Unreal)',
'fr': 'L\'Îlot des Amertumes (irréel)',
'ja': '幻青龍征魂戦',
'ko': '환 청룡 토벌전',
},
'offsetX': -100,
'offsetY': -100,
Expand Down Expand Up @@ -10949,6 +10967,7 @@ const data: ZoneInfoType = {
'en': 'San d\'Oria: The Second Walk',
'fr': 'San d\'Oria - La deuxième perambulation',
'ja': 'サンドリア:ザ・セカンドウォーク',
'ko': '산도리아: 두 번째 반향세계',
},
'offsetX': -826,
'offsetY': -871,
Expand All @@ -10959,6 +10978,7 @@ const data: ZoneInfoType = {
'contentType': 4,
'exVersion': 5,
'name': {
'cn': '护锁刃龙上位狩猎战',
'de': 'Jagd auf Wächter-Arkveld (schwer)',
'en': 'The Windward Wilds (Extreme)',
'fr': 'Chasse à l\'Arkveld Gardien (extrême)',
Expand All @@ -10973,6 +10993,7 @@ const data: ZoneInfoType = {
'contentType': 39,
'exVersion': 5,
'name': {
'cn': '卓异的悲寂深想战',
'de': 'Eminente Trauer (variabel)',
'en': 'The Final Verse (Quantum)',
'fr': 'Le Verset final (quantique)',
Expand All @@ -10987,6 +11008,7 @@ const data: ZoneInfoType = {
'contentType': 39,
'exVersion': 5,
'name': {
'cn': '卓异的悲寂歼灭战',
'de': 'Eminente Trauer',
'en': 'The Final Verse',
'fr': 'Le Verset final',
Expand Down
1 change: 1 addition & 0 deletions ui/raidboss/data/02-arr/dungeon/cutters_cry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const triggerSet: TriggerSet<Data> = {
zoneId: ZoneId.CuttersCry,
comments: {
en: 'pre-7.3 rework',
de: 'Vor der 7.3 Überarbeitung',
fr: 'Avant le remaniement 7.3',
cn: '7.3改版前',
ko: '7.3 개편 전',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ const triggerSet: TriggerSet<Data> = {
// TODO: some Mimics may spawn after transference between floors and get called early before being found
type: 'AddedCombatant',
netRegex: { npcNameId: '2566', capture: false },
suppressSeconds: 1,
infoText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ const triggerSet: TriggerSet<Data> = {
// TODO: some Quivering Coffers may spawn after transference between floors and get called early before being found
type: 'AddedCombatant',
netRegex: { npcNameId: '739[2-4]', capture: false },
suppressSeconds: 1,
infoText: (_data, _matches, output) => output.text!(),
outputStrings: {
text: {
Expand Down
12 changes: 9 additions & 3 deletions ui/raidboss/data/04-sb/trial/seiryu-ex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ const triggerSet: TriggerSet<Data> = {
outputStrings: {
grabTether: {
en: 'Grab Tank Tether, Point Cleave Away',
de: 'Nimm Tank-Verbindung, zeige den Cleave weg',
fr: 'Prenez le lien Tank, visez l\'extérieur',
cn: '接走坦克连线,引导扇形远离人群',
ko: '줄 채고, 바깥으로 유도',
Expand Down Expand Up @@ -240,24 +241,28 @@ const triggerSet: TriggerSet<Data> = {
dirW: Outputs.west,
goToSnakes: {
en: 'Go ${dir} Toward Snakes',
de: 'Geh Richtung ${dir} zu den Schlangen',
fr: 'Allez ${dir} vers les serpents',
cn: '向 ${dir} 蛇走',
ko: '뱀 ${dir}으로 가요',
},
goToUnknownSnakes: {
en: 'Go Toward Snakes',
de: 'Geh zu den Schlangen',
fr: 'Allez vers les serpents',
cn: '向蛇走',
ko: '뱀 쪽으로 가요',
},
outOfMiddleTowardSnakes: {
en: 'Out Of Middle, Knockback To ${dir}',
de: 'Raus aus der Mitte, Rückstoß nach ${dir}',
fr: 'Loin du centre, Poussée vers ${dir}',
cn: '离开中间,击退到 ${dir}',
ko: '가운데는 위험! ${dir}으로 넉백',
},
outOfMiddleUnknownSnakes: {
en: 'Out Of Middle, Knockback Toward Snakes',
de: 'Raus aus der Mitte, Rückstoß zu den Schlangen',
fr: 'Loin du centre, Poussée vers les serpents',
cn: '离开中间,向蛇击退',
ko: '가운데는 위험! 뱀 쪽으로 넉백',
Expand Down Expand Up @@ -355,18 +360,19 @@ const triggerSet: TriggerSet<Data> = {
timelineReplace: [
{
'locale': 'de',
'missingTranslations': true,
'replaceSync': {
'Aka-no-shiki': 'Aka no Shiki',
'Ao-no-shiki': 'Ao no Shiki',
'Blue Orochi': 'blau[a] Orochi',
'Blue Orochi': 'blau(?:e|er|es|en) Orochi',
'Iwa-no-shiki': 'Iwa no Shiki',
'Numa-no-shiki': 'Numa no Shiki',
'Seiryu': 'Seiryu',
'Ten-no-shiki': 'Ten no Shiki',
'Yama-no-shiki': 'Yama no Shiki',
},
'replaceText': {
'--large add spawns--': '--großes Add erscheint--',
'--small adds spawn--': '--kleine Adds erscheinen--',
'100-tonze Swing': '100-Tonzen-Schwung',
'Blazing Aramitama': 'Flammende Aramitama',
'Blue Bolt': 'Blauer Blitz',
Expand All @@ -387,7 +393,7 @@ const triggerSet: TriggerSet<Data> = {
'Serpent Descending': 'Niedergang der Schlange',
'Serpent\'s Fang': 'Schlangengiftzahn',
'Strength of Spirit': 'Stärke des Geistes',
'Summon Shiki': 'Shiki-Beschwörung ',
'Summon Shiki': 'Shiki-Beschwörung',
'Yama-kagura': 'Yamakagura',
},
},
Expand Down
2 changes: 2 additions & 0 deletions ui/raidboss/data/05-shb/etc/the_diadem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ const triggerSet: TriggerSet<Data> = {
zoneId: ZoneId.TheDiadem,
comments: {
en: 'Timed node spawn alert',
de: 'Zeitliche Sammelstellen Erscheinungsalarm',
fr: 'Alerte de génération de nœud programmée',
cn: '限时采集点生成警报',
ko: '시간제 노드 출현 알림',
},
Expand Down
Loading
Loading