• 🏆 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!

[v]JASS - Mirror Ward v0.3

BTNCharm.png
Mirror Ward
Description
Summons a powerful ward which channels magical enenergy to create a circle of mirrors around it. Enemy unit within a range of 400 get damaged over the time. Enemies who try to leave the circle will be knocked back towards the ward.


Level 1
Level 2Level 3

Duration: 15 Seconds
Duration: 25 SecondsDuration: 35 Seconds

Damage per Second: 7
Damage per Second: 12Damage per Second: 17


This spell requires Jass New Gen Pack. Download it from here
For some reason this thread got locked. If you want to give critique you´re welcome to send me a PM or VM.

Spell Code:
JASS:
library MirrorWard initializer Init uses TNTI,TNTK

    globals
        private constant integer    SID = 'MrWr'
        //The rawcode of the Spell
        
        private constant integer    DID = 'mwdu'
        //The rawcode of the Ward
        
        private constant integer    RING_ELEMENTS = 20
        //The amount of special effects which form the circle
        
        private constant string     RING_SFX   = "Abilities\\Spells\\Human\\MagicSentry\\MagicSentryCaster.mdl"
        //The model path of the special effect for the circle
        
        private constant string     DAMAGE_SFX = "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareMissile.mdl"
        //The model path of the special effect which will showup upon damaged enemies
        
        private constant string     END_SFX    = "Units\\NightElf\\Wisp\\WispExplode.mdl"
        //The model path of the special effect which appears when the ward is destroyed
        
        private constant string     DAMAGE_BONE= "overhead"
        //The bone name where the DAMAGE_SFX will appear
        
        private constant boolean    FLASH_SFX  = false
        //Turn this on TRUE and the RING_SFX will created peridically (not very efficient)
        //Turn this on FALSE and the RING_SFX´s will only be created when the ward spawns
        //and will be removed when the ward dies
        
        private constant real       EFFECT_INTERVALL = 0.2
        //The recreation intervall for the RING_SFX. You don´t need this if you turnded
        //FLASH_SFX on false
        
        private constant real       DAMAGE_INTERVALL = 0.4
        //The intervall in which the enemies inside the circle get damad
        
        private constant real       MOVE_SPEED = 17.5
        //The movespeed of the enemy unit when it´s knocked back to the center
        
        private constant boolean    COLLISION = true
        //Determines if the enemy units have collision turned on or off when the are
        //knocked back to the center
        
        //Damage Settings - Should be selfexplaining
        private constant attacktype ATTACK_TYPE = null
        private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_UNIVERSAL
        private constant weapontype WEAPON_TYPE = WEAPON_TYPE_WHOKNOWS
        
        private group            TEMP_GROUP = CreateGroup()
        //An enumaration group to detect enemies
        
        private filterfunc       ENUM_FILTER
        //Enumaration filter for the enemies
        
    endglobals
        
    //The Area of Effct of the ward
    private constant function GetAoERange takes real level returns real
        return level * 0 + 400
    endfunction
    
    //The amount of damage dealt to the enemies per second
    private constant function GetDamage takes real level returns real
        return level * 5 + 2
    endfunction
    
    //How long should the ward stay ?
    private constant function GetDuration takes real level returns real
        return level * 10 + 5
    endfunction
        
    private struct Spell extends Indexable
    
        static thistype temp
        real runtime = 0.03
        
        unit ward
        player owner
        effect array fx [RING_ELEMENTS]
        real sfx_intervall = 0.0
        real dmg_intervall = 0.0
        real damage
        real range
        real x
        real y
        
        method onDestroy takes nothing returns nothing
        
            local integer i = 0
            
            static if not FLASH_SFX then
            
                loop
                    exitwhen i == RING_ELEMENTS
                    call DestroyEffect(.fx[i])
                    set i = i +1
                endloop
                
            endif
            
            call DestroyEffect(AddSpecialEffect(END_SFX,.x,.y))
            
        endmethod
            
        //The spell ends when the ward is dead or is being removed from the game
        method onBreak takes nothing returns boolean
            return IsUnitType(.ward,UNIT_TYPE_DEAD) or .ward == null
        endmethod
        
        //Will draw the circle effect. The way it works depends on FLASH_SFX
        method DrawRing takes nothing returns nothing
        
            local real step = (2*bj_PI)/RING_ELEMENTS
            local real rad  = 0.0
            local integer i = 0
            
            loop
                
                static if FLASH_SFX then
                    exitwhen rad >= 2*bj_PI
                    call DestroyEffect(AddSpecialEffect(RING_SFX,.x+.range*Cos(rad),.y+.range*Sin(rad)))
                else
                    exitwhen i == RING_ELEMENTS
                    set .fx[i] = AddSpecialEffect(RING_SFX,.x+.range*Cos(rad),.y+.range*Sin(rad))
                    set i = i+1
                endif
                
                set rad = rad + step
            endloop
            
        endmethod            
        
        //Does some timing stuff and the enumarations. And may updates the circle
        method onLoop takes nothing returns nothing
            
            static if FLASH_SFX then
            
                if .sfx_intervall <= 0. then
                    call .DrawRing()
                    set .sfx_intervall = EFFECT_INTERVALL
                else
                    set .sfx_intervall = .sfx_intervall - .runtime
                endif
            
            endif
            
            if .dmg_intervall <= 0. then
                set .dmg_intervall = DAMAGE_INTERVALL
            else
                set .dmg_intervall = .dmg_intervall - .runtime
            endif
            
            set thistype.temp = this
            call GroupEnumUnitsInRange(TEMP_GROUP,.x,.y,.range*1.15, ENUM_FILTER)
            //NOTE: .range*1.15 will generate a buffer zone.
            
        endmethod
        
        //Creator method
        static method create takes unit c,real x, real y returns thistype
        
            local thistype this = thistype.allocate()
            local integer lv = GetUnitAbilityLevel(c,SID)
                        
            set .owner = GetOwningPlayer(c)
            set .ward = CreateUnit(.owner,DID,x,y,0)
            set .damage = GetDamage(lv) * DAMAGE_INTERVALL
            set .range = GetAoERange(lv)
            set .x = x
            set .y = y
            call UnitApplyTimedLife(.ward,'BTLF',GetDuration(lv))
            
            static if not FLASH_SFX then
                call .DrawRing()
            endif
            
            return this
            
        endmethod
    
    endstruct
        
    //Enumaration function to detect the enemies
    private function EnumFilterFunc takes nothing returns boolean
        
        local unit u = GetFilterUnit()
        local Spell this = Spell.temp
        local TNTKnock knock
        local real x = GetWidgetX(u) - this.x
        local real y = GetWidgetY(u) - this.y
        local real d = SquareRoot(x*x+y*y)
        
        //If the unit is a valid target
        if IsUnitEnemy(u,this.owner) and not( IsUnitType(u,UNIT_TYPE_DEAD) or IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE) or IsUnitType(u,UNIT_TYPE_STRUCTURE) or IsUnitType(u,UNIT_TYPE_ANCIENT) ) then
        
            //and it´s time to deal damage
            if this.dmg_intervall <= 0. then
                call UnitDamageTarget(this.ward,u,this.damage,false,false,ATTACK_TYPE,DAMAGE_TYPE,WEAPON_TYPE)
                call DestroyEffect(AddSpecialEffectTarget(DAMAGE_SFX,u,DAMAGE_BONE))
            endif
            
            //If the unit is about to leave the circle
            if d > this.range*0.85 and not TNTKnock.IsInMotion(u) then
            
            //NOTE: .range*0.85 will work like a buffer zone.
            
                set knock = TNTKnock.create()
                call knock.StartLinear(u,x+this.x,y+this.y,Atan2(y,x)+bj_PI,d,MOVE_SPEED)
                set knock.collision = COLLISION
            endif
            
        endif
        
        set u = null
        return false
        
    endfunction
    
    //Will start the spell
    private function onCast takes nothing returns nothing
        call Spell.create(GetTriggerUnit(),GetSpellTargetX(),GetSpellTargetY())
    endfunction
        
    //Will check for the correct rawcode
    private function onCheck takes nothing returns boolean
        return GetSpellAbilityId() == SID
    endfunction
    
    //Initializer
    private function Init takes nothing returns nothing
    
        local trigger trig = CreateTrigger()
        
        set ENUM_FILTER = Filter( function EnumFilterFunc)
        
        //Preloading cosmetics
        call Preload(RING_SFX)
        call Preload(DAMAGE_SFX)
        call Preload(END_SFX)
        call PreloadStart()
        
        //Trigger register stuff
        call TriggerRegisterAnyUnitEventBJ(trig,EVENT_PLAYER_UNIT_SPELL_CAST)
        call TriggerAddCondition(trig, Filter( function onCheck))
        call TriggerAddAction(trig, function onCast)
        
        set trig = null
                
    endfunction

