Spell Multicast

Chaos_Knight

New Member
Reaction score
39
Try this:
JASS:
scope Multicast initializer InitTrig

    globals
        private constant integer ABILITY_ID 		  = 'A000' //Raw code of the ability
        private constant integer DUMMY_ID 	          = 'dumy' //Raw code of the dummy
	
        private constant string  TEXTTAG_TEXT         = "Multicast !"
        private constant real    TEXTTAG_HEIGHT       = 15.
        private constant real    TEXT_SIZE            = 0.023
        private constant real    LIFE_TIME_DUMMY 	  = 2.     // How long the dummy will last, if you use spells like blizzard you would want to make this longer.
        private constant real    SPELL_DELAY 		  = .2 	   // Sets the delay between the casted spell and the multicasted spell
        private constant real	 LIFE_TIME_TEXT 	  = 3.     // Time util text disappear
        private constant real	 TEXT_FADE_POINT 	  = 2.     // Time it takes before the text start to fade out
        private constant integer TEXT_COLOR_RED       = 255    // The "red" color of the texttag
        private constant integer TEXT_COLOR_GREEN     = 0      // The "greed" color of the texttag
        private constant integer TEXT_COLOR_BLUE      = 0      // The "blue" color of the texttag
        private constant integer TEXT_COLOR_ALPHA     = 0      // The "alpha" color of the texttag (Transparency)
    endglobals

    private constant function Chance takes integer spellLvl returns real
        return 12. + (8. * spellLvl)
    endfunction

//=========================================================\\
//========== Nothing to edit past this point ==============\\
//=========================================================\\

    private function Conditions takes nothing returns boolean
        return GetUnitAbilityLevel(GetTriggerUnit(), ABILITY_ID) > 0 and GetRandomInt(1, 100) <= Chance(GetUnitAbilityLevel(GetTriggerUnit(), ABILITY_ID))
    endfunction

    private function Actions takes nothing returns nothing
        local unit   u  = GetTriggerUnit()
        local real   x  = GetUnitX (u)
        local real   y  = GetUnitY (u)
        local player p  = GetOwningPlayer(u)
        local unit   tu = CreateUnit(p, DUMMY_ID, x, y, 270)
        local unit   t  = GetSpellTargetUnit()
        local real   tx = GetSpellTargetX()
        local real   ty = GetSpellTargetY()
        local string s  = UnitId2String(GetUnitCurrentOrder(u))
        local texttag tt
        local integer spellid = GetSpellAbilityId()
        
        call UnitApplyTimedLife( tu, 'BTLF', LIFE_TIME_DUMMY )
        call UnitAddAbility( tu, GetSpellAbilityId() )
        call SetUnitAbilityLevel (tu, ABILITY_ID, GetUnitAbilityLevel(u, ABILITY_ID ) )
        
      //============= This is for the Multicast text, don't edit ===================\\
            set tt = CreateTextTag()
            call SetTextTagText ( tt, TEXTTAG_TEXT, TEXT_SIZE )
            call SetTextTagPos ( tt, x, y, TEXTTAG_HEIGHT )
            call SetTextTagColor (tt, TEXT_COLOR_RED, TEXT_COLOR_GREEN, TEXT_COLOR_BLUE, TEXT_COLOR_ALPHA )
            call SetTextTagVelocity ( tt, 0.0355 * Cos(90. * bj_DEGTORAD), 0.0355 * Sin( 90. * bj_DEGTORAD ) )
            call SetTextTagVisibility ( tt, true )
            call SetTextTagFadepoint ( tt, TEXT_FADE_POINT )
            call SetTextTagLifespan ( tt, LIFE_TIME_TEXT )
            call SetTextTagPermanent ( tt, false )
      //==========================================================================\\
        
        call TriggerSleepAction( SPELL_DELAY )
        
        if GetRectMaxX( bj_mapInitialPlayableArea ) > tx and GetRectMinX( bj_mapInitialPlayableArea ) < tx and GetRectMaxY( bj_mapInitialPlayableArea ) > ty and GetRectMinY( bj_mapInitialPlayableArea ) < tx then
            call IssuePointOrder ( tu, s, tx, ty )
        elseif GetSpellTargetUnit() != null then
            call IssueTargetOrder( tu, s, t )
            call IssueImmediateOrder( tu, s )
        endif
        
        set p  = null
        set u  = null
        set tu = null
        set t  = null
        set s  = null
        set tt = null
    endfunction

    private function InitTrig takes nothing returns nothing
        local trigger t = CreateTrigger()
        
        call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(t, Condition(function Conditions))
        call TriggerAddAction(t, function Actions)
    endfunction

