The Guide to Almost All Missile Functions

Post here about all aspects of D2 mod making whether it's information, problems or whatever. Please specify whether your post is relating to Classic D2 or the Expansion.

Moderator: Nizari

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

The Guide to Almost All Missile Functions

Post by Cypress » Fri Apr 02, 2021 5:02 pm

This is my attempt at describing as many missile functions as possible, primarily looking at skills.txt and missiles.txt. I made this to get an idea as to the limits of using missiles.

See here for the Guide to Non-Missile Functions: https://d2mods.info/forum/viewtopic.php?t=66934

I also use a color scheme to describe how useful a missile might be.
Indicates the function is hardcoded, broken, has no known purpose or is not understood
Indicates the function works, but is either awkward or seems to be an inferior version of another function
Indicates the function works and is highly recommended for use; subsequent green-labeled entries are alternatives that might work just as well
Indicates the function works and has a unique behavior with no available alternatives
Indicates the function works somewhat, but is cltside only; these can also sometimes be hardcoded, but I don't care enough about cltside missiles to make a distinction
Indicates the function works and is cltside only, but is still interesting

Also, I recommend looking at mishy23's excellent guide: https://d2mods.info/forum/viewtopic.php?t=29595; a few of the missiles described in that guide are not described here.

THANKS TO:
mishy23 for his missile guide, and for finding the difference between dmg func 7 and 9
Ogodei for his description and understanding of doomknightmissile/necromagemissile
Whoever figured out the hidden monster spawning missile function
Hygiliak for describing hit function 39, Brother Laz for popularizing it
Vicarious Visions for including "diabloiidatafileguide" in D2R.
AmazonBasin for describing dmg func 12 under Lightning Bolt's skill entry.
Nagahaku for noticing and fixing the fistoftheheavensbolt desync, for finding a better way of preventing frozenorb missile hitfunc desync (collidekill=0 instead of collidetype=6), for describing fingermagespider's unique controlled tracking, for describing missile pcltdofunc 14 which allows fingermagespider to work graphically without any skill funcs, finding out what creates overseercontrol.
Razi198 for noticing that srvdofunc 36 produced missiles do not match cltside when hybridized due to a hidden calc
ProAtWorkhere/nightwisher for fully describing hitfunc 31
Borgin for finding that hitfunc 17 prevents a missile from dealing damage, for describing Armageddon/Hurricane aurastats
AlisonHell for describing skill Guided Arrow's cursor detonation, finding the difference between guidedarrow hitfunc and dofunc
Nizari for describing how the animmode parameter on hitfunc 6 uses IDs from montypes.txt
Kong for describing how Guided Arrow's cursor detonation doesn't occur if targeting a monster, catapult spike ball desync at low spike values, that monblizzcenter level scales radius
nothing1742 for finding out how bomb in air gives its skill function parameters to its hitsubmissile
Silvermane for uncovering how psrvdmgfunc 13 allows Blessed Hammer to enhance its physical damage
GreenDude for finding that the hitsubmissile release of fistoftheheavensdelay does not track the position of the target only the direct hit does, improved description for hitmissileskill, found that grimwardmediumstart can deal damage and does release the dofunc as it moves

[SRVSTFUNC] Skills.txt srvstfuncs that produce missiles.
[SKILLS MODIFYING AND/OR USING MISSILES.TXT] This section describes how skills modify and control missiles via skill functions.
[DOFUNC MISSILES] Missile function that will do something while the missile exists and/or as it moves.
[HITFUNC MISSILES] Missile function that will hit something and produce an effect (hitfunc will only go off once, unless you are using pierce=1 and the skill_pierce or item_pierce stat, in which case hitfunc can go off up to 5 times).
[MIXED MISSILES] Missiles that make sense to be used with both hitfuncs and dofuncs. Also some odd missiles that aren't understood.
[PSRVDMGFUNC] A special additional function that can add behaviors to missiles.
[MISSILE STATES/AURAS] A list of functions which work relatively well when produced by auras/states.
[OTHER WAYS OF GENERATING MISSILES] Lists a few other ways to generate missiles.
[HARDCODED MISSILES] A list of known hardcoded missile IDs.


----

[BASIC SKILL MISSILE COLUMNS]

srvmissile/cltmissile: Makes a skill shoot out a srvside/cltside missile from the user's location. These columns function for every skill, although they break moving sequences, making them virtually unusable for Charge, Whirlwind, Leap and Leap Attack. These missiles are not influenced by Skills.txt (except for the following periodic setup) or unless you set specific functions/parameters in Missiles.txt that reference Skills.txt.

[Any skill] Releases a missile while a state is active after every perdelay frames elapse
(srvmissile/cltmissile=missile to launch)
(pcltdofunc=any function that applies a state to self)
(aurafilter=determines the targets for blade shield to attack)
(aurastate=state that must be active for missile launching)
(auralencalc=duration of state)
(periodic=1;perdelay=frames that must pass for another missile launch)

[lob] This setting makes it so a srvmissile hits when it reaches the target location. The cltmissile arcs as it travels to the target location.

[SRVSTFUNC]

[Inferno] Release srvmissilea and cltmissilea/b while you animate; first cycle will not release anything (srvdofunc 19 covers the first cycle on vanilla Inferno).
(srvstfunc=11)
(cltstfunc=15)(cltdofunc=24)
(clc1=range; sets the range of the missile created, completely overriding whatever is set in missiles.txt range and levrange)
(anim=SQ,seqnum=6,seqinput=10; {other settings might work, have not tested})

[Blade Fury] Releases srvmissilea after prgcalc1 frames pass while animating in a sequence. Without a sequence, will self-interrupt every other action and only release on each non-interrupted action.
(srvstfunc=26)
(prgcalc1=frames between each missile release; lowest usable srvside value is 2; lowest usable cltside value is 1)
(cltstfunc=8)(cltdofunc=6)
(anim=SQ,seqnum=23,seqinput=12)

[corpsecycler][vinecycler] Consumes a corpse and releases srvmissilea southward, as well as cltmissilea/b toward nearby targets {Doesn't seem to function if used by player, even if the player selects a corpse with it}
(srv:a,clt:a,b;srvstfunc=63,cltstfunc=49,cltprgfunc1=93)


[SKILLS MODIFYING AND/OR USING MISSILES.TXT]

srvmissilea/b/c and cltmissilea/b/c/d: Due to the complexity of these columns, I will individually describe as many cases as I can find. Following are numerous cases, first describing what occurs, then in parentheses describing the srvside requirements followed by the cltside requirements. Following are the relevant fields that change the missile, which have mostly been described by other sources, but I'm doing it again anyways for the sake of being thorough.


[Multiple Shot][Teeth] Multiple missiles launched when not using a crossbow
(a,srvdofunc=8,cltdofunc=17)
[Multiple Shot][Teeth] Multiple missiles launched when using a crossbow
(b,srvdofunc=8,cltdofunc=17)
(clc1=number of missiles that cannot cause hit effects)
(clc2=how many frames must pass until the missile can collide with something; submissiles ignore this)
(clc3=number of clc1 missiles that cause hit effects; if the number is greater than clc1, then an additional clc3-clc1 srvside hit effect missiles are released)
(note: can also add in cltstfunc=19 to release cltmissilec)

[MonDoBaalInferno] An unused srvdofunc. Appears to work identically to srvdofunc=8, it releases a cone of missiles which gets tighter as you aim farther away, the number of missiles equivalent to calc1. Unlike srvdofunc=8, it does not change missile based on the weapon you equip. {need to test further now that we have D2R listing. the D2R description is completely different from my original testing}
(srv:a,srvdofunc=138)
(calc1=number of srvmissilea to release)

[Strafe] Repeated missiles launched when not using a crossbow
(a,srvdofunc=8,srvdofunc=12,cltstfunc=13,cltdofunc=20)
[Strafe] Repeated missiles launched when using a crossbow
(b,srvdofunc=8,srvdofunc=12,cltstfunc=13,cltdofunc=20)
(aurarangecalc=radius to search for targets)
(clc1=number of nearby targets to fire missiles at)
(clc2=applies damagepercent to all physical damage of missile)
(clc3=number of missiles to fire at nearby targets; cannot exceed clc1)
(param6=% frame rollback; percentage of frames to shave off from the action frame for each repeat)

[Guided Arrow][Bone Spirit] Missile detonates when it reaches the cursor, behaving like lob=1 but without the cltside missile arcing; missile will travel over its full range if a monster is selected as the target. Missile also locks onto a nearby target with proper missile settings.
(a,srvdofunc=10,cltdofunc=18)
(clc2=applies damagepercent to all physical damage of missile)
(missiles.txt: pclthitfunc=13,psrvhitfunc=10)
(param1/cltparam1=retarget frame; how many frames must elapse for the guided missile to correct its direction towards the target)
(param2=radius of target searching; seems to work even without psrvdofunc/pcltdofunc=7)

[FingerMageSpider] Releases a single missile with controllable subloops. Doesn't do much except for graphical settings; without these funcs, the missile will still track targets, but become invisible on cltside. As such, the srvdofunc seems basically worthless. {Supposedly does damage per frame based on param3, but this was likely broken in the transition from 1.09 to 1.10}
(a,svdofunc=101,cltdofunc=57)
(LineOfSight={}, SearchEnemyXY=1, SearchEnemyNear=1; recommended to use at least one of these Search settings alongside LineofSight)
(clc1={subloops; probably cltside, not entirely sure what it does})
(missiles.txt: pcltdofunc=15, psrvdofunc=11, param1, param2, param3, cltparam1, cltparam2, cltparam3, cltparam4, cltparam5)

[Inferno][Arctic Blast] Release 9 missiles in rapid succession
(srv:a,clt:a/b,srvstfunc=11,srvdofunc=19,cltstfunc=15,cltdofunc=24)
(clc1=range; sets the range of the missile created, completely overriding whatever is set in missiles.txt range and levrange)

[Inferno][Arctic Blast] Release many missiles, releasing more with higher slvl
(srv:a,clt:a/b,srvdofunc=19,cltstfunc=15,cltdofunc=24)
(clc1=delay until missiles come into existence)

[Frost Nova][Nova][Howl][DiabFire] Release 64 missiles around user with controllable velocity.
(a,srvdofunc=22,cltdofunc=25)
(clc1=missile velocity added to srvmissilea)
(cltcalc1=missile velocity added to cltmissilea)

[Shout][Battle Orders][Battle Commands][Battle Cry][War Cry] Release 64 missiles around user. Useful if you want to use clc1/cltcalc1 without increasing nova speed. Also applies aurastate to user.
(a,srvdofunc=68,cltdofunc=25)
(aurastate=,auralencalc=,aurastat1-6; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied to the user)

[Claws of Thunder] Release 64 srvmissilea in a circle from the selected enemy target. Calc1 increases velocity of missiles, but there does not appear to be a cltside function for this, other cltfuncs with velocity increasers do not seem to sync well. As such, it is recommended that you do not make use of the velocity adder.
(a,srvdofunc=36,cltdofunc=10)
(clc1=adds velocity to srvmissilea)

[ArcaneTower] Releases 64 missiles in a circle but only if you select an enemy; missiles look like they are falling from a height for a distance, then resume their normal travel; produced submissiles are not heightened
(a,srvdofunc=106,cltdofunc=61)

[Blaze][SpiderLay] Releases one missile per tile traveled. Also is an incredibly versatile aurastate, allowing you to control up to 11 different stats at once while duration is active as well as auraevents.
(srv:a,clt:a/b/c,srvdofunc=23; srva must have velocity=0 or it will not spawn; clta/b/c require blaze state to be produced)
(aurastate=state that must be active for missiles to be released; use blaze if you want clta/b/c to work properly)
(auralencalc=length of state)
(aurastat1-6 AND passivestat1-5 are active while the state is active; this is the only non-aura in the game that applies temporary passivestats; this is very fortunate since you might want to use an aurastat-applying missile to the produced missiles, this allows you to counteract stats gained/lost via aurastats with passivestats)
(auraevent1-3,auraeventfunc1-3 can also be enabled for the duration)
(NOTE: the cltside missiles released per tile traveled will only work if the skill ID is within the bits of modifierlist_skill. By default, modifierlist_skill goes up to 9 bits or 511 skills, but you can expand this.)

[Fire Wall] Release two missiles at the target location that travel in opposite directions perpendicular to the user
(srv:a,clt:a,srvdofunc=24,cltdofunc=26)

[Fire Wall] Release two missiles at the target location that travel in opposite directions perpendicular to the user (a) and release one srvside missile at the target location that travels southward (b)
(srv:a,b,clt:a,srvdofunc=24,cltdofunc=26)
(note: monsters are always srv&cltside, so if you spawn an invisible monster that immediately dies, you can have it generate a graphical missile to somewhat make up for the lack of cltside on missileb)

[Fire Wall] Release one srvside missile at the target location that travels southward
(srv:b,srvdofunc=24)

[Blizzard][Meteor] Release a stationary missile at target location
OR
Release a missile at target location that travels southward srvside and toward you cltside
(a,srvdofunc=28,cltdofunc=28)

[Volcano] Creates a srvside missile that travels south from a target location, and two different cltside missiles at the location that target the user
(srv:a,clt:a&b,srvdofunc=123,cltprgfunc1=91)

[DeathMaul] Releases a single srvside missile at the target location that travels south; releases two cltside missiles, (a) one that travels towards the user and (b) one that travels outward from the target location
(srv:a,clt:a&b,srvdofunc=136,cltdofunc=76)

[Phoenix Strike] Release a stationary missile at target location
OR
Release a missile at target location that travels southward srvside and toward you cltside
(a,srvdofunc=40,cltdofunc=14)

[Thunder Storm] User releases stationary missiles periodically. The missilea has troubles producing submissiles/hitsubmissiles, although moltenboulderemerge works great. Notably, if you use Thunder Storm as a chance to cast that isn't in the original ID, then it will only trigger when you satisfy the event (e.g. if you set up a thunder storm derivative that is cast via striking, then it will only release bolts if it triggers the skill again on striking, unless you cast the skill itself, then it will both cast bolts periodically as per expectation as well as when you trigger the event; it also doesn't re-apply the state each time via ctc, it will only trigger the missile release; basically, this is worthless for ctc). Will not work as an aura unless you also have levels in the skill itself.
(a,srvdofunc=29,cltprgfunc1=84)
(aurastate=state that must be active for missiles to be released)
(auralencalc=length of state)
(periodic=1,perdelay=frames between releases)
(par7=radius of targeting)
(note: missiles must be stationary or they deal no damage)
(note: has srvstfunc=13, but it does not seem to be necessary)

[Chilling Armor] User releases a missile when hit by a missile
(a,srvdofunc=18/23/or any other srvdofunc that applies a state)
(aurastate=state that must be active for missiles to be released)
(auralencalc=duration of aurastate)
(aurastat1-5,passivestat1-5 are only active when state is active)
(auraevent1=hitbymissile)
(auraeventfunc1=1)
(auraevent2-3,auraeventfunc2-3 can also be enabled for the duration)

