diff --git a/Concealment/ConcealGroup.cs b/Concealment/ConcealGroup.cs
index 5eb7b09..05a36cd 100644
--- a/Concealment/ConcealGroup.cs
+++ b/Concealment/ConcealGroup.cs
@@ -3,11 +3,14 @@
using System.Linq;
using System.Reflection;
using NLog;
+using Sandbox.Engine.Physics;
using Sandbox.Game.Entities;
using Sandbox.Game.Entities.Blocks;
using Sandbox.Game.World;
using SpaceEngineers.Game.Entities.Blocks;
+using VRage.Game.Entity;
using VRage.Groups;
+using VRage.ModAPI;
using VRageMath;
namespace Concealment
@@ -120,6 +123,89 @@ public bool IsCryoOccupied(ulong steamId)
return false;
}
+
+ ///
+ /// Conceals this group from game and physics logic.
+ ///
+ public void Conceal()
+ {
+ foreach (var body in Grids)
+ if (body.Parent == null)
+ UnregisterRecursive(body);
+
+ foreach (var body in Grids)
+ body.Physics?.UnweldAll(false);
+ foreach (var body in Grids)
+ body.Physics?.Deactivate();
+
+ foreach (var entity in Grids)
+ if (entity.Parent == null)
+ MyGamePruningStructure.Remove(entity);
+
+ void UnregisterRecursive(IMyEntity e)
+ {
+ MyEntities.UnregisterForUpdate((MyEntity)e);
+ if (e.Hierarchy == null)
+ return;
+
+ foreach (var child in e.Hierarchy.Children)
+ UnregisterRecursive(child.Container.Entity);
+ }
+ }
+
+ ///
+ /// Reveals this group to game and physics logic.
+ ///
+ public void Reveal()
+ {
+ foreach (var entity in Grids)
+ if (entity.Parent == null)
+ MyGamePruningStructure.Add(entity);
+
+
+ var weldGroups = new HashSet.Group>();
+ foreach (var body in Grids)
+ {
+ if (body.Physics == null)
+ continue;
+ var group = MyWeldingGroups.Static.GetGroup(body);
+ if (group == null)
+ body.Physics.Activate();
+ else
+ weldGroups.Add(group);
+ }
+ foreach (var group in weldGroups)
+ {
+ var body = group.GroupData.Parent;
+ if (!(body.Physics is MyPhysicsBody bodyPhysics))
+ continue;
+ bodyPhysics.Activate();
+
+ foreach (var child in group.Nodes)
+ if (child.NodeData != body &&
+ !child.NodeData.MarkedForClose &&
+ child.NodeData.Physics is MyPhysicsBody physBody)
+ bodyPhysics.Weld(physBody);
+
+ body.RaisePhysicsChanged();
+ }
+
+
+ foreach (var entity in Grids)
+ if (entity.Parent == null)
+ RegisterRecursive(entity);
+
+ void RegisterRecursive(IMyEntity e)
+ {
+ MyEntities.RegisterForUpdate((MyEntity)e);
+ if (e.Hierarchy == null)
+ return;
+
+ foreach (var child in e.Hierarchy.Children)
+ RegisterRecursive(child.Container.Entity);
+ }
+ }
+
}
}
diff --git a/Concealment/ConcealmentPlugin.cs b/Concealment/ConcealmentPlugin.cs
index 0f23f1b..5b5c063 100644
--- a/Concealment/ConcealmentPlugin.cs
+++ b/Concealment/ConcealmentPlugin.cs
@@ -7,7 +7,6 @@
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;
-using Havok;
using NLog;
using Sandbox.Definitions;
using Sandbox.Engine.Multiplayer;
@@ -23,7 +22,6 @@
using VRage.Game;
using VRage.Game.Components;
using VRage.Game.Definitions;
-using VRage.Game.Entity;
using VRage.Game.ModAPI;
using VRage.Game.ObjectBuilders.ComponentSystem;
using VRage.ModAPI;
@@ -54,7 +52,7 @@ public ConcealmentPlugin()
UserControl IWpfPlugin.GetControl()
{
- return _control ?? (_control = new ConcealmentControl {DataContext = this});
+ return _control ?? (_control = new ConcealmentControl { DataContext = this });
}
public override void Init(ITorchBase torch)
@@ -198,47 +196,6 @@ private void RevealSpawns(PlayerRequestArgs args)
});
}
- private void ConcealEntity(IMyEntity entity)
- {
- if (entity != entity.GetTopMostParent())
- return;
-
- entity.GetStorage().SetValue(Id, "True");
- MyGamePruningStructure.Remove((MyEntity)entity);
- entity.Physics?.Deactivate();
- UnregisterRecursive(entity);
-
- void UnregisterRecursive(IMyEntity e)
- {
- MyEntities.UnregisterForUpdate((MyEntity)e);
- if (e.Hierarchy == null)
- return;
-
- foreach (var child in e.Hierarchy.Children)
- UnregisterRecursive(child.Container.Entity);
- }
- }
-
- private void RevealEntity(IMyEntity entity)
- {
- if (entity != entity.GetTopMostParent())
- return;
-
- entity.GetStorage().SetValue(Id, "False");
- MyGamePruningStructure.Add((MyEntity)entity);
- entity.Physics?.Activate();
- RegisterRecursive(entity);
-
- void RegisterRecursive(IMyEntity e)
- {
- MyEntities.RegisterForUpdate((MyEntity)e);
- if (e.Hierarchy == null)
- return;
-
- foreach (var child in e.Hierarchy.Children)
- RegisterRecursive(child.Container.Entity);
- }
- }
private int ConcealGroup(ConcealGroup group)
{
@@ -246,7 +203,10 @@ private int ConcealGroup(ConcealGroup group)
return 0;
Log.Debug($"Concealing grids: {group.GridNames}");
- group.Grids.ForEach(ConcealEntity);
+ group.Conceal();
+ foreach (var entity in group.Grids)
+ entity.GetStorage().SetValue(Id, "True");
+
group.UpdateAABB();
var aabb = group.WorldAABB;
group.ProxyId = _concealedAabbTree.AddProxy(ref aabb, group, 0);
@@ -277,7 +237,10 @@ public int RevealGroup(ConcealGroup group)
var count = group.Grids.Count;
Log.Debug($"Revealing grids: {group.GridNames}");
- group.Grids.ForEach(RevealEntity);
+ group.Reveal();
+ foreach (var entity in group.Grids)
+ entity.GetStorage().SetValue(Id, "False");
+
ConcealedGroups.Remove(group);
_concealedAabbTree.RemoveProxy(group.ProxyId);
group.UpdatePostReveal();
diff --git a/Jenkins/release.ps1 b/Jenkins/release.ps1
new file mode 100644
index 0000000..81e5e63
--- /dev/null
+++ b/Jenkins/release.ps1
@@ -0,0 +1,52 @@
+param([string] $ApiBase, [string]$tagName, [string]$authinfo, [string[]] $assetPaths)
+Add-Type -AssemblyName "System.Web"
+
+$headers = @{
+ Authorization = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($authinfo))
+ Accept = "application/vnd.github.v3+json"
+}
+try
+{
+ Write-Output("Checking if release with tag " + $tagName + " already exists...")
+ $release = Invoke-RestMethod -Uri ($ApiBase+"releases/tags/$tagName") -Method "GET" -Headers $headers
+ Write-Output(" Using existing release " + $release.id + " at " + $release.html_url)
+} catch {
+ Write-Output(" Doesn't exist")
+ $rel_arg = @{
+ tag_name=$tagName
+ name="Generated $tagName"
+ body=""
+ draft=$TRUE
+ prerelease=$tagName.Contains("alpha") -or $tagName.Contains("beta")
+ }
+ Write-Output("Creating new release " + $tagName + "...")
+ $release = Invoke-RestMethod -Uri ($ApiBase+"releases") -Method "POST" -Headers $headers -Body (ConvertTo-Json($rel_arg))
+ Write-Output(" Created new release " + $tagName + " at " + $release.html_url)
+}
+
+$assetsApiBase = $release.assets_url
+Write-Output("Checking for existing assets...")
+$existingAssets = Invoke-RestMethod -Uri ($assetsApiBase) -Method "GET" -Headers $headers
+$assetLabels = ($assetPaths | ForEach-Object {[System.IO.Path]::GetFileName($_)})
+foreach ($asset in $existingAssets) {
+ if ($assetLabels -contains $asset.name) {
+ $uri = $asset.url
+ Write-Output(" Deleting old asset " + $asset.name + " (id " + $asset.id + "); URI=" + $uri)
+ $result = Invoke-RestMethod -Uri $uri -Method "DELETE" -Headers $headers
+ }
+}
+Write-Output("Uploading assets...")
+$uploadUrl = $release.upload_url.Substring(0, $release.upload_url.LastIndexOf('{'))
+foreach ($asset in $assetPaths) {
+ $assetName = [System.IO.Path]::GetFileName($asset)
+ $assetType = [System.Web.MimeMapping]::GetMimeMapping($asset)
+ $assetData = [System.IO.File]::ReadAllBytes($asset)
+ $headerExtra = $headers + @{
+ "Content-Type" = $assetType
+ Name = $assetName
+ }
+ $uri = $uploadUrl + "?name=" + $assetName
+ Write-Output(" Uploading " + $asset + " as " + $assetType + "; URI=" + $uri)
+ $result = Invoke-RestMethod -Uri $uri -Method "POST" -Headers $headerExtra -Body $assetData
+ Write-Output(" ID=" + $result.id + ", found at=" + $result.browser_download_url)
+}
\ No newline at end of file
diff --git a/Jenkinsfile b/Jenkinsfile
index 952f992..55c9c41 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -65,6 +65,16 @@ node {
stage('Archive') {
archiveArtifacts artifacts: "bin/x64/Release/Concealment.dll", caseSensitive: false, fingerprint: true, onlyIfSuccessful: true
}
+
+ gitVersion = bat(returnStdout: true, script: "@git describe --tags").trim()
+ gitSimpleVersion = bat(returnStdout: true, script: "@git describe --tags --abbrev=0").trim()
+ if (gitVersion == gitSimpleVersion) {
+ stage('Release') {
+ withCredentials([usernamePassword(credentialsId: 'torch-github', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
+ powershell "& ./Jenkins/release.ps1 \"https://api.github.com/repos/TorchAPI/Concealment/\" \"$gitSimpleVersion\" \"$USERNAME:$PASSWORD\" @(\"bin/x64/Release/Concealment.dll\")"
+ }
+ }
+ }
}
else
currentBuild.result = "FAIL"