Spell Request [Difficulty: Hard]: Magnet Tower

warden13

New Member
Reaction score
32
Hello!

I would like to request a spell to be made, here is info about how I want it to be done.

* GUI/Jass/Vjass: I prefer JASS. But all is OK.
* MUI/MPI: MUI.
* Name: Magnet Tower
* Description: Engineer builds a tower that pulls enemy units in 800 range. Tower lasts 120 seconds.
* Levels: 1
* Coldown: 180 sec.
* Unit/Hero Skill: Hero skill
* Creators description: It would be nice if pulling distance increases every seconds. Also It must wait 10 seconds before pulling the same target again. You can have 2 of this traps at the same time, so you should do something about this. Unit will take damage when it touches the Tower.

Thanks, you will get credits in loading screen.
 

Tom Jones

N/A
Reaction score
437
* Creators description: It would be nice if pulling distance increases every seconds. Also It must wait 10 seconds before pulling the same target again. You can have 2 of this traps at the same time, so you should do something about this. Unit will take damage when it touches the Tower.
Starting at 0 ending at X?
 

mordocai

New Member
Reaction score
17
tom if you make this can you make it multi levelable/fully configuerable? im trying to make a spell like this but would like a backup
 

warden13

New Member
Reaction score
32
Haste
Events
Time - Every 0.05 seconds of game time
Conditions
Actions
Set distance = (distance + 0.25)
Set angle = (Facing of unit)
Unit - Move unit instantly to (point offset by (Power(distance, 2.00)) towards angle degrees)

It will be faster than before every 0.05 seconds. Got it?
 

Tom Jones

N/A
Reaction score
437
Indeed, so it works like a magnet. The closer to x unit y unit is, the faster it'll get dragged. This was in my original draft. Oh, by the way I would like to do it :thup:

You have to give me some days though, this isn't excactly easy and I have some personal business to attend to aswell.
 

warden13

New Member
Reaction score
32
I am planning to relase the map at the end of the May. So, you can do it anytime. Dont forget it :p
50% rep now,
50% is after business. :p

Edit:

Custom script: call SetUnitX(GetEnumUnit(), GetUnitX(GetEnumUnit()) + udg_Int_Currentspeed[GetPlayerId(GetOwningPlayer(GetEnumUnit()))+1] * Cos(GetUnitFacing(GetEnumUnit()) * bj_DEGTORAD))
Custom script: call SetUnitY(GetEnumUnit(), GetUnitY(GetEnumUnit()) + udg_Int_Currentspeed[GetPlayerId(GetOwningPlayer(GetEnumUnit()))+1] * Sin(GetUnitFacing(GetEnumUnit()) * bj_DEGTORAD))

I found that move functions does not interrupt the unit's orders. Please use them.
 

Tom Jones

N/A
Reaction score
437
We can make a collaboration? As you'r fairly new to jass (I assume, correct me if I'm wrong) you create the spell, I'll review and comment your work, thus you learn and warden13 gets his spell. Assuming that this is ok with warden13 ofcourse. Feel free to PM me.
 

bOb666777

Stand against the ugly world domination face!
Reaction score
117
Looks like a cool spell.
I mean, really. 2 persons working on it? And I'm interested too.
But I guess I'm late :(.

Movement-related (ranges from triggered movement to knockbacktastic) spells are my favorite :(
 

ThePlague

New Member
Reaction score
14
We can make a collaboration? As you'r fairly new to jass (I assume, correct me if I'm wrong) you create the spell, I'll review and comment your work, thus you learn and warden13 gets his spell. Assuming that this is ok with warden13 ofcourse. Feel free to PM me.
Sounds cool. Ill send in whatever i have tomorrow. I'm not actually new, I just sorta taught myself so I dont know the details of how some commands work (and iv never tried any of the systems vJass, handlevars etc).
 

ThePlague

New Member
Reaction score
14
OK! heres my trigger: I think it should work, but I havent tested it.


JASS:
function Trig_Magnet_Pull_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AUan' 
endfunction

function Trig_Mag2_Cond takes nothing returns boolean
return GetUnitTypeId(GetEventDamageSource()) == 'u00Q'
endfunction