[Amplify Damage] Target releases a missile when hit by a missile
(a,srvdofunc=30/or any other srvdofunc that applies a state to a target, but auras don't seem to work)
(auratargetstate=state that must be active for missiles to be released)
(auralencalc=duration of aurastate)
(aurastat1-5,passivestat1-5 are only active when state is active)
(auraevent1=hitbymissile)
(auraeventfunc1=1)
(auraevent2-3,auraeventfunc2-3 can also be enabled for the duration)


[Corpse Explosion][NihlathakCorpseExplosion][mon death sentry] Consume a corpse srvside&cltside, deal physical/elemental explosion damage and release cltside missiles that travel randomly north, east, south or west
(clt:a&b&c,srvdofunc=55,cltstfunc=21,cltdofunc=23)
(aurarangecalc=radius of explosion)
(searchenemynear=1,selectproc=1,targetcorpse=1)
(clc1=minimum /players1 HP dealt as damage)
(clc2=maximum /players1 HP dealt as damage)
(clc3=percent of physical damage to convert to etype; varies from 0-100%)
(etype=the elemental damage conversion type of the explosion; also applies elen)
(note: to make the corpse disappear, need to also use srvstfunc=17)

[Charged Strike] Multiple zig-zagging missiles launched from target
(a,srvdofunc=11,cltdofunc=19)
(clc1=number of missiles)

[Charged Bolt] Multiple zig-zagging missiles launched from user
(a,srvdofunc=17,cltdofunc=23)
(clc1=number of missiles)

[Poison Explosion] Consume a corpse srvside, releasing 8 velocity-locked srvside missiles in a circle around the corpse (clta&c target the player, cltb is synchronous with srva)
(srv:a,clt:a/b/c,srvdofunc=63,cltstfunc=21,cltdofunc=33)
(searchenemynear=1,selectproc=1,targetcorpse=1)
(note: the produced missiles srva/cltb have a very low, locked velocity that is independent of missiles.txt vel column; setting maxvel and accel in missiles.txt allows you to override this locked velocity)
(note: to make the corpse disappear, need to also use srvstfunc=17)

[Sacrifice] Produces randomized cltmissilea.
(clt:a,cltdofunc=34)
(cltcalc1=randomly selects a missile starting from srvmissilea, with 0 and 1 producing srvmissilea only, 2 producing srvmissilea OR the ID after it, 3 producing srvmissilea OR the ID after it OR the ID after that)

[Blessed Hammer] Releases a spiralling missile that does ~2.5 increasingly large revolutions around the player then stops, starting from the upper left; after stopping, the missile and produced submissiles become cltside only
(a,srvdofunc=73,cltdofunc=35)
(par1=percent of damagepercent that applies only to magic damage added to srvmissilea, including magic damage from the skill/missile as well as the user's magic damage if using srcdam; state that gives the damagepercent must be concentration)
(missiles.txt: EType=; must have an entry here, even a non-existant element works, for par1 to apply to magic damage, regardless of element only magic damage will be modified by par1)

[Fist of the Heavens] Releases a srvside missile from a target that travels south and a cltside missile from a target that targets the user
(a,srvdofunc=80,cltdofunc=36)

[Fist of the Heavens] Releases srvmissilea/cltmissilea on top of the target. Notable because of its interaction with its vanilla missile functions. When the srvmissilea range elapses fully, the damage of that missile will be dealt to the target, as if it were tracking the target. Missile also releases hitsubmissile1 and clthitsubmissile1 when the range runs out, although these do not track the target unlike the direct damage.
(a,srvdofunc=80,cltdofunc=36)
(aurafilter=determines which targets the submissiles can collide with)
(aurarangecalc=determines the radius that targets will be selected within)
(clc4=the number of srvside bolts to release)
(missiles.txt: hitsubmissile1,pclthitfunc=26,psrvhitfunc=22)
(note: for some reason, using the same missile as holy bolt will not allow them to heal, even though holy bolt healing is controlled by missiles.txt; you can however use shout missiles which apply states, which can be set to heal)

[Double Throw] Throws an additional instance of your throwing weapon. If wielding one throwing weapon, will throw that weapon twice. If wielding two throwing weapons, will throw each weapon once.
(srvdofunc=74,cltdofunc=42)
(srvmissile=,cltmissile=; both should be blank, otherwise the inputted missile will replace the throwing weapon's missile, which will not have clc1 damage appended to it)
(weapsel=3, anim=SQ, seqnum=; these settings are needed to make it work, seqnum is your choice)
(clc1=percent damage applied to both instances of your throwing weapon; will not apply if you use a srvmissile)
(toht,levtohit,tohitcalc: unlike arrow skills which pretend to apply attack rating, this will actually append it, applying to both instances of the thrown weapon; just as with damage, replacing one of the instances with any missile will cause it to not gain the attack rating bonus)

[Grim Ward] Consume a corpse to produce a srvmissile that travels directly down and a cltmissile that travels towards the user. Notably, this is the only skill to make full use of srvmissilea/b/c. Will also always produce cltside corpse gibs.
(srvdofunc=75,cltdofunc=41)
(srvmissilea/b/c=,cltmissilea/b/c=; missile selected depends on the size of the corpse, as determined in monstats2.txt by the columns "small" and "large", with small=0/large=0 producing missilea, small=1 producing missileb, large=1 producing missilec; small=1/large=1 results in missilec)
(NOTE: in vanilla, this skill uses srvstfunc=33 and cltstfunc=26 but they don't seem to do anything)

[Quick Strike] Should be deprecated. All it seems to do is break Blood Raven, so that instead of firing raven2 srvside and cltside, she fires raven1 srvside and raven2 cltside. Only fires srvmissilea if you are wielding a bow or crossbow. Decreases quiver quantity. Will only shoot srvmissilea if you select a target. Made even more awkward by the lack of cltside functions.
(srvstfunc=50,srvdofunc=92)
(srvmissilea)

[Firestorm] Release one missile that travels straight, and additional missiles that travel in a zigzaglike pattern
(a,srvdofunc=117,cltdofunc=67)
(clc1=# of missiles to release; 1 releases a single, straight moving missile; any higher number releases #-1 missiles that travel in the zigzaglike pattern that appear in an increasingly large, straight row)

[Rabies] Melee attack applies state to target, making them constantly release missiles at nearby targets
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=duration of spreading and missile release)
(ELen=duration of state and missile release)
(missiles.txt: psrvdofunc=30, param1=frequency of submissile1 release, param2=radius?, submissile1=missile to release)
(note: missile release damage is based on the user's current damage from the skill, while the duration is based on the ELen of the skill when cast)

[Rabies] Melee attack applies state to target, making them constantly release missiles at nearby targets and spread the state to nearby targets
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=duration of spreading and missile release)
(ELen=duration of state and missile release)
(missiles.txt: psrvdofunc=30, param1=frequency of submissile1 release, param2=radius?, submissile1=missile with psrvdofunc=any,psrvhitfunc=53)
(note: missile release damage is based on the user's current damage from the skill, while the duration is based on the ELen of the skill when cast)

[Rabies] Melee attack applies state to target, and attaches a blade creeper missile permanently. The missile is owned by the enemy, so you will get hurt by it.
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=duration of spreading and missile release)
(ELen=duration of state and missile release)
(missiles.txt: psrvdofunc=20)

[Rabies] Melee attack applies state to target, making the target release a missile to the south based on your skill level that is owned by the target (meaning it will damage the user instead of the target)
(srv:a,srvstfunc=57,srvdofunc=121)
(auratargetstate=state that is applied)
(ELen=duration of state; cannot release another missile until the state expires)
(note: missile release damage is based on the user's current damage from the skill, while the duration is based on the ELen of the skill when cast)

[Twister][Tornado] Release multiple missiles with semi-random movement
(a,srvdofunc=118,cltdofunc=68)
(clc1=number of missiles to release)

[GargoyleTrap] Releases a missile only if you cast on an enemy; cannot release missile above or below the user, if it is attempted in this direction then it will choose the nearest possible angle to shoot from; only shoots in ~16 possible directions
(a,srvstfunc=93,cltstfunc=51)

[UnholyBolt][ShamanFire] Releases a missile based on your ID. This works somewhat for players (ama=0, sor=1, nec=2, pal=3, bar=4, dru=0, ass=1). So for example, the amazon and druid will release srvmissilea, the sorceress and assassin will release the missile after srvmissilea, the necromancer will release the missile after that, and so on. This func is responsible for two bugs in vanilla, both likely in part due to the lack of a synchronized cltside function:
(1) Unraveler5 gets SanctuaryCenter instead of another unholybolt, resulting in no damage dealt
(2) Fallen Shamans use shafire1 for cltside, but shafire1-5 for srvside, which have progressively increased speeds, and thus progressively increasing desyncs
(srv:a,srvdofunc=85)

[Imp Fire Missile] Releases a single srvmissilea depending on your ID. See the above function for an explanation. This is different in that it supposedly gets a calc.
(srv:a,srvdofunc=132)
(calc1=range adder; from my testing, this does nothing)

[PrimePoisonNova] Releases one controlled-velocity very slow moving circle of 8 missiles and a second controlled-velocity moderate speed controllable shape of 0-8 missiles. Note that this func overrides missiles in a weird way: param1 of the missile is the "slow drift speed" and param2 of the missile is the "fast drift speed", which allows you to give different velocities to each of the two novas.
(a,cltstfunc=99,cltdofunc=55)
(clc1={subloops? not sure what this does})
(clc2=second controllable circle controller; 0-1=nothing, 2=8 missiles in an octagon, 3=5 missiles in a pentagon, 4=4 missiles in a square, 5=3 missiles in a triangle, 6=3 missiles in a scalene triangle, 7=3 missiles in an acute triangle, 8=2 missiles in a line one going to the northeast and the other to the southwest, 9=2 missiles, one always goes to the north and the other to the southwest, 10-14=2 missiles, one always goes to the southwest and the other is increasingly angled away from the north and closer to the southwest, 15+=1 missile, always goes to the southwest)
(missiles.txt: param1=slow drift speed; param2=fast drift speed)
(note: although vel doesn't do anything, you can change accel and maxvel in missiles.txt to make the missiles move faster)

[DiabWall] Releases multiple semi-zigzagging missiles; sometimes some of the missiles move completely straight depending on angle and number of missiles
(a,srvdofunc=102,cltdofunc=58)
(clc1=number of missiles)

[DesertTurret] Releases multiple missiles in a straight row, with your aim directing only the middle-most missiles creating a bulging effect
(a,srvdofunc=105,cltdofunc=60)
(clc1=number of missiles)

[Vine Attack] Releases multiple zig-zagging srvmissiles at the target location in a circle; and (clta) one straight cltmissile that is always released from the user to the right of the aim and can only move in 9 directions, (cltb) multiple zig-zagging cltmissiles that are released at the target location in a circle
(srv:a,clt:a&b&c&d,srvdofunc=130,cltstfunc=49)
(cltcalc1=number of cltside missiles to spawn; should set cltcalc1=clc1 so that they are synchronized)
(cltcalc2={delay? doesn't seem to do anything}
(cltcalc3={min dist between missiles? doesn't seem to do anything})
(clc1=number of srvside missiles to spawn)
(clc4={unknown, doesn't seem to do anything})
(note: the srvmissilea and cltmissileb are slightly out of sync, with cltb traveling ahead of srva)

[RogueMissile][HireableMissile][MissileSkill1] Releases a single missile only if you are equipping a bow or crossbow; releases nothing if you are not using a bow/crossbow. You must select a target when firing, or the missile will be cltside only.
(a,srvdofunc=110,cltdofunc=66)

[mon inferno sentry][Horror Arctic Blast][FetishInferno][Baal Inferno][MegaDemonInferno] Releases a single srvside missile and two cltsidemissiles which are randomly chosen between cltsidemissilea/b, with one of the cltsidemissiles being randomly staggered. For monsters, releases multiple missiles based on activation frame. To determine missiles released, use this formula: 2+(min(clc2,FramesPerDirection)-FrameData)/clc3, where FramesPerDirection is the monster's setting in animdata and FrameData is the monster's activation frame defined in animdata +1 (i.e. if FrameData000 is active then FrameData=1, if FrameData001 then FrameData=2, if FrameData002 then FrameData=3, etc). The first missile is released upon the animdata activation FrameData, and the last missile is released upon the last frame defined by clc2.
(srv:a,clt:a/b,srvstfunc=53,srvdofunc=95,cltdofunc=54)
(clc1=overrides the range of the missile regardless of what missiles.txt says)
(clc2=fire length; determines the frames that a monster will release missiles for; only starts releasing missiles upon the monster's specific animdata activation frame, but still counts frames before the activation frame; so if a monster has FrameData005 and fire length=15, then it only starts counting from frame 6 as the first activation frame always releases a missile, so only uses frames 6 to 14 since the last frame also always releases a missile)
(clc3=density; how many frames must elapse between missiles released, with 1 being a missile produced every frame, 2 producing a missile every other frame, 3 producing a missile every third frame, etc)
(note: skill level also increases missile range)

[Imp Inferno] Releases a single srvmissile and two cltsidemissiles which are randomly chosen between cltsidemissilea/b; allows for complete clc control over missile range. For monsters:
•At least one missile is always released.
•Skill lvl increases a hidden factor, which makes the monster re-cast an Imp Inferno burst (so if length results in only 3 missiles released in a burst, then the monster will repeatedly cast 3 missiles, pause, cast 3 missiles, pause, etc, until the unknown factor duration runs out).
•The skill lvl also determines the monster's perceived missile range (cltside range, but not the srvside range), such that it will think the missile has a longer range if the skill has a higher lvl, and thus will try and engage a target at a farther distance.
•Each Imp Inferno cast releases a certain number of missiles per burst, with calc1 determining how long each burst is in frames.
•Formula for missiles released seems to be: max(1,2+(clc1-FrameData)/2)
(srv:a,clt:a/b,srvdofunc=126,cltdofunc=71; has srvstfunc=59 by default, but this makes it unusable for players)
(clc1=len; duration of channeling for a monster)
(clc2=range override; ignores missiles.txt)
(note: skill level increases missile range and there is an additional added range at base level, but you can remove this offset by adding -19-24/lvl to clc2) {need to confirm that this is accurate up to a very high value}

[DoomKnightMissile] Monster releases a randomized missile within a defined missile ID range determined by Monstats2.txt S3v column
(a,srvdofunc=148,cltdofunc=94)
(see: https://d2mods.info/forum/viewtopic.php?t=66433)

[NecromageMissile] Monster releases a randomized missile within a defined missile ID range determined by Monstats2.txt S4v column
(a,srvdofunc=149,cltdofunc=95)
(see: https://d2mods.info/forum/viewtopic.php?t=66433)

[DiabLight] Release a missile that appears farther the higher the skill level
(a,srvdofunc=152,cltstfunc=40,cltdofunc=56)
(NOTE: the vanilla skill has srvstfunc=53, which is only necessary for Diablo; if Diablo does not have a skill with srvstfunc=53 in Sk1, then he will get stuck in the sequence and repeatedly cast that skill indefinitely)

[AndrialSpray] Release a desycned srvside and cltside missile; srvside missile is always spawned at the top left, top right, bottom left or bottom right part of the user; srvside missile is always slightly off to the left of the cltside missile. If used propertly (e.g. by a monster with a monseq), then it will release missiles in a spread during the animation, kind of like a Multiple Shot where you are shooting each arrow in each direction yourself.
(a,srvdofunc=88,cltdofunc=48)
(anim=SQ,seqnum=10,seqinput=10)

[Shock Field] Releases multiple missiles to a location in a tight cone that come into existence when they either collide with something or hit their max range; the range is defined by the location the user selects and completely ignores missiles.txt
(a,srvdofunc=43,cltdofunc=5)
(prgcalc1=number of missiles)
(note: due to the way range functions with this skill, it can have very unusual interactions with complex missiles like frozen orb, allowing the number of bolts released to be determined by the distance the player selects)
(note: the submissile placement tends to be all over the place, although mostly in a circle that gathers around the edge of the screen, if you use a missile like frozenorb)

[Blade Fury] Releases srvmissilea only once. If you repeat the cast back-to-back, it will not release again.
(a,srvdofunc=48,cltstfunc=8,cltdofunc=6)

[Claws of Thunder] Release 64/prgcalc1 zigzagging srvmissiles in a circle at the target location or enemy; release 64/prgcalc1 zigzagging cltmissiles in a circle but only if you select an enemy
(a,srvdofunc=37,cltdofunc=11)
(prgcalc1=64/# missiles)

[Fists of Fire][Blades of Ice] Releases an explosion with a controlled radius at the target location; also releases cltmissiles within that radius of an equal density
(clt:a,srvdofunc=38,cltdofunc=9)
(prgcalc1=radius of explosion and cltmissile release)

[Fists of Fire][Blades of Ice] Releases a missile within a controlled radius at the target location; clt and srv spawn locations are not synchronized; clt targets the player; srv travels south of the spawn location at a slight angle
(a,srvdofunc=39,cltdofunc=9)
(prgcalc1=radius of missile release)

[Phoenix Strike] Releases a 64/prgcalc1 srvmissiles that do repeated figure-8s/serpentine movement with changing direction at the target location or enemy; does the same for cltmissiles, but only if you select an enemy target
(a,srvdofunc=143,cltdofunc=83)
(prgcalc1=64/# missiles)

[Phoenix Strike] Releases prgcalc1 missiles at the target location that move away from the location in a semi-random straight direction; clt and srv are completely out of sync
OR
Release prgcalc1 missiles at the target location that do circular loops and occasionally dive in toward the target location
(a,srvdofunc=41,cltdofunc=15)
(prgcalc1=number of missiles to release)
(missiles.txt: pcltdofunc=58,psrvdofunc=35; required if you want it to do loops)

[Hurricane] Applies aurastats. Releases 6, evenly spaced streams of cltmissile generation at a constant distance around the player; cltmissiles are generated on random z-heights.
(clt:a&b&c,srvdofunc=any that can apply aurastate)
(aurastate=any state that has the proper settings)
(states.txt: active=1,setfunc=7,remfunc=4,cltactivefunc=90,srvactivefunc=145)
(cltcalc1=the number of cltmissiles to spawn per stream per frame)
(cltcalc2=the maximum z-height of the spawned cltmissiles)
(srvdofunc=124,resultflags=1; required to deal explosion damage)
(aurastate=,auralencalc=,aurastat1-6=; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied)
(param4=frame delay between state's srvactivefunc activations; only seems to work periodically with srvactivefunc=145 and srvactivefunc=146)
(par3=explosion radius)
(par4=frames that must pass for an explosion to be released)

[Armageddon][Diablogeddon] Applies aurastats. Srvside missiles are released randomly within radius, traveling southward and trajectories that are slightly angled; cltside missiles are released randomly within radius at a heightened z-level that returns to ground after a bit, traveling in straight, semi-random directions away from the player
(srv:a,clt:a&b,srvdofunc=124,cltdofunc=92)
(aurarangecalc=radius to create missiles within; no missiles are released if set to 0)
(cltcalc1=frames it takes for the cltmissile to hit ground level)
(cltcalc2=z-velocity at which cltmissile falls to ground level)
(cltcalc3=y-velocity at which cltmissile falls from the right of the screen)
(aurastate=,auralencalc=,aurastat1-6=; aurastate determines the state applied, auralencalc is the length of the state, all aurastats are applied)
(param4=frame delay between state's srvactivefunc activations; only seems to work periodically with srvactivefunc=145 and srvactivefunc=146)
(par4=frames that must pass for a missile to be spawned; can be set to 0 which may or may not be the same as 1)

[Blaze] This describes Blaze's missile producing behavior. Does not require an exact srvdofunc, rather it is based on the state being applied by a skill.
(srvmissilea,cltmissilea,cltmissileb,cltmissilec; these missiles must have velocity=0 or they will not spawn)
(NOTE: the cltside missiles released as you move with Blaze will be limited by skill ID up to 511 with vanilla stat settings. If you want to increase this, change modifierlist_skill send bits from 9 to 15)

[] produce cltside missiles at the location, increasing with radius, that target the player
(clt:a,cltdofunc=30)
(aurarangecalc=radius missiles are spawned within)

[] release a cltside missile from the player at the start of the animation
(clt:c,cltstfunc=18)

[] release a random-ID cltside missile; missile is released either behind yourself, or 45 degrees to the left or right of behind yourself
(clt:a,cltdofunc=34)
(cltcalc1=#; add the number to the missile ID of cltmissilea and it will randomly select a missile ID between cltmissilea and cltmissilea+#)

[] releases randomly placed cltside missiles around the player that target the player via a state
(clt:a)
(aurarangecalc=radius that missiles will appear within)
(aurastate/auratargetstate/passivestate=missiles are only released while active)
(auralencalc=duration of aurastate/auratargetstate)
(states.txt: cltactivefunc=86)

[] Release a single cltside missile on first use, then release many on subsequent uses; only allows release in 9 directions and continues to release in a given direction if the user has used in that direction recently
(a,cltdofunc=49,cltprgfunc=93)
(anim=SQ, seqnum=6, seqinput=10)

[Dragon Tail] Release a single cltsidemissile that targets the player and a kick explosion if you are within melee range. Does not release srvmissilea.
(clt:a,srvstfunc=27,srvdofunc=50,cltstfunc=9,cltdofunc=7)
(aurarangecalc=radius of explosion)
(clc1=percent kick damage)

[Raise Skeleton] Release a single cltsidemissile from a corpse that targets the player
(clt:a,cltstfunc=20,cltdofunc=31)
(searchenemynear=1,selectproc=2,targetcorpse=1)

[Mind Blast] Releases cltmissiles at the target location, with radius (but not number) of cltmissiles being controlled
(clt:a,cltdofunc=8)
(aurarangecalc=radius cltmissiles are spawned within)

[Vine Attack] Spawns multiple srvmissilea and cltmissileb, varying based on calc1, at a target location. The missiles travel in a vein-like pattern. Cltmissilea is released southward from the user. Cltmissilec is only produced if used by a pet, constantly producing the missile as it moves. Cltmissiled is only produced if used by a pet, producing the missile when it is neutral.
(srv:a,clt:a,b,c,d;srvdofunc=130,cltstfunc=49)
(calc1=# missiles; how many missiles to release at the target location)
(calc4=frames to apply aura to target; likely defunct, originally this skill probably applied spidergoo, which applies an aurastate, but it is not set up like that in vanilla)

[Lightning Strike] Missile launched from target locks onto nearby target
(a,srvdofunc=14,cltdofunc=22)
(clc1=radius of target searching; if radius=0, then it will not release a missile; if radius=1+, it will search for a nearby enemy, and if none are within radius, then it will target the user; automatically applies aurafilter=524288 which precludes targets with the 'justhit' state)
(clc2=number of hits; only relevant if you are using missiles.txt: pclthitfunc=16,psrvhitfunc=12)

[Chain Lightning] Releases a missile that targets a nearby enemy after hitting an enemy, but only if you are using the proper functions. Otherwise, it releases a single missile.
(a,srvdofunc=26,cltdofunc=27)
(clc1=number of hits; only relevant if you are using missiles.txt: pclthitfunc=16,psrvhitfunc=12)
(aurarangecalc=search radius for nearby enemy after hitting a target; automatically applies aurafilter=524288 which precludes targets with the 'justhit' state)

[Chain Lightning] If not selecting a target, releases a missile that targets a nearby enemy after hitting an enemy, but only if you are using the proper functions. Otherwise, it releases a single missile. If selecting a target, the missile is released on top of the target.
(srv:a,srvdofunc=151,cltdofunc=96)
(clc1=number of hits; only relevant if you are using missiles.txt: pclthitfunc=16,psrvhitfunc=12)
(aurarangecalc=search radius for nearby enemy after hitting a target; automatically applies aurafilter=524288 which precludes targets with the 'justhit' state)

[quick strike] {Unknown purpose, does not seem to work with players. Doesn't seem to do anything special either.} Releases srvmissilea and a cltside fire arrow.
(a,srvstfunc=50,srvdofunc=92)

[Baal Cold Missiles] Releases a single missile that generates two submissiles every frame, the submissiles move perpendicular to the main missile
(a,srvdofunc=139,cltdofunc=81)
(missiles.txt: pcltdofunc=52,psrvdofunc=31,submissile1/cltsubmissile1=released in an arrow formation)

[Wake of Destruction Sentry] {Appears to behave exactly the same as Baal Cold Missiles} {???}
(a,srvdofunc=125,cltdofunc=70)
(missiles.txt: pcltdofunc=52,psrvdofunc=31,submissile1/cltsubmissile1=released in an arrow formation)
Last edited by Cypress on Fri Jul 12, 2024 10:42 pm, edited 141 times in total.

User avatar
k0r3l1k
Moderator
Angel
Posts: 631
Joined: Sun Sep 09, 2007 3:11 am
Location: Arizona, Prescott
United States of America

Re: The Guide to Almost All Missile Functions

Post by k0r3l1k » Sat Apr 03, 2021 4:21 am

Very impressive compilation.


Big props friend.
Image

qwertyue
Posts: 11
Joined: Sun Jan 31, 2021 5:41 am

Re: The Guide to Almost All Missile Functions

Post by qwertyue » Wed Jul 27, 2022 4:12 am

Do you have any missile records about frozen orb?

I found that the frozen orb nova produced by the collision between the frozen orb and the monster seems to be only animation without damage?

thereaverofdarkness
Posts: 30
Joined: Tue Mar 15, 2022 8:13 am

Re: The Guide to Almost All Missile Functions

Post by thereaverofdarkness » Wed Jul 27, 2022 4:36 pm

I need to figure out what makes poison explosion and plague javelin so different; their missiles are virtually identical, yet plague javelin creates a MUCH larger effect!

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Sat Apr 15, 2023 2:47 pm

Ran out of space.

---

[DOFUNC MISSILES]

[arrow][javelin]etc etc. A basic, simple missile. Use this if you want to make a missile with no special tricks.
(pcltdofunc=1,psrvdofunc=1)

[poisonjav] Releases directionless submissiles as it moves.
(pcltdofunc=3,psrvdofunc=2)
(srvcalc1/cltcalc1=; {subloops})
(submissile1/cltsubmissile1=)

[bat lightning bolt] Releases directionless submissiles as it moves.
(pcltdofunc=8,psrvdofunc=9)
(cltparam1=; {supposedly subloops})
(submissile1=)
(cltsubmissile1=)

[diabwallmaker] Releases directionless submissiles as it moves.
(pcltdofunc=16,psrvdofunc=12)
(submissile1=)
(cltsubmissile1=)

[moltenboulder] Missile subreleases submissile1 and cltsubmissile1-3; missile numbers depends on the distance traveled (meaning velocity, acceleration and range all scale the number) as well as the direction you aim, with straight up or down reducing the missile count most significantly
(pcltdofunc=47,psrvdofunc=6)
(submissile1=)
(cltsubmissile1-3=)

[firestormmaker] Releases submissile1 and cltsubmissile1/2/3 as it travels. Not that interesting unless used by Firestorm.
(pcltdofunc=6,psrvdofunc=23)
(submissile1=)
(cltsubmissile1-3=)

[fingermagespider] A missile that tracks a selected target. Will keep tracking the target endlessly if collidekill=0. If the user moves, the missile will lose track of its target, running off into its current direction. Note that ANY skill that selects a target will re-select the tracked target for ALL missiles with this function.
(pcltdofunc=15 OR pcltdofunc=14, psrvdofunc=11)
(param1/cltparam3=repath frame; how many frames must elapse for it to re-select the current target)
(param2/cltparam4=activation distance; the radius from the user in which the missiles can be given a new target, any missiles outside of this radius will keep repathing to their current target rather than the new target you selected)
(param3/cltparam5=delta; {???})
(cltparam1={probably subloops related})
(cltparam2={probably subloops related})
(skills.txt: needs to be created by cltmissilea, with cltdofunc=57 or cltdofunc=18, otherwise the cltside will bug out; pcltdofunc=14 doesn't have this issue, allowing you to create a fingermagespider with only psrvdofunc and pcltdofunc, but loses the trailing graphics)

[guidedarrow][bonespirit] Required for guided missile to retarget.
(pcltdofunc=7,psrvdofunc=7)
(param1/cltparam1=retarget frame; {test})
(param2=retarget radius; {test; is there a cltparam?})


[frozenorb] Creates one initial submissile1/cltsubmissile1 in a south-east direction regardless of range. When param1/cltparam1 frames elapse, release another submissile1/cltsubmissile1.
(pcltdofunc=19, psrvdofunc=15)
(param1,cltparam1=frequency of submissile1/cltsubmissile1; value of 0 and 1 are identical, no known limit to higher value frequencies; produces (('range'-1)/'param1')+1 submissiles)
(param2,cltparam2=direction increment of submissile1/cltsubmissile1; valid values range from -63 to 63; determines the direction the submissile goes; increments in a CLOCKWISE direction; if value is NEGATIVE, discard total increment after each submissile, such that only two directions are ever used; if value is POSITIVE, add and store increment direction, such that up to 64 different directions can appear)
(submissile1/cltsubmissile1=missile to release on cast; and periodically based on param1, direction based on param2)

[frozenorbnova] The spiralling effect of frozen orb's nova, changes the direction of missiles produced as hitsubmissiles. {Does not appear to work with submissiles and skills.txt produced missiles, did not test thoroughly}
(pcltdofunc=20, psrvdofunc=16)
(param1/cltparam1=frames; how many frames+1 must elapse for the missile to change its direction; at minimal frequency, the lowest effective value of this is 3)
(param2/cltparam2=frequency; )

Code: Select all

 number of direction changes → current direction
0 → S (initial missile direction is South)
1 → SW
2 → W
3 → NW
4 → N
5 → NE
6 → E
7 → SE
8 → N (slightly angled W)
9 → S (slightly angled E)
10→ N (slightly angled W)
11→S (slightly angled E)
12→N (slightly angled W)
{...??? need to make a custom missile graphic with an obvious image for each precise direction}
[volcano] Missile subreleases submissile1/cltsubmissile1; radius and rate of fire is controlled by skills.txt. The submissiles are given a randomized point within the radius to move toward, and their velocity is changed such that no matter how far it is, it will always run out of range when it reaches the randomized point (and if the point is the same as the missile, then it won't move at all, remaining stationary until its range elapses). This is the only missile function in the game that has randomized missile release from a single point; additionally, it is unique in that the randomized missiles can move (in all other cases, the missiles are set to be stationary since they will always move directly downwards: see Blizzard and Fissure).
(pcltdofunc=50)(psrvdofunc=28)
(param1/cltparam1=damage frequency; how many frames must elapse for another submissile to be released)
(param2/cltparam2=radius; radius to lob submissiles within)
(param3/cltparam3=start frame; will start lobbing submissiles after this start frame is reached {confirm if it is after or at the start frame})
(param4/cltparam4=end frame; will stop lobbing submissiles after the end frame is passed {confirm if it is after or at the end frame})
(param5/cltparam5=lob; {???})
(submissile1/cltsubmissile1=release based on params)
(aurarangecalc=radius of submissile release)
(clc4=frames that must pass for another submissile to be released)

[tornado] Missile releases explosions; radius, target selectivity and rate is controlled by skills.txt (or can be controlled by missiles.txt param1/2 if desired, with param1=frequency and param2=radius)
(psrvdofunc=27)
(aurafilter=selects targets to be hit by explosion)
(aurarangecalc=radius of explosions released)
(clc4=frames that must pass for another explosion to be released)

[monblizcenter] Releases submissile1 and cltsubmissile1 & cltsubmissile2 within a radius every time the frequency elapses. Has a different spawning pattern when compared to blizzardcenter and erruption center, and releases submissiles with an offset of -1, such that with freq=10 and range=10, it will release two missiles, whereas blizzardcenter and erruption center will release only one missile.
(pcltdofunc=10, psrvdofunc=8)
(param1&cltparam1=base radius; radius that submissiles are released within; {scales with skill level based on par3 somehow, don't know the formula})
(param2&cltparam2=base freq; how many frames must elapse for another submissile to release; {scales with skill level based on par3 somehow, don't know the formula})
(param3&cltparam3=level divisor; determines how levels modify the radius and frequency; {actual formula unknown})

[blizzardcenter] Missile subreleases submissile1 and cltsubmissile1/cltsubmissile2 over clc1 radius every time clc2 frames elapse
(pcltdofunc=13,psrvdofunc=10)
(submissile1=)
(cltsubmissile1,cltsubmissile2=)
(clc1=radius over which submissiles are spawned)
(clc2=frames that must pass for another submissile to spawn; at least 1 submissile always spawns)

[erruption center] Missile subreleases submissile1 and cltsubmissile1/cltsubmissile2 over clc1 radius every time clc2 frames elapse {how is this different from blizzardcenter? seems identical srvside, even the semi-random spawning pattern is identical. the cltside funcs are different at least and they synchronize, so you can freely swap cltdofuncs betrween blizzardcenter and erruption center}
(pcltdofunc=48,psrvdofunc=25)
(submissile1=)
(cltsubmissile1,cltsubmissile2=)
(clc1=radius over which submissiles are spawned)
(clc2=frames that must pass for another submissile to spawn; at least 1 submissile always spawns)

[blade shield attachment] Missile must be present for Blade Shield to function; only required missile column is that it has pcltdofunc=57. Note that if you use cltsubmissile1, then it attaches a missile to you that spawns circling (ala Blessed Hammers) cltsubmissile1. These cltsubmissile1 missiles are released until the range expires. Looks cool, but it is unfortunately cltside-only.
(missiles.txt: pcltdofunc=57)
(srvstfunc=28,srvdofunc=54)
(srvmissilea=missile with pcltdofunc=57)
(aurafilter=determines the targets for blade shield to attack)
(aurastate=state required for blade shield to attack)
(auralencalc=duration of state)
(periodic=1;perdelay=frames that must pass for another attack)

[grimwardmediumstart][grimwardsmallstart][grimwardlargestart] Spawns a hitsubmissile1 with a calc-controlled duration. This is interesting in that it defines the duration not of itself, but of the missile it creates, allowing you to stack this duration controller with most other hitfuncs.
(pclthitfunc=29, psrvhitfunc=26)
(s.hitpar1/chitpar1=frames of hitsubmissile1 duration; if =0, then use calc1 of skill instead to define duration)
(hitsubmissile1/clthitsubmissile1=missiles produced)
(skills.txt calc1=number of frames missile lasts if s.hitpar1/chitpar1 are =0)

[grimwardmedium][grimwardsmall][grimwardlarge] A missile that casts a skill periodically, making it act kind of like a pet or a pet with an aura.
(psrvdofunc=14)
(param1=repeat frame; determines how often the skill func is used)
(param2=skill func; defines the srvdofunc used by the grimward)

Code: Select all

Useful grimward srvdofuncs:
srvdofunc=6, inner sight & slow missiles
srvdofunc=20, static field (lets missiles explode into static field damage)
srvdofunc=30, curses (this is what grim ward uses by default; lets a missile apply up to 6 aurastats within a defined radius)
srvdofunc=47, cloak of shadows (allows a missile to blind targets within a radius and applies up to 6 aurastats; lets you cast cloak of shadows without the annoying delay)
srvdofunc=51, mind blast (lets a missile deal damage in a radius, apply random knockback and apply conversion)
srvdofunc=61, confuse (lets a missile confuse enemies in a radius)
srvdofunc=65, many auras (lets a missile produce an aura; DO NOT USE AN AURASTATE, ONLY AN AURATARGETSTATE, missile will cause a crash if you try to give it an aurastate)
srvdofunc=71, taunt (lets a missile taunt targets, note that the grimwardmissile itself doesn't move even if you apply velocity, but you could make it so a missile produces a bunch of short-lived grimwardmissiles in a row in sequence, so that it lures enemies in the given direction)
srvdofunc=112, moncursecast
[grimwardscare] {}

[vines][plague vines] Missile that subreleases another submissile1/cltsubmissile1 each time param1/cltparam1 frames elapse; submissile1 is released southward; cltsubmissile1 only exists if its velocity=0
(sub1,pcltdofunc=49,psrvdofunc=26)

[lightingtrailjavelin][advlighttrailingjav] The do func of the unused light javelins. Releases submissile1/cltsubmissile1 as the missile moves, not based on total distance traveled, but rather based on some unknown frame delay. Releases two submissiles per delay which travel in opposite directions, perpendicular to the main missile.
(pcltdofunc=46,psrvdofunc=22)
(param1/cltparam1=subloops; {???})
(submissile1,cltsubmissile1=missiles to be released; released over time, not based on total distance traveled)

[blade creeper] Makes the user automatically hit nearby targets. The missile seems to automatically travel with the user, unless you travel through a waypoint or portal. Uniquely, this dofunc can release hitfuncs infinitely. {Does psrvhitfunc=37 even do anything? Makes this a useful target for all sorts of hybridization behaviors.}
(pcltdofunc=43,psrvdofunc=20,psrvhitfunc=37)
(size=; determines the radius to hit monsters within)
(srcdam=,mindam/maxdam,etype,emin/emax,elen; these are all applied to each hit)

[blade creeper][catapultchargedball on][catapult spike ball on][catapult cold ball on][catapult plague ball on][catapult meteor ball on] Makes a missile appear to travel with the user, fairly useful as far as cltside functions go.
(pcltdofunc=43)

[brdeathcontrol] Produces cltsubmissile1 randomly around the user.
(pcltdofunc=21)
(cltparam1=radius; {not really sure what it does, but it definitely does something}, crashes if the value is too large)
(cltsubmissile1=; only seems to work if the cltsubmissile1 has pcltdofunc=1)

[brdeathlightningbolt] Only seems to randomly move around if produced as cltsubmissile1 from a missile with pcltdofunc=21.
(pcltdofunc=22)
(cltparam1=retarget frame; how many frames must elapse for it to randomly change direction)
(cltsubmissile1=)

[denofevillight] Produces a missile that exists indefinitely cltside, so long as you do not return to Town.
(pcltdofunc=23)

[towermist] Produces a missile that releases cltsubmissile1 all around itself.
(pcltdofunc=25)
(cltparam1=dest radius; controls the range cltsubmissile1 will travel)
(cltparam2=init radius; controls the distance from the missile that cltsubmissile1 will be spawned from)
(cltparam3=frequency; number of frames that must pass for another cltsubmissile1 to be released)
(cltsubmissile1=)

[mephistodeathcontrol]
(pcltdofunc=26)
(cltparam1=firewall frequency; how many frames must pass for another cltsubmissile1 to be released)
(cltparam2=rock frequency; how many frames must pass for another cltsubmissile2 to be released)
(cltparam3=radius; seems to control the total range of cltsubmissile1, causes a crash if the value is too high)
(cltsubmissile1=controlled by cltparam1 and cltparam3)
(cltsubmissile2=controlled by cltparam2; lobbed out in the Z-direction and collides with the ground; how high it goes is probably controlled by the cltsubmissile2's range)

[mephistofirewallmaker][andyfirewallmaker] Only seems to work if spawned as a cltsubmissile of a different missile (not thoroughly tested).
(pcltdofunc=27)
(cltparam1=how many frames must pass for cltsubmissile1 to randomly change directions)
(cltsubmissile1=)

[mephistodonotdraw] Spawns 4 cltsubmissile1. They will be spawned in a similar way as Teeth or Multiple Shot, but they can only be released in 8 equally spaced directions and the cltsubmissiles themselves will have randomized apparent directions despite all moving in the same direction.
(pcltdofunc=28)
(cltparam1=activation frame; the frame at which the four cltsubmissile1 will be released; if it exceeds the range, then it doesn't happen)
(cltsubmissile1=)

[horadricstaff] Hardcoded. Allows ID=338 to produce the Horadric Staff graphics.
(pcltdofunc=31)

[towerchestspawner] Releases cltsubmissile1 in random directions (not synchronized with the gold dropping outside of the delay which can easily be controlled by other means, hence why I've separated it from psrvhitfunc=33).
(pcltdofunc=30)
(cltparam1=start delay; cltsubmissile1 only starts being produced after this time runs out, in frames)
(cltparam2=spawn interval divisor; spawns slower the higher the number is)
(cltparam3=radius; {doesn't seem to do anything})
(cltsubmissile1=)

[cairnstones] Spawns a portal to a level and creates a bunch of missiles randomly within the defined radius over the range of the missile.
(pcltdofunc=24,psrvdofunc=17,psrvhitfunc=32)
(param1/cltparam1=fade frames; {???; seems as if it skips the number of frames entered})
(param2/cltparam2=lightning delay; how many frames must elapse for another submissile1/cltsubmissile1 to be released)
(param3/cltparam3=radius to randomly produce submissile1 within; srv and clt does not seem to be synchronized)
(param4=destination level; chooses a level from levels.txt and creates a portal to it; crashes if the portal leads to a level from a different act)
(param5=portal delay; number of frames that must elapse for the portal to spawn)
(cltsubmissile1/submissile1=missiles to spawn within param3 radius every param2 frames)

[durieldeathcontrol] Produces screen shaking, and the missile durieldeathrock. {Also produces some kind of explosion, don't care enough to check which one it is.} Modifying the range makes it produce the missiles for longer, although the screen shaking will only occur towards the end of the range.
(pcltdofunc=36)

[diablo appears] Shakes the screen for a fixed duration towards the end of the range. Also causes the "Not even death can save you from me" line to play.
(pcltdofunc=37)

[izual control] Rapidly spews out izual mist loop and izual mist fade. Also allows you to control when it starts and stops spewing out izual lightning and izual lightning trail.
(pcltdofunc=42)
(param1=lightning start; determines the frame in which it starts spewing izual lightning)
(param2=lightning stop; determines the frame in which it stops spewing izual lightning)

[distraction] An extremely useful and unique missile function. Functions like Blaze, but does not depend on a skill nor a state. Creates some kind of missile that follows you around (it's invisible), producing submissile1 as you move. There does not appear to be a limit to the number of these you can have following you at once. Only seems to disable itself if town=0 and you go to town. {The cltside graphics do not seem to function at all.}
(pcltdofunc=44,psrvdofunc=21)

[distraction fog] Creates clthitsubmissile1, which seem to spawn distributed along west/east/north/south, but also spaced apart if on a given direction.
(pcltdofunc=45)
(cltparam1=spawn rate; determines how many frames must pass for another clthitsubmissile1 to spawn, seems to have a global timer instead of being relative to the initial missile appearance)
(cltparam2=number; determines how many clthitsubmissile1 are produced per spawn)
(cltparam3=radius; {???})

[anya center] Shakes the screen. Hardcoded to only produce a few specific ID missiles.
(pcltdofunc=54)

[world stone chip 1][world stone chip 2][world stone chip 3][world stone chip 4] {Doesn't seem to do anything special, probably only functions right when produced in the Worldstone Chamber}
(pcltdofunc=59)

[bonewallmaker] See The Guide to Almost All Non-Missile Skill Functions under Bone Wall.

[tigerfury] Cltside produces a trail of clthitsubmissile1. Srvside does not seem to do anything {???}
(pcltdofunc=53, psrvdofunc=32)

[ancient death center] Produces ancient death cloud around itself.
(pcltdofunc=55)

[baalfx spirit 1][baalfx spirit 2][baalfx spirit 3][baalfx spirit 4][baalfx spirit 5] {probably specially called by baalfx control} {???}
(pcltdofunc=65)

[nehlithakcontrol] Controls the whirlwind/fissure thing that Nihlithak produces on death.
(pcltdofunc=62)

[nehlithakswoosh][nehlithakdebris1][nehlithakdebris2][nehlithakdebris3][nehlithakdebris4] {???}
(pcltdofunc=63)

[baal taunt control] The only missile in the entire game that creates all submissiles, randomly selecting between submissilea/b/c. Also has a built-in delay before it starts firing, as well as allowing you to control the frequency of submissilea/b/c production. Note that if param2/3/4=0, then that submissile and all following submissiles will not be selected. Also automatically explodes submissiles to release their hitsubmissiles: even Frozen Orb will immediately spawn as an ice bolt nova, despite usually only expiring by range.
(pcltdofunc=56, psrvdofunc=34)
(param1,cltparam1=initial delay; how many frames must pass before a submissile is released)
(param2,cltparam4=missile 1 delay; how many frames must pass per submissile release)
(param3,cltparam4=missile 2 delay; how many frames must pass per submissile release)
(param4,cltparam4=missile 3 delay; how many frames must pass per submissile release)

[royalstrikechaosice] If used without srvdofunc=41, then it releases a missile straight south. With srvdofunc=41, it produces a defined number of missiles which can have definable, changing paths.
(pcltdofunc=58, psrvdofunc=35)
(param1/cltparam1=repath freq; how many frames must pass before the missile changes paths)

[baal cold maker][wake of destruction maker] Missile subreleases 2x submissile1/cltsubmissile1 in the opposite direction as it travels; the number of missiles released is based on the total distance travelled, so if you make the missile faster or shoot it at the proper angles, then it will produce more missiles. If used with srvdofunc=139,cltdofunc=8 then it will form an arrow-like stream instead of a compact stream.
(pcltdofunc=52, psrvdofunc=31)
(submissile1/cltsubmissile1=)

[rabiesplague] {not sure how it works with proper rabies functions}
(psrvdofunc=30)

[rabiesplague] This missile behaves strangely when cast by Fist of the Heavens. It attaches a missile to the user for as long as range, and the missile cannot be destroyed by normal means like by collision death. As such, it will produce hitfunc effects repeatedly over its duration. The submissile1 it produces will be cast by the target on the user every param1 frames, meaning this can kill the user.
(psrvdofunc=30; psrvhitfunc can be released every frame)
(param1=frequency; how many frames must elapse before another submissile1 is released)
(param2=radius; seems non-functional when used with non-rabies functions)
(submissile1=missile is released by the target every time param1 elapses)
(skills.txt: srvdofunc=80, srvmissilea)

[hurricaneswoosh][hurricanecart][hurricanerock][hurricanesack][hurricanetree][hurricanevase] {Seems worthless unless used with Hurricane.}
(pcltdofunc=60)

[recycler delay] A missile that is more like a skill than a missile. Lets you rejuvenate a defined % of max life after a delay.
(psrvdofunc=29)
(param1=active frame; determines when the life rejuvenation applies)
(skills.txt: calc1=life steal; determines the % of max life gained)

[recycler delay][vine recycler delay] The cltside part of the recycler delays. Makes the user invisible (except for their shadow) and releases missiles.
(pcltdofunc=51)
(cltparam1=launch vines frame; determine when cltsubmissile1 is released)
(cltparam2=active frame; determine when cltsubmissile2 is released)
(cltparam3=extra vines; determines how many cltsubmissile1 should be released)
(cltparam4=vine radius; determines the radius in which cltsubmissile1 will spawn)
(cltsubmissile1=missile is released after cltparam1 elapses)
(cltsubmissile2=missile is released after cltparam2 elapses)

[vine recycler delay] A function that is more like a skill than a missile. Lets you rejuvenate a defined % of max mana after a delay.
(srvdofunc=33)
(param1=active frame; determines when the mana rejuvenation applies)
(skills.txt: calc1=mana steal; determines the % of max mana gained)

[ProcessMissileDelayed]
(pcltdofunc=67, psrvdofunc=37)
(param1=frames until submissile1 release)
(param2=frames until submissile2 release)
(param3=frames until submissile3 release)
(cltparam1=frames until cltsubmissile1 release)
(cltparam2=frames until cltsubmissile2 release)
(cltparam3=frames until cltsubmissile3 release)
(submissile1,submissile2,submissile3=submissiles are released after respective param# delays)
(cltsubmissile1,cltsubmissile2,cltsubmissile3=cltsubmissiles are released after respective cltparam# delays)

---

[HITFUNC MISSILES]

[fireball][vampirefireball][explodingarrowexp2][freezingarrowexp3][desertfireball][impfireball][sucfireball] Releases radial damage, the radius of which can be controlled by calc1. Adds your elemental weapon damage to radial damage based on SrcDam and the Etype: only the elemental damage matching the missile's Etype will be added as radial damage, all other elements and physical damage will be ignored.
(psrvhitfunc=1)
(s.hitpar1=radius of damage; if =0, then uses skills.txt calc1 to determine radius)
(hitflags=; must include setting of 1 or won't deal radial damage, typically set to 1+4=5)
(srcdam=percentage of elemental weapon damage to add to radial damage)
(EType=the element to modify the damage of; note that this will ALWAYS uses the missiles.txt EType, never the skills.txt EType. Which means that you can choose to make it deal multiple elements, for example fire damage added by skill and cold damage added by weapon)

[oilpotion][explosivepotion][fulminatingpotion][bomb on ground] Releases radial damage, with a radius based on s.hitpar1 or the skill's aurarangecalc. Adds full weapon damage.
(psrvhitfunc=3)
(s.hitpar1=radius of damage; if =0, then use skill's aurarangecalc setting)
(hitflags=; must include setting of 1 or won't deal radial damage, typically set to 1+4=5)
(srcdam=percentage of weapon damage to add to radial damage)

[explodingjavalin][ice javalin] Explodes within a defined radius, dealing srcdam+dmg+elemdmg within the radius. Seems like a less weird, more generally useful moltenboulder. Highly useful if you want to add Melee Splash to your mod without using nextdelay (which I recommend, since nextdelay should be disused as often as possible).
(psrvhitfunc=44)
(s.HitPar1=damage radius; only functions if resultflags=5)
(skills.txt: aurarangecalc=radius of explosion)

[glacialspike][monglacialspike] Missile deals damage with a radius explosion instead of by collision with a specific target; explosion radius is controlled by skills.txt.
(pclthitfunc=14,psrvhitfunc=13,resultflags=5)
(s.Hitpar1=radius of explosion; if set to 0 then skills.txt aurarangecalc is used instead)
(s.Hitpar2=freeze length; if set to 0 then skills.txt auralencalc is used instead)

[armageddoncontrol][diablogeddoncontrol] Has an explosion radius and produces hitsubmissile1.
(psrvhitfunc=56)
(s.HitPar1=damage radius; radius of explosion)

[meteorcenter] Missile subreleases hitsubmissile1 and simultaneously subreleases clthitsubmissile1-4; also subreleases an explosion which is controlled by skills.txt. Can deal radial srcdam
(pclthitfunc=18,psrvhitfunc=14)
(skills.txt: aurarangecalc=radius of explosion)
(s.Hitpar1=radius of explosion; if set to 0 then skills.txt aurarangecalc is used instead)
(hitflags=; must include setting of 1 or won't deal radial damage, typically set to 1+4=5)
(srcdam={})
(srvhitsubmissile1={})
(clthitsubmissile1={})
(clthitsubmissile2={})
(clthitsubmissile3={})
(clthitsubmissile4={})

[moltenboulder] Missile releases 18 hitsubmissile1 and clthitsubmissile1-3 within a defined, unchangeable radius; also releases explosion damage radius controlled by skills.txt; missile also always pierces size 1 and 2 units and always explodes on collision with size 3 units and units that are immune to knockback. It can deal weapon damage over its explosion radius (which won't apply any attack/striking/hit effects), which is highly useful.
(srvhit=1,clthit=1&2&3,pclthitfunc=52,psrvhitfunc=47,resultflags=5)
(skills.txt: aurarangecalc=radius of explosion damage)

[immolationarrow] Missile subreleases hitsubmissile1 and clthitsubmissile1-3 in a radius and an explosion; radius of hitsubmissiles and explosion are controlled by skills.txt
(srv:hit1,clt:hit1&2&3&4,pclthitfunc=12,psrvhitfunc=9,resultflags=5)
(skills.txt: clc1=radius hitsubmissiles are spawned within)
(skills.txt: clc2=radius of explosion)

[plaguejavelin][chokinggaspoition][stranglinggaspotion][catapult plague ball][plaguejavelin2] Missile releases one bunch of hitsubmissile1 based on hitpar1 and another bunch of hitsubmissile1 based on hitpar2. Hitsubmissile1 velocity will be set to 0 and is expected to be increased by the hitsubmissile1 dofunc, so this is awkward for most missiles.
(pclthitfunc=2, psrvhitfunc=2)
(s.hitpar1/chitpar1=ring 2 density; produces ~16/x hitsubmissiles, see code below)
(s.hitpar2/chitpar2=ring 1 density; produces ~16/x hitsubmissiles, see code below)
(s.hitpar3/chitpar3=subloops; {presumed cltside only})
(hitsubmissile1/clthitsubmissile1=missile variably produced by both s.hitpar1 and s.hitpar2; {missile needs special settings otherwise it will be stationary})

Code: Select all

S.hitpar1 or S.hitpar2→Number of Missiles that result
1→15
2→8
3-4→5
5-7→3
8-14→2
15+→1
[oilpotion][explosivepotion][fulminatingpotion] A very useful cltside missile that produces a random cltside hitsubmissile between clthitsubmissile2 and clthitsubmissile3. Meaning that this can draw from a selected pool of as many missiles as you want. Also releases clthitsubmissile1.
(pclthitfunc=3)
(clthitsubmissile1=always released when by func)
(clthitsubmissile2=the first possible missile the func can select from)
(clthitsubmissile3=the last possible missile the func can select from)

[explodingarrow][freezingarrow][royalstrikemeteorcenter] Missile can optionally release hitfunc effects twice. Releases one or two hitsubmissile1-4, depending on if you release the hitfunc twice or not. {phoenix strike meteor uses this, although it only produces 1 meteor, and only if hitpar1=1. so I don't really understand how this works at all)
(psrvhitfunc=4)
(s.hitpar1="explode immediately"; if =0, the missile releases 1 of each hitsubmissile upon exploding; if =1, the missile releases 2 of each hitsubmissile upon exploding)
(hitsubmissile1,2,3,4=; missile is released once or twice, depending on s.hitpar1)

[guidedarrow][bonespirit] Required for guided missile to initially target.
(pclthitfunc=13,psrvhitfunc=10)

[cairnstones] {Unknown purpose}
(psrvhitfunc=32)

[orbmist] Spews cltsubmissiles all over the place with configurable radii and frequency.
(pcltdofunc=25,psrvhitfunc=35 {unknown what psrvhitfunc=35 does; might be what triggers the countess chest to open})
(cltparam1=dest radius; {???})
(cltparam2=init radius; determines how far from center cltsubmissile1 can be released)
(cltparam3=frequency; controls how many frames must pass before another cltsubmissile1 is produced)
(cltsubmissile1=released in a distinct pattern)

[hellmeteordown] Produces a cltside-only fire patch after the missile expires; the fire patch has randomized animspeeds, which gives it variable duration. Strangely, it does not actually use clthitsubmissile1/2/3. Chitpar1/2/3 also appear to be useless.
(pclthitfunc=36)
(chitpar1=radius; {???})
(chitpar2=variable duration; {???})
(chitpar3=density; {???})

[frozenorb] Missile will only collide with targets cltside and will always explode, so set AlwaysExplode=1 and CollideKill=0. Srvside missile will only explode once and upon running out of range or hitting a wall, whereas cltside missile will explode repeatedly, so you should probably set ClientCol=0 to avoid producing a bunch of fake hitsubmissiles (thanks Nagahaku!).
(pclthitfunc=30, psrvhitfunc=29)
(s.HitPar1/cHitpar1=increment; explosion releases 64/value hitsubmissiles)

Code: Select all

hitpar1 results:
1: 64 missiles, one released in every direction
2: 32 missiles, one released in every other direction
3: 22 missiles, evenly spaced except for two of the missiles being much closer
4: 16 missiles, released in a regular hexadecagon
5: 13 missiles, released in an almost regular tridecagon
6: 11 missiles, released in a not-quite regular hendecagon, with two of the missiles having half the distance between each other)
7: 10 missiles, released in an irregular decagon, with two of the missiles being very close
8-9: 8 missiles, released in a regular hexagon at 8, and an irregular hexagon at 9 with two of the missiles almost overlapping
10: 7 missiles, released in an irregular heptagon, with two of the missiles being closer)
11-12: 6 missiles, released in a regular hexagon at 11, two of the missiles become close at 12)
13-15: 5 missiles, released in a regular pentagon at 13, two of the missiles become increasingly close as 15 is approached)
16-21: 4 missiles, released in a regular diamond at 16, two of the missiles become increasingly close as 21 is approached)
22-31: 3 missiles, releases missiles at the points of an equilateral triangle at 22, two of the missiles become increasingly close 31 is approached)
32-63: 2 missiles, one west and another one that varies from east to west, counter-clockwise, as value changes from 32 to 63
64: 1 missile, west
(CollideKill=0, ClientCol=0, AlwaysExplode=1; strongly recommended unless you want desync)
(hitsubmissile1/clthitsubmissile1=; released after missile's range runs out, or if the missile runs into a wall)

[HitDoNova] An unused missile function (thanks VV!). It releases a number of hitsubmissile1/clthitsubmissile1. Seems like frozenorb nova without the odd missile release conditions.
(pclthitfunc=4,psrvhitfunc=5)
(s.hitpar1=64/x hitsubmissile1 to release in the nova)
(chitpar1=64/x clthitsubmissile1 to release in the nova)
(hitsubmissile1,clthitsubmissile1=# depends on hitpar1)

[lightningfury] Missile subreleases hitsubmissile1 and clthitsubmissile1; subrelease can be controlled by skills.txt
(hit1,pclthitfunc=25,psrvhitfunc=20)
(s.hitpar1/chitpar1=radius to search for targets, if 0 uses skills.txt aurarangecalc instead)
(s.hitpar2/chitpar2=# submissiles to release, if 0 uses skills.txt calc1 instead)
(aurafilter=determines targets of released missiles)
(aurarangecalc=determines range to search for targets)
(clc1=number of bolts to release)
(hitsubmissile1/clthitsubmissile1)

[catapult cold ball] Releases a bunch of catapult cold explosion missiles, seems hardcoded.
(pclthitfunc=48)

[catapult cold explosion] Leaps in a random direction, produces the melting ice cube graphics after expiring.
(pclthitfunc=31)

[icebreaksmall][icebreakmedium][icebreaklarge] Used by the states.txt 'shatter' column and 'shatter_on_death' monumod.
(pclthitfunc=31)

Code: Select all

HitIceBreak - Create a missile with a forced animation rate value of 1, depending on the missile class used.
·         If “Missile” equals “icebreaksmall” then create “icebreaksmallmelt” (ID=344)
·         If “Missile” equals “icebreakmedium” then create “icebreaklargemelt” (ID=345)
·         If “Missile” equals “icebreaklarge” then create “icebreaklargemelt” (ID=345)
·         If “Missile” equals “catapult cold explosion” then create “icebreaklargemelt” (ID=345)

[catapult meteor ball] Produces clthitsubmissile2 in a pattern like Meteor fire and flings molten boulder rock chunks. Seems like a fancier Meteor pclthitfunc.
(pclthitfunc=50)
(clthitsubmissile1={does not seem to do anything})
(clthitsubmissile2=produced in the same pattern as Meteor)

[vines trail] {}
(pclthitfunc=54)
(clthitsubmissile1=Released after missile expires)

[plague vines trail] Makes it so a missile stops dealing damage prematurely.
(psrvhitfunc=50)
(s.HitPar1=hit delay; makes it so the missile can only deal damage if hitpar1+range>=range left on missile, i.e. if you have 200 hitpar1 and 200 range on your missile, then it will be able to hit for the first frame only)

[healingbolt] {???}
(pclthitfunc=40)

[death mauler trail] {Doesn't seem to function unless used with the usual skill function}
(pclthitfunc=44)
(param1=spacing;)
(param2=draw delay;)

[catapultchargedball] A very confusing missile, although still somewhat useful. The supposed missile count is not anywhere close to the actual missiles released: it uses some annoying non-linear function. Has an interesting pathing for its hitsubmissiles, which follow a vein-like pattern. Strangely, the cltside missile seems to reference hitsubmissile1 instead of clthitsubmissile1.
(pclthitfunc=46,psrvhitfunc=38)
(s/cHitPar1=charged bolts; not accurate, see below)
(s/cHitPar2=charged bolts per level; not accurate, see below; I recommend ALWAYS setting this to 0 since if the value climbs to high it will crash)
(hitsubmissile1=missile to release, both srvside and cltside; appears to be perfectly synchronized)

Code: Select all

supposed charged bolt count=actual charged bolt count
1=1
2-3=10
4-5=12
6-7=14
8-9=16
10=10
11-12=18
13-14=20
15-16=22
17-18=24
19=19
20-21=26
22-23=28
24-25=30
26=34
27=32
28=28
29-30=34
31-32=36
33-34=38
35-36=40
37=37
38-39=42
40=44
41+=crash
[lightingtrailjavelin][advlighttrailingjav] The hit func of the unused light javelins. Releases a number of hitsubmissile1/clthitsubmissile1 using some annoying non-linear formula. Srvside and cltside seem to be well synchronized. Basically the same as catapultchargedball, except instead of having missiles per level, you get to choose if the pathing is random or not.
(pclthitfunc=51,psrvhitfunc=45)
(s.hitpar1/chitpar1=number of hitsubmissile1/clthitsubmissile1 to release; not linear, see code block above which I presume is exactly the same based on the few tests I did)
(s.hitpar2/chitpar2=random path; =0 means the submissiles follow a straight path, if =1 they follow a veiny, staggered path like catapultchargedball above)
(hitsubmissile1,clthitsubmissile1=missiles released)

[baal taunt lightning control] Releases hitsubmissile1 and clthitsubmissile1 in a random direction.
(pclthitfunc=62, psrvhitfunc=58)
(s.HitPar1=range; {???}, according to VV this determines the radius of the random area selection, but I haven't thought of a good way to test it)
(cHitPar1=range; {???})

[baal taunt poison control] Releases multiple hitsubmissile1 and clthitsubmissile1 in a kind of double-layered nova. The inner nova is "slow drift" and the outer nova is "fast drift". Seems to only be able to produce 9, 10, 11, 12, 13, 16 or 23 missiles. Modifies its hitsubmissiles by applying their params as velocity modifiers: param1 is slow drift and param2 is fast drift (if these are set to 0, then the hitsubmissiles will not move).
(pclthitfunc=63, psrvhitfunc=59)
(s.HitPar1=increment; 1=23 missiles, 2=16 missiles, 3=13 missiles, 4=12 missiles, 5=11 missiles, 8=10 missiles, 256=9 missiles)
(cHitPar1=increment; see above)

[baal inferno] A missile that can drain the target's mana.
(psrvhitfunc=55)
(s.HitPar1=mana drain %; this works like crushing blow, so if the target has 100 mana and the missile has 50% mana drain, then it will reduce them to 50/25/12.5/etc mana)

[armageddonrock][diablogeddonrock] Releases clthitsubmissile1 and clthitsubmissile2.
(pclthitfunc=55)

[taintedsunflash] {No known purpose; probably does something special but only when triggered by the quest} {???}
(pclthitfunc=38)

[durieldeathrock] Produces durieldeathsmoke and three durieldeathdebris in the target direction. When spawned by durieldeathcontrol, the durieldeathdebris seem to spew around randomly.
(pclthitfunc=41)

[bladefury1][bladefury2][bladefury3] Releases 1-8 arrows (seems to only release arrows, ID=0) in cardinal directions.
(pclthitfunc=64, psrvhitfunc=52)
(s.HitPar1=increment; see code)
(cHitPar1=increment; see code)
(hitsubmissile1=; must have a valid entry, but regardless of what you enter it will release ID=0, arrow)
(clthitsubmissile1=; must have a valid entry, but regardless of what you enter it will release ID=0, arrow)

Code: Select all

hitpar1=# arrows
0-1=8 arrows, in the cardinal directions
2=4 arrows: NW, NE, SE, SW
3=3 arrows: W, NE, SE
4=2 arrows: NW, SE
5=2 arrows: N, SE
6=2 arrows: NE, SE
7=2 arrows: E, SE
8=1 arrow: SE
[overseercontrol] Crashes the game if used by the player. Hardcoded to be released by superuniques.txt class=overseer1 on death. Releases hardcoded cltside missiles around it: ID=416 (catapult cold ball) and ID=422 (catapult meteor ball).
(pclthitfunc=61)

[baalcorpseexplodeexpl] Produces clthitsubmissile1 {no idea why this exists} {???}
(pclthitfunc=44)

[fistoftheheavensdelay] Very unique in that it follows an enemy, hitting them with direct damage when the delay elapses, and never hitting anything else. Unfortunately, the hitsubmissile release does not track the target. Calc1 and calc2 do not do anything, the healing is deprecated. Annoyingly, calc4 determines the srvside submissiles, but does nothing about the cltside submissiles.
(pclthitfunc=26, psrvhitfunc=22)
(s.Hitpar1=range; uses the skill's auralencalc if set to 0)
(s.Hitpar2=# bolts; references calc4 if set to 0)
(cHitpar1=range; uses the skill's aurarangecalc if set to 0)
(cHitpar2=; doesn't seem to do anything, always seems to produce one missile per nearby monster and targets all monsters within range regardless of their type)
(skills.txt: srvdofunc=80)
(skills.txt: aurafilter=determines what the missile will release hitsubmissiles at; does not influence the cltside)
(skills.txt: auralencalc= number of frames that must elapse for hit to trigger)
(skills.txt: calc4=number of srvside bolts to release)

[fistoftheheavensdelay] Like the above fistoftheheavensdelay, except inverted because of Rabies settings. So after the delay is elapsed, you are hit with the damage, and the missiles are produced by the target (but using your level/stats as reference) and will hurt you. Should be good for self-destructive pets that release ctc on death effects.
(pclthitfunc=26, psrvhitfunc=22)
(s.Hitpar1=range; uses the skill's auralencalc if set to 0)
(s.Hitpar2=# bolts; references calc4 if set to 0)
(skills.txt: srvstfunc=57, srvdofunc=121)
(skills.txt: aurafilter= determines what the missile will release submissile1 at)
(skills.txt: auralencalc= number of frames that must elapse for hit to trigger)
(skills.txt: calc4=number of srvside bolts to release)

[catapult spike ball] Creates a missile which sends hitsubmissiles to the cursor without needing skill functions. Also has calculation controlled hitsubmissile count. Recommended to only use if producing at least 8 spikes, as lower values only produce 1 srvside spike.
(pclthitfunc=47,psrvhitfunc=40)
(s.Hitpar1=srvside spikes; if =0, use skill calc4 instead; only creates 1 spike from values 1-7, but is accurate at 8+, so 8 for 8 spikes, 9 for 9 spikes, etc)
(s.Hitpar2=srvside spikes per lvl)
(cHitpar1=cltside spikes; if =0, use skill calc4 instead)
(cHitpar2=cltside spikes per lvl)
(hitsubmissile1=missiles released towards the cursor, which explode upon reaching the location; note that this hitsubmissile1 will not explode if it has too little range/velocity relative to the catapult spike ball, it seems that it can get purged before it explodes)
(clthitsubmissile1=clt missiles released towards the cursor, which explode upon reaching the location)
(clthitsubmissile2=released when the missile expires, spawning like explosionmissile)
(skills.txt: calc4=number of hitsubmissile1 to release)

[holybolt][fistoftheheavensbolt] Missile can specify between undead/demon/beast, releasing clthitsubmissile1 only if it hits the undead. Missiles should have collidekill=1 and clientcol=1 or will desync; in vanilla, fistoftheheavensbolt has clientcol=0, resulting in a desync (thanks to Nagahaku for noticing this!)
(clt:hit1,pclthitfunc=9,psrvhitfunc=7; hitpar1=collides with allies and applies healing; hitpar2=enemies it can collide with and apply damage)
(clc1=minimum amount of healing to allies)
(clc2=maximum amount of healing to allies)
(note: clthitpar2 always only targets undead, so it may be desirable to try out other pclthitfuncs)

[spidergoolay] Releases hitsubmissile1 southward upon expiring. {Doesn't seem to do anything special} {???}
(psrvhitfunc=15)
(hitsubmissile1=released southward upon missile expiration)

[howl] Missile applies terror to the target but only if there is an auratargetstate in skills.txt; regardless of the state, it will only apply the terror state. Missile cannot deal direct damage.
(psrvhitfunc=17)
(auratargetstate=any state, but it will apply the terror state regardless of the state used)
(param2=plev+slev+n; n=param2; fear will only be applied if playerlevel+howllevel+param2>monster level)
(param3=distance to retreat; seems to be deprecated)
(param4=distance per level; seems to be deprecated)
(param5=time to retreat; number of frames that target will have the fear state, at level 1; state seems to last forever if set to 0)
(param6=time per level; number of additional fear state frames per level past level 1; state seems to last forever if set to 0)

[spidergoo] Missile applies skills.txt auratargetstate and aurastats1-6, but the aurastats only seem to be applied if you apply the state twice in a row. State duration is based on calc4. Aurafilter does not seem to restrict its application. Seems to hit only enemies, unless collidefriend=1, then it will apply to both allies and enemies. Note that any calculations used for the aurastats will reference the TARGET'S values and not the user's; the only exception is for references to the skill that produces the missile itself. Missile cannot deal direct damage.
(psrvhitfunc=16,collidefriend=)
(skills.txt: auratargetstate,aurastat1-6)
(skills.txt: calc4=length of auratargetstate)

[shout][battleorders][battlecommand] Missile applies skills.txt auratargetstate to allies of the user. If collidefriend is not set to 1, then it doesn't seem to do anything. Unlike the battlecry and fingermagespider missile, this one references the USER'S stats and skill levels. Missile cannot deal direct damage.
(psrvHitfunc=18,param2=increased velocity per level,collidefriend=1)
(auratargetstate=applied state to target)
(auralencalc=length of state)
(aurastat1-6=stats applied during the state)

[fingermagespider] Missile applies skills.txt auratargetstate and aurastats1-6, but the aurastats only seem to be applied if you apply the state twice in a row. Note that any calculations used for the aurastats will reference the TARGET'S values and not the user's; the only exception is for references to the skill that produces the missile itself.
(psrvhitfunc=19)
(skills.txt: auratargetstate=applied state to target)
(skills.txt: auralencalc=length of state)
(skills.txt: aurastat1-6=stats applied during the state; only seem to apply on the second application of the state)

[battlecry] Missile applies skills.txt auratargetstate and aurastats1-6 to those selected via aurafilter; always ignores allies. Note that any calculations used for the aurastats will reference the TARGET'S values and not the user's; the only exception is for references to the skill that produces the missile itself. Always pierces regardless of collidekill. Missile cannot deal direct damage.
(psrvHitfunc=21)
(skills.txt: aurafilter=controls target selection)
(skills.txt: auratargetstate=applied state to target)
(skills.txt: auralencalc=length of state)
(skills.txt: aurastat1-6=stats applied during the state)

[rabiescontagion] {doesn't seem to do anything when not used by rabies}
(psrvhitfunc=53)

[firehead] If the missile hits a target, the user will heal life equal to the elemental damage range. This healing does not care about the target elemental resistances, nor does it care about the target's montypes.txt Drain resistance. So if the target is immune to all damage and drain=0 (cannot be drained), and you hit with 1000-2000 fire damage, then the user will heal 1000-2000 life. Does not ignore resistances as far as damage is concerned, so while the user will heal no matter what, the actual damage dealt can be reduced by resistances as usual.
(psrvhitfunc=31)

[andycontrol0]
(pcltdofunc=29)
(cltparam1=firewall frequency; how many frames must pass for an instance of cltsubmissile2 to be produced)
(cltparam2=screen shake seconds; the number of seconds the screen will shake for starting after a seemingly pre-determined point in the missile's range; will continue shaking even after the missile runs out of range)
(cltsubmissile1=; rapidly produced over the range, and move towards the player)
(cltsubmissile2=controlled by cltparam1)
(cltsubmissile3=; randomly spawns missiles in a distinctive pattern that starts outwards then goes inwards; seems to automatically collide unless the cltsubmissile3 uses pclthitfunc=19)

[radamentdeath] Creates the graphical effects of Radament's death. Produces ID=348 (radamenthandofgod) for the graphics.
(pcltdofunc=32,psrvdofunc=19)
[radamenthandofgod] Creates the graphical effects of Radament's death. Produces numerous ID=349 (radamentholybolt) for the graphics. Does not seem to function unless created by a missile with pcltdofunc=32,psrvdofunc=19.
(pclthitfunc=37)

[queendeathcenter] Creates the graphical effects of the Maggot Queen's death. Produces ID=354 (queendeathglob) for the graphics.
(pcltdofunc=35)
[queendeathglob] Creates the graphical effects of the Maggot Queen's death. Randomly produces both ID=355 (queendeathsplat1) and ID=356 (queendeathsplat2) for the graphics.
(pclthitfunc=39)

[towerchestspawner] Spawns the gold from the Countess's chest (presumably only gold; maybe it references a specific treasureclass that can be modified but probably not). Amount of gold in each pile scales with area level, but doesn't seem to adjust with gold find.
(psrvhitfunc=33)
(param1=start delay; gold only starts being produced after this time runs out, in frames)
(param2=spawn interval divisor; spawns slower the higher the number is)
(param3=radius; the radius that gold will randomly drop within)

[nihlithak1] A missile that produces clthitsubmissile1 and clthitsubmissile2, allow a z-offset for clthitsubmissile2.
(pclthitfunc=60)
(cHitPar1=zoffset of missile 2; controls the z-offset of clthitsubmissile2)

[mephistodonotdraw] An incredibly unique cltside missile: it makes the user disappear, (the shadow remains if a player uses it; for monsters they entirely disappear), after the range runs out. This seems to last until you restart the game, even beyond death, even if you transform.
(pclthitfunc=34)
(range=how many frames must pass until the user is disappeared)

[monspawn] Missile that spawns a single, specific monster after expiring.
(psrvhitfunc=6)
(s.HitPar1=monstats hcIdx; chooses the monster to spawn)
(s.HitPar2=animmode; value corresponds to monmode.txt IDs)

Code: Select all

value→resulting animmode
0 → DT, death
1 → NU, neutral
2 → WL, walk
3 → GH, gethit
4 → A1, attack1
5 → A2, attack2
6 → BL, block
7 → SC, cast
8 → S1, skill1
9 → S2, skill2
10→ S3, skill3
11→ S4, skill4
12→ DD, dead
13→ GH, knockback
14→ xx, sequence
15→ RN, run
[Imp Spawn Monsters] Missile that spawns a monster after expiring, based on available monsters for the area in levels.txt. Rarity of the monster seems to have no effect on the results, and from monstats.txt: the monster will also spawn with partymin to partymax minion1/minion2; monster will not spawn if isSpawn=0.
(psrvhitfunc=39)

[baal spawn monsters] Spawns a monster and clthitsubmissile1. When used by the player, seems to only create a lonely Skeleton (monstats.txt ID=0).
(pclthitfunc=57, psrvhitfunc=54)
(chitpar1=radius; radius of clthitsubmissile1)
(chitpar2=density; density of clthitsubmissile1)

[moltenboulderemerge] Missile that subreleases hitsubmissile1 in the same direction it is moving once and clthitsubmissile1 up to 5 times either in front or behind the missile, applying a bouncing effect to each subreleased clthitsubmissile1
(hit1,pclthitfunc=53,psrvhitfunc=48)
(cHitPar1=bounces; makes missile bounce on ground and produces a {unknown hardcoded sound} each time it hits the ground
(cHitPar2=damping; the change in Z-position on each subsequent bounce, a lower value means less bounce is conserved, at ~80 bounce is conserved, and higher than that will increase bounce)
(chitPar3=lob; the initital Z-position of the missile, bigger lob means bigger bounces)
(note: If you want it to spawn a single missile, minimize the range and set it to alwaysexplode=1; if you want it to spawn the maximum missiles, then use a piercing function like frozen orb's dofunc and make it collide with everything)

[pantherpotorange] {???}
(psrvhitfunc=24)

[pantherpotgreen] Releases 8 instances of hitsubmissile1 and {unknown} instances of clthitsubmissile1 on collision.
(param1=poison length; {doesn't seem to do anything})
(pclthitfunc=28,psrvhitfunc=25)

[healing vortex] A missile that heals anything it collides with.
(psrvhitfunc=43)
(mindam/maxdam=amount to heal)

[volcano debris 2] A missile that releases hitsubmissile1 to 3 and clthitsubmissile1 and 2. {noticing an oddity where if producing meteorcenter, the resulting meteorfire is invisible cltside. not sure what causes this}
(pclthitfunc=55,psrvhitfunc=51)
(hitsubmissile1=)
(hitsubmissile2=)
(hitsubmissile3=)
(clthitsubmissile1=)
(clthitsubmissile2=)

[HitMissileSkill] An unused missile function, described by D2R docs. It triggers a defined srvdofunc. So you could, for example, produce a missile that triggers Amplify Damage. The missile uses the srvdofunc as if it were casting the skill that created it, so it will share the settings with the skill that makes the missile. Cannot deal direct damage.
(psrvhitfunc=23)
(s.HitPar1=srvdofunc to apply)

Code: Select all

Useful hitmissileskill srvdofuncs:
srvdofunc=6, inner sight & slow missiles
srvdofunc=20, static field (lets missiles explode into static field damage)
srvdofunc=30, curses (this is what grim ward uses by default; lets a missile apply up to 6 aurastats within a defined radius)
srvdofunc=47, cloak of shadows (allows a missile to blind targets within a radius and applies up to 6 aurastats; lets you cast cloak of shadows without the annoying delay)
srvdofunc=51, mind blast (lets a missile deal damage in a radius, apply random knockback and apply conversion)
srvdofunc=61, confuse (lets a missile confuse enemies in a radius)
srvdofunc=65, many auras (lets a missile produce an aura; DO NOT USE AN AURASTATE, ONLY AN AURATARGETSTATE, missile will cause a crash if you try to give it an aurastate)
srvdofunc=71, taunt (lets a missile taunt targets, note that the grimwardmissile itself doesn't move even if you apply velocity, but you could make it so a missile produces a bunch of short-lived grimwardmissiles in a row in sequence, so that it lures enemies in the given direction)
srvdofunc=112, moncursecast
[explodingarrow] Produces all hitsubmissiles. Unknown if there is a clthitfunc that can produce all clthitsubmissiles.
(psrvhitfunc=4)
(hitsubmissile1=)
(hitsubmissile2=)
(hitsubmissile3=)
(hitsubmissile4=)

[] An unused missile function "HitCreateMissileNoDmg" (thanks VV!). It releases hitsubmissile1, hitsubmissile2, hitsubmissile3 and hitsubmissile4 simultaneously. As the name states, it does not seem to do direct damage. Does not seem to have a related cltside missile, so it might be awkward to use.
(psrvhitfunc=11)
(s.hitpar1=if <1, it produces one of each missile; if >1, it produces two of each missile)
(hitsubmissile1=)
(hitsubmissile2=)
(hitsubmissile3=)
(hitsubmissile4=)

[bomb in air][shock field in air][catapult spike in air][sentryspikeinair] Missile only collides with walls and certain objects, seems to stop on the wall/object for a moment before colliding. Doesn't seem much different from setting collidetype. Also releases hitsubmissile1 and clthitsubmissile1. The hitsubmissile1 and clthitsubmissile1 inherit the same srvdofunc as the missile {and maybe srvstfunc?}. Cltsubmissile1 will be invisible if vel>0. {Only parameter-inheritance use seems to be in making chain lightning that produces a stationary chain lightning field}
(pclthitfunc=44)(psrvhitfunc=36)
(hitsubmissile1)
(clthitsubmissile1)

[] An unused missile function "RadialStunDamage" (thanks VV!). Apparently D2R only so I haven't tested it {???}
(psrvhitfunc=30)
(s.hitpar1={???}; probably the stun radius)
(s.hitpar2={???}; probably the stun length)

---

[UNKNOWN/MIXED MISSILES]

[hfcontrol] {Produces a static-animation missile?} {???}
(pcltdofunc=38)

[hffragment1] Produces hffragment2 after expiring.
(pcltdofunc=39,pclthitfunc=42)

[hffragment2] Produces hffragment3 after expiring.
(pcltdofunc=39,pclthitfunc=43)

[hffragment3] Does not move.
(pcltdofunc=40)

[hfspirit1] {???}
(pcltdofunc=41)

[worldstone shake] {Doesn't seem to do anything, probably only functions in the Worldstone Chamber} {???}
(pcltdofunc=66, pclthitfunc=61)

[baalfx control] Spawns Tyrael.
(pcltdofunc=64, psrvdofunc=36, psrvhitfunc=57)


---

[PSRVDMGFUNC]

[DamageFireArrow] Converts physical damage to elemental, both from weapon damage and any added skill physical damage.
(psrvdmgfunc=1)
(dmgcalc1=% elemental conversion; effective limit is 100, any more is useless; element is based on the missile's etype, applies to weapon damage from SrcDam, as well as any added physical damage via the MinDam/Maxdam columns; still applies to added physical damage even if SrcDam=0)
(EType=; the element to convert to)

[sDamageLightningJavelin] Like DamageFireArrow, except it ONLY adds elemental damage from the missile's EType, any source of elemental damage that is not from the missile's EType will be erased. So if you have EType=ltng and have +100 Fire Damage on a hat, it will be as if you have +0 fire damage.
(psrvdmgfunc=12)
(dmgcalc1=% elemental conversion; effective limit is 100, any more is useless; element is based on the missile's etype, applies to weapon damage from SrcDam, as well as any added physical damage via the MinDam/Maxdam columns; still applies to added physical damage even if SrcDam=0)

[DamageEruption] Applies an overlay on the target.
(psrvdmgfunc=8)
(progoverlay=; this overlay gets applied to target)

[DamageIceArrow] Converts coldlength to freeze duration, both from the stat 'coldlength' and from cold duration given by skills/missiles. Does not require Etype=cold, although if that isn't the case, then the only source of cold duration will be from items.
(psrvdmgfunc=2)
(dParam1=percentage of coldlength as freeze duration; converts cold ELen and 'coldlength' stat; any dparam value seems valid, even up to very high values, so you can convert more than 100% of your coldlength to freeze duration)

[DamageIceBlast] Converts 100% of coldlength to freeze duration, both from the stat 'coldlength' and from cold duration given by skills/missiles. Does not require Etype=cold, although if that isn't the case, then the only source of cold duration will be from items. Not sure why you would use this when DamageIceArrow exists.
(psrvdmgfunc=4)

[DamageFreeze] Seems identical to DamageIceBlast.
(psrvdmgfunc=10)

[DamageFireWall] {probably cltside}
(psrvdmgfunc=3)

[DamageBlessedHammerNew] Adds a damage percent multiplier against undead and/or demons, based on the EType of the missile, which boosts both skill damage and added damage from stats. If a monster is both undead and demon, then both multipliers will apply.
(psrvdmgfunc=5)
(dparam1=damage percent multiplier to undead; negative values are equivalent to +0%; can go well past +100%; applies to monsters with monstats.txt lUndead=1 OR hUndead=1)
(dparam2=damage percent multiplier to demons; negative values are equivalent to +0%; can go well past +100%; applies to monsters with monstats.txt demon=1)
(EType=the element to modify the damage of; note that this will ALWAYS uses the missiles.txt EType, never the skills.txt EType)

[DamageBlessedHammerOld] See DamageBlessedHammerNew. Only difference is that the missile's physical damage will benefit from damagepercent. Also requires an etype to be set, otherwise the damagepercent bonus will not be used.
(psrvdmgfunc=13)
(dparam1=see DamageBlessedHammerNew)
(dparam2=see DamageBlessedHammerNew)
(EType=see DamageBlessedHammerNew)

[DamageNoItem] Monsters killed by this missile will not drop items, unless the missile is produced by a hireling.
(psrvdmgfunc=6)

[DamageWarCry] Stuns targets hit by missile based on dparam1 or skills.txt ln12. Adds hit sound impact_stun_1. Stun applied by the stun element will be ignored when using this function unless srcdam>0. Very awkward to use because you have almost no control over values. Better off not using this func and instead using hitshift=96 (for impact_stun_1 sound) and etype=stun unless you plan on having a skill that deals elemental damage + stun. {Supposedly uses calc4 in place of dparam1 if dparam1=0, but does not work}
(psrvdmgfunc=7)
(dparam1=stun length in frames; if =0 or blank, then uses the skill-that-created-the-missile's ln12 as stun length)

[DamageTwister] Exactly the same as DamageWarCry, except uses skills.txt param2 instead of ln12 Completely useless since, if you want a static value, you can use DamageWarcry and set the stun length with dparam1. {Supposedly uses calc2 in place of dparam1 if dparam1=0, but does not work}
(psrvdmgfunc=9)
(dparam1=stun length in frames; if =0 or blank, then uses the skill-that-created-the-missile's param2 as stun length)

[DoRabiesDamage] {}
(psrvdmgfunc=11)

[DamageMoltenBoulder] {Lazily quoted the D2R txt guide. Given their documentation track record, I'd say there's a 50% chance this is accurate.}
(psrvdmgfunc=14)

Code: Select all

DamageMoltenBoulder - Uses “dParam2” as the percent chance to knockback the target unit. Uses “dParam1” to control how this percent chance is modified. Also relies on the “small” and “large” fields from the monstats2.txt file.
·If the target unit is a player and “dParam1” is greater than or equal to 1, then set the knockback chance to “dParam2”
·If “dParam1” is less than 1 and the monster is a small size, then set the knockback chance to “dParam2”
·If “dParam1” equals 1 and the monster is a small size, then set the knockback chance to “dParam2” * 2
·If “dParam1” equals 1 and the monster is a large size, then set the knockback chance to “dParam2”
·If “dParam1” is greater than 1 and the monster is a small size, then set the knockback chance to “dParam2” * 3
·If “dParam1” is greater than 1 and the monster is a large size, then set the knockback chance to “dParam2” * 2
·If “dParam1” is greater than 1 and the monster is not a small or large size, then set the knockback chance to “dParam2”

[DamageHolyBolt] {d2r only it seems, invalid in lod, causes a crash on hit like other non-existent damage func value}
(psrvdmgfunc=15)

---

[MISSILE STATES/AURAS]

This is a brief section which lists states/auras that work relatively well at generating missiles.

THESE SKILLS PRODUCE SRVSIDE AND CLTSIDE MISSILES, AND DO NOT INTERRUPT THE PLAYER:
Blaze
Thunderstorm
Armageddon
Hydra

THIS SKILL PRODUCES SRVSIDE AND CLTSIDE MISSILES, BUT DOES INTERRUPT THE PLAYER:
Volcano

THESE SKILLS DO NOT PRODUCE CLTSIDE GRAPHICS:
Every other missile function.

THESE SKILLS PRODUCE CLTSIDE MISSILES, AND DO NOT INTERRUPT THE PLAYER:
Magottlay
Poison Creeper
Hurricane

You can also create cltside missiles via states.txt cltactivefunc, but this column produces a cltmissile every frame, which in most cases is way too often.

CLTACTIVEFUNC=# (stationary cltmissile):
2 (create an arrow in your direction every 1 frame)
5 (shoots out cltmissile on z-axis)
6 (creates cltmissiles where you stand)
7 (creates cltmissiles on target)
8 (creates cltmissiles under self and on target)
9 (creates a scatter of cltmissiles at target location)
10 (creates cltmissiles on target)
11 (create cltmissiles on target)
12 ()
14 (cltmissiles at target location)
17 (cltmissiles from self)
18 (cltmissiles from self)
19 (cltmissiles on target)
22 (cltmissiles on target)
23 (cltmissiles on self)
24 (cltmissiles on self)
25 (cltmissile nova from self)
27 (cltmissile on self)
28 (location)
29 (self)
30 (random location)
34 (insanity)
35 (self)
36 (target)
38 (target bleeds)
40 (target bleeds)
41 (target explodes into gore and target cltmissile)
48 (self while animating)
51 (target)
53 (random location)
54 (self)
55 (self)
56 (target while animating; OBEYS SPEED LIMIT, DOES NOT SPAM EVERY FRAME)
57 (self)
58 (self)
59 (blink out of existence)
60 (in a row)
61 (on self while animating against target)
63 (random location, small)
64 (makes you "die")
65 (random location)
67 (self)
68 (self)
69 (self)
70 (self)
71 (self and rotate user to the left)
72 (self, off-set on Z-axis)
73 (self)
74 (location)
75 (screen shake)
76 (draw a line of cltmissile to location)
80 (self)
81 (self)
83 (target)
84 (random white flashes, target)
86 (random location; OBEYS SPEED LIMIT, DOES NOT SPAM EVERY FRAME)
87 (random location launched from self; OBEYS SPEED LIMIT, DOES NOT SPAM EVERY FRAME)
90 (at the points of a hexagon around the user)
91 (target)
92 (location, falling)
93 (target, bleeding)
94 (self)
95 (self)
96 (self)


---

[OTHER WAYS OF GENERATING MISSILES]

In weapons.txt (as well as armor.txt and misc.txt, if you should add in the column), there is the "missiletype" column. This determines what missile is released when equipped and thrown by Throw, Left Hand Throw and Double Throw.

In monstats.txt, there are the columns "MissA1", "MissA2", "MissS1", "MissS2", "MissS3", "MissS4", "MissC" and "MissSQ". See https://d2mods.info/forum/kb/viewarticle?a=360 for more information.

In monseq.txt, you can use event=2 or 4 to make a monster launch a missile or skill which produces a missile. See https://d2mods.info/forum/kb/viewarticle?a=395.

---

[HARDCODED MISSILES]

[pantherpotorange] ID=238
[pantherpotgreen] ID=239
Cltside, these missiles will act as if they have lob=1 (srvside, they will still collide like normal).

For hardcoded references to missiles, see: https://d2mods.info/forum/viewtopic.php?t=67660
Last edited by Cypress on Fri Jul 12, 2024 10:32 pm, edited 95 times in total.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Tue May 09, 2023 3:17 pm

Hi, I found that the desynced missiles of holybolts could be fixed, just by removing its pclthitfunc :D
Edit:
More found... i believe i have got an idea to fix holybolts and fistofheavenbolts' desynced problems
for the hittings, just removed the pclthitfunc, then move clthitsubmissile1 to explosionmissile, and switch clientcol to 1 if not.
with such modifications, the missile would correctly hit and disappear both svr and clt sides, and for the most amazing part, they would not lose their healing overlays.
and for the fistofheaven's submissiles, i just change the skill's calc4 to a large number, such as 999, which would make it always matches the client side missiles. that might not be a perfect way but works...
i can't find a method to make fistoftheheavensbolts heal, maybe submissiles don't read the skill's calc 1 and 2... :(

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Tue May 09, 2023 11:51 pm

Hi Nagahaku, that's clever! It's not quite identical to the original behavior of holybolt, since normally it only explodes (plays the sound and hit graphic) when hitting a valid enemy (in vanilla, undead). Although I doubt anyone would even notice or mind that, it's a much better choice than having the missile apparently disappear even though it didn't. I'll be sure to add that into the guide, thanks!

As for making fistoftheheavensbolt heal, it seems like Blizzard specifically coded it to not work. I thought maybe it is bugged to make it so the next missile produced from fistoftheheavensdelay (fistoftheheavensbolt) is bugged to not heal, but even if you add in moltenboulderemerge such that fistoftheheavensdelay -> moltenboulderemerge -> fistoftheheavensbolt, it still doesn't work. I can't think of a fix that doesn't involve srvhitfunc=18, which is a bit different from holybolt's expected behavior.

EDIT: Wait, that holybolt fix doesn't work at all. The problem is that Holy Bolt will always be destroyed, even if collidekill=0. What you are doing is desyncing the missile so it appears as if it is piercing when it isn't. So unfortunately, I think this too is impossible to fix with softcoding.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Wed May 10, 2023 4:13 am

Cypress wrote:
Tue May 09, 2023 11:51 pm
Wait, that holybolt fix doesn't work at all. The problem is that Holy Bolt will always be destroyed, even if collidekill=0. What you are doing is desyncing the missile so it appears as if it is piercing when it isn't. So unfortunately, I think this too is impossible to fix with softcoding.
Uh-Oh... might be some misunderstanding? what i made is a holybolt that never pierce, alway disappear on hitting... collidekill=1 would be nessessary... 8-O
this is what did, hope it help...

Code: Select all

Missile	Id	pCltDoFunc	pCltHitFunc	pSrvDoFunc	pSrvHitFunc	pSrvDmgFunc	SrvCalc1	*srv calc 1 desc	Param1	*param1 desc	Param2	*param2 desc	Param3	*param3 desc	Param4	*param4 desc	Param5	*param5 desc	CltCalc1	*client calc 1 desc	CltParam1	*client param1 desc	CltParam2	*client param2 desc	CltParam3	*client param3 desc	CltParam4	*client param4 desc	CltParam5	*client param5 desc	{filtered}	*server hit calc 1 desc	{filtered}	*server hit param1 desc	{filtered}	*server hit param2 desc	{filtered}	*server hit param3 desc	CHitCalc1	*client hit calc1 desc	cHitPar1	*client hit param1 desc	cHitPar2	*client hit param2 desc	cHitPar3	*client hit param3 desc	DmgCalc1	*damage calc 1	dParam1	*damage param1 desc	dParam2	*damage param2 desc	Vel	MaxVel	VelLev	Accel	Range	LevRange	Light	Flicker	Red	Green	Blue	InitSteps	Activate	LoopAnim	CelFile	animrate	AnimLen	AnimSpeed	RandStart	SubLoop	SubStart	SubStop	CollideType	CollideKill	CollideFriend	LastCollide	Collision	ClientCol	ClientSend	NextHit	NextDelay	xoffset	yoffset	zoffset	Size	SrcTown	CltSrcTown	CanDestroy	ToHit	AlwaysExplode	Explosion	Town	NoUniqueMod	NoMultiShot	Holy	CanSlow	ReturnFire	GetHit	SoftHit	KnockBack	Trans	Qty	Pierce	SpecialSetup	MissileSkill	Skill	ResultFlags	HitFlags	HitShift	ApplyMastery	SrcDamage	Half2HSrc	SrcMissDmg	MinDamage	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDamage	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	MinELev1	MinELev2	MinELev3	MinELev4	MinELev5	Emax	MaxELev1	MaxELev2	MaxELev3	MaxELev4	MaxELev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	HitClass	NumDirections	LocalBlood	DamageRate	TravelSound	HitSound	ProgSound	ProgOverlay	ExplosionMissile	SubMissile1	SubMissile2	SubMissile3	HitSubMissile1	HitSubMissile2	HitSubMissile3	HitSubMissile4	CltSubMissile1	CltSubMissile2	CltSubMissile3	CltHitSubMissile1	CltHitSubMissile2	CltHitSubMissile3	CltHitSubMissile4	EOL
holybolt	55	1		1	7																												1	heals allies?	1	0 = all, 1 = undead, 2 = demons					1	heals allies?	1	0 = all, 1 = undead, 2 = demons									20	20			50		7		222	222	255	1	0	1	HolyBoltMissile	1024	16	16					3	1	1	1		1							1										1	1	1	1			1					Holy Bolt	4																																							1			paladin_holybolt_1	paladin_holybolt_impact_1		healing	teethexplode															0

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Wed May 10, 2023 10:54 am

What desync are you referring to? I thought you were talking about the collidekill=0 desync, where the missile doesn't disappear cltside, but is used up srvside. By removing the pclthitfunc, you are making holybolt desync because now the holybolt will disappear after it hits anything, not just undead, even though the missile still does exist. So for example, if you go into the Blood Moor and use your holybolt, your holybolt will do no damage to a Fallen One but will still disappear as if it did hit them, but if there is a Zombie past the Fallen One, then the Zombie will be hit by an invisible, desynced missile.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Wed May 10, 2023 4:09 pm

:( seems that i still didn't test it enough... i thought it might hit a fallen without damage then disappear... sorry about that...
by now i'm using another way and perhaps it might be better...
I made it indeed able to hit anything, but turn its damage minimum by hitshift=0 in skills.txt for holybolt, then i set 5 to the missile's psrvdmgfunc, and make its damage bonus versus undead to 25600 so that it would do the original damage to undead...
this is not that good, but might avoid the problem, holybolts would hit anything but deals very little damage to those not undead.
and i also found that the missiles etype must be set to 'mag' instead of blank or psrvdmgfunc=5 won't work

Code: Select all

Missile	Id	pCltDoFunc	pCltHitFunc	pSrvDoFunc	pSrvHitFunc	pSrvDmgFunc	SrvCalc1	*srv calc 1 desc	Param1	*param1 desc	Param2	*param2 desc	Param3	*param3 desc	Param4	*param4 desc	Param5	*param5 desc	CltCalc1	*client calc 1 desc	CltParam1	*client param1 desc	CltParam2	*client param2 desc	CltParam3	*client param3 desc	CltParam4	*client param4 desc	CltParam5	*client param5 desc	{filtered}	*server hit calc 1 desc	{filtered}	*server hit param1 desc	{filtered}	*server hit param2 desc	{filtered}	*server hit param3 desc	CHitCalc1	*client hit calc1 desc	cHitPar1	*client hit param1 desc	cHitPar2	*client hit param2 desc	cHitPar3	*client hit param3 desc	DmgCalc1	*damage calc 1	dParam1	*damage param1 desc	dParam2	*damage param2 desc	Vel	MaxVel	VelLev	Accel	Range	LevRange	Light	Flicker	Red	Green	Blue	InitSteps	Activate	LoopAnim	CelFile	animrate	AnimLen	AnimSpeed	RandStart	SubLoop	SubStart	SubStop	CollideType	CollideKill	CollideFriend	LastCollide	Collision	ClientCol	ClientSend	NextHit	NextDelay	xoffset	yoffset	zoffset	Size	SrcTown	CltSrcTown	CanDestroy	ToHit	AlwaysExplode	Explosion	Town	NoUniqueMod	NoMultiShot	Holy	CanSlow	ReturnFire	GetHit	SoftHit	KnockBack	Trans	Qty	Pierce	SpecialSetup	MissileSkill	Skill	ResultFlags	HitFlags	HitShift	ApplyMastery	SrcDamage	Half2HSrc	SrcMissDmg	MinDamage	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDamage	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	MinELev1	MinELev2	MinELev3	MinELev4	MinELev5	Emax	MaxELev1	MaxELev2	MaxELev3	MaxELev4	MaxELev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	HitClass	NumDirections	LocalBlood	DamageRate	TravelSound	HitSound	ProgSound	ProgOverlay	ExplosionMissile	SubMissile1	SubMissile2	SubMissile3	HitSubMissile1	HitSubMissile2	HitSubMissile3	HitSubMissile4	CltSubMissile1	CltSubMissile2	CltSubMissile3	CltHitSubMissile1	CltHitSubMissile2	CltHitSubMissile3	CltHitSubMissile4	EOL
holybolt	55	1		1	7	5																											1	heals allies?	0	0 = all, 1 = undead, 2 = demons					1	heals allies?	0	0 = all, 1 = undead, 2 = demons					25600	bonus dmg% undead			20	20			50		7		222	222	255	1	0	1	HolyBoltMissile	1024	16	16					3	1	1	1		1							1										1	1	1	1			1					Holy Bolt	4			1																	mag																			1			paladin_holybolt_1	paladin_holybolt_impact_1		healing	teethexplode															0
Edit: Wait... just found something... the vanilla 'holybolt' launched by skill 'Holy Bolt' has no collide problem, it just ignored those not undead properly and hit the undead then vanish properly, the client side bolt doesn't pierce... so the desync problem only happens on fistoftheheavensbolts... and i checked the difference between them, only to find its 'clientcol' column is blank while the 'holybolt' is '1', i switched it to 1 as well, and found it just correctly hit and vanish on undead targets :D

here's the vanilla holybolt missile:

Code: Select all

Missile	Id	pCltDoFunc	pCltHitFunc	pSrvDoFunc	pSrvHitFunc	pSrvDmgFunc	SrvCalc1	*srv calc 1 desc	Param1	*param1 desc	Param2	*param2 desc	Param3	*param3 desc	Param4	*param4 desc	Param5	*param5 desc	CltCalc1	*client calc 1 desc	CltParam1	*client param1 desc	CltParam2	*client param2 desc	CltParam3	*client param3 desc	CltParam4	*client param4 desc	CltParam5	*client param5 desc	{filtered}	*server hit calc 1 desc	{filtered}	*server hit param1 desc	{filtered}	*server hit param2 desc	{filtered}	*server hit param3 desc	CHitCalc1	*client hit calc1 desc	cHitPar1	*client hit param1 desc	cHitPar2	*client hit param2 desc	cHitPar3	*client hit param3 desc	DmgCalc1	*damage calc 1	dParam1	*damage param1 desc	dParam2	*damage param2 desc	Vel	MaxVel	VelLev	Accel	Range	LevRange	Light	Flicker	Red	Green	Blue	InitSteps	Activate	LoopAnim	CelFile	animrate	AnimLen	AnimSpeed	RandStart	SubLoop	SubStart	SubStop	CollideType	CollideKill	CollideFriend	LastCollide	Collision	ClientCol	ClientSend	NextHit	NextDelay	xoffset	yoffset	zoffset	Size	SrcTown	CltSrcTown	CanDestroy	ToHit	AlwaysExplode	Explosion	Town	NoUniqueMod	NoMultiShot	Holy	CanSlow	ReturnFire	GetHit	SoftHit	KnockBack	Trans	Qty	Pierce	SpecialSetup	MissileSkill	Skill	ResultFlags	HitFlags	HitShift	ApplyMastery	SrcDamage	Half2HSrc	SrcMissDmg	MinDamage	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDamage	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	MinELev1	MinELev2	MinELev3	MinELev4	MinELev5	Emax	MaxELev1	MaxELev2	MaxELev3	MaxELev4	MaxELev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	HitClass	NumDirections	LocalBlood	DamageRate	TravelSound	HitSound	ProgSound	ProgOverlay	ExplosionMissile	SubMissile1	SubMissile2	SubMissile3	HitSubMissile1	HitSubMissile2	HitSubMissile3	HitSubMissile4	CltSubMissile1	CltSubMissile2	CltSubMissile3	CltHitSubMissile1	CltHitSubMissile2	CltHitSubMissile3	CltHitSubMissile4	EOL
holybolt	55	1	9	1	7																												1	heals allies?	1	0 = all, 1 = undead, 2 = demons					1	heals allies?	1	0 = all, 1 = undead, 2 = demons									20	20			50		7		222	222	255	1	0	1	HolyBoltMissile	1024	16	16					3	1	1	1		1							1										1	1	1	1			1					Holy Bolt	4																																							1			paladin_holybolt_1	paladin_holybolt_impact_1		healing												teethexplode				0
and this is the fixed fistoftheheavensbolt

Code: Select all

Missile	Id	pCltDoFunc	pCltHitFunc	pSrvDoFunc	pSrvHitFunc	pSrvDmgFunc	SrvCalc1	*srv calc 1 desc	Param1	*param1 desc	Param2	*param2 desc	Param3	*param3 desc	Param4	*param4 desc	Param5	*param5 desc	CltCalc1	*client calc 1 desc	CltParam1	*client param1 desc	CltParam2	*client param2 desc	CltParam3	*client param3 desc	CltParam4	*client param4 desc	CltParam5	*client param5 desc	{filtered}	*server hit calc 1 desc	{filtered}	*server hit param1 desc	{filtered}	*server hit param2 desc	{filtered}	*server hit param3 desc	CHitCalc1	*client hit calc1 desc	cHitPar1	*client hit param1 desc	cHitPar2	*client hit param2 desc	cHitPar3	*client hit param3 desc	DmgCalc1	*damage calc 1	dParam1	*damage param1 desc	dParam2	*damage param2 desc	Vel	MaxVel	VelLev	Accel	Range	LevRange	Light	Flicker	Red	Green	Blue	InitSteps	Activate	LoopAnim	CelFile	animrate	AnimLen	AnimSpeed	RandStart	SubLoop	SubStart	SubStop	CollideType	CollideKill	CollideFriend	LastCollide	Collision	ClientCol	ClientSend	NextHit	NextDelay	xoffset	yoffset	zoffset	Size	SrcTown	CltSrcTown	CanDestroy	ToHit	AlwaysExplode	Explosion	Town	NoUniqueMod	NoMultiShot	Holy	CanSlow	ReturnFire	GetHit	SoftHit	KnockBack	Trans	Qty	Pierce	SpecialSetup	MissileSkill	Skill	ResultFlags	HitFlags	HitShift	ApplyMastery	SrcDamage	Half2HSrc	SrcMissDmg	MinDamage	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDamage	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	MinELev1	MinELev2	MinELev3	MinELev4	MinELev5	Emax	MaxELev1	MaxELev2	MaxELev3	MaxELev4	MaxELev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	HitClass	NumDirections	LocalBlood	DamageRate	TravelSound	HitSound	ProgSound	ProgOverlay	ExplosionMissile	SubMissile1	SubMissile2	SubMissile3	HitSubMissile1	HitSubMissile2	HitSubMissile3	HitSubMissile4	CltSubMissile1	CltSubMissile2	CltSubMissile3	CltHitSubMissile1	CltHitSubMissile2	CltHitSubMissile3	CltHitSubMissile4	EOL
fistoftheheavensbolt	234	1	9	1	7																												1	heals allies?	1	0 = all, 1 = undead, 2 = demons					1	heals allies?	1	0 = all, 1 = undead, 2 = demons									12	12			50		8		222	222	255	1	2	1	HolyBoltMissile	1024	16	16					3	1	1	1		1			4				1										3	1	1	1			1						4		8																		mag	40	6	10	16	32	48	50	6	10	16	32	48	skill('Holy Bolt'.blvl) * 15						1			paladin_holybolt_1	paladin_holybolt_impact_1			teethexplode											teethexplode				0
I hope this is the true fix for them :P

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Sat May 13, 2023 10:40 am

Thanks Nagahaku! That works great. I see now what desync you are talking about, I was confused since my guide was describing some desync involving collidekill=0, but that desync I described isn't relevant at all (it applies to all hitfuncs, not just holybolt).

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Tue May 16, 2023 9:26 am

Cypress wrote:
Fri Apr 02, 2021 5:02 pm
An unused missile function "HitMissileSkill" (thanks VV!). It triggers a defined srvdofunc. So you could, for example, produce a missile that triggers Amplify Damage. Very useful.
(psrvhitfunc=23)
(s.HitPar1=srvdofunc to apply)
Hi Cypress, This function seems to be very useful, but how to make it work? Just take Amplify Damage for example, multiple curses are using srvdofuc 30... how to specify it as Amplify Damage? :?:

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Tue May 16, 2023 11:29 am

Nagahaku, hitfunc 23 will use some of the settings of whatever skill produced it with the srvdofunc replaced by s.hitpar1.

So for example, let's say you remove srvdofunc from Amplify Damage (making it a skill that does nothing) and give it srvmissile/cltmissile=testmissile. And then make testmissile a clone of icebolt, which has hitfunc=23, s.hitpar1=30. When this missile hits a monster, it will cast Amplify Damage at the collision location with the same skill level of your Amplify Damage, because it is using the Amplify Damage skill's settings for srvdofunc 30 (so it uses Amplify Damage's aurastats, aurarng, auralen, aurastate, aurafilter).

Note that complex calcs/synergies do not work well with this, since the missile doesn't know most of the values your character does. lvl is accurate, but blvl doesn't work, ulvl will be the same as lvl, references to other skills like skill('weaken'.lvl) will be =0. Stats will also be referenced as 0 for the missile, except for damage stats.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Tue May 16, 2023 1:51 pm

Cypress, Thanks for the answer, that's very helpful for me to understand this function is not what i need for the moment :P

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Fri May 19, 2023 5:10 am

Cypress wrote:
Fri Apr 02, 2021 5:02 pm
[frozenorb] Missile will only collide with targets cltside and will always explode, so set AlwaysExplode=1 and CollideKill=0. Srvside missile will only explode once {maybe multiple times with pierce stat} and upon running out of range or hitting a wall, whereas cltside missile will explode repeatedly, so you should probably set CollideType=6 to avoid producing a bunch of fake hitsubmissiles.
Hi, I believe i have found someway to fix this :D
i gave CollideKill=1 and pierce=1 to 'frozenorb' missile, then in skill.txt i gave the frozen orb skill srvdofunc 18 to make it activate a state, and gave the state 100% 'skill_pierce'.
with such modifications, it will release real nova bolts, but also desync sometimes, the clt side orb missile disappears on hit and didn't show piercing correctly but srv side missiles were doing their jobs.
so i copied vanilla 'frozenorb' missile, pasted it in a new row, renamed it as 'frozenorbclt', and replaced 'cltmissilea' in skills.txt with it.
then everything seems to be fine, i got a frozen orb correctly explodes every hit i think, the novas have their damage normally.

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Fri May 19, 2023 10:24 am

Hey Nagahaku, I'm not able to replicate that. My frozenorb only ever releases its hitdofunc once and at the end of the missile's lifespan, it never explodes on enemies. Could you post your skills.txt and missiles.txt entries?

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Fri May 19, 2023 1:26 pm

Cypress, of course, actually i'm using your idea in this post: https://d2mods.info/forum/viewtopic.ph ... le#p501824
Deleted...
Tests failed, it can't be fixed in this way :cry:
Last edited by Nagahaku on Sat May 20, 2023 7:59 am, edited 2 times in total.

OrderOfTheScribble
Posts: 34
Joined: Wed Apr 05, 2023 7:35 pm
United States of America

Re: The Guide to Almost All Missile Functions

Post by OrderOfTheScribble » Sat May 20, 2023 7:05 am

I decided to try out the frozenorb fix for myself, and I was seeing novas on collision with an enemy, but they didn't seem to be doing any damage. I did my testing in the Mausoleum since the only cold immunes there are uniques with both Cold Enchanted and Magic Resistant, and sweetspotting (getting an orb to end on top of an enemy) seemed to kill the enemies, so I should've been able to kill boss packs with just a couple orbs depending on how tightly the monsters were packed, but that wasn't the case.

Nagahaku, I noticed a few things about how you implemented this fix:
1) For frozenorb, you set ApplyMastery to 1, but not pierce. I didn't notice this after the first test, so I applied pierce and tested again, but it didn't seem to make a difference.
2) For the skill, you changed its animation to match Lightning and Chain Lightning and removed the delay. In my testing, I left Frozen Orb at its vanilla animation settings, and I don't know if Cypress thought of changing the animation. It's possible the fix only works with UseAttackRate enabled, which is not normally the case for Frozen Orb.
3) Your frozenorb missile is 50% faster than in vanilla. I'm not sure if it matters, but I left it at its vanilla speed for my testing.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Sat May 20, 2023 7:57 am

OrderOfTheScribble, Oh, no, i pasted the wrong code that missed pierce=1... sorry about that and just had it edited...
i think the animation doesn't matter, since they seldom do, and i also noticed that the damage seems not as high as they should be, but the novas do looked like to be dealing damage as in vanilla they really do not...
i'll run some more test to find what happend actually...
and my LOD version is 1.14d, i don't know if this making anything different....

sorry, my mistake, nothing worked after further testing... :cry:

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Sat May 20, 2023 9:16 am

OrderOfTheScribble, Cypress,
Hoho, job's done, it indeed can be fixed as in my memory...
Now here's the story: when i was testing the 'collidekill & pierce' method, i had modified frozenorb missile as 'pclthitfunc=4, psrvhitfunc=5', which is another 'hit nova' function. but when i got a success and finnally applied it into my mod, i forgot about the hitfunc modifications and used the vanilla ones, so both of you got a failure along with me 8-O
so these are the truely working fixes as below:
skills.txt

Code: Select all

skill	Id	charclass	skilldesc	srvstfunc	srvdofunc	prgstack	srvprgfunc1	srvprgfunc2	srvprgfunc3	prgcalc1	prgcalc2	prgcalc3	prgdam	srvmissile	decquant	lob	srvmissilea	srvmissileb	srvmissilec	srvoverlay	aurafilter	aurastate	auratargetstate	auralencalc	aurarangecalc	aurastat1	aurastatcalc1	aurastat2	aurastatcalc2	aurastat3	aurastatcalc3	aurastat4	aurastatcalc4	aurastat5	aurastatcalc5	aurastat6	aurastatcalc6	auraevent1	auraeventfunc1	auraevent2	auraeventfunc2	auraevent3	auraeventfunc3	auratgtevent	auratgteventfunc	passivestate	passiveitype	passivestat1	passivecalc1	passivestat2	passivecalc2	passivestat3	passivecalc3	passivestat4	passivecalc4	passivestat5	passivecalc5	passiveevent	passiveeventfunc	summon	pettype	petmax	summode	sumskill1	sumsk1calc	sumskill2	sumsk2calc	sumskill3	sumsk3calc	sumskill4	sumsk4calc	sumskill5	sumsk5calc	sumumod	sumoverlay	stsuccessonly	stsound	stsoundclass	stsounddelay	weaponsnd	dosound	dosound a	dosound b	tgtoverlay	tgtsound	prgoverlay	prgsound	castoverlay	cltoverlaya	cltoverlayb	cltstfunc	cltdofunc	cltprgfunc1	cltprgfunc2	cltprgfunc3	cltmissile	cltmissilea	cltmissileb	cltmissilec	cltmissiled	cltcalc1	*cltcalc1 desc	cltcalc2	*cltcalc2 desc	cltcalc3	*cltcalc3 desc	warp	immediate	enhanceable	attackrank	noammo	range	weapsel	itypea1	itypea2	itypea3	etypea1	etypea2	itypeb1	itypeb2	itypeb3	etypeb1	etypeb2	anim	seqtrans	monanim	seqnum	seqinput	durability	UseAttackRate	LineOfSight	TargetableOnly	SearchEnemyXY	SearchEnemyNear	SearchOpenXY	SelectProc	TargetCorpse	TargetPet	TargetAlly	TargetItem	AttackNoMana	TgtPlaceCheck	ItemEffect	ItemCltEffect	ItemTgtDo	ItemTarget	ItemCheckStart	ItemCltCheckStart	ItemCastSound	ItemCastOverlay	skpoints	reqlevel	maxlvl	reqstr	reqdex	reqint	reqvit	reqskill1	reqskill2	reqskill3	restrict	State1	State2	State3	delay	leftskill	repeat	checkfunc	nocostinstate	usemanaondo	startmana	minmana	manashift	mana	lvlmana	interrupt	InTown	aura	periodic	perdelay	finishing	passive	progressive	general	scroll	calc1	*calc1 desc	calc2	*calc2 desc	calc3	*calc3 desc	calc4	*calc4 desc	Param1	*Param1 Description	Param2	*Param2 Description	Param3	*Param3 Description	Param4	*Param4 Description	Param5	*Param5 Description	Param6	*Param6 Description	Param7	*Param7 Description	Param8	*Param8 Description	InGame	ToHit	LevToHit	ToHitCalc	ResultFlags	HitFlags	HitClass	Kick	HitShift	SrcDam	MinDam	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDam	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	EMinLev1	EMinLev2	EMinLev3	EMinLev4	EMinLev5	EMax	EMaxLev1	EMaxLev2	EMaxLev3	EMaxLev4	EMaxLev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	ELenSymPerCalc	aitype	aibonus	cost mult	cost add
Frozen Orb	64	sor	frozen orb		18									frozenorb								attacking		miss('frozenorb'.rang)		skill_pierce	100																														(skill('Ice Bolt'.blvl))*par8																				sorceress_cast_cold											ice_cast_3				29					frozenorbclt												1	8		none												SQ	SC	xx	12			1													1						sorceress_cast_cold			30	20					Blizzard								1						1	7	50	1	1																																2	damage synergy	1								7															cold	80	20	24	28	29	30	90	21	25	29	30	31	pst5*skill('coldb'.ast1)/100+skill('coldb'.ast2)	200	25	25	25				896	64000
missiles.txt

Code: Select all

Missile	Id	pCltDoFunc	pCltHitFunc	pSrvDoFunc	pSrvHitFunc	pSrvDmgFunc	SrvCalc1	*srv calc 1 desc	Param1	*param1 desc	Param2	*param2 desc	Param3	*param3 desc	Param4	*param4 desc	Param5	*param5 desc	CltCalc1	*client calc 1 desc	CltParam1	*client param1 desc	CltParam2	*client param2 desc	CltParam3	*client param3 desc	CltParam4	*client param4 desc	CltParam5	*client param5 desc	{filtered}	*server hit calc 1 desc	{filtered}	*server hit param1 desc	{filtered}	*server hit param2 desc	{filtered}	*server hit param3 desc	CHitCalc1	*client hit calc1 desc	cHitPar1	*client hit param1 desc	cHitPar2	*client hit param2 desc	cHitPar3	*client hit param3 desc	DmgCalc1	*damage calc 1	dParam1	*damage param1 desc	dParam2	*damage param2 desc	Vel	MaxVel	VelLev	Accel	Range	LevRange	Light	Flicker	Red	Green	Blue	InitSteps	Activate	LoopAnim	CelFile	animrate	AnimLen	AnimSpeed	RandStart	SubLoop	SubStart	SubStop	CollideType	CollideKill	CollideFriend	LastCollide	Collision	ClientCol	ClientSend	NextHit	NextDelay	xoffset	yoffset	zoffset	Size	SrcTown	CltSrcTown	CanDestroy	ToHit	AlwaysExplode	Explosion	Town	NoUniqueMod	NoMultiShot	Holy	CanSlow	ReturnFire	GetHit	SoftHit	KnockBack	Trans	Qty	Pierce	SpecialSetup	MissileSkill	Skill	ResultFlags	HitFlags	HitShift	ApplyMastery	SrcDamage	Half2HSrc	SrcMissDmg	MinDamage	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDamage	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	MinELev1	MinELev2	MinELev3	MinELev4	MinELev5	Emax	MaxELev1	MaxELev2	MaxELev3	MaxELev4	MaxELev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	HitClass	NumDirections	LocalBlood	DamageRate	TravelSound	HitSound	ProgSound	ProgOverlay	ExplosionMissile	SubMissile1	SubMissile2	SubMissile3	HitSubMissile1	HitSubMissile2	HitSubMissile3	HitSubMissile4	CltSubMissile1	CltSubMissile2	CltSubMissile3	CltHitSubMissile1	CltHitSubMissile2	CltHitSubMissile3	CltHitSubMissile4	EOL
frozenorb	260	19	4	15	5				1	frequency	19	direction increment									1	frequency	19	direction increment									4	increment							4	increment											15	15			30		6		81	81	255	1	0	1	IceOrb	1024	16	16					3	1		1		1							1					1							1	1			1		1				4		8	1																																				1							frozenorbexplode	frozenorbbolt			frozenorbnova				frozenorbbolt			frozenorbnova				0
frozenorbclt	xxx	19	30	15	29				1	frequency	19	direction increment									1	frequency	19	direction increment									4	increment							4	increment											15	15			30		6		81	81	255	1	0	1	IceOrb	1024	16	16					3			1		1							1					1							1	1			1						4		8																																					1							frozenorbexplode	frozenorbbolt			frozenorbnova				frozenorbbolt			frozenorbnova				0
Something needs to be noticed:
1. this hit-nova function seems to be server side triggered only on first hit, other triggers are client side only, so 'collidekill & pierce' method is definately neccessary.
2. piercing animation are also server side only sometimes just as the vanilla frozen orb hit functions, so giving it a vanilla version 'cltmissilea' is also neccessary.

This frozen orb can release novas correctly on every hit, and deals nice damage to enemy packs. and i believe the animation or velocity changes in my mod would not matter, since the real problem causing failures is the hit function :P

Now perhaps i may conclude what these two 'nova' hit functions really do on srv side
frozen orbs would be hitting nothing, just run through targets and explode the nova when range ended or hit a wall, just like what Cypress has already pointed out in this guide.
psrvhitfunc=5 would be hitting the first target it collides, explode the nova and vanish, if collidekill=0, it would do nothing after first hit, but if 'alwaysexplode=1', another nova would explode when range ended.
both of them may not correctly display piercing animation on clt side, but i only tested the frozenorb missile, perhaps some other missiles would be normal?
Last edited by Nagahaku on Sun May 21, 2023 3:16 pm, edited 1 time in total.

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Sun May 21, 2023 11:56 am

It's important to note that pierce only works 4 times, allowing hitdofuncs to occur up to 5 times total. Meaning, if the monster pack is large enough, your frozenorb will desync because it will be dead srvside, but still living cltside. Your frozenorb will become synchronized if you used your srvside frozenorb for cltside too. It's not quite identical to vanilla frozenorb's functionality since it can expire before the end of its range/hitting a wall, but it is really fun to use.

It's also worth noting that the reason I am able to notice these desyncs is due to monspawn (hitfunc 6), because monspawn is special in that it has both cltside and srvside functionality in a srvside only hitfunc. Using monspawn with size=0 velocity=0 invincible wraiths, you can really notice how badly desynced some missiles are. It can be really hard to tell if a missile exists or not otherwise, since complex cases like frozenorb shoot out tons of other missiles from its dofunc that makes it appear to still be alive even when it isn't. This monspawn method is how I tested most missiles that spawn other missiles, because otherwise you can never be sure if the cltside and srvside truly matches.

And as a somewhat related aside, if you wanted it to be super easy to see the exact spawn location of a missile with monspawn, you could even create new monster graphics where the graphic matches the size of the tile it is on, so that you can see the exact tile a missile is spawned at.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Sun May 21, 2023 3:59 pm

Ahh... that is not lucky... seems that my memory is not so reliable, as i thought piercing was 6 times which would be more than enough for most cases...
and it's strange that i have lots of desyncing on piercing that the client side missle doesn't show, i don't know what happened to my game program... i'll test them right away and find the reason...
monspawn function seems to be a very good tester, thank you so much Cypress, :D

Edit: still, the client orb keeps dying on hit, and i can't find why :cry: it should be piercing and continues the flight, but just disappears, as the srv side missile still flying and killing...
perhaps either my game or some txt is corrupted again... i'll test it later on another machine...

Edit: just found something interesting about srvhitfunc=5 novas. it looks a lot simmilar to the common frozenorb nova, but only explode on first hit instead of range ending, after the first impact it will die, this behavior would override collidekill=0, leaving the clt side missile continues the flight and keeps creating fake novas. as the srv side missile always dies, adding 'pierce=1' along with some piercing stats would be the only way to make it create multiple real novas. so with my frozenorb, a specific clt side missile is no longer needed, since i could just give collidekill=0 to it and get the same result as before: desynced orb after some hits. :P
i still can't figure out what happend with my game, when collidekill=1, my frozenorb missile couldn't have a correct clt side piercing animation, not even on another machine :(

Edit: yeah, the piercing cap is 4 indeed. but sometimes i could get a lucky pierce, which means a successful hit & pierce but doesn't count by the game, it happens randomly even in vanilla, that might be the reason why my memory was messed...

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Mon May 22, 2023 9:50 am

Cypress wrote:
Sat Apr 15, 2023 2:47 pm
so you should probably set CollideType=6 to avoid producing a bunch of fake hitsubmissiles
Hi, just find a better way to avoid fake novas: to make clientcol=0.
This is better than collidetype=6, because you can add damage to the orb by setting a related skill to it, or just some elem damage in missiles.txt. srvhitfunc 29 would not release novas on impacts before range ending, but could deal damage.
Perhaps i may use this method in my mod since i can't find a proper way to make the clt side piercing anims correct :(

Edit: I have tested many times with pclthitfunc=4 novas with their collidekill & pierce, and all failed, the clt side missiles seldom pierce... not sure if this problem happens only with me or not :cry:

User avatar
Cypress
Moderator
Champion of the Light
Posts: 465
Joined: Fri Dec 01, 2017 2:08 am

Re: The Guide to Almost All Missile Functions

Post by Cypress » Thu May 25, 2023 1:38 am

Could you post your missile entries? I'm not able to get cltside novas to produce whatsoever if clientcol=0, which is the behavior I would expect. But you are saying that you do get some clthitsubmissiles appearing despite that.

But knowing nothing and assuming everything anyways, inconsistent piercing sounds like you are using the skill_pierce stat, which should not be used ever (except maybe for the Pierce skill itself). Always use item_pierce instead. Skill_pierce has some bizarre, hidden requirements to make it fully work properly, which if I recall correctly requires you to be an amazon and to have the pierce state.

User avatar
Nagahaku
Junior Member
Paladin
Posts: 136
Joined: Sat Nov 30, 2019 1:11 am

Re: The Guide to Almost All Missile Functions

Post by Nagahaku » Thu May 25, 2023 8:30 am

Ah, yeah, i'm using skill_pierce. i'll try item_pierce instead to see if pclthitfunc=4 novas would be ok when piercing.
and here's my recently made frozenorb missile.

Code: Select all

Missile	Id	pCltDoFunc	pCltHitFunc	pSrvDoFunc	pSrvHitFunc	pSrvDmgFunc	SrvCalc1	*srv calc 1 desc	Param1	*param1 desc	Param2	*param2 desc	Param3	*param3 desc	Param4	*param4 desc	Param5	*param5 desc	CltCalc1	*client calc 1 desc	CltParam1	*client param1 desc	CltParam2	*client param2 desc	CltParam3	*client param3 desc	CltParam4	*client param4 desc	CltParam5	*client param5 desc	{filtered}	*server hit calc 1 desc	{filtered}	*server hit param1 desc	{filtered}	*server hit param2 desc	{filtered}	*server hit param3 desc	CHitCalc1	*client hit calc1 desc	cHitPar1	*client hit param1 desc	cHitPar2	*client hit param2 desc	cHitPar3	*client hit param3 desc	DmgCalc1	*damage calc 1	dParam1	*damage param1 desc	dParam2	*damage param2 desc	Vel	MaxVel	VelLev	Accel	Range	LevRange	Light	Flicker	Red	Green	Blue	InitSteps	Activate	LoopAnim	CelFile	animrate	AnimLen	AnimSpeed	RandStart	SubLoop	SubStart	SubStop	CollideType	CollideKill	CollideFriend	LastCollide	Collision	ClientCol	ClientSend	NextHit	NextDelay	xoffset	yoffset	zoffset	Size	SrcTown	CltSrcTown	CanDestroy	ToHit	AlwaysExplode	Explosion	Town	NoUniqueMod	NoMultiShot	Holy	CanSlow	ReturnFire	GetHit	SoftHit	KnockBack	Trans	Qty	Pierce	SpecialSetup	MissileSkill	Skill	ResultFlags	HitFlags	HitShift	ApplyMastery	SrcDamage	Half2HSrc	SrcMissDmg	MinDamage	MinLevDam1	MinLevDam2	MinLevDam3	MinLevDam4	MinLevDam5	MaxDamage	MaxLevDam1	MaxLevDam2	MaxLevDam3	MaxLevDam4	MaxLevDam5	DmgSymPerCalc	EType	EMin	MinELev1	MinELev2	MinELev3	MinELev4	MinELev5	Emax	MaxELev1	MaxELev2	MaxELev3	MaxELev4	MaxELev5	EDmgSymPerCalc	ELen	ELevLen1	ELevLen2	ELevLen3	HitClass	NumDirections	LocalBlood	DamageRate	TravelSound	HitSound	ProgSound	ProgOverlay	ExplosionMissile	SubMissile1	SubMissile2	SubMissile3	HitSubMissile1	HitSubMissile2	HitSubMissile3	HitSubMissile4	CltSubMissile1	CltSubMissile2	CltSubMissile3	CltHitSubMissile1	CltHitSubMissile2	CltHitSubMissile3	CltHitSubMissile4	EOL
frozenorb	260	19	30	15	29				1	frequency	19	direction increment									1	frequency	19	direction increment									4	increment							4	increment											10	10			30		3		81	81	255	1	0	1	IceOrb	1024	16	16					3				1		1						2					1							1	1			1						4		8	1																	cold	80	20	24	28	29	30	90	21	25	29	30	31	(skill('Ice Bolt'.blvl))*(skill('Frozen Orb'.par8))*skill('coldb'.ast1)/100+skill('coldb'.ast2)						1							frozenorbexplode	frozenorbbolt			frozenorbnova				frozenorbbolt			frozenorbnova				0
it's using vanilla srv & clt hit functions, but with clientcol=0 to avoid fake hit-novas, and the nova when range ending explodes normally.
i also added some damage to it and set lastcollide=0 to make it able to deal 'grinding' like damage to single target, seems to be working.
the damage it dealing is not from the hitsubmissiles but the orb itself, that's a very interesting behavior for this hitfunc, it can deal damage if you add some to it

Edit: as for the 'lucky pierce', it happens randomly even in vanilla game, any missile that normally cannot pierce might 'scratch' a target, deals damage and triggers hit functions, but continues to fly. perhaps it's a bug, but a good bug i think...

Edit: Thank you so much, item_pierce worked perfectly with pclthitfunc=4, now hitnovas can pierce normally on clt side :D
finnally I can have my 5-hits frozen orb,
it would be certain that i must give you a big credit when my mod released :P

Edit: Oh no, also not so well... item_pierce indeed being much better than skill_pierce with pclthitfunc=4, but still has about 25-33% chance that would not show the piercing missile...
seems that when using hit-nova functions, piercing stat is not so friendly... either srv or clt side may encounter some bugs...

Post Reply

Return to “General Mod Making”