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

Organic Bomb v1.0.3 [vJASS][UPDATE]

Spell Type : Target Cast
Spell Version : 1.0.3
Spell Credits Distribution :
WILL THE ALL MIGHTY -> explosionBIG.mdx

On cast:
Implants an organic bomb to a target enemy unit, making it explode after a set amount of time, damaging nearby enemy units and knocking them airborn.
Airborn distance and air time vary on the distance between the explosion.
scaled.php


1 Second before the explosion:
bombready.jpg


On explosion:
bombboom.jpg



DOCUMENTATION
JASS:
*                                                                  *
    Sheeps Sheeps, Exploding sheeps? LOL
    
    =========================
    /-\ Organic Bomb 'v1.0.3' /-\
    =========================
    
    1 - What it does? -> Implants an organic bomb to an enemy non-hero target unit. causing it to explode over a set amount of time
          damaging nearby enemy units and (optionally) set them airborn for a set amount of time.
    2 - Is it MUI? = Yeah...
    
    3 - Is it Multi Level Instanceable? = Yeah...
    
    4 - Can i configure this? = You can configure almost every aspect of the spell.
    
    5 - Why do you use a Jump system inside its scope? = Well i consider it a lite jump system and made it alike other jump systems. If its a problem ill import a jump system to declare it as optional.
    
    6 - How to use it in my map? = Copy the 'Organic Bomb' trigger into your map and configure the globals in the header. 
              
  =================================
  ||                  ENJOY FOLKS                    ||
  =================================
  *                                                                         *

MAP CODE
JASS:
scope CrazyIvan initializer init
    globals
        private constant integer SPELL_ID = 'A000'        //The raw code of the triggering ability
        private constant string TICK_SOUND_FX = "Sound\\Interface\\BattleNetTick.wav"        //the sound effect that plays when the timer ticks, use "" if you want no sound.
        private constant string EXPLODING_EFFECT = "ExplosionBIG.mdx"         //The effect that is created when the unit explodes
        private constant string BURNING_EFFECT = "Environment\\LargeBuildingFire\\LargeBuildingFire2.mdl"         //The burning effect on the bombed target.
        private constant string SEC_EXPLODING_EFFECT = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl"         //The effect that is created when the unit explodes   
        private constant boolean EXPLODE_UNIT = true        //Whether to make the unit explode, doing so will leave no corpse 
        private constant boolean BOMB_KILL_TARGET = true        //Whether to kill the bombed target or just deal damage to it.
        private constant boolean DO_AIRBORN = true        //Whether to throw all damaged units in the air after the explosion
        private constant boolean SHOW_TIME = true        //Whether to show the time left before the unit explodes above it to all the players
        private constant boolean GET_CREDITS = true        //Whether to get credits when the unit explodes giving you experience and bounty
        private constant boolean BOMB_CONTINUE = true        //Whether to still explode the unit even if it dies
        private constant boolean BOMB_PAUSE = false          //Whether to pause the target unit on the effect
        private constant boolean BOMB_INVULNERABLE = false        //Whether to make the target invulnerable on the effect.
        private constant real TICK_INTERVAL = .0335        //The interval of the ticking timer. Doesn't do much but only checks numbers and set the vertex colors and textag
        private constant real TEXT_SIZE = .0239        //The size of the floating text above the target unit. Adjust it sensitively
        private constant real AIRBORN_BASE_TIME = 2.3        //Units further away last less on air, the real time isn't the base time, it's just a base value.
        private constant real AIRBORN_BASE_DIST = 570        //The airborn distance, units further away go in a decreased distance
        private constant real BASE_DAMAGE = 150        //The base damage of the aoe
        private constant real INCREMENT_DAMAGE = 150        //The increment damage per level
        private constant real BASE_TIME = 12       //The base amount of time in seconds after the unit explodes 
        private constant real DECREMENT_TIME = 3        //The decrement time in second per level of the spell (Level 1 = 12, Level 2 = 9, Level 3 = 6) and so on...
        private constant real BASE_RADIUS = 300        //The base area of effect of the explosion
        private constant real INCREMENT_RADIUS = 100        //The increment area of effect per level for the explosion
        private constant attacktype ATK_TYPE = ATTACK_TYPE_CHAOS        //The attack type of the damage dealt to nearby enemy untis
        private constant damagetype DMG_TYPE = DAMAGE_TYPE_DEMOLITION        //The damage type of the damage dealt to nearby enemy units
        private constant weapontype WEP_TYPE = WEAPON_TYPE_WHOKNOWS        //The weapon type of the damage dealt to nearby enemy units

    endglobals
    
    globals
        private constant boolean                     AFFECT_MAGIC_IMMUNE = false
        private constant boolean                     AFFECT_INVISIBLE    = true
        private constant boolean                     AFFECT_STRUCTURES   = false
        private constant boolean                     AFFECT_HEROES       = true
        private constant boolean                     AFFECT_ALLIES       = false
        private constant boolean                     AFFECT_ANCIENTS       = false
        private constant boolean                     AFFECT_FLYING       = false
        //This is the filter for the damage and airborn of the units that are close to the bombed target.
        //I think that affecting flying units on airborn wouldn't be quite a good idea.
    endglobals    