endlibrary
TNTI:
JASS:
library TNTI

    private interface Ext
    
        static integer Total   = 0
        static integer Current = 0
        static constant real Intervall = .01
        static timer TIM = null
        
        real runtime = .01
        
        method onBreak    takes nothing returns boolean defaults true
        method onLoop     takes nothing returns nothing defaults nothing
        
    endinterface
        
    struct Indexable extends Ext
    
        private static Ext array Index
        private real timing = .0
        
        /*stub method onBreak takes nothing returns boolean
            call BJDebugMsg(SCOPE_PREFIX+": |c00FF0000onBreak() from struct with id: "+I2S(.getType())+" is not defined !")
            return true
        endmethod
        
        stub method onLoop takes nothing returns nothing
            call BJDebugMsg(SCOPE_PREFIX+": |c00FF0000onLoop() from struct with id: "+I2S(.getType())+" is not defined !")
        endmethod*/
                
        private method onDestroy takes nothing returns nothing
        
            set Ext.Total = Ext.Total -1
            set thistype.Index[Ext.Current] = thistype.Index[Ext.Total]
            set Ext.Current = Ext.Current-1
                        
            if Ext.Total == 0 then
                call PauseTimer(Ext.TIM)
            endif
                        
        endmethod
    
        private static method Loop takes nothing returns nothing
        
            local Ext this
            set Ext.Current = 0
            
            loop
                exitwhen Ext.Current == Ext.Total
                set this = thistype.Index[Ext.Current]
                
                set .timing = .timing + thistype.Intervall
                
                if .timing >= .runtime then
                    if .onBreak() then
                        call .destroy()
                    else
                        call .onLoop()
                        set .timing = 0
                    endif
                endif
                                                
                set Ext.Current = Ext.Current+1
            endloop
                        
        endmethod
        
        static method create takes nothing returns thistype
        
            local Ext this = thistype.allocate()
            set thistype.Index[Ext.Total] = this
            set Ext.Total = Ext.Total +1
                        
            if Ext.Total == 1 then
                call TimerStart(Ext.TIM,Ext.Intervall,true, function thistype.Loop)
            endif
                       
            return this
            
        endmethod
            
        private static method onInit takes nothing returns nothing
            set Ext.TIM = CreateTimer()
        endmethod
        
    endstruct
