Goal: Allow level 1 players to use the Looking For Dungeon tool, queue solo (as DPS), and have the queue pop instantly, bypassing level, gear, and other requirements.
We needed to modify three main areas:
Client UI Files: To enable the LFG button at level 1.
Server Core C++ Code: To change the required group size/composition from 5 players to 1 player.
Server Data (Datascript): To change dungeon level ranges, target levels, and remove gear/quest/achievement requirements.
Step-by-Step Guide:
Part 1: Client-Side Modification (Enabling the LFG Button)
Problem: The default WoW client UI disables the LFG button until level 15.
File to Modify: Interface\FrameXML\Constants.lua (located within the client's MPQ files).
Open up Ladik's MPQ Editor... go to ur data folder in ur wow 335 client I.E. C:\wowdev\client\Data\enUS ... open up the mpqs merged...
(click the top mpq... hold down shift...click the bottom mpq..) open.. clicked merged mode... then click interface... then click FrameXML...
Right click Constants.lua .. extract it.. find where it extracted (mine extracts to desktop... u may need to go to tools / options at the top and set work directory to ur client path.)
open up Constants.lua where it was extracts...
Change: Find the line defining SHOW_LFD_LEVEL and change its value to 1:
-- Before:
-- SHOW_LFD_LEVEL = 15; -- Or similar value
-- After:
SHOW_LFD_LEVEL = 1;
(Alternatively, one could edit Interface\FrameXML\MainMenuBarMicroButtons.xml and change self.minLevel = SHOW_LFD_LEVEL; to self.minLevel = 1; specifically for the LFDMicroButton).
Create a new, empty patch MPQ file (e.g., patch-Z.MPQ or patch-4.MPQ - ensure it loads after official patches).
Inside the new MPQ, create the folder structure Interface\FrameXML\.
Add your modified Constants.lua into this Interface\FrameXML\ folder within the MPQ.
Close the MPQ .
Place the new patch MPQ file into the client's Data folder.
Delete the client's Cache folder.
Part 2: Server Core C++ Changes (Setting Queue Requirement to 1 Player)
Problem: The server's LFG system expects a full group (1 Tank, 1 Healer, 3 DPS = 5 players) before the queue pops.
Files to Modify:
cores/TrinityCore/src/server/game/DungeonFinding/LFG.h
cores/TrinityCore/src/server/game/DungeonFinding/LFGQueue.cpp
Changes:
In LFG.h: Modify the LFGEnum to require only 1 DPS :
Code:
enum LFGEnum
{
LFG_TANKS_NEEDED = 0, // Changed from 1
LFG_HEALERS_NEEDED = 0, // Changed from 1
LFG_DPS_NEEDED = 1 // Changed from 3
};
In LFGQueue.cpp (First Change, around line 523): Modify the main "Enough players?" check in LFGQueue::CheckCompatibility to use the sum of roles needed instead of MAX_GROUP_SIZE:
Code:
// Calculate the total number of roles needed based on LFG.h constants
uint8 totalRolesNeeded = LFG_TANKS_NEEDED + LFG_HEALERS_NEEDED + LFG_DPS_NEEDED;
// Enough players based on roles needed?
if (numPlayers != totalRolesNeeded) // <<< Ensure this uses totalRolesNeeded
{
// ... (rest of the block remains mostly the same) ...
return LFG_COMPATIBLES_WITH_LESS_PLAYERS;
}
In LFGQueue.cpp (Second Change, around line 425): Modify the check for single queuing entities in LFGQueue::CheckCompatibility to also use the sum of roles needed:
Code:
// Calculate the total number of roles needed based on LFG.h constants
uint8 totalRolesNeededForCheck = LFG_TANKS_NEEDED + LFG_HEALERS_NEEDED + LFG_DPS_NEEDED; // Can reuse variable or use new one
// If checking a single entity (player or group), see if it meets the total roles needed OR if it's just partially filled (original logic)
if (check.size() == 1 && numPlayers != totalRolesNeededForCheck) // <<< Ensure this uses totalRolesNeededForCheck
{
// ... (rest of the block remains mostly the same) ...
return LFG_COMPATIBLES_WITH_LESS_PLAYERS;
}
Tool: C++ Compiler (Visual Studio 2022 in your case) and CMake.
Action:
Make the code changes above and save the files.
Recompile the Core: Open the TrinityCore.sln file from your build directory (tswow-build/TrinityCore) in Visual Studio (as Administrator). Set configuration to "RelWithDebInfo" / "x64". Rebuild the worldserver project (or ALL_BUILD).
Then build the INSTALL project.
Synchronize Binaries: Copy all generated files (.exe, .dlls, etc.) from the INSTALL output directory (e.g., tswow-build/TrinityCore/bin/RelWithDebInfo/) to your server's running bin directory (tswow-install/bin/), overwriting the existing files (backup first!).
Part 3: Server Data Changes (Datascript for Levels & Requirements)
Problem: Dungeons have default level ranges, target levels, and potentially requirements for gear, quests, items, or achievements stored in server data.
File to Modify: Your custom datascript, modules/yourcreator-levelone/datascripts/level_control.ts.
Changes: Ensure the script performs the following actions:
Updates LfgDungeons.dbc: Loops through all dungeons and sets:
dungeon.MinLevel.set(1)
dungeon.MaxLevel.set(1)
dungeon.Target_Level.set(1)
dungeon.Target_Level_Min.set(1)
dungeon.Target_Level_Max.set(1)
Updates access_requirement table: Executes an SQL query to modify all entries:
UPDATE access_requirement
SET
item_level = 0,
level_min = 1,
quest_done_A = 0,
quest_done_H = 0,
item = 0,
item2 = 0,
completed_achievement = 0;
{Optionally) Updates creature_template levels if desired: UPDATE creature_template SET minlevel = 1, maxlevel = 1;
Ensure the level_control.ts script contains all the logic above.
Run the command build data in the TSWoW console.
Restart the World Server. stop realm start realm.
By performing all three parts (Client Patch, Core Recompile, Datascript Execution), you modify the necessary client UI behavior, server group formation logic, and server data definitions to enable instant solo LFG queuing at level 1.
Full Script:
Code:
import { std } from 'wow/wotlk';
// Set all creature levels to 1
std.SQL.Databases.world_dest.write('UPDATE creature_template SET minlevel = 1, maxlevel = 1;');
// Modify Dungeon Finder levels
const lfgDbc = std.DBC.LfgDungeons;
const numRows = lfgDbc.rowCount;
for (let i = 0; i < numRows; i++) {
const dungeon = lfgDbc.getRow(i);
if (!dungeon) continue; // Should not happen if rowCount is correct
// Set MinLevel if the property exists on the dungeon row object
if (dungeon.MinLevel) {
dungeon.MinLevel.set(1);
}
// Set Target_Level_Min if the property exists on the dungeon row object
// This is often the primary field for LFG visibility and requirements.
if (dungeon.Target_Level_Min) {
dungeon.Target_Level_Min.set(1);
}
// Also set the main Target_Level to 1
if (dungeon.Target_Level) {
dungeon.Target_Level.set(1);
}
// Optional: Adjust MaxLevel and Target_Level_Max if you want to further refine
// the dungeon visibility for level 1 characters.
// For a strict level 1 twink server, you might set these to 1 or another low level.
if (dungeon.MaxLevel) {
dungeon.MaxLevel.set(1);
}
if (dungeon.Target_Level_Max) {
dungeon.Target_Level_Max.set(1);
}
}
// Modify access_requirement table to remove item level, specific quest, item, and achievement requirements
std.SQL.Databases.world_dest.write(`
UPDATE access_requirement
SET
item_level = 0,
level_min = 1,
quest_done_A = 0,
quest_done_H = 0,
item = 0,
item2 = 0,
completed_achievement = 0;
`);
console.log("TSWoW: Set creature levels to 1.");
console.log("TSWoW: Set LFG dungeon levels to 1 (MinLevel, MaxLevel, Target_Level, Target_Level_Min, Target_Level_Max).");
console.log("TSWoW: Updated access_requirement table to set item_level = 0, level_min = 1, and cleared other specific item/quest/achievement requirements.");