Initial public release setup

Add QuickTransfer source, pluginmaster feed, MIT license, and GitHub Actions release workflow.
This commit is contained in:
2026-01-25 18:07:19 -05:00
commit 3565bcd7f9
10 changed files with 2514 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
name: Release
on:
push:
tags:
- "v*"
permissions:
contents: write
jobs:
build-release:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "10.0.x"
- name: Fetch Dalamud SDK libs (api14)
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$url = "https://raw.githubusercontent.com/goatcorp/dalamud-distrib/main/api14/latest.zip"
$tmp = Join-Path $env:RUNNER_TEMP "dalamud"
$zip = Join-Path $tmp "dalamud.zip"
$dst = Join-Path $tmp "extracted"
New-Item -ItemType Directory -Force $dst | Out-Null
Invoke-WebRequest -Uri $url -OutFile $zip
Expand-Archive -Path $zip -DestinationPath $dst -Force
$dalamudDll = Get-ChildItem -Path $dst -Recurse -Filter "Dalamud.dll" | Select-Object -First 1
if (-not $dalamudDll) { throw "Dalamud.dll not found after extracting $url" }
$env:DALAMUD_HOME = $dalamudDll.Directory.FullName
"DALAMUD_HOME=$($env:DALAMUD_HOME)" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- name: Restore
run: dotnet restore
- name: Build (Release)
run: dotnet build -c Release --no-restore
- name: Prepare release zip
shell: pwsh
run: |
$zip = "bin\\Release\\QuickTransfer\\latest.zip"
if (!(Test-Path $zip)) { throw "Expected pack zip not found: $zip" }
Copy-Item $zip "QuickTransfer.zip" -Force
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: |
QuickTransfer.zip
+86
View File
@@ -0,0 +1,86 @@
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
x86/
[Bb]uild/
build/
[Bb]in/
[Oo]bj/
# Visual Studio 2015
.vs/
# NuGet Packages
*.nupkg
packages/
**/packages/*
!packages/repositories.config
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# ReSharper
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity
_TeamCity*
# DotCover
coverage/
# ncRush
*.ncrush*
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Build files
*.mak
# RIA/Silverlight projects
Generated_Code/
# Backup & report files
*_Report.htm
*_Report.html
*.log
Thumbs.db
App.config
# IDE
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Game data
sqpack/
*.sqpack
# Dalamud specific
addon/
hooks/
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 flick
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+1984
View File
File diff suppressed because it is too large Load Diff
+22
View File
@@ -0,0 +1,22 @@
<Project Sdk="Dalamud.NET.Sdk/14.0.1">
<PropertyGroup>
<TargetFramework>net10.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<AssemblyName>QuickTransfer</AssemblyName>
<RootNamespace>QuickTransfer</RootNamespace>
<OutputType>Library</OutputType>
<IsPackable>false</IsPackable>
</PropertyGroup>
<!-- Local builds: some setups have DALAMUD_HOME pointing at the XIVLauncher root,
not the actual dev hooks folder. If the resolved DalamudLibPath doesn't contain
Dalamud.dll, fall back to the standard Roaming dev hooks path. -->
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
<_DalamudDevHooksPath>$(APPDATA)\XIVLauncher\addon\Hooks\dev\</_DalamudDevHooksPath>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsOSPlatform('Windows')) and Exists('$(_DalamudDevHooksPath)Dalamud.dll') and !Exists('$(DalamudLibPath)Dalamud.dll')">
<DalamudLibPath>$(_DalamudDevHooksPath)</DalamudLibPath>
</PropertyGroup>
</Project>
+21
View File
@@ -0,0 +1,21 @@
{
"Author": "flick",
"Name": "QuickTransfer",
"InternalName": "QuickTransfer",
"AssemblyVersion": "1.0.0.0",
"Description": "Automate inventory transfers with Shift/Ctrl + Right-Click.",
"ApplicableVersion": "any",
"RepoUrl": "https://github.com/Knack117/QuickTransfer",
"Tags": [
"inventory",
"utility",
"quality of life"
],
"DalamudApiLevel": 14,
"LoadRequiredState": 0,
"LoadSync": false,
"CanUnloadAsync": false,
"LoadPriority": 0,
"Punchline": "Quick item transfer helpers.",
"AcceptsFeedback": true
}
+119
View File
@@ -0,0 +1,119 @@
using System;
using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Windowing;
namespace QuickTransfer;
public class QuickTransferWindow : Window, IDisposable
{
private readonly Configuration _config;
public QuickTransferWindow(Configuration config)
: base("QuickTransfer Settings###QuickTransferConfig")
{
_config = config;
SizeCondition = ImGuiCond.FirstUseEver;
Size = new Vector2(500, 400);
}
public void Dispose()
{
// no-op
}
public override void Draw()
{
// Main settings
ImGui.TextColored(new Vector4(0.4f, 0.8f, 1f, 1f), "QuickTransfer Configuration");
ImGui.Separator();
// Enable/Disable
var enabled = _config.Enabled;
if (ImGui.Checkbox("Enabled###Enabled", ref enabled))
{
_config.Enabled = enabled;
_config.Save();
}
ImGui.SameLine();
ImGui.TextColored(new Vector4(0.7f, 0.7f, 0.7f, 1f), _config.Enabled ? "(Active)" : "(Disabled)");
ImGui.Spacing();
// Debug mode
var debugMode = _config.DebugMode;
if (ImGui.Checkbox("Debug Mode###DebugMode", ref debugMode))
{
_config.DebugMode = debugMode;
_config.Save();
}
ImGui.SameLine();
ImGui.TextColored(new Vector4(0.7f, 0.7f, 0.7f, 0.7f), "(Logs to chat - for troubleshooting)");
ImGui.Spacing();
// Company Chest
var enableCompanyChest = _config.EnableCompanyChest;
if (ImGui.Checkbox("Enable Company Chest (Free Company Chest)###EnableCompanyChest", ref enableCompanyChest))
{
_config.EnableCompanyChest = enableCompanyChest;
_config.Save();
}
ImGui.SameLine();
ImGui.TextColored(new Vector4(0.7f, 0.7f, 0.7f, 0.7f), "(Shift: deposit/withdraw while FC chest is open)");
var autoConfirmQty = _config.AutoConfirmCompanyChestQuantity;
if (ImGui.Checkbox("Auto-confirm Company Chest quantity prompt###AutoConfirmCompanyChestQty", ref autoConfirmQty))
{
_config.AutoConfirmCompanyChestQuantity = autoConfirmQty;
_config.Save();
}
ImGui.SameLine();
ImGui.TextColored(new Vector4(0.85f, 0.75f, 0.45f, 0.9f), "(Best effort; disable if it misbehaves)");
// Transfer cooldown
ImGui.Spacing();
ImGui.Text("Transfer Cooldown (ms):");
ImGui.SameLine();
ImGui.SetNextItemWidth(100);
var cooldown = _config.TransferCooldownMs;
if (ImGui.InputInt("###Cooldown", ref cooldown))
{
_config.TransferCooldownMs = Math.Max(0, Math.Min(1000, cooldown));
_config.Save();
}
ImGui.Spacing();
ImGui.Separator();
// Instructions
ImGui.TextColored(new Vector4(0.4f, 0.8f, 1f, 1f), "How to Use:");
ImGui.BulletText("Hold SHIFT and RIGHT-CLICK to use the open container's quick action");
ImGui.BulletText("Hold CTRL and RIGHT-CLICK to use Armoury actions when a Saddlebag, Retainer, or Company Chest is open (Inventory ↔ Armoury)");
ImGui.BulletText("Inventory + Saddlebags: Inventory → \"Add All to Saddlebag\", Saddlebags → \"Remove All from Saddlebag\"");
ImGui.BulletText("Armoury + Saddlebags: Armoury → \"Add All to Saddlebag\"");
ImGui.BulletText("Inventory + Retainer: Inventory → \"Entrust to Retainer\", Retainer → \"Retrieve from Retainer\"");
ImGui.BulletText("Armoury + Retainer: Armoury → \"Entrust to Retainer\", Retainer → \"Retrieve from Retainer\"");
ImGui.BulletText("Retainer + Saddlebags: Retainer → \"Add All to Saddlebag\", Saddlebags → \"Entrust to Retainer\"");
ImGui.BulletText("Inventory + Armoury (no special container): (Gear) Inventory → \"Place in Armoury Chest\", Armoury → \"Return to Inventory\"");
ImGui.BulletText("Company Chest (FreeCompanyChest) open: Shift+RClick Inventory/Armoury deposits, Shift+RClick Company Chest withdraws (\"Remove\")");
ImGui.BulletText("Use /qt or click 'Open Config' in plugin list to reopen this window");
ImGui.Spacing();
ImGui.Separator();
ImGui.TextColored(new Vector4(0.8f, 0.8f, 0.4f, 1f), "Notes:");
ImGui.BulletText("This uses the game's existing context menu options (no manual slot moving).");
ImGui.BulletText("If an option isn't available for the clicked item, nothing happens.");
ImGui.BulletText("If you tap Shift briefly, the action still triggers (it is captured when the menu opens).");
ImGui.BulletText("For Company Chest deposits, this uses the same UI move function as drag+drop would.");
ImGui.Spacing();
// Save button
if (ImGui.Button("Save & Close###SaveClose"))
{
_config.Save();
IsOpen = false;
}
}
}
+163
View File
@@ -0,0 +1,163 @@
# QuickTransfer - FFXIV Quick Transfer Plugin
A Dalamud plugin for Final Fantasy XIV that enables quick item transfer between inventory containers using **Shift + Right-Click**, by automatically selecting an existing entry from the game's context menu.
## Features
- **Quick Transfer**: Hold Shift and right-click an item to automatically trigger the matching context menu action
- **Cooldown Protection**: Built-in cooldown to prevent accidental double-moves
- **Debug Mode**: For troubleshooting and development
## Installation
### Prerequisites
1. **XIVLauncher**: Download and install from [goatcorp.github.io](https://goatcorp.github.io/)
2. **Dalamud**: Enable plugins in XIVLauncher settings
3. **Dev Plugin Loading**: Enable "Dev Plugin Locations" in Dalamud settings for development builds
4. **.NET SDK**: Install the .NET 10 SDK (this project targets `net10.0-windows`)
### Installing the Plugin
#### Method 1: Custom Dalamud repository (recommended)
1. In-game, open **Dalamud Settings****Experimental**
2. Under **Custom Plugin Repositories**, add this URL:
- `https://raw.githubusercontent.com/Knack117/QuickTransfer/main/pluginmaster.json`
3. Click **Save**
4. Type `/xlplugins` in-game, search for **QuickTransfer**, and click **Install**
#### Method 2: Development build (local)
1. Clone or download this repository
2. Open the solution in Visual Studio 2022
3. Build the solution (Release configuration)
4. In-game, open Dalamud Settings → Experimental → Dev Plugin Locations
5. Add the path to the compiled DLL (typically `bin/Release/QuickTransfer.dll` or `bin/Debug/QuickTransfer.dll`)
6. Type `/xlplugins` in-game and enable QuickTransfer
## Usage
### Quick Transfer (Shift + Right Click)
The plugin only clicks **existing** context menu options when they are available:
- **Inventory + Chocobo Saddlebags**
- Inventory → **Add All to Saddlebag**
- Saddlebags → **Remove All from Saddlebag**
- **Armoury Chest + Chocobo Saddlebags**
- Armoury → **Add All to Saddlebag**
- Saddlebags → **Remove All from Saddlebag**
- **Inventory + Armoury Chest**
- (Gear) Inventory → **Place in Armoury Chest**
- Armoury → **Return to Inventory**
If an option is not present for the clicked item, **nothing happens**.
## Configuration Options
| Setting | Description | Default |
|---------|-------------|---------|
| Enabled | Enable/disable the plugin | True |
| Debug Mode | Log transfer attempts to chat | False |
| Transfer Cooldown | Milliseconds between transfers | 200 |
## Development
### Setting Up Development Environment
1. Install Visual Studio 2022 with the .NET 10 SDK
2. Clone this repository
3. Open `QuickTransfer.csproj`
4. Build the project
### Building
```bash
# Build Debug
dotnet build --configuration Debug
# Build Release
dotnet build --configuration Release
```
### Testing
1. Enable "Dev Plugin Locations" in Dalamud settings
2. Add the path to your build output directory
3. In-game, the plugin will automatically reload when you rebuild
### Project Structure
```
QuickTransfer/
├── QuickTransfer.cs # Main plugin class
├── QuickTransfer.csproj # Project file
├── QuickTransferWindow.cs # Configuration UI
├── pluginmaster.json # Custom repository metadata (for Dalamud)
└── README.md # This file
```
### Adding New Features
1. Fork the repository
2. Create a feature branch
3. Implement your changes
4. Test thoroughly
5. Submit a pull request
## Troubleshooting
### Plugin Not Loading
- Ensure Dalamud is properly installed
- Check that you're using the correct .NET version
- Verify the DLL path is correct in Dev Plugin Locations
### Transfers Not Working
- Make sure the plugin is enabled
- Check that you have both source and target inventories open
- Ensure the target inventory has space
- Try increasing the transfer cooldown
### Game Crashes
- Disable debug mode for normal play
- Reduce the transfer cooldown if set too low
- Report bugs with detailed steps
### Debug Mode
Enable Debug Mode to see transfer attempts in chat:
```
[QuickTransfer] (Shift+RClick) Selected context action 'Remove All from Saddlebag' (idx=0) via deferred OnMenuOpened.
```
## Compatibility
- **Game Version**: Tested on FFXIV 7.0+ (Dawntrail)
- **Dalamud Version**: Uses `Dalamud.NET.Sdk` (targets your installed Dalamud)
- **.NET Version**: .NET 10.0 Windows (`net10.0-windows`)
## Contributing
Contributions are welcome! Please read the contributing guidelines before submitting pull requests.
### Reporting Issues
1. Check existing issues to avoid duplicates
2. Include steps to reproduce
3. Include plugin version and game version
4. Include any relevant logs
## License
This plugin is licensed under the MIT License - see the `LICENSE` file for details.
## Credits
- **goatcorp**: For creating XIVLauncher and Dalamud
- **Dalamud Community**: For the extensive plugin ecosystem
- **Contributors**: Thanks to everyone who has contributed to this project
## Changelog
### Version 1.0.0
- Initial release
- Shift+Right-Click context menu automation for Inventory / Armoury / Saddlebags
+19
View File
@@ -0,0 +1,19 @@
{
"version": 1,
"dependencies": {
"net10.0-windows7.0": {
"DalamudPackager": {
"type": "Direct",
"requested": "[14.0.1, )",
"resolved": "14.0.1",
"contentHash": "y0WWyUE6dhpGdolK3iKgwys05/nZaVf4ZPtIjpLhJBZvHxkkiE23zYRo7K7uqAgoK/QvK5cqF6l3VG5AbgC6KA=="
},
"DotNet.ReproducibleBuilds": {
"type": "Direct",
"requested": "[1.2.39, )",
"resolved": "1.2.39",
"contentHash": "fcFN01tDTIQqDuTwr1jUQK/geofiwjG5DycJQOnC72i1SsLAk1ELe+apBOuZ11UMQG8YKFZG1FgvjZPbqHyatg=="
}
}
}
}
+21
View File
@@ -0,0 +1,21 @@
[
{
"Author": "flick",
"Name": "QuickTransfer",
"InternalName": "QuickTransfer",
"AssemblyVersion": "1.0.0.0",
"Description": "Automate inventory transfers with Shift/Ctrl + Right-Click.",
"ApplicableVersion": "any",
"RepoUrl": "https://github.com/Knack117/QuickTransfer",
"DalamudApiLevel": 14,
"Punchline": "Quick item transfer helpers.",
"Tags": [
"inventory",
"utility",
"quality of life"
],
"AcceptsFeedback": true,
"DownloadLinkInstall": "https://github.com/Knack117/QuickTransfer/releases/latest/download/QuickTransfer.zip",
"DownloadLinkUpdate": "https://github.com/Knack117/QuickTransfer/releases/latest/download/QuickTransfer.zip"
}
]