13 Commits
v1.4 ... v1.8

Author SHA1 Message Date
782d5e2b93 Change to Gitea Actions
All checks were successful
build-release / release (push) Successful in 1m9s
2025-06-25 14:23:40 +01:00
ce4a78454d dev: update for tML v2025.04.3.0 and MagicStorage v0.7.0.4 2025-06-25 14:23:36 +01:00
395bda3972 doc: update repo link in workshop description 2023-09-01 14:11:12 +01:00
a3473a002d ci: fix ci 2023-08-17 18:16:45 +01:00
48b51324fb v1.7 for 1.4.4 2023-08-17 17:53:02 +01:00
0c6328b39d dev: more 1.4.4 fixes, fix CRLF -> LF 2023-08-17 17:44:55 +01:00
278a0d9278 dev: tmodporter changes 2023-08-17 16:37:16 +01:00
d8c4649f92 ci: fix CI again 2023-02-04 13:13:29 +00:00
dd5f7256fc fix: Use new Locator property 2023-02-04 12:52:55 +00:00
5b1a55973b Revert "fix: work around magic storage locator sync bug"
This fix is now part of mainline Magic Storage
2023-02-04 12:47:38 +00:00
d3e63ccfcf ci: try to fix CI 2022-12-03 14:59:08 +00:00
0e4aa1caa5 fix: work around magic storage locator sync bug 2022-11-30 23:50:31 +00:00
87378aeb00 ci: remove broken github-release step 2022-08-14 15:31:04 +01:00
12 changed files with 133 additions and 142 deletions

View File

