diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5f9e939d..c44f60fc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,19 +18,14 @@ jobs: - name: Set Release Notes for Github id: set-release-notes-github run: | + echo "- General:" >> release_notes.txt + echo " - 3rd Party Reactions: Added a 3rd party reaction dialog helper. This allows processing simpler 3rd party reactions that require a yes/no decision dialog that goes to the user which can then be followed with your automation code based on decision. Added (adding?) a post in helpful-helpers that should give some pointers" >> release_notes.txt + echo " - Settings: Cleaned up descriptions a little bit. Probably doesn't matter much but it was annoying me ¯\_(ツ)_/¯" >> release_notes.txt echo "- Additions:" >> release_notes.txt - echo " - Power Word Rebound: Automates Deep Magic Vol 2s Power Word Rebound." >> release_notes.txt - echo " - Tentacle Slam: Automates the Otyugh and Neo-Otyugh monster feature Tentacle Slam." >> release_notes.txt - echo " - Tentacle: Automates the Otyugh, Neo-Otyugh, and Feyr monster feature Tentacle." >> release_notes.txt - echo " - Otherworldly Melody: Automates the Whistler monster feature Otherworldly Melody." >> release_notes.txt - echo " - Surreal Step: Automates the Whistler monster feature Surreal Step." >> release_notes.txt - echo " - Nightmare Fuel: Automates the Feyr monster feature Nightmare Fuel." >> release_notes.txt + echo " - Cloud Rune: Automates the Echo Knights Cloud Rune feature." >> release_notes.txt + echo " - Rebuke the Damned: Automates the homebrew Channel Divinity Rebuke the Damned feature." >> release_notes.txt echo "- Updates:" >> release_notes.txt - echo " - Circle of Power: Updated with correct duration and simplified implementation." >> release_notes.txt - echo " - Opportunity Attack: Some small additional code cleanup for flags that are no longer necessary under the new implementation." >> release_notes.txt - echo "- Bugfixes:" >> release_notes.txt - echo " - Opportunity Attack: Fixed Polearm Master not calling the new module function correctly." >> release_notes.txt - echo " - Armor of Hexes: Fix origin not being checked correctly." >> release_notes.txt + echo " - Opportunity Attack: Fixed the mirror 3rd party dialog implementation to show the correct GM title when enabled." >> release_notes.txt echo "release-notes-github<> $GITHUB_ENV cat release_notes.txt >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV diff --git a/module.json b/module.json index f5c9e3d4..46639cd8 100644 --- a/module.json +++ b/module.json @@ -7,7 +7,7 @@ "name": "Gambit" } ], - "version": "0.1.59", + "version": "0.1.60", "compatibility": { "minimum": "11", "verified": "11", diff --git a/packs/gps-3rd-party-features/000599.log b/packs/gps-3rd-party-features/000619.log similarity index 100% rename from packs/gps-3rd-party-features/000599.log rename to packs/gps-3rd-party-features/000619.log diff --git a/packs/gps-3rd-party-features/CURRENT b/packs/gps-3rd-party-features/CURRENT index f61c7755..7b1d7680 100644 --- a/packs/gps-3rd-party-features/CURRENT +++ b/packs/gps-3rd-party-features/CURRENT @@ -1 +1 @@ -MANIFEST-000597 +MANIFEST-000617 diff --git a/packs/gps-3rd-party-features/LOG b/packs/gps-3rd-party-features/LOG index 7eae2ba7..fc40eb07 100644 --- a/packs/gps-3rd-party-features/LOG +++ b/packs/gps-3rd-party-features/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.557 2710 Recovering log #596 -2024/06/06-00:06:28.563 2710 Delete type=0 #596 -2024/06/06-00:06:28.563 2710 Delete type=3 #595 -2024/06/06-01:03:59.750 3d70 Level-0 table #600: started -2024/06/06-01:03:59.750 3d70 Level-0 table #600: 0 bytes OK -2024/06/06-01:03:59.753 3d70 Delete type=0 #598 -2024/06/06-01:03:59.758 3d70 Manual compaction at level-0 from '!folders!4Ecsdk7k1FvMs9OF' @ 72057594037927935 : 1 .. '!items.effects!G2IDv711EWrOF7ef.kE7T0D7E6CnMvjvr' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.759 3d70 Manual compaction at level-1 from '!folders!4Ecsdk7k1FvMs9OF' @ 72057594037927935 : 1 .. '!items.effects!G2IDv711EWrOF7ef.kE7T0D7E6CnMvjvr' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.252 638 Recovering log #615 +2024/06/07-00:03:25.264 638 Delete type=0 #615 +2024/06/07-00:03:25.264 638 Delete type=3 #613 +2024/06/07-00:10:24.729 3d70 Level-0 table #620: started +2024/06/07-00:10:24.729 3d70 Level-0 table #620: 0 bytes OK +2024/06/07-00:10:24.733 3d70 Delete type=0 #618 +2024/06/07-00:10:24.736 3d70 Manual compaction at level-0 from '!folders!4Ecsdk7k1FvMs9OF' @ 72057594037927935 : 1 .. '!items.effects!G2IDv711EWrOF7ef.kE7T0D7E6CnMvjvr' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.736 3d70 Manual compaction at level-1 from '!folders!4Ecsdk7k1FvMs9OF' @ 72057594037927935 : 1 .. '!items.effects!G2IDv711EWrOF7ef.kE7T0D7E6CnMvjvr' @ 0 : 0; will stop at (end) diff --git a/packs/gps-3rd-party-features/LOG.old b/packs/gps-3rd-party-features/LOG.old index 8b2bb9cc..e37fb1f3 100644 --- a/packs/gps-3rd-party-features/LOG.old +++ b/packs/gps-3rd-party-features/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.913 5988 Recovering log #594 -2024/06/04-19:16:38.919 5988 Delete type=0 #594 -2024/06/04-19:16:38.919 5988 Delete type=3 #593 +2024/06/06-20:22:08.773 23fc Recovering log #611 +2024/06/06-20:22:08.780 23fc Delete type=0 #611 +2024/06/06-20:22:08.781 23fc Delete type=3 #609 +2024/06/07-00:01:44.495 3d70 Level-0 table #616: started +2024/06/07-00:01:44.495 3d70 Level-0 table #616: 0 bytes OK +2024/06/07-00:01:44.501 3d70 Delete type=0 #614 +2024/06/07-00:01:44.506 3d70 Manual compaction at level-0 from '!folders!4Ecsdk7k1FvMs9OF' @ 72057594037927935 : 1 .. '!items.effects!G2IDv711EWrOF7ef.kE7T0D7E6CnMvjvr' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.510 3d70 Manual compaction at level-1 from '!folders!4Ecsdk7k1FvMs9OF' @ 72057594037927935 : 1 .. '!items.effects!G2IDv711EWrOF7ef.kE7T0D7E6CnMvjvr' @ 0 : 0; will stop at (end) diff --git a/packs/gps-3rd-party-features/MANIFEST-000597 b/packs/gps-3rd-party-features/MANIFEST-000617 similarity index 56% rename from packs/gps-3rd-party-features/MANIFEST-000597 rename to packs/gps-3rd-party-features/MANIFEST-000617 index 84f34b6a..e6bdf7e2 100644 Binary files a/packs/gps-3rd-party-features/MANIFEST-000597 and b/packs/gps-3rd-party-features/MANIFEST-000617 differ diff --git a/packs/gps-3rd-party-items/000596.log b/packs/gps-3rd-party-items/000616.log similarity index 100% rename from packs/gps-3rd-party-items/000596.log rename to packs/gps-3rd-party-items/000616.log diff --git a/packs/gps-3rd-party-items/CURRENT b/packs/gps-3rd-party-items/CURRENT index 2eef8aa5..1b7986b1 100644 --- a/packs/gps-3rd-party-items/CURRENT +++ b/packs/gps-3rd-party-items/CURRENT @@ -1 +1 @@ -MANIFEST-000594 +MANIFEST-000614 diff --git a/packs/gps-3rd-party-items/LOG b/packs/gps-3rd-party-items/LOG index 4dae5721..5bceee1c 100644 --- a/packs/gps-3rd-party-items/LOG +++ b/packs/gps-3rd-party-items/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.572 638 Recovering log #593 -2024/06/06-00:06:28.578 638 Delete type=0 #593 -2024/06/06-00:06:28.579 638 Delete type=3 #592 -2024/06/06-01:03:59.760 3d70 Level-0 table #597: started -2024/06/06-01:03:59.760 3d70 Level-0 table #597: 0 bytes OK -2024/06/06-01:03:59.765 3d70 Delete type=0 #595 -2024/06/06-01:03:59.772 3d70 Manual compaction at level-0 from '!items!A4JIbc14vM5IKbuT' @ 72057594037927935 : 1 .. '!items.effects!qHY9RXV48OmvCrw1.UNiU6zoPTpbrxoIA' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.782 3d70 Manual compaction at level-1 from '!items!A4JIbc14vM5IKbuT' @ 72057594037927935 : 1 .. '!items.effects!qHY9RXV48OmvCrw1.UNiU6zoPTpbrxoIA' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.283 2710 Recovering log #612 +2024/06/07-00:03:25.294 2710 Delete type=0 #612 +2024/06/07-00:03:25.294 2710 Delete type=3 #610 +2024/06/07-00:10:24.733 3d70 Level-0 table #617: started +2024/06/07-00:10:24.733 3d70 Level-0 table #617: 0 bytes OK +2024/06/07-00:10:24.736 3d70 Delete type=0 #615 +2024/06/07-00:10:24.736 3d70 Manual compaction at level-0 from '!items!A4JIbc14vM5IKbuT' @ 72057594037927935 : 1 .. '!items.effects!qHY9RXV48OmvCrw1.UNiU6zoPTpbrxoIA' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.736 3d70 Manual compaction at level-1 from '!items!A4JIbc14vM5IKbuT' @ 72057594037927935 : 1 .. '!items.effects!qHY9RXV48OmvCrw1.UNiU6zoPTpbrxoIA' @ 0 : 0; will stop at (end) diff --git a/packs/gps-3rd-party-items/LOG.old b/packs/gps-3rd-party-items/LOG.old index 9074f1b4..0e4d0f70 100644 --- a/packs/gps-3rd-party-items/LOG.old +++ b/packs/gps-3rd-party-items/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.928 63ac Recovering log #591 -2024/06/04-19:16:38.933 63ac Delete type=0 #591 -2024/06/04-19:16:38.933 63ac Delete type=3 #590 +2024/06/06-20:22:08.783 20e4 Recovering log #608 +2024/06/06-20:22:08.790 20e4 Delete type=0 #608 +2024/06/06-20:22:08.790 20e4 Delete type=3 #606 +2024/06/07-00:01:44.506 3d70 Level-0 table #613: started +2024/06/07-00:01:44.506 3d70 Level-0 table #613: 0 bytes OK +2024/06/07-00:01:44.510 3d70 Delete type=0 #611 +2024/06/07-00:01:44.510 3d70 Manual compaction at level-0 from '!items!A4JIbc14vM5IKbuT' @ 72057594037927935 : 1 .. '!items.effects!qHY9RXV48OmvCrw1.UNiU6zoPTpbrxoIA' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.511 3d70 Manual compaction at level-1 from '!items!A4JIbc14vM5IKbuT' @ 72057594037927935 : 1 .. '!items.effects!qHY9RXV48OmvCrw1.UNiU6zoPTpbrxoIA' @ 0 : 0; will stop at (end) diff --git a/packs/gps-3rd-party-items/MANIFEST-000594 b/packs/gps-3rd-party-items/MANIFEST-000614 similarity index 57% rename from packs/gps-3rd-party-items/MANIFEST-000594 rename to packs/gps-3rd-party-items/MANIFEST-000614 index 5df3a029..882e5910 100644 Binary files a/packs/gps-3rd-party-items/MANIFEST-000594 and b/packs/gps-3rd-party-items/MANIFEST-000614 differ diff --git a/packs/gps-3rd-party-spells/000605.log b/packs/gps-3rd-party-spells/000627.log similarity index 100% rename from packs/gps-3rd-party-spells/000605.log rename to packs/gps-3rd-party-spells/000627.log diff --git a/packs/gps-3rd-party-spells/CURRENT b/packs/gps-3rd-party-spells/CURRENT index 33738fde..71bc0c49 100644 --- a/packs/gps-3rd-party-spells/CURRENT +++ b/packs/gps-3rd-party-spells/CURRENT @@ -1 +1 @@ -MANIFEST-000602 +MANIFEST-000625 diff --git a/packs/gps-3rd-party-spells/LOG b/packs/gps-3rd-party-spells/LOG index a3a65718..3a617d71 100644 --- a/packs/gps-3rd-party-spells/LOG +++ b/packs/gps-3rd-party-spells/LOG @@ -1,23 +1,8 @@ -2024/06/06-00:06:28.593 2710 Recovering log #601 -2024/06/06-00:06:28.593 2710 Level-0 table #603: started -2024/06/06-00:06:28.597 2710 Level-0 table #603: 56100 bytes OK -2024/06/06-00:06:28.603 2710 Delete type=0 #601 -2024/06/06-00:06:28.603 2710 Delete type=3 #600 -2024/06/06-01:03:59.770 3d70 Level-0 table #606: started -2024/06/06-01:03:59.770 3d70 Level-0 table #606: 0 bytes OK -2024/06/06-01:03:59.772 3d70 Delete type=0 #604 -2024/06/06-01:03:59.772 3d70 Manual compaction at level-0 from '!items!2YNbYocBRdEDgO4Q' @ 72057594037927935 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at '!items!sR2IAM3IQAq6m4xU' @ 110 : 1 -2024/06/06-01:03:59.772 3d70 Compacting 1@0 + 0@1 files -2024/06/06-01:03:59.779 3d70 Generated table #607@0: 17 keys, 49614 bytes -2024/06/06-01:03:59.779 3d70 Compacted 1@0 + 0@1 files => 49614 bytes -2024/06/06-01:03:59.781 3d70 compacted to: files[ 0 1 1 0 0 0 0 ] -2024/06/06-01:03:59.782 3d70 Delete type=2 #603 -2024/06/06-01:03:59.782 3d70 Manual compaction at level-0 from '!items!sR2IAM3IQAq6m4xU' @ 110 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.782 3d70 Manual compaction at level-1 from '!items!2YNbYocBRdEDgO4Q' @ 72057594037927935 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at '!items!sR2IAM3IQAq6m4xU' @ 110 : 1 -2024/06/06-01:03:59.782 3d70 Compacting 1@1 + 1@2 files -2024/06/06-01:03:59.792 3d70 Generated table #608@1: 28 keys, 60121 bytes -2024/06/06-01:03:59.792 3d70 Compacted 1@1 + 1@2 files => 60121 bytes -2024/06/06-01:03:59.795 3d70 compacted to: files[ 0 0 1 0 0 0 0 ] -2024/06/06-01:03:59.795 3d70 Delete type=2 #553 -2024/06/06-01:03:59.795 3d70 Delete type=2 #607 -2024/06/06-01:03:59.803 3d70 Manual compaction at level-1 from '!items!sR2IAM3IQAq6m4xU' @ 110 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.302 638 Recovering log #623 +2024/06/07-00:03:25.310 638 Delete type=0 #623 +2024/06/07-00:03:25.310 638 Delete type=3 #621 +2024/06/07-00:10:24.741 3d70 Level-0 table #628: started +2024/06/07-00:10:24.741 3d70 Level-0 table #628: 0 bytes OK +2024/06/07-00:10:24.743 3d70 Delete type=0 #626 +2024/06/07-00:10:24.749 3d70 Manual compaction at level-0 from '!items!2YNbYocBRdEDgO4Q' @ 72057594037927935 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.749 3d70 Manual compaction at level-1 from '!items!2YNbYocBRdEDgO4Q' @ 72057594037927935 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at (end) diff --git a/packs/gps-3rd-party-spells/LOG.old b/packs/gps-3rd-party-spells/LOG.old index 8e09d153..7d147675 100644 --- a/packs/gps-3rd-party-spells/LOG.old +++ b/packs/gps-3rd-party-spells/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.942 5988 Recovering log #599 -2024/06/04-19:16:38.948 5988 Delete type=0 #599 -2024/06/04-19:16:38.948 5988 Delete type=3 #598 +2024/06/06-20:22:08.807 23fc Recovering log #619 +2024/06/06-20:22:08.819 23fc Delete type=0 #619 +2024/06/06-20:22:08.819 23fc Delete type=3 #617 +2024/06/07-00:01:44.512 3d70 Level-0 table #624: started +2024/06/07-00:01:44.513 3d70 Level-0 table #624: 0 bytes OK +2024/06/07-00:01:44.520 3d70 Delete type=0 #622 +2024/06/07-00:01:44.537 3d70 Manual compaction at level-0 from '!items!2YNbYocBRdEDgO4Q' @ 72057594037927935 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.537 3d70 Manual compaction at level-1 from '!items!2YNbYocBRdEDgO4Q' @ 72057594037927935 : 1 .. '!items.effects!sR2IAM3IQAq6m4xU.N6BqEfnUtgKmw2xw' @ 0 : 0; will stop at (end) diff --git a/packs/gps-3rd-party-spells/MANIFEST-000602 b/packs/gps-3rd-party-spells/MANIFEST-000602 deleted file mode 100644 index 2666179b..00000000 Binary files a/packs/gps-3rd-party-spells/MANIFEST-000602 and /dev/null differ diff --git a/packs/gps-3rd-party-spells/MANIFEST-000625 b/packs/gps-3rd-party-spells/MANIFEST-000625 new file mode 100644 index 00000000..d55f406f Binary files /dev/null and b/packs/gps-3rd-party-spells/MANIFEST-000625 differ diff --git a/packs/gps-actors/001068.log b/packs/gps-actors/001088.log similarity index 100% rename from packs/gps-actors/001068.log rename to packs/gps-actors/001088.log diff --git a/packs/gps-actors/CURRENT b/packs/gps-actors/CURRENT index f5081618..2ec8ad91 100644 --- a/packs/gps-actors/CURRENT +++ b/packs/gps-actors/CURRENT @@ -1 +1 @@ -MANIFEST-001066 +MANIFEST-001086 diff --git a/packs/gps-actors/LOG b/packs/gps-actors/LOG index 932f22d1..daf2352f 100644 --- a/packs/gps-actors/LOG +++ b/packs/gps-actors/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.541 638 Recovering log #1065 -2024/06/06-00:06:28.547 638 Delete type=0 #1065 -2024/06/06-00:06:28.547 638 Delete type=3 #1064 -2024/06/06-01:03:59.755 3d70 Level-0 table #1069: started -2024/06/06-01:03:59.755 3d70 Level-0 table #1069: 0 bytes OK -2024/06/06-01:03:59.758 3d70 Delete type=0 #1067 -2024/06/06-01:03:59.758 3d70 Manual compaction at level-0 from '!actors!2Q055cZ4Q4eMWCQT' @ 72057594037927935 : 1 .. '!actors.items.effects!2Q055cZ4Q4eMWCQT.icorevoMIkBVXL37.jFKhp34XZd32ryYT' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.758 3d70 Manual compaction at level-1 from '!actors!2Q055cZ4Q4eMWCQT' @ 72057594037927935 : 1 .. '!actors.items.effects!2Q055cZ4Q4eMWCQT.icorevoMIkBVXL37.jFKhp34XZd32ryYT' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.226 20e4 Recovering log #1084 +2024/06/07-00:03:25.233 20e4 Delete type=0 #1084 +2024/06/07-00:03:25.233 20e4 Delete type=3 #1082 +2024/06/07-00:10:24.726 3d70 Level-0 table #1089: started +2024/06/07-00:10:24.726 3d70 Level-0 table #1089: 0 bytes OK +2024/06/07-00:10:24.728 3d70 Delete type=0 #1087 +2024/06/07-00:10:24.733 3d70 Manual compaction at level-0 from '!actors!2Q055cZ4Q4eMWCQT' @ 72057594037927935 : 1 .. '!actors.items.effects!2Q055cZ4Q4eMWCQT.icorevoMIkBVXL37.jFKhp34XZd32ryYT' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.736 3d70 Manual compaction at level-1 from '!actors!2Q055cZ4Q4eMWCQT' @ 72057594037927935 : 1 .. '!actors.items.effects!2Q055cZ4Q4eMWCQT.icorevoMIkBVXL37.jFKhp34XZd32ryYT' @ 0 : 0; will stop at (end) diff --git a/packs/gps-actors/LOG.old b/packs/gps-actors/LOG.old index 1e895999..2a7afa2c 100644 --- a/packs/gps-actors/LOG.old +++ b/packs/gps-actors/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.900 63ac Recovering log #1063 -2024/06/04-19:16:38.906 63ac Delete type=0 #1063 -2024/06/04-19:16:38.906 63ac Delete type=3 #1062 +2024/06/06-20:22:08.760 20e4 Recovering log #1080 +2024/06/06-20:22:08.768 20e4 Delete type=0 #1080 +2024/06/06-20:22:08.768 20e4 Delete type=3 #1078 +2024/06/07-00:01:44.501 3d70 Level-0 table #1085: started +2024/06/07-00:01:44.501 3d70 Level-0 table #1085: 0 bytes OK +2024/06/07-00:01:44.506 3d70 Delete type=0 #1083 +2024/06/07-00:01:44.510 3d70 Manual compaction at level-0 from '!actors!2Q055cZ4Q4eMWCQT' @ 72057594037927935 : 1 .. '!actors.items.effects!2Q055cZ4Q4eMWCQT.icorevoMIkBVXL37.jFKhp34XZd32ryYT' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.510 3d70 Manual compaction at level-1 from '!actors!2Q055cZ4Q4eMWCQT' @ 72057594037927935 : 1 .. '!actors.items.effects!2Q055cZ4Q4eMWCQT.icorevoMIkBVXL37.jFKhp34XZd32ryYT' @ 0 : 0; will stop at (end) diff --git a/packs/gps-actors/MANIFEST-001066 b/packs/gps-actors/MANIFEST-001086 similarity index 70% rename from packs/gps-actors/MANIFEST-001066 rename to packs/gps-actors/MANIFEST-001086 index e722497c..481a6cf8 100644 Binary files a/packs/gps-actors/MANIFEST-001066 and b/packs/gps-actors/MANIFEST-001086 differ diff --git a/packs/gps-class-features/002246.log b/packs/gps-class-features/002267.log similarity index 100% rename from packs/gps-class-features/002246.log rename to packs/gps-class-features/002267.log diff --git a/packs/gps-class-features/002248.ldb b/packs/gps-class-features/002269.ldb similarity index 89% rename from packs/gps-class-features/002248.ldb rename to packs/gps-class-features/002269.ldb index 2428c24c..835d1d01 100644 Binary files a/packs/gps-class-features/002248.ldb and b/packs/gps-class-features/002269.ldb differ diff --git a/packs/gps-class-features/CURRENT b/packs/gps-class-features/CURRENT index 38a969a6..236b01be 100644 --- a/packs/gps-class-features/CURRENT +++ b/packs/gps-class-features/CURRENT @@ -1 +1 @@ -MANIFEST-002244 +MANIFEST-002265 diff --git a/packs/gps-class-features/LOG b/packs/gps-class-features/LOG index 6619124a..b50c09d6 100644 --- a/packs/gps-class-features/LOG +++ b/packs/gps-class-features/LOG @@ -1,15 +1,15 @@ -2024/06/06-00:06:28.398 638 Recovering log #2243 -2024/06/06-00:06:28.404 638 Delete type=0 #2243 -2024/06/06-00:06:28.404 638 Delete type=3 #2242 -2024/06/06-01:03:59.700 3d70 Level-0 table #2247: started -2024/06/06-01:03:59.703 3d70 Level-0 table #2247: 9067 bytes OK -2024/06/06-01:03:59.706 3d70 Delete type=0 #2245 -2024/06/06-01:03:59.712 3d70 Manual compaction at level-0 from '!folders!89rvrtGjpBsZz1Tr' @ 72057594037927935 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.712 3d70 Manual compaction at level-1 from '!folders!89rvrtGjpBsZz1Tr' @ 72057594037927935 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at '!items!Xl37AbQBAfskMUBm' @ 364 : 1 -2024/06/06-01:03:59.712 3d70 Compacting 1@1 + 1@2 files -2024/06/06-01:03:59.716 3d70 Generated table #2248@1: 55 keys, 99879 bytes -2024/06/06-01:03:59.716 3d70 Compacted 1@1 + 1@2 files => 99879 bytes -2024/06/06-01:03:59.719 3d70 compacted to: files[ 0 0 1 0 0 0 0 ] -2024/06/06-01:03:59.719 3d70 Delete type=2 #2199 -2024/06/06-01:03:59.719 3d70 Delete type=2 #2247 -2024/06/06-01:03:59.723 3d70 Manual compaction at level-1 from '!items!Xl37AbQBAfskMUBm' @ 364 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.046 20e4 Recovering log #2263 +2024/06/07-00:03:25.054 20e4 Delete type=0 #2263 +2024/06/07-00:03:25.054 20e4 Delete type=3 #2261 +2024/06/07-00:10:24.676 3d70 Level-0 table #2268: started +2024/06/07-00:10:24.681 3d70 Level-0 table #2268: 4311 bytes OK +2024/06/07-00:10:24.683 3d70 Delete type=0 #2266 +2024/06/07-00:10:24.686 3d70 Manual compaction at level-0 from '!folders!89rvrtGjpBsZz1Tr' @ 72057594037927935 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.686 3d70 Manual compaction at level-1 from '!folders!89rvrtGjpBsZz1Tr' @ 72057594037927935 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at '!items!7SDmVAJMGwb73S3q' @ 366 : 1 +2024/06/07-00:10:24.686 3d70 Compacting 1@1 + 1@2 files +2024/06/07-00:10:24.692 3d70 Generated table #2269@1: 56 keys, 100861 bytes +2024/06/07-00:10:24.692 3d70 Compacted 1@1 + 1@2 files => 100861 bytes +2024/06/07-00:10:24.695 3d70 compacted to: files[ 0 0 1 0 0 0 0 ] +2024/06/07-00:10:24.695 3d70 Delete type=2 #2248 +2024/06/07-00:10:24.695 3d70 Delete type=2 #2268 +2024/06/07-00:10:24.702 3d70 Manual compaction at level-1 from '!items!7SDmVAJMGwb73S3q' @ 366 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at (end) diff --git a/packs/gps-class-features/LOG.old b/packs/gps-class-features/LOG.old index c1760e00..c419a030 100644 --- a/packs/gps-class-features/LOG.old +++ b/packs/gps-class-features/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.762 63ac Recovering log #2241 -2024/06/04-19:16:38.768 63ac Delete type=0 #2241 -2024/06/04-19:16:38.768 63ac Delete type=3 #2240 +2024/06/06-20:22:08.654 638 Recovering log #2259 +2024/06/06-20:22:08.663 638 Delete type=0 #2259 +2024/06/06-20:22:08.663 638 Delete type=3 #2257 +2024/06/07-00:01:44.358 3d70 Level-0 table #2264: started +2024/06/07-00:01:44.359 3d70 Level-0 table #2264: 0 bytes OK +2024/06/07-00:01:44.364 3d70 Delete type=0 #2262 +2024/06/07-00:01:44.374 3d70 Manual compaction at level-0 from '!folders!89rvrtGjpBsZz1Tr' @ 72057594037927935 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.375 3d70 Manual compaction at level-1 from '!folders!89rvrtGjpBsZz1Tr' @ 72057594037927935 : 1 .. '!items.effects!wLd8HBhcDcpEy0Gp.DWegiMAKX43CuDbS' @ 0 : 0; will stop at (end) diff --git a/packs/gps-class-features/MANIFEST-002244 b/packs/gps-class-features/MANIFEST-002244 deleted file mode 100644 index 1ab84c71..00000000 Binary files a/packs/gps-class-features/MANIFEST-002244 and /dev/null differ diff --git a/packs/gps-class-features/MANIFEST-002265 b/packs/gps-class-features/MANIFEST-002265 new file mode 100644 index 00000000..5d6919cb Binary files /dev/null and b/packs/gps-class-features/MANIFEST-002265 differ diff --git a/packs/gps-generic-features/002324.log b/packs/gps-generic-features/002344.log similarity index 100% rename from packs/gps-generic-features/002324.log rename to packs/gps-generic-features/002344.log diff --git a/packs/gps-generic-features/CURRENT b/packs/gps-generic-features/CURRENT index 206bae40..a8a59116 100644 --- a/packs/gps-generic-features/CURRENT +++ b/packs/gps-generic-features/CURRENT @@ -1 +1 @@ -MANIFEST-002322 +MANIFEST-002342 diff --git a/packs/gps-generic-features/LOG b/packs/gps-generic-features/LOG index 86915684..c8eafe6d 100644 --- a/packs/gps-generic-features/LOG +++ b/packs/gps-generic-features/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.451 2710 Recovering log #2321 -2024/06/06-00:06:28.456 2710 Delete type=0 #2321 -2024/06/06-00:06:28.456 2710 Delete type=3 #2320 -2024/06/06-01:03:59.709 3d70 Level-0 table #2325: started -2024/06/06-01:03:59.709 3d70 Level-0 table #2325: 0 bytes OK -2024/06/06-01:03:59.712 3d70 Delete type=0 #2323 -2024/06/06-01:03:59.712 3d70 Manual compaction at level-0 from '!items!0XoQ7lGPSwjM8Gw4' @ 72057594037927935 : 1 .. '!items.effects!svKaRfNtOXMOXoW6.NcYMpQ7B3RwBuLC7' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.719 3d70 Manual compaction at level-1 from '!items!0XoQ7lGPSwjM8Gw4' @ 72057594037927935 : 1 .. '!items.effects!svKaRfNtOXMOXoW6.NcYMpQ7B3RwBuLC7' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.095 638 Recovering log #2340 +2024/06/07-00:03:25.102 638 Delete type=0 #2340 +2024/06/07-00:03:25.102 638 Delete type=3 #2338 +2024/06/07-00:10:24.695 3d70 Level-0 table #2345: started +2024/06/07-00:10:24.695 3d70 Level-0 table #2345: 0 bytes OK +2024/06/07-00:10:24.699 3d70 Delete type=0 #2343 +2024/06/07-00:10:24.710 3d70 Manual compaction at level-0 from '!items!0XoQ7lGPSwjM8Gw4' @ 72057594037927935 : 1 .. '!items.effects!svKaRfNtOXMOXoW6.NcYMpQ7B3RwBuLC7' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.713 3d70 Manual compaction at level-1 from '!items!0XoQ7lGPSwjM8Gw4' @ 72057594037927935 : 1 .. '!items.effects!svKaRfNtOXMOXoW6.NcYMpQ7B3RwBuLC7' @ 0 : 0; will stop at (end) diff --git a/packs/gps-generic-features/LOG.old b/packs/gps-generic-features/LOG.old index b5064e24..92117e6c 100644 --- a/packs/gps-generic-features/LOG.old +++ b/packs/gps-generic-features/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.817 5988 Recovering log #2319 -2024/06/04-19:16:38.822 5988 Delete type=0 #2319 -2024/06/04-19:16:38.822 5988 Delete type=3 #2318 +2024/06/06-20:22:08.697 23fc Recovering log #2336 +2024/06/06-20:22:08.703 23fc Delete type=0 #2336 +2024/06/06-20:22:08.703 23fc Delete type=3 #2334 +2024/06/07-00:01:44.384 3d70 Level-0 table #2341: started +2024/06/07-00:01:44.384 3d70 Level-0 table #2341: 0 bytes OK +2024/06/07-00:01:44.388 3d70 Delete type=0 #2339 +2024/06/07-00:01:44.411 3d70 Manual compaction at level-0 from '!items!0XoQ7lGPSwjM8Gw4' @ 72057594037927935 : 1 .. '!items.effects!svKaRfNtOXMOXoW6.NcYMpQ7B3RwBuLC7' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.411 3d70 Manual compaction at level-1 from '!items!0XoQ7lGPSwjM8Gw4' @ 72057594037927935 : 1 .. '!items.effects!svKaRfNtOXMOXoW6.NcYMpQ7B3RwBuLC7' @ 0 : 0; will stop at (end) diff --git a/packs/gps-generic-features/MANIFEST-002322 b/packs/gps-generic-features/MANIFEST-002342 similarity index 75% rename from packs/gps-generic-features/MANIFEST-002322 rename to packs/gps-generic-features/MANIFEST-002342 index 8a0b94a7..88eeef66 100644 Binary files a/packs/gps-generic-features/MANIFEST-002322 and b/packs/gps-generic-features/MANIFEST-002342 differ diff --git a/packs/gps-homebrew-features/002224.log b/packs/gps-homebrew-features/002245.log similarity index 100% rename from packs/gps-homebrew-features/002224.log rename to packs/gps-homebrew-features/002245.log diff --git a/packs/gps-homebrew-features/001815.ldb b/packs/gps-homebrew-features/002247.ldb similarity index 59% rename from packs/gps-homebrew-features/001815.ldb rename to packs/gps-homebrew-features/002247.ldb index 23f082d9..c49f0ace 100644 Binary files a/packs/gps-homebrew-features/001815.ldb and b/packs/gps-homebrew-features/002247.ldb differ diff --git a/packs/gps-homebrew-features/CURRENT b/packs/gps-homebrew-features/CURRENT index 77aec3c2..12b44ad6 100644 --- a/packs/gps-homebrew-features/CURRENT +++ b/packs/gps-homebrew-features/CURRENT @@ -1 +1 @@ -MANIFEST-002222 +MANIFEST-002243 diff --git a/packs/gps-homebrew-features/LOG b/packs/gps-homebrew-features/LOG index dd2ae4b1..02198206 100644 --- a/packs/gps-homebrew-features/LOG +++ b/packs/gps-homebrew-features/LOG @@ -1,8 +1,15 @@ -2024/06/06-00:06:28.469 638 Recovering log #2221 -2024/06/06-00:06:28.476 638 Delete type=0 #2221 -2024/06/06-00:06:28.476 638 Delete type=3 #2220 -2024/06/06-01:03:59.726 3d70 Level-0 table #2225: started -2024/06/06-01:03:59.726 3d70 Level-0 table #2225: 0 bytes OK -2024/06/06-01:03:59.729 3d70 Delete type=0 #2223 -2024/06/06-01:03:59.743 3d70 Manual compaction at level-0 from '!folders!4OzV9QdsPgTyK99q' @ 72057594037927935 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.743 3d70 Manual compaction at level-1 from '!folders!4OzV9QdsPgTyK99q' @ 72057594037927935 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.106 2710 Recovering log #2240 +2024/06/07-00:03:25.113 2710 Delete type=0 #2240 +2024/06/07-00:03:25.113 2710 Delete type=3 #2238 +2024/06/07-00:10:24.702 3d70 Level-0 table #2246: started +2024/06/07-00:10:24.707 3d70 Level-0 table #2246: 4237 bytes OK +2024/06/07-00:10:24.710 3d70 Delete type=0 #2244 +2024/06/07-00:10:24.713 3d70 Manual compaction at level-0 from '!folders!4OzV9QdsPgTyK99q' @ 72057594037927935 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.713 3d70 Manual compaction at level-1 from '!folders!4OzV9QdsPgTyK99q' @ 72057594037927935 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at '!items!LJ0SH4ti4PsnM5BR' @ 106 : 1 +2024/06/07-00:10:24.713 3d70 Compacting 1@1 + 1@2 files +2024/06/07-00:10:24.720 3d70 Generated table #2247@1: 17 keys, 34639 bytes +2024/06/07-00:10:24.720 3d70 Compacted 1@1 + 1@2 files => 34639 bytes +2024/06/07-00:10:24.722 3d70 compacted to: files[ 0 0 1 0 0 0 0 ] +2024/06/07-00:10:24.722 3d70 Delete type=2 #2242 +2024/06/07-00:10:24.722 3d70 Delete type=2 #2246 +2024/06/07-00:10:24.729 3d70 Manual compaction at level-1 from '!items!LJ0SH4ti4PsnM5BR' @ 106 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at (end) diff --git a/packs/gps-homebrew-features/LOG.old b/packs/gps-homebrew-features/LOG.old index f764a9e6..cac2ba73 100644 --- a/packs/gps-homebrew-features/LOG.old +++ b/packs/gps-homebrew-features/LOG.old @@ -1,3 +1,15 @@ -2024/06/04-19:16:38.830 63ac Recovering log #2219 -2024/06/04-19:16:38.835 63ac Delete type=0 #2219 -2024/06/04-19:16:38.835 63ac Delete type=3 #2218 +2024/06/06-20:22:08.710 638 Recovering log #2236 +2024/06/06-20:22:08.718 638 Delete type=0 #2236 +2024/06/06-20:22:08.718 638 Delete type=3 #2234 +2024/06/07-00:01:44.395 3d70 Level-0 table #2241: started +2024/06/07-00:01:44.406 3d70 Level-0 table #2241: 5176 bytes OK +2024/06/07-00:01:44.410 3d70 Delete type=0 #2239 +2024/06/07-00:01:44.411 3d70 Manual compaction at level-0 from '!folders!4OzV9QdsPgTyK99q' @ 72057594037927935 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.411 3d70 Manual compaction at level-1 from '!folders!4OzV9QdsPgTyK99q' @ 72057594037927935 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at '!items.effects!LJ0SH4ti4PsnM5BR.xDcTo3iw6U2atIsE' @ 104 : 1 +2024/06/07-00:01:44.412 3d70 Compacting 1@1 + 1@2 files +2024/06/07-00:01:44.425 3d70 Generated table #2242@1: 17 keys, 34613 bytes +2024/06/07-00:01:44.425 3d70 Compacted 1@1 + 1@2 files => 34613 bytes +2024/06/07-00:01:44.429 3d70 compacted to: files[ 0 0 1 0 0 0 0 ] +2024/06/07-00:01:44.429 3d70 Delete type=2 #1815 +2024/06/07-00:01:44.429 3d70 Delete type=2 #2241 +2024/06/07-00:01:44.461 3d70 Manual compaction at level-1 from '!items.effects!LJ0SH4ti4PsnM5BR.xDcTo3iw6U2atIsE' @ 104 : 1 .. '!items.effects!ba3fwkX1XMdyqBaE.hPR9ii2vho7FqWlZ' @ 0 : 0; will stop at (end) diff --git a/packs/gps-homebrew-features/MANIFEST-002222 b/packs/gps-homebrew-features/MANIFEST-002222 deleted file mode 100644 index e8f14382..00000000 Binary files a/packs/gps-homebrew-features/MANIFEST-002222 and /dev/null differ diff --git a/packs/gps-homebrew-features/MANIFEST-002243 b/packs/gps-homebrew-features/MANIFEST-002243 new file mode 100644 index 00000000..2bfb91ac Binary files /dev/null and b/packs/gps-homebrew-features/MANIFEST-002243 differ diff --git a/packs/gps-homebrew-items/002233.log b/packs/gps-homebrew-items/002253.log similarity index 100% rename from packs/gps-homebrew-items/002233.log rename to packs/gps-homebrew-items/002253.log diff --git a/packs/gps-homebrew-items/CURRENT b/packs/gps-homebrew-items/CURRENT index 148b7b32..1d3e7b43 100644 --- a/packs/gps-homebrew-items/CURRENT +++ b/packs/gps-homebrew-items/CURRENT @@ -1 +1 @@ -MANIFEST-002231 +MANIFEST-002251 diff --git a/packs/gps-homebrew-items/LOG b/packs/gps-homebrew-items/LOG index 0baa2f85..5d503027 100644 --- a/packs/gps-homebrew-items/LOG +++ b/packs/gps-homebrew-items/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.484 2710 Recovering log #2230 -2024/06/06-00:06:28.490 2710 Delete type=0 #2230 -2024/06/06-00:06:28.490 2710 Delete type=3 #2229 -2024/06/06-01:03:59.723 3d70 Level-0 table #2234: started -2024/06/06-01:03:59.723 3d70 Level-0 table #2234: 0 bytes OK -2024/06/06-01:03:59.726 3d70 Delete type=0 #2232 -2024/06/06-01:03:59.743 3d70 Manual compaction at level-0 from '!items!1WSJjnpLJhilXEgO' @ 72057594037927935 : 1 .. '!items.effects!zEXJxqsAmVM7Pohu.eA3jhjz26f35OLfw' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.743 3d70 Manual compaction at level-1 from '!items!1WSJjnpLJhilXEgO' @ 72057594037927935 : 1 .. '!items.effects!zEXJxqsAmVM7Pohu.eA3jhjz26f35OLfw' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.131 638 Recovering log #2249 +2024/06/07-00:03:25.142 638 Delete type=0 #2249 +2024/06/07-00:03:25.142 638 Delete type=3 #2247 +2024/06/07-00:10:24.699 3d70 Level-0 table #2254: started +2024/06/07-00:10:24.699 3d70 Level-0 table #2254: 0 bytes OK +2024/06/07-00:10:24.702 3d70 Delete type=0 #2252 +2024/06/07-00:10:24.710 3d70 Manual compaction at level-0 from '!items!1WSJjnpLJhilXEgO' @ 72057594037927935 : 1 .. '!items.effects!zEXJxqsAmVM7Pohu.eA3jhjz26f35OLfw' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.713 3d70 Manual compaction at level-1 from '!items!1WSJjnpLJhilXEgO' @ 72057594037927935 : 1 .. '!items.effects!zEXJxqsAmVM7Pohu.eA3jhjz26f35OLfw' @ 0 : 0; will stop at (end) diff --git a/packs/gps-homebrew-items/LOG.old b/packs/gps-homebrew-items/LOG.old index 6f28e945..c5805694 100644 --- a/packs/gps-homebrew-items/LOG.old +++ b/packs/gps-homebrew-items/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.848 5988 Recovering log #2228 -2024/06/04-19:16:38.853 5988 Delete type=0 #2228 -2024/06/04-19:16:38.853 5988 Delete type=3 #2227 +2024/06/06-20:22:08.722 23fc Recovering log #2245 +2024/06/06-20:22:08.729 23fc Delete type=0 #2245 +2024/06/06-20:22:08.729 23fc Delete type=3 #2243 +2024/06/07-00:01:44.454 3d70 Level-0 table #2250: started +2024/06/07-00:01:44.454 3d70 Level-0 table #2250: 0 bytes OK +2024/06/07-00:01:44.458 3d70 Delete type=0 #2248 +2024/06/07-00:01:44.461 3d70 Manual compaction at level-0 from '!items!1WSJjnpLJhilXEgO' @ 72057594037927935 : 1 .. '!items.effects!zEXJxqsAmVM7Pohu.eA3jhjz26f35OLfw' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.461 3d70 Manual compaction at level-1 from '!items!1WSJjnpLJhilXEgO' @ 72057594037927935 : 1 .. '!items.effects!zEXJxqsAmVM7Pohu.eA3jhjz26f35OLfw' @ 0 : 0; will stop at (end) diff --git a/packs/gps-homebrew-items/MANIFEST-002231 b/packs/gps-homebrew-items/MANIFEST-002251 similarity index 81% rename from packs/gps-homebrew-items/MANIFEST-002231 rename to packs/gps-homebrew-items/MANIFEST-002251 index 0001d6bc..ded6ccb8 100644 Binary files a/packs/gps-homebrew-items/MANIFEST-002231 and b/packs/gps-homebrew-items/MANIFEST-002251 differ diff --git a/packs/gps-homebrew-spells/001901.log b/packs/gps-homebrew-spells/001921.log similarity index 100% rename from packs/gps-homebrew-spells/001901.log rename to packs/gps-homebrew-spells/001921.log diff --git a/packs/gps-homebrew-spells/CURRENT b/packs/gps-homebrew-spells/CURRENT index b83661df..8ad6adc4 100644 --- a/packs/gps-homebrew-spells/CURRENT +++ b/packs/gps-homebrew-spells/CURRENT @@ -1 +1 @@ -MANIFEST-001899 +MANIFEST-001919 diff --git a/packs/gps-homebrew-spells/LOG b/packs/gps-homebrew-spells/LOG index 9b03f2f2..7f1bd6d3 100644 --- a/packs/gps-homebrew-spells/LOG +++ b/packs/gps-homebrew-spells/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.499 638 Recovering log #1898 -2024/06/06-00:06:28.504 638 Delete type=0 #1898 -2024/06/06-00:06:28.504 638 Delete type=3 #1897 -2024/06/06-01:03:59.741 3d70 Level-0 table #1902: started -2024/06/06-01:03:59.741 3d70 Level-0 table #1902: 0 bytes OK -2024/06/06-01:03:59.743 3d70 Delete type=0 #1900 -2024/06/06-01:03:59.743 3d70 Manual compaction at level-0 from '!items!iVqgFn89rGOnPTK4' @ 72057594037927935 : 1 .. '!items.effects!iVqgFn89rGOnPTK4.fAK9x7lIORqSnaz1' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.743 3d70 Manual compaction at level-1 from '!items!iVqgFn89rGOnPTK4' @ 72057594037927935 : 1 .. '!items.effects!iVqgFn89rGOnPTK4.fAK9x7lIORqSnaz1' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.154 2710 Recovering log #1917 +2024/06/07-00:03:25.162 2710 Delete type=0 #1917 +2024/06/07-00:03:25.163 2710 Delete type=3 #1915 +2024/06/07-00:10:24.723 3d70 Level-0 table #1922: started +2024/06/07-00:10:24.723 3d70 Level-0 table #1922: 0 bytes OK +2024/06/07-00:10:24.726 3d70 Delete type=0 #1920 +2024/06/07-00:10:24.733 3d70 Manual compaction at level-0 from '!items!iVqgFn89rGOnPTK4' @ 72057594037927935 : 1 .. '!items.effects!iVqgFn89rGOnPTK4.fAK9x7lIORqSnaz1' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.736 3d70 Manual compaction at level-1 from '!items!iVqgFn89rGOnPTK4' @ 72057594037927935 : 1 .. '!items.effects!iVqgFn89rGOnPTK4.fAK9x7lIORqSnaz1' @ 0 : 0; will stop at (end) diff --git a/packs/gps-homebrew-spells/LOG.old b/packs/gps-homebrew-spells/LOG.old index d938cccd..a920bef1 100644 --- a/packs/gps-homebrew-spells/LOG.old +++ b/packs/gps-homebrew-spells/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.863 63ac Recovering log #1896 -2024/06/04-19:16:38.868 63ac Delete type=0 #1896 -2024/06/04-19:16:38.868 63ac Delete type=3 #1895 +2024/06/06-20:22:08.734 20e4 Recovering log #1913 +2024/06/06-20:22:08.741 20e4 Delete type=0 #1913 +2024/06/06-20:22:08.741 20e4 Delete type=3 #1911 +2024/06/07-00:01:44.489 3d70 Level-0 table #1918: started +2024/06/07-00:01:44.490 3d70 Level-0 table #1918: 0 bytes OK +2024/06/07-00:01:44.495 3d70 Delete type=0 #1916 +2024/06/07-00:01:44.506 3d70 Manual compaction at level-0 from '!items!iVqgFn89rGOnPTK4' @ 72057594037927935 : 1 .. '!items.effects!iVqgFn89rGOnPTK4.fAK9x7lIORqSnaz1' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.510 3d70 Manual compaction at level-1 from '!items!iVqgFn89rGOnPTK4' @ 72057594037927935 : 1 .. '!items.effects!iVqgFn89rGOnPTK4.fAK9x7lIORqSnaz1' @ 0 : 0; will stop at (end) diff --git a/packs/gps-homebrew-spells/MANIFEST-001899 b/packs/gps-homebrew-spells/MANIFEST-001919 similarity index 56% rename from packs/gps-homebrew-spells/MANIFEST-001899 rename to packs/gps-homebrew-spells/MANIFEST-001919 index bd281d8f..fd355797 100644 Binary files a/packs/gps-homebrew-spells/MANIFEST-001899 and b/packs/gps-homebrew-spells/MANIFEST-001919 differ diff --git a/packs/gps-items/002227.log b/packs/gps-items/002247.log similarity index 100% rename from packs/gps-items/002227.log rename to packs/gps-items/002247.log diff --git a/packs/gps-items/CURRENT b/packs/gps-items/CURRENT index ac2827ec..980b31a9 100644 --- a/packs/gps-items/CURRENT +++ b/packs/gps-items/CURRENT @@ -1 +1 @@ -MANIFEST-002225 +MANIFEST-002245 diff --git a/packs/gps-items/LOG b/packs/gps-items/LOG index 1f34898f..342da09e 100644 --- a/packs/gps-items/LOG +++ b/packs/gps-items/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.416 2710 Recovering log #2224 -2024/06/06-00:06:28.421 2710 Delete type=0 #2224 -2024/06/06-00:06:28.422 2710 Delete type=3 #2223 -2024/06/06-01:03:59.707 3d70 Level-0 table #2228: started -2024/06/06-01:03:59.707 3d70 Level-0 table #2228: 0 bytes OK -2024/06/06-01:03:59.709 3d70 Delete type=0 #2226 -2024/06/06-01:03:59.712 3d70 Manual compaction at level-0 from '!items!0qTQDQ2Cipf15JGW' @ 72057594037927935 : 1 .. '!items.effects!wds22ulA8PSTvYWP.ZrTNMwai89gqFKJo' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.719 3d70 Manual compaction at level-1 from '!items!0qTQDQ2Cipf15JGW' @ 72057594037927935 : 1 .. '!items.effects!wds22ulA8PSTvYWP.ZrTNMwai89gqFKJo' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.065 638 Recovering log #2243 +2024/06/07-00:03:25.072 638 Delete type=0 #2243 +2024/06/07-00:03:25.072 638 Delete type=3 #2241 +2024/06/07-00:10:24.683 3d70 Level-0 table #2248: started +2024/06/07-00:10:24.683 3d70 Level-0 table #2248: 0 bytes OK +2024/06/07-00:10:24.686 3d70 Delete type=0 #2246 +2024/06/07-00:10:24.686 3d70 Manual compaction at level-0 from '!items!0qTQDQ2Cipf15JGW' @ 72057594037927935 : 1 .. '!items.effects!wds22ulA8PSTvYWP.ZrTNMwai89gqFKJo' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.695 3d70 Manual compaction at level-1 from '!items!0qTQDQ2Cipf15JGW' @ 72057594037927935 : 1 .. '!items.effects!wds22ulA8PSTvYWP.ZrTNMwai89gqFKJo' @ 0 : 0; will stop at (end) diff --git a/packs/gps-items/LOG.old b/packs/gps-items/LOG.old index dff076c9..26b2a39a 100644 --- a/packs/gps-items/LOG.old +++ b/packs/gps-items/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.777 5988 Recovering log #2222 -2024/06/04-19:16:38.782 5988 Delete type=0 #2222 -2024/06/04-19:16:38.783 5988 Delete type=3 #2221 +2024/06/06-20:22:08.671 23fc Recovering log #2239 +2024/06/06-20:22:08.680 23fc Delete type=0 #2239 +2024/06/06-20:22:08.680 23fc Delete type=3 #2237 +2024/06/07-00:01:44.377 3d70 Level-0 table #2244: started +2024/06/07-00:01:44.378 3d70 Level-0 table #2244: 0 bytes OK +2024/06/07-00:01:44.383 3d70 Delete type=0 #2242 +2024/06/07-00:01:44.411 3d70 Manual compaction at level-0 from '!items!0qTQDQ2Cipf15JGW' @ 72057594037927935 : 1 .. '!items.effects!wds22ulA8PSTvYWP.ZrTNMwai89gqFKJo' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.411 3d70 Manual compaction at level-1 from '!items!0qTQDQ2Cipf15JGW' @ 72057594037927935 : 1 .. '!items.effects!wds22ulA8PSTvYWP.ZrTNMwai89gqFKJo' @ 0 : 0; will stop at (end) diff --git a/packs/gps-items/MANIFEST-002225 b/packs/gps-items/MANIFEST-002245 similarity index 56% rename from packs/gps-items/MANIFEST-002225 rename to packs/gps-items/MANIFEST-002245 index 5bea5cad..816e25a6 100644 Binary files a/packs/gps-items/MANIFEST-002225 and b/packs/gps-items/MANIFEST-002245 differ diff --git a/packs/gps-monster-features/002227.log b/packs/gps-monster-features/002249.log similarity index 100% rename from packs/gps-monster-features/002227.log rename to packs/gps-monster-features/002249.log diff --git a/packs/gps-monster-features/CURRENT b/packs/gps-monster-features/CURRENT index ac2827ec..9d5bd811 100644 --- a/packs/gps-monster-features/CURRENT +++ b/packs/gps-monster-features/CURRENT @@ -1 +1 @@ -MANIFEST-002225 +MANIFEST-002247 diff --git a/packs/gps-monster-features/LOG b/packs/gps-monster-features/LOG index a42fe3d7..0bf03a28 100644 --- a/packs/gps-monster-features/LOG +++ b/packs/gps-monster-features/LOG @@ -1,21 +1,8 @@ -2024/06/06-00:06:28.434 638 Recovering log #2224 -2024/06/06-00:06:28.439 638 Delete type=0 #2224 -2024/06/06-00:06:28.439 638 Delete type=3 #2222 -2024/06/06-01:03:59.719 3d70 Level-0 table #2228: started -2024/06/06-01:03:59.719 3d70 Level-0 table #2228: 0 bytes OK -2024/06/06-01:03:59.723 3d70 Delete type=0 #2226 -2024/06/06-01:03:59.729 3d70 Manual compaction at level-0 from '!folders!44lJ4L7xySVYZzED' @ 72057594037927935 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at '!items.effects!QeLgLOxgvzWnTi0u.OOj4tOgdHtJEetTh' @ 139 : 1 -2024/06/06-01:03:59.729 3d70 Compacting 1@0 + 0@1 files -2024/06/06-01:03:59.738 3d70 Generated table #2229@0: 2 keys, 2443 bytes -2024/06/06-01:03:59.738 3d70 Compacted 1@0 + 0@1 files => 2443 bytes -2024/06/06-01:03:59.741 3d70 compacted to: files[ 0 1 1 0 0 0 0 ] -2024/06/06-01:03:59.741 3d70 Delete type=2 #2223 -2024/06/06-01:03:59.743 3d70 Manual compaction at level-0 from '!items.effects!QeLgLOxgvzWnTi0u.OOj4tOgdHtJEetTh' @ 139 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.743 3d70 Manual compaction at level-1 from '!folders!44lJ4L7xySVYZzED' @ 72057594037927935 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at '!items.effects!QeLgLOxgvzWnTi0u.OOj4tOgdHtJEetTh' @ 139 : 1 -2024/06/06-01:03:59.743 3d70 Compacting 1@1 + 1@2 files -2024/06/06-01:03:59.749 3d70 Generated table #2230@1: 47 keys, 41704 bytes -2024/06/06-01:03:59.749 3d70 Compacted 1@1 + 1@2 files => 41704 bytes -2024/06/06-01:03:59.750 3d70 compacted to: files[ 0 0 1 0 0 0 0 ] -2024/06/06-01:03:59.750 3d70 Delete type=2 #2219 -2024/06/06-01:03:59.750 3d70 Delete type=2 #2229 -2024/06/06-01:03:59.758 3d70 Manual compaction at level-1 from '!items.effects!QeLgLOxgvzWnTi0u.OOj4tOgdHtJEetTh' @ 139 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.079 2710 Recovering log #2245 +2024/06/07-00:03:25.088 2710 Delete type=0 #2245 +2024/06/07-00:03:25.088 2710 Delete type=3 #2243 +2024/06/07-00:10:24.674 3d70 Level-0 table #2250: started +2024/06/07-00:10:24.674 3d70 Level-0 table #2250: 0 bytes OK +2024/06/07-00:10:24.676 3d70 Delete type=0 #2248 +2024/06/07-00:10:24.686 3d70 Manual compaction at level-0 from '!folders!44lJ4L7xySVYZzED' @ 72057594037927935 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.686 3d70 Manual compaction at level-1 from '!folders!44lJ4L7xySVYZzED' @ 72057594037927935 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at (end) diff --git a/packs/gps-monster-features/LOG.old b/packs/gps-monster-features/LOG.old index e1da4098..3b178e72 100644 --- a/packs/gps-monster-features/LOG.old +++ b/packs/gps-monster-features/LOG.old @@ -1,5 +1,8 @@ -2024/06/04-19:16:38.795 63ac Recovering log #2221 -2024/06/04-19:16:38.795 63ac Level-0 table #2223: started -2024/06/04-19:16:38.800 63ac Level-0 table #2223: 2443 bytes OK -2024/06/04-19:16:38.805 63ac Delete type=0 #2221 -2024/06/04-19:16:38.805 63ac Delete type=3 #2220 +2024/06/06-20:22:08.687 638 Recovering log #2241 +2024/06/06-20:22:08.694 638 Delete type=0 #2241 +2024/06/06-20:22:08.694 638 Delete type=3 #2239 +2024/06/07-00:01:44.389 3d70 Level-0 table #2246: started +2024/06/07-00:01:44.389 3d70 Level-0 table #2246: 0 bytes OK +2024/06/07-00:01:44.395 3d70 Delete type=0 #2244 +2024/06/07-00:01:44.411 3d70 Manual compaction at level-0 from '!folders!44lJ4L7xySVYZzED' @ 72057594037927935 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.411 3d70 Manual compaction at level-1 from '!folders!44lJ4L7xySVYZzED' @ 72057594037927935 : 1 .. '!items.effects!yp0IIuvsEkJd6KKW.WlySPDKKWMIOowHi' @ 0 : 0; will stop at (end) diff --git a/packs/gps-monster-features/MANIFEST-002225 b/packs/gps-monster-features/MANIFEST-002225 deleted file mode 100644 index b7b95ee3..00000000 Binary files a/packs/gps-monster-features/MANIFEST-002225 and /dev/null differ diff --git a/packs/gps-monster-features/MANIFEST-002247 b/packs/gps-monster-features/MANIFEST-002247 new file mode 100644 index 00000000..329f89d5 Binary files /dev/null and b/packs/gps-monster-features/MANIFEST-002247 differ diff --git a/packs/gps-spells/002275.log b/packs/gps-spells/002295.log similarity index 100% rename from packs/gps-spells/002275.log rename to packs/gps-spells/002295.log diff --git a/packs/gps-spells/CURRENT b/packs/gps-spells/CURRENT index ae8293cc..013f55e2 100644 --- a/packs/gps-spells/CURRENT +++ b/packs/gps-spells/CURRENT @@ -1 +1 @@ -MANIFEST-002273 +MANIFEST-002293 diff --git a/packs/gps-spells/LOG b/packs/gps-spells/LOG index 08d6e884..560e47df 100644 --- a/packs/gps-spells/LOG +++ b/packs/gps-spells/LOG @@ -1,8 +1,8 @@ -2024/06/06-00:06:28.378 2710 Recovering log #2272 -2024/06/06-00:06:28.385 2710 Delete type=0 #2272 -2024/06/06-00:06:28.385 2710 Delete type=3 #2271 -2024/06/06-01:03:59.695 3d70 Level-0 table #2276: started -2024/06/06-01:03:59.695 3d70 Level-0 table #2276: 0 bytes OK -2024/06/06-01:03:59.700 3d70 Delete type=0 #2274 -2024/06/06-01:03:59.712 3d70 Manual compaction at level-0 from '!items!0gEfNrgZuAxvnL5H' @ 72057594037927935 : 1 .. '!items.effects!vxrggTopkxhq3MAn.T70VAw9NbZZUV7tZ' @ 0 : 0; will stop at (end) -2024/06/06-01:03:59.712 3d70 Manual compaction at level-1 from '!items!0gEfNrgZuAxvnL5H' @ 72057594037927935 : 1 .. '!items.effects!vxrggTopkxhq3MAn.T70VAw9NbZZUV7tZ' @ 0 : 0; will stop at (end) +2024/06/07-00:03:25.029 638 Recovering log #2291 +2024/06/07-00:03:25.036 638 Delete type=0 #2291 +2024/06/07-00:03:25.036 638 Delete type=3 #2289 +2024/06/07-00:10:24.669 3d70 Level-0 table #2296: started +2024/06/07-00:10:24.669 3d70 Level-0 table #2296: 0 bytes OK +2024/06/07-00:10:24.673 3d70 Delete type=0 #2294 +2024/06/07-00:10:24.686 3d70 Manual compaction at level-0 from '!items!0gEfNrgZuAxvnL5H' @ 72057594037927935 : 1 .. '!items.effects!vxrggTopkxhq3MAn.T70VAw9NbZZUV7tZ' @ 0 : 0; will stop at (end) +2024/06/07-00:10:24.686 3d70 Manual compaction at level-1 from '!items!0gEfNrgZuAxvnL5H' @ 72057594037927935 : 1 .. '!items.effects!vxrggTopkxhq3MAn.T70VAw9NbZZUV7tZ' @ 0 : 0; will stop at (end) diff --git a/packs/gps-spells/LOG.old b/packs/gps-spells/LOG.old index 84b0fce5..0e4c8184 100644 --- a/packs/gps-spells/LOG.old +++ b/packs/gps-spells/LOG.old @@ -1,3 +1,8 @@ -2024/06/04-19:16:38.745 5988 Recovering log #2270 -2024/06/04-19:16:38.751 5988 Delete type=0 #2270 -2024/06/04-19:16:38.751 5988 Delete type=3 #2269 +2024/06/06-20:22:08.635 23fc Recovering log #2287 +2024/06/06-20:22:08.644 23fc Delete type=0 #2287 +2024/06/06-20:22:08.644 23fc Delete type=3 #2285 +2024/06/07-00:01:44.365 3d70 Level-0 table #2292: started +2024/06/07-00:01:44.366 3d70 Level-0 table #2292: 0 bytes OK +2024/06/07-00:01:44.373 3d70 Delete type=0 #2290 +2024/06/07-00:01:44.374 3d70 Manual compaction at level-0 from '!items!0gEfNrgZuAxvnL5H' @ 72057594037927935 : 1 .. '!items.effects!vxrggTopkxhq3MAn.T70VAw9NbZZUV7tZ' @ 0 : 0; will stop at (end) +2024/06/07-00:01:44.375 3d70 Manual compaction at level-1 from '!items!0gEfNrgZuAxvnL5H' @ 72057594037927935 : 1 .. '!items.effects!vxrggTopkxhq3MAn.T70VAw9NbZZUV7tZ' @ 0 : 0; will stop at (end) diff --git a/packs/gps-spells/MANIFEST-002273 b/packs/gps-spells/MANIFEST-002293 similarity index 75% rename from packs/gps-spells/MANIFEST-002273 rename to packs/gps-spells/MANIFEST-002293 index aebdce2e..4bc9140e 100644 Binary files a/packs/gps-spells/MANIFEST-002273 and b/packs/gps-spells/MANIFEST-002293 differ diff --git a/scripts/helpers.js b/scripts/helpers.js index 659a7e71..e83e9d93 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -264,4 +264,95 @@ export function findValidTokens({initiatingToken, targetedToken, itemName, itemT }; return validTokens; +} + +export async function process3rdPartyReactionDialog({dialogTitle,dialogContent,dialogId,initialTimeLeft,actorUuid,source,type}) { + const module = await import('./module.js'); + const socket = module.socket; + + return await new Promise(resolve => { + let timer; + + let dialog = new Dialog({ + title: dialogTitle, + content: dialogContent, + id: dialogId, + buttons: { + yes: { + label: "Yes", + callback: async (html) => { + dialog.dialogState.interacted = true; + dialog.dialogState.decision = "yes"; + if(source && source === "user" && type === "multiDialog") await socket.executeAsGM("closeDialogById", { dialogId: dialogId }); + if(source && source === "gm" && type === "multiDialog") await socket.executeAsUser("closeDialogById", browserUser.id, { dialogId: dialogId }); + + let userDecision = true; + + const hasEffectApplied = await game.dfreds.effectInterface.hasEffectApplied({ effectName: 'Reaction', uuid: actorUuid }); + + if (!hasEffectApplied) { + await game.dfreds.effectInterface.addEffect({ effectName: 'Reaction', uuid: actorUuid }); + } + + return resolve({userDecision, programmaticallyClosed: false, source, type}); + } + }, + no: { + label: "No", + callback: async () => { + // Reaction Declined + dialog.dialogState.interacted = true; + dialog.dialogState.decision = "no"; + return resolve({ userDecision: false, programmaticallyClosed: false, source, type}); + } + }, + }, default: "no", + render: (html) => { + $(html).attr('id', dialog.options.id); + let timeLeft = initialTimeLeft; + let isPaused = false; + const countdownElement = html.find("#countdown"); + const pauseButton = html.find("#pauseButton"); + + dialog.updateTimer = (newTimeLeft, paused) => { + timeLeft = newTimeLeft; + isPaused = paused; + countdownElement.text(`${timeLeft}`); + pauseButton.text(isPaused ? 'Paused' : 'Pause'); + }; + + timer = setInterval(() => { + if (!isPaused) { + timeLeft--; + countdownElement.text(`${timeLeft}`); + if (timeLeft <= 0) { + dialog.data.buttons.no.callback(); + dialog.close(); + } + } + }, 1000); + + pauseButton.click(() => { + isPaused = !isPaused; + pauseButton.text(isPaused ? 'Paused' : 'Pause'); + if (source && source === "user" && type === "multiDialog") { + socket.executeAsGM("pauseDialogById", { dialogId, timeLeft, isPaused }); + } else if (source && source === "gm" && type === "multiDialog") { + socket.executeAsUser("pauseDialogById", browserUser.id, { dialogId, timeLeft, isPaused }); + } + }); + }, + close: () => { + clearInterval(timer); + if (dialog.dialogState.programmaticallyClosed) { + return resolve({ userDecision: false, programmaticallyClosed: true, source, type }); + } + else if (!dialog.dialogState.interacted) { + return resolve({ userDecision: false, programmaticallyClosed: false, source, type }); + } + } + }); + dialog.dialogState = { interacted: false, decision: null, programmaticallyClosed: false }; + dialog.render(true); + }); } \ No newline at end of file diff --git a/scripts/macros/cloudRune.js b/scripts/macros/cloudRune.js index e6c32f13..9f733295 100644 --- a/scripts/macros/cloudRune.js +++ b/scripts/macros/cloudRune.js @@ -14,7 +14,7 @@ export async function cloudRune({workflowData,workflowType,workflowCombat}) { if(workflow.targets.size > 1) return; if(!game.combat) return; - let findValidTokens = helpers.findValidTokens({initiatingToken: workflow.token, targetedToken: target, itemName: itemName, itemType: "feature", itemChecked: null, reactionCheck: true, sightCheck: true, rangeCheck: true, rangeTotal: 30, dispositionCheck: true, dispositionCheckType: "enemy", workflowType: workflowType, workflowCombat: workflowCombat}); + let findValidTokens = helpers.findValidTokens({initiatingToken: workflow.token, targetedToken: target, itemName: itemName, itemType: "feature", itemChecked: [itemName], reactionCheck: true, sightCheck: true, rangeCheck: true, rangeTotal: 30, dispositionCheck: true, dispositionCheckType: "enemy", workflowType: workflowType, workflowCombat: workflowCombat}); let browserUser; @@ -44,7 +44,7 @@ export async function cloudRune({workflowData,workflowType,workflowCombat}) { result = await socket.executeAsUser("showCloudRuneDialog", browserUser.id, {targetUuids: target.document.uuid, actorUuid: actorUuidPrimary, tokenUuid: validTokenPrimary.document.uuid, initiatingTokenUuid: workflow.token.document.uuid, dialogTitle: dialogTitlePrimary, targetNames: originTokenUuidPrimary, outcomeType: "attack", damageTypes: null, rollTotals: null, itemProperName: itemProperName, source: browserUser.isGM ? "gm" : "user", type: "singleDialog"}); } - const { userDecision, source, type } = result; + const { userDecision, returnedTokenUuid, source, type } = result; if (userDecision === false || !userDecision) { if(source && source === "user" && type === "multiDialog") await socket.executeAsGM("closeDialogById", { dialogId: dialogId }); @@ -55,6 +55,16 @@ export async function cloudRune({workflowData,workflowType,workflowCombat}) { let rerollNew = await new Roll(`${workflow.attackRoll.result}`).roll({async: true}); let newItemData = workflow.item; + newItemData = newItemData.clone({ + system: { + "range": { + "value": null, + "long": null, + "units": "" + } + } + }, { keepId: true }); + newItemData.prepareData(); newItemData.prepareFinalAttributes(); @@ -63,7 +73,7 @@ export async function cloudRune({workflowData,workflowType,workflowCombat}) { createWorkflow: true, versatile: false, configureDialog: true, - targetUuids: [workflow.token.document.uuid], + targetUuids: [returnedTokenUuid], workflowOptions: {autoRollDamage: 'always', autoFastDamage: true, autoRollAttack: true, autoFastAttack: true} }; @@ -92,15 +102,28 @@ export async function showCloudRuneDialog({targetUuids, actorUuid, tokenUuid, in let target = fromUuidSync(targetUuids); let browserUser = MidiQOL.playerForActor(originToken.actor); + const nearbyFriendlies = MidiQOL.findNearby(null, originToken.object, 30, { includeToken: true }); + let validTokens = nearbyFriendlies.filter(token => token.document.disposition !== originToken.disposition && MidiQOL.canSee(tokenUuid,token.document.uuid)); + dialogContent = ` -
-
-

