Skip to content

Commit e9f6c5d

Browse files
committed
Add air as an option
1 parent bdfa6c5 commit e9f6c5d

File tree

9 files changed

+100
-16
lines changed

9 files changed

+100
-16
lines changed

images/AirIcon.png

2.09 KB
Loading

images/CancelAirIcon.png

5.11 KB
Loading

places/test_plugin_place.rbxl

782 Bytes
Binary file not shown.

src/ConvertPane.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ function ConvertPane.new(gui, selectionService, terrainConverter)
4242
self:_updateStatus()
4343
self:_updateButton()
4444

45+
-- self._maid:GiveTask(self._terrainConverter.OverwriteWater.Changed:Connect(function()
46+
-- self:_updateStatus()
47+
-- end))
48+
-- self._maid:GiveTask(self._terrainConverter.OverwriteTerrain.Changed:Connect(function()
49+
-- self:_updateStatus()
50+
-- end))
51+
4552
return self
4653
end
4754

@@ -63,6 +70,10 @@ function ConvertPane:_updateStatus()
6370
local selection = self._selectionService:Get()
6471

6572
local canConvert
73+
-- if not self._terrainConverter.OverwriteWater.Value and not self._terrainConverter.OverwriteTerrain.Value then
74+
-- self._statusLabel.Text = "Can't overwrite water or terrain"
75+
-- canConvert = false
76+
-- else
6677
if #selection == 0 then
6778
self._statusLabel.Text = "Nothing selected"
6879
canConvert = false

src/MaterialInput.lua

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
-- @author Quenty
44

55
local UserInputService = game:GetService("UserInputService")
6-
local ContextActionService = game:GetService("ContextActionService")
76
local Workspace = game:GetService("Workspace")
87

98
local BasicPane = require(script.Parent.BasicPane)
@@ -29,7 +28,11 @@ function MaterialInput.new(mouse)
2928
end
3029
end
3130

