- Joined
- Aug 11, 2009
- Messages
- 6,522
You know what, I LOVE IT!
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
ThanksCool Spell![]()
Yeahhh it's awesome isn't it ??wow, Torchlight!!!
Yes, you're right, I did it in a hurry, and taking into account that I haven't coded spells since... 2009? well, I can say I haven't forgotten all of the stuff related with WC3 moddingMoyack its nice to see you. I suppose. Your submission looks pretty good. I like the effect of the faded Firelord. I was hoping that you were going to detail the "evasion" a little more but you don't really notice in normal circumstances whether lethal damage ~can~ be evaded. If you kill the unit with 600 damage or something though the unit will still die, because a dead unit cannot be revived simply by adding hit points. Unfortunately.
In fact, the evasion does not work at all. Instead ofEVENT_UNIT_DAMAGEDyou useEVENT_UNIT_ATTACKED. That's funny. You must've typed this up in a hurry. If you change it the evasion seems to work properly, but lethal damage still isn't prevented.
In cases where the damage amount exceeds the unit's life capacity, you'll need to fiddle with the BonusMod library by EarthFury I believe. If the damage is still within the unit's life amount then you simply need to adjust the unit's life before hand. The problem when you fiddle around in these areas is that you realize 0-second timers aren't so instant.
Man, it's one of my favorites too, I enjoy Torchlight as you doShadow armor was one of my favorite abilities of the Destroyer... and your recreation of it looks really cool... ^_^
ThanksWoah I love Moyack's spellOoOo
I have another option, let me try it first if it works, but thanks for your suggestionTo prevent death when the attack is fatal just add the ability 'Invu' to the unit in the event and then run a 0 second timer and remove the ability when the timer expires. Problem solved![]()
Bribe do you categorize HON/LOL spells in the "Dota originality" category?
Sorry, I miss your post@moyack
There are a few major improvements that can be done but either way it looks awesome!
OK, fixed pretty much everything considering the trigger by now.
Here this is how it looks

I'm not too concerned. If it executes well that's the absolute most important thing. I'd prefer something that's never been done before in wc3.
Sorry, I miss your post
Yes, I realized that and I'm doing my fixes. Remember I haven't coded a spell since 2009.... and I'm rusty![]()
Heh
anyway guys... is it possible to get to the rawcode of some ability, but not just ability rawcode like 'A003' but deeper in to the values, like stun duration.
Trough GUI? Or is it hardcoded?
native GetAbilityEffectById takes integer abilityId, effecttype t, integer index returns string
function CasterUseAbilityStatic takes player owner, string modelpath, integer abilityid, real duration, real x, real y returns unit
return CasterUseAbilityLevelStatic(owner,modelpath,abilityid,1,duration,x,y)
endfunction
No need for custom script, it's available in GUI directly. It only can access the Art string data from an ability, though. That said, you can co-opt an unused effect string as a place for you to re-list data, using String to Real/Integer conversion, for a slightly easier way to associate certain values with abilities than by listing them in an array..., this could work in GUI using custom scripts right?JASS:native GetAbilityEffectById takes integer abilityId, effecttype t, integer index returns string
Those aren't natives, those aren't even in Blizzard.j. What are they?JASS:function CasterUseAbilityStatic takes player owner, string modelpath, integer abilityid, real duration, real x, real y returns unit return CasterUseAbilityLevelStatic(owner,modelpath,abilityid,1,duration,x,y) endfunction
I'm against really skilled competition!
I have a feeling I'll lose...
But oh well, great spells everyone! Especially to moyackx!
Misread that as "nearly skilled competition!" xD
good luck to you too
No need for custom script, it's available in GUI directly. It only can access the Art string data from an ability, though. That said, you can co-opt an unused effect string as a place for you to re-list data, using String to Real/Integer conversion, for a slightly easier way to associate certain values with abilities than by listing them in an array...
Those aren't natives, those aren't even in Blizzard.j. What are they?
It is a string function named Game - Ability Effect Art Path, eg:1. I'm pretty sure there isn't any function like that by default (in GUI)
Game - Display to (All players) the text: (Art path of Acid Bomb Missile Art (index 0))

Purgatory Constant

Events


Time - Elapsed game time is 0.01 seconds

Conditions

Actions


Set PgFHUp = 40.00


Set PgLateralSpeed = 15.00


Set PgSizeCylinder = 150.00


Set PgSizeExplosion = 300.00


Set PgSpeed = 0.01


Set PgSpell = Purgatory
Purgatory Init

Events


Unit - A unit Starts the effect of an ability

Conditions


(Ability being cast) Equal to Purgatory

Actions


If (All Conditions are True) then do (Then Actions) else do (Else Actions)



If - Conditions




PgB Equal to 0



Then - Actions




Trigger - Turn on Purgatory Periodic <gen>



Else - Actions


Set PgB = (PgB + 1)