//===========================KHANT TOUCH DIS=========================================////
    globals
        private unit TempUnit
        private unit TempTarget
        private real TempDamage
        private constant group TempGroup = CreateGroup  (  )
    endglobals    
    
private function JumpParabola takes real d, real md, real c returns real
    local real t = (d*2) / md-1
    return (-t*t+1) * (md/c)
endfunction    

private function Shift takes real r returns real
    if (r < 120) then
        return 1.25
    elseif (r < 300) and (r > 119) then
        return 1.5
    elseif (r < 450) and (r > 299) then
        return 1.75
    elseif r > 449 then
        return 2
    endif
    return 1.4
endfunction    
    
private struct Airborn
    unit u
    real left
    real g
    real d
    real c    
    real sin
    real cos
    real i = 0    
    real p
    /////*
    static real MIN_X
    static real MIN_Y
    static real MAX_X
    static real MAX_Y
    static location loc = Location(0, 0)
    static location locx = Location(0, 0)
    static timer tim = CreateTimer()
    static thistype array arr
    static integer Total = 0
    /////*
    static method create takes unit u, integer time, real x, real y, real c returns thistype
        local thistype that = thistype.allocate()   
        local real tx = GetUnitX(u)
        local real ty = GetUnitY(u)
        local real dx = tx - x
        local real dy = ty - y
        local real a = Atan2(y - ty, x - tx)
        local location loc1 = Location(tx, ty)
        local location loc2 = Location(x, y)
        set that.sin = Sin(a)
        set that.cos = Cos(a)              
        set that.u = u
        set that.left = time
        set that.g = SquareRoot(dx * dx + dy * dy)
        set that.d = that.g / time
        set that.c = c
        call MoveLocation(thistype.loc, tx, ty)  
        set that.p = (GetLocationZ(loc2) - GetLocationZ(loc1)) / time
        call RemoveLocation(loc1)
        call RemoveLocation(loc2)   
        set loc1 = null
        set loc2 = null
        call UnitAddAbility(u, 'Amrf')
        call UnitRemoveAbility(u, 'Amrf')
        call PauseUnit(u, true)
        if thistype.Total == 0 then
            call TimerStart(thistype.tim, .0305, true, function thistype.Execute)
        endif
        set thistype.Total = thistype.Total + 1
        set thistype.arr[thistype.Total -1] = that
        return that
    endmethod

    static method Execute takes nothing returns nothing
    local thistype that
    local integer i = 0
    local real x
    local real y
    local real h
    local rect r
    local location l
    loop
        exitwhen i >= thistype.Total
        set that = thistype.arr[i]
        set x = GetUnitX(that.u) + (that.d) * that.cos
        set y = GetUnitY(that.u) + (that.d) * that.sin
        call MoveLocation(thistype.locx, x, y) 
        set h = JumpParabola(that.d * that.i, that.g, that.c) - (GetLocationZ(thistype.locx) - GetLocationZ(thistype.loc)) + that.p * that.i
        if x < thistype.MAX_X and y < thistype.MAX_Y and x > thistype.MIN_X and y > thistype.MIN_Y then
            call SetUnitX(that.u, x)
            call SetUnitY(that.u, y)
        endif        
        call SetUnitFlyHeight(that.u, h, 0)        
        if (that.i >= that.left) or (GetWidgetLife(that.u)<.405) then
            call that.destroy()
            set thistype.Total = thistype.Total - 1
            set thistype.arr[i] = thistype.arr[thistype.Total]
        else
            set that.i = that.i + 1
        endif
        
        set i = i + 1
    endloop
    
    if thistype.Total == 0 then
        call PauseTimer(thistype.tim)
    endif
    
    set l = null
    endmethod

    method onDestroy takes nothing returns nothing
        call SetUnitFlyHeight(.u, 0, 0)
        call PauseUnit(.u, false)
        call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", .u, "origin"))
        set .u = null
    endmethod
    
    static method Init takes nothing returns nothing
        set thistype.MAX_X = GetRectMaxX(bj_mapInitialPlayableArea) - 64
        set thistype.MAX_Y = GetRectMaxY(bj_mapInitialPlayableArea) - 64
        set thistype.MIN_X = GetRectMinX(bj_mapInitialPlayableArea) + 64
        set thistype.MIN_Y = GetRectMinY(bj_mapInitialPlayableArea) + 64
    endmethod