function Trig_Mag2_Actions takes nothing returns nothing
local unit Caster=GetEventDamageSource()
local location TargetLoc=GetUnitLoc(GetTriggerUnit())
local location CasterLoc=GetUnitLoc(Caster)
local real Angle=AngleBetweenPoints(CasterLoc, TargetLoc)
local real Distance=DistanceBetweenPoints(CasterLoc, TargetLoc)
local location LOC=PolarProjectionBJ(TargetLoc,2000 /Distance , Angle)
    call SetUnitLifeBJ( GetTriggerUnit(), ( 1 + GetUnitStateSwap(UNIT_STATE_LIFE, GetTriggerUnit()) ) )
    call SetUnitX(GetTriggerUnit(),GetLocationX(LOC))
    call SetUnitY(GetTriggerUnit(),GetLocationY(LOC))
call RemoveLocation(LOC)
set LOC=PolarProjectionBJ(TargetLoc,4000 /Distance , Angle)
    call SetUnitX(GetTriggerUnit(),GetLocationX(LOC))
    call SetUnitY(GetTriggerUnit(),GetLocationY(LOC))
call RemoveLocation(LOC)
set LOC=PolarProjectionBJ(TargetLoc,6000 /Distance , Angle)
    call SetUnitX(GetTriggerUnit(),GetLocationX(LOC))
    call SetUnitY(GetTriggerUnit(),GetLocationY(LOC))
call RemoveLocation(LOC)
set LOC=PolarProjectionBJ(TargetLoc,8000 /Distance , Angle)
    call SetUnitX(GetTriggerUnit(),GetLocationX(LOC))
    call SetUnitY(GetTriggerUnit(),GetLocationY(LOC))
call RemoveLocation(LOC)
if (GetTriggerExecCount(GetTriggeringTrigger()) >= 30 ) then
    call DestroyTrigger(GetTriggeringTrigger())
else
    call IssueTargetOrderBJ( Caster, "fingerofdeath", GetTriggerUnit() )
endif
    call RemoveLocation(TargetLoc)
    call RemoveLocation(CasterLoc)
set Caster=null
set TargetLoc=null
set LOC=null
endfunction

function Trig_Magnet_Pull_Actions takes nothing returns nothing
local unit Target=GetSpellTargetUnit()
local location CasterLoc=GetUnitLoc(GetTriggerUnit())
local unit Dummy=CreateUnitAtLoc(GetOwningPlayer(GetTriggerUnit()), 'u00Q', CasterLoc, 0)
local trigger Move=CreateTrigger()
    call TriggerRegisterUnitEvent( Move, Target, EVENT_UNIT_DAMAGED )
    call TriggerAddCondition(Move, Condition(function Trig_Mag2_Cond))
    call TriggerAddAction(Move, function Trig_Mag2_Actions)
    call IssueTargetOrderBJ( Dummy, "fingerofdeath", Target )
call RemoveLocation(CasterLoc)
set Target=null
set CasterLoc=null
    call TriggerSleepAction(100)
call DestroyTrigger(Move)
set Move=null
call RemoveUnit(Dummy)
set Dummy=null
endfunction

//===========================================================================
function InitTrig_Magnet_Pull takes nothing returns nothing
    set gg_trg_Magnet_Pull = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Magnet_Pull, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Magnet_Pull, Condition( function Trig_Magnet_Pull_Conditions ) )
    call TriggerAddAction( gg_trg_Magnet_Pull, function Trig_Magnet_Pull_Actions )
endfunction
The numerical values and IDs can/need to be changed/tweaked.

It requires some explanation.
When you cast the spell on the target. It creates a Dummy and orders it to cast a spell (I chose fingerofdeath but any will work as long as it does damage.), and it also creates a trigger to detect when the Targeted unit takes damage. That Trigger calculates distance, angles, etc. and moves the unit inversely proportional to the distance. It also heals the unit 1 hp (This nullifies the 1 damage you need to set the dummy spell to). It then orders the dummy unit to once again cast the same spell (now we have an infinite loop of this trigger). I also added an if/endif clause to end the loop after a certain amount of executions to avoid the infinite loop. And finally, I added a 30 second wait in the original trigger after which it will destroy the looping trigger (This is in case the unit dies or something).

This should be entirely leak free.

What you need to do is:
copy/paste this trigger (hard part 0o)
create a custom spell that will initiate this and replace 'AUan' with its SpellID
create a Dummy Unit and replace 'u00Q' with its ID

where I have "triggersleepaction" set the time to a number high enough it wont interfere with trigger

