Group Selection

Naga'sShadow

Ultra Cool Member
Reaction score
49
I'm working on a chain spell and while I've got most of the spell to work, or at least not give errors, the secondary function used to select the next target is acting weird.

Here's the code.
JASS:
function Mana_Drain_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A00E'
endfunction

function Retargeting takes group returns unit //This gets a unexpected returns error.
    if IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetUnitState(GetFilterUnit(), UNIT_STATE_MANA) < 0) and IsUnitInGroup(GetFilterUnit(), targetes) == false then
        return GetFilterUnit()
    endif
endfunction

function Mana_Drain_Actions takes nothing returns nothing
    local unit Caster = GetTriggerUnit()
    local unit target = GetSpellAbilityUnit()
    local unit oldtarget = Caster
    local location CasterP = GetUnitLoc(Caster)
    local location targetP
    local location oldtargetP = CasterP 
    local group targets
    local integer level = GetUnitAbilityLevel(Caster, 'A00E')
    local real mana = (level * 40) + 100
    local lightning array bluebolt
    local integer bounces = level + 2
    local integer N = 1
    local string targetart = "Abilities\\Spells\\Other\\Drain\\ManaDrainTarget.mdl"
    local real reduction
    local real manadrained 
    local effect array art
    
    loop
        exitwhen N == bounces
        set targetP = GetUnitLoc(target)
        set oldtargetP = GetUnitLoc(oldtarget)
        set reduction = mana * .15 * (N - 1)
        call AddLightningLoc("DRAM", oldtargetP, targetP)
        set bj_lastCreatedLightning = bluebolt[N]
        call AddSpecialEffectLoc(targetart, targetP)
        set bj_lastCreatedEffect = art[N]
        call SetUnitState(target, UNIT_STATE_MANA, GetUnitState(target, UNIT_STATE_MANA) - (mana - reduction))
            if GetUnitState(target, UNIT_STATE_MANA) <= mana - reduction then
                set manadrained = GetUnitState(target, UNIT_STATE_MANA)
            else
                set manadrained = mana - reduction
            endif
        call SetUnitState(Caster, UNIT_STATE_MANA, GetUnitState(Caster, UNIT_STATE_MANA) + manadrained)
        call GroupAddUnit(targets, target)
        set oldtarget = target
        set target = GroupPickRandomUnit(GetUnitsInRangeOfLocMatching(400, targetP, Condition( function Retargeting)))
        set N = N + 1
        set targetP = null
        set oldtargetP = null
        call PolledWait(.2)
    endloop
    
    set N = 1
        
    loop
        exitwhen N == bounces
        call DestroyLightning(bluebolt[N])
        call DestroyEffect(art[N])
        call PolledWait(.2)
        set N = N + 1
    endloop
    
    set Caster = null
    set target = null
    set oldtarget = null
    set CasterP = null
    set targetP = null
    set oldtargetP = null
    call DestroyGroup(targets)

        
endfunction

//==== Init Trigger Mana Drain ====
function InitTrig_Mana_Drain takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t, Condition(function Mana_Drain_Conditions))
    call TriggerAddAction(t, function Mana_Drain_Actions)
    set t = null
endfunction

While the built in syntax checker has a field day the VJASS Phraser only has an issue with the return of the function Retargeting. I'm not sure if the code will even work at this point so my main question is what should the return be, secondary questions include will this work? Are there any other glaring mistakes and is there a easier way to select units?

Thanks in advance.
 

Artificial

Without Intelligence
Reaction score
326
Condition() takes a function that returns a boolean. So change this:
JASS:
function Retargeting takes group returns unit //This gets a unexpected returns error.
    if IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetUnitState(GetFilterUnit(), UNIT_STATE_MANA) < 0) and IsUnitInGroup(GetFilterUnit(), targetes) == false then
        return GetFilterUnit()
    endif
endfunction
to this:
JASS:
function Retargeting takes group returns boolean
    return IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetUnitState(GetFilterUnit(), UNIT_STATE_MANA) < 0) and IsUnitInGroup(GetFilterUnit(), targetes) == false
endfunction


Also, you didn't give a name for the argument you have in there. That's what probably is causing the error you got. Additionally, functions used as arguments for Condition() cannot take anything. You'd probably want to store the group you're trying to give as an argument to a global variable and use that.

JASS:
//    
        call AddLightningLoc("DRAM", oldtargetP, targetP)
        set bj_lastCreatedLightning = bluebolt[N]
        call AddSpecialEffectLoc(targetart, targetP)
        set bj_lastCreatedEffect = art[N]
->
JASS:
set bluebolt[N] = AddLightningLoc("DRAM", oldtargetP, targetP)
set art[N] = AddSpecialEffectLoc(targetart, targetP)
Also, your trigger is leaking rather much from what I can see.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      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