Jump to content

* * * * *
The Leadwerks Workshop on Steam is a system that allows distribution of game-ready content and easy collaboration.  You can subscribe to items in the Workshop to use them in your games.  You can also publish your own items for others to use.  Leadwerks Workshop is a great way to find 3D models and other items to populate your games with.


To use the Leadwerks Workshop, you must have Leadwerks on Steam, and SteamCloud must be enabled for your account.  To enable SteamCloud, select the View > Settings menu in the Steam interface and enable it under the Cloud settings:

Attached Image: Image1.png

Installing Items

To install an item from the Workshop, first you need to open the Workshop browser.  Find and click on the item you want to install:

Attached Image: ws1.jpg

Press the Install button to subscribe install the selected item in your current project.  The selected item will be downloaded and added to your project.  The asset browser tab will be shown, and Leadwerks will automatically navigate to the folder the new files are downloaded to, for quick access to your new items.

Attached Image: ws2.jpg

The Subscribed list shows a list of all subscribed items.  You can install items from here.  DLC packs will also show up in this list.

Attached Image: Image3.jpg

Publishing Items

You can publish your own items to the Workshop.  Select the Workshop > Publish File menu item to open the Publish File dialog:

Attached Image: Image9.jpg

The following fields must be filled in before you can publish your item:
  • Title: This is the title that will be shown in the Workshop.  It's best to keep this simple and avoid too much extra information.
  • Preview: This is a small preview image to show in the Workshop.  Square images around 200x200 pixels work best.
  • File: This is the zip archive containing your files to include in the package.  Your zip file will be extracted into the user's project folder, with whatever directory structure you create.  Note that only Leadwerks asset file formats can be included in your zip file.
  • Visibility: You can choose to make your item publish, private, or share it with just your friends on Steam.
  • Description: A brief description of your item and what it is for.

Once these are filled in, press the Publish button and wait a few moments for your package to update.  When complete, the Steam interface will be opened and your item will be displayed in the Workshop.  Your item will automatically show up in the Workshop browser in a few minutes, and will be available to everyone else on Steam (if the visibility mode is set to public).

Updating Items

One of the great things about the Workshop is ease of updating.  You can update any of your items at any time, and your changes will be pushed out to everyone subscribed to your item.  To update an existing item, select the Update tab in the Publish File dialog.  Add a comment describing your changes and then choose a new preview image, a folder containing your new files, or both.  Press Publish to update your item, and your changes will go out to everyone subscribed to that item the next time they start Leadwerks.

If you want to change the item name or add more screenshots and videos to your item's page, you can do this within the Steam interface.

Be thoughtful of your subscribers when updating items.  It's generally a bad idea to remove files or change file names within the package.  If you want to make drastic changes to your item, it might be a better idea to publish a new item and name it "Version 2" rather than disrupting your subscribers' work.

Selling Items

You can sell your content on Steam with Leadwerks Workshop and earn money.  To submit a paid item, set the "Price" field to "Paid" in the file publish dialog.  Do not set the visibility to private, as your item will not be downloadable anyways.

After publishing your paid item you must complete your payment info in Steam.  This will include your contact, bank, and tax information, for receiving payments and regulatory compliance, so that you can receive payments directly from Valve Software.  Leadwerks Software does not have access to this information.

You can also set a revenue split to share payments with another Steam user who has contributed to your item, if you wish to do so.  If you are not splitting the revenue, your share should be set at 100%.

Attached Image: getting paid on steam.jpg

Leadwerks Software will review and may make your item available for purchase.  You will receive 50% of sales of your item directly from Valve each month via wire transfer.  Valve will keep 30% of each sale, and 20% will go to Leadwerks Software.  A $100 minimum balance is required to initiate a payment.  If this amount if not met in a month, it will carry over until it is reached.

You can view your sales in real-time by clicking the "View Your Revenue" link on the main Workshop page.

Content Guidelines

These guidelines will help you prepare your content so that users will gain the maximum utility from your work.


The import pipeline in Leadwerks is for the most part automated. The following tutorials will help you get started:


All models (other than animated characters) should have a collision shape included. See this tutorial for information on generating collision shapes for your model.

Collapsing Models