endscope

Koma, i think SweishChef, didnt want to let you do his work... :(
 

SwedishChef

New Member
Reaction score
32
I wanted help with the Jass trigger. I actually asked him personally to fix it since I have just very basic Jass knowledge. :)
 

SanKakU

Member
Reaction score
21
i didn't really look at the code much since there seems to be a lot of it...but, if i may make a suggestion...

are you using a dummy unit to cast the second helping of whatever spell is getting multicasted? if that's the case...why don't you spawn the dummy unit at the target unit's position instead of the caster's? or maybe half way in between or something...if range is a problem for whatever reason.
 

SwedishChef

New Member
Reaction score
32
If I would spawn the dummy at the same position as target is there would be some problems. First some spells don't have targets so they wont work secondly spells like fire breath will look bad and not hit the targets it should hit. But I was thinking something like moving the dummy unit 20 range closer and maybe see if that fixes the problem. Right now I got loads of work in school so I'm short on time.
 

Chaos_Knight

New Member
Reaction score
39
Make a good header.

Like:
JASS:
// +-------------------------------------------------------------------------------+
// |     Moving Strikes - Created by Chaos_Knight.  Requires a vJass preprocessor! |   
// +-------------------------------------------------------------------------------+
// | Gives a small chance to move the Attacker to the GetAttacker() and            |
// | deals damage to the GetTriggerUnit()                                          |
// +-------------------------------------------------------------------------------+
// | How to Import:                                                                |
// |  - Create a new trigger                                                       |
// |  - Convert it to Custom text (Edit > Convert to Custom Text)                  |
// |  - Replace everything there with this code                                    |
// |  - Change the constants to suit yourself                                      |
// |  - Enjoy!                                                                     |
// +-------------------------------------------------------------------------------+


Thats not very good, but i assume you understand what i mean. :D
 

HeX.16

Isn't Trollin You Right Now
Reaction score
131
Make a good header.

Like:
JASS:
// +-------------------------------------------------------------------------------+
// |     Moving Strikes - Created by Chaos_Knight.  Requires a vJass preprocessor! |   
// +-------------------------------------------------------------------------------+
// | Gives a small chance to move the Attacker to the GetAttacker() and            |
// | deals damage to the GetTriggerUnit()                                          |
// +-------------------------------------------------------------------------------+
// | How to Import:                                                                |
// |  - Create a new trigger                                                       |
// |  - Convert it to Custom text (Edit > Convert to Custom Text)                  |
// |  - Replace everything there with this code                                    |
// |  - Change the constants to suit yourself                                      |
// |  - Enjoy!                                                                     |
// +-------------------------------------------------------------------------------+


Thats not very good, but i assume you understand what i mean. :D

Lol i can see that helping the spell.
 

SanKakU

Member
Reaction score
21
If I would spawn the dummy at the same position as target is there would be some problems. First some spells don't have targets so they wont work secondly spells like fire breath will look bad and not hit the targets it should hit. But I was thinking something like moving the dummy unit 20 range closer and maybe see if that fixes the problem. Right now I got loads of work in school so I'm short on time.

maybe you should just check the order string or something... are we running into the problem only on the order string that chain lightning uses? if so, maybe we can change the string?
 

SwedishChef

New Member
Reaction score
32
Yeah and only when you use the spell at maximum range. The order string can't be changed very much so I think the problem has to do with the chain lightning going over maximum range.
 

SanKakU

Member
Reaction score
21
that's why i suggested changing the position of the dummy unit before multicasting. if moving it 100 range closer to the target fixes chain lightning...i think graphically it will not be so hard to adjust to...in fact, it might even look BETTER than having the dummy unit exactly where the caster is, idk.
 

Weep

Godspeed to the sound of the pounding
Reaction score
400
Yeah and only when you use the spell at maximum range.
Well, from one point of view, if the target has moved out of range before the multicast has occurred, you could argue that it shouldn't cast a second time.

That said, you know the IssueOrder natives return a boolean if the order was successful? As such, with an immovable dummy, it would return false if the target is out of range (as well as other reasons, like the target has died, gone invulnerable, gone out of sight, etc.)
 

SwedishChef

New Member
Reaction score
32
Hm got an idea now. If I give the dummy max ms it will be able to hunt it down and cast the spell maybe. Then I just have to lower the dummy duration. Will think about it.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
This will still look weird...

I'd say don't do it. And also, the target unit might also have max ms :S

But as Weep said, this should still not quite work like it does atm :S
But sure, this can be done... As SanKaKU said, just move/create the dummy the range of the spell from the target towards the caster :D
That'll solve all of your problems ;)
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top