The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
<div class="nomobile" column-width: "60em2;> | |||
You have made a mesh for a human man, a circlet. We are going to add it to the game. | |||
You have made a mesh for a human man, a circlet. We are going to add it to the game. | |||
Remember to check your naming conventions for .lsf.lsx files so the multitool correctly converts them, and keep in mind that some lsx files should not be converted to lsf at all. | Remember to check your naming conventions for .lsf.lsx files so the multitool correctly converts them, and keep in mind that some lsx files should not be converted to lsf at all. | ||
This guide does not cover adding custom icons. | |||
==File Overview== | ==File Overview== | ||
Line 31: | Line 9: | ||
*MySweetMod | *MySweetMod | ||
**Generated | **Generated | ||
**Public | |||
****MySweetMod | ****MySweetMod | ||
*****Assets <- models and textures | *****Assets <- models and textures | ||
**Localization | **Localization | ||
***Language <- usually ''English'' | ***Language <- usually ''English'' | ||
****<code>MySweetMod.loca</code> <- text for items and spells | **** <code>MySweetMod.loca</code> <- text for items and spells | ||
**Mods | **Mods | ||
***MySweetMod | ***MySweetMod | ||
Line 48: | Line 26: | ||
******Assets | ******Assets | ||
*******Characters | *******Characters | ||
******** [PAK]_Armor <-- material and mesh LSX for custom outfits and weapons | ********[PAK]_Armor <-- material and mesh LSX for custom outfits and weapons | ||
****GUI | ****GUI | ||
*****RootTemplates <--- Your Roottemplate lsx goes here. MySweetMod.Lsx | *****RootTemplates <--- Your Roottemplate lsx goes here. MySweetMod.Lsx | ||
*****Stats | *****Stats | ||
*******Generated <--- TreasureTable.txt - This tells the game where the item will spawn. | *******Generated <--- TreasureTable.txt - This tells the game where the item will spawn. | ||
********Data <--- Armor.txt, Object.txt, Passive.txt, Weapon.txt and other TXT files. These contain stats. | ********Data <--- Armor.txt, Object.txt, Passive.txt, Weapon.txt and other TXT files. These contain stats. | ||
Line 61: | Line 39: | ||
We now create 2 lsf.lsx for our MySweetMod\Public\MySweetMod\Content\Assets\Characters\'''[PAK]_Armor'''. | We now create 2 lsf.lsx for our MySweetMod\Public\MySweetMod\Content\Assets\Characters\'''[PAK]_Armor'''. | ||
In these will be a visualbank (list of meshes),a materialbank (list of | In these will be a visualbank (list of meshes),a materialbank (list of material) and a texturebank (list of textures). You can split them into their own pages or combine them all, it doesn't matter. When the multitool converts them they will all get merged together anyway. This seperation is for viewer ease as they can become very long. For our needs we are putting them into 2 lsx, a meshes and a texture/material one. | ||
First, the meshes.lsx. | First, the meshes.lsx. | ||
Line 80: | Line 58: | ||
<attribute id="ID" type="FixedString" value="00000000000000000000000000001" /> '''(This UUID links up to the Roottemplate)''' | <attribute id="ID" type="FixedString" value="00000000000000000000000000001" /> '''(This UUID links up to the Roottemplate)''' | ||
<attribute id="MaterialType" type="uint8" value="0" /> | <attribute id="MaterialType" type="uint8" value="0" /> | ||
<attribute id="Name" type="LSString" value="HUM_M_CLT_MySweetCirclet" /> '''Referenced nowhere else but try to make it unique so you don't potentially | <attribute id="Name" type="LSString" value="HUM_M_CLT_MySweetCirclet" /> '''Referenced nowhere else but try to make it unique so you don't potentially ess up another item's toes.''' | ||
<attribute id="NeedsSkeletonRemap" type="bool" value="False" /> | <attribute id="NeedsSkeletonRemap" type="bool" value="False" /> | ||
<attribute id="RemapperSlotId" type="FixedString" value="" /> | <attribute id="RemapperSlotId" type="FixedString" value="" /> | ||
Line 107: | Line 85: | ||
<node id="Objects"> | <node id="Objects"> | ||
<attribute id="LOD" type="uint8" value="0" /> | <attribute id="LOD" type="uint8" value="0" /> | ||
<attribute id="MaterialID" type="FixedString" value="00000000000000000000004" /> '''What material it links up to | <attribute id="MaterialID" type="FixedString" value="00000000000000000000004" /> '''What material it links up to.''' | ||
<attribute id="ObjectID" type="FixedString" value="HUM_M_CLT_Headwear_Circlet_Silver_A.HUM_M_CLT_Headwear_Circlet_Silver_A_Mesh.0" /> | <attribute id="ObjectID" type="FixedString" value="HUM_M_CLT_Headwear_Circlet_Silver_A.HUM_M_CLT_Headwear_Circlet_Silver_A_Mesh.0" /> The .0 denotes mesh load order. | ||
</node> | </node> | ||
<node id="Objects"> '''Extra entry for a Level of Detail mesh, which will be seen from a certain distance from the camera. In this case the LOD1.''' | <node id="Objects"> '''Extra entry for a Level of Detail mesh, which will be seen from a certain distance from the camera. In this case the LOD1.''' | ||
<attribute id="LOD" type="uint8" value="1" /> ''' | <attribute id="LOD" type="uint8" value="1" /> '''What level of LOD it is''' | ||
<attribute id="MaterialID" type="FixedString" value="00000000000000000000004" /> | <attribute id="MaterialID" type="FixedString" value="00000000000000000000004" /> | ||
<attribute id="ObjectID" type="FixedString" value="HUM_M_CLT_Headwear_Circlet_Silver_A.HUM_M_CLT_Headwear_Circlet_Silver_A_Mesh_LOD1.1" /> | <attribute id="ObjectID" type="FixedString" value="HUM_M_CLT_Headwear_Circlet_Silver_A.HUM_M_CLT_Headwear_Circlet_Silver_A_Mesh_LOD1.1" /> '''The .1 denotes mesh load order.''' | ||
</node> | </node> | ||
Line 123: | Line 101: | ||
<attribute id="Object" type="FixedString" value="feet" /> | <attribute id="Object" type="FixedString" value="feet" /> | ||
</node> | </node> | ||
And this code would stop the body's feet from loading in and clipping, ideal for boot items. See [https://bg3.wiki/wiki/Modding:VertexColorMaskSlots here for a full list of Vertex Mask Slots for the body.] | |||
</children> | </children> | ||
</node> | </node> | ||
Line 147: | Line 125: | ||
'''(BEGINNING OF MATERIAL)''' | '''(BEGINNING OF MATERIAL)''' | ||
<node id="Resource"> | <node id="Resource"> | ||
<attribute id="DiffusionProfileUUID" type="FixedString" value="" /> | <attribute id="DiffusionProfileUUID" type="FixedString" value="" /> | ||
Line 154: | Line 133: | ||
<attribute id="SourceFile" type="LSString" value="Public/Shared/Assets/Materials/Characters/CHAR_BASE.lsf" /> | <attribute id="SourceFile" type="LSString" value="Public/Shared/Assets/Materials/Characters/CHAR_BASE.lsf" /> | ||
<children> | <children> | ||
<node id="ScalarParameters"> '''x7 | <node id="ScalarParameters"> '''x7 | ||
'''(Cut for length)''' | '''(Cut for length)''' | ||
There should be 4 Texture2DParameters in your material, for BM, NM, PM, and MSK. | There should be 4 Texture2DParameters in your material, for BM, NM, PM, and MSK. | ||
<node id="Texture2DParameters"> | <node id="Texture2DParameters"> NM cape | ||
<attribute id="Enabled" type="bool" value="True" /> | <attribute id="Enabled" type="bool" value="True" /> | ||
<attribute id="ExportAsPreset" type="bool" value="True" /> | <attribute id="ExportAsPreset" type="bool" value="True" /> | ||
Line 183: | Line 162: | ||
</node> | </node> | ||
'''(End of material)''' | '''(End of material)''' | ||
</children> | </children> | ||
</node> | </node> | ||
Line 189: | Line 167: | ||
'''(End of MaterialBank)''' | '''(End of MaterialBank)''' | ||
Now the material we have found, SourceFile "Public/Shared/Assets/Materials/Characters/CHAR_BASE.lsf" is a fairly standard shader without transparency or glowing. Materials that can be Transparent have 'Alpha' in the title. For example, "Public/Shared/Assets/Materials/Characters/CHAR_BASE_AlphaTest_2S.lsf" or "CHAR_BASE_AlphaTest_2S_Dither" will enable alpha and make the mesh visible from both sides (turns off backface culling). | Now the material we have found, SourceFile "Public/Shared/Assets/Materials/Characters/CHAR_BASE.lsf" is a fairly standard shader without transparency or glowing. Materials that can be Transparent have 'Alpha' in the title. For example, "Public/Shared/Assets/Materials/Characters/CHAR_BASE_AlphaTest_2S.lsf" or "CHAR_BASE_AlphaTest_2S_Dither" will enable alpha and make the mesh visible from both sides (turns off backface culling). | ||
Materials with _VT at the end are useless to us, as they only work with virtual texture. A virtualtexture is essentially a box for textures that makes it load faster. We don't have any way of packing virtualtextures ourselves, so do not attempt to use those materials. | |||
In order to make, say, pants disappear when boots are put on, you may need to use a _Vertcut Material, such as 'Public/Shared/Assets/Materials/Characters/CHAR_BASE_VertCut.lsf', and ensure VertexMask is set to True in the mesh lsx. (As well as vertex painting the item itself the desired colour) | In order to make, say, pants disappear when boots are put on, you may need to use a _Vertcut Material, such as 'Public/Shared/Assets/Materials/Characters/CHAR_BASE_VertCut.lsf', and ensure VertexMask is set to True in the mesh lsx. (As well as vertex painting the item itself the desired colour) | ||
We now add a texturebank to the same lsx. | We now add a texturebank to the same lsx. | ||
Line 211: | Line 189: | ||
<attribute id="Depth" type="int32" value="1" /> | <attribute id="Depth" type="int32" value="1" /> | ||
<attribute id="Localized" type="bool" value="False" /> | <attribute id="Localized" type="bool" value="False" /> | ||
<attribute id="SRGB" type="bool" value="False" /> | <attribute id="SRGB" type="bool" value="False" /> This does things. I am not sure what. | ||
<attribute id="Streaming" type="bool" value="True" /> | <attribute id="Streaming" type="bool" value="True" /> | ||
<attribute id="Template" type="FixedString" value="" /> | <attribute id="Template" type="FixedString" value="" /> | ||
Line 217: | Line 195: | ||
</node> | </node> | ||
'''(texture ends here)''' | '''(texture ends here)''' | ||
</children> | </children> | ||
</node> | </node> | ||
Line 223: | Line 200: | ||
</save> | </save> | ||
If there is anything wrong with the material, your item may simply refuse to show up, so it is worth double | If there is anything wrong with the material, your item may simply refuse to show up, so it is worth double checking everything here. | ||
==RootTemplate == | ==RootTemplate== | ||
Now for the game | Now for the game recognise the circlet as an item, we add it to the root template lsx: | ||
MySweetMod\Public\MySweetMod\RootTemplates\MySweetMod.lsf.lsx | MySweetMod\Public\MySweetMod\RootTemplates\MySweetMod.lsf.lsx | ||
Line 246: | Line 223: | ||
<attribute id="MapKey" type="FixedString" value="0000000000000000000000000002" /> '''This links up to the armor.txt to form the armor.''' | <attribute id="MapKey" type="FixedString" value="0000000000000000000000000002" /> '''This links up to the armor.txt to form the armor.''' | ||
<attribute id="Name" type="LSString" value="MY_COOL_NEW_CIRCLET" /> '''This links up to the armor.txt to form the armor.''' | <attribute id="Name" type="LSString" value="MY_COOL_NEW_CIRCLET" /> '''This links up to the armor.txt to form the armor.''' | ||
<attribute id="ParentTemplateId" type="FixedString" value="4d2e0931-3a01-4759-834b-8ae36749daab" /> '''This tells the game roughly what kind of item it is, such as in this case a helm. You should use the right kind for your item to avoid inherited problems. For example a shield will not know it is a shield without this ParentTemplate | <attribute id="ParentTemplateId" type="FixedString" value="4d2e0931-3a01-4759-834b-8ae36749daab" /> '''This tells the game roughly what kind of item it is, such as in this case a helm. You should use the right kind for your item to avoid inherited problems. For example a shield will not know it is a shield without this ParentTemplate.''' | ||
<attribute id="PhysicsTemplate" type="FixedString" value="327039da-0827-811f-24e8-fc57e86c7ba2" /> '''I believe similar to the above, this needs to be roughly the same type as the armour you are adding.''' | <attribute id="PhysicsTemplate" type="FixedString" value="327039da-0827-811f-24e8-fc57e86c7ba2" /> '''I believe similar to the above, this needs to be roughly the same type as the armour you are adding.''' | ||
<attribute id="Type" type="FixedString" value="item" /> | <attribute id="Type" type="FixedString" value="item" /> | ||
Line 253: | Line 230: | ||
<attribute id="_OriginalFileVersion_" type="int64" value="144115207403209032" /> | <attribute id="_OriginalFileVersion_" type="int64" value="144115207403209032" /> | ||
<children> | <children> | ||
<node id="Equipment"> | <node id="Equipment"> | ||
<children> | <children> | ||
Line 294: | Line 239: | ||
<node id="DreadShortHair" /> | <node id="DreadShortHair" /> | ||
<node id="LongHair" /> | <node id="LongHair" /> | ||
<node id="ParentRace"> | |||
''' | '''The parentrace nodes set the item to use race-specific meshes for githyanki, Dragonborn and Tiefling. Unless this line is added and specified, they will use Human Body or Strong Human Body. (Which may be fine for some races such as Tieflings.)''' | ||
<children> | <children> | ||
<node id="Object"> | <node id="Object"> | ||
<attribute id="MapKey" type="guid" value="6503c830-9200-409a-bd26-895738587a4a" /> Tiefling Male | <attribute id="MapKey" type="guid" value="6503c830-9200-409a-bd26-895738587a4a" /> Tiefling Male | ||
<attribute id="MapValue" type="guid" value="00000000-0000-0000-0000-000000000000" /> | <attribute id="MapValue" type="guid" value="00000000-0000-0000-0000-000000000000" /> | ||
</node> | </node> | ||
Line 369: | Line 312: | ||
</region> | </region> | ||
</save> | </save> | ||
Line 378: | Line 322: | ||
Meanwhile in your '''Armor.txt''', they link up like this: | Meanwhile in your '''Armor.txt''', they link up like this: | ||
You can look at the | You can look at the games own armor.txt for ideas of what to put here. You can delete what you don't wish to add, all you really need is the entry, the type, what slot it uses and the RootTemplate. | ||
Armor.txt | Armor.txt | ||
new entry "MY_COOL_NEW_CIRCLET" | new entry "MY_COOL_NEW_CIRCLET" | ||
type "Armor" | type "Armor" | ||
data "ValueOverride" "4000" '''(It's a very cool circlet and we want it to cost a lot!)''' | data "ValueOverride" "4000" '''(It's a very cool circlet and we want it to cost a lot!)''' | ||
data "Weight" "0.01" | data "Weight" "0.01" | ||
using "_Head_Magic_Circlet" '''(This tells it what slot to equip in. Ideally this should match up with the ParentTemplate you set up.)''' | using "_Head_Magic_Circlet" '''(This tells it what slot to equip in. Ideally this should match up with the ParentTemplate you set up.)''' | ||
data "RootTemplate" "0000000000000000000000000002" '''Matches up to the rootemplate Mapkey.''' | data "RootTemplate" "0000000000000000000000000002" '''Matches up to the rootemplate Mapkey.''' | ||
data "Rarity" "Rare" '''This effects what colour it is in your inventory, rarer things get a different colour outline.''' | data "Rarity" "Rare" '''This effects what colour it is in your inventory, rarer things get a different colour outline. Note that if you set things as common they may spawn in generic containers, which is not optimal for clean uninstalling.''' | ||
data "Boosts" "UnlockSpell(Target_MAG_HealingWord);UnlockSpell(Shout_MAG_HealingWord_Mass)" '''This forces it to give us these spells. Note that the character needs spell slots in able to use them! If you want it for everyone you may be better off setting it up as a custom passive'''. | data "Boosts" "UnlockSpell(Target_MAG_HealingWord);UnlockSpell(Shout_MAG_HealingWord_Mass)" '''This forces it to give us these spells. Note that the character needs spell slots in able to use them! If you want it for everyone you may be better off setting it up as a custom passive'''. | ||
data "PassivesOnEquip" "MAG_Radiant_Radiating_Helmet_Passive;CUSTOMPASSIVEIMADE" '''(The ; seperates passives.)''' | data "PassivesOnEquip" "MAG_Radiant_Radiating_Helmet_Passive;CUSTOMPASSIVEIMADE" '''(The ; seperates passives.)''' | ||
Line 393: | Line 337: | ||
data "MinAmount" "1" | data "MinAmount" "1" | ||
data "MaxAmount" "1" | data "MaxAmount" "1" | ||
If adding a custom passive, your '''Passive.txt''' will look like this. You don't need a passive.txt at all | If adding a custom passive, your '''Passive.txt''' will look like this. You don't need a passive.txt at all, this is just for the ambitious. | ||
The example passive code is borrowed from Isobel's armor. | The example passive code is borrowed from Isobel's armor. | ||
Line 433: | Line 376: | ||
CanMerge 1 | CanMerge 1 | ||
new subtable "1,1" | new subtable "1,1" | ||
object category "I_MY_COOL_NEW_CIRCLET",1,0,0,0,0,0,0,0 | object category "I_MY_COOL_NEW_CIRCLET",1,0,0,0,0,0,0,0 '''(Do not forget the ''I_'' prefix!)''' | ||
This will make it spawn in the tutorial chest. | |||
If | If something goes wrong, it is recommended to overwrite a custom mesh from someone else's mod, or add it to the back of an existing mod. When you know the fault is not with your mesh, you check your materials, and so you can fix things one step at a time. | ||
{| class="nomobile" style="text-align:center; margin: auto; border:1px solid #785000; font-size:83%; background-color:#1B1B1B; width: 60;" ; | |||
[[Category:Modding guides]] | |- style="font-weight:bold; background-color:#281C14; color:#c27736; border:0px none;" | ||
[[ | | colspan="2" | | ||
[[File:bgwiii.png|30px|link=Template:NavWiki]] [[BG3Wiki:Community|Community]] • [[Guide:Guides|Guides]] • [[Modding: Modding resources|Modding]] | |||
|- | |||
| style="background-color:#28201B; color:#c27736; width: 15%;" |[[:Category:Modding|Modding guides]] | |||
| style="text-align:left; padding:0 4px;" |<div class="navcat" ;> | |||
<categorytree hideprefix="1" hideroot="1" mode="pages">Modding guides</categorytree> | |||
</div> | |||
|- | |||
| style="background-color:#28201B; color:#c27736; width: 15%;" |[[Modding:Modding resources|Modding resources]] | |||
| style="text-align:left; padding:0 4px;" |<div class="navcat" ;> | |||
<categorytree hideprefix="1" hideroot="1" mode="pages">Modding resources</categorytree> | |||
</div> | |||
|}</div><div class="noexcerpt navigation-not-searchable" style="text-align:center"><span class="nodesktop"> [[Modding:Index|Modding index]] </span></div> |