Poggy Skillcheck
Best Skillcheck System for RedM
Drop a proper skillcheck into any script. Poggy Skillcheck is a standalone, canvas-rendered circular skillcheck with a rotating needle, success and great zones, multi-rep chains, screen jitter, sound effects, and a single export that blocks until the player passes or fails. Hook it into lockpicking, crafting, fishing, medical, cooking — anything. One export, ten parameters, zero dependencies.
Video Demo
https://youtu.be/y4e6BKEiJ5w
FREE on Tebex
https://rosewoodridge.tebex.io/package/7379644
Features
-
Single Export, Instant Integration — Call
exports.poggy_skillcheck:StartSkillCheck(options)from any client script. It yields until the player finishes and returns{ success, great, greatCount }. No events, no callbacks, no setup. -
10 Tunable Parameters — Speed, difficulty, repetitions, screen randomizer, shake, shake speed, shake distance, time between reps, needle direction, and great zone percentage. Every one is optional with sensible defaults.
-
Multi-Repetition Chains — Require up to 10 consecutive hits to pass. A streak counter shows the player’s progress (
2 / 3). Fail any rep and the whole check fails — just like the real thing. -
Great Zone Mechanic — A golden inner arc within the success zone rewards precision. Configure how much of the zone is “great” (0–100%). The return value tells you exactly how many reps hit the great zone so you can give bonus rewards.
-
DBD-Style Screen Jitter — Enable shake and the ring trembles in place with rapid random jitter. Scale intensity from a subtle tremor to a Doctor-tier impossible check. Five levels each for speed and distance.
-
Needle Direction Control — Clockwise, counter-clockwise, or random per rep. Random direction keeps experienced players on their toes across multi-rep chains.
-
Screen Position Randomizer — Move the ring off-center by up to 50% of the screen so the player can’t muscle-memory the same spot every time. Five levels of scatter.
-
Canvas-Rendered Visuals — No image assets for the ring. The entire skillcheck is drawn on a
<canvas>element — crisp at any resolution with gradient needles, gold great-zone arcs, hit-flash overlays, and a red fail tint. -
Sound Effects Included — Incoming warning tone, success hit, and great hit audio. Volume and incoming boost are configurable. Players can mute with
/skillcheck off. -
Auto-Fail on Full Revolution — If the needle completes a full rotation without the player pressing anything, the check fails automatically. No infinite spinning.
-
Built-In Test Command —
/skillcheck [speed] [difficulty] [rep] ...lets admins and developers test any configuration instantly from chat without writing a line of code. -
Zero Dependencies — Fully standalone. No framework required, no database, no bridge. Drop it in, ensure it, call the export.
-
Client-Side Only — No server scripts, no network traffic, no server events. The entire skillcheck runs on the client and returns a result to your calling script.
Dependencies
None. Fully standalone.
How to Use (Developer Quick Start)
Call the export from any client-side thread:
Citizen.CreateThread(function()
local result = exports.poggy_skillcheck:StartSkillCheck({
speed = 4,
difficulty = 4,
repetition = 3,
great = 25,
})
if result.success then
if result.great then
-- Every rep landed in the great zone
print("Perfect craft! Bonus item.")
else
print("Success with " .. result.greatCount .. " great hits")
end
else
print("Failed.")
end
end)
All parameters are optional. Pass {} or nothing to use defaults.
Parameters
| Parameter | Type | Range | Default | What it does |
|---|---|---|---|---|
speed |
number | 1 – 5 | 3 | Needle rotation speed. 1 = slow, 5 = very fast. |
difficulty |
number | 1 – 5 | 3 | Success zone size. 1 = easy, 5 = tiny. |
repetition |
number | 1 – 10 | 1 | Consecutive checks required to pass. |
randomizer |
number | 0 – 5 | 0 | Screen position scatter. 0 = center, 5 = ~50%. |
shake |
boolean | true / false | false | Enable ring jitter. |
shakeSpeed |
number | 1 – 5 | 2 | Jitter speed. |
shakeDist |
number | 1 – 5 | 2 | Jitter distance. |
timeBetween |
number | 100 – 500 | 250 | Ms between reps. |
direction |
string | cw / ccw / rand | cw | Needle direction. |
great |
number | 0 – 100 | 30 | % of success zone that counts as “great”. |
Return Value
{
success = bool, -- true if every rep was passed
great = bool, -- true if ALL reps were great
greatCount = number, -- total great hits across all reps
}
Configuration
Everything is in config.lua, never escrowed:
-
Master Toggle —
Enabled = true/falseto disable all skillchecks server-wide. -
Global Defaults — Set the baseline for every parameter so calling scripts can pass fewer overrides.
-
Sound Settings — Base volume (0–1), incoming boost multiplier, and file paths for all three sound effects. Swap the
.mp3files inui/sfx/skillcheck/to use your own audio.
Commands
| Command | Access | Description |
|---|---|---|
/skillcheck [params...] |
Anyone | Run a test skillcheck with positional args |
/skillcheck on |
Anyone | Unmute skillcheck sounds |
/skillcheck off |
Anyone | Mute skillcheck sounds |
Example: /skillcheck 5 5 3 2 true 4 3 200 rand 15 — max speed, max difficulty, 3 reps, position scatter, shaking, random direction, 15% great zone.
Use Cases
| Scenario | Example Config |
|---|---|
| Easy lockpick | { speed = 1, difficulty = 1 } |
| Crafting (hard) | { speed = 4, difficulty = 4, repetition = 3, great = 25 } |
| Fishing reel | { speed = 3, difficulty = 3, repetition = 5, direction = "rand" } |
| Surgery | { speed = 5, difficulty = 5, shake = true, shakeSpeed = 3, shakeDist = 3, repetition = 4 } |
| Quick-time event | { speed = 5, difficulty = 3, repetition = 2, timeBetween = 100 } |
| Gathering (easy) | { speed = 2, difficulty = 2, great = 50 } |
Support
Discord: https://discord.com/invite/rBarFeuzFj
Free Here: https://rosewoodridge.tebex.io/package/7379644
MY OTHER SCRIPTS
| Code is accessible | Yes (config + UI), Escrowed (client) |
| Subscription-based | No |
| Lines (approximately) | ~800 |
| Requirements | None |
| Support | Yes |