@ -0,0 +1,52 @@
name: "build-release"
run-name: "Build and Release MSVB"
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: arch-x86
container:
image: git.jackbondpreston.me/jack/msvb-build:latest
steps:
- name: Check out
uses: actions/checkout@v4
with:
path: MagicStorageVoidBag
- run: ls
- run: steamcmd "+login anonymous" "+workshop_download_item 1281930 2563309347" "+quit"
- run: wget https://github.com/tModLoader/tModLoader/releases/latest/download/tModLoader.zip
- run: unzip -q tModLoader.zip -d tModLoader
- run: rm tModLoader.zip
- run: ln -sf ${{ gitea.workspace }}/tModLoader/Libraries/Native/Linux/libSDL2-2.0.so.0 ${{ gitea.workspace }}/tModLoader/Libraries/Native/Linux/libSDL2.so
- run: >
echo "<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">
<Import Project=\"${{ gitea.workspace }}/tModLoader/tMLMod.targets\" />
</Project>" > tModLoader.targets
- run: |
wget https://github.com/steviegt6/fnb/archive/refs/tags/0.1.0.zip
unzip -q 0.1.0.zip -d TMLPatcher
dotnet build --configuration=Release TMLPatcher/fnb-0.1.0/src/
- run: |
rm -f ~/.steam/SteamApps/workshop/content/1281930/2563309347/workshop.json
YEAR=$(ls ~/.steam/SteamApps/workshop/content/1281930/2563309347/ | cut -c -4 | sort -nr | head -n 1)
VER=$(find ~/.steam/SteamApps/workshop/content/1281930/2563309347/ -type d -name "$YEAR.*" -printf "%f\n" | cut -c 6- | sort -nr | head -n 1)
cp ~/.steam/SteamApps/workshop/content/1281930/2563309347/$YEAR.$VER/MagicStorage.tmod ./
- run: dotnet TMLPatcher/fnb-0.1.0/src/Tomat.FNB/bin/Release/net8.0/fnb.dll tmod extract MagicStorage.tmod
- run: cp MagicStorage/MagicStorage.dll ${{ gitea.workspace }}
- run: rm -rf MagicStorageVoidBag/.git
- run: dotnet build -c Release MagicStorageVoidBag/MagicStorageVoidBag.sln || true
- run: cp MagicStorageVoidBag/bin/Release/net8.0/MagicStorageVoidBag.dll .
- run: mkdir release
- run: cp ~/.local/share/Terraria/tModLoader/Mods/MagicStorageVoidBag.tmod release/
- run: cp MagicStorageVoidBag.dll release/
- run: ls release
- name: Add Gitea Release
id: gitea-release
uses: https://gitea.com/actions/release-action@main
with:
files: |-
release/**
api_key: '${{secrets.RELEASE_TOKEN}}'

View File

@ -1,69 +0,0 @@
clone:
git:
image: woodpeckerci/plugin-git:latest
settings:
path: MagicStorageVoidBag
when:
event: tag
pipeline:
fetch-deps:
image: alpine/git:latest
commands:
- git clone https://github.com/blushiemagic/MagicStorage.git
- wget https://github.com/tModLoader/tModLoader/releases/latest/download/tModLoader.zip
- unzip -q tModLoader.zip -d tModLoader
- rm tModLoader.zip
- ln -sf $CI_WORKSPACE/tModLoader/Libraries/Native/Linux/libSDL2-2.0.so.0 $CI_WORKSPACE/tModLoader/Libraries/Native/Linux/libSDL2.so
- >
echo "<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">
<Import Project=\"$CI_WORKSPACE/tModLoader/tMLMod.targets\" />
</Project>" > tModLoader.targets
when:
event: tag
build:
image: jackbondpreston/fna-alpine
commands:
- |
echo "Shell: $SHELL"
echo "CI_WORKSPACE: $CI_WORKSPACE"
- cat tModLoader.targets
- cd MagicStorage && dotnet build -c Release || true
- cp bin/Release/net6.0/MagicStorage.dll .
- cd $CI_WORKSPACE
- cd MagicStorageVoidBag
- rm -rf .git
- dotnet build -c Release || true
- cp bin/Release/net6.0/MagicStorageVoidBag.dll .
- cd $CI_WORKSPACE
- mkdir release
- cp ~/.local/share/Terraria/tModLoader/Mods/MagicStorageVoidBag.tmod release/
- cp MagicStorageVoidBag/MagicStorageVoidBag.dll release/
- ls release
when:
event: tag
gitea-release:
image: plugins/gitea-release
settings:
api_key:
from_secret: gitea-api-key
base_url: https://git.jackbondpreston.me
files: release/*
when:
event: tag
github-release:
image: plugins/github-release
settings:
api_key:
from_secret: github-api-key
base_url: https://github.com/api/v3/
upload_url: https://github.com/api/uploads
files: release/*
environment:
- DRONE_REPO_OWNER=jackbondpreston
- CI_REPO_OWNER=jackbondpreston
when:
event: tag

View File

@ -1,4 +1,5 @@
using MagicStorage; using MagicStorage;
using MagicStorage.Common.Systems;
using MagicStorage.Components; using MagicStorage.Components;
using MagicStorageVoidBag.Items; using MagicStorageVoidBag.Items;
using System.Linq; using System.Linq;
@ -12,7 +13,7 @@ using Terraria.ModLoader;
namespace MagicStorageVoidBag.Hooks { namespace MagicStorageVoidBag.Hooks {
internal class GetItemVoidVaultHook { internal class GetItemVoidVaultHook {
private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger; private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger;
public static bool Hook(On.Terraria.Player.orig_GetItem_VoidVault orig, Player player, int plr, Item[] inventory, Item newItem, GetItemSettings settings, Item returnItem) { public static bool Hook(Terraria.On_Player.orig_GetItem_VoidVault orig, Player player, int plr, Item[] inventory, Item newItem, GetItemSettings settings, Item returnItem) {
var i = player.inventory.FirstOrDefault(i => i.type == ModContent.ItemType<MSVoidBag>(), null); var i = player.inventory.FirstOrDefault(i => i.type == ModContent.ItemType<MSVoidBag>(), null);
newItem = newItem.Clone(); newItem = newItem.Clone();
@ -21,19 +22,19 @@ namespace MagicStorageVoidBag.Hooks {
var bag = (MSVoidBag)i.ModItem; var bag = (MSVoidBag)i.ModItem;
if (bag.location.X < 0 || bag.location.Y < 0) goto original; if (bag.Location.X < 0 || bag.Location.Y < 0) goto original;
Tile tile = Main.tile[bag.location.X, bag.location.Y]; Tile tile = Main.tile[bag.Location.X, bag.Location.Y];
if (!tile.HasTile || tile.TileType != ModContent.TileType<StorageHeart>() || tile.TileFrameX != 0 || tile.TileFrameY != 0) goto original; if (!tile.HasTile || tile.TileType != ModContent.TileType<StorageHeart>() || tile.TileFrameX != 0 || tile.TileFrameY != 0) goto original;
if (!TileEntity.ByPosition.TryGetValue(bag.location, out TileEntity te)) goto original; if (!TileEntity.ByPosition.TryGetValue(bag.Location, out TileEntity te)) goto original;
if (te.type != ModContent.TileEntityType<TEStorageHeart>()) goto original; if (te.type != ModContent.TileEntityType<TEStorageHeart>()) goto original;
TEStorageHeart heart = (TEStorageHeart)te; TEStorageHeart heart = (TEStorageHeart)te;
heart.TryDeposit(returnItem); heart.TryDeposit(returnItem);
heart.ResetCompactStage(); heart.ResetCompactStage();
StorageGUI.needRefresh = true; MagicUI.SetRefresh();
if (returnItem.stack != newItem.stack) { if (returnItem.stack != newItem.stack) {
if (newItem.IsACoin) { if (newItem.IsACoin) {

View File

@ -16,7 +16,7 @@ namespace MagicStorageVoidBag.Hooks {
private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger; private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger;
// Despite the constant negative press cofveve // Despite the constant negative press cofveve
public static bool Hook(On.Terraria.Player.orig_ItemSpaceForCofveve orig, Player player, Item newItem) { public static bool Hook(Terraria.On_Player.orig_ItemSpaceForCofveve orig, Player player, Item newItem) {
var i = player.inventory.FirstOrDefault(i => i.type == ModContent.ItemType<MSVoidBag>(), null); var i = player.inventory.FirstOrDefault(i => i.type == ModContent.ItemType<MSVoidBag>(), null);
if (i == null) goto original; if (i == null) goto original;
@ -24,12 +24,12 @@ namespace MagicStorageVoidBag.Hooks {
var bag = (MSVoidBag)i.ModItem; var bag = (MSVoidBag)i.ModItem;
if (bag.location.X < 0 || bag.location.Y < 0) goto original; if (bag.Location.X < 0 || bag.Location.Y < 0) goto original;
Tile tile = Main.tile[bag.location.X, bag.location.Y]; Tile tile = Main.tile[bag.Location.X, bag.Location.Y];
if (!tile.HasTile || tile.TileType != ModContent.TileType<StorageHeart>() || tile.TileFrameX != 0 || tile.TileFrameY != 0) goto original; if (!tile.HasTile || tile.TileType != ModContent.TileType<StorageHeart>() || tile.TileFrameX != 0 || tile.TileFrameY != 0) goto original;
if (!TileEntity.ByPosition.TryGetValue(bag.location, out TileEntity te)) goto original; if (!TileEntity.ByPosition.TryGetValue(bag.Location, out TileEntity te)) goto original;
if (te.type != ModContent.TileEntityType<TEStorageHeart>()) goto original; if (te.type != ModContent.TileEntityType<TEStorageHeart>()) goto original;
if (Utility.HeartHasSpaceFor(newItem, (TEStorageHeart)te)) return true; if (Utility.HeartHasSpaceFor(newItem, (TEStorageHeart)te)) return true;

View File

@ -13,27 +13,35 @@ namespace MagicStorageVoidBag.ILPatches {
internal class PlayerUpdatePatch : ILPatch { internal class PlayerUpdatePatch : ILPatch {
private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger; private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger;
public void Patch(ILContext il) { public void Patch(ILContext il) {
if (il == null) { try {
Logger.Error("ILContext null!"); if (il == null) {
return; Logger.Error("ILContext null!");
return;
}
Logger.Debug("Patching Terraria.Player.Update IL...");
var c = new ILCursor(il);
var setterMethod = typeof(Player).GetProperty(nameof(Player.IsVoidVaultEnabled)).GetSetMethod();
if (!c.TryGotoNext(i => i.MatchCallOrCallvirt(setterMethod))) {
Logger.Error("Failed to go to next call or callvirt! :(");
return;
}
c.Emit(OpCodes.Ldarg_0);
c.Emit(OpCodes.Ldc_I4, ModContent.ItemType<MSVoidBag>());
var hasItemMethod = typeof(Player).GetMethod(nameof(Player.HasItem), new[] { typeof(int) });
if (hasItemMethod == null) {
Logger.Error("Failed to reflect Player.HasItem(int)! :(");
return;
}
c.Emit(OpCodes.Call, hasItemMethod);
c.Emit(OpCodes.Or);
Logger.Debug("...Complete!");
} catch (Exception e) {
throw new ILPatchFailureException(MagicStorageVoidBag.Instance, il, e);
} }
Logger.Debug("Patching Terraria.Player.Update IL...");
var c = new ILCursor(il);
var setterMethod = typeof(Player).GetProperty(nameof(Player.IsVoidVaultEnabled)).GetSetMethod();
if (!c.TryGotoNext(i => i.MatchCallOrCallvirt(setterMethod))) {
Logger.Warn("Failed to go to next call or callvirt! :(");
return;
}
c.Emit(OpCodes.Ldarg_0);
c.Emit(OpCodes.Ldc_I4, ModContent.ItemType<MSVoidBag>());
var hasItemMethod = typeof(Player).GetMethod(nameof(Player.HasItem));
c.Emit(OpCodes.Call, hasItemMethod);
c.Emit(OpCodes.Or);
Logger.Debug("...Complete!");
} }
} }
} }

View File

@ -27,10 +27,10 @@ namespace MagicStorageVoidBag.Items {
} }
public override void ModifyTooltips(List<TooltipLine> lines) { public override void ModifyTooltips(List<TooltipLine> lines) {
bool isSet = location.X >= 0 && location.Y >= 0; bool isSet = Location.X >= 0 && Location.Y >= 0;
for (int k = 0; k < lines.Count; k++) for (int k = 0; k < lines.Count; k++)
if (isSet && lines[k].Mod == "Terraria" && lines[k].Name == "Tooltip1") { if (isSet && lines[k].Mod == "Terraria" && lines[k].Name == "Tooltip1") {
lines[k].Text = Language.GetTextValue("Mods.MagicStorage.SetTo", location.X, location.Y); lines[k].Text = Language.GetTextValue("Mods.MagicStorage.SetTo", Location.X, Location.Y);
} else if (!isSet && lines[k].Mod == "Terraria" && lines[k].Name == "Tooltip2") { } else if (!isSet && lines[k].Mod == "Terraria" && lines[k].Name == "Tooltip2") {
lines.RemoveAt(k); lines.RemoveAt(k);
k--; k--;

View File

@ -1,15 +1,17 @@
Mods: { Mods: {
MagicStorageVoidBag: { MagicStorageVoidBag: {
ItemName: { ItemName.MSVoidBag: Magic Void Bag
MSVoidBag: Magic Void Bag ItemTooltip.MSVoidBag:
}
ItemTooltip: {
MSVoidBag:
''' '''
<right> Storage Heart to store location <right> Storage Heart to store location
Currently not set to any location Currently not set to any location
''' '''
Items: {
MSVoidBag: {
DisplayName: M S Void Bag
Tooltip: ""
}
} }
} }
} }

View File

@ -11,17 +11,17 @@ namespace MagicStorageVoidBag {
private PlayerUpdatePatch playerUpdatePatch = new(); private PlayerUpdatePatch playerUpdatePatch = new();
public override void Load() { public override void Load() {
IL.Terraria.Player.Update += playerUpdatePatch.Patch; Terraria.IL_Player.Update += playerUpdatePatch.Patch;
On.Terraria.Player.GetItem_VoidVault += GetItemVoidVaultHook.Hook; Terraria.On_Player.GetItem_VoidVault += GetItemVoidVaultHook.Hook;
On.Terraria.Player.ItemSpaceForCofveve += ItemSpaceForCofveveHook.Hook; Terraria.On_Player.ItemSpaceForCofveve += ItemSpaceForCofveveHook.Hook;
} }
public override void Unload() { public override void Unload() {
IL.Terraria.Player.Update -= playerUpdatePatch.Patch; Terraria.IL_Player.Update -= playerUpdatePatch.Patch;
On.Terraria.Player.GetItem_VoidVault -= GetItemVoidVaultHook.Hook; Terraria.On_Player.GetItem_VoidVault -= GetItemVoidVaultHook.Hook;
On.Terraria.Player.ItemSpaceForCofveve -= ItemSpaceForCofveveHook.Hook; Terraria.On_Player.ItemSpaceForCofveve -= ItemSpaceForCofveveHook.Hook;
base.Unload(); base.Unload();
} }

View File

@ -1,14 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<!-- Import tModLoader mod properties -->
<Import Project="../tModLoader.targets" /> <Import Project="../tModLoader.targets" />
<PropertyGroup> <PropertyGroup>
<AssemblyName>MagicStorageVoidBag</AssemblyName> <AssemblyName>MagicStorageVoidBag</AssemblyName>
<TargetFramework>net6.0</TargetFramework>
<PlatformTarget>AnyCPU</PlatformTarget>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="tModLoader.CodeAssist" Version="0.1.*" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="MagicStorage"> <Reference Include="MagicStorage">

View File

@ -1,7 +1,7 @@
displayName = MagicStorage Void Bag displayName = MagicStorage Void Bag
author = jack author = jack
version = 1.4 version = 1.8
modReferences = MagicStorage modReferences = MagicStorage
sortAfter = MagicStorage sortAfter = MagicStorage
includeSource = true includeSource = true
homepage = https://github.com/jackbondpreston/MagicStorageVoidBag homepage = https://git.jackbondpreston.me/jack/MagicStorageVoidBag

View File

@ -1,7 +1,7 @@
Adds an upgraded void bag that combines functionality of the Void Bag and Portable Remote Storage Access, by putting items into a magic storage system when your inventory is full (and allowing remote access as usual). Adds an upgraded void bag that combines functionality of the Void Bag and Portable Remote Storage Access, by putting items into a magic storage system when your inventory is full (and allowing remote access as usual).
This item is crafted by combining a Void Bag with a Portable Remote Storage Access. To link it with your storage system, right click the Storage Heart with the bag equipped. This item is crafted by combining a Void Bag with a Portable Remote Storage Access. To link it with your storage system, right click the Storage Heart with the bag equipped.
GitHub: https://github.com/jackbondpreston/MagicStorageVoidBag Git: https://git.jackbondpreston.me/jack/MagicStorageVoidBag
Discord server if you need support/don't want to report bugs on GitHub: https://discord.gg/Z6V77mbtZQ Discord server if you need support/don't want to report bugs on GitHub: https://discord.gg/Z6V77mbtZQ
Thanks to the original MagicStorage mod for some code and of course the functionality of the original mod! Thanks to the original MagicStorage mod for some code and of course the functionality of the original mod!