endstruct   

private function filter takes nothing returns boolean
    local unit u=GetFilterUnit()
    local boolean array b
    local real k
    local real x
    local real y
    local real tx
    local real ty
    local real ang
    local real dist
    local real c = 1.2
    if (GetWidgetLife(u)>.405) then
        set b[0] = IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) == false
        set b[1] = IsUnitType(u, UNIT_TYPE_STRUCTURE) == false
        set b[2] = IsUnitType(u, UNIT_TYPE_HERO) == false
        set b[3] = IsUnitType(u, UNIT_TYPE_ANCIENT) == false
        set b[4] = IsUnitType(u, UNIT_TYPE_FLYING) == false
        set b[5] = IsUnitVisible(u, GetOwningPlayer(TempUnit)) == true
        set b[6] = IsUnitAlly(u, GetOwningPlayer(TempUnit)) == false
        static if AFFECT_MAGIC_IMMUNE then
            set b[0] = true
        endif
        static if AFFECT_STRUCTURES then
            set b[1] = true
        endif
        static if AFFECT_HEROES then
            set b[2] = true
        endif
        static if AFFECT_ANCIENTS then
            set b[3] = true
        endif
        static if AFFECT_FLYING then
            set b[4] = true
        endif
        static if AFFECT_INVISIBLES then
            set b[5] = true
        endif
        static if AFFECT_ALLIES then
            set b[6] = true
        endif
        if (b[1] and b[2] and b[3] and b[4] and b[5] and b[6]) then
           call UnitDamageTarget(TempUnit,u , TempDamage, false, false, ATK_TYPE, DMG_TYPE, WEP_TYPE) 
           call DestroyEffect(AddSpecialEffectTarget( SEC_EXPLODING_EFFECT, u, "chest"))
           static if (DO_AIRBORN) then   
               set tx = GetUnitX(u)
               set ty = GetUnitY(u)   
               set x = GetUnitX(TempTarget) - tx
               set y = GetUnitY(TempTarget) - ty
               set k = SquareRoot(x * x + y * y)
               set dist = AIRBORN_BASE_DIST - (k * .6575)
               set x = GetUnitX(TempTarget)
               set y = GetUnitY(TempTarget)
               set ang = bj_RADTODEG * Atan2(ty - y, tx - x)
               set x = tx + dist * Cos(ang * bj_DEGTORAD)
               set y = ty + dist * Sin(ang * bj_DEGTORAD)
               set k = AIRBORN_BASE_TIME - c
               if k < .20 then
                   set k = .2
               endif    
               set k = k / .0305
               call Airborn.create(u, R2I(k), x, y, c)
           endif    
        endif
     endif
     set u=null
     return false
endfunction 
    