For optimal performance, models should have the fewest number of limbs possible. Static models can have their limb hierarchy collapsed down to a single object by opening them in the model editor, then selecting the Tools > Collapse menu item. Select the File > Save menu item to save your changes.


Leadwerks Game Engine uses a scale of one unit space = one meter. Therefore, a centimeter is 0.01 units, a millimeter is 0.001 units, and so forth. If you are coming from the Unity game engine you will need to scale your models down to 1% their original size. Fortunately, this can be easily done in the Model Editor. Double-click on your model in the Asset Browser, then select the Tools > Resize menu item to open the resize dialog and scale your model. If your model isn't animated you should then select the Tools > Collapse menu item to reset your object's 4x4 matrix. Select the File > Save menu item to save your changes.


The placement of an object's pivot affects how easily it is placed in the editor. Placing an object's pivot in an unexpected location will result in extra steps creating and positioning objects, and will make your items less useful. For objects like the barrel below, it makes sense to place the pivot in the center of the object, at the very bottom. When the user drags the object into the scene and creates it, the barrel will appear as they expect.

Attached Image: pivot1.jpg

If the pivot is placed in the middle of the object's height, then it will be created with half the model stuck in the ground. This results in an extra step to reposition the object and makes the map creation process less fun. Don't make the user work harder than they have to. A few minutes of your time to make things right can save hundreds of hours collectively for your users.

Attached Image: pivot2.jpg


By default Leadwerks Editor displays major grid lines every 8 units. This is because textures are power-of-two dimensions like 256, 512, 1024, etc. and it makes it easy to line up CSG geometry with details on textures, like door and window frames. It is important that any modular objects be sized to make lining up on the grid easy. For example, the fence below was constructed from subobjects that are design to line up precisely on the grid. This makes map design easy and fun, instead of being a chore to precisely line up poorly designed props. If you design your models to work easily, the user won't even have to think about how they align because they will just work. Notice that we can increase the grid size three times, and the fence pieces will still snap to the correct place on the grid.

Attached Image: fence.jpg

You should generally size objects to the nearest grid unit, in centimeters. This can be power-of-two numbers like 64, 256, 32, etc., or combinations of multiple powers-of-two, like 48, 192, etc. Models that are sized this way will be much easier to line up and stack, without any effort at all. If you need a guide to size objects, you can always create a brush outlines in Leadwerks Editor, then select the File > Export menu item to save the map brushes as an OBJ file, to be imported into your modeling application.

Take care to ensure that adjacent objects that are meant to be used in a modular fashion do not have gaps or overlaps between them. It's much easier to create things the correct dimensions from the start, instead of going back and trying to clean up vertex positions.


Textures that allow map geometry to be lined up precisely will be very useful to users and are in high demand. This can be achieved by lining up texture details in the same way we size models. These templates can be used as a guide to designing new textures. When textures are designed in this manner, they are a lot of fun to work with. You can see in the image below how the interaction of level geometry and texture details creates a highly structured design that is very appealing and easy to use.

Attached Image: texture_template.jpg


Animation names are important because scripts will use specific names to find an animation to play. The following names should be used for common sequences:
  • idle
  • walk
  • walkback
  • walkleft
  • walkright
  • run
  • runback
  • runleft
  • runright
  • walkcrouch
  • walkcrouchback
  • walkcrouchleft
  • walkcrouchright
  • jump
  • attack1 (melee attack)
  • attack2 (melee attack variation)
  • fire (shoot weapon)
  • hit
  • death

Folder Structure

Materials should be placed in a subfolder of the "Models" folder in the uploaded zip file, e.g. "Materials/My Material Pack/(All Files Here)".

Models should be placed in a subfolder of the "Models" folder in the uploaded zip file, e.g. "Models/My Model Pack/(All Files Here)". Model textures, materials, and prefabs should be in the same folder as the model file.


If you received a Steam key for Leadwerks and are setting it up on a new company account, you will not be able to publish to the Workshop until you purchase something on Steam.  The program log will show an error code '24".  I think this is a kind of spam prevention measure.
If an upload fails, the program log in the bottom of the main window will display an error code, usually.  This is what the error codes mean:
// General result codes
enum EResult
	k_EResultOK	= 1,							// success
	k_EResultFail = 2,							// generic failure 
	k_EResultNoConnection = 3,					// no/failed network connection