This part is critical:
Create a Dummy spell (if not based on finger of death change "fingerofdeath to w/e spell it was based off)
set Damage to 1
No mana cost and No CD
set casting Time to zero
remove animation
set projectile speed extremely high so its practically instant

Now, all units have a certain casting time in their stats. Set the dummy's casting time to whatever time you want in between the pulls

Ex. you set it to 1 the trigger will fire every second
.1 every .1 seconds

I think thats everything ^^

all variables are completely local, MUI, MPI

oh one more note, Where it calculates the angle it might be calculating the opposite angle (itll push away instead of pull)
if it does that just switch CasterLoc and TargetLoc in

local real Angle=AngleBetweenPoints(CasterLoc, TargetLoc)

Edit: Why arent spoiler tags working?
 

bOb666777

Stand against the ugly world domination face!
Reaction score
117
If I were you, I'd post the map, especially since you use global triggers.
 

Tom Jones

N/A
Reaction score
437
Magnet Tower.​

Description:
N/A.

Requirements:
  • NewGen editor.

Code:
  • vJass.
  • MUI.
  • Leakfree.
JASS:
scope MagnetTower
//#######################################################################################
//#Magnet Tower - By Tom Jones.
//#######################################################################################
//#Requirements:
//#1) NewGen Editor
//#2) These object data:
//#       a) Magnet Tower (Main Ability)
//#       b) Magnet Tower (Dummy Unit)
//#       c) Magnet Tower (Buff)
//#
//#Implementation:
//#1) Copy/paste this trigger from this map to your map.
//#2) Copy/paste the above required object data from this map to your map. Alternatively
//#   you could create new ones or use existing ones.
//#3) Modify the options section below. Values that expect rawdata must match the rawdata
//#   from your map. To see your map's raw data, go to the object editor and press ctrl+d.
//#
//####################################################################################### 

//#######################################################################################
//#Options.
//#######################################################################################
globals
    private constant integer    SPELL_ID            = 'A000'
    private constant integer    BUFF_ID             = 'B000'
    private constant integer    DUMMY_UNIT_ID       = 'n000'
    private constant string     DUMMY_ART_1st       = "Abilities\\Spells\\Items\\AItb\\AItbTarget.mdl"
    private constant string     DUMMY_ART_2nd       = "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl"
    private constant string     TARGET_ART          = "Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl" 
    private constant real       DURATION            = 20.
    private constant real       AOE                 = 2500.
    private constant real       PULL_STRENGTH       = 30.
    private constant real       DAMAGE              = 120.
    private constant attacktype ATTACK_TYPE         = ATTACK_TYPE_NORMAL
    private constant damagetype DAMAGE_TYPE         = DAMAGE_TYPE_NORMAL
    private constant real       DAMAGE_SUSPENSION   = 2.
    private constant boolean    MOVEABLE            = false
endglobals


//###################
//#Level controllers.
//#######################################################################################
private function Duration takes integer level returns real
    return DURATION
endfunction

private function Aoe takes integer level returns real
    return AOE+(25*level)
endfunction

private function Damage takes integer level returns real
    return DAMAGE+(40*level)
endfunction

private function Pull_Strength takes integer level returns real
    return PULL_STRENGTH+(1*level)
endfunction

private function Damage_Suspension takes integer level returns real
    return DAMAGE_SUSPENSION-(1.5*level)
endfunction

//#######################################################################################
//#Hashing - Do not modify below this line unless you know what you're doing!
//#######################################################################################
private function H2I takes handle h returns integer
    return h
    return 0
endfunction

private struct attachment
    private static integer Deduct = 0x100000
    private static integer Hash = 8192
    private static integer array I
    private static integer Index
    
    static method operator []= takes handle h, integer value returns nothing
        set .Index = H2I(h)-.Deduct
        set .I[.Index-(.Index/.Hash)*.Hash] = value
    endmethod
    static method operator [] takes handle h returns integer
        set .Index = H2I(h)-.Deduct
        return .I[.Index-(.Index/.Hash)*.Hash]
    endmethod
endstruct

private struct stackobject 
    stackobject next
    stackobject prev 
    
    static method create takes nothing returns stackobject
        local stackobject this = stackobject.allocate()
        set .next = 0
        set .prev = 0
        return this
    endmethod
endstruct

private struct stack 
    stackobject first
    stackobject last
    integer size
    
    method add takes stackobject s returns stackobject
        if .first == 0 then
            set .first = s
        else
            set .last.next = s
            set s.prev = .last
        endif
        set .size = .size+1
        set .last = s
        return s
    endmethod
        
    method remove takes stackobject s returns nothing
        if s == .first then
            set .first = .first.next
        else
            set s.prev.next = s.next
            set s.next.prev = s.prev
        endif
        set .size = .size-1
    endmethod
    
    method onDestroy takes nothing returns nothing
        local stackobject s = .first
        
        loop
            exitwhen s == 0
            call s.destroy()
            set s = s.next
        endloop
    endmethod
endstruct

//#######################################################################################
//#Misc.
//#######################################################################################
globals
    private keyword main
    private integer T_INDEX = 0
    private timer array T
    private main FILTER_STRUCT
    private constant real INTERVAL = .023
endglobals

private function ParabolaZ takes real h, real d, real x returns real
    return (4 * h / d) * (d - x) * (x / d)
endfunction

//#######################################################################################
//#Custom types.
//#######################################################################################
private struct widget extends stackobject
    integer tick
    unit u
    real x
    real y
endstruct

private struct victim extends widget
    real fx
    real angle
    real cooldown
    boolean moveable
endstruct

private struct main
    unit u
    player p
    integer lvl
    stack dummies
    stack victims
    trigger trig
    timer t
    
    static method Delegator takes nothing returns boolean
        local main this = GetTriggeringTrigger():attachment
    
        if GetTriggerEventId() == EVENT_UNIT_TARGET_IN_RANGE then   
            if IsUnitAlly(GetTriggerUnit(),.p) == true then
                return false
            elseif IsUnitType(GetTriggerUnit(),UNIT_TYPE_DEAD) == true then
                return false
            elseif IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE) == true then
                return false
            elseif IsUnitType(GetTriggerUnit(),UNIT_TYPE_MECHANICAL) == true then
                return false
            elseif IsUnitType(GetTriggerUnit(),UNIT_TYPE_MAGIC_IMMUNE) == true then
                return false
            endif
            return ExecuteFunc(main.onDetect.name)
        else
            if GetUnitTypeId(GetTriggerUnit()) == DUMMY_UNIT_ID then
                return ExecuteFunc(main.Dummy_Actions.name)
            endif
        endif
        return false
    endmethod
    
    static method onTick takes nothing returns nothing
        local main this = GetExpiredTimer():attachment
        local victim v = .victims.first
        local widget d
        local real aoe
        local real dist
        local boolean flag
        local real r
        
        loop
            exitwhen v == 0
            set d = .dummies.first
            loop
                exitwhen d == 0
                set aoe = Aoe(.lvl)
                set flag = IsUnitInRange(v.u,d.u,aoe+75)
                if flag and v.cooldown == 0 then
                    set v.x = GetUnitX(v.u)
                    set v.y = GetUnitY(v.u)
                    set v.angle = Atan2(d.y-v.y,d.x-v.x)
                    set r = SquareRoot((v.x-d.x)*(v.x-d.x)+(v.y-d.y)*(v.y-d.y))
                    set dist = Pull_Strength(.lvl)*((aoe-r)/aoe)
                    if v.moveable then
                        call SetUnitX(v.u,v.x+dist*Cos(v.angle))
                        call SetUnitY(v.u,v.y+dist*Sin(v.angle))
                    else
                        set v.x = v.x+dist*Cos(v.angle)
                        set v.y = v.y+dist*Sin(v.angle)
                        call SetUnitPosition(v.u,v.x,v.y)
                    endif
                    set aoe = aoe/4
                    if r <= 75 then
                        set v.cooldown = Damage_Suspension(.lvl)
                        call SetUnitExploded(v.u,true)
                        call UnitDamageTargetBJ(.u,v.u,Damage(.lvl),ATTACK_TYPE,DAMAGE_TYPE)
                        call SetUnitExploded(v.u,false)
                        call SetUnitPathing(v.u,true)
                        call SetUnitFlyHeight(v.u,0,80/INTERVAL)
                        if IsUnitType(v.u,UNIT_TYPE_DEAD) == true then
                            set flag = false
                            exitwhen true
                        endif
                    elseif r <= aoe then
                        set v.fx = aoe-r
                        call SetUnitFlyHeight(v.u,ParabolaZ(80,2*aoe,v.fx),0)
                    endif
                elseif flag and v.cooldown > .0 then
                    set v.cooldown = v.cooldown-INTERVAL
                    if v.cooldown <= .0 then
                        set v.x = GetUnitX(v.u)
                        set v.y = GetUnitY(v.u)
                        if v.moveable == false then
                            set v.angle = Atan2(d.y-v.y,d.x-v.x)
                        endif
                        set v.cooldown = .0
                        call SetUnitPathing(v.u,false)
                    endif
                endif
                set d = d.next
            endloop
            set v.tick = v.tick+R2I(INTERVAL*100)
            if v.tick-(v.tick/100)*100 == 0 then
                call DestroyEffect(AddSpecialEffectTarget(TARGET_ART,v.u,"origin"))
            endif
            if flag == false then
                call .victims.remove(v)
                call v.destroy()
            endif
            set v = v.next
        endloop
        set d = .dummies.first
        loop
            exitwhen d == 0
            set d.tick = d.tick+R2I(INTERVAL*100)
            if d.tick-(d.tick/100)*100 == 0 then
                call DestroyEffect(AddSpecialEffect(DUMMY_ART_1st,d.x,d.y))
                call DestroyEffect(AddSpecialEffect(DUMMY_ART_2nd,d.x,d.y))
            endif
            set d = d.next
        endloop
    endmethod
    
    static method onDetect takes nothing returns nothing
        local main this = GetTriggeringTrigger():attachment
        local victim v = .victims.first
        local widget w = widget(0)
        
        set w.u = GetTriggerUnit()
        loop
            exitwhen v.u == w.u or v == 0
            set v = v.next
        endloop
        if v == 0 then
            set v = victim.create()
            set v.u = GetTriggerUnit()
            set v.x = GetUnitX(v.u)
            set v.y = GetUnitY(v.u)
            set v.moveable = MOVEABLE
            set v.cooldown = 0
            set v.tick = 100-R2I(INTERVAL*100)
            set v.fx = 0
            call SetUnitPathing(v.u,false)
            call UnitAddAbility(v.u,'Amrf')
            call UnitRemoveAbility(v.u,'Amrf')
            call .victims.add(v)
        endif
    endmethod
        
    static method Dummy_Actions takes nothing returns nothing
        local main this = GetTriggeringTrigger():attachment
        local widget d 
        local widget w
        
        if GetTriggerEventId() == EVENT_PLAYER_UNIT_CONSTRUCT_FINISH then
            set d = widget.create()
            set d.u = GetTriggerUnit()
            set d.x = GetUnitX(d.u)
            set d.y = GetUnitY(d.u)
            set d.tick = 100-R2I(INTERVAL*100)
            call UnitApplyTimedLife(d.u,BUFF_ID,Duration(.lvl))
            call TriggerRegisterUnitInRange(.trig,d.u,Aoe(.lvl),null)
            call TriggerRegisterUnitEvent(.trig,d.u,EVENT_UNIT_DEATH)
            call .dummies.add(d)
            if .dummies.first == d then
                call TimerStart(.t,INTERVAL,true,function main.onTick)
            endif
        else
            set d = .dummies.first
            set w = widget(0)
            set w.u = GetTriggerUnit()
            loop
                exitwhen d.u == w.u or d == 0
                set d = d.next
            endloop
            call .dummies.remove(d)
            if .dummies.first == 0 then
                call .destroy()
            endif
        endif
    endmethod
    
    static method onCast_Conditions takes nothing returns boolean
        return GetSpellAbilityId() == SPELL_ID and GetTriggerUnit():attachment == 0
    endmethod
    
    static method onCast takes nothing returns nothing
        local main this = main.allocate()
        
        set .u = GetTriggerUnit()
        set .u:attachment = 1
        set .p = GetTriggerPlayer()
        set .lvl = GetUnitAbilityLevel(.u,SPELL_ID)-1
        set .dummies = stack.create()
        set .victims = stack.create()
        set .trig = CreateTrigger()
        set .trig:attachment = this
        call TriggerRegisterPlayerUnitEvent(.trig,.p,EVENT_PLAYER_UNIT_CONSTRUCT_FINISH,null)
        call TriggerRegisterPlayerUnitEvent(.trig,.p,EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL,null)
        call TriggerAddCondition(.trig,Condition(function main.Delegator))
        if T_INDEX == 0 then
            set .t = CreateTimer()
        else
            set T_INDEX = T_INDEX-1
            set .t = T[T_INDEX]
        endif
        set .t:attachment = this
    endmethod
    
    method onDestroy takes nothing returns nothing
        local victim v = .dummies.first
        
        set .u:attachment = 0
        set T[T_INDEX] = .t
        set T_INDEX = T_INDEX+1
        call PauseTimer(.t)
        call DestroyTrigger(.trig)
        loop
            exitwhen v == 0
            call SetUnitFlyHeight(v.u,0,0)
            call SetUnitPathing(v.u,true)
            set v = v.next
        endloop
        call .dummies.destroy()
        call .victims.destroy()
    endmethod
    
    static method onInit takes nothing returns nothing
        local trigger trig = CreateTrigger()
        local widget w = widget(0)
        
        call TriggerRegisterAnyUnitEventBJ(trig,EVENT_PLAYER_UNIT_SPELL_EFFECT)
        call TriggerAddCondition(trig,Condition(function main.onCast_Conditions))
        call TriggerAddAction(trig,function main.onCast)
        set w.u = CreateUnit(Player(15),DUMMY_UNIT_ID,0,0,0)
        call UnitAddAbility(w.u,SPELL_ID)
        call RemoveUnit(w.u)
    endmethod