private struct boom
    unit u
    unit t
    real red = 255
    real time
    real rate
    real radius
    real dmg
    real tick = 0
    sound snd
    texttag txt
    effect art
    //
    real x
    real y
    //
    static integer max = 0
    static thistype array arr
    static timer tim = CreateTimer ( )
    //
    static method create takes unit u, unit t returns thistype
        local thistype this = thistype.allocate    (  )
        local integer l = GetUnitAbilityLevel(u, SPELL_ID)
        set this.u = u
        set this.t = t
        set this.time = (BASE_TIME + DECREMENT_TIME) - (DECREMENT_TIME * I2R(l))
        set this.rate = (this.red / this.time) * TICK_INTERVAL
        set this.radius = (BASE_RADIUS-INCREMENT_RADIUS) + (INCREMENT_RADIUS *I2R(l))
        set this.dmg = (BASE_DAMAGE - INCREMENT_DAMAGE) + (INCREMENT_DAMAGE * I2R(l))
        static if BOMB_PAUSE then
            call PauseUnit(this.u, true)
        endif
        static if BOMB_INVULNERABLE then
            call SetUnitInvulnerable(this.u, true)
        endif    
        set this.txt = CreateTextTag()
        set this.art = AddSpecialEffectTarget(BURNING_EFFECT, this.t, "overhead")
        call SetTextTagText(this.txt, I2S(R2I(this.time)), TEXT_SIZE)
        call SetTextTagPermanent(this.txt, false)
        call SetTextTagLifespan(this.txt, this.time-.15)
        static if SHOW_TIME then
            call SetTextTagVisibility(this.txt, true)
        else
            call SetTextTagVisibility(this.txt, false)
            if GetLocalPlayer() == GetOwningPlayer(this.u) then
                call SetTextTagVisibility(this.txt, true)
            endif
        endif
        if thistype.max == 0 then
            call TimerStart(thistype.tim, TICK_INTERVAL, true, function thistype.Exec)
        endif
        set thistype.max = thistype.max + 1
        set thistype.arr[thistype.max - 1] = this
        return this
    endmethod
    
        
    method explode takes nothing returns nothing
        set TempUnit=.u
        set TempDamage=.dmg
        set TempTarget = .t
        call GroupEnumUnitsInRange(TempGroup, .x, .y, this.radius,Condition(function filter))
        call DestroyEffect(AddSpecialEffectTarget(EXPLODING_EFFECT, .t, "chest"))
        static if EXPLODE_UNIT then
            call SetUnitExploded(.t, true)
        endif    
        static if GET_CREDITS then
            static if BOMB_INVULNERABLE then
                call SetUnitInvulnerable(.t, false)
            endif
            call UnitDamageTarget(.u, .t, 9999999, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_DIVINE, WEAPON_TYPE_WHOKNOWS)
        else
            static if BOMB_KILL_TARGET then
                call KillUnit(.t)
            endif    
        endif
        call DestroyEffect(.art)
        call .destroy()
    endmethod
    
    static method Exec takes nothing returns nothing
        local thistype this
        local integer i = 0
        loop
        exitwhen i>= thistype.max
            set this = thistype.arr[i]
            set this.time = this.time - TICK_INTERVAL
            set this.tick = this.tick + TICK_INTERVAL
            if this.tick > .9 then
                if TICK_SOUND_FX != "" then
                    set this.snd = CreateSound(TICK_SOUND_FX, false, true, true, 12710, 12710, "")
                    call AttachSoundToUnit(this.snd, this.t)
                    call StartSound(this.snd)
                    call KillSoundWhenDone(this.snd)
                    set this.snd = null
                    set this.tick = 0
                endif    
            endif    
            if GetWidgetLife(this.t)<.405 then
                call SetUnitVertexColor(this.t, 255, 255, 255, 255)
                static if BOMB_CONTINUE then
                    call this.explode()
                else
                    set thistype.max = thistype.max - 1
                    set thistype.arr[i] = thistype.arr[thistype.max]
                    call this.destroy()
                endif    
            else
                set this.x = GetUnitX(this.t)
                set this.y = GetUnitY(this.t)
                call SetTextTagPosUnit(this.txt, this.t, 0)
                if this.time < 1 then
                    call SetTextTagText(this.txt, "!!", TEXT_SIZE+.0085)
                else    
                    call SetTextTagText(this.txt, I2S(R2I(this.time)), TEXT_SIZE)
                endif    
                set this.red = this.red - this.rate
                call SetUnitVertexColor(this.t, 255, R2I(this.red), R2I(this.red), 255)
                call SetTextTagColor(this.txt, 255, R2I(this.red), R2I(this.red), 255)
            endif    
            if this.time < TICK_INTERVAL then
                call this.explode()
                set thistype.max = thistype.max - 1
                set thistype.arr[i] = thistype.arr[thistype.max]
            endif    
            set i = i + 1
        endloop
        if thistype.max == 0 then
            call PauseTimer(thistype.tim)
        endif
    endmethod
    
    method onDestroy takes nothing returns nothing
        call DestroyTextTag(.txt)
        set .txt = null
        set .u = null
        set .art = null
        set .t = null
    endmethod
    
