HopperBins
What is a HopperBin?
HopperBins are considered old now. They were the first ways to make a weapon, a utility tool, or anything you could really think of. They're mainly used for getting input from the player, and doing something with that input.
Special Events
The special events of a HopperBin are as follows:
- Selected
- Deselected
Important events and properties
The Selected and Deselected events have an argument, called a MOUSE object. Here are its important events and properties.
Events
- Button1Down
- Button1Up
- Button2Down -- currently un-operational
- Button2Up -- also non-working
- WheelForward -- non-working
- WheelBackward -- non-working
Properties
- Hit -- CFrame value
- Target -- object value
- X -- mouse's X position on the screen.
- Y -- mouse's Y position on the screen.
- ViewSizeX -- your screen's X size.
- ViewSizeY -- your screen's Y size.
- Origin -- CFrame value
- Icon -- the cursor image path
What do I do with it?
You can use it to do almost anything! You can spawn a projectile when Button1Down is fired, have it spawn in the direction the mouse is from your head, and move in the direction of the mouse.
Here's an example of a Boulder Summoner.
lifetime = 5 -- how long the boulder stays there. 5 is a good value. function onButton1Down(mouse) local b = Instance.new("Part") b.BrickColor = BrickColor.new(217) b.Position = mouse.Hit.p b.Size = Vector3.new(5, 5, 5) b.Shape = 0 b.Parent = game.Workspace b.Velocity = (script.Parent.Parent.Parent.Character.Head.Position - mouse.Hit.p).unit * -50 + Vector3.new(0, 10, 0) -- pushes it away from you, and pops it up a bit, making it seem to come out of the ground. game:GetService("Debris"):AddItem(b, lifetime) end function onSelected(mouse) mouse.Button1Down:connect(function() onButton1Down(mouse) end) -- Button1Down doesn't come with a mouse, seeing as its -- an event of the mouse itself. We need to give the function the mouse object to work off of. end script.Parent.Selected:connect(onSelected) -- Selected comes with a mouse.
Thats a simple thing to spawn a boulder wherever you click. It also gets rid of the boulder after a set amount of time.
Simple Toggle Utility
This tutorial wouldn't be complete without some decent examples. Assuming you have a brick named "Toggle", and it has a BoolValue in it named "On/Off", you can use this.
brickName = "Toggle" valueName = "On/Off" function onButton1Down(mouse) local targ = mouse.Target if targ~=nil then if targ.Name == brickName then if targ:findFirstChild(valueName)~=nil then if targ[valueName].Value == true then targ[valueName].Value = false else targ[valueName].Value = true end end end end end function onSelected(mouse) mouse.Button1Down:connect(function() onButton1Down(mouse) end) end script.Parent.Selected:connect(onSelected)
You can easily manipulate this script to work for anything.
Mouse Without HopperBin
Setting up the HopperBin
You need a HopperBin object. This is what the player selects to activate the whole system.
You also need two scripts. I have a few templates that you can fix up.
Here's how it should look in the Explorer:
[-] HopperBin ConnectionScript ControlScript
We have two scripts. The one named ConnectionScript is the one that sets it all up, and links the mouse to some values. The HopperBin gets removed, the two scripts moved, but the mouse is still active until you select a different HopperBin!
ConnectionScript
Here's what goes in "ConnectionScript":
function onSelected(mouse) local m = Instance.new("CFrameValue") m.Parent = script.Parent.Parent.Parent m.Name = "MouseCFrame" local b = Instance.new("BoolValue") b.Parent = script.Parent.Parent.Parent b.Name = "Button1Down" local k = Instance.new("StringValue") k.Parent = script.Parent.Parent.Parent k.Name = "KeyPressed" local t = Instance.new("ObjectValue") t.Parent = script.Parent.Parent.Parent t.Name = "MouseTarget" mouse.Move:connect(function() m.Value = mouse.Hit end) mouse.Button1Down:connect(function() b.Value = true end) mouse.Button1Up:connect(function() b.Value = false end) mouse.KeyDown:connect(function(key) k.Value = key k.Value = "" end) mouse.Changed:connect(function(property) if (property == "Target") then t.Value = mouse.Target end end) local hb = script.Parent script.Parent = hb.Parent hb.ControlScript.Parent = script.Parent hb:Remove() end script.Parent.Selected:connect(onSelected)
ControlScript
Here is the ControlScript:
while true do if script.Parent.Name == "Backpack" then break end -- this is to pause the script until it gets moved, no bugging up. wait() end function newText(text) local nm = Instance.new("Hint") nm.Parent = p nm.Text = text end function onKeyDown(key) if script.Parent.Parent.Character==nil then return end local key = string.lower(key) end function onButton1Down() if script.Parent.Parent.Character==nil then return end end function onButton1Up() if script.Parent.Parent.Character==nil then return end end function onMove() if script.Parent.Parent.Character==nil then return end end script.Parent.Parent.KeyPressed.Changed:connect(function() onKeyDown(script.Parent.Parent.KeyPressed.Value) end) script.Parent.Parent.MouseCFrame.Changed:connect(function() onMove() end) script.Parent.Parent.Button1Down.Changed:connect(function() if script.Parent.Parent.Button1Down.Value == true then onButton1Down() else onButton1Up() end end)