Feature Add-ins

Feature Add-ins expand almostLua functionality by adding libraries, functions or properties that may not arrive out of the box. Add-ins are snippets of almostLua code that go at the top of your script.

Table Add-in

By default, the almostLua table library only has three functions: find, insert and remove. However, this add-in expands it to clear, clone, concat, create, find, freeze, isfrozen, insert, maxn, move, remove:

local table = {
	clear = function(tbl)
		for i, _ in pairs(tbl) do
			tbl[i] = nil
		end
	end,
	clone = function(tbl)
		local newTbl = {}
		for i, v in pairs(tbl) do
			newTbl[i] = v
		end
		return newTbl
	end,
	concat = function(tbl, sep, i, j)
		local newString = ""
		i = i or 1
		j = j or #tbl
		for x = i, j do
			newString = newString .. tbl[x] .. (sep or "")
		end
		return newString
	end,
	create = function(count, value)
		local newTbl = {}
		for i = 1, count do
			newTbl[i] = value
		end
		return newTbl
	end,
	freeze = function(tbl)
		-- Do nothing
		return tbl
	end,
	isfrozen = function(tbl)
		-- Cannot freeze RetroStudio tables
		return false
	end,
	maxn = function(tbl)
		local max = 0
		for i, _ in pairs(tbl) do
			if i > max then
				max = i
			end
		end
		return max
	end,
	move = function(src, a, b, t, dst)
		if dst == nil then
			dst = src
		end
		for i = a, b do
			dst[t + i] = src[i]
		end
	end,
}

Shared Tables Add-in

This add-in adds the _G and shared tables, which allow you to share variables between scripts more efficiently. To use this add-in, you must be using almostLua 1.1 or higher.

Step 1: Import this model code into your RetroStudio game: 971466458 and place it in Lighting. Step 2: At the top of the Lua script that needs shared tables, insert the following:

local _G = require(game.Lighting:WaitForChild("Almost Lua Shared").G)
local shared = require(game.Lighting:WaitForChild("Almost Lua Shared").Shared)

Terrain Add-in

The default Terrain class in almostLua is very limited. However, with this add-in, you can expand it to its full functionality set. Note that the add-in makes only bare effort to recreate terrain, there are no textures, shapes nor special materials like water.

local Vector3int16 = {
	new = function(x, y, z)
		return Vector3.new(math.round(x), math.round(y), math.round(z))
	end,
}

local Region3int16 = {
	new = function(min, max)
		return {Min=min, Max=max}
	end,
}

local terrain = {
	colors = {
		Grass = BrickColor.new("Dark green"),
		Sand = BrickColor.new("New Yeller"),
		Brick = BrickColor.new("Reddish brown"),
		Granite = BrickColor.new("Medium stone grey"),
		Asphalt = BrickColor.new("Black"),
		Iron = BrickColor.new("Silver"),
		Aluminum = BrickColor.new("Ghost grey"),
		Gold = BrickColor.new("Bright yellow"),
		WoodPlank = BrickColor.new("Brown"),
		WoodLog = BrickColor.new("Reddish brown"),
		Gravel = BrickColor.new("Dark stone grey"),
		CinderBlock = BrickColor.new("Medium stone grey"),
		MossyStone = BrickColor.new("Earth green"),
		Cement = BrickColor.new("Light stone grey"),
		RedPlastic = BrickColor.new("Bright red"),
		BluePlastic = BrickColor.new("Bright blue"),
		Water = BrickColor.new("Bright blue")
	},
	terrainFolder = Instance.new("Folder", workspace),
	SetCell = function(self, xRaw, yRaw, zRaw, material, block, orientation)
		local x = math.round(xRaw)
		local y = math.round(yRaw)
		local z = math.round(zRaw)
		-- TODO: respect CellBlock and CellOrientation
		local newPosition = Vector3.new(x,y,z) * 4
		local oldCell = self.terrainFolder:FindFirstChild(tostring(newPosition))
		if oldCell then
			oldCell:Destroy()
		end
		if material == "Empty" then
			return
		end
		local newCell = Instance.new("Part", self.terrainFolder)
		newCell.Anchored = true
		newCell.Size = Vector3.new(4, 4, 4)
		newCell.Name = tostring(newPosition)
		newCell.Position = newPosition
		newCell.BrickColor = self.colors[material]
	end,
	SetCells = function(self, region, material, block, orientation)
		-- TODO: respect CellBlock and CellOrientation
		print("setcells called")
		local min, max = region.Min, region.Max
		local minX, minY, minZ, maxX, maxY, maxZ = min.X, min.Y, min.Z, max.X, max.Y, max.Z
		local iterX = 4
		local iterY = 4
		local iterZ = 4
		if minX > maxX then
			iterX = -4
		end
		if minY > maxY then
			iterY = -4
		end
		if minZ > maxZ then
			iterZ = -4
		end
		for x = minX, maxX, iterX do
			for y = minY, maxY, iterY do
				for z = minZ, maxZ, iterZ do
					self:SetCell(x/4, y/4, z/4, material, block, orientation)
				end
			end
		end
	end,
	GetCell = function(self, xRaw, yRaw, zRaw)
		local x = math.round(xRaw)
		local y = math.round(yRaw)
		local z = math.round(zRaw)
		local newPosition = Vector3.new(x,y,z) * 4
		local oldCell = self.terrainFolder:FindFirstChild(tostring(newPosition))
		if oldCell then
			local materialName = "Unknown"
			for material, color in pairs(self.colors) do
				if color == oldCell.BrickColor then
					materialName = material
				end
			end
			return materialName, "Solid", "X"
		else
			return "Empty", "Solid", "X"
		end
	end,
	Clear = function(self)
		self.terrainFolder:ClearAllChildren()
	end,
	AutowedgeCell = function(self)
		warn("STUB: AutowedgeCell")
	end,
	AutowedgeCells = function(self)
		warn("STUB: AutowedgeCells")
	end,
	CellCornerToWorld = function(self, x, y, z)
		return Vector3.new(x * 4, y * 4, z * 4)
	end,
	CellCenterToWorld = function(self, x, y, z)
		return Vector3.new((x + 0.5) * 4, (y + 0.5) * 4, (z + 0.5) * 4)
	end,
	CountCells = function(self)
		local cells = self.terrainFolder:GetChildren()
		local count = #cells
		return count
	end,
	GetWaterCell = function(self)
		return "None", "NegX"
	end,
	SetWaterCell = function(self, x, y, z, force, direction)
		self:SetCell(x, y, z, "Water")
	end,
	WorldToCell = function(self, position)
		local result = Vector3.new(
			math.floor(position.X / 4),
			math.floor(position.Y / 4),
			math.floor(position.Z / 4)
		)
		return result
	end,
	WorldToCellPreferEmpty = function(self, position)
		local result = self:WorldToCell(position)
		return result
	end,
	WorldToCellPreferSolid = function(self, position)
		local result = self:WorldToCell(position)
		return result
	end,
}
terrain.terrainFolder.Name = "Terrain"

Last updated