//	k_EResultNoConnectionRetry = 4,				// OBSOLETE - removed
	k_EResultInvalidPassword = 5,				// password/ticket is invalid
	k_EResultLoggedInElsewhere = 6,				// same user logged in elsewhere
	k_EResultInvalidProtocolVer = 7,			// protocol version is incorrect
	k_EResultInvalidParam = 8,					// a parameter is incorrect
	k_EResultFileNotFound = 9,					// file was not found
	k_EResultBusy = 10,							// called method busy - action not taken
	k_EResultInvalidState = 11,					// called object was in an invalid state
	k_EResultInvalidName = 12,					// name is invalid
	k_EResultInvalidEmail = 13,					// email is invalid
	k_EResultDuplicateName = 14,				// name is not unique
	k_EResultAccessDenied = 15,					// access is denied
	k_EResultTimeout = 16,						// operation timed out
	k_EResultBanned = 17,						// VAC2 banned
	k_EResultAccountNotFound = 18,				// account not found
	k_EResultInvalidSteamID = 19,				// steamID is invalid
	k_EResultServiceUnavailable = 20,			// The requested service is currently unavailable
	k_EResultNotLoggedOn = 21,					// The user is not logged on
	k_EResultPending = 22,						// Request is pending (may be in process, or waiting on third party)
	k_EResultEncryptionFailure = 23,			// Encryption or Decryption failed
	k_EResultInsufficientPrivilege = 24,		// Insufficient privilege
	k_EResultLimitExceeded = 25,				// Too much of a good thing
	k_EResultRevoked = 26,						// Access has been revoked (used for revoked guest passes)
	k_EResultExpired = 27,						// License/Guest pass the user is trying to access is expired
	k_EResultAlreadyRedeemed = 28,				// Guest pass has already been redeemed by account, cannot be acked again
	k_EResultDuplicateRequest = 29,				// The request is a duplicate and the action has already occurred in the past, ignored this time
	k_EResultAlreadyOwned = 30,					// All the games in this guest pass redemption request are already owned by the user
	k_EResultIPNotFound = 31,					// IP address not found
	k_EResultPersistFailed = 32,				// failed to write change to the data store
	k_EResultLockingFailed = 33,				// failed to acquire access lock for this operation
	k_EResultLogonSessionReplaced = 34,
	k_EResultConnectFailed = 35,
	k_EResultHandshakeFailed = 36,
	k_EResultIOFailure = 37,
	k_EResultRemoteDisconnect = 38,
	k_EResultShoppingCartNotFound = 39,			// failed to find the shopping cart requested
	k_EResultBlocked = 40,						// a user didn't allow it
	k_EResultIgnored = 41,						// target is ignoring sender
	k_EResultNoMatch = 42,						// nothing matching the request found
	k_EResultAccountDisabled = 43,
	k_EResultServiceReadOnly = 44,				// this service is not accepting content changes right now
	k_EResultAccountNotFeatured = 45,			// account doesn't have value, so this feature isn't available
	k_EResultAdministratorOK = 46,				// allowed to take this action, but only because requester is admin
	k_EResultContentVersion = 47,				// A Version mismatch in content transmitted within the Steam protocol.
	k_EResultTryAnotherCM = 48,					// The current CM can't service the user making a request, user should try another.
	k_EResultPasswordRequiredToKickSession = 49,// You are already logged in elsewhere, this cached credential login has failed.
	k_EResultAlreadyLoggedInElsewhere = 50,		// You are already logged in elsewhere, you must wait
	k_EResultSuspended = 51,					// Long running operation (content download) suspended/paused
	k_EResultCancelled = 52,					// Operation canceled (typically by user: content download)
	k_EResultDataCorruption = 53,				// Operation canceled because data is ill formed or unrecoverable
	k_EResultDiskFull = 54,						// Operation canceled - not enough disk space.
	k_EResultRemoteCallFailed = 55,				// an remote call or IPC call failed
	k_EResultPasswordUnset = 56,				// Password could not be verified as it's unset server side
	k_EResultExternalAccountUnlinked = 57,		// External account (PSN, Facebook...) is not linked to a Steam account
	k_EResultPSNTicketInvalid = 58,				// PSN ticket was invalid
	k_EResultExternalAccountAlreadyLinked = 59,	// External account (PSN, Facebook...) is already linked to some other account, must explicitly request to replace/delete the link first
	k_EResultRemoteFileConflict = 60,			// The sync cannot resume due to a conflict between the local and remote files
	k_EResultIllegalPassword = 61,				// The requested new password is not legal
	k_EResultSameAsPreviousValue = 62,			// new value is the same as the old one ( secret question and answer )
	k_EResultAccountLogonDenied = 63,			// account login denied due to 2nd factor authentication failure
	k_EResultCannotUseOldPassword = 64,			// The requested new password is not legal
	k_EResultInvalidLoginAuthCode = 65,			// account login denied due to auth code invalid
	k_EResultAccountLogonDeniedNoMail = 66,		// account login denied due to 2nd factor auth failure - and no mail has been sent
	k_EResultHardwareNotCapableOfIPT = 67,		// 
	k_EResultIPTInitError = 68,					// 
	k_EResultParentalControlRestricted = 69,	// operation failed due to parental control restrictions for current user
	k_EResultFacebookQueryError = 70,			// Facebook query returned an error
	k_EResultExpiredLoginAuthCode = 71,			// account login denied due to auth code expired
	k_EResultIPLoginRestrictionFailed = 72,
	k_EResultAccountLockedDown = 73,
	k_EResultAccountLogonDeniedVerifiedEmailRequired = 74,
	k_EResultNoMatchingURL = 75,
	k_EResultBadResponse = 76,					// parse failure, missing field, etc.
	k_EResultRequirePasswordReEntry = 77,		// The user cannot complete the action until they re-enter their password
	k_EResultValueOutOfRange = 78,				// the value entered is outside the acceptable range
	k_EResultUnexpectedError = 79,				// something happened that we didn't expect to ever happen
	k_EResultDisabled = 80,						// The requested service has been configured to be unavailable
	k_EResultInvalidCEGSubmission = 81,			// The set of files submitted to the CEG server are not valid !
	k_EResultRestrictedDevice = 82,				// The device being used is not allowed to perform this action
	k_EResultRegionLocked = 83,					// The action could not be complete because it is region restricted
	k_EResultRateLimitExceeded = 84,			// Temporary rate limit exceeded, try again later, different from k_EResultLimitExceeded which may be permanent
	k_EResultAccountLoginDeniedNeedTwoFactor = 85,	// Need two-factor code to login
	k_EResultItemDeleted = 86,					// The thing we're trying to access has been deleted
	k_EResultAccountLoginDeniedThrottle = 87,	// login attempt failed, try to throttle response to possible attacker
	k_EResultTwoFactorCodeMismatch = 88,		// two factor code mismatch
	k_EResultTwoFactorActivationCodeMismatch = 89,	// activation code for two-factor didn't match
	k_EResultAccountAssociatedToMultiplePartners = 90,	// account has been associated with multiple partners
	k_EResultNotModified = 91,					// data not modified
	k_EResultNoMobileDevice = 92,				// the account does not have a mobile device associated with it
	k_EResultTimeNotSynced = 93,				// the time presented is out of range or tolerance
	k_EResultSmsCodeFailed = 94,				// SMS code failure (no match, none pending, etc.)
	k_EResultAccountLimitExceeded = 95,			// Too many accounts access this resource
	k_EResultAccountActivityLimitExceeded = 96,	// Too many changes to this account
	k_EResultPhoneActivityLimitExceeded = 97,	// Too many changes to this phone
	k_EResultRefundToWallet = 98,				// Cannot refund to payment method, must use wallet
	k_EResultEmailSendFailure = 99,				// Cannot send an email
	k_EResultNotSettled = 100,					// Can't perform operation till payment has settled
	k_EResultNeedCaptcha = 101,					// Needs to provide a valid captcha
I am having trouble downloading from the workshop. Every download I attempt is met with an error message.
so from what all this says
you have to be a company?

MadCat, on 30 January 2016 - 10:09 AM, said:

so from what all this says
you have to be a company?