• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Spells & Systems Mini-Contest #20

Status
Not open for further replies.
Level 15
Joined
Feb 15, 2006
Messages
851
Cool Spell :)
Thanks :)

wow, Torchlight!!!
Yeahhh it's awesome isn't it ??

Moyack 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 of EVENT_UNIT_DAMAGED you use EVENT_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.
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 modding :p

And your suggestion are good, I'll do my update of this spell using something I did... in 2008 and it will really improve the damage detection in this spell.

Thanks for you comments and support.

Shadow armor was one of my favorite abilities of the Destroyer... and your recreation of it looks really cool... ^_^
Man, it's one of my favorites too, I enjoy Torchlight as you do :D

Woah I love Moyack's spell :eek:OoOo
Thanks :D

To 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 :D
I have another option, let me try it first if it works, but thanks for your suggestion :)
 
Level 17
Joined
Jan 21, 2010
Messages
2,111
Yeah, i almost play all the game on ps 1, and some on ps2
about the dota rips, did you know there is a dota fun version?
but, after see your explanation up there, i decided to create suikoden 2 spell , where is the unicorn and a hypogrph combine their strenght to kill an enemy
How 'bout that?
 
OK, fixed pretty much everything considering the trigger by now.

Here this is how it looks
 

Attachments

  • wc3Shot.png
    wc3Shot.png
    2.9 MB · Views: 101
Level 22
Joined
Nov 14, 2008
Messages
3,256
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.

I see, there are DOTA spells as well that haven't been done here :D (except in DOTA I guess, yes I'm stupid)

Sorry, I miss your post :p

Yes, I realized that and I'm doing my fixes. Remember I haven't coded a spell since 2009.... and I'm rusty :(

No worries :)

Still you're one that made the dot spell tutorial over at WC3C that taught me the real basics in vJASS aaaaaaaaaaaaaaaaaaaaaaand did I mention that you're moyack? The name should speak for itself. Really.
 
Level 19
Joined
Feb 4, 2009
Messages
1,313
Heh :p

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?

you could save the stun duration for every spell (will be hard with passive bash)
or check if the unit still has stun buff
or trigger the stun yourself
 
Ahh... Yeah it could be triggered, but still default stun/slow is just fine, you just need to modify values in OE.

Edit: I'm using way outdated Jasscraft and I found this function...

JASS:
native GetAbilityEffectById         takes integer abilityId, effecttype t, integer index returns string
, this could work in GUI using custom scripts right?

or


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
 
Last edited:
Level 10
Joined
Jul 12, 2009
Messages
318
JASS:
native GetAbilityEffectById         takes integer abilityId, effecttype t, integer index returns string
, this could work in GUI using custom scripts right?
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...

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
Those aren't natives, those aren't even in Blizzard.j. What are they?
 
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?

1. I'm pretty sure there isn't any function like that by default (in GUI)

2. I have no idea, I just copied the text from JassCraft.
 
Level 20
Joined
Jul 6, 2009
Messages
1,885
Here's another WiP. I have reworked the whole spell several times because i've always found some other, more efficient, way. Thus i haven't really progressed visually since my last WiP. I haven't finished the effect on enemies yet.
 

Attachments

  • Infernal Wrath.w3x
    25.7 KB · Views: 50
Level 7
Joined
Dec 19, 2009
Messages
249
Well guys, I started and I have a problem with my trigger... I don't know if it's legal to help each other but, if you guys can, it will be appreciate if you can't, 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.
Edit: Suggestion to how to improve would be kewl.

There's the trigger

  • 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



There's the map if you want to test it (care for lag)
View attachment Purgatory spell contest.w3x
 
Level 10
Joined
Jul 12, 2009
Messages
318
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]
Right after that, you should clear PgDummyGroup[Pg]:
  • Unit Group - Remove all units from PgDummyGroup[Pg]
Then, it lags when multiple casting just because of how many units you're moving. It is too complex an effect for WC3 to handle. After all, each cast creates 8x20=160 units, all being moved every 0.04 seconds. I have trouble with much more than 200... But, for a single cast, it looks really cool. :wink:
 
Status
Not open for further replies.
Top