endlibrary
TNTK:
JASS:
library TNTK requires TNTI

    globals
        private constant real OFFSET = 64.
        private group MOTION_GRP
        private real MAX
        private real MAY
        private real MIX
        private real MIY
    endglobals
    
    struct TNTKnock extends Indexable
    
        unit knocker = null
        unit target  = null
        integer data = 0x0
        boolean collision = false            
        
        private  real runtime = 0.02
        readonly real velx = .0
        readonly real vely = .0
        readonly boolean inuse = false
        readonly real x = .0
        readonly real y = .0
        readonly real distance = 10.
        readonly real radiants = .0
        readonly real time  = .0
        readonly real speed = .0
        
        static method IsInMotion takes unit u returns boolean
            return IsUnitInGroup(u,MOTION_GRP)
        endmethod
        
        method IsInMap takes nothing returns boolean
            return .x <= MAX and .x >= MIX and .y <= MAY and .y >= MIY
        endmethod
                        
        stub method onKnock takes nothing returns nothing
            if .collision then
                call SetUnitPosition(.knocker,.x,.y)
            else
                call SetUnitX(.knocker,.x)
                call SetUnitY(.knocker,.y)
            endif
        endmethod
                    
        method onBreak takes nothing returns boolean
            return not .IsInMap() or .distance <= .speed+1. /*
             */ or ( .target  != null and IsUnitType(.target ,UNIT_TYPE_DEAD))  /*
             */ or ( .knocker != null and IsUnitType(.knocker,UNIT_TYPE_DEAD))
        endmethod
                
        method onLoop takes nothing returns nothing
                                        
            if .inuse then
            
                if .target == null then
                    set .x = .x + velx
                    set .y = .y + vely
                    set .time = .time - .runtime
                    set .distance = .distance - .speed
                else
                    set .velx = GetWidgetX(.target) - GetWidgetX(.knocker)
                    set .vely = GetWidgetY(.target) - GetWidgetY(.knocker)
                    set .radiants = Atan2(.vely,.velx)
                    set .distance = SquareRoot(.velx*.velx+.vely*.vely) - .speed
                    set .x = .x + Cos(.radiants) * .speed
                    set .y = .y + Sin(.radiants) * .speed
                    set .time = .time + .runtime
                endif
                            
                call .onKnock()
            
            endif
            
        endmethod
        
        method onDestroy takes nothing returns nothing
            call GroupRemoveUnit(MOTION_GRP,.knocker)
            set .knocker = null
            set .target  = null
            set .inuse   = false
        endmethod
                
        method ChangeSpeed takes real newspeed returns nothing
        
            set velx = Cos(.radiants) * newspeed
            set vely = Sin(.radiants) * newspeed
            set .speed = newspeed
            set .time = (.distance*.runtime)/newspeed
            
        endmethod
        
        method ChangeDirection takes real newrad returns nothing
        
            set velx = Cos(newrad) * .speed
            set vely = Sin(newrad) * .speed
            set .radiants = newrad
            
        endmethod
        
        method Stop takes nothing returns nothing
            set .inuse = true
            set .distance = -1.
        endmethod
        
        method StartLinear takes unit u, real sx, real sy, real rad, real dis, real speed returns nothing
        
            if speed > 1 and not .inuse then
            
                set .knocker = u
                set .target = null
                set .x = sx
                set .y = sy
                set .distance = dis
                set .radiants = rad
                set .time = (dis*.runtime) / speed
                set .speed = speed
                set .velx = Cos(rad)*speed
                set .vely = Sin(rad)*speed
                set .inuse = true
                call GroupAddUnit(MOTION_GRP,u)
                
            endif
            
        endmethod
                
        method StartLinearTimed takes unit u, real sx, real sy, real rad, real dis, real time returns nothing
            
            if time > .runtime and not .inuse then
                        
                set .knocker = u
                set .target = null
                set .x = sx
                set .y = sy
                set .distance = dis
                set .radiants = rad
                set .time = time
                set .speed = (dis*.runtime) / time
                set velx = Cos(rad) * .speed
                set vely = Sin(rad) * .speed
                set .inuse = true
                call GroupAddUnit(MOTION_GRP,u)
                
            endif
                    
        endmethod
        
        method StartLinearTimedLoc takes unit u, location from, location to, real time, boolean noleak returns nothing
        
            local real x = GetLocationX(to) - GetLocationX(from)
            local real y = GetLocationY(to) - GetLocationY(from)
            local real rad = Atan2(y,x)
            local real dis = SquareRoot(x*x+y*y)
            
            call .StartLinearTimed(u,GetLocationX(from),GetLocationY(from),rad,dis,time)
            
            if noleak then
                call RemoveLocation(from)
                call RemoveLocation(to)
            endif
                        
        endmethod
        
        method StartHomingTimed takes unit u, unit targ, real sx, real sy, real speed returns nothing
                    
            if IsUnitType(targ,UNIT_TYPE_DEAD) != true and targ != null and speed > 0. then
            
                set .knocker = u
                set .target = targ
                set .x = sx
                set .y = sy
                set .speed = speed
                set .time = 0.
                set .distance = speed+3.
                set .inuse = true
                call GroupAddUnit(MOTION_GRP,u)
                                
            endif
                        
        endmethod
                
        private static method onInit takes nothing returns nothing
        
            set MAX = GetRectMaxX(bj_mapInitialPlayableArea) - OFFSET
            set MAY = GetRectMaxY(bj_mapInitialPlayableArea) - OFFSET
            set MIX = GetRectMinX(bj_mapInitialPlayableArea) + OFFSET
            set MIY = GetRectMinY(bj_mapInitialPlayableArea) + OFFSET
            set MOTION_GRP = CreateGroup()
                        
        endmethod
        
    endstruct   
    
