Browse games

Browse games

My library

My library

My content

My content
My account
mod.io

Adding a New Spell (Basic)

Report guide
Share

Guide

In this guide, we will cover how to make a simple target-based spell.

Locating the Spell Data

Open the Stats Editor via the bar chart icon located in the top right of the menu bar.

In the left column, there will be a list of Projects. Open the one that corresponds to your mod’s name – it should be the same as your project’s name. For the purposes of this guide, our mod is called SimpleNewSpell. Expand the project to see its subfolders.

Here, you will see various sections you can open and modify. To create spells, go to SpellData and click the “+” symbol.

This will open a dropdown of the various spell types that are available in the game.

For the target spell we are making, you’ll need to add both Target and Projectile spell data. You might need to expand the SpellData folder to see your new additions.

Making a Target Spell

We will be making a Touch spell (a spell that requires the caster to touch the target) that explodes on a target. The explosion will deal Fire damage to everyone in the area and heal the caster.

Open your newly created Target spell data.

For Target spells, there are a few required fields that must be filled in for the spell to execute correctly in the game. We will be going over those required fields, as well as some extras needed for the above example.

Name (Technical Name)

You will need to fill in the Name field for the spell. This is the spell’s Technical Name, also rereferred to as its TechName. This is what the system uses to give a specific spell to the player.

This field:

  • Does not accept spaces

  • Accepts underscores _ (often used in lieu of spaces)

  • Accepts numbers and uppercase and lowercase letters

In our example, we will use the TechName FireTouch.

Level and SpellSchool

If you want your spell to show up as part of a specific level (Cantrip, Level 1, etc.) or spell school (Evocation, Divination, Necromancy, etc.), fill out the Level and SpellSchool fields.

  • The Level field accepts numbers.

    • 0 = Cantrip

    • 1 = Level 1 spell

    • 2 = Level 2 spell, etc.

  • The SpellSchool field is a dropdown of spell schools.

We want to make our spell a Level 3 Evocation spell, similar to Fireball, so we’ll fill in 3 for the Level, and select Evocation from the SpellSchool dropdown.

This information will automatically appear in the in-game tooltip.

TargetRadius

The TargetRadius determines how close the caster has to be to the target in order to cast the spell.

We want to make our spell a Touch spell. This means that the player will need to be in melee range of their target in order to cast it in the first place.

  • This field accepts numbers and decimals.

  • The field’s value is in metres.

For our new spell FireTouch, we will fill in 1.5 for the TargetRadius. This is the value used for melee range in Baldur’s Gate 3.

AreaRadius

The AreaRadius determines the area of effect of the spell.

We want our spell to affect those around us, so we will also need to fill in the AreaRadius field.

  • This spot accepts numbers and will take decimals

  • This value is in meters

For our new spell, we will fill in 3. This means that the spell will effect everyone within 3 m of the target.

SpellRoll

All spells must have either SpellRoll or SpellProperties defined. In our case, we’ll use SpellRoll.

SpellRoll describes what type of spell it is. There are two common options used in BG3: SavingThrow() and Attack().

For our example, we'll make a SavingThrow type spell, which is one that requires the target to make a Saving Throw. To do so, we’ll paste the following into the SpellRoll field:

not SavingThrow(Ability.Dexterity, SourceSpellDC())

You can change the Ability.Dexterity part to be any ability type in the game (e.g. Ability.Charisma, Ability.Strength).

Because we’re making a SavingThrow type of spell, we will need to fill in the SpellSuccess and SpellFail fields. We’ll go into how to fill in both of these in the next sections.

  • SpellSuccess is for what happens when the caster succeeds, meaning the enemy has failed their Saving Throw.

  • SpellFail is for what happens when the caster fails, meaning the enemy has passed their Saving Throw.

    • The SpellFail field is optional and can be left blank.

SpellSuccess

Fill in the SpellSuccess field to define what happens when the caster succeeds. For our new spell, we want two things: we want to heal the caster, and we want to damage the target and any others in the area.

  • Use IF() statements to define what happens to each character.

  • To refer to the caster, use Self().

  • To refer to everyone except the caster, use not Self().

To heal the caster, we will use IF(Self()):RegainHitPoints(3d10)

  • RegainHitPoints() can take dice rolls (e.g. 3d10) or specific numbers (e.g. 9).

To damage the targets, since we want everyone else except for the caster to be damaged, we will use IF(not Self()):DealDamage(3d10,Fire,Magical)

  • DealDamage() can take dice rolls or specific numbers.

  • Fire indicates the damage type.

  • Magical indicates that it deals magical damage, for the sake of resistance.

    • Because this is a spell, the damage is magical.

Separate each action with a ;. Put together, it looks like this:

SpellFail