endstruct
endscope
 

Attachments

  • Magnet Tower.w3x
    28.6 KB · Views: 160

ThePlague

New Member
Reaction score
14
wow so long 0o
I cant follow everything its doing so many different functions.

Two quick questions
1. Hows my trigger? :D any general things i should do differently?
2. What exactly are the handlevars doing in your trig? and dont they have a downside?
I never understood those systems and it seemed like it had problems iv always tried to avoid it.

Also does your trigger require any special things or is it executable in regular jass?

Edit:

I just tested ur map in wc3. Looks really nice but major flaw ><
I placed one tower down and everyone accelerated toward it.
THen about a minute later i put another one down and The game spammed a message i forget what it was.
THen it froze and after about 5 mins i just turned comp off then on.

also I just realized that the spell was supposed to be AoE ><

btw whats a Hash?
 

Tom Jones

N/A
Reaction score
437
wow so long 0o
I cant follow everything its doing so many different functions.

Two quick questions
1. Hows my trigger? :D any general things i should do differently?
2. What exactly are the handlevars doing in your trig? and dont they have a downside?
I never understood those systems and it seemed like it had problems iv always tried to avoid it.

Also does your trigger require any special things or is it executable in regular jass?

Edit:

I just tested ur map in wc3. Looks really nice but major flaw ><
I placed one tower down and everyone accelerated toward it.
THen about a minute later i put another one down and The game spammed a message i forget what it was.
THen it froze and after about 5 mins i just turned comp off then on.

