DocumentationmigrationQBCore v1 to v2 Migration

QBCore v1 to v2 Migration Guide

This guide will help you migrate your QBCore server from version 1.x to version 2.x. This is a major version upgrade with significant changes and improvements.

Pre-Migration Checklist

Before starting the migration, ensure you have:

  • Complete server backup (files, database, configurations)
  • List of all custom resources and their versions
  • Database backup with verified restore capability
  • Test server environment for migration testing
  • Scheduled maintenance window for production migration
  • Rollback plan documented and tested

Major Changes in v2

Framework Architecture Changes

⚠️ Breaking Changes

QBCore v2 introduces several breaking changes. Custom resources will likely need updates.

1. Player Object Restructure

Before (v1):

local Player = QBCore.Functions.GetPlayer(source)
local playerData = Player.PlayerData
local job = playerData.job.name
local money = playerData.money['cash']

After (v2):

local Player = QBCore.Functions.GetPlayer(source)
local citizenId = Player.PlayerData.citizenid
local job = Player.PlayerData.job.name
local money = Player.Functions.GetMoney('cash')

2. Event System Updates

Before (v1):

-- Old event names
TriggerEvent('QBCore:Server:PlayerLoaded', source)
TriggerClientEvent('QBCore:Client:OnPlayerLoaded', source)

After (v2):

-- New event names with better organization
TriggerEvent('QBCore:Server:OnPlayerLoaded', source)
TriggerClientEvent('QBCore:Client:OnPlayerLoaded', source)

3. Database Schema Changes

New required columns in players table:

  • phone_number VARCHAR(20)
  • last_updated TIMESTAMP
  • metadata LONGTEXT (JSON format)

Resource Structure Changes

New File Organization

resources/[qb]/
β”œβ”€β”€ qb-core/
β”‚   β”œβ”€β”€ client/
β”‚   β”œβ”€β”€ server/
β”‚   β”œβ”€β”€ shared/
β”‚   └── config/
β”œβ”€β”€ qb-multicharacter/
└── [other resources]/

Step-by-Step Migration Process

Phase 1: Preparation

1. Backup Current Installation

# Create backup directory
mkdir -p /backups/qbcore-v1-backup-$(date +%Y%m%d)
 
# Backup server files
cp -r /path/to/server /backups/qbcore-v1-backup-$(date +%Y%m%d)/
 
# Backup database
mysqldump -u username -p database_name > /backups/qbcore-v1-backup-$(date +%Y%m%d)/database.sql

2. Document Current Setup

Create an inventory of:

  • All installed resources
  • Custom modifications
  • Database customizations
  • Server configuration

Phase 2: Test Environment Setup

1. Clone Production Environment

# Set up test server
cp -r /production/server /test/server
mysql -u username -p test_database < production_backup.sql

2. Install QBCore v2

# Remove old qb-core
rm -rf resources/[qb]/qb-core
 
# Clone QBCore v2
git clone -b v2.0 https://github.com/qbcore-framework/qb-core.git resources/[qb]/qb-core

Phase 3: Database Migration

1. Run Database Update Scripts

-- Add new columns to players table
ALTER TABLE `players` 
ADD COLUMN `phone_number` VARCHAR(20) DEFAULT NULL,
ADD COLUMN `last_updated` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
ADD COLUMN `metadata` LONGTEXT DEFAULT NULL;
 
-- Update existing data
UPDATE `players` SET `metadata` = '{}' WHERE `metadata` IS NULL;
 
-- Create new indexes for performance
CREATE INDEX `idx_phone_number` ON `players` (`phone_number`);
CREATE INDEX `idx_last_updated` ON `players` (`last_updated`);

2. Migrate Player Data

-- Convert old money format to new format
UPDATE `players` SET 
`money` = JSON_SET(
  COALESCE(`money`, '{}'),
  '$.cash', COALESCE(JSON_EXTRACT(`money`, '$.cash'), 0),
  '$.bank', COALESCE(JSON_EXTRACT(`money`, '$.bank'), 0),
  '$.crypto', COALESCE(JSON_EXTRACT(`money`, '$.crypto'), 0)
);

