├── plugins ├── .gitkeep ├── WoLua │ ├── latest.zip │ └── WoLua.json ├── XivEsp │ ├── latest.zip │ └── XivEsp.json ├── TinyCmds │ ├── latest.zip │ └── TinyCmds.json ├── XIVComboVX │ ├── latest.zip │ └── XIVComboVX.json └── BetterFateList │ ├── latest.zip │ └── BetterFateList.json ├── .github └── workflows │ └── regenerate.yml ├── README.md ├── generate_pluginmaster.py └── pluginmaster.json /plugins/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /plugins/WoLua/latest.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VariableVixen/MyDalamudPlugins/HEAD/plugins/WoLua/latest.zip -------------------------------------------------------------------------------- /plugins/XivEsp/latest.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VariableVixen/MyDalamudPlugins/HEAD/plugins/XivEsp/latest.zip -------------------------------------------------------------------------------- /plugins/TinyCmds/latest.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VariableVixen/MyDalamudPlugins/HEAD/plugins/TinyCmds/latest.zip -------------------------------------------------------------------------------- /plugins/XIVComboVX/latest.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VariableVixen/MyDalamudPlugins/HEAD/plugins/XIVComboVX/latest.zip -------------------------------------------------------------------------------- /plugins/BetterFateList/latest.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VariableVixen/MyDalamudPlugins/HEAD/plugins/BetterFateList/latest.zip -------------------------------------------------------------------------------- /plugins/WoLua/WoLua.json: -------------------------------------------------------------------------------- 1 | { 2 | "Author": "VariableVixen", 3 | "Name": "WoLua", 4 | "InternalName": "WoLua", 5 | "AssemblyVersion": "4.2.0", 6 | "Description": "Write custom chat commands by creating lua scripts", 7 | "ApplicableVersion": "any", 8 | "RepoUrl": "https://github.com/VariableVixen/WoLua", 9 | "DalamudApiLevel": 13, 10 | "LoadRequiredState": 0, 11 | "LoadSync": false, 12 | "CanUnloadAsync": false, 13 | "LoadPriority": 0, 14 | "Punchline": "Write your own custom chat commands in lua!", 15 | "AcceptsFeedback": true 16 | } -------------------------------------------------------------------------------- /plugins/TinyCmds/TinyCmds.json: -------------------------------------------------------------------------------- 1 | { 2 | "Author": "VariableVixen", 3 | "Name": "TinyCommands", 4 | "InternalName": "TinyCmds", 5 | "AssemblyVersion": "8.9.5", 6 | "Description": "Adds tiny and simple but useful chat commands, and nothing more. It doesn't even have a UI.", 7 | "ApplicableVersion": "any", 8 | "RepoUrl": "https://github.com/VariableVixen/TinyCommands", 9 | "DalamudApiLevel": 13, 10 | "LoadRequiredState": 0, 11 | "LoadSync": false, 12 | "CanUnloadAsync": false, 13 | "LoadPriority": 0, 14 | "Punchline": "Tiny, GUI-less convenience commands designed to make macros more powerful", 15 | "AcceptsFeedback": true 16 | } -------------------------------------------------------------------------------- /plugins/BetterFateList/BetterFateList.json: -------------------------------------------------------------------------------- 1 | { 2 | "Author": "VariableVixen", 3 | "Name": "BetterFateList", 4 | "InternalName": "BetterFateList", 5 | "AssemblyVersion": "1.0.1.1", 6 | "Description": "Provides a list of all FATEs in the current zone, with their type, sorted by maximum level and distance from you.", 7 | "ApplicableVersion": "any", 8 | "RepoUrl": "https://github.com/VariableVixen/BetterFateList", 9 | "Tags": [ 10 | "fate" 11 | ], 12 | "DalamudApiLevel": 13, 13 | "LoadRequiredState": 0, 14 | "LoadSync": false, 15 | "CanUnloadAsync": false, 16 | "LoadPriority": 0, 17 | "Punchline": "Because the vanilla FATE list kinda sucks.", 18 | "AcceptsFeedback": true 19 | } -------------------------------------------------------------------------------- /plugins/XIVComboVX/XIVComboVX.json: -------------------------------------------------------------------------------- 1 | { 2 | "Author": "attick, daemitus, VariableVixen", 3 | "Name": "XIV Combo Very Expanded", 4 | "InternalName": "XIVComboVX", 5 | "AssemblyVersion": "9.33.9", 6 | "Description": "This plugin condenses combos and mutually exclusive abilities onto a single button. To a degree that some would call absurd, but that's why it's all configurable. Let the players decide.", 7 | "ApplicableVersion": "any", 8 | "RepoUrl": "https://github.com/VariableVixen/XIVComboPlugin", 9 | "DalamudApiLevel": 13, 10 | "LoadRequiredState": 0, 11 | "LoadSync": false, 12 | "CanUnloadAsync": false, 13 | "LoadPriority": 0, 14 | "Punchline": "Why can't I hold all these buttons?", 15 | "AcceptsFeedback": true 16 | } -------------------------------------------------------------------------------- /.github/workflows/regenerate.yml: -------------------------------------------------------------------------------- 1 | name: Regenerate PluginMaster 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: 6 | - master 7 | paths: 8 | - "plugins/**" 9 | jobs: 10 | generate: 11 | name: Regenerate PluginMaster 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/setup-python@v4 15 | with: 16 | python-version: '3.8' 17 | - uses: actions/checkout@v3 18 | - name: Generate PluginMaster 19 | run: python generate_pluginmaster.py 20 | - uses: EndBug/add-and-commit@v9 21 | with: 22 | author_name: GitHub Action 23 | author_email: github-actions[bot]@users.noreply.github.com 24 | message: Regenerate PluginMaster 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vixen's Dalamud Plugins 2 | 3 | [![Support me!](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/V7V7IK9UU) 4 | 5 | Drop `https://raw.githubusercontent.com/VariableVixen/MyDalamudPlugins/master/pluginmaster.json` into your third party repo URL list. 6 | 7 | ## Detailed Instructions 8 | 9 | 1. In the game, type `/xlplugins` to open the plugin installer window. 10 | 2. Click the settings button at the bottom. 11 | 3. Go to the "Experimental" tab at the top. 12 | 4. Paste the above URL into the text bar under the "Custom Plugin Repositories" section. 13 | 5. Click the `+` button on the right of it. 14 | 6. Make sure the "enabled" box is checked! 15 | 7. Hit "save and close" at the bottom. 16 | 17 | Once you do that, the plugin installer window will refresh, and will now include plugins from my custom repo here! 18 | -------------------------------------------------------------------------------- /plugins/XivEsp/XivEsp.json: -------------------------------------------------------------------------------- 1 | { 2 | "Author": "VariableVixen", 3 | "Name": "XivEsp", 4 | "InternalName": "XivEsp", 5 | "AssemblyVersion": "1.10.1.1", 6 | "Description": "If you've ever spent ten minutes looking for your hunt target, this is the plugin for you. Set a case-insensitive substring, glob, or regular expression, and all nearby game objects with matching names will be tagged on your screen!", 7 | "ApplicableVersion": "any", 8 | "RepoUrl": "https://github.com/VariableVixen/XivEsp", 9 | "Tags": [ 10 | "search", 11 | "esp", 12 | "find", 13 | "locate" 14 | ], 15 | "DalamudApiLevel": 13, 16 | "LoadRequiredState": 0, 17 | "LoadSync": false, 18 | "CanUnloadAsync": false, 19 | "LoadPriority": 0, 20 | "Punchline": "Search and tag nearby things based on their name!", 21 | "AcceptsFeedback": true 22 | } -------------------------------------------------------------------------------- /generate_pluginmaster.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | from time import time 4 | from sys import argv 5 | from os.path import getmtime 6 | from zipfile import ZipFile, ZIP_DEFLATED 7 | 8 | DOWNLOAD_URL = 'https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/{plugin_name}/latest.zip' 9 | 10 | DEFAULTS = { 11 | 'IsHide': False, 12 | 'IsTestingExclusive': False, 13 | 'ApplicableVersion': 'any', 14 | } 15 | 16 | DUPLICATES = { 17 | 'DownloadLinkInstall': ['DownloadLinkTesting', 'DownloadLinkUpdate'], 18 | } 19 | 20 | TRIMMED_KEYS = [ 21 | 'Author', 22 | 'Name', 23 | 'Description', 24 | 'InternalName', 25 | 'AssemblyVersion', 26 | 'RepoUrl', 27 | 'ApplicableVersion', 28 | 'Tags', 29 | 'DalamudApiLevel', 30 | 'IsTestingExclusive', 31 | ] 32 | 33 | def main(): 34 | # extract the manifests from inside the zip files 35 | master = extract_manifests() 36 | 37 | # trim the manifests 38 | master = [trim_manifest(manifest) for manifest in master] 39 | 40 | # convert the list of manifests into a master list 41 | add_extra_fields(master) 42 | 43 | # update the LastUpdated field in master 44 | last_updated(master) 45 | 46 | # write the master 47 | write_master(master) 48 | 49 | def extract_manifests(): 50 | manifests = [] 51 | 52 | for dirpath, dirnames, filenames in os.walk('./plugins'): 53 | if len(filenames) == 0 or 'latest.zip' not in filenames: 54 | continue 55 | plugin_name = dirpath.split('/')[-1] 56 | latest_zip = f'{dirpath}/latest.zip' 57 | with ZipFile(latest_zip) as z: 58 | manifest = json.loads(z.read(f'{plugin_name}.json').decode('utf-8')) 59 | manifests.append(manifest) 60 | 61 | return manifests 62 | 63 | def add_extra_fields(manifests): 64 | for manifest in manifests: 65 | # generate the download link from the internal assembly name 66 | manifest['DownloadLinkInstall'] = DOWNLOAD_URL.format(plugin_name=manifest["InternalName"]) 67 | # add default values if missing 68 | for k, v in DEFAULTS.items(): 69 | if k not in manifest: 70 | manifest[k] = v 71 | # duplicate keys as specified in DUPLICATES 72 | for source, keys in DUPLICATES.items(): 73 | for k in keys: 74 | if k not in manifest: 75 | manifest[k] = manifest[source] 76 | manifest['DownloadCount'] = 0 77 | 78 | def write_master(master): 79 | # write as pretty json 80 | with open('pluginmaster.json', 'w') as f: 81 | json.dump(master, f, indent=4) 82 | 83 | def trim_manifest(plugin): 84 | return {k: plugin[k] for k in TRIMMED_KEYS if k in plugin} 85 | 86 | def last_updated(master): 87 | for plugin in master: 88 | latest = f'plugins/{plugin["InternalName"]}/latest.zip' 89 | modified = int(getmtime(latest)) 90 | 91 | if 'LastUpdated' not in plugin or modified != int(plugin['LastUpdated']): 92 | plugin['LastUpdated'] = str(modified) 93 | 94 | if __name__ == '__main__': 95 | main() 96 | -------------------------------------------------------------------------------- /pluginmaster.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "Author": "VariableVixen", 4 | "Name": "BetterFateList", 5 | "Description": "Provides a list of all FATEs in the current zone, with their type, sorted by maximum level and distance from you.", 6 | "InternalName": "BetterFateList", 7 | "AssemblyVersion": "1.0.1.1", 8 | "RepoUrl": "https://github.com/VariableVixen/BetterFateList", 9 | "ApplicableVersion": "any", 10 | "Tags": [ 11 | "fate" 12 | ], 13 | "DalamudApiLevel": 13, 14 | "DownloadLinkInstall": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/BetterFateList/latest.zip", 15 | "IsHide": false, 16 | "IsTestingExclusive": false, 17 | "DownloadLinkTesting": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/BetterFateList/latest.zip", 18 | "DownloadLinkUpdate": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/BetterFateList/latest.zip", 19 | "DownloadCount": 0, 20 | "LastUpdated": "1762196540" 21 | }, 22 | { 23 | "Author": "attick, daemitus, VariableVixen", 24 | "Name": "XIV Combo Very Expanded", 25 | "Description": "This plugin condenses combos and mutually exclusive abilities onto a single button. To a degree that some would call absurd, but that's why it's all configurable. Let the players decide.", 26 | "InternalName": "XIVComboVX", 27 | "AssemblyVersion": "9.33.9", 28 | "RepoUrl": "https://github.com/VariableVixen/XIVComboPlugin", 29 | "ApplicableVersion": "any", 30 | "DalamudApiLevel": 13, 31 | "DownloadLinkInstall": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/XIVComboVX/latest.zip", 32 | "IsHide": false, 33 | "IsTestingExclusive": false, 34 | "DownloadLinkTesting": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/XIVComboVX/latest.zip", 35 | "DownloadLinkUpdate": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/XIVComboVX/latest.zip", 36 | "DownloadCount": 0, 37 | "LastUpdated": "1762196540" 38 | }, 39 | { 40 | "Author": "VariableVixen", 41 | "Name": "XivEsp", 42 | "Description": "If you've ever spent ten minutes looking for your hunt target, this is the plugin for you. Set a case-insensitive substring, glob, or regular expression, and all nearby game objects with matching names will be tagged on your screen!", 43 | "InternalName": "XivEsp", 44 | "AssemblyVersion": "1.10.1.1", 45 | "RepoUrl": "https://github.com/VariableVixen/XivEsp", 46 | "ApplicableVersion": "any", 47 | "Tags": [ 48 | "search", 49 | "esp", 50 | "find", 51 | "locate" 52 | ], 53 | "DalamudApiLevel": 13, 54 | "DownloadLinkInstall": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/XivEsp/latest.zip", 55 | "IsHide": false, 56 | "IsTestingExclusive": false, 57 | "DownloadLinkTesting": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/XivEsp/latest.zip", 58 | "DownloadLinkUpdate": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/XivEsp/latest.zip", 59 | "DownloadCount": 0, 60 | "LastUpdated": "1762196540" 61 | }, 62 | { 63 | "Author": "VariableVixen", 64 | "Name": "TinyCommands", 65 | "Description": "Adds tiny and simple but useful chat commands, and nothing more. It doesn't even have a UI.", 66 | "InternalName": "TinyCmds", 67 | "AssemblyVersion": "8.9.5", 68 | "RepoUrl": "https://github.com/VariableVixen/TinyCommands", 69 | "ApplicableVersion": "any", 70 | "DalamudApiLevel": 13, 71 | "DownloadLinkInstall": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/TinyCmds/latest.zip", 72 | "IsHide": false, 73 | "IsTestingExclusive": false, 74 | "DownloadLinkTesting": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/TinyCmds/latest.zip", 75 | "DownloadLinkUpdate": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/TinyCmds/latest.zip", 76 | "DownloadCount": 0, 77 | "LastUpdated": "1762196540" 78 | }, 79 | { 80 | "Author": "VariableVixen", 81 | "Name": "WoLua", 82 | "Description": "Write custom chat commands by creating lua scripts", 83 | "InternalName": "WoLua", 84 | "AssemblyVersion": "4.2.0", 85 | "RepoUrl": "https://github.com/VariableVixen/WoLua", 86 | "ApplicableVersion": "any", 87 | "DalamudApiLevel": 13, 88 | "DownloadLinkInstall": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/WoLua/latest.zip", 89 | "IsHide": false, 90 | "IsTestingExclusive": false, 91 | "DownloadLinkTesting": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/WoLua/latest.zip", 92 | "DownloadLinkUpdate": "https://github.com/VariableVixen/MyDalamudPlugins/raw/master/plugins/WoLua/latest.zip", 93 | "DownloadCount": 0, 94 | "LastUpdated": "1762196540" 95 | } 96 | ] --------------------------------------------------------------------------------