Spell Fireblast

Kenny

Back for now.
Reaction score
202
Fireblast
By kenny!
v3

Another one of my first spells using vJass, i have worked on this skill for a bit longer then my last, so i hope everyone likes it and puts it to good use.

There is a description for implementation in the map, labeled "Implementation" just above the Fireblast trigger.

Import Difficulty: Easy-Moderate.
vJass?: Yes.
Lagless?: Yes.
Leakless?: Yes.
MUI?: Yes.
Requires:
- GTrigger by Jesus4Lyf.
- Dummy.mdx model by Vexorian.
- Ground and Water sliding effects by unknown.
- NewGen.

Description:

Basically, this skill creates a blast or wave of fire that surges forward for XXX distance. If the blast comes in contact with a unit it will drag the unit to its destination. If that unit is enemy it will be dealt damage.

Screenshots:

Fireblast2.jpg


Fireblast1.jpg

Tooltip:
Launches a deadly fireball at a target location, picking up any unit in its path and dragging it until the fireball reaches its destination.

Level 1 - Deals 75 damage, maximum range of 700.

Level 2 - Deals 150 damage, maximum range of 900.

Level 3 - Deals 225 damage, maximum range of 1100.

Script:

JASS:
//------------------------------------------------------------------------------------\\
//                                Fireblast  [v3]                                     \\
//                                   By kenny!                                        \\
//                            Constructed using vJASS                                 \\
//                         Requires NewGen WE & GTrigger                              \\
//------------------------------------------------------------------------------------\\