Fill in the SpellFail field to define what happens when the caster fails. We will do almost the same thing as we did for SpellSuccess, but for our new spell, we want to deal only half the healing and half the damage on fail. We can take what we wrote for SpellSuccess and modify it slightly by dividing the values by 2 using /2.

  • For healing: IF(Self()):RegainHitPoints(3d10/2) or IF(Self()):RegainHitPoints((3d10)/2)

  • For damage: IF(not Self()):DealDamage(3d10/2,Fire,Magical) or IF(not Self()):DealDamage((3d10)/2,Fire,Magical)

Again, separate each action with a ;. Put together, it looks like this:

TargetConditions

TargetConditions filter out who the caster can cast the spell on. For example, if we input Self(), the player would would only be able to cast the spell on themselves.

Because we want the player to target any character that is alive, we will use: Character() and not Dead()

AoEConditions

If we want the Area of Effect (AoE) of this spell to affect a specific type of character, we can define the conditions in the AoEConditions field. For example, if we only want the AoE explosion to affect the enemies of the caster, we can write Enemy() here. Another valid option in this field is Ally().

In our new spell, FireTouch, we want everyone to be damaged, so we’ll use the same as TargetConditions.

Player-facing Information

This next section of stats columns is all about filling the player-facing and tooltip information, so players can understand what the spell does.

Icon

Here you can define an icon. For the purposes of this guide, let's reuse an existing spell icon from the Fireball spell: Spell_Evocation_Fireball.

DisplayName

This will be the spell name shown on the tooltip. Let’s call our new spell Touch of Fire.

Below, you can see how this name would appear on the tooltip.

Description

This will be the information given to the player when they view the tooltip. This text should only include letters. Generally, you want to give players an idea of what the spell does.

For our spell we will write:

Touch an enemy with the force of a fireball. Everyone in the area will take [1] and the caster will be [2].

DescriptionParams

As you may have noticed in the above description we used a [1] and [2]. These are filler spots for the description parameters - DescriptionParms.

In our spell’s tooltip description, we want to indicate that enemies take damage and the player is healed, so we will grab the same DealDamage() and RegainHitPoints() as we added to the SpellSuccess.

We will plug them into the DescriptionParms in same order we want the tooltip to display it.

  • [1] should be DealDamage(3d10,Fire)

  • [2] should be RegainHitPoints(3d10)

So into DescriptionParms, we’ll input DealDamage(3d10,Fire);RegainHitPoints(3d10)

Note that in this version of DealDamage() for the tooltip, the Magical is not used.

If done correctly, your tooltip for the spell would now have text that indicates the damage and healing given by the spell:

TooltipDamageList and TooltipAttackSave

These are the last bits of the tooltip that we will be modifying for our spell. The TooltipDamageList gives the player a visually concise way to see the damage and healing effects of the spell. This will use the exact same functions as our DescriptionParms.

DealDamage(3d10,Fire);RegainHitPoints(3d10)

The TooltipAttackSave is used for Saving Throw spells to indicate what type of save it is. Our spell is a Dexterity based save so we will put Dexterity in this section.

With those fields filled in, your spell’s tooltip would now show the dice visual, as well as the DEX Save at the bottom.

CastTextEvent

Spells all need their CastTextEvent filled out. This is related to the animation that the caster is using – animations look for this cast event to in order to execute parts of the spell.

For our spell we only want to execute one cast event, so we will just write Cast in this column.

If you forget to fill this out, your animation may have a delay instead of casting smoothly.

UseCost

This is used to determine what resource is needed to cast the spell. Right now, there is no use cost associated with our spell.

Let’s say that we want FireTouch to cost one Action Point and one Level 3 Spell Slot.

  • ActionPoint:1

    • This means it will cost one Action Point.

  • SpellSlotsGroup:1:1:3

    • This means it will take one level 3 spell slot to cast the spell.

If you have done this correctly, your tooltip would now show the cost of the spell as below:

Spell Animation

All spells need a spell animation in order to be used. Without a spell animation, the spell cannot be cast.

Let’s grab an existing animation and use it. In the Stats Editor, unfold the Shared section on the left, then unfold the SpellData inside it.

Open the Target file inside that SpellData by double clicking on it.

We are looking for a Touch animation spell, so we will Ctrl+F to open the search bar at the bottom and type in 'Touch'. Press Enter to search.

You should see the area below the search bar update with the results, showing you all the spells in the Shared Target file that have the word Touch in their name.

Let’s use the Vampiric Touch animations.

If you double click on Vampiric Touch (any of the VampiricTouch results will do) it will take you to that row in the Target file. It should be row 179.

Scroll over until you find the SpellAnimation column (column BL).

Click on the cell containing VampiricTouch’s Spell Animation data, and Ctrl+C to copy all the spell animation information.

Return to your mod's Target file and Ctrl+V paste the copied spell animation into FireTouch’s Spell Animation column. Your Spell Animation column should now look like this.

PrepareEffect, CastEffect, HitEffect