endlibrary

-Spell got lost after the purge. Now i´ve updated it.
-Major performance update. (Using my libraries & exploiting OOP)


Keywords:
ward, mirror, mirror ward, knockback, damage over time, dot, blue
Contents

Noch eine WARCRAFT-III-Karte (Map)

Reviews
20:16, 10th Jun 2009 hvo-busterkomo: A good spell, with a nice effect and effective scripting. Still, I have a few complaints. 1. Is their any reason for inlining the bj_DEGTORAD? You could also do the conversion on the temp_deg at the same time...
Status
Not open for further replies.

Moderator

M

Moderator

20:16, 10th Jun 2009
hvo-busterkomo:
A good spell, with a nice effect and effective scripting. Still, I have a few complaints.
1. Is their any reason for inlining the bj_DEGTORAD? You could also do the conversion on the temp_deg at the same time, preventing the operation inside the Cos and Sin. Better yet, avoid the use of degrees entirely.
2. Your knockback system could definitely use improvement. Instead of reinventing the wheel, you could have used a more efficient system which used struct indexing over attachment.
 
Level 11
Joined
Jul 2, 2008
Messages
601
Ehm... first of all. How can we know, that units really can't escape? They don't flee, they just stay and attack the ward. By the way, does the ward supposed to be vulnureable? Also, I can't get the name of the spell, why mirror? oO I thought it'll be connected somehow with illusions etc