scope Fireblast

    globals
        private constant integer    ABIL_ID       = 'A000'      // Raw code for the spell.
        private constant integer    PROJ_ID       = 'n000'      // Raw code of the dummy unit needed.
        private constant integer    CROW_FORM     = 'Amrf'      // Raw code of the ability, Crow Form.
        private constant real       INTERVAL      = 0.04        // Interval for periodic timer. 0.04 is recommended.
        private constant real       HEIGHT        = 25.00       // Height of the dummy "missile" unit.
        private constant real       SCALE         = 1.25        // Scale size for the same unit.
        private constant real       COLLISION     = 90.00       // Radius in which units will be picked up.
        private constant real       TREE_RADIUS   = 150.00      // Radius for destroying trees.
        private constant real       DISTANCE      = 40.00       // Distance infront of the dummy unit at which pathing will be checked.
        
        private constant boolean    PLAY_START    = true        // Whether or not to play the start effect.
        private constant string     START_SFX     = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" // The start effect.
        
        private constant boolean    PLAY_END      = true        // Whether or not to play the end effect.
        private constant string     END_SFX       = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl" // The end effect.
        
        private constant string     PROJ_SFX      = "Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl" // What the missile looks like.
        private constant string     PROJ_POINT    = "origin"    // Only attachment point given to the dummy.mdx model.
        
        private constant string     DIRT_SFX      = "Dust.mdx"          // Special effect for sliding on land. Import this if needed.
        private constant string     WATER_SFX     = "SlideWater.mdx"    // Special effect for sliding on water. Import this is needed.
        private constant string     SLIDE_POINT   = "origin"            // Attachment point for the above effects.
        
        private constant attacktype A_TYPE        = ATTACK_TYPE_CHAOS     // Attacktype of damage dealt.
        private constant damagetype D_TYPE        = DAMAGE_TYPE_UNIVERSAL // Damagetype of damage dealt.
        private constant weapontype W_TYPE        = WEAPON_TYPE_WHOKNOWS  // Weapontype of damage dealt.
        
        private constant boolean    DESTROY_TREES = true        // Whether or not to destroy trees.
        private constant boolean    CHECK_PATHING = true        // Whether or not to check pathing.
    endglobals
    
    //---------------------------------------------------------------------\\
    private function Max_dist takes integer lvl returns real
        return 500.00 + (200.00 * lvl) // Maximum distance of the spell per level.
    endfunction
    
    private function Damage_dealt takes integer lvl returns real
        return 75.00 * lvl // Damage dealt by the spell per level.
    endfunction
    
    private function Movement_speed takes integer lvl returns real
        return 500.00 + (100.00 * lvl) // Movement speed of the missile per level
    endfunction

    // Below: Filters out which units you want to be effected by the spell.
    private function Enemy_filter takes unit filter, unit caster returns boolean
        return filter != caster and GetWidgetLife(filter) > 0.405 and IsUnitType(filter,UNIT_TYPE_STRUCTURE) == false and IsUnitType(filter,UNIT_TYPE_MECHANICAL) == false and GetUnitFlyHeight(filter) <= 50.00
    endfunction
    
    //---------------------------------------------------------------------\\
    //                                                                     \\
    //  DO NOT TOUCH PAST THIS POINT UNLESS YOU KNOW WHAT YOUR ARE DOING!  \\
    //                                                                     \\
    //---------------------------------------------------------------------\\
    
    private struct Data
        
        unit    cast = null
        unit    proj = null
        unit    targ = null
        effect  psfx = null
        effect  tsfx = null
        
        real    dist = 0.00
        real    move = 0.00
        real    cos  = 0.00
        real    sin  = 0.00
        integer lvl  = 0
        integer mod  = 0
        
        static Data     array D
        static item     array H
        static integer  D_total     = 0
        static integer  H_total     = 0
        static real     Game_maxX   = 0.00
        static real     Game_minX   = 0.00
        static real     Game_maxY   = 0.00
        static real     Game_minY   = 0.00
        static timer    Move_timer  = null
        static group    Enum_group  = null
        static unit     Tree_dummy  = null
        static item     Path_item   = null
        static rect     Path_rect   = null
        static boolexpr Tree_filt   = null
        static boolexpr Enemy_filt  = null
        
        static constant real MAX_RANGE = 10.00
        
        static method safex takes real x returns real
            if x < Data.Game_minX then
                return Data.Game_minX
            elseif x > Data.Game_maxX then
                return Data.Game_maxX
            endif
            return x
        endmethod

        static method safey takes real y returns real
            if y < Data.Game_minY then
                return Data.Game_minY
            elseif y > Data.Game_maxY then
                return Data.Game_maxY
            endif
            return y
        endmethod
        
        static method filt takes nothing returns boolean
            return true
        endmethod
        
        static method hide takes nothing returns nothing
            if IsItemVisible(GetEnumItem()) then
                set Data.H[Data.H_total] = GetEnumItem()
                call SetItemVisible(Data.H[Data.H_total],false)
                set Data.H_total = Data.H_total + 1
            endif
        endmethod

        static method pathability takes real x1, real y1 returns boolean
            local real x2 = 0.00
            local real y2 = 0.00
            
            call SetRect(Data.Path_rect,0.00,0.00,128.00,128.00)
            call MoveRectTo(Data.Path_rect,x1,y1)
            call EnumItemsInRect(Data.Path_rect,null,function Data.hide)

            call SetItemPosition(Data.Path_item,x1,y1)
            set x2 = GetItemX(Data.Path_item)
            set y2 = GetItemY(Data.Path_item)
            call SetItemVisible(Data.Path_item,false)

            loop
                exitwhen Data.H_total <= 0
                set Data.H_total = Data.H_total - 1
                call SetItemVisible(Data.H[Data.H_total],true)
                set Data.H[Data.H_total] = null
            endloop

            return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) < Data.MAX_RANGE * Data.MAX_RANGE
        endmethod
        
        static method destroyenumtrees takes nothing returns nothing
            call KillDestructable(GetEnumDestructable())
        endmethod
        
        static method tree_filter takes nothing returns boolean
            local destructable dest   = GetFilterDestructable()
            local boolean      result = false
            
            if GetDestructableLife(dest) > 0.405 then
                call ShowUnit(Data.Tree_dummy,true)
                call SetUnitX(Data.Tree_dummy,GetWidgetX(dest))
                call SetUnitY(Data.Tree_dummy,GetWidgetY(dest))
                
                set result = IssueTargetOrder(Data.Tree_dummy,"harvest",dest)
                call IssueImmediateOrder(Data.Tree_dummy,"stop")
                call ShowUnit(Data.Tree_dummy,false)
                
                set dest = null
                return result
            endif
            
            set dest = null
            return result
        endmethod
        
        method terrain takes nothing returns integer
            local real x = GetUnitX(.targ)
            local real y = GetUnitY(.targ)

            if IsTerrainPathable(x,y,PATHING_TYPE_FLOATABILITY) then
                return 1
            elseif not IsTerrainPathable(x,y,PATHING_TYPE_WALKABILITY) then
                return 2
            endif
            
            return 0
        endmethod
        
        method onDestroy takes nothing returns nothing
            call DestroyEffect(.psfx)
            
            if .tsfx != null then
                call DestroyEffect(.tsfx)
            endif
            
            if .targ != null then
                call SetUnitPathing(.targ,true)
            endif
            
            if PLAY_END then
                call DestroyEffect(AddSpecialEffect(PROJ_SFX,GetUnitX(.proj),GetUnitY(.proj)))
            endif
            
            call RemoveUnit(.proj)
            
            set .cast = null
            set .proj = null
            set .targ = null
            set .psfx = null
            set .tsfx = null
        endmethod
        
        method periodic takes nothing returns nothing
            local real x = GetUnitX(.proj)
            local real y = GetUnitY(.proj)
            local real m = .mod
            local unit u = null
            
            if DESTROY_TREES then
                call SetRect(Data.Path_rect,x - TREE_RADIUS,y - TREE_RADIUS,x + TREE_RADIUS,y + TREE_RADIUS)
                call EnumDestructablesInRect(Data.Path_rect,Data.Tree_filt,function Data.destroyenumtrees)
            endif 
            
            set x = Data.safex(x + .move * .cos)
            set y = Data.safey(y + .move * .sin)
            
            call SetUnitX(.proj,x)
            call SetUnitY(.proj,y)
            
            if .targ == null then
                call GroupEnumUnitsInRange(Data.Enum_group,x,y,COLLISION,Data.Enemy_filt)
                
                if FirstOfGroup(Data.Enum_group) != null then
                    loop
                        set u = FirstOfGroup(Data.Enum_group)
                        exitwhen u == null or .targ != null
                        call GroupRemoveUnit(Data.Enum_group,u)
                        if Enemy_filter(u,.cast) then
                            set .targ = u
                        endif
                    endloop
                    
                    if .targ != null then
                        call SetUnitPathing(.targ,false)
                    
                        if IsUnitEnemy(.targ,GetOwningPlayer(.cast)) then
                            call UnitDamageTarget(.cast,.targ,Damage_dealt(.lvl),false,false,A_TYPE,D_TYPE,W_TYPE)
                        endif
                    endif
                endif
            else
                if GetWidgetLife(.targ) < 0.406 then
                    call DestroyEffect(.tsfx)
                    call SetUnitPathing(.targ,true)
                    set .targ = null
                else
                    call SetUnitPosition(.targ,x,y)
                    call SetUnitPathing(.targ,false)
                    set .mod = this.terrain()
                    
                    if .tsfx == null then
                        if .mod == 1 then
                            set .tsfx = AddSpecialEffectTarget(DIRT_SFX,.targ,SLIDE_POINT)
                        elseif .mod == 2 then
                            set .tsfx = AddSpecialEffectTarget(WATER_SFX,.targ,SLIDE_POINT)
                        endif
                    else
                        if .mod == 1 and m == 2 then
                            call DestroyEffect(.tsfx)
                            set .tsfx = AddSpecialEffectTarget(DIRT_SFX,.targ,SLIDE_POINT)
                        elseif .mod == 2 and m == 1 then
                            call DestroyEffect(.tsfx)
                            set .tsfx = AddSpecialEffectTarget(WATER_SFX,.targ,SLIDE_POINT)
                        endif
                    endif
                endif
            endif
            
            set .dist = .dist + .move
            
            set u = null
        endmethod
        
        static method update takes nothing returns nothing
            local integer i = 1
            local boolean b = false
            
            loop
                exitwhen i > .D_total
                
                if CHECK_PATHING then
                    if Data.pathability(GetUnitX(.D<i>.proj) + DISTANCE * .D<i>.cos,GetUnitY(.D<i>.proj) + DISTANCE * .D<i>.sin) == false then
                        set b = true
                    endif
                endif
                
                if Data.D<i>.dist &gt;= Max_dist(Data.D<i>.lvl) or b then
                    call Data.D<i>.destroy()
                    set Data.D<i> = Data.D[Data.D_total]
                    set Data.D_total = Data.D_total - 1
                    set i = i - 1
                    set b = false
                else
                    call Data.D<i>.periodic()
                endif
                
                set i = i + 1
            endloop
            
            if Data.D_total &lt;= 0 then
                call PauseTimer(Data.Move_timer)
                set Data.D_total = 0
            endif
        endmethod
        
        static method actions takes nothing returns boolean
            local Data     d     = Data.create()
            local location loc   = GetSpellTargetLoc()
            local real     locx  = GetLocationX(loc)
            local real     locy  = GetLocationY(loc)
            local real     castx = 0.00
            local real     casty = 0.00
            local real     angle = 0.00
            
            set d.cast = GetTriggerUnit()
            set castx  = GetUnitX(d.cast)
            set casty  = GetUnitY(d.cast)
            set angle  = Atan2((locy - casty),(locx - castx))
            set d.cos  = Cos(angle)
            set d.sin  = Sin(angle)
            set d.lvl  = GetUnitAbilityLevel(d.cast,ABIL_ID)
            set d.move = Movement_speed(d.lvl) * INTERVAL
            
            set d.proj = CreateUnit(GetOwningPlayer(d.cast),PROJ_ID,castx,casty,(angle * bj_RADTODEG))
            set d.psfx = AddSpecialEffectTarget(PROJ_SFX,d.proj,PROJ_POINT)
            call SetUnitScale(d.proj,SCALE,SCALE,SCALE)
            call UnitAddAbility(d.proj,CROW_FORM)
            call UnitRemoveAbility(d.proj,CROW_FORM)
            call SetUnitFlyHeight(d.proj,HEIGHT,0.00)
            
            if PLAY_START then
                call DestroyEffect(AddSpecialEffect(START_SFX,castx,casty))
            endif
            
            set Data.D_total = Data.D_total + 1
            set Data.D[Data.D_total] = d
            if Data.D_total == 1 then
                call TimerStart(Data.Move_timer,INTERVAL,true,function Data.update)
            endif
            
            call RemoveLocation(loc)
            set loc = null
            
            return false
        endmethod
        
        static method onInit takes nothing returns nothing
            set Data.Move_timer = CreateTimer()
            set Data.Enum_group = CreateGroup()
            set Data.Path_rect  = Rect(0.00,0.00,1.00,1.00)
            set Data.Tree_filt  = Filter(function Data.tree_filter)
            set Data.Enemy_filt = Filter(function Data.filt)
            
            set Data.Game_maxX  = GetRectMaxX(bj_mapInitialPlayableArea) - 64.00
            set Data.Game_maxY  = GetRectMaxY(bj_mapInitialPlayableArea) - 64.00
            set Data.Game_minX  = GetRectMinX(bj_mapInitialPlayableArea) + 64.00
            set Data.Game_minY  = GetRectMinY(bj_mapInitialPlayableArea) + 64.00
            
            call GT_AddStartsEffectAction(function Data.actions,ABIL_ID)
            
            set Data.Tree_dummy = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),PROJ_ID,0.00,0.00,0.00)
            call SetUnitPathing(Data.Tree_dummy,false)
            call ShowUnit(Data.Tree_dummy,false)
            
            set Data.Path_item  = CreateItem(&#039;ciri&#039;,0.00,0.00)
            call SetItemVisible(Data.Path_item,false)
        endmethod
        
    endstruct
    
endscope

</i></i></i></i></i></i></i></i></i>


Thanks to Tinki3 for the cool Test map and to everyone who helped me with the skill.

Hope everyone likes the spell and is able to give me some constructive feedback.

kenny!

CHANGELOG:
- 11th April, 08 - Updated code a bit, added more local reals as suggested by ~GaLs~. Also neatened up the notes in the code a bit.
- 17th April, 08 - Updated code some more, now properly checks for map boundaries, therefore reducing risk of fatal errors.
- 2nd May, 09 - Version 3 released. Updates include:
  • Complete re-write of the script, from scratch. It is now a lot more efficient, and easier to modify, read and understand.
  • Got rid of dynamic trigger usage. Switched to global groups and use of methods and stuff.
  • Standardisation of script, again for readability and stuff.
  • Most modifications to the spell can now be done in the trigger itself.
  • No longer requires all those libraries. It only requires GTrigger (by Jesus4Lyf) now.
  • However it now requires Vexorians dummy.mdx model, and two special effect models for sliding purposes. All of which can be found in the new map.
 

Attachments

  • Spell - Fireblast by Kenny! [Update2].w3x
    61.1 KB · Views: 479
  • [Spell] - Fireblast [v3].w3x
    88.8 KB · Views: 443

~GaLs~

† Ғσſ ŧħə ѕαĸε Φƒ ~Ğ䣚~ †
Reaction score
180
>> //Needed Globals(DO NOT CHANGE):
private rect Trees_in_rect = null // Rectangle used it KillTrees function

Add another global block in bottom of the code to prevent people from modifying it?
You can place as much global block in a trigger as you want.

>>
JASS:
set d.caster = GetTriggerUnit()
    set d.angle = Angle(GetUnitX(d.caster),GetUnitY(d.caster),GetLocationX(targloc),GetLocationY(targloc))
    set d.sin = Sin(d.angle*bj_DEGTORAD)
    set d.cos = Cos(d.angle*bj_DEGTORAD)
    set d.lvl = GetUnitAbilityLevel(d.caster,Abil_id)
    set d.dummy = CreateUnit(GetOwningPlayer(d.caster),Unit_id,GetUnitX(d.caster)+40.*d.cos,GetUnitY(d.caster)+40.*d.sin,d.angle)

Your formula are too long. Try localing a real XY for your target loc and caster loc and replacing all those GetUnitX/Y GetLocationX/Y.
 

Kenny

Back for now.
Reaction score
202
I highly doubt that anyone would change the Trees_in_rect global when it clearly states DO NOT CHANGE just above it, so i think it would be a little pointless to make another block just for 1 global, plus i have given people heaps of other globals to muck around with.

For the formula however, i think ill try to change it when i have the time. Are you just suggesting that i add more local real x/y's to the actions function instead of using GetUnitX/Y? The formula may be long, but does having GetUnitX/Y like 4 times in the formula really slow it down, or do anything different to having locals for that matter.
 

U are a noob

Mega Super Ultra Cool Member
Reaction score
152
I don't understand how a fireball can drag/push something. Perhaps you should change it so it pops when it hits the enemy and have the hero slide back from impact.
 

Kenny

Back for now.
Reaction score
202
Haha, well honestly i only kept it as a fireball because i found a nice model for it on the hive, but i didnt want people to have to import custom models just to use a skill, so i found the next best thing and left it as a flame. Also the dummy unit can be easily modified in the object editor to make it look like anything you want, before i had the flames it was a rock, which made a lot more sense and also looked good, so i suggest trying that out too. Anyway, its warcraft... since when did most of the stuff in this game actually reflect reality? lol.

Thanks for your comment however, i may take your idea into consideration.
 

hell_knight

Playing WoW
Reaction score
126
Funny enough , this spell can be made following all the standards you posted above without JASS but , this is more efficient so GJ.

Doesn't make sense but can be easily changed to another model.

+rep
 

~GaLs~

† Ғσſ ŧħə ѕαĸε Φƒ ~Ğ䣚~ †
Reaction score
180
>>but does having GetUnitX/Y like 4 times in the formula really slow it down
Actually, true. But only by just a few milisecond, which totally can't be noticed actually.
 

Kenny

Back for now.
Reaction score
202
>>but does having GetUnitX/Y like 4 times in the formula really slow it down
Actually, true. But only by just a few milisecond, which totally can't be noticed actually.


Oh, well ok then... how about this for the Actions function then.

JASS:
//====================================================================
private function Actions takes nothing returns nothing
    local Data d = Data.create()
    local location targloc = GetSpellTargetLoc()
    local real locx = GetLocationX(targloc)
    local real locy = GetLocationY(targloc)
    local real castx
    local real casty
    
    set d.caster = GetTriggerUnit()
    set castx = GetUnitX(d.caster)
    set casty = GetUnitY(d.caster)
    set d.angle = Angle(castx,casty,locx,locy)
    set d.sin = Sin(d.angle*bj_DEGTORAD)
    set d.cos = Cos(d.angle*bj_DEGTORAD)
    set d.lvl = GetUnitAbilityLevel(d.caster,Abil_id)
    set d.dummy = CreateUnit(GetOwningPlayer(d.caster),Unit_id,castx+40.*d.cos,casty+40.*d.sin,d.angle)
    
    set d.t = NewTimer()
    call SetTimerStructA(d.t,d)     // Starts and continues the &quot;move&quot; function periodically
    call TimerStart(d.t,Period,true,function Move)
    
    set d.trig = CreateTrigger()
    call TriggerRegisterUnitInRange(d.trig,d.dummy,Pick_unit,null)
    call TriggerAddCondition(d.trig,Condition(function Getunit))    // Picks up a random unit within range of the dummy unit
    call SetTriggerStructA(d.trig,d)    
    
    call RemoveLocation(targloc)
    set targloc = null
endfunction


instead of:

JASS:
//====================================================================
private function Actions takes nothing returns nothing
    local Data d = Data.create()
    local location targloc = GetSpellTargetLoc()
    
    set d.caster = GetTriggerUnit()
    set d.angle = Angle(GetUnitX(d.caster),GetUnitY(d.caster),GetLocationX(targloc),GetLocationY(targloc))
    set d.sin = Sin(d.angle*bj_DEGTORAD)
    set d.cos = Cos(d.angle*bj_DEGTORAD)
    set d.lvl = GetUnitAbilityLevel(d.caster,Abil_id)
    set d.dummy = CreateUnit(GetOwningPlayer(d.caster),Unit_id,GetUnitX(d.caster)+40.*d.cos,GetUnitY(d.caster)+40.*d.sin,d.angle)
    
    set d.t = NewTimer()
    call SetTimerStructA(d.t,d)     // Starts and continues the &quot;move&quot; function periodically
    call TimerStart(d.t,Period,true,function Move)
    
    set d.trig = CreateTrigger()
    call TriggerRegisterUnitInRange(d.trig,d.dummy,Pick_unit,null)
    call TriggerAddCondition(d.trig,Condition(function Getunit))    // Picks up a random unit within range of the dummy unit
    call SetTriggerStructA(d.trig,d)    
    
    call RemoveLocation(targloc)
    set targloc = null
endfunction


Is that what you were talking about?
 
B

benj_war3

Guest
Just a simple question:

It has a knockback function too? Pretty nice if the unit burns overtime... Haven't tested the map yet but I'm sure its nice.

@Tinki3
You rock dude! You make cool terrained maps!
 

Kenny

Back for now.
Reaction score
202
This skill does knock back units, but it does not deal damage over time, that would require damage over time functions, making this code much longer and harder to understand. Keeping it as simple damage allows for much more versatility as you can change the visuals of the dummy unit and not have to worry about whether a rock will deal damage over time for some reason. :p

I suggest you do download the map, as the spell is much nicer in game. Just give it some time before you download because i may be updating soon.
 
B

benj_war3

Guest
Downloaded the map... Tested the map... Excellent Map! The knockback is so far..... :D
 

Kenny

Back for now.
Reaction score
202
Update is out!

Map and Code have been updated, as well as an added changelog.

Changes:
- Minor changes to the coding of the skill (implementing more local reals);and
- Neatened up the notes, making it easier to read.

Overall, there were no changes to the coding which have dramatically changed the spell itself, just made it better and easier for implementation and use.
 

~GaLs~

† Ғσſ ŧħə ѕαĸε Φƒ ~Ğ䣚~ †
Reaction score
180
Looks neat, but why not use create static method and moves everything in your action to the static method? Actually it is nearly the same, depends on what you want.
 

Kenny

Back for now.
Reaction score
202
The only reason i havent used a create static method on my skills is because i havent really got that far into vJass yet, im still reading up on a few things. But so far, from what I've seen on other maps, the create static methods are just basically putting all the things that need to be set in the Actions fucntion into a function inside the struct, am i right?

Also do you use .allocate() in the create static method?
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
Static methods and methods are different because:
- Static methods don't use an instance.
- Static methods can use private members.

And yes, they can use .allocate. Allocate is private and it gets a unique id for the struct. (Quoted from JassHelperManual)
 

Kenny

Back for now.
Reaction score
202
Updated the spell...

Spell now includes:
- A create static method; and
- A proper function to detect map boundaries and stop the units, therefore reducing the risk of fatal errors.

All constructive feedback is welcome, so please leaves some comments on how i may improve this skill or future abilities i may make. Thanks :)
 

