Skip to content

4.1. Root Templates

ImmortalRDI edited this page Nov 25, 2023 · 10 revisions
Index

RootTemplate Index

Root Templates Defined

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.


RootTemplate Setup

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.


Trajectories

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:

Trajectories1

For this guide, we will be covering data "SpellType" "Projectile" and data "SpellProperties" "CreateExplosion()".


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.

CreateExplosion

And Index Searching the Effect will lead you here:

CreateExplosionTrajectory

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:

SpellStealth


Projectile Spells

For projectiles, we can find trajectories in Missile type spells such as Eldritch Blast (shown above), or even Jump Type Spells, such as:

Trajectories2

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.

EldritchBlastSearch

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:

TooManyWords

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.


Attribute IDs

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

Clone this wiki locally