imperfect-space/scripts/GameObjects/Nodes/VesselNode.cs

41 lines
1.7 KiB
C#

using System.Collections.Generic;
using Godot;
public partial class VesselNode : RigidBody3D
{
public Vessel VesselData;
public List<VesselModuleNode> Modules = [];
public override void _Ready()
{
VesselModuleNode moduleBridge = InstantiateModule("test_module_bridge");
VesselModuleNode moduleCombined = InstantiateModule("test_module_combined");
VesselModuleNode moduleEngine1 = InstantiateModule("test_module_engine");
VesselModuleNode moduleEngine2 = InstantiateModule("test_module_engine");
CallDeferred(nameof(AttachModule), moduleBridge, moduleCombined, "TestModuleBridge_AnchorBack", "TestModuleCombined_AnchorFront");
CallDeferred(nameof(AttachModule), moduleBridge, moduleEngine1, "TestModuleBridge_AnchorLeft", "TestModuleEngine_AnchorRight");
CallDeferred(nameof(AttachModule), moduleBridge, moduleEngine2, "TestModuleBridge_AnchorRight", "TestModuleEngine_AnchorLeft");
}
private VesselModuleNode InstantiateModule(string moduleName)
{
PackedScene modulePrefab = ResourceLoader.Load<PackedScene>($"res://prefabs/modules/{moduleName}.tscn");
VesselModuleNode moduleInstance = modulePrefab.Instantiate<VesselModuleNode>();
CallDeferred("add_child", moduleInstance);
VesselData.Modules.Add(moduleInstance.ModuleData);
Modules.Add(moduleInstance);
return moduleInstance;
}
private void AttachModule(VesselModuleNode attachToModule, VesselModuleNode newModule, string existingAnchorName, string newAnchorName)
{
Node3D existingAnchor = attachToModule.GetAnchor(existingAnchorName);
Node3D newAnchor = newModule.GetAnchor(newAnchorName);
newModule.GlobalTransform = existingAnchor.GlobalTransform * newAnchor.Transform.AffineInverse();
}
}