Skip to content

WP Trick or Treat

Current version: 2.0.28

wp_trickortreat is a protected Halloween event system for FiveM built around wp_bridge. It supports target or marker interaction, persistent house progress, area completion tracking, two reward modes, a Halloween NUI, Candy Value, a configurable shop, cash-out rewards, consumable virtual candy, leaderboards, milestones, and administrative reset tools.


Features

Trick-or-treat gameplay

  • 838 configured house locations
  • 39 grouped neighbourhood areas
  • Per-player or global house completion
  • Server-side distance validation
  • Configurable nighttime-only operation
  • Configurable basket requirement
  • Optional answer ped and door sequence
  • Optional map blips
  • ox_target through wp_bridge by default
  • Marker interaction as an alternative
  • Automatic marker fallback when target registration fails

Halloween NUI

The built-in panel includes:

  • Overview
  • Area progress
  • Leaderboard
  • Candy Shop
  • Candy Cash Out
  • Admin controls
  • Image-based reward notifications
  • Draggable house tracker
  • Hidden scrollbars on scrollable pages
  • Configurable logo, title, subtitle, and accent colour
  • Configurable command and keyboard shortcut

The default panel controls are:

J                Open or close the panel
/trickortreat    Open or close the panel
F7               Move the tracker while the basket is equipped

Players can rebind the panel shortcut through:

Settings → Key Bindings → FiveM

House tracker

The tracker appears only while the basket is equipped.

It displays:

  • Houses completed
  • Total houses
  • Houses remaining
  • Candy Value when using the built-in payout system
  • Current route progress

The tracker position is saved locally for each player.

Persistent progression

The resource stores:

  • Player profiles
  • Houses completed
  • Area progress
  • Virtual candy quantities
  • Lifetime Candy Value
  • Current Candy Value
  • Milestone claims
  • Shop purchase logs
  • Cash-out logs

Administrative tools

Authorized administrators can:

  • Reset one online player’s house progress
  • Reset all players’ house progress
  • Optionally reset milestone claims
  • Use the Admin page in the NUI
  • Use server or in-game commands

Commands:

wp_tt_resetplayer <serverId>
wp_tt_resetall
wp_tt_admincheck
wp_tt_checkbasket <serverId>

Dependencies

Required:

  • ox_lib
  • oxmysql
  • wp_bridge

Provider resources depend on the configuration of wp_bridge.

The default development setup uses:

  • Qbox
  • ox_inventory
  • ox_target

ox_target is required when:

Config.Interaction.mode = 'target'

and wp_bridge is configured to use ox_target.


Resource order

Start the selected framework, inventory, and target providers before wp_bridge.

Example:

ensure ox_lib
ensure qbx_core
ensure ox_inventory
ensure ox_target
ensure oxmysql

ensure wp_bridge
ensure wp_trickortreat

Installation

1. Install the resource

Place the resource folder in your server resources directory:

resources/[WP-SCRIPTS]/wp_trickortreat

Add it to the server configuration:

ensure wp_trickortreat

2. Install the basket item

The default basket item is:

Config.Basket.item = 'jackolantern'

For ox_inventory, add this item to:

ox_inventory/data/items.lua
['jackolantern'] = {
    label = "Jack-o'-Lantern Basket",
    weight = 100,
    stack = false,
    close = true,
    consume = 0,
    description = 'A Halloween basket used for trick or treating.',

    client = {
        image = 'jackolantern.png',
        export = 'wp_trickortreat.useBasket'
    }
},

Keep consume set to zero

consume = 0 prevents the basket from being removed when used.

The basket export is an equip toggle. It does not intentionally consume the item.

3. Install the basket image

Place:

jackolantern.png

in:

ox_inventory/web/images/

4. Install the database

The resource automatically creates its required tables when it starts.

A manual SQL file is also included:

sql/wp_trickortreat.sql

Tables:

wp_trickortreat_profiles
wp_trickortreat_visits
wp_trickortreat_global_visits
wp_trickortreat_candy
wp_trickortreat_milestones
wp_trickortreat_shop_logs
wp_trickortreat_cashout_logs

5. Configure rewards

Before enabling the event, review:

Config.PayoutMode
Config.BuiltIn
Config.Legacy
Config.Shop
Config.Milestones

Every real inventory item used by the shop, legacy mode, or milestone rewards must exist in the active inventory.

6. Enable the resource

Config.Enabled = true

Restart:

restart wp_bridge
restart wp_trickortreat

Asset Escrow

Only the main configuration file is editable:

config.lua

House and area locations are stored in:

shared/locations.lua

That file is intentionally escrow protected.

Current manifest configuration:

escrow_ignore {
    'config.lua'
}

Core Configuration

Enable or disable the event

Config.Enabled = true

Set this to false to stop trick-or-treat gameplay without removing the resource.

Debug logging

Config.Debug = false

Enable it temporarily while diagnosing:

  • Basket checks
  • Target registration
  • Inventory capacity
  • Shop delivery
  • Cash-out payout
  • Admin authorization

Do not normally leave debug mode enabled on a production server.


Basket configuration

Config.Basket = {
    required = true,
    item = 'jackolantern',
    useMode = 'ox_inventory',

    prop = {
        enabled = false,
        model = '',

        attach = {
            bone = 57005,
            offset = vec3(0.40, -0.02, 0.09),
            rotation = vec3(28.79, -79.40, -95.07)
        }
    }
}

Require the basket

required = true

When enabled, players must:

  1. Own the configured basket item
  2. Use it to equip the basket
  3. Keep it equipped while visiting houses

Basket use mode

Default:

useMode = 'ox_inventory'

This uses:

client.export = 'wp_trickortreat.useBasket'

The alternative value is:

useMode = 'bridge'

Only use bridge mode when the installed wp_bridge version exposes a compatible usable-item registration API.

Optional held prop

No prop is required by default:

prop = {
    enabled = false,
    model = ''
}

To use a streamed model:

prop = {
    enabled = true,
    model = 'your_model_name',

    attach = {
        bone = 57005,
        offset = vec3(0.40, -0.02, 0.09),
        rotation = vec3(28.79, -79.40, -95.07)
    }
}

The model must be streamed by this resource or another started resource.


Time restrictions

Config.Time = {
    onlyAtNight = false,
    startHour = 18,
    endHour = 6
}

Enable nighttime-only operation:

onlyAtNight = true

The default allowed period is from 18:00 through 06:00.


Target or marker interaction

Target mode

Config.Interaction.mode = 'target'

This registers house zones through wp_bridge.

Default settings:

Config.Interaction = {
    mode = 'target',
    fallbackToMarkers = true,
    distance = 2.25,
    targetRadius = 2.25,
    targetIcon = 'fa-solid fa-ghost',
    targetLabel = 'Trick or Treat'
}

Marker mode

Config.Interaction.mode = 'marker'

Marker settings:

marker = {
    type = 2,
    drawDistance = 18.0,
    scale = vec3(0.25, 0.25, 0.25),
    colour = {
        r = 255,
        g = 115,
        b = 20,
        a = 185
    },
    key = 38,
    helpText = 'Press ~INPUT_CONTEXT~ to Trick or Treat'
}

Automatic fallback

fallbackToMarkers = true

When enabled, the resource switches to markers if target registration fails.


Visit mode

Config.HouseRules.visitMode = 'player'

Available values:

Player mode

visitMode = 'player'

Every player may visit every house once.

Global mode

visitMode = 'global'

Once any player completes a house, that house becomes unavailable to everyone.

Additional security settings:

Config.HouseRules = {
    visitMode = 'player',
    maxServerDistance = 5.5,
    requestCooldownMs = 1000,
    tokenLifetimeMs = 15000
}

Do not increase the distance or token lifetime without a gameplay reason.