Set PgA = (PgA + 1)


Set PgCaster[PgA] = (Triggering unit)


Set PgLevel = (Level of PgSpell for PgCaster[PgA])


Set PgIntDmgPart = ((1.00 + (2.00 x (Real(PgLevel)))) x (Real((Intelligence of PgCaster[PgA] (Include bonuses)))))


Set PgBonusDmgPart = (50.00 x (Real(PgLevel)))


Set PgDamage[PgA] = (PgIntDmgPart + PgBonusDmgPart)


Set PgTargetPoint[PgA] = (Target point of ability being cast)


Set PgOwner[PgA] = (Owner of PgCaster[PgA])


Set PgMaxAOE[PgA] = (200.00 + (100.00 x (Real(PgLevel))))


Set PgCurrentAOE[PgA] = 100.00


Set PgAngleLeft1 = 360.00


Set PgAngleRight1 = 0.00


Set PgAngleLeft2 = 450.00


Set PgAngleRight2 = 90.00


Set PgAngleLeft3 = 540.00


Set PgAngleRight3 = 180.00


Set PgAngleLeft4 = 630.00


Set PgAngleRight4 = 270.00


Set PgFlyingHeight = 0.00


For each (Integer A) from 1 to 20, do (Actions)



Loop - Actions




-------- ------------------------------------------------------------------------------------------------------------------------------------------------------------ --------




Set PgSpiralPointL1 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleLeft1 degrees)




Set PgSpiralPointL2 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleLeft2 degrees)




Set PgSpiralPointL3 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleLeft3 degrees)




Set PgSpiralPointL4 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleLeft4 degrees)




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointL1 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleLeft1))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointL2 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleLeft2))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointL3 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleLeft3))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointL4 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleLeft4))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




Set PgAngleLeft1 = (PgAngleLeft1 - PgLateralSpeed)




Set PgAngleLeft2 = (PgAngleLeft2 - PgLateralSpeed)




Set PgAngleLeft3 = (PgAngleLeft3 - PgLateralSpeed)




Set PgAngleLeft4 = (PgAngleLeft4 - PgLateralSpeed)




-------- ------------------------------------------------------------------------------------------------------------------------------------------------------------ --------




Set PgSpiralPointR1 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleRight1 degrees)




Set PgSpiralPointR2 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleRight2 degrees)




Set PgSpiralPointR3 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleRight3 degrees)




Set PgSpiralPointR4 = (PgTargetPoint[PgA] offset by PgCurrentAOE[PgA] towards PgAngleRight4 degrees)




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointR1 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleRight1))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointR2 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleRight2))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointR3 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleRight3))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




-------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------




Unit - Create 1 PurgDummy[Cylindre] for PgOwner[PgA] at PgSpiralPointR4 facing 0.00 degrees




Set PgCylinderDummy[PgA] = (Last created unit)




Unit - Set the custom value of PgCylinderDummy[PgA] to (Integer(PgAngleRight4))




Animation - Change PgCylinderDummy[PgA]'s size to (PgSizeCylinder%, PgSizeCylinder%, PgSizeCylinder%) of its original size




Animation - Change PgCylinderDummy[PgA] flying height to PgFlyingHeight at 0.00




Unit Group - Add PgCylinderDummy[PgA] to PgDummyGroup[PgA]




Set PgAngleRight1 = (PgAngleRight1 + PgLateralSpeed)




Set PgAngleRight2 = (PgAngleRight2 + PgLateralSpeed)




Set PgAngleRight3 = (PgAngleRight3 + PgLateralSpeed)




Set PgAngleRight4 = (PgAngleRight4 + PgLateralSpeed)




-------- ------------------------------------------------------------------------------------------------------------------------------------------------------------ --------




Set PgFlyingHeight = (PgFlyingHeight + PgFHUp)




Custom script: call RemoveLocation(udg_PgSpiralPointL1)




Custom script: call RemoveLocation(udg_PgSpiralPointL2)




Custom script: call RemoveLocation(udg_PgSpiralPointL3)




Custom script: call RemoveLocation(udg_PgSpiralPointL4)




Custom script: call RemoveLocation(udg_PgSpiralPointR1)




Custom script: call RemoveLocation(udg_PgSpiralPointR2)




Custom script: call RemoveLocation(udg_PgSpiralPointR3)




Custom script: call RemoveLocation(udg_PgSpiralPointR4)
Purgatory Periodic

Events


Time - Every 0.04 seconds of game time

Conditions

Actions


For each (Integer Pg) from 1 to PgA, do (Actions)



Loop - Actions




Unit Group - Pick every unit in PgDummyGroup[Pg] and do (Actions)





Loop - Actions






Set PgCylinderDummy[Pg] = (Picked unit)






Set PgMovingAngle[Pg] = ((Real((Custom value of PgCylinderDummy[Pg]))) + PgLateralSpeed)






