đź’­ mad-thoughts | Immersive Notifications

Turn :speech_balloon: notifications into :open_book: narratives.

A thought bubble notification system designed for immersive roleplay.

In traditional FiveM servers, notifications often break immersion with meta-gaming information: “Not enough police online” or “You don’t have the required skill level.” These messages force players to acknowledge game mechanics rather than staying in character.

mad-thoughts transforms this experience by displaying notifications as the character’s inner thoughts. When a player encounters a locked door they can’t pick, instead of seeing “Lockpicking skill too low,” they’ll think: “This lock looks too complex for me…”

Purchase on Tebex
https://madcap-scripts.tebex.io/package/mad-thoughts

Preview

Watch the preview video to see mad-thoughts in action, or view the screenshots below.

Screenshots













Documentation

Read the docs for more details.


Features & Benefits

  • :thought_balloon: Immersive Thought Bubbles: Displays character thoughts above the player’s head
  • :art: Rich Customization: Icons, colors, and timing options
  • :point_right: Scenario System: Automatic thoughts based on gameplay situations
  • :speech_balloon: Message Variety: Random selection prevents repetition
  • :round_pushpin: Location Awareness: Thoughts trigger in specific areas
  • :repeat: Sequential Thoughts: Create story-driven thought chains
  • :globe_with_meridians: Server-Wide Thoughts: Send thoughts to all connected players
  • :computer: Developer-Friendly: Simple exports for easy implementation

:star: Perfect For:

  • Skill check feedback that doesn’t break immersion
  • Subtle environmental storytelling
  • Replacing meta-gaming notifications with in-character thoughts
  • Adding personality and depth to player characters
  • Creating a more cinematic and immersive experience

Transform your server’s notification system from immersion-breaking text to character-driven thoughts . Your players will feel more connected to their characters , and your world will feel more authentic and alive.


Scenarios & Locations

The real power of mad-thoughts comes from creating your own custom scenarios and locations. While the resource includes several pre-built examples, you’re encouraged to create ones tailored to your server.

Scenario-Based Thoughts

Scenarios automatically trigger thoughts based on specific conditions that you define. The included examples cover:

  • Health status (low health)
  • Environmental conditions (rain, thunder, night time)
  • Player actions (swimming, running)
  • Character needs (hunger, thirst)

Each scenario uses a check function to determine when to trigger, plus the same customization options as regular thoughts (message, icon, color, duration, etc.).

Location-Based Thoughts

Location thoughts appear when players enter areas you’ve defined. The resource includes examples for:

  • Hospitals, police stations
  • Beaches, mountains, landmarks
  • Buildings, neighborhoods

You simply define coordinates and a trigger radius, along with the thought customization (message, icon, color, duration, etc.).

Both scenario and location-based features can be completely customized through the config.lua file or disabled entirely if you prefer to trigger thoughts only through direct exports.


How to Use

Basic Thoughts

-- Basic notification
exports['mad-thoughts']:thought("I can't do this right now...")

-- With duration (10 seconds)
exports['mad-thoughts']:thought("I wonder what that means...", 10)

-- With icon
exports['mad-thoughts']:thought("Something doesn't feel right about this...", 5, "fas fa-question-circle")

-- With icon and color
exports['mad-thoughts']:thought("I need to get out of here!", 8, "fas fa-exclamation", "#e74c3c")