endstruct
///=======================IRRELEVANT===================================================////

private function Bomb takes nothing returns boolean
    if GetSpellAbilityId() == SPELL_ID then
        call boom.create(GetTriggerUnit(), GetSpellTargetUnit())
    endif
    return false
endfunction   
    
private function init takes nothing returns nothing
    local trigger t = CreateTrigger      (  )
    call TriggerAddCondition(t, Condition(function Bomb))
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    set t = null
    call Airborn.Init()
endfunction

endscope

Please give proper credits in case you use this on your map/project.

Enjoy :)

Keywords:
bomb, boom, bam, fire, explosion, explode, splatter, organic, sheeps, nuclear
Contents

Organic Bomb v1.0.3 (Map)

Reviews
19:01, 16th Aug 2010 The_Reborn_Devil: The coding looks better now and it's more configurable too ^^ Status: Approved Rating: Recommended

Moderator

M

Moderator

19:01, 16th Aug 2010
The_Reborn_Devil:

The coding looks better now and it's more configurable too ^^


Status: Approved
Rating: Recommended
 
Level 6
Joined
Nov 3, 2008
Messages
117
ok finally a vJass submission :p.

Feedback:

1. This:
[jass=Feedback]private function filter takes nothing returns boolean
return (GetWidgetLife(GetFilterUnit())>.415) and (not(IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)))
endfunction

method explode takes nothing returns nothing
local group g = CreateGroup()
local boolexpr e = Condition(function filter)
local unit u
call GroupEnumUnitsInRange(g, GetUnitX(.t), GetUnitY(.t), this.radius, e)
call DestroyEffect(AddSpecialEffect(BOMB_EFFECT_STR, GetUnitX(.t), GetUnitY(.t)))
loop
set u = FirstOfGroup(g)
exitwhen u == null
if IsUnitEnemy(u, GetOwningPlayer(.u)) then
call UnitDamageTarget(.u, u, .dmg, false, false, BOMB_A_TYPE, BOMB_D_TYPE, WEAPON_TYPE_WHOKNOWS)
endif
call GroupRemoveUnit(g, u)
endloop
call DestroyBoolExpr(e)
call DestroyGroup(g)
set e = null
set g = null
endmethod[/code]

Can be replaced with this:
[jass=new]
globals
private unit TempUnit
private real TempDamage
private constant group TempGroup = CreateGroup()
endglobals

static method filter takes nothing returns boolean
local unit enum=GetFilterUnit()
if (GetWidgetLife(enum)>.415) and (not(IsUnitType(enum, UNIT_TYPE_STRUCTURE))) and IsUnitEnemy(enum,GetOwningPlayer(TempUnit)) then
call UnitDamageTarget(TempUnit,enum , TempDamage, false, false, BOMB_A_TYPE, BOMB_D_TYPE, WEAPON_TYPE_WHOKNOWS)
set enum=null
return false
endif
set enum=null
return false
endmethod

method explode takes nothing returns nothing
set TempUnit=.u
set TempDamage=.dmg
call GroupEnumUnitsInRange(TempGroup, GetUnitX(.t), GetUnitY(.t), this.radius,Condition(function thistype.filter))
call DestroyEffect(AddSpecialEffect(BOMB_EFFECT_STR, GetUnitX(.t), GetUnitY(.t)))
call GroupClear(TempGroup)
endmethod[/code]

With this you get rid of destroying groups, boolexpr and you avoid the slower FirstOfGroupLoop.


2 .This: GetWidgetLife(AnyUnit)>0.415 should be this GetWidgetLife(AnyUnit)>0.405

If your not sure with it you could use native UnitAlive takes unit id returns boolean

3. Maybe its just the post you made but fix this globals indenting pls, its horrible.

AND:
private constant boolean NEED_COOKIE = true //Wether to give Prince.Zero a cookie for this
Remove this pls :p. has nothing to do with your spell.

That's all i found right now.
 
Level 6
Joined
May 20, 2010
Messages
94
Good Points

  • Seems to be Mui and Leakless.
  • Able to customize.
  • Sheeps are epic.
