Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions Concealment/ConcealGroup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -120,6 +123,89 @@ public bool IsCryoOccupied(ulong steamId)

return false;
}

/// <summary>
/// Conceals this group from game and physics logic.
/// </summary>
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);
}
}

/// <summary>
/// Reveals this group to game and physics logic.
/// </summary>
public void Reveal()
{
foreach (var entity in Grids)
if (entity.Parent == null)
MyGamePruningStructure.Add(entity);


var weldGroups = new HashSet<MyGroups<MyEntity, MyWeldGroupData>.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);
}
}

}

}
55 changes: 9 additions & 46 deletions Concealment/ConcealmentPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -198,55 +196,17 @@ 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)
{
if (ConcealedGroups.Any(g => g.Id == group.Id))
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);
Expand Down Expand Up @@ -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();
Expand Down
52 changes: 52 additions & 0 deletions Jenkins/release.ps1
Original file line number Diff line number Diff line change
@@ -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)
}
10 changes: 10 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down