Blips

Config.Blips = {
    enabled = true,
    sprite = 40,
    colour = 47,
    scale = 0.55,
    shortRange = true,
    label = 'Trick or Treat'
}

Disable all house blips:

Config.Blips.enabled = false

Payout Modes

The resource provides two separate house reward systems:

Config.PayoutMode = 'builtin'

Available values:

builtin
legacy

Built-in payout mode

Config.PayoutMode = 'builtin'

This is the primary system.

Players receive virtual branded candy rather than real inventory items.

Virtual candy is:

  • Selected server-side
  • Stored in SQL
  • Displayed in the NUI
  • Assigned a Candy Value
  • Spendable in the Candy Shop
  • Optionally edible from the NUI

No inventory item definition is required for each built-in candy.

Built-in drop count

Config.BuiltIn = {
    minimumDrops = 1,
    maximumDrops = 3
}

This controls how many weighted candy selections are made at each completed house.

Candy definition

{
    id = 'wp_gold_fang_gummies',
    brand = 'WaCKPaCK',
    label = 'Gold Fang Gummies',
    type = 'candy',
    description = 'Golden fruit gummies shaped like tiny monster fangs.',
    rarity = 'common',
    weight = 18,
    min = 1,
    max = 3,
    value = 5,
    image = 'images/candy/wp_gold_fang_gummies.png',
    edible = true,
    hunger = 8,
    thirst = 0
}

Field reference:

Field Purpose
id Unique internal candy identifier
brand Brand displayed in the NUI
label Product name displayed to players
type candy, snack, or drink
description Product description
rarity Display and organization value
weight Relative chance of selection
min Minimum quantity awarded
max Maximum quantity awarded
value Candy Value earned per unit
image NUI image path
edible Whether it can be consumed
hunger Hunger amount applied
thirst Thirst amount applied

Weighted selection

Higher weight values are selected more often.

Example:

{ rarity = 'common', weight = 18 }
{ rarity = 'uncommon', weight = 9 }
{ rarity = 'rare', weight = 4 }

The weights are relative. They do not need to total 100.

Candy Value

Candy Value is awarded when the candy is collected:

value = 5

If the house awards three units:

3 × 5 = 15 Candy Value

Eating the candy later removes one virtual candy from the collection, but it does not remove Candy Value already earned.

Built-in candy images

Place images in:

ui/images/candy/

Use the exact file path configured in each entry:

image = 'images/candy/wp_gold_fang_gummies.png'
Config.PayoutMode = 'builtin'

Config.BuiltIn = {
    minimumDrops = 1,
    maximumDrops = 3,

    candies = {
        {
            id = 'example_candy',
            brand = 'Example Brand',
            label = 'Example Candy',
            type = 'candy',
            description = 'A fictional Halloween candy.',
            rarity = 'common',
            weight = 20,
            min = 1,
            max = 3,
            value = 5,
            image = 'images/candy/example_candy.png',
            edible = true,
            hunger = 8,
            thirst = 0
        }
    }
}

Legacy payout mode

Config.PayoutMode = 'legacy'

Legacy mode awards actual inventory items directly.

Every configured item must exist in the active inventory.

Legacy roll count

Config.Legacy.rollsPerHouse = 1

This controls the number of reward-group selections per house.

Legacy reward groups

Config.Legacy = {
    rollsPerHouse = 1,

    groups = {
        {
            id = 'common',
            weight = 70,

            items = {
                {
                    item = 'example_common_item',
                    min = 1,
                    max = 3
                }
            }
        },

        {
            id = 'good',
            weight = 22,

            items = {
                {
                    item = 'example_good_item',
                    min = 1,
                    max = 2
                }
            }
        },

        {
            id = 'rare',
            weight = 7,

            items = {
                {
                    item = 'example_rare_item',
                    min = 1,
                    max = 1
                }
            }
        },

        {
            id = 'jackpot',
            weight = 1,

            items = {
                {
                    item = 'example_jackpot_item',
                    min = 1,
                    max = 1
                }
            }
        }
    }
}