Set PgMovePoint[Pg] = (PgTargetPoint[Pg] offset by PgCurrentAOE[Pg] towards PgMovingAngle[Pg] degrees)






Unit - Move PgCylinderDummy[Pg] instantly to PgMovePoint[Pg]






Set PgCurrentAOE[Pg] = (PgCurrentAOE[Pg] + PgSpeed)






Unit - Set the custom value of PgCylinderDummy[Pg] to (Integer(PgMovingAngle[Pg]))






Custom script: call RemoveLocation(udg_PgMovePoint[udg_Pg])






If (All Conditions are True) then do (Then Actions) else do (Else Actions)







If - Conditions








PgCurrentAOE[Pg] Greater than or equal to PgMaxAOE[Pg]







Then - Actions








Unit Group - Add all units of PgDummyGroup[Pg] to PgDummyGroup2[Pg]







Else - Actions




Unit Group - Pick every unit in PgDummyGroup2[Pg] and do (Actions)





Loop - Actions






Set PgCylinderDummy[Pg] = (Picked unit)






Set PgMovingAngle[Pg] = ((Real((Custom value of PgCylinderDummy[Pg]))) + PgLateralSpeed)






Set PgMovePoint[Pg] = (PgTargetPoint[Pg] offset by PgCurrentAOE[Pg] towards PgMovingAngle[Pg] degrees)






Unit - Move PgCylinderDummy[Pg] instantly to PgMovePoint[Pg]






Set PgCurrentAOE[Pg] = (PgCurrentAOE[Pg] - PgSpeed)






Unit - Set the custom value of PgCylinderDummy[Pg] to (Integer(PgMovingAngle[Pg]))






Custom script: call RemoveLocation(udg_PgMovePoint[udg_Pg])






If (All Conditions are True) then do (Then Actions) else do (Else Actions)







If - Conditions








PgCurrentAOE[Pg] Less than or equal to 50.00







Then - Actions








Unit - Kill PgCylinderDummy[Pg]








Unit - Create 1 PurgDummy[Final Explosion] for PgOwner[Pg] at PgTargetPoint[Pg] facing 0.00 degrees








Custom script: call RemoveLocation(udg_PgTargetPoint[udg_Pg])








Set PgExplosionDummy[Pg] = (Last created unit)








Set PgExplosionPoint[Pg] = (Position of PgExplosionDummy[Pg])








Unit - Add a 1.00 second Generic expiration timer to PgExplosionDummy[Pg]








Animation - Change PgExplosionDummy[Pg]'s size to (PgSizeExplosion%, PgSizeExplosion%, PgSizeExplosion%) of its original size








Set PgTargetGroup = (Units within PgMaxAOE[Pg] of PgExplosionPoint[Pg])








Unit Group - Pick every unit in PgTargetGroup and do (Actions)









Loop - Actions










Set PgTarget = (Picked unit)










If (All Conditions are True) then do (Then Actions) else do (Else Actions)











If - Conditions












(PgTarget is A structure) Equal to False












(PgTarget is Magic Immune) Equal to False












(PgTarget belongs to an enemy of PgOwner[Pg]) Equal to True











Then - Actions












Unit - Cause PgCaster[Pg] to damage PgTarget, dealing PgDamage[Pg] damage of attack type Spells and damage type Normal











Else - Actions








Custom script: call RemoveLocation(udg_PgExplosionPoint[udg_Pg])








Custom script: call DestroyGroup(udg_PgTargetGroup)








Unit Group - Remove PgCylinderDummy[Pg] from PgDummyGroup2[Pg]








Set PgB = (PgB - 1)








If (All Conditions are True) then do (Then Actions) else do (Else Actions)









If - Conditions










PgB Equal to 0










(PgDummyGroup[Pg] is empty) Equal to True










(PgDummyGroup2[Pg] is empty) Equal to True









Then - Actions










Set PgA = 0










Trigger - Turn off Purgatory Periodic <gen>









Else - Actions







Else - Actions
Right after that, you should clear PgDummyGroup[Pg]:it will do a bugged WIP ^^. It's MUI but it lag alot when multiple casting, so if you guys can help on that too, it would be awesume.
...
If - Conditions
PgCurrentAOE[Pg] Greater than or equal to PgMaxAOE[Pg]
Then - Actions
Unit Group - Add all units of PgDummyGroup[Pg] to PgDummyGroup2[Pg]
Unit Group - Remove all units from PgDummyGroup[Pg]

did you mean, my hades army?I wanna see that Hades Army...
ThanksI'm against really skilled competition!
I have a feeling I'll lose...
But oh well, great spells everyone! Especially to moyackx!
Oh, i didn't know i have to save it twice for it to be usable in vanilla WE.maybe its a new file, and he forgot that he need to save it twice for it to compile...
Um..
can i add the simple respawning creep by me in the wip?
