Initial how_progression baseline

This commit is contained in:
2026-09-20 17:12:20 +00:00
commit 890a250270
22 changed files with 7258 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
return {
id = 'cosmic_dave',
displayName = 'Cosmic Dave',
ped = {
model = 'ig_omega',
coords = { x = 2447.63, y = 3775.08, z = 41.43, w = 23.30 },
spawnZOffset = -1.0,
scenario = 'WORLD_HUMAN_PARTYING',
missionEntity = true, invincible = true, frozen = true,
blockNonTemporaryEvents = true,
},
world = { alwaysPresent = true },
missions = {},
}
+37
View File
@@ -0,0 +1,37 @@
return {
id = 'crowbar',
displayName = 'Crowbar',
phone = { number = '555-7384' },
ped = {
model = 'ig_clay',
coords = { x = 1699.67, y = 3775.30, z = 34.74, w = 207.22 },
spawnZOffset = -1.0,
scenario = 'WORLD_HUMAN_SMOKING',
invincible = true,
frozen = true,
blockNonTemporaryEvents = true,
},
world = {
requires = { column = 'crowbar_stage', min = 1 },
vehicles = {
{
id = 'crowbar_daemon', model = 'daemon',
coords = { x = 1699.70, y = 3771.63, z = 34.53, w = 258.21 },
localEntity = true, locked = 2, invincible = true, frozen = true,
},
},
},
blip = {
label = 'Crowbar', sprite = 280, scale = 0.75, shortRange = false,
requires = { column = 'crowbar_stage', min = 1 },
},
interaction = {
name = 'how_progression_crowbar_talk', icon = 'fa-solid fa-comment',
label = 'Talk to Crowbar', distance = 2.0,
gateCallback = 'how_progression:server:isCrowbarMissionActive',
gateAllowsWhen = false,
stageCallback = 'how_progression:server:getCrowbarMission',
},
progression = { stageColumn = 'crowbar_stage', repColumn = 'crowbar_rep' },
missions = { 'crowbar:1', 'crowbar:2', 'crowbar:3', 'crowbar:4', 'crowbar:5' },
}
+18
View File
@@ -0,0 +1,18 @@
return {
id = 'deke',
displayName = 'Deke',
ped = {
model = 's_m_m_autoshop_02',
coords = { x = 2359.89, y = 3136.74, z = 48.21, w = 110.90 },
spawnZOffset = -1.0,
scenario = 'WORLD_HUMAN_STAND_IMPATIENT',
invincible = true, frozen = true, blockNonTemporaryEvents = true,
},
world = { alwaysPresent = true, spawnedWith = 'mack' },
interaction = {
name = 'how_progression_deke_shop', icon = 'fa-solid fa-toolbox',
label = 'Talk to Deke', distance = 2.0,
inventory = { kind = 'shop', type = 'DekeTools', id = 1 },
},
missions = {},
}
+13
View File
@@ -0,0 +1,13 @@
return {
id = 'gabe',
displayName = 'Gabe',
location = { x = 2340.96, y = 3126.11, z = 48.21 },
blip = {
label = 'Money Laundering', sprite = 500, display = 4,
scale = 0.7, shortRange = true,
createdDuring = 'crowbar:4',
},
service = { resource = 'randol_moneywash' },
associatedMissions = { 'crowbar:4' },
missions = {},
}
+27
View File
@@ -0,0 +1,27 @@
-- Passive definitions. Requiring this module does not create world entities.
local byId = {
unknown = require 'shared.contacts.unknown',
crowbar = require 'shared.contacts.crowbar',
mack = require 'shared.contacts.mack',
gabe = require 'shared.contacts.gabe',
deke = require 'shared.contacts.deke',
vinny = require 'shared.contacts.vinny',
cosmic_dave = require 'shared.contacts.cosmic_dave',
}
local phoneOwners = {}
for id, contact in pairs(byId) do
assert(contact.id == id, 'contact ID mismatch: ' .. id)
local number = contact.phone and contact.phone.number
if number then
assert(number:match('^555%-%d%d%d%d$'), 'invalid contact number: ' .. id)
assert(not phoneOwners[number], 'duplicate contact number: ' .. number)
phoneOwners[number] = id
end
end
return {
byId = byId,
get = function(id) return byId[id] end,
phoneOwner = function(number) return phoneOwners[number] end,
}
+67
View File
@@ -0,0 +1,67 @@
return {
id = 'mack',
displayName = 'Mack',
phone = { number = '555-6842' },
ped = {
model = 's_m_y_xmech_01',
coords = { x = 2366.60, y = 3154.91, z = 48.21, w = 17.84 },
spawnZOffset = -1.0,
scenario = 'WORLD_HUMAN_CLIPBOARD',
invincible = true, frozen = true, blockNonTemporaryEvents = true,
},
world = {
alwaysPresent = true,
vehicles = {
{
id = 'festival_bus', model = 'pbus2',
coords = { x = 2349.54, y = 3133.84, z = 48.21, w = 77.73 },
localEntity = true, locked = 2, missionEntity = true,
invincible = true, frozen = true,
},
{
id = 'junk_emperor', model = 'emperor',
coords = { x = 2343.67, y = 3141.72, z = 48.21, w = 211.39 },
localEntity = true, locked = 2, missionEntity = true,
invincible = true, frozen = true,
damage = {
engineHealth = 100.0, bodyHealth = 300.0,
smashedWindows = { 0, 1, 2, 3 }, brokenDoors = { 0 },
burstTyres = { 0, 4 },
},
},
{
id = 'forklift', model = 'forklift',
coords = { x = 2350.42, y = 3142.49, z = 48.21, w = 231.27 },
localEntity = true, locked = 2, missionEntity = true,
invincible = true, frozen = true,
},
},
ambientPeds = {
{ model = 's_m_y_xmech_02', coords = { x = 2355.0, y = 3148.0, z = 48.21, w = 180.0 }, wanderRadius = 12.0 },
{ model = 's_m_m_autoshop_01', coords = { x = 2345.0, y = 3150.0, z = 48.21, w = 90.0 }, wanderRadius = 12.0 },
{ model = 's_m_y_construct_01', coords = { x = 2360.0, y = 3143.0, z = 48.21, w = 270.0 }, wanderRadius = 15.0 },
{ model = 's_m_y_construct_02', coords = { x = 2341.0, y = 3130.0, z = 48.21, w = 0.0 }, wanderRadius = 10.0 },
{ model = 's_m_m_dockwork_01', coords = { x = 2334.0, y = 3125.0, z = 48.21, w = 180.0 }, wanderRadius = 15.0 },
{ model = 's_m_m_gardener_01', coords = { x = 2368.0, y = 3130.0, z = 48.21, w = 90.0 }, wanderRadius = 22.0 },
},
ambientPedBehavior = {
spawnZOffset = -1.0, missionEntity = true, invincible = true,
blockNonTemporaryEvents = true, canRagdoll = false,
fleeAttributes = 0, wanderMinLength = 2.0, wanderTimeBetweenWalks = 10.0,
},
},
blip = {
label = 'Mack', sprite = 280, scale = 0.75, shortRange = false,
requires = { column = 'mack_stage', min = 1 },
createdDuring = 'crowbar:4',
},
interaction = {
name = 'how_progression_mack_talk', icon = 'fa-solid fa-comment',
label = 'Talk to Mack', distance = 2.0,
gateCallback = 'how_progression:server:canTalkToMack',
gateAllowsWhen = true,
missionStateCallback = 'how_progression:server:getMackMission1State',
},
progression = { stageColumn = 'mack_stage', repColumn = 'mack_rep' },
missions = { 'mack:1' },
}
+7
View File
@@ -0,0 +1,7 @@
return {
id = 'unknown',
displayName = 'UNKNOWN',
phone = { number = '555-0100' },
progression = { introductionFlag = 'unknown_introduced' },
missions = {},
}
+46
View File
@@ -0,0 +1,46 @@
return {
id = 'vinny',
displayName = 'Vinny',
phone = { number = '555-3176' },
ped = {
model = 'a_m_m_business_01',
coords = { x = 1362.57, y = 3602.49, z = 34.96, w = 236.75 },
spawnZOffset = -1.0,
scenario = 'WORLD_HUMAN_STAND_IMPATIENT',
missionEntity = true, invincible = true, frozen = true,
blockNonTemporaryEvents = true,
},
world = {
createdDuring = 'mack:1',
restoredWhen = { vinny_fence_unlocked = 1 },
vehicles = {
{ model = 'sanchez', coords = { x = 1368.39, y = 3594.54, z = 34.34, w = 237.54 } },
{ model = 'sanchez', coords = { x = 1366.95, y = 3598.24, z = 34.37, w = 244.92 } },
{ model = 'sanchez', coords = { x = 1368.76, y = 3592.05, z = 34.37, w = 241.99 } },
{ model = 'sanchez', coords = { x = 1357.67, y = 3601.45, z = 34.44, w = 194.85 } },
{ model = 'sanchez', coords = { x = 1364.94, y = 3603.77, z = 34.33, w = 195.30 } },
},
vehicleBehavior = {
localEntity = true, missionEntity = true, locked = 2,
invincible = true, frozen = true,
purchaseEvent = 'qbx_vehicleshop:server:buyShowroomVehicle',
},
},
blip = {
label = 'Vinny', sprite = 226, scale = 0.7, shortRange = true,
createdDuring = 'mack:1', restoredWhen = { vinny_fence_unlocked = 1 },
},
interaction = {
name = 'how_progression_vinny_talk', icon = 'fa-solid fa-comment',
label = 'Talk to Vinny', distance = 2.0,
requiresObjective = 'talk_vinny',
},
fence = {
coords = { x = 1356.79, y = 3617.37, z = 34.88, w = 105.38 },
requires = { vinny_fence_unlocked = 1 },
vehicleModel = 'sanchez', dailyLimit = 3,
payoutItem = 'markedbills', payoutWorth = 200,
},
associatedMissions = { 'mack:1' },
missions = {},
}