301 releases · 35 resources

Changelog

What changed in every Oxide Studios resource, release by release. Read these before you update: migration steps and database changes are listed with each version.

Showing 26–50 of 122 releases

Oxide Dispatchv1.5.0

Minor

Added

  • AI dispatch is no longer tied to OpenAI. Each chained stage (speech-to-text, language model, text-to-speech) has its own Provider in shared/config/ai_dispatch.lua: openai, groq, openrouter, deepinfra, lemonfox, the self-hosted ollama, lmstudio, kokoro and speaches, or custom with your own BaseUrl. Keys go in oxide:ai-dispatch:<provider>_key convars (for example oxide:ai-dispatch:groq_key). Self-hosted providers need none. The language model must support tool calling.
  • Realtime mode can run through another gateway: set Realtime.Provider = 'custom' and an https:// Realtime.BaseUrl. Realtime always needs a key, a custom gateway included; without one the server console shows an error when the resource starts.
  • New AI dispatch options: LLM.Temperature, LLM.MaxTokens (set either to false to leave it out of the request), TTS.Format, Realtime.TranscriptionModel, and per-channel chainedVoice and realtimeVoice.
  • 911 and 311 calls from oxide-phone go through the same dispatch rules as /911 and /311, including their rate limit. The departments the phone names for each line (Config.Emergency in oxide-phone) receive its calls too.
  • The caller's phone number is saved on civilian alerts that are not anonymous and shown next to their name on the alert pop-up, the Dispatch Hub list and the alert's detail panel, when your server runs a phone resource.
  • With a phone resource installed, responder replies arrive on the caller's phone from the department. Without one, they show on screen as before.
  • With oxide-weather, alerts record the weather at the scene (conditions, temperature, wind) and show it on the alert. Turn it off with Config.Weather.Context.
  • Optional storm alerts: severe weather from oxide-weather raises a WEATHER alert for police, EMS and fire, updates as the storm changes and closes when it ends. Off by default (Config.Weather.Storms).
  • oxide-dispatch:weather shows and changes the weather settings from the server console, or in game for admins. Changes are saved and apply straight away; the file only sets the values for the first start.
  • AI dispatch can answer "what's it about?": a new get_alert_details tool reads back an alert's message, street, caller and number, age, vehicle, weather at the scene and the units on it. It only sees alerts sent to that channel's department, and anonymous callers stay anonymous. list_active_alerts now gives each alert's message and age too.
  • Optional spoken alert announcements: with Config.AIDispatch.AnnounceAlerts = true, the AI dispatcher reads every new alert out on the channels it is sent to. Off by default. In chained mode it costs one text-to-speech request per alert per channel with someone listening.
  • With oxide-weather, the AI dispatcher knows the current weather where the officer is, so "what's the weather like?" gets a real answer. Config.Weather.Context turns it off.
  • Two new 911 categories for fire: Brush / Wildfire (10-74) and Rescue / Extrication (10-76).
  • The fire group recognises lsfd and firefighter as well as fire, and any department name you add to Config.ResponderGroups.fire.jobs is treated as fire everywhere, including the AI dispatcher's channel rules.
  • 911 and 311 calls save the street and area the caller is in, from the phone, /911, /311 and the radial menu alike. It shows on the alert pop-up, the Dispatch Hub and to the AI dispatcher. A call waits at most Config.Civilian.locationTimeoutMs (1 second) for it and goes through without a street otherwise.
  • Map mode: inherit, combined, separate or disabled, set with oxide-dispatch:mapmode from the server console or by an admin in game. In separate mode the Hub has a Mainland / Cayo Perico picker.

Changed

  • The alert pop-up map, Hub map and heatmap now use o-link's shared map, which includes Cayo Perico. This resource no longer ships its own map images.
  • AI dispatch errors now name the stage that is missing a key (missing_key_stt, missing_key_llm, missing_key_tts) instead of missing_openai_key, and the startup log lists each stage's provider.
  • The startup key check only looks at the modes your channels use, so a chained-only server is no longer warned about a missing realtime key.
  • In chained mode, a request to a provider gives up after 20 seconds and is retried once, so a rate limit or an unreachable provider ends in an error instead of a long silence on the radio. Set them with Chained.RequestTimeoutSec and Chained.MaxRetries.
  • OpenAI receives the reply length cap as max_completion_tokens, so OpenAI's newer models can run the dispatcher.
  • The note an AI dispatcher gets for a new alert includes the street, and for a 911 or 311 call the caller, their number and what they said.
  • The dispatcher keeps at most 30 background notes (the officer's location, other officers' radio traffic, alerts filed or cancelled), so a long shift on the channel no longer makes every request larger. Set it with Chained.LLM.MaxSystemNotes.

Fixed

  • Alerts on Cayo Perico now show on the dispatch maps.
  • In chained mode, another officer talking while the dispatcher was running a lookup could make the dispatcher's next reply fail.
  • An officer on an AI dispatch channel who placed a 911 call themselves never got that call into their dispatcher's awareness. Only the officer whose own AI dispatcher filed an alert is skipped now.
  • Fire alerts reached firefighters who were off duty. With Config.Broadcast.onDutyOnly, the fire group now follows your framework's duty toggle (frameworkDuty = true in Config.ResponderGroups), and a firefighter who clocks in gets the open alerts straight away. If your fire job has no way to go on duty, set frameworkDuty = false on the fire group.
  • /911 and /311 with a written description, and phone calls, always went to police. They now go to the departments the words point to: a fire to fire, a medical call to EMS, both when both are mentioned. Calls with no recognised words still go to police. The words are each category's new keywords in Config.Civilian.
  • Alerts for police, EMS and fire together never reached fire, because the job cap cut the list at 12. Config.Broadcast.maxJobsPerAlert is now 32, and a trim is logged.

Documentation

  • docs/AI_DISPATCH.md: new "Choosing a provider", "Spoken alert announcements" and "Weather" sections, the realtime key rule, the get_alert_details tool, and what a rate limit looks like.
  • docs/CONFIGURATION.md: the new AI settings, per-provider keys, Config.Civilian.locationTimeoutMs, shared/config/weather.lua and "Shared map mode".
  • docs/ADMIN.md: the oxide-dispatch:weather and oxide-dispatch:mapmode commands.
  • docs/EXPORTS.md: the CivilianCall export, GetSetting / SetSetting for the weather settings, and the caller number and weather on alerts.
  • docs/FEATURES.md: phone calls, caller numbers, street names, replies on the phone, weather on alerts, alert details and announcements for the AI dispatcher.
  • docs/INSTALLATION.md: the o-link versions this release needs, and updating an existing database.
  • docs/TROUBLESHOOTING.md: the new AI error codes.

Migration Guide

  1. Back up your database.
  2. Update o-link first. The maps need 1.8.0 or newer. Phone calls, caller numbers and replies on the phone need 1.11.0 or newer.
  3. On first start, two columns are added to dispatch_alerts automatically (caller_number and weather_context). Your database user needs ALTER permission. To add them by hand instead, run sql/migrate_caller_number.sql and sql/migrate_weather_context.sql once. Both are safe to run more than once.
  4. If you keep your own config files, also copy the new shared/config/weather.lua. Your current shared/config/ai_dispatch.lua keeps working as before. To get the fire-routing fixes, also bring over maxJobsPerAlert = 32 in shared/config.lua (the old 12 still drops fire from alerts for police, EMS and fire), the keywords lists and the two new 911 categories in shared/config/panic.lua, and the fire group's new job names and frameworkDuty = true in shared/config/jobs.lua.
  5. Restart the whole server, not only the resource. This version adds new files.

