-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDSUtil.cs
More file actions
111 lines (91 loc) · 3.27 KB
/
Copy pathDSUtil.cs
File metadata and controls
111 lines (91 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace DockingStrut
{
public enum DSMode
{
UNLINKED,
LINKED,
TARGETING,
TARGET,
INVALID
}
public static class DSUtil
{
public static Part PartFromHit(RaycastHit hit)
{
GameObject go = hit.collider.gameObject;
Part p = null;
while (p == null)
{
p = Part.FromGO(go);
if (go.transform.parent != null && go.transform.parent.gameObject != null)
go = go.transform.parent.gameObject;
else
break;
}
return p;
}
public static bool GetDS(this Vessel v, Guid TargetID, out ModuleDockingStrut Target) {
foreach (Part p in v.Parts) {
if (p.Modules.Contains("ModuleDockingStrut") && (p.Modules["ModuleDockingStrut"] as ModuleDockingStrut).ID == TargetID) {
Target = (p.Modules["ModuleDockingStrut"] as ModuleDockingStrut);
return true;
}
}
Target = null;
return false;
}
public static bool checkPossibleTarget(ModuleDockingStrut Origin, ModuleDockingStrut Target)
{
try
{
float distance = Vector3.Distance(Target.part.transform.position, Origin.part.transform.position);
if (distance > Origin.MaxDistance)
return false;
RaycastHit info = new RaycastHit();
Vector3 start = Origin.rayCastOrigin;
Vector3 dir = (Target.strutTarget - start).normalized;
bool hit = Physics.Raycast(new Ray(start, dir), out info, Origin.MaxDistance + 1);
Part tmpp = DSUtil.PartFromHit(info);
if (hit && tmpp == Target.part)
hit = false;
return !hit;
}
catch
{
return false;
}
}
public static void setPossibleTarget(ModuleDockingStrut Origin, ModuleDockingStrut Target)
{
float distance = Vector3.Distance(Target.part.transform.position, Origin.part.transform.position);
if (distance > Origin.MaxDistance)
{
Target.SetErrorMessage("Out of range by " + Math.Round(distance - Origin.MaxDistance, 2) + "m");
return;
}
RaycastHit info = new RaycastHit();
Vector3 start = Origin.rayCastOrigin;
Vector3 dir = (Target.strutTarget - start).normalized;
bool hit = Physics.Raycast(new Ray(start, dir), out info, Origin.MaxDistance + 1);
Part tmpp = PartFromHit(info);
if (hit && tmpp == Target.part)
hit = false;
if (hit)
{
Target.SetErrorMessage("Obstructed by " + tmpp.name);
return;
}
Target.mode = DSMode.TARGET;
Target.TargeterDS = Origin;
foreach (BaseEvent e in Target.Events)
{
e.active = e.guiActive = false;
}
}
}
}