Mission Builder | All in One Solution for Quests, Jobs & Custom Story Content [Standalone]

Mission Builder | Quests, Jobs and Custom Story Content

Howdy folks,
I’m proud to present to you my new Mission Builder System.

This fully Modular System allows server owners to create unlimited missions, quests, and storylines entirely through simple configuration files.

Instead of relying on small premade mission packs, Mission Builder gives you the tools to build your own content exactly the way you want.

From simple job missions like “Repair the Fence”, “Deliver the Crates” or "Kill 10 Deer" to fully branching story campaigns, everything is created using a flexible task-based system.

Get it here: https://drshwaggins-scripts.tebex.io/package/7369653
Showcase Video: https://youtu.be/YgA70W4pMyQ
Any Questions? Join my Discord


:clipboard: Quick Overview

  • Create unlimited custom missions
  • Fully configurable system
  • Story & progression support
  • time-based missions (Dailies, Weeklies, Monthlies, …)
  • Job-based mission access
  • Dynamic NPC dialogues & voice support (Custom Dialog Audio)
  • Integration support for external scripts


:puzzle_piece: Modular Task System

Every Mission is built by assigning created tasks.
By combining different task types, you can create almost any type of gameplay experience imaginable.

This allows you to build everything from:

  • Small side jobs
  • Delivery missions
  • Hunting missions
  • Investigation quests
  • Story-driven roleplay content
  • Multi-stage mission chains

Example Missions that could easily be created

Craftsman

  • Repair the windows
  • Talk to the owner
  • Find the lost ring
  • Return the ring

A Hunter’s Routine

  • Hunt 4 boars using a bow
  • Collect supply crates
  • Deliver the crates to the wagon
  • Speak with the butcher in Valentine
  • Give 10 Boar Meat to the Butcher

Shipment

  • Travel to the Port
  • Speak to the Port Manager
  • Repair the Wagon
  • Load the Boxes on the Wagon
  • Deliver the Boxes to the Warehouse


:brain: Advanced Story System

One of the biggest features of Mission Builder is its fully connected story system.

Missions can:

  • Require other missions to be completed first
  • Automatically unlock follow-up missions
  • Branch into different story paths
  • Fail or become unavailable based on player choices

Example:

A player receives two missions requiring the same lost diary.

Since the item can only be handed in once, the player must decide which NPC to trust.

That decision can:

  • Unlock new storylines
  • Block entire mission paths
  • Change future interactions

By combining these story mechanics with fitting tasks, mission descriptions, and fully customizable NPC dialogues, you can create immersive branching story campaigns for your server.


:bust_in_silhouette: NPC & Dialogue System

Missions can be accepted and turned in (for reward) by NPCs. Each NPC can have unique Animations or Scenarios, Names and Dialog for each Mission. The Dialog is presented by Subtitles and optional by Custom Audio files. This allows you to actually let the NPCs speak to the Player and be an immersive part of your Server.


:electric_plug: Integration in other Scripts

Mission Builder can also be integrated directly into other scripts through multiple export functions.

This allows server owners and developers to connect external gameplay systems directly with Mission Builder’s progression system.

Example:
You have a custom train robbery script that cannot fully be replaced by Mission Builder.

Using the provided exports, the robbery script can trigger mission progress inside Mission Builder when the robbery is completed.

This allows you to create things like daily or weekly crime missions for your players while still using your existing robbery system.

Example Weekly Mission:

  • Rob the Train 5 Times
  • Deliver Booze to Colm O´Driscoll

You can literally integrate it everywhere!
Want players to deposit money into the bank as part of a mission objective?
Simply create the task in the Mission Builder System and integrate the provided export inside your banking script.


:chart_increasing: Endless Possibilities

Mission Builder allows you to create:

  • Simple repeatable jobs
  • Immersive roleplay quests
  • RPG-style progression systems
  • Full story campaigns
  • Dynamic player-driven experiences

All within one single system.


:film_projector: Showcase Video


Example Config Files

Interaction Task