${target.actor.name} has been hit by an attack, would you like to use ${itemProperName} to deflect it?

+
+
+

${target.actor.name} has been hit by an attack, would you like to use your ${itemProperName} to deflect it towards another creature?

-
-

Time Remaining

-

${initialTimeLeft} seconds

- +
+
+

Choose who is advantaged:

+ ${validTokens.length >= 1 ? + `` : '

No valid friendlies in range.

' + } +
+
+

Time remaining

+

${initialTimeLeft} seconds

+

+
`; @@ -120,6 +143,8 @@ export async function showCloudRuneDialog({targetUuids, actorUuid, tokenUuid, in if(source && source === "user" && type === "multiDialog") await socket.executeAsGM("closeDialogById", { dialogId: dialogId }); if(source && source === "gm" && type === "multiDialog") await socket.executeAsUser("closeDialogById", browserUser.id, { dialogId: dialogId }); + let returnedTokenUuid = await MidiQOL.tokenForActor(html.find("#targetSelection").val()).document.uuid; + let chosenSpell = await originToken.actor.items.find(i => i.name === itemProperName); chosenSpell.prepareData(); chosenSpell.prepareFinalAttributes(); @@ -133,7 +158,7 @@ export async function showCloudRuneDialog({targetUuids, actorUuid, tokenUuid, in }; const itemRoll = await MidiQOL.completeItemUse(chosenSpell, {}, options); - if(itemRoll.aborted === true) return resolve({ userDecision: false, programmaticallyClosed: false, source, type }); + if(itemRoll.aborted === true) return resolve({ userDecision: false, returnedTokenUuid: false, programmaticallyClosed: false, source, type }); if(itemRoll) { const uuid = originToken.actor.uuid; const hasEffectApplied = await game.dfreds.effectInterface.hasEffectApplied('Reaction', uuid); @@ -145,7 +170,7 @@ export async function showCloudRuneDialog({targetUuids, actorUuid, tokenUuid, in let userDecision = true; - resolve({userDecision, programmaticallyClosed: false, source, type}); + resolve({userDecision, returnedTokenUuid, programmaticallyClosed: false, source, type}); } }, no: { @@ -154,7 +179,7 @@ export async function showCloudRuneDialog({targetUuids, actorUuid, tokenUuid, in // Reaction Declined dialog.dialogState.interacted = true; dialog.dialogState.decision = "no"; - resolve({ userDecision: false, programmaticallyClosed: false, source, type}); + resolve({ userDecision: false, returnedTokenUuid: false, programmaticallyClosed: false, source, type}); } }, }, default: "no", @@ -196,10 +221,10 @@ export async function showCloudRuneDialog({targetUuids, actorUuid, tokenUuid, in close: () => { clearInterval(timer); if (dialog.dialogState.programmaticallyClosed) { - resolve({ userDecision: false, programmaticallyClosed: true, source, type }); + resolve({ userDecision: false, returnedTokenUuid: false, programmaticallyClosed: true, source, type }); } else if (!dialog.dialogState.interacted) { - resolve({ userDecision: false, programmaticallyClosed: false, source, type }); + resolve({ userDecision: false, returnedTokenUuid: false, programmaticallyClosed: false, source, type }); } } }); diff --git a/scripts/macros/opportunityAttack.js b/scripts/macros/opportunityAttack.js index eacce315..5fd09455 100644 --- a/scripts/macros/opportunityAttack.js +++ b/scripts/macros/opportunityAttack.js @@ -107,19 +107,19 @@ export async function enableOpportunityAttack(combat, combatEvent) { "templatemacro": { "never": { "asGM": false, - "command": "let { dialogTitle,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid } = this;\n\nlet result;\nlet effectOriginActor = await fromUuid(effectOriginActorUuid);\nlet browserUser = MidiQOL.playerForActor(effectOriginActor);\nif (!browserUser.active) {\n browserUser = game.users?.activeGM;\n}\nlet dialogId = \"opportunityattack\";\n\nif (MidiQOL.safeGetGameSetting('gambits-premades', 'Mirror 3rd Party Dialog for GMs') && browserUser.id !== game.users?.activeGM.id) {\n let userDialogPromise = game.gps.socket.executeAsUser(\"showOpportunityAttackDialog\", browserUser.id, {dialogTitle,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid, dialogId: dialogId, source: \"user\", type: \"multiDialog\"});\n \n let gmDialogPromise = game.gps.socket.executeAsGM(\"showOpportunityAttackDialog\", {dialogTitle,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid, dialogId: dialogId, source: \"gm\", type: \"multiDialog\"});\n\n result = await game.gps.socket.executeAsGM(\"handleDialogPromises\", userDialogPromise, gmDialogPromise);\n} else {\n result = await game.gps.socket.executeAsUser(\"showOpportunityAttackDialog\", browserUser.id, {dialogTitle,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid, source: browserUser.isGM ? \"gm\" : \"user\", type: \"singleDialog\"});\n}\n \nconst { userDecision, source, type } = result;\n\nif(source && source === \"user\" && type === \"multiDialog\") await game.gps.socket.executeAsGM(\"closeDialogById\", { dialogId: dialogId });\nif(source && source === \"gm\" && type === \"multiDialog\") await game.gps.socket.executeAsUser(\"closeDialogById\", browserUser.id, { dialogId: dialogId });\nreturn;" + "command": "let { dialogTitle,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid } = this;\n\nlet result;\nlet effectOriginActor = await fromUuid(effectOriginActorUuid);\nlet browserUser = MidiQOL.playerForActor(effectOriginActor);\nif (!browserUser.active) {\n browserUser = game.users?.activeGM;\n}\nlet dialogId = \"opportunityattack\";\nconst dialogTitlePrimary = `${effectOriginActor.name} | ${dialogTitle}`;\nconst dialogTitleGM = `Waiting for ${effectOriginActor.name}'s selection | ${dialogTitle}`;\n\nif (MidiQOL.safeGetGameSetting('gambits-premades', 'Mirror 3rd Party Dialog for GMs') && browserUser.id !== game.users?.activeGM.id) {\n let userDialogPromise = game.gps.socket.executeAsUser(\"showOpportunityAttackDialog\", browserUser.id, {dialogTitlePrimary,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid, dialogId: dialogId, source: \"user\", type: \"multiDialog\"});\n \n let gmDialogPromise = game.gps.socket.executeAsGM(\"showOpportunityAttackDialog\", {dialogTitleGM,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid, dialogId: dialogId, source: \"gm\", type: \"multiDialog\"});\n\n result = await game.gps.socket.executeAsGM(\"handleDialogPromises\", userDialogPromise, gmDialogPromise);\n} else {\n result = await game.gps.socket.executeAsUser(\"showOpportunityAttackDialog\", browserUser.id, {dialogTitlePrimary,effectOriginTokenUuid,effectOriginActorUuid,tokenUuid,braceItemUuid, source: browserUser.isGM ? \"gm\" : \"user\", type: \"singleDialog\"});\n}\n \nconst { userDecision, source, type } = result;\n\nif(source && source === \"user\" && type === \"multiDialog\") await game.gps.socket.executeAsGM(\"closeDialogById\", { dialogId: dialogId });\nif(source && source === \"gm\" && type === \"multiDialog\") await game.gps.socket.executeAsUser(\"closeDialogById\", browserUser.id, { dialogId: dialogId });\nreturn;" }, "whenThrough": { "asGM": false, - "command": "let oaDisabled = await template.getFlag(\"midi-qol\", \"opportunityAttackDisabled\");\nif(oaDisabled) return;\nif (this.hook.animate === false || (token.actor.type !== 'npc' && token.actor.type !== 'character')) return;\nlet gameVersion = parseInt(game.system.version.split('.')[0], 10);\n\nlet currentCombatant = canvas.tokens.get(game.combat.current.tokenId);\nif (currentCombatant.id !== token.id && currentCombatant.document.disposition === token.document.disposition) return; // Avoid initiating opportunity attack when it's not a token's turn if they are doing something like riding another allied token. This should allow for dialog to fire if forced movement via an enemy spell moves the token outside range outside of their turn but not when being moved as part of an allied unit\nconst effectNamesToken = [\"Dissonant Whispers\"];\nlet hasEffectToken = (gameVersion >= 3 ? token.actor.appliedEffects : token.actor.effects)\n .some(effect => effectNamesToken.includes(effect.name));\nif (currentCombatant.id !== token.id && !hasEffectToken) return;\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\n//Simple elevation check in lieu of a more robust option for actually triggering OA on elevation change\nif((token.document.elevation > (effectOriginToken.document.elevation + template.distance)) || (token.document.elevation < (effectOriginToken.document.elevation - template.distance))) return;\n\nawait template.callMacro(\"never\", { dialogTitle: `${effectOriginActor.name} | Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });" + "command": "let oaDisabled = await template.getFlag(\"midi-qol\", \"opportunityAttackDisabled\");\nif(oaDisabled) return;\nif (this.hook.animate === false || (token.actor.type !== 'npc' && token.actor.type !== 'character')) return;\nlet gameVersion = parseInt(game.system.version.split('.')[0], 10);\n\nlet currentCombatant = canvas.tokens.get(game.combat.current.tokenId);\nif (currentCombatant.id !== token.id && currentCombatant.document.disposition === token.document.disposition) return; // Avoid initiating opportunity attack when it's not a token's turn if they are doing something like riding another allied token. This should allow for dialog to fire if forced movement via an enemy spell moves the token outside range outside of their turn but not when being moved as part of an allied unit\nconst effectNamesToken = [\"Dissonant Whispers\"];\nlet hasEffectToken = (gameVersion >= 3 ? token.actor.appliedEffects : token.actor.effects)\n .some(effect => effectNamesToken.includes(effect.name));\nif (currentCombatant.id !== token.id && !hasEffectToken) return;\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\n//Simple elevation check in lieu of a more robust option for actually triggering OA on elevation change\nif((token.document.elevation > (effectOriginToken.document.elevation + template.distance)) || (token.document.elevation < (effectOriginToken.document.elevation - template.distance))) return;\n\nawait template.callMacro(\"never\", { dialogTitle: `Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });" }, "whenLeft": { "asGM": false, - "command": "let oaDisabled = await template.getFlag(\"midi-qol\", \"opportunityAttackDisabled\");\nif(oaDisabled) return;\nif (this.hook.animate === false || (token.actor.type !== 'npc' && token.actor.type !== 'character')) return;\nlet gameVersion = parseInt(game.system.version.split('.')[0], 10);\n\nlet currentCombatant = canvas.tokens.get(game.combat.current.tokenId);\nif (currentCombatant.id !== token.id && currentCombatant.document.disposition === token.document.disposition) return; // Avoid initiating opportunity attack when it's not a token's turn if they are doing something like riding another allied token. This should allow for dialog to fire if forced movement via an enemy spell moves the token outside range outside of their turn but not when being moved as part of an allied unit\nconst effectNamesToken = [\"Dissonant Whispers\"];\nlet hasEffectToken = (gameVersion >= 3 ? token.actor.appliedEffects : token.actor.effects)\n .some(effect => effectNamesToken.includes(effect.name));\nif (currentCombatant.id !== token.id && !hasEffectToken) return;\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\n//Simple elevation check in lieu of a more robust option for actually triggering OA on elevation change\nif((token.document.elevation > (effectOriginToken.document.elevation + template.distance)) || (token.document.elevation < (effectOriginToken.document.elevation - template.distance))) return;\n\nlet dragonTurtleShield = effectOriginActor.items.getName(\"Dragon Turtle Dueling Shield\");\nif(dragonTurtleShield) await effectOriginActor.setFlag(\"midi-qol\", \"dragonTurtleShieldOA\", true)\n\nawait template.callMacro(\"never\", { dialogTitle: `${effectOriginActor.name} | Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });" + "command": "let oaDisabled = await template.getFlag(\"midi-qol\", \"opportunityAttackDisabled\");\nif(oaDisabled) return;\nif (this.hook.animate === false || (token.actor.type !== 'npc' && token.actor.type !== 'character')) return;\nlet gameVersion = parseInt(game.system.version.split('.')[0], 10);\n\nlet currentCombatant = canvas.tokens.get(game.combat.current.tokenId);\nif (currentCombatant.id !== token.id && currentCombatant.document.disposition === token.document.disposition) return; // Avoid initiating opportunity attack when it's not a token's turn if they are doing something like riding another allied token. This should allow for dialog to fire if forced movement via an enemy spell moves the token outside range outside of their turn but not when being moved as part of an allied unit\nconst effectNamesToken = [\"Dissonant Whispers\"];\nlet hasEffectToken = (gameVersion >= 3 ? token.actor.appliedEffects : token.actor.effects)\n .some(effect => effectNamesToken.includes(effect.name));\nif (currentCombatant.id !== token.id && !hasEffectToken) return;\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\n//Simple elevation check in lieu of a more robust option for actually triggering OA on elevation change\nif((token.document.elevation > (effectOriginToken.document.elevation + template.distance)) || (token.document.elevation < (effectOriginToken.document.elevation - template.distance))) return;\n\nlet dragonTurtleShield = effectOriginActor.items.getName(\"Dragon Turtle Dueling Shield\");\nif(dragonTurtleShield) await effectOriginActor.setFlag(\"midi-qol\", \"dragonTurtleShieldOA\", true)\n\nawait template.callMacro(\"never\", { dialogTitle: `Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });" }, "whenEntered": { "asGM": false, - "command": "let oaDisabled = await template.getFlag(\"midi-qol\", \"opportunityAttackDisabled\");\nif(oaDisabled) return;\nif (this.hook.animate === false || (token.actor.type !== 'npc' && token.actor.type !== 'character')) return;\nlet gameVersion = parseInt(game.system.version.split('.')[0], 10);\n\nlet currentCombatant = canvas.tokens.get(game.combat.current.tokenId);\nif (currentCombatant.id !== token.id && currentCombatant.document.disposition === token.document.disposition) return; //Avoid initiating opportunity attack when it's not a tokens turn if they are doing something like riding another allied token. This should allow for dialog to fire if forced movement via an enemy spell moves the token outside range outside of their turn but not when being moved as part of an allied unit\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\n//Simple elevation check in lieu of a more robust option for actually triggering OA on elevation change\nif((token.document.elevation > (effectOriginToken.document.elevation + template.distance)) || (token.document.elevation < (effectOriginToken.document.elevation - template.distance))) return;\n\nlet hasPolearmReaction = effectOriginActor.items.find(i => i.name.toLowerCase() === \"polearm master\");\nif (hasPolearmReaction) {\nlet weaponNames = [\"glaive\",\"halberd\",\"pike\",\"quarterstaff\",\"spear\"];\nlet hasPolearmWeapon;\nif(gameVersion >= 3) {\n hasPolearmWeapon = effectOriginActor.items.some(item => item.system?.type?.baseItem && weaponNames.includes(item.system?.type?.baseItem.toLowerCase()) && item.system.equipped === true);\n}\nelse {\n hasPolearmWeapon = effectOriginActor.items.some(item => item.system?.baseItem && weaponNames.includes(item.system?.baseItem.toLowerCase()) && item.system.equipped === true);\n}\nif(!hasPolearmWeapon) return;\n\nawait template.callMacro(\"never\", { dialogTitle: `${effectOriginActor.name} | Polearm Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });\n}\n\nif(effectOriginActor.classes?.fighter && effectOriginActor.classes?.fighter?.subclass?.name === \"Battle Master\") {\n\nlet braceItem = effectOriginActor.items.getName(\"Maneuvers: Brace\");\n\nif(!braceItem) return;\n\nconst superiorityNames = [\"superiority dice\", \"superiority die\"];\n\nlet resourceExistsWithValue = [effectOriginActor.system.resources.primary, effectOriginActor.system.resources.secondary, effectOriginActor.system.resources.tertiary].some(resource =>\n superiorityNames.includes(resource?.label.toLowerCase()) && resource.value !== 0);\nlet itemExistsWithValue;\n\nif (!resourceExistsWithValue) {\n itemExistsWithValue = !!effectOriginActor.items.find(i => superiorityNames.includes(i.name.toLowerCase()) && i.system.uses.value !== 0);\n}\n\nif (!resourceExistsWithValue && !itemExistsWithValue) return;\n\nawait template.callMacro(\"never\", { dialogTitle: `${effectOriginActor.name} | Maneuvers: Brace Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid, braceItemUuid: braceItem.uuid });\n}\n\nlet hasDeadlyReachReaction = effectOriginActor.items.find(i => i.name.toLowerCase() === \"deadly reach\");\nif (hasDeadlyReachReaction) {\n await template.callMacro(\"never\", { dialogTitle: `${effectOriginActor.name} | Deadly Reach Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });\n}" + "command": "let oaDisabled = await template.getFlag(\"midi-qol\", \"opportunityAttackDisabled\");\nif(oaDisabled) return;\nif (this.hook.animate === false || (token.actor.type !== 'npc' && token.actor.type !== 'character')) return;\nlet gameVersion = parseInt(game.system.version.split('.')[0], 10);\n\nlet currentCombatant = canvas.tokens.get(game.combat.current.tokenId);\nif (currentCombatant.id !== token.id && currentCombatant.document.disposition === token.document.disposition) return; //Avoid initiating opportunity attack when it's not a tokens turn if they are doing something like riding another allied token. This should allow for dialog to fire if forced movement via an enemy spell moves the token outside range outside of their turn but not when being moved as part of an allied unit\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\n//Simple elevation check in lieu of a more robust option for actually triggering OA on elevation change\nif((token.document.elevation > (effectOriginToken.document.elevation + template.distance)) || (token.document.elevation < (effectOriginToken.document.elevation - template.distance))) return;\n\nlet hasPolearmReaction = effectOriginActor.items.find(i => i.name.toLowerCase() === \"polearm master\");\nif (hasPolearmReaction) {\nlet weaponNames = [\"glaive\",\"halberd\",\"pike\",\"quarterstaff\",\"spear\"];\nlet hasPolearmWeapon;\nif(gameVersion >= 3) {\n hasPolearmWeapon = effectOriginActor.items.some(item => item.system?.type?.baseItem && weaponNames.includes(item.system?.type?.baseItem.toLowerCase()) && item.system.equipped === true);\n}\nelse {\n hasPolearmWeapon = effectOriginActor.items.some(item => item.system?.baseItem && weaponNames.includes(item.system?.baseItem.toLowerCase()) && item.system.equipped === true);\n}\nif(!hasPolearmWeapon) return;\n\nawait template.callMacro(\"never\", { dialogTitle: `Polearm Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });\n}\n\nif(effectOriginActor.classes?.fighter && effectOriginActor.classes?.fighter?.subclass?.name === \"Battle Master\") {\n\nlet braceItem = effectOriginActor.items.getName(\"Maneuvers: Brace\");\n\nif(!braceItem) return;\n\nconst superiorityNames = [\"superiority dice\", \"superiority die\"];\n\nlet resourceExistsWithValue = [effectOriginActor.system.resources.primary, effectOriginActor.system.resources.secondary, effectOriginActor.system.resources.tertiary].some(resource =>\n superiorityNames.includes(resource?.label.toLowerCase()) && resource.value !== 0);\nlet itemExistsWithValue;\n\nif (!resourceExistsWithValue) {\n itemExistsWithValue = !!effectOriginActor.items.find(i => superiorityNames.includes(i.name.toLowerCase()) && i.system.uses.value !== 0);\n}\n\nif (!resourceExistsWithValue && !itemExistsWithValue) return;\n\nawait template.callMacro(\"never\", { dialogTitle: `Maneuvers: Brace Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid, braceItemUuid: braceItem.uuid });\n}\n\nlet hasDeadlyReachReaction = effectOriginActor.items.find(i => i.name.toLowerCase() === \"deadly reach\");\nif (hasDeadlyReachReaction) {\n await template.callMacro(\"never\", { dialogTitle: `Deadly Reach Opportunity Attack`, effectOriginTokenUuid: effectOriginToken.document.uuid, effectOriginActorUuid: effectOriginActor.uuid, tokenUuid: token.document.uuid });\n}" }, "whenDeleted": { "asGM": false, @@ -129,7 +129,7 @@ export async function enableOpportunityAttack(combat, combatEvent) { "asGM": true, "command": "let gameVersion = parseInt(game.system.version.split('.')[0], 10);\nlet oaEnabled = MidiQOL.safeGetGameSetting('gambits-premades', 'Enable Opportunity Attack');\nif(!oaEnabled) return;\nlet legacy = MidiQOL.safeGetGameSetting('gambits-premades', 'Enable Opportunity Attack Legacy System');\n\nconst effectOriginActor = await fromUuid(template.flags[\"midi-qol\"].actorUuid);\nconst effectOriginToken = await MidiQOL.tokenForActor(effectOriginActor.uuid);\n\nlet recalculate = false;\nlet tokenSize = Math.max(effectOriginToken.document.width, effectOriginToken.document.height);\nlet validWeapons = effectOriginActor.items.filter(item => (item.system.actionType === \"mwak\" && item.system.equipped) || (item.system?.type?.value === \"monster\" && item?.type === \"feat\" && (item.system?.actionType === \"mwak\" || item.system?.actionType === \"msak\")) || (item?.type === \"weapon\" && item.system?.actionType === \"msak\"));\n\nrecalculate = await checkAndSetFlag(\"opportunityAttackTemplateValidWeapons\", validWeapons) || recalculate;\nrecalculate = await checkAndSetFlag(\"opportunityAttackTemplateTokenSize\", tokenSize) || recalculate;\nrecalculate = await handleMWAKRange() || recalculate;\n\nif (!recalculate) return;\n\nconst validSpells = template.flags[\"midi-qol\"].opportunityAttackTemplateValidSpells;\nlet maxRange = calculateMaxRange(validWeapons, validSpells, gameVersion, tokenSize);\n\nawait effectOriginActor.setFlag(\"midi-qol\", \"opportunityAttackTemplateValidOptions\", validWeapons.length > 0 || validSpells.length > 0);\n\n// Update the template with the new range\nawait template.update({\"distance\": maxRange});\nawait template.setFlag(\"midi-qol\", \"opportunityAttackDisabled\", false);\nawait tokenAttacher.attachElementsToToken([template], effectOriginToken, false);\n \nasync function checkAndSetFlag(property, newValue) {\n const oldValue = JSON.stringify(template.flags[\"midi-qol\"][property]);\n if (oldValue !== JSON.stringify(newValue)) {\n await template.setFlag(\"midi-qol\", property, newValue);\n return true;\n }\n return false;\n}\n\nasync function handleMWAKRange() {\n if (!effectOriginActor.flags[\"midi-qol\"]?.range?.mwak) return false;\n\n let mwakExpire = effectOriginActor.appliedEffects\n .filter(effect => effect.duration.turns == 1)\n .reduce((acc, effect) => {\n const change = effect.changes.find(change => change.key == \"flags.midi-qol.range.mwak\");\n return change ? acc + Number(change.value) : acc;\n }, 0);\n\n let mwakRange = effectOriginActor.flags[\"midi-qol\"].range.mwak - mwakExpire;\n return await checkAndSetFlag(\"opportunityAttackTemplateMwakRange\", mwakRange);\n}\n\nfunction calculateMaxRange(validWeapons, validSpells, gameVersion, tokenSize) {\n const units = canvas.scene.grid.units;\n let conversionFactor;\n if (units === \"feet\" || units === \"f\" || units === \"ft\") {\n conversionFactor = 1;\n } else if (units === \"meters\" || units === \"m\" || units === \"mt\") {\n conversionFactor = 0.3;\n }\n\n const tokenSizeOffset = tokenSize * 0.5 * canvas.scene.dimensions.distance;\n\n if (!validWeapons.length && !validSpells.length) return;\n\n let onlyThrownWeapons = validWeapons.length > 0 && validWeapons.every(item => {\n return gameVersion >= 3 ? item.system.properties.has('thr') : item.system.properties.thr;\n });\n\n let maxRange;\n\n if (onlyThrownWeapons || (validSpells.length && !validWeapons.length)) {\n maxRange = 5;\n } else {\n maxRange = validWeapons.reduce((max, item) => {\n let rangeValue = item.system.range?.value;\n let noThr = gameVersion >= 3 ? !item.system.properties?.has('thr') : !item.system.properties?.thr;\n if (rangeValue && !isNaN(rangeValue) && noThr) {\n return Math.max(max, rangeValue);\n }\n return max;\n }, 0);\n }\n\n if (effectOriginToken.document.width === 1 && maxRange === 10) maxRange += 1.7;\n if (effectOriginToken.document.width === 2 && maxRange === 5) maxRange += 0.7;\n if (effectOriginToken.document.width === 3 && maxRange === 5) maxRange += 1.7;\n if (effectOriginToken.document.width === 3 && maxRange === 10) maxRange += 0.7;\n if (effectOriginToken.document.width === 4 && maxRange === 10) maxRange += 1.6;\n\n maxRange = (maxRange * conversionFactor) + tokenSizeOffset;\n\n if (effectOriginActor.flags[\"midi-qol\"]?.range?.mwak) {\n maxRange += (template.flags[\"midi-qol\"].opportunityAttackTemplateMwakRange * conversionFactor);\n }\n return maxRange;\n}" } - } + }, }, 'angle': 0 }; diff --git a/scripts/module.js b/scripts/module.js index 009f6e1d..be76415d 100644 --- a/scripts/module.js +++ b/scripts/module.js @@ -9,8 +9,9 @@ import { sentinel, showSentinelDialog } from './macros/sentinel.js'; import { riposte, showRiposteDialog } from './macros/riposte.js'; import { witchesHex, showWitchesHexDialog } from './macros/witchesHex.js'; import { powerWordRebound, showPowerWordReboundDialog } from './macros/powerWordRebound.js'; +import { cloudRune, showCloudRuneDialog } from './macros/cloudRune.js'; import { enableOpportunityAttack, disableOpportunityAttack, showOpportunityAttackDialog } from './macros/opportunityAttack.js'; -import { deleteChatMessage, gmIdentifyItem, closeDialogById, handleDialogPromises, rollAsUser, convertFromFeet, gmUpdateTemplateSize, findValidTokens, pauseDialogById, freeSpellUse } from './helpers.js'; +import { deleteChatMessage, gmIdentifyItem, closeDialogById, handleDialogPromises, rollAsUser, convertFromFeet, gmUpdateTemplateSize, findValidTokens, pauseDialogById, freeSpellUse, process3rdPartyReactionDialog } from './helpers.js'; export let socket; Hooks.once('init', async function() { @@ -56,6 +57,9 @@ Hooks.once('socketlib.ready', async function() { socket.register("showOpportunityAttackDialog", showOpportunityAttackDialog); socket.register("powerWordRebound", powerWordRebound); socket.register("showPowerWordReboundDialog", showPowerWordReboundDialog); + socket.register("cloudRune", cloudRune); + socket.register("showCloudRuneDialog", showCloudRuneDialog); + socket.register("process3rdPartyReactionDialog", process3rdPartyReactionDialog); }) Hooks.once('ready', async function() { @@ -71,6 +75,7 @@ Hooks.once('ready', async function() { gmUpdateTemplateSize, freeSpellUse, showOpportunityAttackDialog, + process3rdPartyReactionDialog, socket }; @@ -107,6 +112,7 @@ Hooks.once('ready', async function() { if (game.gpsSettings.sentinelEnabled) await executeWorkflow({ workflowItem: "sentinel", workflowData: workflowItemUuid, workflowType: "attack", workflowCombat: true }); if (game.gpsSettings.protectionEnabled && game.gpsSettings.enableProtectionOnSuccess) await executeWorkflow({ workflowItem: "protection", workflowData: workflowItemUuid, workflowType: "attack", workflowCombat: true }); if (game.gpsSettings.powerWordReboundEnabled) await executeWorkflow({ workflowItem: "powerWordRebound", workflowData: workflowItemUuid, workflowType: "attack", workflowCombat: true }); + if (game.gpsSettings.cloudRuneEnabled) await executeWorkflow({ workflowItem: "cloudRune", workflowData: workflowItemUuid, workflowType: "attack", workflowCombat: true }); }); Hooks.on("midi-qol.postAttackRollComplete", async (workflow) => { @@ -234,6 +240,9 @@ async function updateSettings(settingKey = null) { if (settingKey === null || settingKey === 'gambits-premades.Enable Power Word Rebound') { game.gpsSettings.powerWordReboundEnabled = game.settings.get('gambits-premades', 'Enable Power Word Rebound'); } + if (settingKey === null || settingKey === 'gambits-premades.Enable Cloud Rune') { + game.gpsSettings.cloudRuneEnabled = game.settings.get('gambits-premades', 'Enable Cloud Rune'); + } } Hooks.on('updateSetting', (setting) => { diff --git a/scripts/settings.js b/scripts/settings.js index 79b36397..90d849a1 100644 --- a/scripts/settings.js +++ b/scripts/settings.js @@ -301,9 +301,34 @@ function registerSettings() { } }); + game.settings.register('gambits-premades', 'Enable Cloud Rune', { + name: "Enable Cloud Rune", + hint: "If enabled, this will present an appropriate dialog to users with the cloud rune feature, and automate application when used.", + scope: 'world', + config: false, + type: Boolean, + default: false + }); + + game.settings.register('gambits-premades', 'Cloud Rune Timeout', { + name: "Cloud Rune Timeout", + hint: "Enter custom number (in seconds). Default timeout value is 30 seconds.", + scope: 'world', + config: false, + type: String, + default: "30", + onChange: value => { + const numericValue = Number(value); + if (!isNaN(numericValue)) { + } else { + console.error("Invalid input for Numeric Setting Example: Not a number."); + } + } + }); + game.settings.register('gambits-premades', 'Enable Identify Restrictions', { name: "Enable Identify Restrictions", - hint: "If enabled, this will prevent player characters from Identifying unidentified items through usual methods.", + hint: "If enabled, this will prevent player characters from Identifying unidentified items except through the use of my Identify spell automation.", scope: 'world', config: true, type: Boolean, @@ -619,6 +644,8 @@ class classFeaturesSettingsMenu extends BaseSettingsMenu { riposteTimeout: game.settings.get("gambits-premades", "Riposte Timeout"), enableWitchesHex: game.settings.get("gambits-premades", "Enable Witches Hex"), witchesHexTimeout: game.settings.get("gambits-premades", "Witches Hex Timeout"), + enableCloudRune: game.settings.get("gambits-premades", "Enable Cloud Rune"), + cloudRuneTimeout: game.settings.get("gambits-premades", "Cloud Rune Timeout") }; return data; @@ -644,6 +671,8 @@ class classFeaturesSettingsMenu extends BaseSettingsMenu { await game.settings.set("gambits-premades", "Riposte Timeout", formData.riposteTimeout); await game.settings.set("gambits-premades", "Enable Witches Hex", formData.enableWitchesHex); await game.settings.set("gambits-premades", "Witches Hex Timeout", formData.witchesHexTimeout); + await game.settings.set("gambits-premades", "Enable Cloud Rune", formData.enableCloudRune); + await game.settings.set("gambits-premades", "Cloud Rune Timeout", formData.cloudRuneTimeout); } } diff --git a/templates/classFeaturesSettingsMenu.html b/templates/classFeaturesSettingsMenu.html index c0d1f87d..b9392e48 100644 --- a/templates/classFeaturesSettingsMenu.html +++ b/templates/classFeaturesSettingsMenu.html @@ -118,7 +118,22 @@ -