-
Notifications
You must be signed in to change notification settings - Fork 0
4.1. Root Templates
Root Templates, while similar to MultiEffectInfos in many ways, they are also quite different. While an MEI exclusively handles visual effects, a RootTemplate
handles visual effects, sounds, and a variety of other things. You can find RootTemplates
as Items, SpellAnimations
, Trajectories
and more. In this particular section we will be covering Trajectories
.
This part is fairly simple, as it shares a lot of similarities as our MEI File Set Up, with only a few differences.
To begin, the top of our RootTemplate single file or merged, will look like this:
<?xml version="1.0" encoding="utf-8"?>
<save>
<version major="4" minor="0" revision="9" build="0" lslib_meta="v1,bswap_guids" />
<region id="Templates">
<node id="Templates">
<children>
<node id="GameObjects">
The only real key differences here are taht the region id
and the master node id
are "Templates"
instead of "MultiEffectInfos"
, and that our node id
for the RootTemplate Effect is referred to as a "GameObjects"
rather than "EffectInfo"
. As always, make sure your tags are closed properly.
First things first, does your spell have this data: data "Trajectories" "UUIDHere"
? If not, then this information won't really help you here. You can find trajectories in spell types such as data "SpellType" "Projectile"
or data "SpellType" "Throw"
. It should look a little something like this:
For this guide, we will be covering data "SpellType" "Projectile"
and data "SpellProperties" "CreateExplosion()"
.
This type of trajectory is slightly different from the previously discussed one. For this, we will use the effect Projectile_Shadowblend_Effect
. Instead of the trajectory data directly applied to the spell, the trajectory is hidden in an effect, which is applied via CreateExplosion()
like such.
And Index Searching the Effect will lead you here:
and Index Searching again, will take us to it's RootTemplate, here:
<node id="GameObjects">
<attribute id="Acceleration" type="float" value="40" />
<attribute id="CameraOffset" type="fvec3" value="0 0 0" />
<attribute id="DestroyTrailFXOnImpact" type="bool" value="True" />
<attribute id="Flag" type="int32" value="0" />
<attribute id="GroupID" type="uint32" value="0" />
<attribute id="HasGameplayValue" type="bool" value="False" />
<attribute id="IgnoreRoof" type="bool" value="True" />
<attribute id="ImpactFX" type="FixedString" value="VFX_Projectile_Shadowblend_Start_01" />
<attribute id="InitialSpeed" type="float" value="20" />
<attribute id="LevelName" type="FixedString" value="" />
<attribute id="MapKey" type="FixedString" value="78c0719c-7b8b-4eaa-941b-e5e6b25e6616" />
<attribute id="Name" type="LSString" value="VFX_Projectile_Shadowblend_01" />
<attribute id="NeedsImpactSFX" type="bool" value="False" />
<attribute id="OffsetMin_Bezier3" type="fvec2" value="0 1" />
<attribute id="ParentTemplateId" type="FixedString" value="" />
<attribute id="PhysicsOpenTemplate" type="FixedString" value="" />
<attribute id="PhysicsTemplate" type="FixedString" value="" />
<attribute id="PreviewPathImpactFX" type="FixedString" value="VFX_UI_DestinationBeam_Projectile_01" />
<attribute id="PreviewPathMaterial" type="FixedString" value="312a1494-a0e2-c215-cf51-bda58a6b2341" />
<attribute id="RotateImpact" type="bool" value="False" />
<attribute id="ShiftBMax_Bezier4" type="float" value="0.25" />
<attribute id="ShiftBMin_Bezier4" type="float" value="0.25" />
<attribute id="Type" type="FixedString" value="projectile" />
<attribute id="VelocityMode" type="uint8" value="1" />
<attribute id="VisualTemplate" type="FixedString" value="" />
<attribute id="_OriginalFileVersion_" type="int64" value="144115205255725658" />
<children>
<node id="Bounds" />
</children>
</node>
As you can see, this particular RootTemplate is quite a bit smaller than our last one. As for this particular type of effect, the only attribute ids
you need to worry about are it's ImpactFX, MapKey and Name. Make sure to follow the previous guides from the last page, as they should be the same. If you did everything right, you should have spells that look like this, only with your own effects:
For projectiles, we can find trajectories in Missile type spells such as Eldritch Blast (shown above), or even Jump Type Spells, such as:
Now, you'll notice that this particular type of spell has more than one Trajectories
UUID. However, for now, we only need to worry about the first UUID entry. However, before we get into that, we'll use Eldritch Blast as our template for now.
Alright, so the first thing we need to do is establish the spell, as discussed in Effects. Then, just like earlier, we will be Index Searching the trajectory UUID. That will lead us to it's RootTemplate.
and it will pull up something like this.
<node id="GameObjects">
<attribute id="BeamFX" type="FixedString" value="VFX_Spells_Cast_Warlock_ProjectileBeam_EldritchBlast_Beam_01" />
<attribute id="CameraOffset" type="fvec3" value="0 0 0" />
<attribute id="CastBone" type="FixedString" value="Dummy_CastFX" />
<attribute id="CastShadow" type="bool" value="False" />
<attribute id="DetachBeam" type="bool" value="True" />
<attribute id="Flag" type="int32" value="0" />
<attribute id="GroundImpactFX" type="LSString" value="VFX_Spells_Cast_Warlock_ProjectileBeam_EldritchBlast_Impact_Ground_01" />
<attribute id="GroupID" type="uint32" value="0" />
<attribute id="HasGameplayValue" type="bool" value="False" />
<attribute id="ImpactFX" type="FixedString" value="VFX_Spells_Cast_Warlock_ProjectileBeam_EldritchBlast_Impact_01" />
<attribute id="InitialSpeed" type="float" value="180" />
<attribute id="LevelName" type="FixedString" value="" />
<attribute id="LifeTime" type="float" value="20" />
<attribute id="MapKey" type="FixedString" value="3eaf2c46-46a9-4b52-8e05-fae7dc4e548b" />
<attribute id="Name" type="LSString" value="VFX_Projectile_Spell_EldritchBlast_01" />
<attribute id="ParentTemplateId" type="FixedString" value="" />
<attribute id="PhysicsOpenTemplate" type="FixedString" value="" />
<attribute id="PhysicsTemplate" type="FixedString" value="" />
<attribute id="PreviewPathImpactFX" type="FixedString" value="VFX_UI_DestinationBeam_Projectile_01" />
<attribute id="PreviewPathMaterial" type="FixedString" value="312a1494-a0e2-c215-cf51-bda58a6b2341" />
<attribute id="Speed" type="float" value="180" />
<attribute id="TrajectoryType" type="uint8" value="0" />
<attribute id="Type" type="FixedString" value="projectile" />
<attribute id="VelocityMode" type="uint8" value="0" />
<attribute id="VisualTemplate" type="FixedString" value="" />
<attribute id="_OriginalFileVersion_" type="int64" value="144115200960758167" />
<children>
<node id="Bounds">
<children>
<node id="Bound">
<attribute id="Height" type="float" value="0" />
<attribute id="IsIgnoringScale" type="bool" value="False" />
<attribute id="Max" type="fvec3" value="0 0 0" />
<attribute id="Min" type="fvec3" value="0 0 0" />
<attribute id="Radius" type="float" value="0" />
<attribute id="Shape" type="uint8" value="0" />
<attribute id="Type" type="uint8" value="1" />
</node>
<node id="Bound">
<attribute id="Height" type="float" value="0" />
<attribute id="IsIgnoringScale" type="bool" value="False" />
<attribute id="Max" type="fvec3" value="0 0 0" />
<attribute id="Min" type="fvec3" value="0 0 0" />
<attribute id="Radius" type="float" value="0" />
<attribute id="Shape" type="uint8" value="0" />
<attribute id="Type" type="uint8" value="2" />
</node>
<node id="Bound">
<attribute id="Height" type="float" value="0" />
<attribute id="IsIgnoringScale" type="bool" value="False" />
<attribute id="Max" type="fvec3" value="0 0 0" />
<attribute id="Min" type="fvec3" value="0 0 0" />
<attribute id="Radius" type="float" value="0" />
<attribute id="Shape" type="uint8" value="0" />
<attribute id="Type" type="uint8" value="0" />
</node>
</children>
</node>
<node id="GameMaster" />
</children>
</node>
Now, of course, we are right back to another potential problem:
Luckily, we don't need to worry about most of the information in the RootTemplate GameObject
. One thing that does need to be mentioned, however, is that *RootTemplates can come in two forms. One, where it's a singular GameObject
node meant to focus exclusively that particular RootTemplate, or a large collection in a Merged File. Most RootTemplate are now usually found in Merged File, due to changes Larian Studios made in Patch 4, where they organized and restructured a lot of files and folders, to get rid of excess data. So, because of that, that is the file type we will be discussing. However, this will be different from the LSFX Merged Files we will be discussing later.
In the case of RootTemplates, at least for Visual Effects editing, you won't actually need to worry about the majority of the attribute ids. The only ones you really need to focus on are:
- MapKey
- Name
- TrailFX
- BeamFX
- ImpactFX
- GroundImpactFX
- CastBone
- InitialSpeed
- Speed
- LifeTime
- DetachBeam
- CastShadow
Continued on 4.2. RootTemplates Attribute ID Definitions
- Overview
- Sample Projects
- Action Resources
- Spells
- Passives
- Statuses
- Items
- Races
- Classes
- Scripts
- Visual Resources
Setting up a Development Environment (BEING REWRITTEN)
- A Modder's Guide to Git
- Recommended/Required Tools
- Creating Your Folder Structure
- Working with the Repo
- How to Use the Multitool
- Class Descriptions
- Ability Distribution Presets
- Progressions
- Localization
- Abilities, Passives, and Spells
- Passive and Spell Lists
- Custom Equipment
- Class Icons
- Skill Icons (TODO)
- Handling Subclasses (TODO)
- Race Entry
- Root Templates
- Character Visuals
- Character Creation
- Localization
- Racial Feats
- Racial Progressions
- Tags
- Custom Icons