These effects are how we apply visuals onto our spells. All of these columns are dropdowns that show all the existing effects available in game.

If you’d like to make your own effects, please refer to the VFX Guide [[coming soon]] - but for now we’ll use some existing visuals.

PrepareEffect is the pre-casting of the spell. This is the period after you have chosen a spell, but you haven't yet selected the target. For FireTouch we want something fire-based, so let’s type ‘fire’ into the drop down to filter down the results.

The PrepareEffect requires an effect that has the _PrepareEffect suffix, so let’s use Fireball_PrepareEffect.

CastEffect is the visual on the caster while the spell is being executed. You might have noticed earlier that Fireball also has a cast effect, so let’s use that one here. Like with PrepareEffect, the CastEffect should have the _CastEffect suffix.

Finally, HitEffect is for the visual that plays on the target of the spell when it connects with them. Here too, the effect should end in _HitEffect, and once again we’ll reuse the one from Fireball: Fireball_HitEffect

PrepareSound, PrepareLoopSound, CastSound

These fields are how we apply sounds onto our spells. Creating new sounds is not supported at this time, and therefore the best method is to look for a similar spell and copy values from it to our spell, much like we did for the VFX. For our FireTouch spell, we’ll copy the Firebolt sounds from Shared → Projectile:

Now our spell should have sound!

SpellFlag

Spell flags are used to give additional information on how the spell is expected to behave. These can vary from case to case. The dropdown in this field allows multiple options to be selected.

For FireTouch, let’s select the following:

  • HasVerbalComponent

  • HasSomaticComponent

  • IsMelee

  • IsSpell

  • IsHarmful

HasVerbalComponent: Spells with this flag will become unusable if the caster is Silenced.

HasSomaticComponent: Used for spells that require somatics in order to cast.

IsMelee: Used for attacks and/or spells that are within melee range.

IsSpell: Recommended for any spell that is meant to be considered a spell in DnD. Using this flag makes the spell work with other systems like silencing, counterspelling and armor proficiency requirements. Without this flag, your spell will show as a 'Class Action' on the tooltip if its spell level is 0.

IsHarmful: If enabled, this flag lets the AI know whether or not to bring NPCs into combat. If the spell does damage, this should naturally happen, but if there’s a chance that the target could save and negate the damage, we want this flag there as well.

A few other common flags that are not being used in this example, but might be interesting:

  • IsConcentration: Used to make a spell into a concentration spell.

  • IsAttack: Used for attacks that are not meant to be magical.

  • Temporary: Used to open the temporary section of the hotbar for spells that the player only has for a short time.

Testing Our Spell

Now, with all of these fields filled out, we can test the spell. To test the spell, we need to add it to one of the class spell lists so we can pick it during Character Creation or Level Up.

Open the UUID Editor and create a new SpellLists table in the Lists section:

Also in the UUID Editor, go to Shared → Lists → SpellLists. Look through this existing SpellList for one that you’d like to modify. Remember that we made FireTouch a level 3 spell, so you should choose a level 3 spell list. For testing in this guide, we’ll use the level 3 SpellList for Clerics:

Copy UUID field from the Shared SpellLists table and paste it into your mod’s SpellLists:

Repeat this copy & paste for the Spells field. This is so we keep the original Cleric list intact. Add the tech name of our new spell at the end, separated by ;.

The “tech name” we refer to here is the SpellType_SpellName.

In this case, the type is Target, and the spell name is FireTouch, so together it becomes Target_FireTouch.

We can leave Comment field empty. This field is not used by game in any way, and only serves as a note for developers.

Save all of your changes thus far.

To test, you’ll need to load a level, if you haven’t already. Basic_Level_A is perfectly sufficient. Once a level is loaded, enter Game Mode.

With your cursor over the character portrait, press Ctrl+Shift+L to level them up. Click the Level Up button to enter the Level Up screen.

If your test character isn’t already a Cleric, add the Cleric class using the Multiclassing menu.

You’ll need to level up a few more times, until you’re a level 5 Cleric, to get your level 3 spells list. Once there, go to the Spells tab - in the list of available spells, you should see the newly added spell: Touch of Fire. Once we pick it, we can use it in game and check that all parts work as intended.

TargetRadius and HitRadius

Use Ctrl+Shift+3 to spawn in a wolf.

When casting the spell, there are two circles present on the ground. The smaller circle (highlighted green in screenshot below) is our TargetRadius of 1.5, and the larger circle (highlighted magenta) is our AreaRadius.

PrepareEffect, CastEffect, HitEffect, SpellAnimation

When going to cast our spell, we should be able to see that our character has a fire-based visual around her. This is the PrepareEffect along with the Spell Animation. 

When the charater goes to cast the spell, we can see them step forward with a glow on their hand. This is the CastEffect and Spell Animation.

