In-Depth Scripting Guide
What You Need!
- GoodBlox Studio
- Explorer Tab - This tells you exactly where everything is.
- Properties Tab - This tells you all the things editable in an object.
- Output - SCRIPTER'S BEST FRIEND. It tells you any mistakes (syntax, values, ect) found in a script, and where to find it.
- Command Prompt (Optional) - Not really needed, but is a great way to test out one-lined wonders.
- Any script; new or old (Optional) - If you want an example script to look at, you can always pick one out of the toolbox.
Order of Operations; Script Style (VFC)
There is an order of which you should add your operations, just like in math. A mnemonic device for this order is "VFC", for "Variables, Functions, and Connections". A good script usually has itself in a neat and tidy order so that almost anyone can understand what the script does just by looking at it.
Variables
Usually in a script, there is a specific order in which you put your operations. First off, one of the most important things to put in the very beginning are variables. Variables are used to note objects that will be used a lot. If you like to be organized, you like to put things in models. Sometimes, that model chain can get pretty lengthy.
Example:
example = game.Workspace.Example
Notice how the variable has a name, which is "example." The name can be anything except numbers alone. If you have a name of just numbers and you use it in a script, you will end up with a syntax error. When defining a variable, you need to tell exactly where it is. The Explorer tab helps with this as there is always a little tab telling you that that object is a child of something. When typing the parental of the object you want, spell the parental(s) correctly. You do not need the function ":FindFirstChild()" when making variables.
Functions
Secondly, in many scripts, you will come across a function. A function is something that can be used repeatedly. Some functions are also used to shorten script length, and some are just there because someone didn't want to delete it. When I create functions, I create the ones without a connection first, and then I create the ones with a connection line afterwards. If I do it like this, I can use the non-connections in the ones with connections. After all the things inside, you always close a function with an "end" statement.
Example:
bin = script.Parent function anchor(object) object.Anchored = true end function onTouched(part) anchor(part) end bin.Touched:connect(onTouched)
There is the one variable, not really needed but I need to stress its importance. In the first function, as in every function, the term "function" is first. It is correct if the term turns purple. After the term "function," the function needs to be named (in the example, there are two -- named "anchor" and "onTouched".) Do not use numbers as a name. It is better to spell out numbers in names, except in some occasions. Now, after the name, you'll see the word "object" in parentheses. You can rename it anything you want, except numbers, and you can use it for anything you want. It's like a function variable, you can use it to do other things and use it repeatedly with different terms. You can also add more variables to this by using commas. So, this example could have been made: "function anchor(object, statement)". In this function, though, it is anchoring the object no matter what. Finally, the "end" statement.
In the second function, the function has a connection line. It's the same as the first function, the "function" statement, the function name, and the variable. The difference is, the previous function anchors the so-called "part." The variable is defined as "part," which is in this case, the object being touched. Finally, the "end" statement as always.
Connection Lines
it If you look in the above example, you will notice a connection line. A connection line does what it says, connects the function to something done. The layout for a connection line is very simple. This is also one of the parts of a script when the scripter is most happy, before they test it out, that is. The connection lines usually tell you that the script is done and it is time to test.
Example:
bin = script.Parent function anchor(object) object.Anchored = true end function onTouched(part) anchor(part) end bin.Touched:connect(onTouched)
Presuming this script is inside of a brick, it can therefore be touched. In the variables, the brick is called "bin." In the connection line, there is a specific order in which the line should be. It should be like this:
(Object).(Action):connect((Function Name))
The object "bin," is therefore being "Touched" and we are connecting it being touched with the function "onTouched."
NOTE: To find actions, check in the Object Browser. To get to the Object Browser, go into GoodBlox Studio, press "Help" on top, then hit Object Browser. When there, you can find what you can do to objects by clicking on their name and scrolling all the way down. The actions are the ones with a lightning bolt next to them.
Basic Lua Terms
Throughout Lua, you will find terms like 'if', 'local', and 'for'. In this section, I will teach you Basic Lua terms. I recommend, if you haven't, to read the Order of Operations section of this guide before going on with this one.
The 'if' Statement
"An if statement tests its condition and executes its then-part or its else-part accordingly. The else-part is optional."[1]
Example One
brick = game.Workspace.Brick if brick~=nil then print("The brick is here!") end
First is the "brick" variable, followed by the "if" statement. The "if" statement is asking whether the "brick" is not "nil". "Nil" meaning nothing. This means that if the brick is there, it will print in the output, "The brick is here!" On the next line, there's the 'end'.
A common mistake is if you are makeing the 'if' statement check a variable, be sure to put == not =. == means equal to. = means __ is __
Example Two
number = 0 while number < 10 do wait(1) number = number +1 if number > 5 then print("Number Greater Than 5!") end end
On the first line, "number" is 0. The next step is a 'while true do' loop. It waits one second then "number" will increase by one. Then there is the 'if' statement. It is now asking if "number" is greater than 5. If "number" is greater than 5, it will print, "Number Greater Than 5!" If it isn't greater than 5, then it will just skip it and repeat the loop. Once "number" turns to 11, the loop will end. This also goes with connection functions.
TIP: When using 'if' statements, use the proper Operations of comparison.
The 'else' Statement
Say you have an 'if' function, but it doesn't meet the requirements. That's when the 'else' kicks in. It does the function of the else onwards.
Example: if game.Workspace == game.Lighting then print("NOWAI!!!") else print("Whew. That was close.") end
Well, there's the 'if' statement, which is impossible. Now, if it can't fulfill the requirement, it goes to the 'else' statement. So it does its function and prints to the output the statement in quotes. Then the end.
The 'elseif' Statement
'Elseif' is not an 'if' function. So what is the difference between 'elseif' and 'else if'? 'Elseif' is counted as an 'else' with a requirement for it to be run, and doesn't need an end. On the other hand, 'else if' is comprised of two statements: an else, and an if. Therefore, it needs a 'end' for the 'if' statement. 'Elseif' is ALOT more secure that 'else', because the lines of script after it only runs if the condition after the 'elseif' is met. Unless you want the folowing lines to be run only if the 'if' statement is false, then use 'elseif' to make sure that the lines only run if the 'elseif' condition is met.
waffleboy = true Example 1: if waffleboy == false then print("NOWAI!!") elseif waffleboy == true then print("YAWAI!!") end Example 2A: if waffleboy == false then print("NOWAI!!") else if waffleboy == true then print("YAWAI!!") end end Example 2B: if waffleboy == false then print("NOWAI!!") else if waffleboy == true then print("YAWAI!!") end end
'Elseif' doesn't need an end, but 'else if' does, because Example 2A and Example 2B are the same.
The 'repeat' Statement
This will keep on repeating what is put after until the 'until' statement is achieved.
a = 0 repeat a = a + 0.1 until (a = 1) then print("a equals to 1!") end
The 'until' Statement
The until statement always goes after a repeat statement. Whatever is inbetween 'repeat' and 'until' will be repeated until the statement in between the parentheses is achieved.
a = 0 repeat a = a + 1 until (a = 8) then print("a equals 8") end
The 'end' Statement
Always remember to put this to end an 'if' statement. This can also end the 'while' functions and 'for' functions and functions themselves. Also, either 'repeat' or 'until' statement requires an end. EIther way, you will still need one. Example for 'if':
value = true if value == true then print ("You are correct!") end
Example for 'for':
a = game.Workspace:GetChildren() for i = 1, #a do if a[i].className == "Part" and a[i].Locked == false then a[i]:Remove() end
Example for 'while':
a = 0 while true do if a == 1 then break end a = a + 0.1 wait(1) end end
Example for function:
function clean(part) part:Remove() end clean(game.Workspace.Example)
The 'local' Statement
Whenever you are scripting and you canot make something a variable, like making a variable out of a function variable, you should use the term 'local'.
Example:
bin = script.Parent function onTouched(part) local h = part.Parent:FindFirstChild("Humanoid") if h~=nil then print("Hi!") end end bin.Touched:connect(onTouched)
'local' is just what it is, local. It is not a global statement like variables are, so it can be used in a whole different function, as long as it isn't stated already in the same function. Remember if you (for example) define a local variable for a global variable, and you edit the local variable, the global variable will not change, unless you put the local = global
local a = game.Workspace:findFirstChild("Score").Value while true do a = a + 1 game.Workspace:findFirstChild("Score").Value = a -- This line basically "Updates" the real varible value with the "a" value. wait(1) end
The 'while' Condition
While is a condition. If it is false, the loop will end. If it is true, the loop will be executed, and the process will be repeated.[2]
Example one:
while true do wait(3) print("Hello World!") end
Example two:
example = true while example == true do wait(3) print("Hello World!") example = false end
Example one shows a function that will never end. It will wait 3 seconds, then post into the output 'Hello World!'. In example two, it does the same thing except this time, 'example' must be true for it to run. This one will wait 3 seconds, print the same thing, then turn its example to false. If you tried it, you will notice that it only runs once. Remember, all function statements need an 'end'. Note: Whenever a "while true do" is running, you always need a "wait()" statement. If you do not have a "wait()" statement, your place will not function and it will just hang, and lock up your program.
The 'for' Statement
This goes through all of the objects noted and chooses different objects based on your 'if' statements.
Example One:
for i=1, 6 do print("Hi") end
This repeats the function 6 times, each time printing the word "Hi".
Example Two:
bricks = 0 local c = game.Workspace:GetChildren() for i=1, #c do if c[i].className == "Part" then bricks = bricks + 1 end end print(bricks)
The first line tells you that there are 0 bricks. Now we are naming our parent, "c", a very common term when using 'for'. Now the 'for' statement. "for i=1, #c do" says "go through the all of 'c'" Now the 'if' statement. When noting each brick in a 'for' 'if' statement, you need to have it in this format: "c[i]" (Based on this example) The script goes through everything in the Workspace, and if the object is a Part, the brick count goes up by one, then prints into the output the number it ends up on.