Oxide Drugsellingv2.1.0

Minor

Added

  • Optional xpUnits on item rows in shared/config/drugs.lua lets larger packages award more sale XP. Items without it still count as one unit each.
  • Config.OnDrugSold and sale logs include the progression units counted for XP, separately from the number of items sold.

Changed

  • Weed sales award 10 XP per gram used to make the package: 10 for a gram, 30 for an eighth, 60 for a quarter, 120 for a half, 240 for an ounce and 350 for a brick. Meth, cocaine and pills keep their existing XP.
  • Sale XP rounds to a whole number. Invalid xpUnits values count as one and produce one server warning per item.

Fixed

  • Failed settings saves restore the previous active value and report failure. Resetting a setting also reports a failed save.
  • Settings buttons, tooltips, item searches and zone tools use locale text.
  • The settings editor closes when the character logs out.

Documentation

  • Updated configuration, exports and feature guides with package XP weights, sale-hook fields and progression examples.

Migration Guide

  • Merge weed xpUnits values 1, 3, 6, 12, 24 and 35 into your custom shared/config/drugs.lua, and set weed progression.xpPerUnit to 10. Keeping your old rows preserves per-item XP instead.
  • Config.Drugs remains file-only; database settings do not apply this configuration change for you.
  • Merge the new settings.ui.* keys into custom locales.
  • Restart oxide-drugselling after updating. No SQL or new items are required when upgrading from 2.0.0.

Oxide Methv1.7.0

Minor

Added

  • Complete paste-ready ox_inventory item definitions in items/ox_inventory_items.lua, covering equipment, ingredients, additives, production items and variants.

Changed

  • Settings buttons, tooltips, item searches, empty lists and placement-zone tools use locale text.

Fixed

  • Nearby players no longer see a floating, cursor-controlled bottle while someone pours ingredients.
  • A failed police-alert chance no longer starts the dispatch cooldown; the cooldown begins when an alert is sent.
  • Gangs-only usage restrictions require gang membership instead of allowing players through an empty job list.
  • Settings initialization no longer overwrites existing saved rows when a settings load returns empty.
  • Failed database saves retain the previous active setting and report failure.
  • Decimal settings no longer display long rounding tails.
  • Escape cancels a world picker without closing the settings panel, and character logout closes the panel.

Documentation

  • Updated installation guidance with the complete inventory template and configuration guidance with the corrected dispatch cooldown behavior.

Migration Guide

  • No SQL or new item names are required when upgrading from 1.6.0. Existing database settings remain.
  • For a fresh ox_inventory installation, copy entries from items/ox_inventory_items.lua into ox_inventory/data/items.lua, keeping one definition per item, and copy supplied item images into ox_inventory/web/images/.
  • Merge the new settings_ui_* keys into custom locales.
  • Restart oxide-meth after updating. Restart the whole server if you change inventory item definitions.

Oxide Weedv1.6.0

Minor

Added

  • Water hose — connect a hose to a water tank and water loose plants with Jet or Shower spray. Water and XP follow the amount actually delivered, and nearby players see the hose, nozzle and spray.
  • Grow tents — the Grow Box holds two plants at level 2, the Grow Tent holds four at level 4, and the Large Grow Tent holds eight at level 6. Each has built-in lighting, weather protection and a close-up growing scene, with opening doors or flaps.
  • Carbon filters — unlocked at level 5, filters suppress tent smell and reduce police alerts.
  • Police can seize tents, their plants and filters. Configure eligible jobs, duty requirements and seizure time in /weed settings.
  • Custom streamed models for every plant stage, wild plants, nursery pots, soil, lamps, heaters, drying racks, freeze dryers, water tanks, hoses, watering cans and tent plants.
  • Config.ModelSwaps lets owners replace models unavailable on their game build. Missing models produce a clear server warning and are skipped.
  • Grower Profile — /weed stats now opens Overview, Strains, Goals and Ranks, showing journal firsts, personal bests, lifetime totals, mastery, signature strains, perks and unlocks. XP gains and level-ups have their own feedback.
  • Level perks add slower care decay at level 6, better trimming at 7, more seed chances at 8, kept male plants and another tent at 9, and better care and cheaper cloning at 10.
  • Gelato, Wedding Cake and Durban Poison seed packs unlock at levels 7, 8 and 9. Each contains three seeds; these strains do not appear among wild plants.
  • Strain mastery — Familiar, Skilled and Master unlock after 5, 15 and 40 harvests, with strain bonuses, badges and one-time XP rewards. Each strain's first-ever harvest also earns a bonus, capped at three strains per day.
  • Grower goals — three daily and two weekly goals scale with progression. Players can swap one daily goal; sale goals work when oxide-drugselling is running.
  • Master ranks — after level 10, every 4,000 XP earns another rank, up to five. Choose another tent, 15% faster drying, an extra bud, Wild Genes or free lab reports.
  • The scientist can reset master perk choices for $25,000 dirty money. Extra tents must be packed before removing their capacity perk.
  • Signature strains — level 10 growers can register mastered crossbreeds under unique, moderated names for $50,000 dirty money, with two registrations per character by default. Sales build street reputation and seizures reduce it; optional sale pricing adds up to 15%.
  • Grower app for oxide-phone and oxide-tablet, with the same profile, goals and rank choices, plus level and daily-goal widgets. Neither device resource is required; signature registration and perk resets remain at the scientist.
  • Optional weather effects on exposed loose plants, gang influence on harvests and brick production, and skills mirroring. These integrations ship disabled.
  • Permanent /weed tank, /weed setlevel and /weed unregister admin tools. /weed setxp and /weed setlevel support a target player and server-console use.

Changed

  • Rebuilt the growing and processing scenes, world displays, minigames, store and scientist menus.
  • Drying racks hang buds upside down from four bars. Freeze dryers have opening doors, sliding trays and individual bud loading and collection; cancelling a scene keeps its contents.
  • Soil fills the nursery pot as fertilizer is poured. Planting and care cameras frame the whole pot, harvested buds fit the new plants, heaters face the table, and wild plants follow sloped ground.
  • Harvest XP reflects quality, drying XP is paid on collection, and journal firsts and personal bests earn bonuses. Repeated loading and lamp actions no longer farm XP; care XP requires a plant below 90%.
  • Store level requirements now match equipment and strain usage requirements.
  • Config.MaxPlantsPerPlayer defaults to 40 and counts loose and tent plants together; 0 disables the limit. Optional level-based loose-plant limits ship disabled, and existing plants are kept.
  • Tote capacity is measured in grams. The new factory default is 50,000 g; legacy kilogram settings convert without changing their saved capacity.
  • Wild Genes now uses a configurable 3.0 range multiplier. Saved unchanged 1.25 defaults migrate; owner tuning remains.