Suggestions

  • Uniqueness
    I think there is missing something what makes this spell outstanding.
    Adding a tick sound for counting down would be very nice.
    And of course I know what sound to use:
    Sound --> Interface --> BattleNetTick.wav
  • Eye Candy
    The Special Effect looks really tiny compared to the AoE.
    And maybe you should add Effects to the damaged units, too.
Rating

  • Rating 3/5 [Useful]
  • Vote for Approval.
  • If updated, I'll rate again.
  • :infl_thumbs_up:
 
Level 14
Joined
Nov 18, 2007
Messages
1,084
I haven't tested this spell yet in-game. If I do, I'll edit this post.

Coding Review:

  • You can use static ifs in checking for BOMB_PAUSE, BOMB_INVULNERABLE, BOMB_SHOW_TIME, etc.
  • Perhaps allow text size for the text tag to be configurable?
  • Your filter method could look like this instead:
    JASS:
        static method filter takes nothing returns boolean
        local unit enum=GetFilterUnit()
        if (GetWidgetLife(enum)>.405) and (not(IsUnitType(enum, UNIT_TYPE_STRUCTURE))) and IsUnitEnemy(enum,GetOwningPlayer(TempUnit)) then
               call UnitDamageTarget(TempUnit,enum , TempDamage, false, false, BOMB_A_TYPE, BOMB_D_TYPE, WEAPON_TYPE_WHOKNOWS) 
               call DestroyEffect(AddSpecialEffectTarget( BOMB_SECEFFECT_STR, enum, "chest"))
           endif
           set enum=null
           return false
        endmethod
    Optional:
    • You might want to make it easier for people to change which units are affected.
    • Allow weapontype to be configurable.
  • You don't need to call GroupClear on TempGroup since no units should actually be stored inside the group. (You're returning false in the filter regardless of what's happening)
  • Since you're not really doing anything in the Actions function, you could do everything in the Bomb function:
    JASS:
    private function Bomb takes nothing returns boolean
        if GetSpellAbilityId() == BOMB_ID then
            call boom.create(GetTriggerUnit(), GetSpellTargetUnit())
        endif
        return false
    endfunction
Edit:
0_0
Anyway, the only thing I would suggest is to remove the texttag before it starts showing 0 since that seems kind of strange. That's only my opinion so no need to do so if you disagree. Other than that, the spell looks nice.
 
Level 2
Joined
Aug 17, 2010
Messages
10
WOW THIS OUGHT TO BE THE BEST EXPLOSIVE SPELL I'VE SEEN IN A WHILE!!!
i mean look at it! It's like old times in WoW doing ragnaros and getting hit by his spell and knocking everyone off!! This is almost like it, but a ticking bomb?>? SICK

and it's very damn configurable which tempts me to give it a 5/5 for it's awesomeness

Effects and Eye Candy - 5/5
Coding - 5/5
Originality - 5/5
Uniqueness - 5/5

+rep
 
Level 5
Joined
Oct 9, 2008
Messages
112
Hi,

i found a Bug. If a unit have more than one timer on itself and the first timer Explode, every other timer explode on the same same at other location. I hope you can fix this...

Bug%20Screen.jpg



BTW: the spell looks realy cool! :>

-Atami

Enjoy Mapping...
 
Level 7
Joined
Jun 6, 2010
Messages
224
Hi,

i found a Bug. If a unit have more than one timer on itself and the first timer Explode, every other timer explode on the same same at other location. I hope you can fix this...

Bug%20Screen.jpg



BTW: the spell looks realy cool! :>

-Atami

Enjoy Mapping...

meh... a unit isn't supposed to have more than one timer attached :(
will fix it

edit-

ok fixed it, it seems the damn hot weather makes me not notice things lol
A unit without a corpse doesn't leave coordinates X_x

thanks for feedback!
 
Level 2
Joined
Jan 6, 2009
Messages
18
That is very useful even if i didnt use it
i can still learn
- how to change the hero color to red
-how to make dynamic text over unit
-knock-back and jump
 
Level 5
Joined
Oct 9, 2008
Messages
112
Hi,

Nice that u changed the bug which i found. But now if the targetet unit have more timer on it, all unit around the target fly realy far far far away.
1 Timer= Normal
2 Timer= Normal * 2
3 Timer= Normal * 3

etc.

-atami
 
Top