Skip to content

Commit a095778

Browse files
committed
Update plugin to semi-support wedges and cylinders
1 parent 1a646d2 commit a095778

File tree

3 files changed

+89
-56
lines changed

3 files changed

+89
-56
lines changed

places/test_plugin_place.rbxl

113 KB
Binary file not shown.

src/TerrainConverter.lua

Lines changed: 83 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,27 @@ function TerrainConverter.new()
3535
return self
3636
end
3737

38-
function TerrainConverter:_canConvertPart(item)
39-
if not item:IsA("Part") then
40-
return false
38+
function TerrainConverter:Convert(items, material)
39+
assert(items)
40+
assert(typeof(material) == "EnumItem")
41+
42+
local convertables = {}
43+
for _, item in pairs(items) do
44+
if self:_canConvertPart(item) then
45+
table.insert(convertables, item)
46+
end
4147
end
4248

43-
if item == Workspace.Terrain then
49+
-- don't fire change history service of nothing converts
50+
if #convertables <= 0 then
4451
return false
4552
end
4653

47-
if item.Shape == Enum.PartType.Block then
48-
return true
49-
elseif item.Shape == Enum.PartType.Ball then
50-
return true
51-
else
52-
return false
54+
self.ConversionStarting:Fire()
55+
for _, item in pairs(convertables) do
56+
self:_convertPart(item, material)
5357
end
58+
return true
5459
end
5560

5661
function TerrainConverter:CanConvert(items)
@@ -67,6 +72,29 @@ function TerrainConverter:CanConvert(items)
6772
return false
6873
end
6974

75+
76+
function TerrainConverter:_canConvertPart(item)
77+
if not (item:IsA("Part") or item:IsA("WedgePart")) then
78+
return false
79+
end
80+
81+
if item == Workspace.Terrain then
82+
return false
83+
end
84+
85+
if item:IsA("WedgePart") then
86+
return true
87+
elseif item.Shape == Enum.PartType.Block then
88+
return true
89+
elseif item.Shape == Enum.PartType.Ball then
90+
return true
91+
elseif item.Shape == Enum.PartType.Cylinder then
92+
return true
93+
else
94+
return false
95+
end
96+
end
97+
7098
function TerrainConverter:_getOverwriteMaterials()
7199
local materials = {}
72100
materials[Enum.Material.Air] = true
@@ -101,6 +129,51 @@ function TerrainConverter:_doFillUpwards(cellMaterial, desiredMaterial)
101129
return true
102130
end
103131

132+
function TerrainConverter:_convertPart(part, material)
133+
assert(typeof(material) == "EnumItem")
134+
assert(part:IsA("Part") or part:IsA("WedgePart"))
135+
136+
if part:IsA("WedgePart") then
137+
self:_fillWedge(part.CFrame, part.Size, material)
138+
elseif part.Shape == Enum.PartType.Block then
139+
self:_fillBlock(part.CFrame, part.Size, material)
140+
elseif part.Shape == Enum.PartType.Ball then
141+
self:_fillBall(part.Position, part.Size.x/2, material)
142+
elseif part.Shape == Enum.PartType.Cylinder then
143+
local size = part.Size
144+
local height = size.x
145+
local radius = math.min(size.y, size.z)
146+
self:_fillCylinder(part.CFrame * CFrame.Angles(0, 0, math.pi/2), height, radius, material)
147+
else
148+
warn(("[PartToTerrain] - Bad part.Shape, '%s' is not supported"):format(tostring(part.Shape.Name)))
149+
return false
150+
end
151+
152+
if not self.KeepConvertedPart.Value then
153+
part:Remove()
154+
end
155+
156+
return true
157+
end
158+
159+
function TerrainConverter:_fillWedge(wedgeCFrame, wedgeSize, desiredMaterial)
160+
if (self.OverwriteTerrain.Value and self.OverwriteWater.Value) then
161+
Workspace.Terrain:FillWedge(wedgeCFrame, wedgeSize, desiredMaterial)
162+
return
163+
end
164+
165+
warn("[TerrainConverter._fillWedge] - Cannot convert wedge with overwrite terrain, or overwrite water enabled!")
166+
end
167+
168+
function TerrainConverter:_fillCylinder(cylinderCFrame, height, radius, desiredMaterial)
169+
if (self.OverwriteTerrain.Value and self.OverwriteWater.Value) then
170+
Workspace.Terrain:FillCylinder(cylinderCFrame, height, radius, desiredMaterial)
171+
return
172+
end
173+
174+
warn("[TerrainConverter._fillCylinder] - Cannot convert wedge with overwrite terrain, or overwrite water enabled!")
175+
end
176+
104177
function TerrainConverter:_fillBlock(blockCFrame, blockSize, desiredMaterial)
105178
if (self.OverwriteTerrain.Value and self.OverwriteWater.Value) then
106179
Workspace.Terrain:FillBlock(blockCFrame, blockSize, desiredMaterial)
@@ -251,51 +324,6 @@ function TerrainConverter:_fillBall(center, radius, desiredMaterial)
251324
end
252325

253326
Workspace.Terrain:WriteVoxels(region, resolution, materialVoxels, occupancyVoxels)
254-
print("Done writing voxels")
255-
end
256-
257-
function TerrainConverter:_convertPart(part, material)
258-
assert(typeof(material) == "EnumItem")
259-
assert(part:IsA("Part"))
260-
261-
if part.Shape == Enum.PartType.Block then
262-
self:_fillBlock(part.CFrame, part.Size, material)
263-
elseif part.Shape == Enum.PartType.Ball then
264-
self:_fillBall(part.Position, part.Size.x/2, material)
265-
else
266-
warn(("[PartToTerrain] - Bad part.Shape, '%s' is not supported"):format(tostring(part.Shape.Name)))
267-
return false
268-
end
269-
270-
if not self.KeepConvertedPart.Value then
271-
part:Remove()
272-
end
273-
274-
return true
275-
end
276-
277-
278-
function TerrainConverter:Convert(items, material)
279-
assert(items)
280-
assert(typeof(material) == "EnumItem")
281-
282-
local convertables = {}
283-
for _, item in pairs(items) do
284-
if self:_canConvertPart(item) then
285-
table.insert(convertables, item)
286-
end
287-
end
288-
289-
-- don't fire change history service of nothing converts
290-
if #convertables <= 0 then
291-
return false
292-
end
293-
294-
self.ConversionStarting:Fire()
295-
for _, item in pairs(convertables) do
296-
self:_convertPart(item, material)
297-
end
298-
return true
299327
end
300328

301329
return TerrainConverter

src/init.server.lua

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
--- Part to terrain plugin
2+
-- @script Plugin
23
-- @author Quenty
34

45
local HttpService = game:GetService("HttpService")
@@ -95,11 +96,15 @@ else
9596
"rbxassetid://1618168422"
9697
)
9798

98-
button.Click:connect(function()
99+
button.Click:Connect(function()
99100
if not isActive then
100101
activate(button)
101102
else
102103
deactivate(button)
103104
end
104105
end)
106+
107+
plugin.Unloading:Connect(function()
108+
deactivate(button)
109+
end)
105110
end

0 commit comments

Comments
 (0)