Fixed

  • Watering-can item use and plant-care watering now spend and deliver the same amounts. Water is saved to the correct inventory slot, and a failed save gives no free water.
  • Picked-up tanks retain their water on inventories that support item metadata. Placement claims each stored tank once, and pickup blocks simultaneous filling, refilling and hose use.
  • Tote contents use the inventory bridge. Supported inventories prevent picking up a non-empty tote.
  • All planting paths enforce seed, strain, level and usage restrictions. Watering, fertilizing and equipment actions check the player's routing bucket, and harvests cannot be claimed twice.
  • Tent options respect ownership and access, while ownerless tents can still be packed or fitted with a filter.
  • Kept male plants regrow pollen after an hour without producing another pot. The timer and once-only XP survive restarts.
  • XP awards consistently check level-ups, and admin XP reductions update the player's progression immediately.
  • Goal draws, swaps, progress and rewards cannot race each other. Completed goals pay once across reset boundaries and reloads.
  • Failed payments refuse lab reports, cloning, signature registration and perk resets.
  • Freeze-dryer buds rest on the tray floor throughout loading, drying and collection. Saved unchanged default positions repair automatically; custom fitting remains.
  • Nearby players see held tools and pouring props in the correct place. Cursor-controlled scene props stay local instead of floating around other players.
  • A failed police-alert chance no longer starts the dispatch cooldown, and gangs-only usage restrictions no longer allow players through an empty job list.
  • Settings initialization preserves saved rows, failed saves retain the previous active value, cancelling a world picker keeps the settings menu open, and character logout closes it.

Documentation

  • Updated installation, configuration, admin, exports and troubleshooting guides, the grower's manual, and English and Spanish text.
  • Added integration guidance and complete paste-ready ox_inventory item definitions.

Migration Guide

  • Add water_hose, grow_box, grow_tent, grow_tent_large, carbon_filter, gelato_seed_pack, wedding_cake_seed_pack and durban_poison_seed_pack to your inventory. All except carbon_filter must be usable.
  • Copy the supplied icons from item images/ into your inventory's image folder, including replacements for both water-container icons. ox_inventory definitions are in item images/ox_inventory_items.lua.
  • On qb-inventory, set unique = true for watering_can, water_container_small and water_container_large so each item keeps its own water.
  • Restart the whole server after updating. The new stream files require a full restart; restarting only oxide-weed is insufficient. Placement requires o-link 1.9 or newer.
  • On boot, oxide-weed creates weed_hoses, weed_tents, weed_carried_tanks, weed_grower, weed_strain_mastery, weed_grower_goals and weed_grower_ranks.
  • Boot migrations add growth_state, tent_id, tent_slot, grower_bonus and pollen_ready_at to drug_plants, plus registered_by, registered_at, reputation, name_key and a unique name index to drug_strains. The shared drugs_progression table is unchanged.
  • Normal upgrades need no manual SQL when the database user has CREATE and ALTER permissions. For manual installation use sql/install.sql; for manual upgrades use sql/phase_7_growth.sql, sql/migrate_water_hose.sql, sql/migrate_grow_tents.sql, sql/migrate_carried_tanks.sql, sql/migrate_grower.sql, sql/migrate_pollen_regrow.sql, sql/migrate_strain_mastery.sql, sql/migrate_grower_goals.sql, sql/migrate_master_ranks.sql and sql/migrate_signature_strains.sql.
  • Saved settings remain authoritative. Unchanged vanilla models, scene layouts and factory XP values migrate to their new defaults; custom choices remain. Review custom drying-rack and freeze-dryer layouts.
  • Drying-rack trayCount, budsPerTray and trays settings migrate to barCount, budsPerBar and bars. Watering amounts now come from PlantSettings.water.sources; obsolete WateringCan.waterCost and fillAmount settings are removed.
  • FreezeDryer.requiredLevel moves to Equipment.freeze_dryer.requiredLevel, preserving a higher saved requirement.
  • New tent, filter, premium-strain and store defaults are seeded once; later removals remain removed. The hose is added during the legacy tank-model migration. Servers with custom tank models should add it to their saved store list themselves.
  • Existing XP, levels and lifetime totals remain. New journal and mastery history starts with this update; old actions are not reconstructed.
  • Update oxide-drugselling and merge its weed xpUnits configuration for sale XP by weight. Signature price bonuses also require the PriceFor modifier described in docs/CONFIGURATION.md.
  • Custom integrations reading GetPlayerProgression must use translated unlock label values in place of labelKey; unlocks also include kind. Merge the new locale keys into custom translations.

Oxide Bankingv2.2.0

Minor

Added

  • Phone app - When oxide-phone is running, players can install a Banking app from the phone's App Store: Home (total balance and account cards), Activity (search and filters), Payments (send to a payment ID or recent payee, request money as a bill, move money between your own accounts including savings, pay bills, cancel scheduled transfers), Insights (six months of spending by category) and More (payment ID, shared-account members, cards, loan instalments). Turn it off with Config.Phone.UsePhone. Deposits and withdrawals are never offered on the phone.
  • Balance widget - A small or medium phone home-screen widget with the player's balance. Players can hide the amount.
  • Phone notifications - Money received, scheduled transfers delivered and failed recurring payments, plus the existing bill, loan and investment notices. Opening the matching screen clears them.
  • ox_inventory item template - itemimages/ox_inventory_items.lua holds a paste-ready bank_card entry, with itemimages/bank_card.png.

Changed

  • Whole-dollar amounts - Every amount is whole dollars, at least $1, and fees are charged in whole dollars too. An amount with cents or under $1 is refused with a message saying so, before any money moves.
  • Recurring payments follow the transfer rules - They now check frozen accounts, MaxTransferAmount and the daily transfer limit, and ask for the security PIN at TwoFactorThreshold or more when a payment is set up or its amount is raised.
  • Failed recurring payments - When a recurring payment cannot be made, no money moves and the payer is told why if they are online. The next payment date still moves on.
  • Business reports - Expenses, reports and job activity on the Business screen cover only your current job's account, and only for that job's boss. Business-tier players and players listed on a job or gang account no longer see them.
  • Transfer notes - Notes are limited to 60 characters.
  • Refused transfers - The bank screen now shows why a transfer was refused.

Fixed

  • Business screen privacy - A job boss could see other players' personal account activity from the Business screen.
  • Transfers - The recipient is paid only after the money has left the sender's account, and the sender is refunded, fee included, if it cannot be delivered.
  • Recurring payments - A recurring payment no longer pays the recipient when the payer's money could not be taken, and each payment runs only once per due date.
  • Scheduled transfers - A scheduled transfer that cannot be delivered is now marked failed and refunded. It used to be marked completed with the money gone. A transfer can no longer be both delivered and refunded.
  • Failed refunds - When a payment cannot be delivered and returning the money also fails, the player is no longer told the money is back. Every admin online is alerted and the case is written to bank_audit_log as refund_failed (see docs/ADMIN.md).
  • Amounts with cents - A deposit, withdrawal or transfer with cents could record one amount and move another. Amounts are now whole dollars from start to finish.
  • Notifications - Paying a bill no longer clears the notice for an unrelated investment, and an investment notice no longer replaces a bill notice.
  • Job invoices - Invoices to a job account whose name differs only in capital letters (for example LSPD and lspd) can be paid again after a restart.