Config.Tasks["track_repair"] = {
    type = 8, -- Task Type (8 = Interaction Task)
    title = "Train Track Repair", -- Task Title
    description = "Repair the track", -- Task Description
    
    targetAmount = 2, -- Numbers of Interactions to perform, e.g. 2 different positions that need to be repaired
    
    -- Interaction-Positions
    targetPosition = {
        {x = -144.47, y = 654.54, z = 113.53, h=182.34},
        {x = -127.56, y = 664.94, z = 113.69, h=341.98},
    },
    
    drawMarker = true, -- Show a marker at the interaction position
    markerSettings = {type=0x94FDAE17, r=255, g=255, b=255, a=100, scaleX=1.0, scaleY=1.0, scaleZ=0.1}, -- Marker settings

    -- Optional: Needed Inventory Items for the interaction
    interactionEquipment = {
    }, 
    interactionOptions = {
        animation = {
            animationDuration = 10000, -- Time in ms the animation will be played
            animDict = "amb_work@world_human_sledgehammer@male@base",
            animName = "base",
        },
        prop = {
            spawnProp = "p_sledgehammer01x", -- Optional Spawned prop for the Animation
            propBone = 37709, -- Bone where the Prop is attached to
            propPlacement = {x=0.0, y=0.0, z=0.0, xRot=0.0, yRot=0.0, zRot=0.0} -- Offset for the Prop relative to the Bone
        }
    },

    blip = {
        coords = {}, 
        sprite = 748106308,
        color = "BLIP_MODIFIER_MP_COLOR_10",
        scale = 0.8,
        name = "Broken Train Track",
        zoneradius = 0, -- If this value is greater than 0, an Area Blip will be created instead of a normal one
    },

    restartable = false
}

Example Mission “Introduction”