Level 2
Radius 400
Duration 20
Damage per Second 11

Level 3
Radius 600
Duration 16.5
Damage per Second 5.5

What the hell? From level to another the duration and damage are decreased? oO
 
Level 9
Joined
Aug 2, 2008
Messages
219
The units cant escape because there is a timer which checks every 0.175 seconds for every enemy inside the circle if the distance between the unit and the ward does not exceed a specific limit (the limit is based on the radius). If the limit is exceed the unit will be knocked back…blah blah blah. Spell imune units can escape and i assume if a unit is fast enough it will be also capable to escape.
Ward is not invulnerable i thought it will be some kind of imba.
Well if you can tell me a name that fits more to this spell i gonne change it.
Ehmn i just messed up with the description but ingame damage and etc. will increase.
I´ll fix it with the next update, but until then i need some more feedback. btw did you successfully open and test the spell ?
 
Level 17
Joined
Mar 17, 2009
Messages
1,349
Umm I'll be checking the script in moments ;)

EDIT:
JNGP Crashed, the error was that the function GetLastCreatedUnit doesn't exist, you're sure you don't have some other third-party program installed? :S

EDIT:
You seriously need another name for the spell, "Nova Cage" would be a simple name ;)
Tooltips could be extremely improved but don't bother as its obvious you tried your best to write them... whoever is going to post such a spell in their map are going to change tooltip anyways.