Documentation

  • docs/CONFIGURATION.md - Added Config.Phone.UsePhone and the whole-dollar rule.
  • docs/FEATURES.md - Added the phone app, the whole-dollar rule, the transfer note limit, the recurring payment rules and failed refunds.
  • docs/ADMIN.md - New "Failed Refunds" section: what admins see and how to find the cases in bank_audit_log.
  • docs/INSTALLATION.md - Added the phone app section and its o-link 1.11.0 requirement, and the ox_inventory step now uses itemimages/ox_inventory_items.lua.

Migration Guide

  1. No database changes.
  2. Copy the new Config.Phone block from config/config.lua into your own config. Without it, the phone app is on.
  3. The phone app needs o-link 1.11.0 or newer and oxide-phone. On an older o-link everything else works and the app does not appear.
  4. Restart the whole server, not only the resource. This version adds new files.

Oxide Policev1.12.0

Minor

Added

  • Phone numbers on the MDT. A person's profile shows their phone numbers, read from whichever phone resource your server runs. Nothing shows without a phone. This needs o-link 1.11.0 or newer.

Fixed

  • Fine emails are no longer attempted on servers without a phone resource, so the console no longer shows a warning on every fine.

Documentation

  • docs/FEATURES.md, docs/INSTALLATION.md and docs/CONFIGURATION.md: the phone numbers on the MDT person profile, the o-link version they need, and fine emails on servers without a phone.

Oxide Animal Controlv1.6.0

Minor

Added

  • Shift messages arrive as texts from the office on phones that support texts. Other phones get them as mail, as before.
  • An incoming call also rings the player's phone (the crew leader's in a crew). Accept or decline it on the call card as before.
  • Texts and call rings need o-link 1.11.0 or newer and Config.usePhone on.
  • Gigs app support for Oxide Phone: the app shows the offices, the player's current call and pay so far, and their level. Shift updates and incoming calls appear in the app instead of as texts and phone notifications; the pay summary still arrives as a text.
  • New read-only server exports GetInfo, GetShift and GetProgression, plus SetUpdateHandler so another resource, such as a phone app, can show shift updates itself.

Changed

  • The settings editor's remaining English text (the Admin badge, Move up, Move down, Remove, Place in world, Teleport here, and the empty-list and entry labels) now comes from locales/en.json and can be translated.
  • The server log now records refused /animalcontrol settings attempts by non-admins, and whether each settings change came from the menu or another resource.

Fixed

  • If a setting can't be saved to the database, the editor says it couldn't be saved and the old value stays. Before, the server used the new value even though it was never saved.
  • When the settings editor refuses a change, it now shows the actual reason. Before, every refusal said to end active shifts first.
  • A setting reset that fails now shows a message instead of doing nothing.
  • Logging out with the settings editor open now closes it instead of leaving it on screen.

Documentation

  • docs/EXPORTS.md: GetInfo, GetShift, GetProgression and SetUpdateHandler.
  • README.md, docs/CONFIGURATION.md, docs/FEATURES.md, docs/INSTALLATION.md, docs/TROUBLESHOOTING.md: shift messages as texts or mail, the incoming-call ring, the Gigs app on Oxide Phone, o-link 1.11.0 for texts and the ring, Oxide Phone and qs-smartphone-pro in the supported phones, and the list of phone messages the job actually sends.

Migration Guide

  • No SQL to run. Restart the server fully once after updating (new server file and a rebuilt settings UI).

Oxide Landscapingv1.6.0

Minor

Added

  • Shift messages arrive as texts from the office on phones that support texts. Other phones get them as mail, as before. Texts need o-link 1.11.0 or newer.
  • Gigs app support for Oxide Phone: the app shows the offices, the player's current shift (yards done) and pay so far, and their level. Shift updates appear in the app instead of as texts; the pay summary still arrives as a text.
  • New read-only server exports GetInfo, GetShift and GetProgression, plus SetUpdateHandler so another resource, such as a phone app, can show shift updates itself.

Changed

  • The settings editor's remaining English text (the Admin badge, Move up, Move down, Remove, Place in world, Teleport here, and the empty-list and entry labels) now comes from locales/en.json and can be translated.
  • The server log now records refused /landscaping settings attempts by non-admins, and whether each settings change came from the menu or another resource.

Fixed

  • Config.usePhone now works. Set it to false and the job sends nothing to the player's phone; the net-pay notification at clock-out still shows. Before, it was ignored.
  • If a setting can't be saved to the database, the editor says it couldn't be saved and the old value stays. Before, the server used the new value even though it was never saved.
  • A setting reset that fails now shows a message instead of doing nothing.
  • Logging out with the settings editor open now closes it instead of leaving it on screen.

Documentation

  • docs/EXPORTS.md: GetInfo, GetShift, GetProgression and SetUpdateHandler.
  • docs/CONFIGURATION.md, docs/FEATURES.md, docs/INSTALLATION.md, docs/TROUBLESHOOTING.md: shift messages as texts or mail, the Gigs app on Oxide Phone, o-link 1.11.0 for texts, Oxide Phone and qs-smartphone-pro in the supported phones, and the list of phone messages the job actually sends.
  • The docs now say Config.shiftSummary has no effect in this job. It never changed how the pay summary is shown: the summary follows Config.usePhone, and the net-pay notification always shows.

Migration Guide

  • No SQL to run. Restart the server fully once after updating (new server file and a rebuilt settings UI).

Oxide Roadside Assistancev1.6.0

Minor

Added

  • Shift messages arrive as texts from the tow yard on phones that support texts. Other phones get them as mail, as before.
  • An incoming call also rings the player's phone (the crew leader's in a crew). Accept or decline it on the call card as before.
  • Texts and call rings need o-link 1.11.0 or newer and Config.usePhone on.
  • Gigs app support for Oxide Phone: the app shows the tow yards, the player's current call and pay so far, and their level. Shift updates and incoming calls appear in the app instead of as texts and phone notifications; the pay summary still arrives as a text.
  • New read-only server exports GetInfo, GetShift and GetProgression, plus SetUpdateHandler so another resource, such as a phone app, can show shift updates itself.

Changed

  • The settings editor's remaining English text (the Admin badge, Move up, Move down, Remove, Place in world, Teleport here, and the empty-list and entry labels) now comes from locales/en.json and can be translated.
  • The server log now records refused /roadside settings attempts by non-admins, and whether each settings change came from the menu or another resource.

Fixed

  • If a setting can't be saved to the database, the editor says it couldn't be saved and the old value stays. Before, the server used the new value even though it was never saved.
  • A setting reset that fails now shows a message instead of doing nothing.
  • Logging out with the settings editor open now closes it instead of leaving it on screen.

Documentation

  • docs/EXPORTS.md: GetInfo, GetShift, GetProgression and SetUpdateHandler.
  • docs/CONFIGURATION.md, docs/FEATURES.md, docs/INSTALLATION.md, docs/TROUBLESHOOTING.md: shift messages as texts or mail, the incoming-call ring, the Gigs app on Oxide Phone, o-link 1.11.0 for texts and the ring, Oxide Phone and qs-smartphone-pro in the supported phones, and the list of phone messages the job actually sends.

Migration Guide

  • No SQL to run. Restart the server fully once after updating (new server file and a rebuilt settings UI).

Oxide GoPostalv1.5.0

Minor

