Skip to content
This repository was archived by the owner on Jan 5, 2024. It is now read-only.

Commit e859979

Browse files
committed
Scanner edits;
- Can now detect objects submerged in terrain
1 parent bd98299 commit e859979

File tree

4 files changed

+41
-12
lines changed

4 files changed

+41
-12
lines changed

Data/Base.rte/Devices/Tools/Scanner/Scanner.ini

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
AddDevice = HDFirearm
66
PresetName = Scanner
77
AddToGroup = Tools
8-
Description = Handy pocket scanner for your exploration needs. Use it to reveal unseen areas inside terrain.
8+
Description = Handy pocket scanner for your exploration needs. Use it to reveal unseen areas and objects inside terrain.
99
Mass = 4
1010
HitsMOs = 0
1111
GetsHitByMOs = 1
@@ -20,7 +20,7 @@ AddDevice = HDFirearm
2020
CopyOf = Dent Metal Device
2121
ExitWound = AEmitter
2222
CopyOf = Dent Metal Device
23-
GoldValue = 30
23+
GoldValue = 20
2424
AtomGroup = AtomGroup
2525
AutoGenerate = 1
2626
Material = Material
@@ -41,10 +41,10 @@ AddDevice = HDFirearm
4141
Y = 4
4242
DrawAfterParent = 0
4343
StanceOffset = Vector
44-
X = 8
45-
Y = 4
44+
X = 12
45+
Y = 0
4646
SharpStanceOffset = Vector
47-
X = 11
47+
X = 13
4848
Y = -1
4949
SupportOffset = Vector
5050
X = 1
Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,44 @@
11
function Create(self)
2-
self.signalStrength = 1000;
3-
self.maxScanRange = 400;
4-
self.scanSpacing = 20;
5-
self.dotCount = math.floor(self.maxScanRange/self.scanSpacing);
2+
self.signalStrength = 10000;
3+
self.signalDecrement = 10;
4+
self.maxScanRange = 360;
65
self.scanSpreadAngle = math.rad(self.ParticleSpreadRange);
6+
self.flashTimer = Timer();
7+
self.activity = ActivityMan:GetActivity();
8+
end
9+
10+
function Update(self)
11+
local parent = self:GetRootParent();
12+
if IsActor(parent) and ToActor(parent):IsPlayerControlled() then
13+
if self.detectedItemPos then
14+
local timerRatio = self.flashTimer.ElapsedSimTimeMS/self.flashDelay;
15+
if timerRatio < 1 then
16+
PrimitiveMan:DrawPrimitives(100 * timerRatio, {CirclePrimitive(self.activity:ScreenOfPlayer(ToActor(parent):GetController().Player), self.detectedItemPos, self.detectedItemRadius * timerRatio, 188)});
17+
else
18+
self.detectedItemPos = nil;
19+
end
20+
end
21+
end
722
end
823

924
function OnFire(self)
1025
local signalStrength = self.signalStrength;
1126
local angleVariance = self.scanSpreadAngle * 0.5 - (math.random() * self.scanSpreadAngle);
12-
for i = 1, self.dotCount do
13-
local checkPos = self.MuzzlePos + Vector((self.scanSpacing * i) * self.FlipFactor, 0):RadRotate(self.RotAngle + angleVariance);
27+
local unseenResolution = SceneMan:GetUnseenResolution(-1);
28+
local scanSpacing = math.max(math.min(unseenResolution.X, unseenResolution.Y) * 0.5, 1);
29+
local trace = Vector(self.FlipFactor, 0):RadRotate(self.RotAngle);
30+
local checkPos = Vector(self.MuzzlePos.X, self.MuzzlePos.Y);
31+
for i = 1, self.maxScanRange/scanSpacing do
32+
trace = Vector(trace.X, trace.Y):SetMagnitude(i * scanSpacing);
33+
checkPos = self.MuzzlePos + Vector(trace.X, trace.Y):RadRotate(angleVariance);
1434
if SceneMan.SceneWrapsX then
1535
if checkPos.X > SceneMan.SceneWidth then
1636
checkPos = Vector(checkPos.X - SceneMan.SceneWidth, checkPos.Y);
1737
elseif checkPos.X < 0 then
1838
checkPos = Vector(checkPos.X + SceneMan.SceneWidth, checkPos.Y);
1939
end
2040
end
21-
signalStrength = signalStrength - (40 + SceneMan:GetMaterialFromID(SceneMan:GetTerrMatter(checkPos.X, checkPos.Y)).StructuralIntegrity);
41+
signalStrength = signalStrength - (self.signalDecrement + SceneMan:GetMaterialFromID(SceneMan:GetTerrMatter(checkPos.X, checkPos.Y)).StructuralIntegrity) * scanSpacing;
2242
if signalStrength < 0 then
2343
break;
2444
end
@@ -27,4 +47,13 @@ function OnFire(self)
2747
break;
2848
end
2949
end
50+
if self.detectedItemPos == nil then
51+
local mo = MovableMan:GetMOFromID(SceneMan:CastMORay(self.MuzzlePos, trace, self:GetRootParent().ID, Activity.NOTEAM, rte.airID, true, 1));
52+
if mo and IsMOSRotating(mo) then
53+
self.flashTimer:Reset();
54+
self.detectedItemPos = mo:GetRootParent().Pos;
55+
self.detectedItemRadius = 5 + mo:GetRootParent().Radius;
56+
self.flashDelay = 100 + 100 * math.sqrt(self.detectedItemRadius);
57+
end
58+
end
3059
end
-1 Bytes
Loading
2 Bytes
Loading

0 commit comments

Comments
 (0)