When the spell is used on the wolf, we can see it that it has a fire effect. This is the HitEffect.

Combat Log

In this example, Shadowheart was the caster of the spell against a wolf. In the combat log, you can double-check the values of the spell: our wolf enemy was dealt 7 fire damage (3d10/2) and Shadowheart was healed (3d10/2) because they both passed their saves.

Discussion
92 comments

Log in to join the discussion!
In my case, ctrl + shift + 3 wont spawn the wolf. I checked my options, and it seems the key 'ctrl' is bind to 'prepare main weapon'. I try to unbind this key, but after so, the problem remains still. Does anyone can give me some tips?
If spell doesnt activate on click, and adding a display name / description causes errors. If using a toolkit extender, check and make sure you're using an up to date one. As of 12/21/24 I had to switch from Toolkit unlocked over to moonglasses.
Thanks for the guide! Could I ask how I can tell the spell what Ability modifier to use to calculate the DC (or the attack roll). I think I understand that it reads it from the classDescription.lsx, correct? But , what if I want it to use a different or a specific Ability?
How would I go about creating a spell that uses the damage of the currently held weapon, but swaps out the stats for the spellcasting stat. I figured out how to do the attack roll, but not damage roll
I have a problem that makes it when adding a display name makes the spell unclickable, does anyone know how to stop it?
the problem occurs when I create a spell with no parent or if i create a spell with a parent but change the display name
Can someone please help me?
How do you create a container spell like command? that when you cast it has multiple variations
Create at least two spells. The important part is the container needs the SpellFlag "IsLinkedSpellContainer" and the SpellContainerID and ContainerSpells need the right syntax TYPE_NAME for example: BookOfSpells - SpellContainerID = empty - ContainerSpells = Projectile_Fireball;Projectile_IceLance (these are just examples, not actual spells ingame ;-)) Fireball - ContainerSpellID = Projectile_BookOfSpells - ContainerSpells = empty IceLance - ContainerSpellID = Projectile_BookOfSpells - ContainerSpells = empty
thank you soooooo much :)
Is there value for character body type/genitals type? I know that's odd, but I thought it'd be funny to make Testicular Torsion as a practice spell, and it'd be entertaining to make it only work on targets with the proper... equipment.
Every Character has a bodytype (male or female). This could be used, but I haven't seen a condition for checking these stats, though.
I've two questions. First, for a spell cost that also includes 5 hit points from the caster, would you use RegainHitPoints(SELF,-5) or maybe RegainHitPoints(SELF,-SpellCastingAbilityModifier)? Second, I'd want to ensure the caster has more hit points than said value. Is there a check for that? UPDATE: I found the answer to this in Gustav. There's a StatsFunctionCondition in the Stats > Passive table that uses HasHPLessThan(13). There's also HasHPMoreThan() as well.
Hey :) RegainHitPoints doesn't work with negativ values. I have tried various option and found one solution as of yet. Your Spells need the condition for HasHPMoreThan(). Create a passive with following statements: - column R Properties = IsHidden - column V StatFunctorContext = OnCast - column W StatsFunctorConditions = SpellId('TYPE_NAME) e.g SpellId('Projectile_Fireball) - column X StatsFunctors = DealDamage(5,Necrotic,Magical) Assign the passive to your progression table and you are done :)
Does anyone have a breakdown of all that sorts of things that can be used in the DealDamage() field? Obviously there's the main weapon, dice rolls, and flat numbers, but what about skills or abilities?
how can i make it so a spell grants temporary actions as long as you are concentrating like telekinesis does?
You could create a shout or target spell and a status boost in the "Status_BOOST" table. Let's call the boost "Test_Boost" and the Shout spell "Test_Shout". Test_Shout would simply give you the boost we're gonna create in a minute, via "SpellProperties" where you'd put in ApplyStatus(Test_Boost, 100, 5) The last number, in this example "5" dictates for how many turns you'd get the boost. Then you'd create the actual boost in the "Status_BOOST" table. There under "OnApplyConditions" you put HasSpellFlag(SpellFlags.Concentration) As "TickType" I'd select "StartTurn" which makes the boost check for the concentration flag at the start of every turn. Then under "Boost" you'd put ActionResource(ActionPoint,1,0) note that I haven't tested this myself but if you fill out the other things as said in the above guide, I don't see why it shouldn't. If it doesn't, I suggest looking through the gustav tables and do some global searches (ctrl+f) and look for things that do something similar. Another workaround could be adding an item that does what you need as a passive. Hope this helps
Very helpful since this tool is god-awful :D How do we export the spells we've made into the actual game instead of running it in this little window?
you click on project settings and then fill in the information needed and then you can publish it
This ain't about creating a new spell, but editing existing ones. As I'm only going to balance the spells already in the game. So the question is, where are the low level of the spells located? Take "False life" as an example. I found level 4-6 under "shared dev/spell data/shout. Just strange that level 1-3 ain't in the same spot. Hopefully one of you nerds can help out :)
Go to Stats Editor, then Ctrl+F or "Edit" > "Find", click on "local search" to set it to "Global Search". Now you can type in whatever you're looking for. False Life level 1 to 3 seem to be in Shared for example. Level 1 spells don't have a number attatched, as the lowest spell is the base for the upcast spells. Hope that helps :)
Thx. That helped for sure :)
Trying to add a spell to an item. If I add an existing spell to Use Actions > Use_Spell it works just fine. But if I try to add my new spell I get: Can't cast spell with ID 'Target_HoldPerson_override': UNTRAINED Spell cast failed with reason (CantCast) Checking if caster can cast spell 'Target_HoldPerson_override' from source item, but item spell::BookComponent doesn't contain the spell! Will try using caster's SpellBookComponent as a fallback, but requirements might be skipped. Tried 'Create Derived in' of an existing spell without changing any stats of it, still the same. Any ideas? Do I need to add it to a UUID list? If so, how? I only want the spell to be available through using an item, not as a learnable class spell. Edit: In the Use Actions window the field Action Conditions must have CanUseSpellScroll("Target_HoldPerson_override"). Thanks a lot to @OhforTheGamer for pointing that out! Also save Stats *before* editing Root Template... I think
Hi, im triyng to create a spell exactly like hunger of hadar, but whit the condition that the debuff only affects enemies and not my character, i think i have to change the applystatus but i reallly dont know, any ideas?
Not sure exactly, but it seems the actual damage is dealt by the Status_BOOST VOID_AURA, see column AL AuraStatuses. So you'd either need to override VOID_AURA in your mod if you want to change Hunger of Hadar entirely, or create a derived of Hunger of Hadar AND Void Aura for a second spell, and then connect the Void_Aura2 to HungerOfHadar2 (ToolTipStatusApply and SpellProperties, I think). At VOID_AURA, column AL AuraStatuses there's a bunch of IF statements, you could probably modify those to affect only enemies. For example SPIRIT_GUARDIANS_RADIANT_AURA has TARGET:IF(Enemy() and not (Dead() or HasStatus('KNOCKED_OUT'))):ApplyStatus(SPIRIT_GUARDIANS_RADIANT,100,-1) in that field. So my guess would be TARGET:IF(Enemy() and not (Dead()):ApplyStatus(VOID_START,100,-1);TARGET:IF(Enemy() and not (Dead()):ApplyStatus(VOID_END,100,-1);TARGET:IF(Enemy() and not (Dead()):ApplyStatus(DIFFICULT_TERRAIN,100,-1) Buuuut I haven't tried it and I'm a noob myself, so uh, might be wrong. But maybe a place to start :) Good luck!
Is there a way to fix the shared tab? Mine doesn’t populate any code for me to see.
Figured it out. You need the kit added to your base game to unlock the shared items. lol I only had the toolkit downloaded not linked
Any idea how to make a transformation spell? Like for example if I wanted the player to turn into a Dragonborn for a set amount of time.
Lookup any of the WildShape spells and then adjust the status within SpellProperties (col K) from: "ApplyStatus(WILDSHAPE_BADGER,100,-1)" to "ApplyStatus(DISGUISE_SELF_DRAGONBORN_MALE,100,-1)". You would also want to change the costs so that it won't require a wildshape charge, but you can play around and find what you like. This may also require you to make a new Status within Status -> Polymorphed table. When trying to create a new spell, just like this tutorial says, look for any similar spell and make adjustments to your liking. You may not succeed from the first try, but play around. It's also a good practice to just GlobalSearch a spell and see exactly what tables has references to it.
Do you know what to do if you want to wildshape or polymorph into something that isn't already possible in game ? For example if I want to wildshape as a gremishka ; I also thought about modifying the ApplyStatus but that means I need to somehow create a new status but I have no idea how and I see nothing relevant in the Status / Status Effect part of the Stats Editor
hey, so im pretty sure that this is what i did: go to status data and select data_polymorph, then i copied the regular polymorph thing and replaced the template id with the one of a creature i chose and thats basically it, now of course you do still have to make it into a proper spell but still.
It worked !!! Thank you so much I will be making a billion of those now thanks !!!
I'm glad to of helped!
hey great guide! my mod worked like a charm, however does anyone know of a way to cause an effect to be changed based on other effects, like if i cast polymorph on someone, is there a way to re cast polymorph on someone to increase the duration by chance?
Through a lot of trial and error, I managed to find out how to plainly override a spell/cantrip. Find it in Shared -> SpellData, and locate the correct category (again trial and error via the Search/Find functionality). Right click the spell and select "Override in". Now, the question I have: Does anyone know if we can edit limitations to a spell? Let's say I wanted to allow Armor of Agathys to be cast even while wearing armor. How would that be achieved? Could also be I wanted to create my own spell with a limitation like that. I've tried digging through the files for everything related to Armor of Agathys, but haven't found anything that obviously related to this limitation.
Armour of Agathys has no restrictions on the type of armor. Maybe you meant Mage Armour? In any case, when you go to "stat editor", press "control f", then enter the desired word and press the "local search" button to switch to "global search". Mage Armour have "Target conditions" and "CycleConditions": Character() and not Enemy() and not WearingArmor(). Just delete "and not WearingArmor()". This should be enough.
Ah yes, you are absolutely right. I meant Mage Armor. Thanks for the pointer!
How do I add a spell as a reaction? I'm currently trying to create an unarmed equivalent to divine smite and I've gotten it to work fine so far, only that I can't get it to show up as a reaction, for regular hit nor critical hit so I'm definitely missing something, any guidance?
When compared to the Paladin's Divine Reaction, I found the following: UUID Object Editor\SpellLists[shared] have the "Target_Smite_Divine;Target_Smite_Divine_Unlock;Target_Smite_Divine_Critical_Unlock". Unlock means reaction. In the StatEditor\Target[shared]. There are a lot of lines that mention "Smite_Divine_Unlock", referencing each other. I don't understand yet how exactly they become reactions.
Reactions are Interrupts, not Target spells. I don't think Unlock is the actual reaction here. For Divine Smite, the reactions aren't regular spells in SpellData, they're Interrupts in Stats. Interrupt_Smite_Divine and Interrupt_Smite_Divine_Critical iirc, they just happened to be unlocked alongside the regular version. Same with Shocking Grasp for War Caster, it has its own clone as an Interrupt that just happens to do the exact same thing the Target spell does. So if you want to add a spell as a reaction, you'll have to clone the spell itself into Interrupt with the right trigger context.
How can I create new icons?
Help, how to make non monk class play monk skill animations normally. My mod can do this before patch 7 by using DynamicAnimationTag in passive.Now its dont work :(
I found FlurryOfBlows in Target[shareDev]. There are columns: "PrepareSound", "CastSound", "Spell Animation" etc... I guess you'll have to find the abilities you need and copy their animation descriptions.
I'm adding a new level 1 spell to the sorcerer level 1 spell list (92c4751f-6255-4f67-822c-a75d53830b27) but it only shows up when the sorcerer is level 1 or 2. After the sorcerer gets access to level 2 spells (character level 3), all the new level 1 spells added into the level 1 spell list can no longer be chosen from. The level 1 spell list seems to be forcibly overwritten by the Sorcerer SLevel1 expanded spell list from SharedDev. This behavior repeats itself when gaining access to level 3 sorcerer spells such that the sorcerer level 2 spell list (f80396e2-cb76-4694-b0db-5c34da61a478) is also replaced. Replacing of sorcerer spells is also affected. The same behavior also occurs for the wizard level 1 spell list (11f331b0-e8b7-473b-9d1f-19e8e4178d7d) and wizard level 2 spell list (80c6b070-c3a6-4864-84ca-e78626784eb4). Since wizards can learn new spells from scrolls they are less affected by this issue than sorcerers who can only learn level 1 or 2 spells when leveling up. I have no other mods activated other than the one I am trying to create in the toolkit. Are there any workarounds for this behavior?
I think the problem is that you used the "Override in" command from "SpellList[SharedDev]". In this case, the UUID was copied. So you have two spelllists with the same UUID. Use the "MergedInto" column. Choose the same names there as the row names, then use "regenerate value" on the UUID. This will create unique UUIDs that will rewrite "SpellList[SharedDev]" with the help of "MergedInto".
Thank you, this fixed my problem. I just followed how the guide specified to add spells into spell lists, I wasn't aware there was a way to use MergedInto to merge into existing spell lists without doing a full override.
You can just add it to each of the progressive spell lists for the class you want the spell tables are changing to add the higher level spells so they have a different uuid the other option would probably be to make your own spell table with uuid for your own spells and include a separate selection in the class for it but then your modding the class as well or maybe making a feat that lets you select from a spell table of your modded spells. But probably easier to just copy paste your spell into each of the spell tables past whatever level the char should learn the spell so it’s always available for picking
I'm replicating a famous mod in which NPC Glut's Animating Spores spell can be learned. I managed to add it to the class, I managed to set all the triggers accordingly except for one, the created minion does not follow the player. I would like to know how to overcome this... unfortunately this documentation is very poor.
You need to rewrite the spell script within Story Editor. As of now, the spell is precisely made to only work properly when casted by Glut. The spell and the quest is included here: Act1_UND_MyconidCircle_BroodingMyconid, Act1_UND_MyconidCircle_NecroMushrooms. I've already done this myself, so I'll give you some tips. The spell in not necessarily summoning a new creature when casted, unlike the other "animate" spells, instead it entirely relies on applying a status "CREATURE_SPORE_SERVANT". To make it work as you want, you need to write the script for a new status (which you will later have to create in the table Status_BOOST). Fortunately, if you dig deep enough, there are plenty spells you can use a base model for this (e.g. GLO_Spells). There's also 3 or 4 more tutorials here that shows you the basics of using the Story Editing and scripting in Osiris. Hope that helps! Otherwise, when I finish debugging my spell, I'll post it here.
My spell has 0% chance to hit, anyone know what im doing wrong?
It's hard to say without knowing what the spell is supposed to do. Maybe you got it wrong at SpellProperties or SpellRoll or SpellSuccess.
I had the same problem, what was causing it for me was in the "SpellRoll" slot where it says "not SavingThrow(Ability.Dexterity, SourceSpellDC())" i had a comma after Ability instead of a period.
Is there a way to make a custom spell uniquely available to a particular character. I tried adding UnlockSpell(Target_SacredFlame_Modded); to a custom statusboost, but it doesn't work. The boost works when I input a Vanilla spell like UnlockSpell(Target_VampiricTouch_Free);. I also tried to add the spell inside the story editor. THEN AddSpell(S_Player_Astarion_c7c13742-bacd-460a-8f65-f864fe41f255, "Target_VampireBite_Astarion", 1, 0); AddSpell(S_Player_Astarion_c7c13742-bacd-460a-8f65-f864fe41f255, "Target_SacredFlame_Modded", 1, 0); Only the vampire bite gets added Any ideas/solutions would be appreciated. Edit: Issue has been found. I didn't take into account that the editor adds Target_ in front of all entries in the targeted spells so my Target_SacredFlame_Modded became Target_Target_SacredFlame_Modded. Thanks Luni and Satan on Larian discord <3
Hi, is it possible to bind a shout spell and a target spell? I'm trying to make a spell that teleports the character and heals them too, but i only managed to do the teleport. When i do a shout spell, i get the healing but i can't do the teleport since i need to select a target
I found the problem. I had to add "GROUND:" before the RegainHitPoints so it will trigger when selecting when selecting the terrain as the objective of the spell.
Is it possible to make a spell use an attack action instead of a full action? I want to make spell usable with extra attack but i can't figure it out.
Try adding "Attack(AttackType.MeleeWeaponAttack)" to SpellRoll. Edit: That may cause some objects to trigger as if you made a melee attack (but I'm not sure). It's better to check the Extra Attack pasive in Shared-Stats-Pasives or the Boost in Shared-StatusData-Status_BOOST and test different things. Basically, there is no attack action, just a pasive that let you do another attack.
Oh my god it actually worked, thank you SO much!
I would look at the BH Colum where it lists use costs, see if attack is one that doesn't error, but I do doubt it unfortunately.
Doesn't work unfortunately, ExtraAttack passive seems to require an ActionPoint to function but i don't understand it beyond that
My Spell does the animations and sounds, but deals no damage or heal. Any Ideas? I copy/pasted the code from this tutorial. EDIT: Found my mistake. I had "Cast" typed in the wrong field, it was in "Alternative Cast Event".
So all of that works on my end but is it possible to make it so that I can upcast the spell? I tried to reverse engineer it but seems like I either missed something or it isn't supported.
For anyone still wondering how to add upcasting, I just published a detailed guide on it: @upcasting-spells
Upcasting requires making a new spell sort of don’t remember exactly how it went but if you look at the other spell data you can see examples of how there’s another version of the spell that’s up casted and how its parameters change
In this guide we gained the spell by adding it to the cleric spell list but is there a way to make your spell available to everybody at level 1?
I'm not yet sure if there's a short way. I know you can override every first level spell list if you just want to give it to casting classes, or you can override every first level class progression or every race if you want literally everyone to have the spell at first level. I'm not yet sure how those approaches work when using multiple mods together. Like, if you and I both override spell lists, I assume our additions just merge? But if a mod adds new races/classes, would there be a way to auto-assign new spells to them? I know there are some Default tables (under either Stats or UUID), maybe take a look at how those operate.
How does one reset their character level or bring in a new character? I did something incorrectly with the UUID and spell list and want to restart with a new character. I see there is a level override but I cannot edit it
If you hit Ctrl + Shift + F11, it will bring up the debug console. You can use ccStartNew to create a new character, or ccStartRespec to respec your currently selected character.
I tried adding an extra Blade Ward for the bonus action but it doesn't show up. In Stats editor I found it in "Shout[shared]" then copy all string to my SpellData - Shout. Then just change Actionpoint:1 to BonusActionpoint:1. Ofcourse changed name to "BladeWardBA". Then in UUIDEditor I copy all strings where was "Shout_BladeWard" from "Spelllist[shared]" to my Spelllist. Then just add "Shout_BladeWardBA;". As I understand this should be enough to start testing it, but here is a problem. I tried all classes that have Blade Ward and no one have a new Blade Ward BA. What did i do wrong? When i did everything like in guide, i get a "Touch of Fire", but when i try to change something its not working.
I FIGURED IT OUT FINALLLY!! Ofc, the solution was right in front of me too. Its the "MergedInto" cell that you need to define when you're adding spells to a pre-existing class's learnset. The cell has a whole drop-down list with everything. I'd spent a whole day troubleshooting without even looking at it so I feel so dumb 🤣. But, I did learn some interesting things... When you create a new row of data on your mod's SpellLists sheet, even if you copy data from the game's source SpellLists, a random UUID is always generated. You cannot change the UUID / force it to be that of one you desire. I had to learn what UUID means but it basically will always be a unique ID for your dataset. I'm sure there's many technical reasons why its set up this way but this explains why nothing was working because the game never knew to look for the UUIDs we generated with our custom datasets. Now all I'm left wondering is why tf level 3 cleric works despite this?! I'll leave that mystery for someone else. EDIT: Just kidding! I figured it out! When you copy/paste just the UUID itself and not the whole row of data it does not generate a random UUID! So that would allow modders to actually remove spells from classes for whatever reason. But! Otherwise I'm assuming the MergedInto cell should be utilized as it may prevent mods from conflicting???
Thanks for the reply. I already realized that it is quite easy to change the parameters of existing abilities. I will definitely try to add 1st level spells. I am also curious how to add a spell without the ability to choose, for example, like drow lights. I mean several abilities that are given out all at once.
Damn it! My brain is already boiling over because the cursed cantrip does not appear. I have already added the progression section. Pasted the UUID from the spell list there. And nothing! If I add the resulting spell through the debug console, it is displayed and works correctly. But if I take a cleric, new cantrip does not appear. Edit: Eldrich Knight with Clerics UUID in Progressions-Selectors do have new cantrip but Cleric itself not. Why?
Did you level up the character to a level where they pick a new cantrip? Touch of Fire shows up by default because clerics can prepare spells from their whole spell list. But your character sheet will only show the cantrips your character already chose.
Yes i did it with cleric. Nothig new. In Statts editor I even tried to make same cast in "target" and make it there. Used shield of faith as an example for me, since it already requires a bonus action. Still nothing. The new spell does not appear in any spells or cantrips.
So I also encountered this problem. I was making a cantrip version of Faerie Fire called Fluoresce that used some of the casting properties of Colour Spray such as it being a cone. I added it to every cantrip spell list but it did not show up in-game just like how you described. Then, I added it to the level 3 cleric spells list with the Touch of Fire and its appearing in game now, though just in that learnset. Likewise I did also try making Touch of Fire a cantrip, which it did not show up in any of the cantrip learnsets I put it in. I'll keep u posted as I figure this out.
I can't test the spell, because i can't level up my character with Ctrl+Shift+L or even spawn the wolf with Crtl+Shift+3, so i guess is a keyboard thing. I tried using the console with Ctrl+Shift+F11 and typing levelup, but it said Cant use the command
Your mouse pointer has to be over the portrait on the UI
Same, can't level up or spawn in wolf
Did you include the number of levels? ie, "levelup 1" will add one level, "levelup 5" will add 5.
This worked for me. Thank you!
you need to point mouse cursor to the character
Hey, thank you all for your comments. I can't level up my character even when mousing over the character portrait on the UI. I also can't get any commands to work in the Ctrl + Shift +F11 command line either. Everything else appears normal, Karlach standing there, can click to move etc. The only things I can't do are any commands to level up or spawn in actors. I was even able to use Ctrl + T to teleport, nothing else.
Not at the portrait, but at the character himself. For me, the toolkit is constantly buggy, I have to restart it often. I also have commands triggered only if the character is preparing for battle when ctrl is pressed.
Hey is there a good guide that shows how the functions work and what are all the options? But on top of that is a more advanced guide coming soon? Even if piecemeal?
Doubts. We'll probably have to make a community guide. For now I think the best option is to reverse-engineer things from existing spells.
Where can i find those existing spells to reverse engineer from
Should all be in Shared -> SpellData, right? Like the step in the guide where we grab values from Vampiric Touch.
yeah seems my BG3 download was broken somewhere and like no assets were downloaded yet i could still launch and play the game
what about class features?
I got as far as "Testing Our Spell" but I do not know how to open the UUID Editor, or what it is. Can anyone help?
Smuhj, the UUID Editor is to the right of the Stats Editor (very start of the guide). I was also searching for it for a hot minute as well.
It's in the main window, not the Stats Editor window. It's right next to the Stats Editor button.

mod.io uses essential cookies to make our site work. With your consent, we may also use non-essential cookies to enhance your experience and understand how you interact with our services. The latter will be set only upon approval. or read our Cookies Policy.