Added

  • Config.usePhone (default true), also under General in /postaljob settings. Turn it off to show shift messages as on-screen notifications instead, with a short net-pay notification at clock-out. Existing servers get it switched on automatically.
  • Shift messages arrive as texts from the depot on phones that support texts. Other phones get them as mail, as before. Texts need o-link 1.11.0 or newer.
  • Gigs app support for Oxide Phone: the app shows the depots, the player's current shift (loading or deliveries) and pay so far, and their level. Shift updates appear in the app instead of as texts; the pay summary still arrives as a text.
  • New read-only server exports GetInfo, GetShift and GetProgression, plus SetUpdateHandler so another resource, such as a phone app, can show shift updates itself.

Changed

  • The settings editor's remaining English text (the Admin badge, Move up, Move down, Remove, Place in world, Teleport here, and the empty-list and entry labels) now comes from locales/en.json and can be translated.
  • The server log now records refused /postaljob settings attempts by non-admins, and whether each settings change came from the menu or another resource.

Fixed

  • If a setting can't be saved to the database, the editor says it couldn't be saved and the old value stays. Before, the server used the new value even though it was never saved.
  • A setting reset that fails now shows a message instead of doing nothing.
  • Logging out with the settings editor open now closes it instead of leaving it on screen.

Documentation

  • docs/EXPORTS.md: GetInfo, GetShift, GetProgression and SetUpdateHandler.
  • docs/CONFIGURATION.md, docs/FEATURES.md, docs/INSTALLATION.md, docs/TROUBLESHOOTING.md: Config.usePhone, shift messages as texts or mail, the Gigs app on Oxide Phone, o-link 1.11.0 for texts, Oxide Phone and qs-smartphone-pro in the supported phones, and the list of phone messages the job actually sends.

Migration Guide

  • No SQL to run. Restart the server fully once after updating (new server file and a rebuilt settings UI).

Oxide Pizza Jobv1.5.0

Minor

Added

  • Shift messages arrive as texts from the shop on phones that support texts. Other phones get them as mail, as before. Texts need o-link 1.11.0 or newer.
  • Gigs app support for Oxide Phone: the app shows the shops, the player's current shift and pay so far, and their level. Shift updates appear in the app instead of as texts; the pay summary still arrives as a text.
  • New read-only server exports GetInfo, GetShift and GetProgression, plus SetUpdateHandler so another resource, such as a phone app, can show shift updates itself.

Changed

  • The settings editor's remaining English text (the Admin badge, Move up, Move down, Remove, Place in world, Teleport here, and the empty-list and entry labels) now comes from locales/en.json and can be translated.
  • The server log now records refused /pizza settings attempts by non-admins, and whether each settings change came from the menu or another resource.

Fixed

  • Config.usePhone now works. Set it to false and the job sends nothing to the player's phone. Before, it was ignored.
  • If a setting can't be saved to the database, the editor says it couldn't be saved and the old value stays. Before, the server used the new value even though it was never saved.
  • A setting reset that fails now shows a message instead of doing nothing.
  • Logging out with the settings editor open now closes it instead of leaving it on screen.

Documentation

  • docs/EXPORTS.md: GetInfo, GetShift, GetProgression and SetUpdateHandler.
  • docs/CONFIGURATION.md, docs/FEATURES.md, docs/INSTALLATION.md, docs/TROUBLESHOOTING.md: shift messages as texts or mail, Config.usePhone, the Gigs app on Oxide Phone, o-link 1.11.0 for texts, Oxide Phone and qs-smartphone-pro in the supported phones, and the list of phone messages the job actually sends.

Migration Guide

  • No SQL to run. Restart the server fully once after updating (new server file and a rebuilt settings UI).

Oxide Newspaperv1.4.0

Minor

Added

  • Shift messages arrive as texts from the depot on phones that support texts. Other phones get them as mail, as before. Texts need o-link 1.11.0 or newer.
  • Gigs app support for Oxide Phone: the app shows the depots, the player's current route and pay so far, and their level. Shift updates appear in the app instead of as texts; the pay stub still arrives as a text.
  • New read-only server exports GetInfo, GetShift and GetProgression, plus SetUpdateHandler so another resource, such as a phone app, can show shift updates itself.

Changed

  • The settings editor's remaining English text (the Admin badge, Move up, Move down, Remove, Place in world, Teleport here, and the empty-list and entry labels) now comes from locales/en.json and can be translated.
  • The server log now records refused /newspaper settings attempts by non-admins, and whether each settings change came from the menu or another resource.

Fixed

  • If a setting can't be saved to the database, the editor says it couldn't be saved and the old value stays. Before, the server used the new value even though it was never saved.
  • A setting reset that fails now shows a message instead of doing nothing.
  • Logging out with the settings editor open now closes it instead of leaving it on screen.

Documentation

  • docs/EXPORTS.md: GetInfo, GetShift, GetProgression and SetUpdateHandler.
  • docs/CONFIGURATION.md, docs/FEATURES.md, docs/INSTALLATION.md, docs/TROUBLESHOOTING.md: shift messages as texts or mail, the Gigs app on Oxide Phone, o-link 1.11.0 for texts, Oxide Phone and qs-smartphone-pro in the supported phones, and the list of phone messages the job actually sends.

Migration Guide

  • No SQL to run. Restart the server fully once after updating (new server file and a rebuilt settings UI).

Oxide Tabletv1.1.0

Minor

Added

  • Apps can open other apps on the tablet. The player still needs the other app installed and allowed for them.
  • The tablet also accepts the newer app message format used by oxide-phone, so an app built for both runs on either. Existing apps work as before.
  • itemimages/ox_inventory_items.lua holds a paste-ready tablet entry for ox_inventory.

Changed

  • Every button and tooltip in /tablet settings can now be translated in locales/en.json.
  • Attempts to open or change /tablet settings without admin rights are now written to the log.

Fixed

  • A /tablet settings change the database fails to save is now reported as failed and keeps its old value, instead of applying until the next restart.
  • When a /tablet settings change or reset is refused, the menu now says why instead of always saying settings are still loading, and a failed reset shows a message.
  • Pressing ESC to cancel an in-world placement no longer closes /tablet settings as well.
  • /tablet settings now closes when your character logs out.
  • Reports of game models that fail to load are now capped per player and in total, so one player cannot flood admins with warnings.

Documentation

  • docs/INSTALLATION.md: the ox_inventory steps now use itemimages/ox_inventory_items.lua.

Oxide Weatherv1.1.0

Minor

Added

  • Weather app for oxide-phone. Players install it from the phone's Store, or add weather to the phone's preinstalled apps. Each place gets its own page over an animated sky: conditions now, today's high and low, upcoming changes with daybreak and nightfall, a day-by-day forecast, detail tiles (precipitation, wind, daybreak or nightfall, radar, plus snow cover, power cuts and season when they apply), severe weather alerts and the radar.
  • Phone home-screen widget in small and medium sizes with the current conditions, plus the region's alert or upcoming changes.
  • Severe weather alerts for the player's region arrive as phone notifications. Tapping one opens the alert, and it is removed when the alert ends.
  • Config.Broadcast.Phone (default on) turns the phone app off. It is also in /weather settings → Broadcast as Phone app.

Changed

  • Config.Broadcast.Widget now covers both the tablet and the phone widgets.