32-
self._maid:GiveTask(UserInputService.InputBegan:Connect(function(inputObject)
31+
self._maid:GiveTask(UserInputService.InputBegan:Connect(function(inputObject, gameProcessed)
32+
if gameProcessed then
33+
return
34+
end
35+
3336
if inputObject.UserInputType == Enum.UserInputType.MouseButton1 then
3437
if UserInputService:IsKeyDown(Enum.KeyCode.LeftAlt) or UserInputService:IsKeyDown(Enum.KeyCode.RightAlt) then
3538
local material = self:_findMaterial()

src/TerrainConverter.lua

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,44 @@
55
local Signal = require(script.Parent.Signal)
66
local BoundingBox = require(script.Parent.BoundingBox)
77
local Draw = require(script.Parent.Draw)
8+
local BasicPane = require(script.Parent.BasicPane)
9+
local terrainMaterialList = require(script.Parent.terrainMaterialList)
810

9-
local MATERIAL_AIR = Enum.Material.Air
10-
11-
local TerrainConverter = {}
11+
local TerrainConverter = setmetatable({}, BasicPane)
1212
TerrainConverter.ClassName = "TerrainConverter"
1313
TerrainConverter.__index = TerrainConverter
1414
TerrainConverter.RESOLUTION = 4
1515

1616
function TerrainConverter.new()
17-
local self = setmetatable({}, TerrainConverter)
17+
local self = setmetatable(BasicPane.new(), TerrainConverter)
1818

1919
self.KeepConvertedPart = Instance.new("BoolValue")
2020
self.KeepConvertedPart.Value = true
21+
self._maid:GiveTask(self.KeepConvertedPart)
22+
23+
self.OverwriteTerrain = Instance.new("BoolValue")
24+
self.OverwriteTerrain.Value = true
25+
self._maid:GiveTask(self.OverwriteTerrain)
2126

22-
self.ReplaceExistingTerrain = Instance.new("BoolValue")
23-
self.ReplaceExistingTerrain.Value = true
27+
self.OverwriteWater = Instance.new("BoolValue")
28+
self.OverwriteWater.Value = true
29+
self._maid:GiveTask(self.OverwriteWater)
2430

2531
self.ConversionStarting = Signal.new()
32+
self._maid:GiveTask(self.ConversionStarting)
33+
34+
-- Make sure the user can always overwrite _something)
35+
self._maid:GiveTask(self.OverwriteTerrain.Changed:Connect(function()
36+
if not self.OverwriteTerrain.Value and not self.OverwriteWater.Value then
37+
self.OverwriteWater.Value = true
38+
end
39+
end))
40+
self._maid:GiveTask(self.OverwriteWater.Changed:Connect(function()
41+
if not self.OverwriteTerrain.Value and not self.OverwriteWater.Value then
42+
self.OverwriteTerrain.Value = true
43+
end
44+
end))
45+
2646

2747
return self
2848
end
@@ -59,12 +79,43 @@ function TerrainConverter:CanConvert(items)
5979
return false
6080
end
6181

82+
function TerrainConverter:_getOverwriteMaterials()
83+
local materials = {}
84+
85+
if self.OverwriteTerrain.Value then
86+
for _, item in pairs(terrainMaterialList) do
87+
materials[item.enum] = true
88+
end
89+
90+
-- don't remove air, it shouldn't matter
91+
-- materials[Enum.Material.Air] = nil
92+
else
93+
materials[Enum.Material.Air] = true
94+
end
95+
96+
if self.OverwriteWater.Value then
97+
materials[Enum.Material.Water] = true
98+
else
99+
materials[Enum.Material.Water] = nil
100+
end
101+
102+
return materials
103+
end
104+
105+
62106
function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
63-
if self.ReplaceExistingTerrain.Value then
107+
if not self.OverwriteTerrain.Value and not self.OverwriteWater.Value then
108+
warn("[TerrainConverter] - Doing nothing -- OverwriteWater and OverwriteTerrain are both disabled")
109+
return
110+
end
111+
if (self.OverwriteTerrain.Value and self.OverwriteWater.Value)
112+
or (desiredMaterial == Enum.Material.Air and self.OverwriteWater.Value) then
64113
workspace.Terrain:FillBlock(blockCFrame, blockSize, desiredMaterial)
65114
return
66115
end
67116

117+
local overwriteMaterials = self:_getOverwriteMaterials()
118+
68119
-- https://pastebin.com/S03Q8ftH
69120

70121
local aa_size, aa_position = BoundingBox.GetBoundingBox({{
@@ -123,7 +174,7 @@ function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
123174
-- Use terrain tools filling behavior here
124175
if smallestSize <= 2 then
125176
if brushOccupancy >= 0.1 then
126-
if cellMaterial == MATERIAL_AIR or cellOccupancy <= 0 then
177+
if overwriteMaterials[cellMaterial] or cellOccupancy <= 0 then
127178
materialVoxels[x][y][z] = desiredMaterial
128179
end
129180
occupancyVoxels[x][y][z] = 1
@@ -132,7 +183,7 @@ function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
132183
if brushOccupancy > cellOccupancy then
133184
occupancyVoxels[x][y][z] = brushOccupancy
134185
end
135-
if brushOccupancy >= 0.1 and cellMaterial == MATERIAL_AIR then
186+
if brushOccupancy >= 0.1 and overwriteMaterials[cellMaterial] then
136187
materialVoxels[x][y][z] = desiredMaterial
137188
end
138189
end
@@ -143,13 +194,20 @@ function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
143194
workspace.Terrain:WriteVoxels(region, self.RESOLUTION, materialVoxels, occupancyVoxels)
144195
end
145196

146-
147197
function TerrainConverter:_fillBall(center, radius, desiredMaterial)
148-
if self.ReplaceExistingTerrain.Value then
198+
if not self.OverwriteTerrain.Value and not self.OverwriteWater.Value then
199+
warn("[TerrainConverter] - Doing nothing -- OverwriteWater and OverwriteTerrain are both disabled")
200+
return
201+
end
202+
203+
if (self.OverwriteTerrain.Value and self.OverwriteWater.Value)
204+
or (desiredMaterial == Enum.Material.Air and self.OverwriteWater.Value) then
149205
workspace.Terrain:FillBall(center, radius, desiredMaterial)
150206
return
151207
end
152208

209+
local overwriteMaterials = self:_getOverwriteMaterials()
210+
153211
local resolution = self.RESOLUTION
154212

155213
local radius3 = Vector3.new(radius, radius, radius)
@@ -177,7 +235,7 @@ function TerrainConverter:_fillBall(center, radius, desiredMaterial)
177235
-- Use terrain tools filling behavior here
178236
if radius <= 2 then
179237
if brushOccupancy >= 0.5 then
180-
if cellMaterial == MATERIAL_AIR or cellOccupancy <= 0 then
238+
if overwriteMaterials[cellMaterial] or cellOccupancy <= 0 then
181239
materialVoxels[x][y][z] = desiredMaterial
182240
end
183241
occupancyVoxels[x][y][z] = 1
@@ -186,7 +244,7 @@ function TerrainConverter:_fillBall(center, radius, desiredMaterial)
186244
if brushOccupancy > cellOccupancy then
187245
occupancyVoxels[x][y][z] = brushOccupancy
188246
end
189-
if brushOccupancy >= 0.5 and cellMaterial == MATERIAL_AIR then
247+
if brushOccupancy >= 0.5 and overwriteMaterials[cellMaterial] then
190248
materialVoxels[x][y][z] = desiredMaterial
191249
end
192250
end

src/UI.lua

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,16 @@ function UI.new(gui, selectonService, terrainConverter)
4545

4646
self._replaceExistingTerrain = Checkbox.new({
4747
Name = "Overwrite terrain";
48-
BoolValue = self._terrainConverter.ReplaceExistingTerrain;
48+
BoolValue = self._terrainConverter.OverwriteTerrain;
4949
})
5050
self:_addOptionGui(self._replaceExistingTerrain)
5151

52+
self._ignoreWater = Checkbox.new({
53+
Name = "Overwrite water";
54+
BoolValue = self._terrainConverter.OverwriteWater;
55+
})
56+
self:_addOptionGui(self._ignoreWater)
57+
5258
return self
5359
end
5460

src/init.server.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ local function activate(button)
4343
local maid = Maid.new()
4444

4545
local converter = TerrainConverter.new()
46+
maid:GiveTask(converter)
4647

4748
local newScreenGui = screenGui:Clone()
4849
maid:GiveTask(newScreenGui)

src/terrainMaterialList.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,9 @@ return {
116116
image = "rbxasset://textures/TerrainTools/mtrl_pavement.png",
117117
text = "Pavement",
118118
},
119+
{
120+
enum = Enum.Material.Air,
121+
image = "rbxassetid://1618431047",
122+
text = "Air",
123+
},
119124
}

0 commit comments

Comments
 (0)