Skip to content

Commit faa18c8

Browse files
committed
Initial Cube Tracker implementation
1 parent 1a9c491 commit faa18c8

File tree

7 files changed

+119
-7
lines changed

7 files changed

+119
-7
lines changed

changelog.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
---------------------------------------------------------------------------------------------------
2+
Version: 2.2.0
3+
Features:
4+
- Add a new Cube Tracker to track the Ultracube.
5+
---------------------------------------------------------------------------------------------------
26
Version: 2.1.1
37
Date: 13-11-2025
48
Bugfixes:

control.lua

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ local TLBE = {
33
Camera = require("scripts.camera"),
44
Config = require("scripts.config"),
55
GUI = require("scripts.gui"),
6-
Tracker = require("scripts.tracker")
6+
Tracker = require("scripts.tracker"),
7+
Utils = require("scripts.utils")
78
}
89

910
local function register_sensor()
@@ -64,6 +65,19 @@ local function on_configuration_changed(event)
6465
init_new_player(index, player)
6566
end
6667
end
68+
69+
local hasUltracube = TLBE.Utils.isUltracubeAvailable()
70+
for index, _ in pairs(game.players) do
71+
local playerSettings = storage.playerSettings[index]
72+
if playerSettings ~= nil and playerSettings.trackers ~= nil then
73+
for _, tracker in pairs(playerSettings.trackers) do
74+
if tracker.type == "cube" then
75+
tracker.enabled = hasUltracube
76+
tracker.userCanEnable = hasUltracube
77+
end
78+
end
79+
end
80+
end
6781
end
6882

6983
-- A player got created (or joined the game)

info.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"factorio_version": "2.0",
1010
"dependencies": [
1111
"base >= 2.0.0",
12-
"? StatsGui >= 1.1.0"
12+
"? StatsGui >= 1.1.0",
13+
"? Ultracube >= 0.5.2"
1314
],
1415
"description": "Takes screenshots of your base at specified intervals."
1516
}

locale/en/locale.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ tracker-base=Base Tracker
1616
tracker-player=Player Tracker
1717
tracker-rocket=Rocket Tracker
1818
tracker-cityBlock=City Block Tracker
19+
tracker-cube=Cube Tracker
1920

2021
[gui]
2122
button-base-recalculate=Recalculate base size
@@ -90,6 +91,7 @@ tracker-cityblock-currentblock-y=The position of the current city block, countin
9091
tracker-cityblock-blockScale=How many city blocks to zoom out, centered on the current block.
9192
tracker-cityblock-blockScale-value=A zoom of 3 will capture the current block and all of the neighbors. <enter> to set.
9293
tracker-cityblock-player=Use player coordinates to select the current city block.
94+
tracker-cube-not-available=This tracker is not available because Ultracube mod is not loaded.
9395

9496
[controls]
9597
tlbe-main-window-toggle=Open/Close camera settings

