Workbench Script Debugging – DayZ

From Bohemia Interactive Community
Jump to navigation Jump to search
mNo edit summary
m (Some wiki formatting)
 
(26 intermediate revisions by 7 users not shown)
Line 1: Line 1:
[[Category:DayZ:Tutorials|Workbench]]
{{TOC|side}}


__TOC__
Using the diagnostic version of the game executable ('''DayZDiag_x64.exe'''), it is possible to connect Workbench tool to a running instance of the game client/server to debug scripts from the game and your mods.


== Prerequisites ==


Using the diagnostic version of the game executable ('''DayZDiax_x64.exe'''), it is possible to connect Workbench tool to a running instance of the game client/server and break and debug it's execution.
* If you are loading a mod, this tutorial assumes your mod is setup according to the structure in [[DayZ:Modding_Basics|Modding Basics]].
* You will require the official '''DayZ Tools''' where '''Workbench''' is located.
* You will have extracted the '''Project Drive''' as follows in the [[DayZ:Modding_Basics#Setting_up_the_Project_Drive|DayZ Modding Basics, Setting up the Project Drive]]


==File Setup==
== DayZ Setup ==


You will require official '''DayZ Tools''' where the '''Workbench''' tool is located and a way to unpack PBOs, using either the '''WorkDrive''' to unpack all the PBOs to your P:\ drive (recommended) or manually extract the script .pbo files (located inside your steam folder, by default C:\Program Files (x86)\Steam\steamapps\common\DayZ\dta\) using the '''BankRev''' tool.
We can allow direct modification and hotloading of game scripts straight from the '''Project Drive''' to the game. To do so we have to create a symbolic link. Like in [[DayZ:Modding_Basics#Preparing_FilePatching|DayZ Modding Basics, Preparing FilePatching]] we have to run a command in the command line window.  


* Go to your DayZ installation folder. It will be within the '''steamapps''' folder at 'common/DayZ'.
* Delete any folder called 'scripts' if they exist.
* Copy the full path.
* Open a command line window and run the following command, replacing 'DayZInstallationFolder' with the path you copied earlier.
:<syntaxhighlight lang="batch">
mklink /J "DayZInstallationFolder\scripts" "P:\scripts"
</syntaxhighlight>
* Navigate back to the DayZ installation folder, you should now see 'scripts' there. Enter the folder and you should see 'Scripts' and the files within it as you would see in the work drive.


P:\ drive with extracted PBOs
== Workbench Setup ==
 
[[Image:extracted_pbos.png]]
 
 
Note: For script debugging, only the script.pbo file needs to be extracted, containing the scripts\ folder. This will allow you to debug the running script. It is recommended to extract everything as '''Workbench''' has additional tools that can help you with modding.
 
==Workbench Setup==
 
Launch the Workbench from Dayz Tools\Bin\Workbench\workbenchApp.exe or using the tool launcher. From the top menu, navigate to "'''Workbench → Options'''" and point the '''Source Data directory''' to where you have your data extracted, ideally just P:\
 


* Launch Workbench through the DayZ Tools or navigate to 'common/Dayz Tools/Bin/Workbench/' within your steam folder.
* From the menubar, click 'Workbench' and then in the dropdown click 'Options'.
[[Image:wb_options.png]]
[[Image:wb_options.png]]
* Within the 'Workbench' tab, click on the '...' corresponding to '''Source data directory''' and select the 'P:\' drive or where you have extracted the game contents.
[[Image:wb_options_diag.png]]
* Click 'Ok', and then when prompted for a restart, let it.


After restarting you should be able to see the project structure in the Workbench Resource Browser just as they appear on your '''Project Drive'''.


[[Image:wb_options_diag.png]]
[[Image:wb_rsc_browser.png]]


== Loading Mods ==


After confirming it will prompt for a restart (let it), after which you should be able to see the project structure in the Workbench Resource Browser just as they appear on your P:\ drive.
Assuming you have setup your mod according to the [[DayZ:Modding_Basics|Modding Basics]] then workbench will be able to work with your mod as if it was a vanilla script.


Open a command-line window and run the following command, replacing 'WorkbenchInstallationFolder' with the path Workbench is installed at.


[[Image:wb_rsc_browser.png]]
<syntaxhighlight lang="batch">
start /D "WorkbenchInstallationFolder" workbenchApp.exe "-mod=P:\FirstMod"
</syntaxhighlight>


==Connecting Workbench to DayZ==
Additional mods can be added by being delimited by a semi-colon. For example: ''-mod=P:\FirstMod;P:\SecondMod''.


The '''DayZDiax_x64.exe''' is able to act as a client or as a server (with the addition of the -server command line parameter). It takes all the other parameters like the base executable.
== Connecting Workbench to DayZ ==


With workbench running, open the '''Script Editor''' module.  
The '''DayZDiag_x64.exe''' is able to act as a client or as a server (with the addition of the -server command line parameter).
<br>It takes all the other parameters like the base executable.


<br>With workbench running, open the '''Script Editor''' module.


[[Image:wb_scripteditor.png]]
[[Image:wb_scripteditor.png]]


It has it's own Resource Browser but you can open .c files from the base Resource Browser by double clicking them, which automatically opens the '''Script Editor''' and loads the selected file.
It has it's own Resource Browser but you can open .c files from the base Resource Browser by double clicking them, which automatically opens the '''Script Editor''' and loads the selected file.


[[Image:scripteditor_rsc_browser.png]]
[[Image:scripteditor_rsc_browser.png]]


When both the diagnostic executable and the '''Script Editor''' are running, it should automatically connect them, which will be announced by a brief popup window in the lower right part of your screen.  
When both the diagnostic executable and the '''Script Editor''' are running, it should automatically connect them, which will be announced by a brief popup window in the lower right part of your screen.  


[[Image:script_dbg_popup.png]]
[[Image:script_dbg_popup.png]]


Now you will be able to see text '''Output''' that the diagnostic executable is printing for debug purposes and also debug your code by inserting breakpoints and step through the execution.
Now you will be able to see text '''Output''' that the diagnostic executable is printing for debug purposes and also debug your code by inserting breakpoints and step through the execution.


[[Image:scripteditor_output.png]]
[[Image:scripteditor_output.png]]


Note: If you only want to see the console output, then extracting and loading PBOs is not needed, '''Script Editor''' should connect to the diagnostic executable without them, but then only the console output is available.
Note: If you only want to see the console output, then extracting and loading PBOs is not needed, '''Script Editor''' should connect to the diagnostic executable without them, but then only the console output is available.


==Script Breakpoints==
== Script Breakpoints ==
 
You can pause the script execution when it reaches a certain line in the script by inserting a '''Breakpoint''' - locate the line you are interested in and then by pressing '''F9''' a red dot should appear to the left, indicating the execution will stop once it reaches that line. If a yellow exclamation mark in a red circle appears instead, it means that that line of code is never really executed and the script will not stop there.


You can pause the script execution when it reaches a certain line in the script by inserting a '''Breakpoint''' - locate the line you are interested in and then by pressing '''F9''' a red dot should appear to the left, indicating the execution will stop once it reaches that line.
<br>If a yellow exclamation mark in a red circle appears instead, it means that that line of code is never really executed and the script will not stop there.


[[Image:scripteditor_breakpoints.png]]
[[Image:scripteditor_breakpoints.png]]


When the script reaches the indicated line, it will pause it's execution and show you where by a yellow arrow.
When the script reaches the indicated line, it will pause it's execution and show you where by a yellow arrow.


[[Image:scripteditor_break.png]]
[[Image:scripteditor_break.png]]


Basic controls and what you can do now are displayed in the top menu under Debug option. Here you also have to switch to the '''Debug Server''' option if you want to debug the script running on the server.
Basic controls and what you can do now are displayed in the top menu under Debug option. Here you also have to switch to the '''Debug Server''' option if you want to debug the script running on the server.


[[Image:scripteditor_debugmenu.png]]
[[Image:scripteditor_debugmenu.png]]


Note: You can also add and remove '''Breakpoints''' by left clicking where the red dots appear. Right clicking adds a blue '''Bookmark''' - these don't have any inherent function except marking script in interesting places so you can then easily navigate to them.
Note: You can also add and remove '''Breakpoints''' by left clicking where the red dots appear. Right clicking adds a blue '''Bookmark''' - these don't have any inherent function except marking script in interesting places so you can then easily navigate to them.


==Debugging Modded Scripts==
== Advanced Configuration ==
 
You need to load your modded scripts into '''Workbench''' if you want to debug them. Extracted mods have to include the mod.cpp config file for Workbench to automatically setup script module paths properly.
 
 
Place the mod folder in your P:\ drive and run workbenchApp.exe with
 
 
''-mod=P:\@YourModFolder;P:\@YourOtherModFolder''
 
 
Note: The @ symbol in a mod folder name is '''not''' a requirement
 
 
[[Image:mod_structure.png]]
 
 
If done correctly, after opening the Script Editor you should see all your .c mod files in the '''Script Editor Resource Browser''', in the root of the module that you are modding. So for example if you are modding the Mission module using class missionScriptModule in your mod.cpp then all your scripts should appear directly under Mission(scripts/5_Mission) in the '''Script Editor'''. You should also be able to find them using the search functions of the script editor.
 
 
[[Image:scripteditor_mod_rsc.png]]
 
 
You will also need to have your mod properly loaded in the game, which means having a packed or unpacked folder of the mod in your steam folder (by default C:\Program Files (x86)\Steam\steamapps\common\DayZ) and loading it with a startup parameter. In case of packed mods, launch '''DayZDiax_x64.exe''' with
 


''-mod=@YourPackedModFolder''
Additional configuration options are possible using the '''dayz.gproj''' file in the Workbench directory.




in case of unpacked mod, you will need both
'''FileSystem''' allows you to specify path where workbench looks for data which is needed for browsing files and creating ScriptModulePaths.
<br>This is the source data directory which you are setting in workbench options, so path to your P: is not necessary if you have set it there instead.




''-mod=@YourUnpackedModFolder'' and ''-filePatching''
Be aware of prefixes! When launching Workbench with '''-mod=YourUnpackedMod''' parameter to set the '''ScriptModulePaths''' automatically, FileSystemPath is used as part of the final path.
<br>This means that if your mod folder is located in


''P:\OtherMods\MyMod''


to allow use of unpacked data.
and it's ScriptModulePath in '''config.cpp''' is


''MyMod/scripts/etc''


If you are debugging in a multiplayer environment ('''DayZDiax_x64.exe''' with -server launch parameter), you may need to have some of the following settings in '''serverDZ.cfg'''
then your file system has to point to  


''P:\OtherMods''


<syntaxhighlight lang="c++">
'''OR''' the path in config.cpp has to be updated to  
allowFilePatching = 1;  // allow clients with unpacked data to join


BattlEye = 0; // turn off BE since diag exe does not run with it
''OtherMods/MyMod/scripts/etc''  
 
verifySignatures = 0; // if testing mods which aren't properly signed
</syntaxhighlight>
 
==Advanced Configuration==
 
Additional configuration options are possible using the '''dayz.gproj''' file in the Workbench directory
 
 
'''FileSystem''' allows you to specify path where workbench looks for data, f.e. useful in case you don't want to have your mod folder in the root of your P: drive. This is the source data directory which you are setting in workbench options, so path to your P: is not necessary if you have set it there instead.


in order to create correct full path(FileSystemPath+ScriptModulePath) which will work in '''Script Editor'''.


<syntaxhighlight lang="c++">
<syntaxhighlight lang="c++">
Line 154: Line 126:
             Directory "P:\OtherMods"
             Directory "P:\OtherMods"
         }  
         }  
FileSystemPathClass {    // Custom Dir for the One True Mod
FileSystemPathClass {    // Game dir
             Name "Mods folder"
             Name "Steam folder"
             Directory "P:\BestMod"
             Directory "D:\SteamGames\steamapps\common\DayZ"
         }  
         }  


Line 162: Line 134:




'''ScriptModules''' are paths which are required for script editor functionalities. They are automatically set when you launch '''Workbench''' with a ''-mod=YourMod'' parameter, but can also be set here if you wish
'''ScriptModules''' are paths which are required for script editor functionalities.
 
They are '''automatically set''' when you launch '''Workbench''' with a ''-mod=YourUnpackedMod'' parameter, only set these if you require a custom setup


<syntaxhighlight lang="c++">
<syntaxhighlight lang="c++">
Line 212: Line 184:
}
}
</syntaxhighlight>
</syntaxhighlight>
{{GameCategory|dayz|Tutorials}}

Latest revision as of 00:24, 25 April 2023

Using the diagnostic version of the game executable (DayZDiag_x64.exe), it is possible to connect Workbench tool to a running instance of the game client/server to debug scripts from the game and your mods.

Prerequisites

DayZ Setup

We can allow direct modification and hotloading of game scripts straight from the Project Drive to the game. To do so we have to create a symbolic link. Like in DayZ Modding Basics, Preparing FilePatching we have to run a command in the command line window.

  • Go to your DayZ installation folder. It will be within the steamapps folder at 'common/DayZ'.
  • Delete any folder called 'scripts' if they exist.
  • Copy the full path.
  • Open a command line window and run the following command, replacing 'DayZInstallationFolder' with the path you copied earlier.
mklink /J "DayZInstallationFolder\scripts" "P:\scripts"
  • Navigate back to the DayZ installation folder, you should now see 'scripts' there. Enter the folder and you should see 'Scripts' and the files within it as you would see in the work drive.

Workbench Setup

  • Launch Workbench through the DayZ Tools or navigate to 'common/Dayz Tools/Bin/Workbench/' within your steam folder.
  • From the menubar, click 'Workbench' and then in the dropdown click 'Options'.

wb options.png

  • Within the 'Workbench' tab, click on the '...' corresponding to Source data directory and select the 'P:\' drive or where you have extracted the game contents.

wb options diag.png

  • Click 'Ok', and then when prompted for a restart, let it.

After restarting you should be able to see the project structure in the Workbench Resource Browser just as they appear on your Project Drive.

wb rsc browser.png

Loading Mods

Assuming you have setup your mod according to the Modding Basics then workbench will be able to work with your mod as if it was a vanilla script.

Open a command-line window and run the following command, replacing 'WorkbenchInstallationFolder' with the path Workbench is installed at.

start /D "WorkbenchInstallationFolder" workbenchApp.exe "-mod=P:\FirstMod"

Additional mods can be added by being delimited by a semi-colon. For example: -mod=P:\FirstMod;P:\SecondMod.

Connecting Workbench to DayZ

The DayZDiag_x64.exe is able to act as a client or as a server (with the addition of the -server command line parameter).
It takes all the other parameters like the base executable.


With workbench running, open the Script Editor module.

wb scripteditor.png

It has it's own Resource Browser but you can open .c files from the base Resource Browser by double clicking them, which automatically opens the Script Editor and loads the selected file.

scripteditor rsc browser.png

When both the diagnostic executable and the Script Editor are running, it should automatically connect them, which will be announced by a brief popup window in the lower right part of your screen.

script dbg popup.png

Now you will be able to see text Output that the diagnostic executable is printing for debug purposes and also debug your code by inserting breakpoints and step through the execution.

scripteditor output.png

Note: If you only want to see the console output, then extracting and loading PBOs is not needed, Script Editor should connect to the diagnostic executable without them, but then only the console output is available.

Script Breakpoints

You can pause the script execution when it reaches a certain line in the script by inserting a Breakpoint - locate the line you are interested in and then by pressing F9 a red dot should appear to the left, indicating the execution will stop once it reaches that line.
If a yellow exclamation mark in a red circle appears instead, it means that that line of code is never really executed and the script will not stop there.

scripteditor breakpoints.png

When the script reaches the indicated line, it will pause it's execution and show you where by a yellow arrow.

scripteditor break.png

Basic controls and what you can do now are displayed in the top menu under Debug option. Here you also have to switch to the Debug Server option if you want to debug the script running on the server.

scripteditor debugmenu.png

Note: You can also add and remove Breakpoints by left clicking where the red dots appear. Right clicking adds a blue Bookmark - these don't have any inherent function except marking script in interesting places so you can then easily navigate to them.

Advanced Configuration

Additional configuration options are possible using the dayz.gproj file in the Workbench directory.


FileSystem allows you to specify path where workbench looks for data which is needed for browsing files and creating ScriptModulePaths.
This is the source data directory which you are setting in workbench options, so path to your P: is not necessary if you have set it there instead.


Be aware of prefixes! When launching Workbench with -mod=YourUnpackedMod parameter to set the ScriptModulePaths automatically, FileSystemPath is used as part of the final path.
This means that if your mod folder is located in

P:\OtherMods\MyMod

and it's ScriptModulePath in config.cpp is

MyMod/scripts/etc

then your file system has to point to

P:\OtherMods

OR the path in config.cpp has to be updated to

OtherMods/MyMod/scripts/etc

in order to create correct full path(FileSystemPath+ScriptModulePath) which will work in Script Editor.

   FileSystem {
		 FileSystemPathClass {     // This is usually set in Workbench -> Options -> Source data directory instead
            Name "Project Drive"
            Directory "P:"
         } 
		 FileSystemPathClass {     // Custom Dir for Mods
            Name "Mods folder"
            Directory "P:\OtherMods"
         } 
		 FileSystemPathClass {     // Game dir 
            Name "Steam folder"
            Directory "D:\SteamGames\steamapps\common\DayZ"
         }


ScriptModules are paths which are required for script editor functionalities. They are automatically set when you launch Workbench with a -mod=YourUnpackedMod parameter, only set these if you require a custom setup

	 ScriptModules {
		ScriptModulePathClass {
			Name "core"
			Paths {
				"scripts/1_Core"
			}
			EntryPoint ""
		}
		ScriptModulePathClass {
			Name "gameLib"
			Paths {
				"scripts/2_GameLib"
			}
			EntryPoint ""
		}
		ScriptModulePathClass {
			Name "game"
			Paths {
				"scripts/3_Game"
			}
			EntryPoint "CreateGame"
		}
		ScriptModulePathClass {
			Name "world"
			Paths {
			 "scripts/4_World"
			 }
			EntryPoint ""
		}
		ScriptModulePathClass {
			Name "mission"
			Paths {
			 "scripts/5_Mission"
			 }
			EntryPoint "CreateMission"
		}
		ScriptModulePathClass {
			Name "workbench"
			Paths {
			 "scripts/editor/Workbench"
			 "scripts/editor/plugins"
			}
			EntryPoint ""
		} 
	 }