Add an effect to when the ward is destroyed :)

Plus it's laggy, FPS drops to 16 on a business laptop.
 
Level 9
Joined
Aug 2, 2008
Messages
219
lol i did not use GetLastCreatedUnit() and i have not used third party software i discussed that already with hvo-busterkomo. I´ll change the name and update other stuff when the editor stops crashing. Well i did not notice FPS drops so low, i have a very powerful computer. I think it can be improved by decreasing the amount of special effects and i will add a special effect when the ward is destroyed.

These f***ing really annoy me i put lots of efforts in the spells and im using the newest version of JNGP (have reinstalled it more than 2 times). Thanx for the critics Deuterium/mseead ^^
 
Level 9
Joined
Aug 2, 2008
Messages
219
ok guys a will show you the code and rep+ you up and update (as far as possible) this tommorow, because i haven´t slept for ehm about 28 hours. msaeed (somehow i like your old name a more ^^) which script version do you want to have ? The one using Timer utils or the other one using my own algorithem. the only difference is the way i move data trough callbacks. Good Night and see you tommorow
 
Level 8
Joined
Apr 7, 2008
Messages
176
Yea same problem with opening it. Getlastcreatedunit does not exist. Doesnt it have to have () on the end or something? Anyways I hope you find the problem here, this looks cool and perfect. Like a version of septimus's earthward, only good. Haha, Because you're right, making the ward Invulnerable would make the spell too imba. And it is supposed to have cool effects, almost like that Ice mirror attack from Naruto. Yeah buddy keep it coming.
 
Level 9
Joined
Aug 2, 2008
Messages
219
update v0.2

i have updated the spell and i will work for every version of JNGP now !
The version of JNGP was not the problem, i still dont know what caused this problem but i now work with 2 "types" of JNGP. The first one is the corrupted one which breaks every map i save with. The second one saves the spell in the normal way but crashes when i have a compile error. With both together i´m now able to create decent spells (does not mean my programming skill is perfect).
 
Level 8
Joined
Apr 7, 2008
Messages
176
Sweet ok, now i can open it. =D Works very well too. Only one bug i seen in there. LOL, doesnt crash or anything, Just that when the mirror appeared on a unit, It bounced him around a little, and then ZOOM!! he shot across the circle and out the other side like a damn missile. It was more cool than annoying though. So im suggesting you leave that in there :p He didnt go out of the map either, he just went like the circles Diameter away and came slowly to a stop. Good Job, Spell works well. Im going to look at using different models for the mirrors though, i dont really like the Wisp thing.

Here's the replay of it happening. It like the 3rd time I cast it. You'll see. It's really cool. LOL

http://www.hiveworkshop.com/forums/pastebin.php?id=m5e37r
 
Last edited:
Level 14
Joined
Nov 18, 2007
Messages
816
  • whats range * 0.9 for?
  • you destroy groups, use GroupUtils instead.
  • i would like to see a version with support for an external knockback system (like Dusks)
  • move the damage dealing part into the distance check function.
  • Use the boolexprs of the group enums to do things to all valid units.
  • I would like to change the granulation of knockbacks easily (though this is redundant if you change the Knockback system).
  • (please use fully capitalized names for constants, makes the code easier to read)
 
Level 9
Joined
Aug 2, 2008
Messages
219
  • whats range * 0.9 for?
  • you destroy groups, use GroupUtils instead.
  • i would like to see a version with support for an external knockback system (like Dusks)
  • move the damage dealing part into the distance check function.
  • Use the boolexprs of the group enums to do things to all valid units.
  • I would like to change the granulation of knockbacks easily (though this is redundant if you change the Knockback system).
  • (please use fully capitalized names for constants, makes the code easier to read)

My answer

