About Me
Hello fellow developers! I am an advanced scripter currently looking for Full-Time/Part-Time work (I do not wish to do contract work). Preferably, I’m looking for a game that’s already functional so that I can add new features and help fix any bugs along the way. If you received a message from me with a link to this portfolio, then I’m already interested in becoming a part of your team! Keep reading to see a detailed account of my skill-set.
I am an adult and began scripting in luau 2+ years ago (off and on). I have learned quite a lot along the way and scripted a game to near-completion (see below!). It should be noted that I’m not a modeler/designer because my artistic ability is nil. I am self-motivated and will do my best to make your visions become a reality. Message me if you’re interested, but please take a full look at my portfolio before making any decisions about adding/not adding me to your team!
Showcase
PLEASE note the following is only a showcase of functionality and not how pretty something is. I am not an artist/modeler/designer. These examples are to showcase my scripting ability only. The gem/frame/button images, the 2 pickaxe models, and the skeleton/stones/house were created by a friend. Everything else (including the rest of the spritesheet images as well as the spritesheet itself (including adding alpha/grayscale), and the welds/attachments to the models) was created by me.
Also, I didn’t know the Windows Game Bar doesn’t record the entire screen … it apparently stops recording once the current screen closes, so I recorded another video to show a player logging back in. The red text on the bottom that I click on is there only to help me remember what I want to showcase and when!
GUI Showcase
Gui Features Spotlight 1(In order of appearance with a (timestamp) of the occurrence):
- YouTube
(First time posting videos to youtube, can only have 2 embeds and <30 second videos for the DevForum)
- Uses a spritesheet to create single images
- Open output to show error-free gameplay
- No pcall’s are used except for the datastore’s autosave(which is needed)
- Microprofiler is used to show script efficiency
- Clicks are printed to the output to show a click-end*
- Clicking or tapping…
- outside the frame will close the frame(00:10)
- inside the frame will not close the frame(00:12-00:16)
- the same button will close the GUI(00:17)
- a different button will close the GUI and open up the GUI tied to that button(00:21-00:25)
- Dragging from one button to another will not press either button(00:27-00:30)
- Frame doesn’t allow players to click through(00:37-00:40)
- Hovering over an item gives specific item details(00:43-00:48)
- Item details do not constantly update the visibility and stats (“entering stats” in client output)(00:51-00:54)
- Selecting an item shows item details in a different area for comparison purposes(00:57-01:03)
- Gui Objects…
- can be dragged(01:07-01:12)
- can be dragged outside of the frame to give a feeling of freedom/control to players
- snap back to where they were dragged from if released on something unaccepted(01:13-01:21)
- can be placed in open slots(01:23-01:27)
- can be swapped(01:30-01:37)
- can be equipped and can be swapped from the equipment slot(01:40-01:48
- tools are created depending on their individual properties
- can be dragged(01:07-01:12)
Gui Features Spotlight 2(Loading Save)
- Positions are saved for purposes of inventory organization(00:08+)
- Automatically equips items if they were equipped when the player left the game(00:08+)
GUI Skill-set Showcase
- Spritesheets
- ContextActionService
- ZIndexing
- Gui object generation/manipulation
- Saving and retrieving from datastores with ProfileService
- Tables and caching
- Hard/soft references to objects
- Equipping/Unequipping/Creating tools
- Remotes
- Optimization
- Security
Optimizations
- Spritesheets were used for their scalability. Instead of a very large amount of individual images for each Gui Image, (12 colors of pickaxe handles, tips and heads. So 12 x 12 x 12 = 1728 different images) there is only one image.
- Validation checks are done on the client FIRST to prevent remotes from being fired unnecessarily
- The layered spritesheet objects are not individually moved; only one object is manually moved
- The only time a remote is sent is when an actual change occurred
- Changed event is used to move the Gui Object instead of a constant loop
Security
- Everything is validated by the server
Highlighter Showcase
Highlighter Features Spotlight(In order of appearance with a (timestamp) of the occurrence)
- Test Server is used with an open output to show error-free gameplay
- No pcalls are used except for the datastore autosave (which is needed)
- Microprofiler is used to show script efficiency*
- Displays information pertaining to that specific block(All)
- Only activates when a valid item is equipped(00:13-00:23)
- Doesn’t highlight anything else other than what is intended(00:27-00:31)
- Very responsive(00:36-00:42)
- Can highlight anything the camera can see even if it isn’t viewable from the character(00:46-00:52)
- Was constructed this way on purpose to give more freedom to players
- Uses a distance check when highlighting(00:55-01:05)
- Zooming the camera in/out does not affect the distance check(01:06-01:18)
Highlighter Skill-set Showcase
- Raycasting…
- with a whitelist
- with a custom table
- with a varying length (and a max distance, for performance)
- from the camera
- aimed at the mouse’s position
- Very quickly finds that specific object even if there are 50,000+ of the same objects in the same heirarchy!
- Quickly accessing and displaying table values; then using those values to display in a GUI
Optimizations
- Does not run when a tool is not equipped|
- The same code in the same module script is used between these different pickaxes|
Security
- This is almost entirely client-based; however, there is a cooldown verification for selecting a different tier in case an exploiter(s) tries to create lag through remote abuse.
Mining Showcase
Note: the mine’s reset timer was set to a low time of 90 seconds. Also, there are actually 4 mines in the game … not just the one showcased. Lastly, there’s too much to show in just one recording, so this showcase is split up between three recordings.
Mining Features Spotlight 1(In order of appearance with a (timestamp) of the occurrence)
- YouTube
- Test Server with an open output on the server(bottom) to show error-free gameplay
- Two pcall’s are used:
- One for the datastore autosave
- One for anti-exploitation purposes(see security) and it only affects server validation
- Two pcall’s are used:
- Microprofiler is used to show script efficiency*
- Players can hold the button down to mine(All)
- Note: Damage ranges and is also increased depending on the total mining level
- Also, the information of the block is removed on purpose to avoid confusion with hp left
- Note: Damage ranges and is also increased depending on the total mining level
- Mining speed is verified by the server, tapping/clicking repeatedly does not bypass the cooldown(“Clicks” in output)(00:14-00:21)
- Note: The cooldown is checked on the client first to avoid unnecessary remotes
- Attempting to damage something else will remove the health bar(00:25-00:28)
- Can damage anything the highlighter can highlight with a distance check(00:30-00:37)
- Forgot what I wanted to show for a few seconds
(00:37 - 00:44)
- Switching tiers will remove the damage done by that player(00:45-00:49)
- Unless someone else damaged it… Damage will be retained, but player won’t receive items/xp.*
- Blocks are collected and stored in the player’s inventory(01:03-01:16)
- Randomly generated blocks each time a block is mined(01:24-01:27)
- Mine reset(01:27-01:29)
- Can mine in any direction, including upwards(01:31+)
Mining Features Spotlight 2(In order of appearance with a timestamp of the occurrence)
- YouTube
- Damage and Health are shown to other players(00:27-00:29)
-
Different players collecting different tiers, with different damages can collect the same block(00:37-01:05)
- Math is based off of their tier
- Different tiers give different xp/resources and have a different health value associated with them
- Note: Player is maxed out in Tier1, so they won’t get any more xp for Tier1 blocks
- Damaging a block records the player who attacked that block and places it in a table(00:37-01:05)
- If their total damage dealt is greater than a threshold, all players receive experience and items if they individually reached that threshold. This prevents piggybacking.
- Note: Thresholds are lowered depending on which tier being collected.
- Does not negate damage done unless all players switch targets or switch tiers
- Can teleport back to base(01:09-01:13)
- Only teleports those that are actually inside the mine when the mine resets
- Mining speed is ramped up to 50x the norm(01:20+)
- My laptop is old, yet it can handle this stress test in a 2 player test-server with recording
-
BIG NOTE: I only see a difference in the microprofiler when I’m recording!
- Microprofiler also doesn’t like it when I switch screens, eh
- I might add some screenshots since recording ruins the whole point of the open microprofiler
- Microprofiler also doesn’t like it when I switch screens, eh
- Fully functional leveling system (Used time to auto-balance)(01:20+)
- It is the little blue bar under the red letters on the bottom of the screen
- Note: Player is maxed out in Tier1, so they won’t get any more xp for Tier1 blocks
- Very quickly finds that specific object, even if there are 50,000+ of the same objects in the same heirarchy!(01:20)+
- Absolutely massive mine(01:20+)
- Chances for different ore types increase/decrease depending on distance away from mine entrance(01:20+)
- Resetting the mine is incredibly fast(01:46-01:48)
Mining Features Spotlight 3(Loading Save)
- Chances for certain gem types(00:08-00:10)
- All items are saved(All)
EDIT
I noticed the little XP bar wasn’t functioning properly in the videos. This was from me turning off its features during the first couple of showcases since it was not needed. I did not have the xp system fully turned back on during the other showcases. Here is a video I just made with the bar working like normal, as well as doing a simple XP tween:
- YouTube
Mining Skill-set Showcase
- Datastores
- Variables containing hard references to objects|
- Working with large tables and many parts|
Optimizations
- Every object is not stored in a table as a hard reference
- Variable references are cleared to avoid memory leaks
- The player’s maximum tier is automatically set upon join regardless of what they used last
- This is used to prevent a player from collecting from a lower tier, logging out and forgetting they were on a lower tier, then wasting time collecting that lower tier when they really want their highest tier.
Security
- I perform many checks lumped into 1 line of code in a pcall on the server then return a success or failure. One check is used to see if it failed or not (it can only fail if an exploiter sent something invalid)
- The cooldown for swinging the pickaxe is done by syncing the client/server times, then validating the action on the server
- A distance check is done on the server
- There are level requirements for the different tiers; they are checked on the server before switching
Anti-Exploitation Showcase
Note: The security checks are all server-sided. The buttons are only there to show how the script responds to flying. Thresholds were set very tight only for the purposes of this showcase. Finally, this is just a prototype I worked on … if I were to design another one, I firmly believe I can make it A LOT more performant!
Security Spotlight(In order of appearance with a timestamp of the occurrence)
- YouTube
- Open output to show error-free scripting
- No pcall’s are used whatsoever
- Microprofiler is used to show script efficiency
- Allows regular walking(00:04-00:09)
- Allows normal jumping situations(00:09-00:42)
- Allows normal falling/standing situations(00:21-00:22 ,00:37-00:39 ,00:43-00:44)
- Allows legitimate teleportation(00:40-00:42)
Tries to teleport to the exact location of the teleport (00:59-01:01)- I mistakenly used the position of the part instead of the teleport location
- Left it in because it made me chuckle XD
- I mistakenly used the position of the part instead of the teleport location
- Anti-Teleportation exploits(01:01-01:04)
- Changes jump power to 55 from 50(01:11-01:14)
-
Anti-Jump height exploits(01:15-01:22)
- Note: It flagged flying instead of jumping, partially why this is just a prototype
- Changes walkspeed to 20 from 16(01:26-01:29)
-
Anti-Walk speed exploits(01:32-01:36)
- Note: Did some rubberbanding as well
- Activates flying(01:45)
-
Anti-Flying/Hovering exploits(01:47+)
- Note: The code behind the flying exploit is actually done on the server. If the server can’t even make the player fly illegitimately, then no one can!
Optimizations
- Includes a method to verify the player’s position (Ex: player says they hit something in a FPS)
- Caches the player’s previous positions and rolls back time for server verification
- Uses a customized binary search when rolling back time to speed up search times
- Note: It was designed to cut down on search time by a lot, but nothing too fancy
- Tables are keyed on the player’s UserId and are set to nil upon leaving to avoid memory leaks
- Uses lag compensation for personalized/tighter thresholds
- Each security check is designed to work together, but do not necessarily rely on one another.
- Includes a function that adds parts at the beginning and end of the ray not shown for debugging purposes
Security
- Character states are not used
- Touched events are not used
- As mentioned, everything seen (other than the buttons for flying/teleportation) is server-sided.
- Includes a couple of methods to prevent exploiters attempting to bypass the anti-flying
- The legitimate teleport feature is not based on the static position of the teleport, rather it is flagged as legitimate teleportation to make the module more robust instead of dealing with a position value.
Additional Information
- Working knowledge of Datastore2 and ProfileService
- Also added a couple of small wrappers to both (Ex: added an autosave to Datastore2)
- The game’s framework includes the following:
- No remote functions
- One server/client script that act as loader scripts
- All other scripts are modules
- GUI containers have no scripts; there is a clear separation between the two for organizational purposes
- One remote event is used (I know some won’t like this, but it gave a deeper understanding of hijacked remotes)
- No bindables
-
Everything sent to the server must pass through a very broad filtering module
- This module prevents things like Nil, NaN, massive variables as well as type-checks/honeypots etc…
What To Expect If Added To Your Team
- Plans before coding (Works very well if given a full list of features to add)
- Not afraid to put in the time
- When I set out to do something, I give it my all to complete it
Future Ideas For This Portfolio(In case I don't join a team)
(I wanted something to work on … so I started working on items off of this list )
-
Add some eye candy with tweens and stuff
- YouTube -
More eye candy with viewport frames
-
- I kept the display pane on the left side just for demonstration purposes.
-
Make a gif (because why not? I already have around 99% of the code completed for it)
-
- In case anyone is curious, I didn’t use wait in any form (framerate + dt)
- Swing animations (I’ve worked with animations before, shouldn’t have problems)
- Implement an idling system
- Make a trading system (I’ve wanted to do this one for a while)
- Make a GLOBAL trading system (ooooo goosebumps!)
- Make some mobs (I’ll probably do a custom hitbox simply because I can’t stand touched events.
- Portal (kinda excited about this one actually XD, I expect this will be the hardest out of this list)
Availability
If I join your team, then I’m all yours! 40+ hours a week minimum. I’ve grown to really enjoy scripting and would love to do it Full-Time as part of a team!
Payment
Prices are definitely negotiable, but I am willing to accept a set rate during a pay period even if I dedicate a massive amount of time to developing. I would prefer to hear a reasonable offer instead of me spouting off numbers, but keep in mind that I plan to be a permanent team member! I accept Robux as a payment option.
Contact
You can contact me here on the Developer Forum. [Edit] I also have Discord: steelmettle#8571
Thank you for your consideration!