Lua - Reddit – Telegram
Lua - Reddit
31 subscribers
281 photos
31 videos
4.27K links
News and discussion for the Lua programming language.

Subreddit: https://www.reddit.com/r/lua

Powered by : @r_channels & @reddit2telegram
Download Telegram
Media is too big
VIEW IN TELEGRAM
Free Beta of our Lua Framework to develop Full-Stack Web Apps (details in comments)

https://redd.it/1f7h27e
@r_lua
How much programing knowledge do I need to complete a small project

I want to create a watcraft addon to block achievements from showing on screen. (I eventually would like to do more, but for now this is it)

I am a technical translator by trade, but I have zero programing knowledge.

I am currently half way through codecademy's LUA course (free trial) and I know that there are some youtube videos online. I also know that one specific book is recommended, but I know from experience that I do not learn from reading, I do far, far better through hands on (hence codecademy).

I would like to know if my goal is realistic, or if there are elements I'm overlooking.

https://redd.it/1f8at7f
@r_lua
Links?

I don’t think it’s possible, but can you use a regular old lua compiler to open a link? I wouldn’t think so, but just wondering.

https://redd.it/1f8deex
@r_lua
need help discordia

https://preview.redd.it/4dh3kkuvlomd1.png?width=703&format=png&auto=webp&s=6ec5749d1ad4ff8d32c2b253abb676cc6d77bfd2

im currenty trying to make an discord bot it get online but dosent answer anything (ik i need put a token) can u guys help me?

https://redd.it/1f8ewkv
@r_lua
Learning Lua.

I’ve been learning Lua for a few months now, I always wanna try making small projects, but when I actually get to typing, I don’t know what to write, or how to even start it. It’s as if I forget everything I’ve learned. Any tips??

https://redd.it/1f97lq9
@r_lua
Need help manually setting upvalue variables for 'load'ed LUA chunk

