🖌️ Graffiti - Spray your ideas [ESX/QB/ANY]

A full blown painting canvas editor with support for images

Preview

Click here to watch

Purchase

Price: 24.99€ (+ tax)
Click here to buy!

Update/Changelog - 1.5.3

Images are now uploaded to a web based server to reduce network latency
Bumped default Width and Height to 400
Fixed bunch of misspellings of the word “graffiti”
Some minor fixes here and there…

Update/Changelog - 1.5.2

Fixed an issue where after cleaning/removing an graffiti it wont remove itself
Added more options to config (animation clip & dict)

Update/Changelog - 1.5.1 // hotfix

Fixed a bug where the texture loads twice
Fixed the server-side loaded graffiti counter for mixed-arrays

Update/Changelog - 1.5

Added opacity clamp to config
Exposed more functions for integration
Fixed few client-side bugs
Fixed a bug regarding QB implementation

--- Returns the runtime list of existing graffitis
---@return Grafitti[]
function GetGraffitiList() end

function UpdateGrafittiDiskData() end

Update/Changelog - 1.4

Added rotation on the Z axis (by pressing SHIFT and arrows when placing)
Graffitis are now saved at an interval and only when needed
Exposed more functions (client-side)
Optimized client-side a bit
Added Config.CleanMaxRayDistance

Update/Changelog - 1.3 & 1.3.1

Added scale clamp to configuration
Added possiblity to change the output opacity

Added more configuration options (toggle animation & its duration, max raycast distance)
(EXPERIMENTAL) Tweaked a bit result position so its more convienient for the player

Update/Changelog - 1.2

Lazy load only new graffitis (HOTFIX)
Added graffiti parameter to all already exposed APIs that can support it

Update/Changelog - 1.1

Added ability to remove graffitis (external item)
Exposed some internal functions

Features

  • Painting
  • Dynamic Custom images
  • Save your graffitis
  • Well optimized (both client sidely and from the networking side)
  • Customizable & Localizable (see config below)
  • Custom integration (includes ESX/QB by default)
  • Debug tools for administration (/grafitti_debug, /grafitti_remove)
  • They disappear after a certain period of time
  • Unlimited graffitis rendering at the same time
  • Transparency
  • Spray animation
  • Cleaning graffitis with animation

Configuration

Config = {
    Canvas = {
        Width = 200,
        Height = 200,
    },

    CullingDistance = 150.0,
    ScaleClamp = {
        Min = 0.25,
        Max = 1.5,
        Step = 0.025
    },

    OpacityClamp = {
        Min = 0, 
        Max = 100, 
        Step = 30
    },


    -- how far from the wall you can be to draw 
    DrawMaxRayDistance = 10.0,

    -- shaking & spraying animation options
    DrawAnimation = {
        Enabled = true,
        ShakeSprayDuration = 2500,
        SprayingDuration = 5000,
    },

    CleanMaxRayDistance = 3.0,
    -- cleaning animation options
    CleanAnimation = {
        Enabled = true,
        Duration = 5000,
    },

    Integration = {
        Item = "spraycan",
        CleanItem = "acetone",
        -- for how long the grafitti should stay (in seconds)
        -- default: 3 days
        DisappearTime = 86400 * 3,
        -- this option is by default set to true but in some cases you would want to set it to false (anticheat-wise?)
        NetworkedAnimation = true,
        -- max distance a player can be from a graffiti to remove it.
        MaxCleanDistance = 10.0
    },

    Localization = {
        CleanGraffiti = "Cleaning graffiti",
        CleanGraffitiText = "Hover over a graffiti and press **ENTER** to clean it. **BACKSPACE** to cancel",
        BrushSize = "Size",
        BrushColor = "Color",
        SavedCanvases = "Saved Canvases",
        Accept = "Accept",
        Cancel = "Cancel",
        EditText = "Use your **ARROW** keys to adjust the grafitti, **SCROLL** to scale and **PGUP/PGDOWN** to change opacity",
        SaveCanvas = "Save Canvas",
        CanvasName = "Canvas Name",
        PasteImage = "Paste Image",
        NoSavedCanvases = "No saved canvases",
        SaveCanvasItem = "Press RMB to save this canvas",
        ShakeSpray = "Shaking the spraycan",
        Spraying = "Spraying"
    }
}

-- How fast (per seconds) should each grafitti sent over the network, by default it's using the maximal canvas size
Config.BytesPerSeconds = (Config.Canvas.Width * Config.Canvas.Height) * 0.25

Support / Issues

If you need any support, have an idea/feature request please reach out and contact me via informations in my bio

Take a look at my other resources!

:fire: > wt_adminpopups - Admin Popups
:bus: > wt_busstop - Bus Transit!

Code is accessible Partly (server side framework integration & configuration)
Subscription-based No, you pay only ONCE
Lines (approximately) 700
Requirements ox_lib
Support Yes
6 Likes

Hi, is there a option to change the html/css?

1 Like

coool

3 Likes

Amazing script!

1 Like

At this moment you can’t really edit freely the UI source’s code, but you can tweak it a bit if you know html/css

I will think about it though, after cleaning up it a bit and making it look better for the end-developer

Next update you need to add item to remove grafitti.

2 Likes

Thought about this too, will add within the next update for sure.
If you have any other suggestions or questions please let me know through any of my linked social medias as I’m most likely to be more active there

1 Like

The best graffiti script currently out. Developer has been extremely helpful with suggestions and issues. Worth every penny of the price. Absolutely a necessity for any server that wants to differentiate from a world of almost identical servers.

1 Like

Can graffiti be sprayed on the car?

Best graffiti script out. And my guy is helpful, very dependable and friendly. You will not be disappointed, any questions you have he will help walk you through and figure it out.

1 Like

Can this script used in a reputation system? :slight_smile:

1 Like

elaborate

I’m using T1ger Gangs and for several illegal actions, we can add reputation points, once the heist/illegal action is over. So I’d need to have access to these functions :blush:

you are free to do this, the integration is open source and allow for this type of customisation :slight_smile: