Cache additional info to avoid entity queries
This commit is contained in:
parent
7f5a36cb62
commit
8354123169
1 changed files with 21 additions and 20 deletions
|
@ -24,6 +24,10 @@ namespace GamecraftModdingAPI.Blocks
|
|||
|
||||
protected bool inputToOutput;
|
||||
|
||||
protected byte startPort;
|
||||
|
||||
protected byte endPort;
|
||||
|
||||
public static Wire Connect(SignalingBlock start, byte startPort, SignalingBlock end, byte endPort)
|
||||
{
|
||||
WireEntityStruct wire = signalEngine.CreateNewWire(start.Id, startPort, end.Id, endPort);
|
||||
|
@ -90,6 +94,8 @@ namespace GamecraftModdingAPI.Blocks
|
|||
startPortEGID = signalEngine.MatchBlockOutputToPort(start, wire.sourcePortUsage, out exists);
|
||||
if (!exists) throw new WireInvalidException("Wire start port not found");
|
||||
inputToOutput = false;
|
||||
endPort = wire.destinationPortUsage;
|
||||
startPort = wire.sourcePortUsage;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -105,6 +111,8 @@ namespace GamecraftModdingAPI.Blocks
|
|||
inputToOutput = true; // end is actually the source
|
||||
// NB: start and end are handled exactly as they're received as params.
|
||||
// This makes wire traversal easier, but makes logic in this class a bit more complex
|
||||
endPort = wire.sourcePortUsage;
|
||||
startPort = wire.destinationPortUsage;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -142,6 +150,8 @@ namespace GamecraftModdingAPI.Blocks
|
|||
startPortEGID = signalEngine.MatchBlockOutputToPort(start, startPort, out exists);
|
||||
if (!exists) throw new WireInvalidException("Wire start port not found");
|
||||
}
|
||||
this.startPort = startPort;
|
||||
this.endPort = endPort;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -159,6 +169,8 @@ namespace GamecraftModdingAPI.Blocks
|
|||
if (!exists) throw new WireInvalidException("Wire end port not found");
|
||||
startPortEGID = signalEngine.MatchBlockOutputToPort(wire.sourceBlockEGID, wire.sourcePortUsage, out exists);
|
||||
if (!exists) throw new WireInvalidException("Wire start port not found");
|
||||
this.endPort = wire.destinationPortUsage;
|
||||
this.startPort = wire.sourcePortUsage;
|
||||
}
|
||||
|
||||
internal Wire(WireEntityStruct wire)
|
||||
|
@ -171,6 +183,8 @@ namespace GamecraftModdingAPI.Blocks
|
|||
if (!exists) throw new WireInvalidException("Wire end port not found");
|
||||
startPortEGID = signalEngine.MatchBlockOutputToPort(wire.sourceBlockEGID, wire.sourcePortUsage, out exists);
|
||||
if (!exists) throw new WireInvalidException("Wire start port not found");
|
||||
this.endPort = wire.destinationPortUsage;
|
||||
this.startPort = wire.sourcePortUsage;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -275,15 +289,7 @@ namespace GamecraftModdingAPI.Blocks
|
|||
/// </summary>
|
||||
public byte StartPort
|
||||
{
|
||||
get
|
||||
{
|
||||
WireEntityStruct wire = signalEngine.GetWire(wireEGID);
|
||||
if (inputToOutput)
|
||||
{
|
||||
return wire.destinationPortUsage;
|
||||
}
|
||||
return wire.sourcePortUsage;
|
||||
}
|
||||
get => startPort;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -299,15 +305,7 @@ namespace GamecraftModdingAPI.Blocks
|
|||
/// </summary>
|
||||
public byte EndPort
|
||||
{
|
||||
get
|
||||
{
|
||||
WireEntityStruct wire = signalEngine.GetWire(wireEGID);
|
||||
if (inputToOutput)
|
||||
{
|
||||
return wire.sourcePortUsage;
|
||||
}
|
||||
return wire.destinationPortUsage;
|
||||
}
|
||||
get => endPort;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -322,7 +320,7 @@ namespace GamecraftModdingAPI.Blocks
|
|||
|
||||
/// <summary>
|
||||
/// Convert the wire object to the direction the signal flows.
|
||||
/// Signals on wires always flows from a block output port to a block input port.
|
||||
/// Signals on wires always flow from a block output port to a block input port.
|
||||
/// This is simply a different memory configuration and does not affect the in-game wire (which is always output -> input).
|
||||
/// </summary>
|
||||
public void OutputToInputInPlace()
|
||||
|
@ -337,6 +335,9 @@ namespace GamecraftModdingAPI.Blocks
|
|||
temp = endPortEGID;
|
||||
endPortEGID = startPortEGID;
|
||||
startPortEGID = temp;
|
||||
byte tempPortNumber = endPort;
|
||||
endPort = startPort;
|
||||
startPort = tempPortNumber;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -346,7 +347,7 @@ namespace GamecraftModdingAPI.Blocks
|
|||
{
|
||||
return $"{nameof(Id)}: {Id}, Start{nameof(Start.Id)}: {Start.Id}, End{nameof(End.Id)}: {End.Id}, ({Start.Type}::{StartPort} aka {Start.PortName(StartPort, inputToOutput)}) -> ({End.Type}::{EndPort} aka {End.PortName(EndPort, !inputToOutput)})";
|
||||
}
|
||||
return $"{nameof(Id)}: {Id}, Start{nameof(Start.Id)}: {Start.Id}, End{nameof(End.Id)}: {End.Id}, ({Start.Type} -> {End.Type})";
|
||||
return $"{nameof(Id)}: {Id}, Start{nameof(Start.Id)}: {Start.Id}, End{nameof(End.Id)}: {End.Id}, ({Start.Type}::{StartPort} -> {End.Type}::{EndPort})";
|
||||
}
|
||||
|
||||
internal static void Init() { }
|
||||
|
|
Loading…
Reference in a new issue