Intro to Scripting: Make an Invisibility Tool
This is an Advanced, Lua related tutorial. |
Introduction
This tutorial is for people who wish to learn more about creation of tools, or who wish to add an invisibility tool to their map. It contains a basic invisibility script, without fading of characters.
How the Tool Works
The invisibility tool is a HopperBin object so it will be able to be selected. It sets the Transparency values of all the player's parts to 1, which is completely transparent. To make this work in multiplayer, the script to make the player transparent has to be in the player, not the player's backpack. To this end, the true invisibility script is made to not work in the player's backpack, and is copied into the player; when the player becomes visible again, it is removed. A second script in the backpack copies the script to the player when it is activated.
Invisibility
The first script to be created is a script for hiding a model. This script can be copied into the player to make the player invisible, and can have a varied amount of time of invisibility.
Tutorial
As the script will only be two places, in a HopperBin and in a player, the script can deal with just those cases. The script should only run if it is in the player. If it is in the player, the parent of the script will have a class name of "Model". To check this, the script can have the "if" statement:
if (script.Parent.className == "Model") then
If the script is in the model, it should make it invisible. To do this, the script must find all the player's model's children. The function children() returns an array (table) of children of the object that called it. The script can assign a variable to the table produced.
modelChildList = script.Parent:children()
Next, the script must make the player's children invisible. A "for" loop can do the job.
for p = 1, #modelChildList do -- Make the player invisible if (modelChildList[p].className == "Part") then -- Only work on bricks modelChildList[p].Transparency = 1 -- Transparent end end
Once the player is invisible, the script should wait for a pre-defined time. This time can either be hard-coded into the script or transmitted by the activation script. The hard-coded approach can be accomplished by:
wait(Invisibility Time)
Where Invisibility Time is the number of seconds to be invisible. The transmitted approach uses a NumberValue object. It can be implemented as:
wait(script:findFirstChild("NumberValue Name").Value)
Where NumberValue Name is a string representing the name of the number. A good name is "InvisibilityTime". After the invisibility wait time is over, the previous for-loop can be modified to make the player visible.
for p = 1, #modelChildList do -- Make the player visible if (modelChildList[p].className == "Part") then -- Only work on bricks modelChildList[p].Transparency = 0 -- Solid end end
After this is done, the script is useless. It's time to get rid of it. To do this, the script's Parent value can be set to nil
script.Parent = nil
Example
If the script has been created exactly according to directions, or is just copied, then it will have the following code (with one or two changes): Note: the name of this script is "Fade"
print("Fading script loaded") if (script.Parent.className == "Model") then -- Only deals with player characters, so no need for extra modelChildList = script.Parent:children() for p = 1, #modelChildList do -- Make the player invisible if (modelChildList[p].className == "Part") then modelChildList[p].Transparency = 1 -- Invisible end end wait(script:findFirstChild("InvisibilityTime").Value) for p = 1, #modelChildList do -- Make player visible if (modelChildList[p].className == "Part") then modelChildList[p].Transparency = 0 -- Visible end end script.Parent = nil -- Remove the (now useless) script from the game end
Activation
The previous script makes a player invisible. This script activates the other script.
Tutorial
First, the script needs to know when it is selected, and with what Mouse object. This will let it know when to activate the invisibility. To this end, a function is added:
function onSelected(mouse) -- When the weapon is selected, make the script recognize clicks setCursor(mouse) -- Make the mouse indicate readiness. This is currently a dummy. mouse.Button1Down:connect(function() onButton1Down(mouse) end) -- Make the activation script be called when there is a click. end
This will make onButton1Down() be called with an argument (input) of the mouse name whenever the mouse clicks while the tool is selected. setCursor is a dummy function (it will be added later, but it is only a stylistic thing). Next, the onButton1Down function should be added:
enabled = true -- A boolean value, made to stop multiple invisibilities invisibilityTime = 8 -- Time the person will be invisible reloadTime = 4 -- Additional time to reload function onButton1Down(mouse) if enabled then enabled = false -- Stop multiple invisibilities setCursor(mouse) -- Not ready anymore playerScript = script.Parent.Fade:clone() -- Copy the fading script playerScript.Parent = game.Players.LocalPlayer.Character -- and place it in the player scriptTimeOut = Instance.new("NumberValue") -- Give it a time before becoming visible again scriptTimeOut.Name = "InvisibilityTime" -- This name must be coded into the other script scriptTimeOut.Value = invisibilityTime -- Time to stay invisible scriptTimeOut.Parent = playerScript wait(reloadTime + invisibilityTime) -- Wait for a proper reload time enabled = true -- Ready again end setCursor(mouse) -- Set apropriate cursor end
setCursor is still a dummy (not made yet). This script activates the other script (named "Fade" here), and gives it a value to use as an invisibility time. With all the rest done, it's time to make setCursor a real function:
function setCursor(mouse) if enabled then mouse.Icon = "rbxasset://textures\\ArrowCursor.png" else mouse.Icon = "rbxasset://textures\\ArrowFarCursor.png" end end
mouse.Icon is the image used for the cursor. "rbxasset://textures\\ArrowCursor.png" and "rbxasset://textures\\ArrowFarCursor.png" are standard cursor images available to GoodBlox clients. setCursor Changes the cursor to an appropriate image based on the enabled boolean.
Example
If the script has been made exactly according to the tutorial, or was just copied, it will look like this:
print("Invisibility hopper script loaded") enabled = true invisibilityTime = 8 -- Time the person will be invisible reloadTime = 4 -- Additional time to reload function setCursor(mouse) if enabled then mouse.Icon = "rbxasset://textures\\ArrowCursor.png" else mouse.Icon = "rbxasset://textures\\ArrowFarCursor.png" end end function onButton1Down(mouse) if enabled then enabled = false setCursor(mouse) -- Not ready anymore playerScript = script.Parent.Fade:clone() -- Copy the fading script playerScript.Parent = game.Players.LocalPlayer.Character -- Place it in the player scriptTimeOut = Instance.new("NumberValue") -- Give it a time before becoming visible again scriptTimeOut.Name = "InvisibilityTime" scriptTimeOut.Value = invisibilityTime scriptTimeOut.Parent = playerScript wait(reloadTime + invisibilityTime) -- Wait for a proper reload time enabled = true -- Ready again end setCursor(mouse) -- Set apropriate cursor end function onSelected(mouse) -- When the weapon is selected, make the script recognize clicks print("Invisibility selected") setCursor(mouse) -- Make the mouse indicate readiness mouse.Button1Down:connect(function() onButton1Down(mouse) end) end script.Parent.Selected:connect(onSelected)