Fixed

  • The radar's front count on the tablet can now be translated.

Documentation

  • docs/FEATURES.md: the phone app, widget sizes and alert notifications.
  • docs/CONFIGURATION.md: Config.Broadcast.Phone.
  • README.md, docs/INSTALLATION.md, docs/ESX_INSTALL.md, docs/QBCORE_INSTALL.md, docs/QBX_INSTALL.md: the optional phone app and the o-link 1.11.0 it needs.
  • docs/TROUBLESHOOTING.md: "The weather app does not appear on the phone".

Migration Guide

  1. No database changes. Saved settings keep their values and gain Phone app switched on.
  2. The phone app needs o-link 1.11.0 or newer and oxide-phone. On an older o-link everything else works and the app does not appear.
  3. Restart the whole server, not only the resource. This version adds new files.

Oxide Policev1.11.0

Minor

Added

  • Copy a fleet entry to another department or garage. In /police admin → Fleet → Vehicles, the copy button on a vehicle row recreates that entry — same number of units, label, model, rank, livery, extras, upgrades, addons, replacement cost and trunk loadout — in the department and garage you pick. Copies get new plates in that department's plate format, and copying is free, like adding a vehicle from the panel.
  • Performance upgrades for fleet vehicles. Set engine, brakes, transmission, armor and turbo for each fleet entry in /police admin → Fleet → Vehicles. Every unit of that entry comes out of the garage with them.
  • Gun rack addon. Bosses can buy vehicles with a gun rack (Config.FleetAddons.gun_rack, default 3500), and admins fit or remove one with the Rack toggle in /police admin → Fleet → Vehicles. On-duty officers of the department that owns the vehicle get Access Gun Rack on it, which opens a small stash for that vehicle — 4 slots by default, set in /police settings → Fleet → Fleet gun racks (Config.GunRack).
  • Place the commissary NPC with a live preview. /police admin → Detention → Prison Shop has a new Place Interactively button: move and turn a preview of the vendor, fine-tune it, then save.