Legacy group selection

The group weights are relative:

common  = 70
good    = 22
rare    = 7
jackpot = 1

After a group is selected, one item from that group is selected.

Empty groups

Do not leave a weighted group empty.

Bad:

{
    id = 'jackpot',
    weight = 1,
    items = {}
}

Use either:

{
    id = 'jackpot',
    weight = 0,
    items = {}
}

or configure at least one valid item.

Inventory requirements

For every legacy item:

item = 'example_common_item'

confirm the exact item name exists in the active inventory.

Item names are case-sensitive and must match punctuation, underscores, and hyphens.


Candy Shop

The Candy Shop exchanges Candy Value for real inventory items.

Config.Shop.enabled = true

Maximum quantity per transaction:

Config.Shop.maximumQuantityPerPurchase = 10

Shop categories

Define category keys and labels:

Config.Shop.categories = {
    useful = 'Useful',
    premium = 'Premium'
}

Assign a matching lowercase category key to each item:

{
    id = 'shop_lighter',
    item = 'lighter',
    label = 'Lighter',
    amount = 1,
    price = 100,
    category = 'useful'
}

Add another category:

Config.Shop.categories = {
    useful = 'Useful',
    premium = 'Premium',
    medical = 'Medical',
    crafting = 'Crafting'
}

Then use:

category = 'medical'

Category keys are normalized to lowercase for NUI filtering.

Shop item fields

{
    id = 'shop_lighter',
    item = 'lighter',
    label = 'Lighter',
    amount = 1,
    price = 100,
    category = 'useful'
}
Field Purpose
id Unique shop entry ID
item Exact inventory item name
label Player-facing name
amount Inventory amount granted per purchase
price Candy Value cost
category Category key

Every id must be unique.

Every item must exist in the active inventory.


Candy Cash Out

Cash Out can be disabled independently:

Config.Shop.cashOut.enabled = false

Default conversion:

Config.Shop.cashOut = {
    enabled = true,
    pointsPerUnit = 100,
    cashPerUnit = 50,
    minimumUnits = 1,
    maximumUnits = 100,
    title = 'Candy Cash Out',
    description = 'Exchange Candy Value for a configured payout.'
}

With these values:

100 Candy Value = $50

The NUI shows:

  • Current Candy Value balance
  • Total possible cash value
  • Selected cash payout
  • Candy Value required
  • Minus and plus amount controls

Cash payout

payout = {
    default = {
        type = 'account',
        account = 'cash'
    },

    jobOverrides = {}
}

Available account values depend on the active framework and bridge configuration.

Typical values:

cash
bank

Bank example:

default = {
    type = 'account',
    account = 'bank'
}

Dirty money as item count

Use one item per payout dollar:

default = {
    type = 'item',
    item = 'smallbills',
    itemAmount = 'cash'
}

A $300 payout attempts to add:

300 × smallbills

This setup requires enough inventory capacity for the full item amount.


Dirty money as one metadata item

Use a single item carrying the value in metadata:

default = {
    type = 'metadata_item',
    item = 'smallbills',
    itemAmount = 1,
    metadataValueKey = 'worth',

    metadata = {
        description = 'Halloween candy cash-out proceeds'
    }
}

A $300 payout creates one item with metadata similar to:

{
    worth = 300,
    description = 'Halloween candy cash-out proceeds'
}

The metadata key must match the dirty-money system used by the server.

Common examples may use keys such as:

worth
value
amount

Use the key expected by the installed inventory or money resource.


Job-specific payout overrides

Example: everyone receives dirty money, while police and EMS receive clean cash.

Config.Shop.cashOut.payout = {
    default = {
        type = 'metadata_item',
        item = 'smallbills',
        itemAmount = 1,
        metadataValueKey = 'worth',

        metadata = {
            description = 'Halloween candy cash-out proceeds'
        }
    },

    jobOverrides = {
        police = {
            type = 'account',
            account = 'cash'
        },

        ambulance = {
            type = 'account',
            account = 'cash'
        }
    }
}

