Tags
Creators
Details
1.10.0+1.21.1-neoforge
Compatibility
Required content
Changes
1.10.0
Important disclaimer - NeoForge users need to unequip their spell books, jewelry, relics and quivers to preserve it, before updating to this version
Notable setup changes
- Removed Forgified Fabric API dependency for the NeoForge version, now all platform API calls are fully native
- Removed Accessories mod support entirely (from both loader variants) - Accessories mod l
- Added Curious API slot mod support (NeoForge only)
Functional changes
- Fixed Spell Projectile velocity change upon bounce from terrain
- Fully translated content, now supporting 20 languages
API Changes
spell_choicegainsapply_on_choice: chosen spell id → data-component changes applied to the item (e.g.custom_model_data/custom_name), so the choice can drive the item's appearance
Completely reworked particle effect system:
ParticleBatchreplaced byParticleGroup:id+appearance(one particle) +batch(how many, where, what velocity)- Unset fields inherit the registered particle's defaults;
scale,opacityandplayback_speedmultiply with them - New appearance fields:
facing(CAMERA/GROUND/UPRIGHT/VELOCITY),motionpresets withgravity/dragoverrides,render/glow,opacity_curve,scale_multiplier/scale_easing,color_variance/scale_variance/lifetime_variance,playback_speed(negative reverses),collides facing = GROUNDquads render double-sided, so flat area decals are visible from below too- New attachment mode
POSITION_HORIZONTAL— follows the entity horizontally, but pins height to the ground below (re-probed each tick), keeping decals flush through jumps and terrain - New batch shape
NONEfor a single placed, motionless billboard batch.countis now a rate:1+ is a count per emission, below1a period (0.25= one every 4th tick, continuous FX only)- New
batch.chance(0..1) — dedicated probability field, replacing the old sub-1countoverload - Restored the per-particle lifetime randomness of the pre-1.10 particle classes — 11 elemental/smoke entries were spawning and dying in lockstep
BuffParticleSpawner.spacing(EVEN | RANDOM)decides how a leftover fractional density looks; defaults toRANDOM, matching pre-1.10 buff particlesoriginsplits intoanchor+vertical_origin;WIDE_PIPEbecomesPIPE+width_factor;rotationbecomesalignment;max_agebecomesplayback_speed(reciprocal)- New
ParticleGroupBuilderfor authoring, with reusable batch layout presets
- Unset fields inherit the registered particle's defaults;
SpellEngineParticles:EntryandTemplateEntrymerged into one entry type carrying its own defaults; category lists replaced by a singleentries()- Removed the 14
aura_effect_*entries — use the matchingarea_effect_*id withfacing = CAMERA - Removed the 32
magic_<shape>_<motion>entries — use the 8magic_<shape>entries and setmotionon the effect - Removed
weakness_smoke— it wassmoke_mediumwith a baked tint; setcolor/opacity/gravityper use instead - Removed the
electric_arc_*entries and textures — they duplicatedlightning_arc_*;ParticleGroupBuilder.electricArc(lightning_arc_A/B)reproduces their tuned look MagicParticlesnested class flattened intoSpellEngineParticles.magic_*fields
- Removed the 14
- Added
Fx.Visuals(particles + models), replacingVFXvisualsonrelease,impacts[],area_impact,deliver.melee.attacks[],deliver.clouds[].spawn/.despawn/.impact,target.beam.block_hit,teleport.depart/.arrive/.fizzle,modifiers[].release,arrow_perks.launch_visuals- Continuous particle lists are unchanged — they describe a state, not a moment
- List forms
ofParticles(List),.particles(List),.models(List)alongside the varargs
- Added
Fx.ScaleWith+Fx.Context:scale_with = RANGEon anAppearanceorModelEffectmultiplies its authoredscaleby a magnitude bound at the emission site. Sites bind only what they can supply; an unbound request keeps the authored size and warns once - Renamed
ParticleGroupEffect→ParticleGroup, its nestedParticle→Appearance(JSONparticle→appearance),ParticleGroupEffectType→ParticleGroupType,ParticleGroupBuilder.particle(...)→.appearance(...) - Renamed
ModelEffect.Easing→ top-levelEasing, now shared with particle opacity curves - Removed, with no compatibility shim:
particles/model_fxat every one-shot site — move them intovisualsrelease.scaled_with_ranged— usescale_with = RANGE. Semantics changed: the old field replaced a particle's scale with the range,scale_withmultiplies by it, so a ported particle wantsscale = 1(models already multiplied and port as-is)arrow_perks.launch_particles— usearrow_perks.launch_visualsSpell.ProjectileModeland the single-model render paths reaching it (ProjectileData.Client.model,Cloud.ClientData.model,ArrowPerks.override_render) — usecomposite_modelfor projectiles and arrows,model_fxfor cloudsCast.channel_ticks/Cast.channeled_release_fxand theresolvedType()resolver — usecast.type = CHANNELwith achannelblock, and readcast.typedirectly- The long-deprecated
EntityImmunityAPI (interface +Entitymixin) — useLivingEntityImmunity, which covers damage types, tags and status effects - The deprecated
RemoveOnHit.configure(StatusEffect, boolean)overload — pass aRemoveOnHit.Trigger(ANY_HITmatches the oldtrue)
Projectile flight physics:
- Added optional
ProjectileData.motionforFLYprojectiles (ignored byFALL/meteor delivery) —nullkeeps the classic constant-velocity, gravity-free flightgravity— downward acceleration in blocks/tick² (negative floats the projectile up), applied before drag each tick, so projectiles arc and pitch along their trajectorydrag— fraction of speed lost per tick, so0= constant speed,0.01= gentle decay,1= instant stop (above1clamps). Note this reads the opposite way to Minecraft's retained-fraction conventionmin_speed— expires a decelerating projectile (impact-less) once it slows below this, so drag without gravity doesn't leave it hovering until the age cap- Medium-aware drag:
drag_fluidapplies inside any fluid — vanilla or modded, detected generically viaFluidState— andfluid_overrides[]fine-tune per fluid with their owndragand agravity_multiply(buoyancy). Selectors use the sharedPatternMatchingsyntax (#tag,~regex,!negate,*, exact id)
Description tokens:
- Added the parametric effect token
{effect|<effect_id>|<amplifier>|<attribute>|<format>}— reads a status effect's attribute modifier straight off the registry, with amplifier scaling (base × (amplifier + 1)), attribute selection by id (blank falls back to the effect's first modifier), and a sign-onlyformat(abs,+). Resolution is player-independent and memoised until a registry resync. See Description Tokens - This makes an effect's non-first modifier addressable and replaces the per-spell
DescriptionMutatorpattern for effect values (e.g. Frostbite can show both its movement- and attack-speed values) - Added
TooltipTokens— a dependency-free, server-safe home for token names, theeffect(...)builders, the value-formatting primitives (percent,bonus,formattedNumber) and the programmatic escape hatchTooltipTokens.Custom(register viaregisterCustom), so descriptions can be built without touching client-only code.SpellTooltip's former API — includingDescriptionMutator/addDescriptionMutator— remains as deprecated delegates into the same registry
Added EntityTints — status-effect-driven ARGB tinting of a living entity's whole rendered appearance:
- Register a
Tintagainst a status effect (EntityTints.register) and every entity carrying it is tinted for all players tracking it: body model, worn armor and every otherModelPart-based render pass — no integration needed from armor/feature renderers, as the tint rides the vanillaModelPartcolor argument (Sodium/Iris compatible) Tintderives its color from the entity and the effect instance;Tint.flat(argb)for a constant color,Tint.scaling(argb, strengthPerStack)to strengthen from neutral per effect stack (amplifier + 1)- Concurrent tints blend by componentwise multiplication (order-independent, alphas compound); the blend recomputes server side whenever the effect set changes and reaches clients as tracked data —
EntityTints.resolve(entity)server side,EntityTints.currentTint(entity)anywhere - Alpha below 1 turns the whole entity translucent: the body swaps to the render layer vanilla uses for spectators, and armor layers are made blend-capable (the same swap Shoulder Surfing applies, idempotent alongside it)
Other changes:
- Moved all content config types (
WeaponConfig,ArmorSetConfig, etc...) intorpg_seriespackage scope EffectConfignow supportsConditionalAttributes
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:XvoWJaA2:kmGmwA7J"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:XvoWJaA2:kmGmwA7J"
}

