15 Commits
v1.3 ... v1.8

15 changed files with 154 additions and 180 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.Common.Systems;
using MagicStorage.Components;
using MagicStorageVoidBag.Items;
using System.Linq;
@ -12,7 +13,7 @@ using Terraria.ModLoader;
namespace MagicStorageVoidBag.Hooks {
internal class GetItemVoidVaultHook {
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);
newItem = newItem.Clone();
@ -21,19 +22,19 @@ namespace MagicStorageVoidBag.Hooks {
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 (!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;
TEStorageHeart heart = (TEStorageHeart)te;
heart.TryDeposit(returnItem);
heart.ResetCompactStage();
StorageGUI.modSearchBox.OnChanged();
MagicUI.SetRefresh();
if (returnItem.stack != newItem.stack) {
if (newItem.IsACoin) {

View File

@ -16,7 +16,7 @@ namespace MagicStorageVoidBag.Hooks {
private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger;
// 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);
if (i == null) goto original;
@ -24,12 +24,12 @@ namespace MagicStorageVoidBag.Hooks {
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 (!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 (Utility.HeartHasSpaceFor(newItem, (TEStorageHeart)te)) return true;

View File

@ -1,32 +0,0 @@
using MagicStorage.Components;
using MagicStorage.Items;
using Terraria;
using Terraria.DataStructures;
using Terraria.Localization;
namespace MagicStorageVoidBag.Hooks {
internal class StorageHeartRightClickHook {
private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger;
public static bool Hook(On.MagicStorage.Components.StorageHeart.orig_RightClick orig, MagicStorage.Components.StorageHeart heart, int i, int j) {
// https://github.com/blushiemagic/MagicStorage/blob/1.4-stable/Components/StorageHeart.cs#L23
Player player = Main.LocalPlayer;
Item item = player.HeldItem;
if (!item.IsAir && item.ModItem is Locator locator) {
if (Main.tile[i, j].TileFrameX % 36 == 18) i--;
if (Main.tile[i, j].TileFrameY % 36 == 18) j--;
locator.location = new Point16(i, j);
if (player.selectedItem == 58) {
Main.mouseItem = item.Clone();
}
Main.NewText(Language.GetTextValue("Mods.MagicStorage.LocatorSet", i, j));
return true;
}
return orig(heart, i, j);
}
}
}

View File

@ -13,27 +13,35 @@ namespace MagicStorageVoidBag.ILPatches {
internal class PlayerUpdatePatch : ILPatch {
private static readonly log4net.ILog Logger = MagicStorageVoidBag.Instance.Logger;
public void Patch(ILContext il) {
if (il == null) {
Logger.Error("ILContext null!");
return;
try {
if (il == null) {
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) {
bool isSet = location.X >= 0 && location.Y >= 0;
bool isSet = Location.X >= 0 && Location.Y >= 0;
for (int k = 0; k < lines.Count; k++)
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") {
lines.RemoveAt(k);
k--;

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 Jack Bond-Preston
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.

View File

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

View File

@ -10,20 +10,18 @@ namespace MagicStorageVoidBag {
// IL Patches
private PlayerUpdatePatch playerUpdatePatch = new();
public override void Load() {
IL.Terraria.Player.Update += playerUpdatePatch.Patch;
public override void Load() {
Terraria.IL_Player.Update += playerUpdatePatch.Patch;
On.Terraria.Player.GetItem_VoidVault += GetItemVoidVaultHook.Hook;
On.Terraria.Player.ItemSpaceForCofveve += ItemSpaceForCofveveHook.Hook;
On.MagicStorage.Components.StorageHeart.RightClick += StorageHeartRightClickHook.Hook;
Terraria.On_Player.GetItem_VoidVault += GetItemVoidVaultHook.Hook;
Terraria.On_Player.ItemSpaceForCofveve += ItemSpaceForCofveveHook.Hook;
}
public override void Unload() {
IL.Terraria.Player.Update -= playerUpdatePatch.Patch;
Terraria.IL_Player.Update -= playerUpdatePatch.Patch;
On.Terraria.Player.GetItem_VoidVault -= GetItemVoidVaultHook.Hook;
On.Terraria.Player.ItemSpaceForCofveve -= ItemSpaceForCofveveHook.Hook;
On.MagicStorage.Components.StorageHeart.RightClick -= StorageHeartRightClickHook.Hook;
Terraria.On_Player.GetItem_VoidVault -= GetItemVoidVaultHook.Hook;
Terraria.On_Player.ItemSpaceForCofveve -= ItemSpaceForCofveveHook.Hook;
base.Unload();
}

View File

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

View File

@ -1,16 +1,16 @@
{
"profiles": {
"Terraria": {
"commandName": "Executable",
"executablePath": "dotnet",
"commandLineArgs": "$(tMLPath)",
"workingDirectory": "$(tMLSteamPath)"
},
"TerrariaServer": {
"commandName": "Executable",
"executablePath": "dotnet",
"commandLineArgs": "$(tMLServerPath)",
"workingDirectory": "$(tMLSteamPath)"
}
}
{
"profiles": {
"Terraria": {
"commandName": "Executable",
"executablePath": "dotnet",
"commandLineArgs": "$(tMLPath)",
"workingDirectory": "$(tMLSteamPath)"
},
"TerrariaServer": {
"commandName": "Executable",
"executablePath": "dotnet",
"commandLineArgs": "$(tMLServerPath)",
"workingDirectory": "$(tMLSteamPath)"
}
}
}

View File

@ -1,8 +1,7 @@
displayName = MagicStorage Void Bag
author = jack
version = 1.3
modReferences = MagicStorage
dllReferences = MagicStorage_Hooks
sortAfter = MagicStorage
includeSource = true
homepage = https://github.com/jackbondpreston/MagicStorageVoidBag
displayName = MagicStorage Void Bag
author = jack
version = 1.8
modReferences = MagicStorage
sortAfter = MagicStorage
includeSource = true
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).
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
Thanks to the original MagicStorage mod for some code and of course the functionality of the original mod!

Binary file not shown.