Changed

  • Every button, placeholder and tooltip in /police settings can now be translated in locales/*.json.
  • Attempts to open or change /police settings without admin rights are now written to the log.

Fixed

  • The Prison Shop's Use My Position button now saves the spot you are standing on. It used to open the aim-based placement instead.
  • A /police settings change the database fails to save is now reported as failed, instead of applying until the next restart. Resetting a setting reports a failed save the same way.
  • /police settings now closes when your character logs out.
  • The treasury transaction for a trunk restock triggered by saving a vehicle's loadout now records who saved it.

Database

  • Run sql/migrations/008_fleet_performance_mods.sql and then sql/migrations/009_fleet_gun_rack.sql on existing servers before starting this version. They add performance upgrades and gun racks to your fleet table. Fresh installs need nothing — install.sql already includes both. Existing vehicles start with no upgrades and no gun rack.

Notes

  • Gun racks accept any item, not only weapons. The inventory bridge cannot limit a stash to weapons, so racks are kept small instead.
  • A gun rack empties when its vehicle is returned, towed back or destroyed. Turn on Config.GunRack.PersistOnReturn to keep the contents with the vehicle. Removing a rack keeps what is in it — the items are there again once a rack is refitted.
  • On inventories that cannot clear a stash (core_inventory, hex_4_inventory, jpr-inventory, ps-inventory and qb-inventory v1), racks are not emptied on return and a console warning names the vehicle.
  • Performance upgrades reach a vehicle that is already out on the road the next time it is taken out of the garage.
  • Copying between two departments needs someone who manages both, which in practice means an admin. A boss can copy between their own department's garages.
  • No changes to existing settings. Config.GunRack arrives with its defaults, and the gun_rack price is added to your saved addon prices on the first start; your radar and megaphone prices are kept.

Documentation

  • docs/CONFIGURATION.md: new Gun racks section, plus the Config.GunRack and Config.FleetAddons.gun_rack settings.
  • docs/ADMIN.md and docs/FEATURES.md: placing the commissary NPC, copying fleet entries, performance upgrades and the gun rack.
  • docs/INSTALLATION.md lists the two new migrations, and docs/BUILDING-A-DEPARTMENT.md now points to that list instead of stopping at 006.

Oxide Shopsv1.3.0

Minor

Added

  • Owners can rename their shop. The Overview window of the management panel, at the shop or on the tablet, now has a Rename Shop button. Blank names are refused, and map color codes and other formatting characters are removed. The map blip updates for everyone right away, unless an admin gave the shop a custom blip label. The name stays if the shop is resold or reclaimed.
  • Two new settings under General in /shop settings: Allow owners to rename shops (Config.AllowPlayerRename, on by default) and Max shop name length (Config.MaxShopNameLength, default 32). Admins can still rename any shop in /shop admin when owner renaming is off.
  • New rate limit renameShop: 5 seconds between renames per player.
  • itemimages/ox_inventory_items.lua: the four shop supply items (hair_product, tattoo_ink, mask_blank, fabric), ready to paste into ox_inventory's data/items.lua.

Changed

  • Every button, placeholder, tooltip and empty-list message in /shop settings can now be translated in locales/en.json (the settings.ui.* keys).

Fixed

  • Pressing ESC to cancel an in-world placement no longer closes the whole /shop settings menu.
  • If a setting can't be saved to the database, /shop settings now marks it as not saved and keeps the old value. Before, the server used the unsaved value until the next restart. Reset to default now reports a failed reset too.
  • The /shop settings panel no longer stays on screen after the admin's character logs out.
  • Renaming a shop in /shop admin now updates the owner's My Shops tablet widget straight away.

Documentation

  • docs/FEATURES.md: new Renaming a Shop section; Map Blips notes that renames update the blip.
  • docs/CONFIGURATION.md: the two rename settings and the renameShop rate limit.
  • docs/ADMIN.md: admins can rename any shop even with owner renaming off.
  • docs/INSTALLATION.md: the ox_inventory step now points to itemimages/ox_inventory_items.lua.

Oxide Policev1.10.0

Minor

Added

  • The MDT and boss menu can open inside the tablet. With oxide-tablet running, officers get a Police MDT app and department heads get a Police Command app, and /police mdt or the tablet item opens the MDT inside the tablet too. Turn each off with Config.MDT.useTablet and Config.Boss.useTablet, or Host in oxide-tablet in /police settings. Without oxide-tablet, both open in their own window as before.
  • The MDT map now shows Cayo Perico. A new Map mode setting under General in /police settings (Config.MapMode, default inherit) picks combined islands, separate island views with a region picker, or disabled for mainland only. oxide-police:mapmode <mode> from the server console does the same.
  • Seized-phone reports from the drug selling resource can be attached to an MDT case by its case number, under the same department and duty rules as an entry typed in the MDT.
  • Dispatch alerts in the MDT show the weather when the alert carries it.

Changed

  • The MDT map is now drawn from o-link's shared map instead of images bundled with this resource.

Fixed

  • Police payments showed "o-link" in bank transaction history. They now read Paycheck, Back pay, Police fine, Department payout, Department deposit or Commissary purchase.
  • Saved /police settings values can no longer be overwritten with the file defaults if the database read fails during startup.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the menu.
  • Pressing ESC to cancel an in-world picker no longer closes /police settings as well.

Notes

  • Requires o-link 1.8.0 or newer for the MDT map.
  • Tablet hosting is on by default. If you run oxide-tablet and want the MDT and boss menu in their own windows, turn off Host in oxide-tablet for each in /police settings.

Documentation

  • New items/ox_inventory_items.lua and items/ox_inventory_weapons.lua hold every item and the WEAPON_RADAR weapon ready to paste into ox_inventory, with images alongside. docs/INSTALLATION.md, docs/ESX_INSTALL.md and docs/QBX_INSTALL.md now point to them.
  • docs/CONFIGURATION.md: new shared/config/boss.lua section, Config.MDT.useTablet, and a Shared map mode section.
  • docs/EXPORTS.md: new AttachCaseEvidence export for adding an entry to a case from another resource.
  • docs/QBX_INSTALL.md: stale references fixed and the Config.Radar.HandheldWeapon example corrected to 'WEAPON_RADAR'.

Oxide Animal Controlv1.5.0

Minor

Added

  • IsOnShift server export: exports['oxide-animalcontroljob']:IsOnShift(source) tells your other resources whether a player is on an animal control shift, so they can stop someone working two jobs at once.
  • Paste-ready ox_inventory entries for the dart gun and ammo_dart in itemimages/ox_inventory_weapons.lua.

Changed

  • Missing-model warnings are now capped per player and in total, so one misbehaving client can't flood admins with notifications or fill the server log.

Removed

  • Config.Blip.label: it had no effect. The office blip always shows the office's name.

Fixed

  • Pressing ESC to cancel an in-world placement no longer closes the whole settings editor too.

Documentation

  • New docs/EXPORTS.md covering IsOnShift, GetSetting and SetSetting, with integration examples.
  • docs/INSTALLATION.md: ox_inventory steps now point to itemimages/ox_inventory_weapons.lua.

Oxide Landscapingv1.5.0

Minor

Added

  • IsOnShift server export: exports['oxide-landscapingjob']:IsOnShift(source) tells your other resources whether a player is on a landscaping shift, so they can stop someone working two jobs at once.

Changed

  • Missing-model warnings are now capped per player and in total, so one misbehaving client can't flood admins with notifications or fill the server log.

Fixed

  • Switched-off settings no longer turn themselves back on after a restart.
  • If the database returned nothing at startup, saved settings could be overwritten with the config file defaults. Startup now only adds settings that are missing.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the editor.
  • Pressing ESC to cancel an in-world placement no longer closes the whole settings editor too.

Documentation

  • New docs/EXPORTS.md covering IsOnShift, GetSetting and SetSetting, with integration examples.

Oxide Roadside Assistancev1.5.0

Minor

Added

  • IsOnShift server export: exports['oxide-roadsideassistancejob']:IsOnShift(source) tells your other resources whether a player is on a roadside assistance shift, so they can stop someone working two jobs at once.

Changed

  • Missing-model warnings are now capped per player and in total, so one misbehaving client can't flood admins with notifications or fill the server log.

Removed

  • Config.Blip.label: it had no effect. The tow yard blip always shows the tow yard's name.

Fixed

  • Dying on shift went unnoticed. The shift now ends, earned pay is paid out, the work uniform comes off and the death complaint is filed. A crew partner still on shift keeps the truck and the current call. On QBCore and QBX, being downed counts too.
  • Switched-off settings no longer turn themselves back on after a restart.
  • If the database returned nothing at startup, saved settings could be overwritten with the config file defaults. Startup now only adds settings that are missing.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the editor.
  • Pressing ESC to cancel an in-world placement no longer closes the whole settings editor too.

Documentation

  • New docs/EXPORTS.md covering IsOnShift, GetSetting and SetSetting, with integration examples.

Oxide GoPostalv1.4.0

Minor

Added

  • IsOnShift server export: exports['oxide-postaljob']:IsOnShift(source) tells your other resources whether a player is on a postal shift, so they can stop someone working two jobs at once.

Changed

  • Missing-model warnings are now capped per player and in total, so one misbehaving client can't flood admins with notifications or fill the server log.

Removed

  • Config.Blip.label: it had no effect. The depot blip always shows the depot's name.

Fixed

  • Switched-off settings no longer turn themselves back on after a restart.
  • If the database returned nothing at startup, saved settings could be overwritten with the config file defaults. Startup now only adds settings that are missing.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the editor.
  • Pressing ESC to cancel an in-world placement no longer closes the whole settings editor too.

Documentation

  • New docs/EXPORTS.md covering IsOnShift, GetSetting and SetSetting, with integration examples.
  • docs/CONFIGURATION.md: new "How Settings Work" section. Adding a depot now points to /postaljob settings, and the depot name field explains that plain text works.
  • docs/ADMIN.md: /postaljob settings added to the command list. Builder exports only go in the config file before the resource's first start.
  • docs/TROUBLESHOOTING.md: timer, cancel cooldown and debug logging fixes now point to /postaljob settings.

Oxide Pizza Jobv1.4.0

Minor

Added

  • IsOnShift server export: exports['oxide-pizzajob']:IsOnShift(source) tells your other resources whether a player is on a pizza delivery shift, so they can stop someone working two jobs at once.

Changed

  • Missing-model warnings are now capped per player and in total, so one misbehaving client can't flood admins with notifications or fill the server log.

Fixed

  • Switched-off settings no longer turn themselves back on after a restart.
  • If the database returned nothing at startup, saved settings could be overwritten with the config file defaults. Startup now only adds settings that are missing.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the editor.
  • Pressing ESC to cancel an in-world placement no longer closes the whole settings editor too.

Documentation

  • New docs/EXPORTS.md covering IsOnShift, GetSetting and SetSetting, with integration examples.
  • docs/CONFIGURATION.md: new "How Settings Work" section. Adding a shop now points to /pizza settings.
  • docs/ADMIN.md, docs/TROUBLESHOOTING.md: location builder exports and the cancel cooldown now point to /pizza settings. Pasting into the config file only works before the resource's first start.

Oxide Newspaperv1.3.0

Minor

Added

  • IsOnShift server export: exports['oxide-newspaperjob']:IsOnShift(source) tells your other resources whether a player is on a newspaper shift, so they can stop someone working two jobs at once.
  • Paste-ready ox_inventory entry for the newspaper weapon in itemimages/ox_inventory_weapons.lua.

Changed

  • Missing-model warnings are now capped per player and in total, so one misbehaving client can't flood admins with notifications or fill the server log.

Fixed

  • Switched-off settings no longer turn themselves back on after a restart.
  • If the database returned nothing at startup, saved settings could be overwritten with the config file defaults. Startup now only adds settings that are missing.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the editor.
  • Pressing ESC to cancel an in-world placement no longer closes the whole settings editor too.

Documentation

  • New docs/EXPORTS.md covering IsOnShift, GetSetting and SetSetting, with integration examples.
  • docs/CONFIGURATION.md: new "How Settings Work" section. Depots and houses now point to /newspaper settings, and /newspaperbuilder only captures coordinates into an export file.
  • docs/ADMIN.md, docs/TROUBLESHOOTING.md: builder exports and the uniform toggle now point to /newspaper settings.
  • docs/INSTALLATION.md: ox_inventory step now points to itemimages/ox_inventory_weapons.lua.

Oxide Bankingv2.1.0

Minor

Added

  • Redesigned Services screen - Loans, bills, savings, investments, cards, and credit each have their own tab, plus an Overview tab showing what needs attention and what is due in the next two weeks.
  • Tablet app - When oxide-tablet is running, the bank appears as a tablet app with a badge for bills and loan payments due soon, tray notifications, and an Upcoming payments home-screen widget. Bank locations still open the bank's own window. Turn it off with Config.Tablet.UseTablet. Deposits and withdrawals are hidden on the tablet unless Config.Tablet.AllowCashActions is true.
  • Savings notice period - Money withdrawn from savings soon after it was paid in is charged earlyWithdrawalPenalty. Money that has sat for withdrawalNoticeDays (default 7) comes out free. The savings screen shows how much is free to withdraw, and the fee, before a withdrawal is confirmed.
  • Invoice late fees and collection - Late fees grow for each day an invoice stays unpaid (InvoiceLateFeeDailyPercent). Overdue invoices are collected from the debtor's bank account after InvoiceAutoDebitAfterDays. Turn collection off with InvoiceAutoDebitEnabled = false. Unpaid invoices also lower the debtor's credit score.
  • Invoice limits - InvoiceMaxAmount and MaxOutstandingInvoicesPerRecipient cap invoices players write from the banking screen. Invoices from other resources (fines, medical bills, vehicle finance) are not affected.
  • Invoice from the business - Bosses can send an invoice from the business account on the Business screen.
  • Total borrowing limit - Config.Loans.exposure caps how much one player can owe across all their loans.
  • Position limits - maxPositionsPerProduct and maxTotalPositions for investments, maxPerProduct and maxTotal for certificates of deposit.
  • Early cash-out for investments - Investments can be withdrawn before they mature. Each product's earlyWithdrawalPenalty is taken from the earnings only, never from the amount invested.
  • Credit score settings - Config.CreditScore now sets the score range, how far credit events can move the score, how quickly that fades, and the points for each event (eventDeltas).
  • Command suggestions - Every banking command now shows chat suggestions, and command help text and chat replies can be translated in locales/en.json.
  • /forceinvoices collect - Marks overdue invoices and also collects them.

Changed

  • Banking days follow the calendar - A day the server was off at midnight, such as during a nightly restart, is now counted when the server starts again.
  • Loan repayment - Loans are repaid in instalments every LoanPaymentInterval days, taken automatically even when the borrower is offline. Paying off early refunds the interest for instalments that never ran. Loans in collections can be paid from the bank screen.
  • Loan applications - Applications waiting for approval count toward maxActiveLoans, and the application shows an eligibility check before it is sent. Config.LoanApproval.processingTime is in real hours. The Emergency Loan now needs an account at least 1 day old.
  • Rates rebalanced - Savings pays 1.25x the tier rate (was 2x). Certificate of deposit rates are annual: 4%, 6%, and 8%. Expected investment returns: savings bond 9%, stock index 12%, crypto fund 15%, real estate 11%.
  • Investments - A position holds its value once it matures until the player cashes it out. Investing follows each tier's investments setting, so Basic accounts cannot invest by default.
  • Savings minimum balance - A savings account can be emptied, but a withdrawal cannot leave it below minimumBalance.
  • Fee settings trimmed - config/fees.lua now lists only the fees the bank charges. ATM and external transfer fees stay available to other resources through the CalculateATMFee and CalculateTransactionFee exports.
  • WithdrawFromSavings export - The applyPenalty argument has been removed. The notice period decides the penalty.

Fixed

  • Reliability fixes across loans, savings, investments, certificates of deposit, invoices, cards, and credit scores.
  • Overdraft - An overdraft withdrawal now empties the bank balance and records the rest as owed. The amount owed shows on the banking screen and is paid back from the next money into the account.
  • Security PIN - Players who turn on the security PIN are asked for it before withdrawals and transfers of TwoFactorThreshold or more.
  • ATM PIN lockout - Too many wrong ATM PINs now lock PIN entry (MaxLoginAttempts, LockoutDuration).
  • Fraud alerts - Large withdrawals, deposits and transfers, and bursts of transactions, now alert online admins (EnableFraudDetection).
  • ESX transfers - Transfers to other players now work on ESX.
  • Tier upgrades - An upgrade no longer takes the first month's fee when the player cannot also pay the upgrade fee.
  • GetPlayerStatements export - statement_type and date are now filled in.

Documentation

  • All docs checked against the code and corrected.
  • docs/CONFIGURATION.md - Covers the savings notice period, loan repayment, the borrowing limit, investments, certificates of deposit, credit score settings, invoice late fees and collection, and the trimmed fee settings.
  • docs/FEATURES.md - Added the Services screen and the tablet app.
  • docs/EXPORTS.md - Updated the savings, loan, invoice, and credit exports, and added SettleInvoice.
  • docs/ADMIN.md - Added /forceinvoices collect.
  • docs/INSTALLATION.md - Added the update step for sql/migrations/.

Migration Guide

  1. Back up your database.

  2. Before you start 2.1.0, run the three files in sql/migrations/ once:

    • credit_hybrid_and_market_drift.sql
    • savings_notice_period_and_invoice_fees.sql
    • overdraft_owed.sql

    All three are safe to run more than once. They are written for MariaDB. On MySQL 8, remove IF NOT EXISTS from each ADD COLUMN and ADD INDEX line, and skip any column that already exists.

  3. Copy the new settings from config/ into your own config files. Several unused settings were removed from config/fees.lua.

  4. Restart the whole server, not only the resource. This version adds new files.

Existing savings balances are dated from the day each account was opened, so money in an account older than the notice period comes out free. In an account opened less than withdrawalNoticeDays ago, the existing balance becomes free once the account reaches that age. Open loans move onto the new repayment schedule automatically the first time the server starts.

Oxide Shopsv1.2.0

Minor

Added

  • Melee weapons no longer need a weapon license. When Require a weapon license is on, two new lists under Weapon Shop in /shop settings decide what sells without one: Categories sold without a license (ships with Melee) and Items sold without a license (ships with weapon_knife, weapon_bat, weapon_crowbar, weapon_hammer, weapon_nightstick). An item is exempt if either list matches it. Items added with Add item, wholesale or transfer have no category, so exempt those by name. Clear both lists to require the license for everything, as before. If you already had the requirement on, melee now sells without a license until you clear the lists.
  • The shop map in /shop admin is now drawn from o-link's shared map and includes Cayo Perico. A new Map mode setting under General in /shop settings (Config.MapMode, default inherit) chooses combined islands, separate island views, or disabled for mainland only; oxide-shops:mapmode <mode> from the server console does the same. Requires o-link 1.8.0 or newer.

Changed

  • The message unlicensed buyers see now reads "You need a weapon license to buy this item" (shop_weapon_license_required in locales/en.json).

Fixed

  • Saved /shop settings values can no longer be overwritten with the file defaults if the database read fails during startup.
  • Decimal settings no longer show rounding noise like 0.90000000000009 in the menu.

Documentation

  • docs/CONFIGURATION.md: the Weapon Shop section now documents Require a weapon license, License type and the two exemption lists; new Shared map mode section.
  • docs/FEATURES.md: Weapon license bullet under Weapon Shops.