The keys must match exact framework job names:

police = { ... }
ambulance = { ... }

Job resolution is performed server-side.


Milestones

Enable milestones:

Config.Milestones.enabled = true

Example:

{
    houses = 25,
    credits = 500,
    legacyItem = 'replace_me_milestone_25',
    legacyAmount = 1
}

Behavior depends on payout mode:

Built-in mode

credits = 500

adds Candy Value.

Legacy mode

legacyItem = 'replace_me_milestone_25'
legacyAmount = 1

awards a real inventory item.

Replace every replace_me_* milestone item before using legacy mode.


Consumable Candy

Config.Consumables.enabled = true

Progress duration:

progressDuration = 2200

Automatic status mode

statusMode = 'auto'

Automatic mode supports the configured QB/Qbox-style events and ESX status setup.

QB or Qbox events

statusMode = 'qb'

qb = {
    hungerEvent = 'consumables:server:addHunger',
    thirstEvent = 'consumables:server:addThirst'
}

ESX Status

statusMode = 'esx'

esx = {
    hungerStatus = 'hunger',
    thirstStatus = 'thirst',
    multiplier = 10000
}

Custom status event

statusMode = 'custom'

custom = {
    event = 'my_status:client:addFoodAndDrink'
}

The client event receives:

hunger, thirst, candyId

Disable status changes

statusMode = 'none'

Candy can still be collected, but configured hunger and thirst changes will not be applied.


Leaderboard

Config.Leaderboard = {
    enabled = true,
    limit = 25,
    anonymous = false,
    nameSource = 'character'
}

Available name sources:

character
player

Enable anonymous display:

anonymous = true

User Interface

Config.UI = {
    commandEnabled = true,
    command = 'trickortreat',

    keybind = {
        enabled = true,
        key = 'J',
        description = 'Open the Trick or Treat panel'
    },

    logo = 'images/logo.png',
    title = 'Halloween Trick or Treat',
    subtitle = 'WaCKPaCK Development Studios',
    accent = '#ff7a18'
}

Change the default key

keybind = {
    enabled = true,
    key = 'J',
    description = 'Open the Trick or Treat panel'
}

Example:

key = 'K'

Disable the command

commandEnabled = false

Disable the keybind

keybind.enabled = false

Change branding

logo = 'images/logo.png'
title = 'Halloween Trick or Treat'
subtitle = 'Your Server Name'
accent = '#ff7a18'

Replace the logo file in:

ui/images/logo.png

or change the configured NUI path.

Notifications

notifications = {
    enabled = true,
    duration = 5500,
    position = 'top-right'
}

Tracker

tracker = {
    enabled = true,
    position = 'right',
    editKey = 'F7',
    showCandyValue = true
}

Available default side values:

left
right

Inventory item images

Default ox_inventory path:

inventoryImagePath = 'nui://ox_inventory/web/images/%s.png'

Manual fallback path:

manualItemImagePath = 'images/items/%s.png'

Manual item images belong in:

ui/images/items/

Use the exact inventory item name as the PNG filename.


Admin Configuration

Config.Admin = {
    enabled = true,
    acePermission = 'wp.trickortreat.admin',

    groups = {
        -- 'admin',
        -- 'god'
    },

    identifiers = {
    },

    allowServerConsole = true,
    resetMilestones = true
}

ACE setup

Recommended:

add_ace group.admin wp.trickortreat.admin allow
add_principal identifier.discord:YOUR_DISCORD_ID group.admin

Other principal examples:

add_principal identifier.license:YOUR_LICENSE group.admin
add_principal identifier.license2:YOUR_LICENSE2 group.admin
add_principal identifier.fivem:YOUR_FIVEM_ID group.admin