scripts/gui.lua

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
local GUI = {
2-
allTrackers = { "area", "base", "cityblock", "player", "rocket" },
3-
allTrackersLabels = { { "tracker-area" }, { "tracker-base" }, { "tracker-cityBlock" }, { "tracker-player" }, { "tracker-rocket" } },
2+
allTrackers = { "area", "base", "cityblock", "cube", "player", "rocket" },
3+
allTrackersLabels = {
4+
{ "tracker-area" },
5+
{ "tracker-base" },
6+
{ "tracker-cityBlock" },
7+
{ "tracker-cube" },
8+
{ "tracker-player" },
9+
{ "tracker-rocket" },
10+
},
411
allTrackersLabelsMap = {
512
area = { "tracker-area" },
613
base = { "tracker-base" },
714
cityBlock = { "tracker-cityBlock" },
15+
cube = { "tracker-cube" },
816
player = { "tracker-player" },
917
rocket = { "tracker-rocket" },
1018
}
@@ -15,6 +23,21 @@ local Main = require("scripts.main")
1523
local Tracker = require("scripts.tracker")
1624
local Utils = require("scripts.utils")
1725

26+
local function getAvailableTrackerTypes()
27+
local trackerTypes = {}
28+
local trackerLabels = {}
29+
30+
local ultracubeAvailable = Utils.isUltracubeAvailable()
31+
for index, trackerType in ipairs(GUI.allTrackers) do
32+
if trackerType ~= "cube" or ultracubeAvailable then
33+
table.insert(trackerTypes, trackerType)
34+
table.insert(trackerLabels, GUI.allTrackersLabels[index])
35+
end
36+
end
37+
38+
return trackerTypes, trackerLabels
39+
end
40+
1841
local ticks_per_half_second = 30
1942

2043
local function getWindowPlayButtonStyle(selected)
@@ -448,7 +471,9 @@ function GUI.onSelected(event)
448471
end
449472
event.element.selected_index = 1
450473

451-
local newTracker = Tracker.newTracker(player, GUI.allTrackers[trackerIndex], playerSettings.trackers)
474+
local availableTrackerTypes = getAvailableTrackerTypes()
475+
local trackerType = availableTrackerTypes[trackerIndex]
476+
local newTracker = Tracker.newTracker(player, trackerType, playerSettings.trackers)
452477
table.insert(playerSettings.trackers, newTracker)
453478
playerSettings.guiPersist.selectedTracker = #playerSettings.trackers
454479

@@ -1111,11 +1136,13 @@ function GUI.createTrackerSettings(parent, playerGUI, guiPersist, cameras, track
11111136
local trackersFlow = flow.add { type = "flow", direction = "vertical", style = "tlbe_fancy_list_parent" }
11121137

11131138
-- New tracker GUI
1139+
local availableTrackerTypes, availableTrackerLabels = getAvailableTrackerTypes()
1140+
playerGUI.availableTrackerTypes = availableTrackerTypes
11141141
trackersFlow.add {
11151142
type = "drop-down",
11161143
selected_index = 1,
11171144
name = "tlbe-tracker-add",
1118-
items = { { "gui.item-new-tracker" }, table.unpack(GUI.allTrackersLabels) },
1145+
items = { { "gui.item-new-tracker" }, table.unpack(availableTrackerLabels) },
11191146
style = "tlbe_tracker_add_dropdown"
11201147
}
11211148

@@ -1235,7 +1262,7 @@ function GUI.addCameraTrackerButtons(index, selectedCamera, _, trackers, tracker
12351262
style = "tlbe_tracker_remove_button"
12361263
}
12371264

1238-
if isActiveTracker then
1265+
if isActiveTracker and tracker.enabled then
12391266
trackerRow.add {
12401267
type = "sprite",
12411268
sprite = "utility/play",
@@ -1248,6 +1275,13 @@ function GUI.addCameraTrackerButtons(index, selectedCamera, _, trackers, tracker
12481275
style = "tlbe_fancy_list_box_image_reduce_size",
12491276
tooltip = { "tooltip.tracker-wrong-surface" }
12501277
}
1278+
elseif tracker.type == "cube" and not Utils.isUltracubeAvailable() then
1279+
trackerRow.add {
1280+
type = "sprite",
1281+
sprite = "utility/warning_icon",
1282+
style = "tlbe_fancy_list_box_image_reduce_size",
1283+
tooltip = { "tooltip.tracker-cube-not-available" }
1284+
}
12511285
else
12521286
trackerRow.add {
12531287
type = "empty-widget",

scripts/tracker.lua

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ function Tracker.newTracker(player, trackerType, trackerList)
7777
newTracker.userCanEnable = false
7878
newTracker.enabled = false
7979
newTracker.realtimeCamera = true
80+
elseif trackerType == "cube" then
81+
newTracker.size = { x = 1, y = 1 }
82+
newTracker.enabled = Utils.isUltracubeAvailable()
83+
newTracker.userCanEnable = Utils.isUltracubeAvailable()
8084
elseif trackerType == "cityblock" then
8185
-- cityblock-specific data
8286
newTracker.cityBlock = Tracker.cityBlock:new()
@@ -165,6 +169,55 @@ function Tracker.tick(tracker, player)
165169
x = player.position.x,
166170
y = player.position.y
167171
}
172+
elseif tracker.type == "cube" then
173+
local ok, info = pcall(remote.call, "Ultracube", "cube_info")
174+
if ok and info ~= nil then
175+
local minPos = info.min_position
176+
local maxPos = info.max_position
177+
local centerPos
178+
local size
179+
180+
if minPos ~= nil and maxPos ~= nil then
181+
local sizeX = maxPos.x - minPos.x
182+
local sizeY = maxPos.y - minPos.y
183+
184+
if sizeX == 0 then
185+
sizeX = 1
186+
end
187+
if sizeY == 0 then
188+
sizeY = 1
189+
end
190+
191+
size = {
192+
x = sizeX,
193+
y = sizeY
194+
}
195+
centerPos = {
196+
x = minPos.x + size.x / 2,
197+
y = minPos.y + size.y / 2
198+
}
199+
elseif info.position ~= nil then
200+
centerPos = {
201+
x = info.position.x,
202+
y = info.position.y
203+
}
204+
size = tracker.size or { x = 1, y = 1 }
205+
else
206+
return
207+
end
208+
209+
if tracker.centerPos == nil or tracker.size == nil or
210+
centerPos.x ~= tracker.centerPos.x or
211+
centerPos.y ~= tracker.centerPos.y or
212+
size.x ~= tracker.size.x or
213+
size.y ~= tracker.size.y
214+
then
215+
Tracker.changed(tracker)
216+
end
217+
218+
tracker.centerPos = centerPos
219+
tracker.size = size
220+
end
168221
end
169222
end
170223

scripts/utils.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,8 @@ function Utils.clamp(min, value, max)
6868
return math.max(min, math.min(max, value))
6969
end
7070

71+
function Utils.isUltracubeAvailable()
72+
return script.active_mods["Ultracube"] ~= nil
73+
end
74+
7175
return Utils

0 commit comments

Comments
 (0)