Skip to content

Commit e1246a1

Browse files
Fix #208
1 parent c62815a commit e1246a1

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using Hacknet;
2+
using Hacknet.Extensions;
3+
using HarmonyLib;
4+
using Pathfinder.Util;
5+
6+
namespace Pathfinder.BaseGameFixes;
7+
8+
[HarmonyPatch]
9+
internal static class ReloadExtensionNodes
10+
{
11+
[HarmonyPrefix]
12+
[HarmonyPatch(typeof(ExtensionLoader), nameof(ExtensionLoader.ReloadExtensionNodes))]
13+
private static bool ReloadExtensionNodesReplacement(object osobj)
14+
{
15+
var os = (OS) osobj;
16+
if (OS.TestingPassOnly)
17+
return true;
18+
19+
var nodesDir = ExtensionLoader.ActiveExtensionInfo.FolderPath + ExtensionInfo.NODES_FOLDER;
20+
if (!Directory.Exists(nodesDir))
21+
return false;
22+
Utils.ActOnAllFilesRevursivley(nodesDir, filename =>
23+
{
24+
if (!filename.EndsWith(".xml"))
25+
return;
26+
27+
var computer = (Computer) ComputerLoader.loadComputer(filename, preventAddingToNetmap: true);
28+
if (computer is not null)
29+
UpdateNode(os, computer);
30+
});
31+
ComputerLookup.RebuildLookups();
32+
return false;
33+
}
34+
35+
private static void UpdateNode(OS os, Computer node)
36+
{
37+
var oldNode = ComputerLookup.FindById(node.idName);
38+
if (oldNode is null)
39+
return;
40+
41+
node.location = oldNode.location;
42+
node.adminIP = oldNode.adminIP;
43+
node.ip = oldNode.ip;
44+
node.highlightFlashTime = 1f;
45+
46+
var i = os.netMap.nodes.IndexOf(oldNode);
47+
os.netMap.nodes[i] = node;
48+
ExtensionLoader.CheckAndAssignCoreServer(node, os);
49+
50+
// bugfix: attempt to update old references
51+
void UpdateRef(ref Computer dst)
52+
{
53+
if (dst == oldNode)
54+
dst = node;
55+
}
56+
UpdateRef(ref os.connectedComp);
57+
58+
foreach (var exeModule in os.exes)
59+
switch (exeModule)
60+
{
61+
case MemoryDumpDownloader exe:
62+
UpdateRef(ref exe.target);
63+
break;
64+
case ExtensionSequencerExe exe:
65+
UpdateRef(ref exe.targetComp);
66+
break;
67+
case SequencerExe exe:
68+
UpdateRef(ref exe.targetComp);
69+
break;
70+
case DecypherTrackExe exe:
71+
UpdateRef(ref exe.targetComputer);
72+
// missing: update fs refs
73+
break;
74+
case DecypherExe exe:
75+
UpdateRef(ref exe.targetComputer);
76+
// missing: update fs refs
77+
break;
78+
case EOSDeviceScannerExe exe:
79+
UpdateRef(ref exe.targetComp);
80+
break;
81+
case PortHackExe exe:
82+
UpdateRef(ref exe.target);
83+
break;
84+
case ShellExe exe:
85+
UpdateRef(ref exe.destComp);
86+
UpdateRef(ref exe.compThisShellIsRunningOn);
87+
break;
88+
}
89+
}
90+
}
91+

0 commit comments

Comments
 (0)