Phase 4: Resource Updates

1. Update Core Resources

Essential resources that need updating:

  • qb-multicharacter β†’ v2.0+
  • qb-spawn β†’ v2.0+
  • qb-apartments β†’ v2.0+
  • qb-garages β†’ v2.0+
  • qb-inventory β†’ v2.0+

2. Update Custom Resources

For each custom resource, check for:

Player Data Access:

-- Update calls to player data
-- Old way
local money = Player.PlayerData.money['cash']
 
-- New way  
local money = Player.Functions.GetMoney('cash')

Event Names:

-- Update event registrations
-- Old
RegisterNetEvent('QBCore:PlayerLoaded')
 
-- New
RegisterNetEvent('QBCore:Client:OnPlayerLoaded')

Phase 5: Configuration Updates

1. Update qb-core/config/config.lua

Key configuration changes:

Config = {
    MaxPlayers = 64, -- Updated default
    DefaultSpawn = vector4(-1035.71, -2731.87, 12.86, 0.0), -- New spawn system
    UpdateInterval = 5, -- New setting for data updates
    -- New features
    UseDebug = false,
    ServerCallbacks = {},
    ServerTimezone = 'UTC'
}

2. Update server.cfg

Add new convars:

# QBCore v2 specific settings
set qb_locale "en"
set qb_debug "false"
set qb_update_interval "5000"

# New resource order
ensure qb-core
ensure qb-multicharacter
ensure qb-spawn

Phase 6: Testing

1. Functionality Testing

  • Player login/character creation
  • Money transactions
  • Job system functionality
  • Inventory system
  • Vehicle spawning/garages
  • Housing system
  • All custom resources

2. Performance Testing

  • Server startup time
  • Player count stress test
  • Memory usage monitoring
  • Database performance

3. Integration Testing

  • Resource interdependencies
  • Event system flow
  • API functionality
  • Third-party integrations

Common Migration Issues

Issue 1: Player Data Not Loading

Symptoms: Players lose character data or cannot login

Solution:

-- Check for data format issues
SELECT citizenid, charinfo, money FROM players WHERE JSON_VALID(charinfo) = 0;
 
-- Fix invalid JSON data
UPDATE players SET charinfo = '{}' WHERE JSON_VALID(charinfo) = 0;

Issue 2: Resource Compatibility Errors

Symptoms: Resources throwing errors about missing functions

Solution:

  1. Update all QBCore resources to v2 compatible versions
  2. Check custom resources for deprecated function calls
  3. Update event names to new format

Issue 3: Database Performance Issues

Symptoms: Slow queries, high database load

Solution:

-- Add missing indexes
CREATE INDEX idx_citizenid ON players (citizenid);
CREATE INDEX idx_license ON players (license);
CREATE INDEX idx_job ON players ((JSON_EXTRACT(job, '$.name')));

Rollback Procedure

If migration fails, follow these steps:

1. Stop Server

# Stop FiveM server
pkill -f FXServer

2. Restore Files

# Restore server files
rm -rf /path/to/server
cp -r /backups/qbcore-v1-backup-*/server /path/to/

3. Restore Database

# Restore database
mysql -u username -p database_name < /backups/qbcore-v1-backup-*/database.sql

4. Restart Server

# Start server with original configuration
./run.sh

Post-Migration Checklist

After successful migration:

  • Performance monitoring - Monitor server performance for 24-48 hours
  • Player feedback - Collect feedback from players about any issues
  • Error logging - Monitor server logs for any unexpected errors
  • Backup verification - Ensure new backup system is working
  • Documentation update - Update internal documentation
  • Resource updates - Plan regular resource update schedule

Additional Resources


βœ… Migration Complete

Once you’ve completed all steps and verified functionality, your QBCore v2 migration is complete! Remember to update your documentation and inform your community about any new features.