The resource currently checks both compatibility permission names:

wp.trickortreat.admin
wp_trickortreat.admin

Verify the group permission

Server console:

test_ace group.admin wp.trickortreat.admin

Expected:

group.admin -> wp.trickortreat.admin = true

Verify the player principal

Example:

test_ace identifier.discord:317901248844005376 wp.trickortreat.admin

Expected:

identifier.discord:317901248844005376 -> wp.trickortreat.admin = true

Verify inside the resource

Run in-game:

wp_tt_admincheck

Successful output resembles:

matched=wp.trickortreat.admin
principal=identifier.discord:317901248844005376
ace=true
allowed=true

Close and reopen the NUI after changing permissions.

Identifier fallback

For development or non-ACE setups:

identifiers = {
    'discord:317901248844005376',
    'license2:your_license_value'
}

Use the raw identifier in this config table, without the identifier. ACE prefix.


Security

Authoritative operations remain server-side.

Security checks include:

  • Framework identity resolution through wp_bridge
  • Basket ownership validation
  • Server-authorized equipped state
  • Server-side distance checks
  • Valid house-ID checks
  • Action cooldowns
  • Short-lived completion tokens
  • One-time token consumption
  • Per-player action locks
  • Persistent visit constraints
  • Global visit locking when enabled
  • Server-side weighted reward selection
  • Server-side Candy Value changes
  • Inventory existence and capacity checks
  • Refunds when shop delivery fails
  • Refunds when cash-out delivery fails
  • Server-side job payout selection
  • Admin permission checks
  • SQL-backed milestone claims
  • No trusted payout amount from the NUI

Troubleshooting

The basket item disappears after restart

Confirm the item contains:

consume = 0

and:

client = {
    export = 'wp_trickortreat.useBasket'
}

Do not configure the basket as a normally consumed item.

Perform a full server restart after changing ox_inventory/data/items.lua.


The basket says it is missing even though it is in the inventory

Check the exact configured name:

Config.Basket.item = 'jackolantern'

It must exactly match the inventory item name.

Enable:

Config.Debug = true

Run:

wp_tt_checkbasket <serverId>

Confirm the reported inventory count is at least 1.


The tracker appears immediately after joining

The tracker should only appear while the basket is equipped.

Confirm the current resource version is installed and no older copy is being started from another folder.

Search the server resources for duplicate folders named:

wp_trickortreat

Restart the resource after replacing it.


The tracker does not appear

Confirm:

Config.UI.tracker.enabled = true

Use the basket item to equip it.

The tracker does not open merely because the item exists in the inventory.


No target interaction appears

Confirm:

Config.Interaction.mode = 'target'

Check the resource order:

ensure ox_target
ensure wp_bridge
ensure wp_trickortreat

Confirm wp_bridge is configured to use ox_target.

Enable debug mode and check F8 for the house-zone registration count.

Use markers temporarily:

Config.Interaction.mode = 'marker'

House blips appear, but target does not work

Blips and target zones are separate systems.

Blips working only confirms the house list loaded.

Verify:

  • ox_target is started
  • wp_bridge is started
  • wp_bridge target provider is set correctly
  • Config.Interaction.mode = 'target'
  • The current resource version is being loaded

Markers do not appear

Markers appear only when:

Config.Interaction.mode = 'marker'

or automatic target fallback activates.

Check:

Config.Interaction.marker.drawDistance

and ensure the player is near a configured door.


“You cannot carry that reward”

This message indicates the inventory capacity check rejected the configured reward.

Check:

  • The item exists
  • The item name is exact
  • The item weight is valid
  • The requested quantity is reasonable
  • The inventory has enough slots and weight

Enable debug mode and inspect:

CanCarryItem

logs.


“The purchase could not be completed”

The capacity check may pass while actual item delivery fails.

Enable:

Config.Debug = true

Inspect the server console for the exact AddItem failure reason.

Confirm the shop entry uses a real item:

{
    item = 'lighter'
}

and that lighter exists in the active inventory.

Candy Value is refunded when delivery fails.


Cash out fails with money_provider_unavailable

Confirm:

  • The correct wp_bridge version is installed
  • The framework is detected
  • The player is fully loaded
  • The account is valid

Test:

type = 'account'
account = 'cash'

or:

account = 'bank'

Enable debug mode and inspect the AddMoney provider log.


Cash out fails with invalid_source

This indicates the framework or bridge could not resolve the active player source.

Confirm:

  • wp_bridge starts after the framework
  • wp_trickortreat starts after wp_bridge
  • The player is fully loaded
  • There is not an outdated duplicate wp_bridge folder

Restart in order:

restart wp_bridge
restart wp_trickortreat

Dirty-money cash out does not create the expected value

Check the configured metadata key:

metadataValueKey = 'worth'

The expected key depends on the installed dirty-money system.

Inspect an existing valid dirty-money item and match its metadata structure.

Example alternatives:

metadataValueKey = 'value'

or:

metadataValueKey = 'amount'

Admin button does not appear

Run in-game:

wp_tt_admincheck

The output must include:

ace=true
allowed=true

Verify the group:

test_ace group.admin wp.trickortreat.admin

Verify the connected identifier:

test_ace identifier.discord:YOUR_ID wp.trickortreat.admin

The group permission being true does not prove the connected player inherits that group.

Close and reopen the panel after permission changes.


Admin console check is allowed, but the panel is still hidden

The NUI receives admin status when dashboard data is loaded.

Close the panel completely and reopen it using:

J

or:

/trickortreat

If needed:

restart wp_trickortreat

Then reopen the panel.


A weighted legacy reward gives nothing

Check for an empty group with a non-zero weight:

{
    id = 'jackpot',
    weight = 1,
    items = {}
}

Add an item or set:

weight = 0

Candy images do not display

Confirm the configured path:

image = 'images/candy/example.png'

and the file exists at:

ui/images/candy/example.png

PNG names are case-sensitive on Linux hosts.


Shop item images do not display

The default lookup is:

nui://ox_inventory/web/images/%s.png

Confirm the inventory image exists.

For manual images, place:

ui/images/items/itemname.png

and keep:

manualItemImagePath = 'images/items/%s.png'

The world becomes black behind the NUI

This is usually caused by replacing the supplied NUI CSS with a full-screen opaque background or backdrop filter.

Keep the root NUI background transparent.

Only the panel and intended overlay layers should use dark backgrounds.


A strange circle or decoration appears outside the panel

Check custom NUI changes for:

  • Full-screen pseudo-elements
  • Decorative radial gradients
  • Absolutely positioned glow circles
  • ::before or ::after elements outside the panel

Keep decorative elements inside the dashboard container.


SQL tables are missing

The resource attempts to create them automatically.

Confirm:

  • oxmysql is started
  • Database credentials are valid
  • wp_trickortreat starts after oxmysql

Manual import:

sql/wp_trickortreat.sql

Progress will not reset

Confirm admin authorization first:

wp_tt_admincheck

Commands:

wp_tt_resetplayer <serverId>
wp_tt_resetall

When:

Config.Admin.resetMilestones = true

milestone claims are also removed.


Diagnostic Checklist

When reporting an issue, include:

wp_trickortreat version
wp_bridge version
framework
inventory provider
target provider
Config.PayoutMode
Config.Interaction.mode
relevant Config.Debug output
server console error
client F8 error

Recommended temporary setting:

Config.Debug = true

Return it to:

Config.Debug = false

after testing.


Support Notes

Before requesting support:

  1. Confirm the latest resource version is installed.
  2. Remove or rename older duplicate resource folders.
  3. Verify the server starts the intended copy.
  4. Enable debug logging.
  5. Reproduce the problem once.
  6. Save the complete server and client error output.
  7. Include the relevant configuration section without exposing private identifiers or credentials.