also I just realized that the spell was supposed to be AoE ><

btw whats a Hash?
Your code is horrible :) You have to learn vJass. Download NewGen editor, and then read the Jasshelper documentation, then have a look at the code I posted. If you have any questions, PM me. Also have a look at the Romek's vJass tutorial "Uncomplicating the complicated", it's a really good tutorial.

The "handle vars", as you call them, are truly necessary. Though structs have made it easier to pass variables from one function to another, we still need to pass the struct it self to other functions. That is what they are doing there, passing a struct to a timer and trigger. You simply can't make efficient coding without some sort of passing system. Is there a downside? Indeed there is, and I'll gladly explain it to you once you gotten the hang of the basics.

The code requires the latest NewGen editor.

As for the endless loop you discovered, I fixed it and uploaded the fixed map.

Hashing is hard to explain simplistic, basically it's allocating data with specifics keys.
 

Renendaru

(Evol)ution is nothing without love.
Reaction score
309
Your code is horrible :)
You can be harsh sometimes. :p

Besides that, I looked at your trigger and it looks solid. Wish I could code like that. (I probably can, but I'm just too lazy to sit down and code half the time)
 

ThePlague

New Member
Reaction score
14
Might just be because of all ur header info but mine seems simpler to me (or maybe cuz i know exactly what i did).

its no that bad just because its normal Jass :(
at least im not using the default conditions when u convert to custom text!

(if not condition then return false else return true)<-- wtf was bliz thinking

also I still get what I want w/o using vJass
guess i'll take a look at it ><


And just from a standpoint of it lagging, leaking, or glitching somehow, is there actually anything wrong with it?


infinite loops so many fun times...
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top