Config.StoryMissions["introduction"] = { -- Unique Mission Name

    title = "Welcome to Valentine", -- Mission Title
    description = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.",
    missionImage = "valentine01.jpg",
    
    -- Optional: Should a Mission Vehicle be spawned for this mission?
    missionVehicles = {
        delivery1 = { -- Vehicle Identifier, to be used in the tasks if necessary
            model = "supplywagon",
            blip = {
                sprite = 564457427,
                color = "BLIP_MODIFIER_MP_COLOR_10",
                scale = 0.8,
                name = "Lieferwagen"
            },
            spawnPositions = {
                {x = -229.20, y = 633.85, z = 113.11, h=234.34},
                {x = -219.67, y = 644.42, z = 113.13, h=225.57},
            },
            cargoPropset = "crates"
        },
    },

    tasks = { -- List of Tasks that need to be completed for this mission, the tasks need to be defined in the task configuration files
        "travel_any_20km",
        "collect_diary",
        "deliver_quest_letter",
        'collect_crates',
        'deliver_crates',
    },
      
    -- Optional: NPC that gives the mission, if no NPC is defined, the mission can only be started through followUpMissions, export functions or the SpecificMissionGivers
    npc = {
        name = "Priester Sullivan",
        model = "cs_sdpriest",
        coords = vector4(-231.73, 796.54, 123.63, 117.33),
        spawnDistance = 30.0,

        -- Optional: Blips for the Mission NPC
        blip = {
            coords = vector3(-231.73, 796.54, 123.63), -- offsetcoords, if you want the blip to be on a seperate position. if not provided use the coords from npc
            sprite = 748106308,
            color = "BLIP_MODIFIER_MP_COLOR_10",
            scale = 0.8,
            name = "Priester Sullivan",
            zoneradius = 0, -- If greater than 0, it will create an area blip instead of a normal blip
        },

        animation = {
            useanim = false,
            dict = "amb@world_human_stand_mobile@male@text@enter",
            name = "enter",
            flag = 1,
            isScenario = true, -- If true, the animation will be played as a scenario, if false, the animation will be played as a normal animation
            scenario = "MP_LOBBY_PROP_HUMAN_SEAT_BENCH_PORCH_SMOKING",
            scenarioProp = "p_diningchairs01x",
            scenarioPosOffset = vector4(0.0, 0.0, 0.4, 180.0), -- Only relevant if isScenario is true, defines the offset for the scenario position, so the position where the scenario will be played is coords + scenarioPosOffset
        },

        dialog  = {
            -- Dialog for the beginning of the mission -> When you accept the mission
            -- 'audio' is optional and defines the path to an audio file that will be played while the dialog is shown
            beginning = {
                {text = "Sei gegrüßt, mein Kind… und willkommen auf Legends RP. Der Herr hat dich nach Valentine geführt – eine Stadt voller Sünden, aber auch voller neuer Wege.", time=13000, audio="introduction/priester_introduction_1.mp3"},
                {text = "Viele, die hier ankommen, tragen eine Last mit sich… doch jeder erhält die Chance, einen neuen Anfang zu wagen.", time=9000, audio="introduction/priester_introduction_2.mp3"},
                {text = "Ich will dir die Grundlagen zeigen, damit du deinen Weg mit Bedacht und Stärke gehen kannst.", time=6000, audio="introduction/priester_introduction_3.mp3"},
                {text = "Halte deine Augen offen… denn selbst an den dunkelsten Orten birgt Valentine Möglichkeiten für jene, die sie erkennen.", time=8000, audio="introduction/priester_introduction_4.mp3"},
                {text = "Mit /myMissions rufst du die aktuellen Missionen auf", time=4000, audio="introduction/priester_introduction_5.mp3"},
                {text = "Lege die Kilometer zurück, belade die Kutsche und melde dich beim Sheriff nachdem du das Tagebuch gefunden hast. Danach kommst du zu mir für deine Belohnung!", time=9000, audio="introduction/priester_introduction_7.mp3"},
                {text = "Aber nun genug OOC Talk, ab an die Arbeit mein Kind. Husch ! Husch !", time=6000, audio="introduction/priester_introduction_6.mp3"},
            },
            -- Dialog for the completion of the mission -> Before the mission is removed and you receive the reward
            completed = {
                {text = "Du hast dich wacker geschlagen… und den ersten Schritt auf deinem Pfad getan.", time=8000, audio="introduction/priester_introduction_8.mp3"},
                {text = "Nimm diese Belohnung als Zeichen… möge sie dich auf deinem weiteren Weg begleiten.", time=6000, audio="introduction/priester_introduction_9.mp3"},
            }
        }
    },

    -- Rewards
    reward = {
        currency = {
            money = 100,
            gold = 5,
            xp = 200
        },
        items = {
            {name = "bread", amount = 5},
            {name = "water", amount = 3}
        },
        events = { -- Server Events that are triggered if the mission is turned in
            {eventName = "dl_missions:server:testCall", eventData = {}, type="event", isServerEvent = true},    -- type can be "event" or "clientEvent", isServerEvent is only necessary if type is "event" to differ between client and server events, if type is "clientEvent" it will automatically be a client event
            {eventName = "exports.vorp_inventory:canCarryItem", eventData = {"bread", "5"}, type="exportFunction"}
        }
    },


    -- Optional: Prerequisite Missions -> If you have completed these missions, you can start this mission
    requiredMissions = {},  -- These Mission have to be completed and turned in to unlock the Mission
    
    followUpMissions = {}, -- These missions will be automatically ACTIVATED when the mission is completed -> No NPC interactions needed to start the mission
    failMissionsOnComplete = {} -- These missions will be FAILED if they are active, or will be Locked if they are not yet completed, when the 'introduction' mission is completed in this case.

}



Check out my other Scripts
:convenience_store: [PAID] DL ADVANCEDSTORES - NPC and Player Managed Stores [VORP/REDEMRP/RSG]
:axe: [PAID] DL LUMBERJACK - Complete Lumberjack System [VORP/RedEM:RP/RSG]
:page_facing_up: [PAID] DL DOCUMENTS - Document System [VORP / RSG / REDEM / CUSTOM]
:money_bag: [PAID] DL ADVANCEDBILLING - Create Private and Job Bills [VORP]
:office_building: [PAID] DL SOCIETY - Advanced Job / Company System v2 [VORP / RedEM:RP / RSGCORE]



Code is accessible No
Subscription-based No
Lines (approximately) 6000
Requirements oxmysql
Support Yes
2 Likes

Hello, this is the project lead and developer of Legends RP, a German RP server with around 60 to 80 active players.

This script is exactly what we’ve always been searching for. It allows you to create complete questlines, daily quests, weekly quests, and monthly content with NPCs that don’t just stand around throwing out text boxes, but can actually be fully voice-acted and brought to life. You can even involve real players directly in the quests, creating truly immersive and dynamic roleplay experiences. It delivers everything I’ve personally always dreamed of as both a project lead and a developer. I’m incredibly, incredibly grateful to have had the opportunity to be among the first people allowed to test this script.

Honestly, it’s just absolutely amazing.

1 Like