1. ehm ok it picks up all units in range and checks if their distance between the ward is larger than range*0.9, because using dist == range would be very unsafe. Just try leaving out * 0.9 and you will see it wont work properly. There needs to be a bufferzone unless you want it to work without laggs.

2.Grouputils…ok ill take a look at it.

3.I assume i really need a better knockback and as Guishiu has already mentioned it sometimes bugs.

4.I know what you trying to say: I could use only one group instead of two groups what would be more effecient. And i did that already in a preverious version but it caused the framerate to drop very low because of the special effectspam. sorry but i don´t think i gonna change that.

5.Sorry again but i don´t really know what you are trying to say here (my English is too bad :confused:). But I have an idea so i try to figure that out.

6.I will try my best.

7.Ok now i know what to do with future spells but i won´t change it here, because i had to almost rework the whole thing.
thanx for the critic.
 
Level 14
Joined
Nov 18, 2007
Messages
816
5.Sorry again but i don´t really know what you are trying to say here
Basically, instead of using that FirstOfGroup()-Loop, do all the things you want to do to units in the boolexpr function of the GroupEnum (i think it was IsValidTarget, or something like that).

@6.: Currently the 0.04 are hardcoded, and i bet its not wise to change that, since i move the units by a certain distance per interval and not per second.

btw: you dont have to apply the damage effect every time you actually deal damage.
 
Level 2
Joined
Sep 1, 2008
Messages
5
The spell should stop if the caster dies because if you die you will get pulled in into the circle if you would enter it again
 
Level 17
Joined
Mar 17, 2009
Messages
1,349
Thanathos said:
Credits to Deuterium who help me to solve the problem with the crashes.
Although you didn't really have to mention me, that's appreciated :)

d.o.g said:
The spell should stop if the caster dies because if you die you will get pulled in into the circle if you would enter it again
Well TNT (nice short for ThaNaThos :p), if I understood d.o.g then that's a weird issue, I checked the script and you've set a function to pick valid units... :s
 
Level 9
Joined
Aug 2, 2008
Messages
219
Approved

Somehow my spells got approved, but this one in´t finished yet. Someday i will fix the flaws Deaod and hvo have mentioned.

@Deuterium
well without your help this one would not get "unrejected" and TNT is a nice idea :grin:

@d.o.g.
here is the filter:
JASS:
private function IsUnitValidTarget takes nothing returns boolean
return IsUnitEnemy(GetFilterUnit(),temp_p) == true and GetWidgetLife(GetFilterUnit()) > 0 and //this is a veeery long line...
endfunction
when you take a look at line which begins with return you may notice that allied and dead units won´t be added to the targetgroup, so they cannot be pulled back.
 
@Dentothor
ofc you can make one. I´d like to see an icon which fits to this spell because i think the default icon in the testmap is not thar grate. Tell me when you´re finished.:cool:

here's a WIP so far. do you like the concept? im going to have a person in pain under the shock.
 

Attachments

  • Mirror.jpg
    Mirror.jpg
    4.3 KB · Views: 154
Level 9
Joined
Aug 2, 2008
Messages
219
@Deaod
sorry but fixing these flaws is harder than a thought…the groupstuff you mentioned was very easy to fix (thanx 4 teaching me). The problem now is the knockback system. I looked up the one of Rising_Dusk bur for my taste it uses too many libraries, what is in my eyes not very userfriendly. I have also tried Wraithseekers EKB. Same complainments as for Rising_Dusks (and one of the links for required libraries is broken). I´d like to use Slivenons Knockback but it´s somehow uncompileable. So if anyone knows whre i can find a decent knockback system (like the one of Slivenon) PM me please.

@Dentothor
the WIP looks good for me, but why is there a lightning ? hmm when you finished the icon PM me please^^
 
Level 6
Joined
Jul 27, 2008
Messages
132
Good Spell 5/5 (because i didn't understand Jass D: )

where you learned jass?

i want to learn it but it's very difficult for me D:
 
Status
Not open for further replies.
Top