(Cross posting from [the original in SO](https://stackoverflow.com/questions/78950971/manually-setting-upvalue-variables-for-loaded-lua-chunk) because getting no views on it 😞)

I'm rolling out my own LUA debugger for a C++ & LUA project and I just hit a bit of a hurdle. I'm trying to follow MobDebug's implementation for setting expression watches, which after removing all the bells and whistles essentially boils down to string-concatenating the expression you want to watch inside a `return(...)` statement and running that. The exact line is:

local func, res = mobdebug.loadstring("return(" .. exp .. ")")

This works perfectly as long as you're just debugging a single noscript and most of your variables are just in the global environment, but for my own purposes I'm trying to restrict / scope down the evaluation of these `return(...)` expressions to certain tables and their fields.

More specifically, I'm working with some LUA "classes" using the `setmetatable / __index` pattern, and, given access to the table (let's call it `SomeClass`) I'd like to be able to evaluate expressions such as

self.mSomeVariable + self.mSomeOtherVariable - self:someOperation(...)

where `self` is referring to `SomeClass` (i.e. there exists `SomeClass:someOperation`, etc).

I'm really at my wits end on how to approach this. At first I tried the following, and it most definitely didn't work.

> SomeClass = {}
> SomeClass.DebugEval = function(self, chunk_str) return load("return(" .. chunk_str .. ")")() end
> SomeClass.DebugEval(SomeClass, "print(1)") // 1 nil
> SomeClass.DebugEval(SomeClass, "print(SomeClass)") // table: 0000000000CBB5C0 nil
> SomeClass.DebugEval(SomeClass, "print(self)") // nil nil

The fact that I cannot even reference the "class" via `self` by passing it in directly to the wrapping function's argument makes me suspicious that this might be a `upvalue` problem. That is, `load(...)` is creating a closure for the execution of this chunk that has no way of reaching the `self` argument... but why? It's quite literally there???

In any case, my debugger backend is already on C++, so I thought "no problem, I'll just manually set the `upvalue`". Again, I tried doing the following using `lua_setupvalue` but this also didn't work. I'm getting a runtime error on the `pcall`.

luaL_dostring(L, "SomeClass = {}"); // just for convenience; I could've done this manually
luaL_loadstring(L, "print(1)"); // [ ... , loadstring_closure ]
lua_getglobal(L, "SomeClass"); // [ ... , loadstring_closure, reference table]
lua_setupvalue(L, -2, 1); // [ ... , loadstring_closure] this returns '_ENV'
lua_pcall(L, 0, 0, 0); // getting LUA_ERRRUN

What am I missing here? Perhaps I'm approaching this in a totally incorrect way? My end goal is simply being able to execute these debugger watches but restricted to certain class instances, so I can enable my watches on a per-instance basis and inspect them. And yes, I absolutely need to roll out my own debugger. It's a long story. Any and all help is appreciated.

https://redd.it/1f9a5xn
@r_lua
Which book is good for learning roblox Lua?

Is the Programming In Lua book series good for learning Lua on Roblox? If not tell me some good books for learning Roblox Lua.

https://redd.it/1f9dr3b
@r_lua
How can I start an array from 0?
https://redd.it/1far5jk
@r_lua
How to correctly install lua on windows?

I found a YouTube video to install lua binaries, followed the steps, and watched it multiple times, but still I can’t seem to get it working. Any help?

https://redd.it/1fb7v50
@r_lua
How do you make like a spell? Like any spell like I’ll use the example of of shadow bolt like, how would you like noscripted into like a game?



https://redd.it/1fbak6b
@r_lua
everything was working great. If i hide behind an object the enemy loses agro. however it is immediate and i want the enemy to chase you until you are out of its sight for 1-5 seconds and when i add this code it works just how i want but now the enemy wont damage the player.


>-- Variables --



local Pathfinding = game:GetService("PathfindingService")



local Players = game:GetService("Players")



local RunService = game:GetService("RunService")



local Enemy = noscript.Parent



local Humanoid = Enemy:WaitForChild("Humanoid")



Enemy.PrimaryPart:SetNetworkOwner(nil)



local waypoints



local nextWaypointIndex



local reachedConnection



local blockedConnection



local WalkSpeed = Enemy:GetAttribute("WalkSpeed")



local SprintSpeed = Enemy:GetAttribute("SprintSpeed")



local Damage = Enemy:GetAttribute("Damage")



local function getPath(destination)



`local path = Pathfinding:CreatePath({`



`AgentHeight = 6;`



`AgentRadius = 3;`



`AgentCanJump = false;`



`AgentCanClimb = false;`







`Costs = {`



`Water = 100;`



`DangerZone = math.huge`



`}`



`})`







`path:ComputeAsync(Enemy.HumanoidRootPart.Position, destination.Position)`







`return path`

end



local function isTargetVisible(target)



`local origin = Enemy.HumanoidRootPart.Position`



`local direction = (target.HumanoidRootPart.Position - origin).Unit * 50`



`local ray = Ray.new(origin, direction)`



`local hit, position = workspace:FindPartOnRay(ray, Enemy)`







`return hit and hit:IsDescendantOf(target)`

end



local function findTarget()



`local nearestTarget`



`local MaxDistance = 50`







`for index, player in pairs(Players:GetPlayers()) do`



`if player.Character then`



`local target = player.Character`



`local distance = (Enemy.HumanoidRootPart.Position - target.HumanoidRootPart.Position).Magnitude`







`if distance < MaxDistance and isTargetVisible(target) then`

nearestTarget = target



MaxDistance = distance



`end`



`end`



`end`







`return nearestTarget`

end



local function Capture (target)



`local distance = (Enemy.HumanoidRootPart.Position - target.HumanoidRootPart.Position).Magnitude`



`local hiddenTime = 0`







`while true do`



`if distance > 3 then`



`Humanoid:MoveTo(target.HumanoidRootPart.Position)`



`else`



`target.Humanoid:TakeDamage(Damage)`



`-- Stun the enemy for 3 seconds`



`Humanoid.WalkSpeed = 0`



`task.wait(3)`



`Humanoid.WalkSpeed = WalkSpeed`



`end`







`if not isTargetVisible(target) then`



`hiddenTime = hiddenTime + task.wait(1)`



`if hiddenTime >= 5 then`

break



`end`



`else`



`hiddenTime = 0`



`end`







`task.wait(0.1)`



`end`

end



local function walkTo(destination)



`local path = getPath(destination)`







`if path.Status == Enum.PathStatus.Success then`



`for index, waypoint in pairs(path:GetWaypoints()) do`



`local target = findTarget()`







`if target then`

Capture(target)



Enemy.Humanoid.WalkSpeed = SprintSpeed



break



`else`

Enemy.Humanoid.WalkSpeed = WalkSpeed



Humanoid:MoveTo(waypoint.Position)



Humanoid.MoveToFinished:Wait()



`end`



`end`



`else`



`Humanoid:MoveTo(destination.Position - (Enemy.HumanoidRootPart.CFrame.LookVector *10))`



`end`

end



local function LoseAgression()



`local OutOfSightTime = 0`



`local Enemy = noscript.Parent`



`local Target = noscript.Parent.Target.Value`



`local TargetLost = false`







`if OutOfSightTime >= 5 then TargetLost = true`







`if TargetLost then Enemy.Target.Value = nil`







`end`







`end`

end



local function Patrol()



`local waypoints = workspace.Waypoints:GetChildren()`



`local randomWaypoint = math.random(1, #waypoints)`



`walkTo(waypoints[randomWaypoint\])`

end



while task.wait(0.01) do



`Patrol()`

end

https://redd.it/1fbnj3j
@r_lua
Object placement system relative to plot position?

Hello everyone!

I'm making a game for Roblox and have developed an object placement system. A plot template is stored in `ServerStorage` (don't worry if you don't know what that is) and multiple plot markers are positioned throughout the game world. When a player joins, they are assigned a plot marker, and the plot template is cloned, assigned to the player, and positioned to align with their marker.

This is how I handle grid snapping as of right now (`pos` is the player's mouse location) (Using the operator `//` is the same as dividing `pos.X` or `pos.Z` by `GRID_SIZE` and then rounding the quotient).

function placementValidation.SnapToGrid(pos: Vector3)
local GRID_SIZE = 4

return Vector3.new(pos.X // GRID_SIZE,
1 / GRID_SIZE,
pos.Z // GRID_SIZE
) * GRID_SIZE
end

Currently, my grid snapping works fine as long as each plot marker’s X and Z coordinates are multiples of four. However, I want to modify `SnapToGrid()` so it adapts to the player's plot marker position, allowing plot markers to be placed anywhere in the world while keeping the grid aligned correctly.

I’ve tried adding objects and positioning them at each node inside the plot template, then looping through them to identify valid positions. Unfortunately, this approach significantly reduced performance since `SnapToGrid()` runs constantly during object placement.

I'm stuck trying to figure out the best approach to achieving this. If anyone has any experience creating something similar to this or has any ideas, your comments would be much appreciated. Thank you!

https://redd.it/1fbp2ql
@r_lua
Can add : functions to string, but not table?

Anyone know why addItem() fails, but appendPadded works?

function table:addItem(item)
self#self+1 = item
end

function string:appendPadded(str, width)
spaces = width - str:len()
local res = self .. str
for i=1,spaces do
res = res .. ' '
end
return res
end


function test()
entries = {}
entries:addItem({"foo"})

string str = "1. "
str:appendPadded("something", 15)
end


I get an error like this:
Stack: 1 table 0x6000011238c0
2 string
Test.lua:138: attempt to call a nil value (method 'addItem')

It works fine if I do table.addItem(entries, {}). I prefer the more OOP syntax tho...


https://redd.it/1fc1wdv
@r_lua
I am interested in starting learning programing for game development. Is Lua a good option to start with?

I have some small experience with programing from my university, that being Matlab and C. But despite that I am basically a complete beginner. Is lua the correct choice for game development or should I not waste any time and learn C++ that I can use with unreal engine?

https://redd.it/1fcbxrc
@r_lua
Removing element from the array the wrong way

Hi all,

Is this user bug, UB or working as intended?

function printArray(action, arr)
print(action .. ": size is " .. #arr .. ", elements are: ")

for key, value in pairs(arr) do
print(key, value)
end
print("---------")
end

myarray = { 1, 2, 3, 4 }

my
array2 = nil -- <<<<<< this is the critical line

--table.remove(myarray, 2) -- this is the correct way, I know
printArray("after remove", my
array)

table.insert(myarray, "world")
printArray("after insert", my
array)

myarray[2] = "hello"
printArray("after assign", my
array)

I would have expected either of these two to happen:

the element is removed from the array, just like if table.remove was called
the table stops pretending that it is an array, and #my_array becomes 0

What I did not expect is that #my_array stays 4, but the element is removed.

https://redd.it/1fcqj7c
@r_lua