Parameters

  • message : The text content of the thought (string)
  • duration : How long the thought displays in seconds (number, default: 5)
  • icon : Font Awesome icon class (string, default: “fas fa-comment-dots”)
  • color : Hex color code for the icon and border (string, default: “#F2F2F2”)

Using predefined types

exports['mad-thoughts']:info("I just remembered where I left my keys...", 5)
exports['mad-thoughts']:success("I finally figured it out!", 5)
exports['mad-thoughts']:warning("This doesn't look safe...", 5)
exports['mad-thoughts']:error("I've made a terrible mistake...", 5)

Predefined types use the following icons and colors:

  • info: “fas fa-info-circle” with blue color (#2B78FC)
  • success: “fas fa-check-circle” with green color (#06CE6B)
  • warning: “fas fa-exclamation-triangle” with orange color (#FB8607)
  • error: “fas fa-times-circle” with red color (#fe2436)

Sequential Thoughts

Display multiple thoughts in sequence:

exports['mad-thoughts']:thoughtChain({
    {message = "That's strange...", duration = 3},
    {message = "I wonder if anyone is here...", duration = 4, icon = "fas fa-question"},
    {message = "Better be careful.", duration = 3, color = "#e74c3c"}
}, 4000)

Parameters

  • thoughts: Array of thought objects, each with message, duration, icon, and color
  • delay: Time between thoughts in milliseconds (default: 3s)
  • initialDelay: Optional delay before starting the sequence (default: 0s)

Dynamic Scenario and Location Triggers

The system allows you to dynamically create and remove thought triggers. This is especially useful for:

  • Thoughts that appear only during certain jobs/heists, etc
  • Temporary areas that should trigger thoughts for a limited time

Registering Custom Scenario

exports['mad-thoughts']:registerScenario('myResourceScenario', {
    check = function(ped)
        return IsPedAimingFromCover(ped)
    end,
    message = "Ready, aim, fire...",
    duration = 6,
    icon = "fas fa-crosshairs",
    color = "#FF0000",
    cooldown = 30
})

Registering Custom Locations

exports['mad-thoughts']:registerLocation('myResourceLocation', {
    coords = vector3(176.52, -954.48, 30.09),
    distance = 20.0,
    message = "This place looks familiar...",
    duration = 5,
    icon = "fas fa-building",
    color = "#3498db",
    cooldown = 300
})

Removing Custom Scenarios & Locations

-- Remove a scenario you previously registered
exports['mad-thoughts']:removeScenario('myResourceScenario')

-- Remove a location you previously registered
exports['mad-thoughts']:removeLocation('myResourceLocation')

Server-Wide Thoughts

You can send thoughts to all connected players:

From a Client Script

-- Send a thought to all players on the server
exports['mad-thoughts']:sendThoughtToAll(
  "Everyone should see this message!", -- message
  5, -- duration in seconds
  "fas fa-bullhorn", -- icon
  "#E67E22" -- color (orange)
)

From a Server Script

-- Send a thought directly from a server script
exports['mad-thoughts']:sendThoughtToAll(
  "Server announcement as a thought", -- message
  5, -- duration in seconds
  "fas fa-server", -- icon
  "#3498db" -- color (blue)
)

Via Command

-- Basic usage
/globalthought "This is a global announcement"

-- With custom duration (in seconds)
/globalthought "This is a global announcement" "10"

-- With custom icon
/globalthought "This is a global announcement" "10" "fa-solid fa-bell"

-- With custom color
/globalthought "This is a global announcement" "10" "fa-solid fa-bell" "#FF5733"

This command requires the group.admin permission


Common Use Cases

Making NPCs More Immersive

-- When player approaches a mission NPC
exports['mad-thoughts']:thought("I wonder if I should talk to this stranger...", 5)

Skill Check Feedback

-- Instead of "Lockpicking failed"
exports['mad-thoughts']:error("I can't seem to get these tumblers right...", 4)

Environmental Storytelling

-- When entering an abandoned building
exports['mad-thoughts']:thoughtChain({
    {message = "This place gives me the creeps...", duration = 4},
    {message = "Feels like someone's watching me...", duration = 3, icon = "fas fa-eye"}
}, 3000)

Dependencies


Configuration

The resource comes with a comprehensive config.lua file that includes:

  1. Ready-to-use templates for scenarios and locations
  2. Detailed comments explaining every configuration option
  3. Example scenarios for common situations (underwater, low health, weather conditions)
  4. Example locations for popular spots around the map


Debug

The resource includes debug visualizations to help you set up and test your location triggers:

Enable debug mode in your config.lua:

Debug = true, -- boolean (true/false | default: false)

When debug mode is enabled, you’ll see:

  • Visual indicators showing location trigger zones as red spheres
  • Location IDs displayed above each zone

This is particularly useful when:

  • Setting up new location triggers to ensure they’re in the right place
  • Testing the detection radius of your locations

Support

Join our Discord community for support, regular updates and to request new features.

Code is accessible No
Subscription-based No
Lines (approximately) 1,249
Requirements ox_lib
Support Yes

My other resources:

:package: mad-drugruns - Drug Manufacturing & Trafficking
:performing_arts: mad-perform - Dynamic Street Performance System
:8ball: mad-magic8ball - Realistic Magic 8-Ball
:moneybag: mad-vendrob v2 - Ultimate Vending Machine Robbery
:musical_note: mad-musicgame - Rhythm-based Mini-game [FREE]
:rocket: minimal-hud - Minimalistic & Standalone HUD [FREE]
:art: mad-restyles - Restyled Community Resources [FREE]
:gem: mad-loot - Advanced Loot Table Generation System [FREE]
:man_technologist: mad-cipherheist - Immersive Signal Decryption Heist [FREE]
:keyboard: mad-ccat-heist - Federal Software Heist [FREE]
:moneybag: mad-vendrob v1 - Vending Machine Robbery [FREE]

My GitHub - More Free Resources
1 Like

Solid idea :o

1 Like

v1.1.0

Features

Player-Targeted Thoughts: Add ability to send thoughts to specific players via server or client exports, or command.

Server/Client Export:

exports['mad-thoughts']:sendThoughtToPlayer(
  playerId, -- server ID of target player
  message, -- thought content
  duration, -- seconds to display (optional)
  icon, -- FontAwesome icon (optional)
  color -- hex color (optional)
)

Admin Command:
Example, where 1 is the player’s server ID:
/playerthought 1 "This is a private thought"

Chores

ReadMe & Docs

  • Detail client/server exports and command of sendThoughtToPlayer
  • Added more examples