PurgeandFire

zxcvmkgdfg
Reaction score
509
I'm unable to test this map. It WC3 won't even try play it.

You need to download Newgen Warcraft. It is found in the JASS Help forum I think. Once you download it, save it to the map directory then test it out on NewGen WE.
 

Kenny

Back for now.
Reaction score
202
Major update.

Re-wrote the entire spell. No longer uses CSSafety and dynamic triggers. Now requires GTrigger by Jesus4Lyf, but thats all. Much more efficient (other one actually leaked, but no one realised). Easier to configure, more options, all that stuff that people love. :) So have fun.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • The Helper The Helper:
    The bots will show up as users online in the forum software but they do not show up in my stats tracking. I am sure there are bots in the stats but the way alot of the bots treat the site do not show up on the stats
  • Varine Varine:
    I want to build a filtration system for my 3d printer, and that shit is so much more complicated than I thought it would be
  • Varine Varine:
    Apparently ABS emits styrene particulates which can be like .2 micrometers, which idk if the VOC detectors I have can even catch that
  • Varine Varine:
    Anyway I need to get some of those sensors and two air pressure sensors installed before an after the filters, which I need to figure out how to calculate the necessary pressure for and I have yet to find anything that tells me how to actually do that, just the cfm ratings
  • Varine Varine:
    And then I have to set up an arduino board to read those sensors, which I also don't know very much about but I have a whole bunch of crash course things for that
  • Varine Varine:
    These sensors are also a lot more than I thought they would be. Like 5 to 10 each, idk why but I assumed they would be like 2 dollars
  • Varine Varine:
    Another issue I'm learning is that a lot of the air quality sensors don't work at very high ambient temperatures. I'm planning on heating this enclosure to like 60C or so, and that's the upper limit of their functionality
  • Varine Varine:
    Although I don't know if I need to actually actively heat it or just let the plate and hotend bring the ambient temp to whatever it will, but even then I need to figure out an exfiltration for hot air. I think I kind of know what to do but it's still fucking confusing
  • The Helper The Helper:
    Maybe you could find some of that information from AC tech - like how they detect freon and such
  • Varine Varine:
    That's mostly what I've been looking at
  • Varine Varine:
    I don't think I'm dealing with quite the same pressures though, at the very least its a significantly smaller system. For the time being I'm just going to put together a quick scrubby box though and hope it works good enough to not make my house toxic
  • Varine Varine:
    I mean I don't use this enough to pose any significant danger I don't think, but I would still rather not be throwing styrene all over the air
  • The Helper The Helper:
    New dessert added to recipes Southern Pecan Praline Cake https://www.thehelper.net/threads/recipe-southern-pecan-praline-cake.193555/
  • The Helper The Helper:
    Another bot invasion 493 members online most of them bots that do not show up on stats
  • Varine Varine:
    I'm looking at a solid 378 guests, but 3 members. Of which two are me and VSNES. The third is unlisted, which makes me think its a ghost.
    +1
  • The Helper The Helper:
    Some members choose invisibility mode
    +1
  • The Helper The Helper:
    I bitch about Xenforo sometimes but it really is full featured you just have to really know what you are doing to get the most out of it.
  • The Helper The Helper:
    It is just not easy to fix styles and customize but it definitely can be done
  • The Helper The Helper:
    I do know this - xenforo dropped the ball by not keeping the vbulletin reputation comments as a feature. The loss of the Reputation comments data when we switched to Xenforo really was the death knell for the site when it came to all the users that left. I know I missed it so much and I got way less interested in the site when that feature was gone and I run the site.
  • Blackveiled Blackveiled:
    People love rep, lol
    +1
  • The Helper The Helper:
    The recipe today is Sloppy Joe Casserole - one of my faves LOL https://www.thehelper.net/threads/sloppy-joe-casserole-with-manwich.193585/
  • The Helper The Helper:
    Decided to put up a healthier type recipe to mix it up - Honey Garlic Shrimp Stir-Fry https://www.thehelper.net/threads/recipe-honey-garlic-shrimp-stir-fry.193595/
  • The Helper The Helper:
    Here is another comfort food favorite - Million Dollar Casserole - https://www.thehelper.net/threads/recipe-million-dollar-casserole.193614/

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top