HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Passing locals in functions

07-27-2006, 11:10 PM#1
The_AwaKening
I made this conditional kick trigger. Everything is working just fine when I save, except this one line.
Collapse JASS:
call TriggerAddAction(T,function KickVote(pk,j))
I need to pass those 2 integers to the other function. Apparently I can't do it in the addaction or I'm just typing it wrong. Here is the entire code. I commented that line so that I could save it.
Collapse JASS:
function KickVote takes integer playerIndex, integer voteIndex returns nothing
 local real percent
    if udg_kickVoters[GetPlayerId(GetTriggerPlayer())]==false then
        set udg_kickVoters[GetPlayerId(GetTriggerPlayer())]=true
        set udg_kickVote=udg_kickVote+1
        set percent = I2R(udg_kickVote/voteIndex)*100
        call DisplayTextToForce(GetPlayersAll(),I2S(R2I(percent)) + "% yes votes so far.")
    elseif GetTriggerPlayer()==Player(udg_Host) then
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"|cffff0000Your vote is automatically yes.|r")
    elseif GetTriggerPlayer()==Player(playerIndex) then
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"|cffff0000You are unable to vote.|r")
    else
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"|cffff0000You've already voted.|r")
    endif
endfunction

function Kick_Actions takes nothing returns nothing
 local trigger T
 local player p=GetTriggerPlayer()
 local integer i=0
 local integer j=0
 local integer pk=GetPlayerIndexFromColorString(SubString(GetEventPlayerChatString(), 6, 22))
 local timer t
 local timerdialog td
 local boolean b
    if pk==0 or GetPlayerSlotState(Player(pk-1))!=PLAYER_SLOT_STATE_PLAYING or GetPlayerId(p)==pk-1 or p!=Player(udg_Host) then
        if p!=Player(udg_Host) then
            call DisplayTextToPlayer(p,0,0,"|cffff0000Only " + udg_playerColor[udg_Host] + GetPlayerName(Player(udg_Host)) + " |cffff0000has authority to initiate a vote.|r")
        else
            call DisplayTextToPlayer(p,0,0,"|cffff0000Error handling request!|r")
        endif
        set p=null
        return
    endif
    set udg_kickVoters[9]=true    // ****vote in progress****
    set pk=pk-1
    set T=CreateTrigger()
    set b=false
    loop
        exitwhen i>8
        call TriggerRegisterPlayerChatEvent( T, Player(i), "-yes", true )
        if Player(i)!=p and i!=pk and GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING then
            set udg_kickVoters[i]=false
            set j=j+1
            if IsPlayerAlly(Player(i),Player(pk)) then
                set b=true
            endif
        else
            set udg_kickVoters[i]=true
        endif
        set i=i+1
    endloop
    if b==false then
        call DisplayTextToPlayer(p,0,0,"|cffff0000Unable to kick " + udg_playerColor[pk+1] + GetPlayerName(Player(pk)) + " |cffff0000unless he/she has an ally.|r")
        set p=null
        call DestroyTrigger(T)
        set T=null
        set udg_kickVoters[9]=false
        return
    endif
//	call TriggerAddAction(T,function KickVote(pk,j))
    set udg_kickVote=0
    set t=CreateTimer()
    set td=CreateTimerDialog(t)
    call TimerDialogSetTitle(td,"Kick Timer")
    call TimerDialogDisplay(td, true)
    call TimerStart( t, 15.00, false, null )
    call DisplayTimedTextToForce(GetPlayersAll(),15,udg_playerColor[GetPlayerId(p)+1] + GetPlayerName(p) + "|r has initiated a vote to kick " + udg_playerColor[pk+1] + GetPlayerName(Player(pk)) + "|r from the game.
	Type |cffffcc00-yes|r to Kick.  Must be 100% vote yes.")
    call PolledWait(15)
    if udg_kickVote==j then
        call RemovePlayer( Player(pk), PLAYER_GAME_RESULT_DEFEAT )
    else
        call DisplayTextToForce(GetPlayersAll(),"Kick Failed")
    endif
    set i=0
    loop
        set udg_kickVoters[i]=false
        set i=i+1
        exitwhen i>9
    endloop        
    call DestroyTrigger(T)
    call PauseTimer(t)
    call DestroyTimer(t)
    call DestroyTimerDialog(td)
 set T=null
 set p=null
 set t=null
 set td=null
endfunction

//===========================================================================
function Kick_Conditions takes nothing returns boolean
    return udg_kickVoters[9]==false or udg_kickVoters[9]==null
endfunction

function InitTrig_Kick takes nothing returns nothing
 local integer i=0
    set gg_trg_Kick = CreateTrigger(  )
    loop
        exitwhen i>8
        call TriggerRegisterPlayerChatEvent( gg_trg_Kick, Player(i), "-kick", false )
        set i=i+1
    endloop
    call TriggerAddCondition(gg_trg_Kick, Condition(function Kick_Conditions))
    call TriggerAddAction( gg_trg_Kick, function Kick_Actions )
endfunction
07-27-2006, 11:12 PM#2
Alevice
You can't have parameters to a code parameter. You need to use something like the Local Handle Vars.
07-27-2006, 11:27 PM#3
The)TideHunter(
Yes, the only way to do it would be setting a global or storing a int.
Theres no need for handle vars, as hes using ints and not handles.

As Alevice said, you can only have functions that take nothing and returns nothing for code parameters.
So instead make your functions like this:

Collapse JASS:
function KickVote takes integer playerIndex, integer voteIndex returns nothing
 local real percent
 local integer playerIndex = udg_pk
 local integer voteIndex = udg_j
    if udg_kickVoters[GetPlayerId(GetTriggerPlayer())]==false then
        set udg_kickVoters[GetPlayerId(GetTriggerPlayer())]=true
        set udg_kickVote=udg_kickVote+1
        set percent = I2R(udg_kickVote/voteIndex)*100
        call DisplayTextToForce(GetPlayersAll(),I2S(R2I(percent)) + "% yes votes so far.")
    elseif GetTriggerPlayer()==Player(udg_Host) then
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"|cffff0000Your vote is automatically yes.|r")
    elseif GetTriggerPlayer()==Player(playerIndex) then
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"|cffff0000You are unable to vote.|r")
    else
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"|cffff0000You've already voted.|r")
    endif
endfunction

function Kick_Actions takes nothing returns nothing
 local trigger T
 local player p=GetTriggerPlayer()
 local integer i=0
 local integer j=0
 local integer pk=GetPlayerIndexFromColorString(SubString(GetEventPlayerChatString(), 6, 22))
 local timer t
 local timerdialog td
 local boolean b
    if pk==0 or GetPlayerSlotState(Player(pk-1))!=PLAYER_SLOT_STATE_PLAYING or GetPlayerId(p)==pk-1 or p!=Player(udg_Host) then
        if p!=Player(udg_Host) then
            call DisplayTextToPlayer(p,0,0,"|cffff0000Only " + udg_playerColor[udg_Host] + GetPlayerName(Player(udg_Host)) + " |cffff0000has authority to initiate a vote.|r")
        else
            call DisplayTextToPlayer(p,0,0,"|cffff0000Error handling request!|r")
        endif
        set p=null
        return
    endif
    set udg_kickVoters[9]=true    // ****vote in progress****
    set pk=pk-1
    set T=CreateTrigger()
    set b=false
    loop
        exitwhen i>8
        call TriggerRegisterPlayerChatEvent( T, Player(i), "-yes", true )
        if Player(i)!=p and i!=pk and GetPlayerSlotState(Player(i))==PLAYER_SLOT_STATE_PLAYING then
            set udg_kickVoters[i]=false
            set j=j+1
            if IsPlayerAlly(Player(i),Player(pk)) then
                set b=true
            endif
        else
            set udg_kickVoters[i]=true
        endif
        set i=i+1
    endloop
    if b==false then
        call DisplayTextToPlayer(p,0,0,"|cffff0000Unable to kick " + udg_playerColor[pk+1] + GetPlayerName(Player(pk)) + " |cffff0000unless he/she has an ally.|r")
        set p=null
        call DestroyTrigger(T)
        set T=null
        set udg_kickVoters[9]=false
        return
    endif
             set udg_pk = pk
             set udg_j = j
    call TriggerAddAction(T,function KickVote)
    set udg_kickVote=0
    set t=CreateTimer()
    set td=CreateTimerDialog(t)
    call TimerDialogSetTitle(td,"Kick Timer")
    call TimerDialogDisplay(td, true)
    call TimerStart( t, 15.00, false, null )
    call DisplayTimedTextToForce(GetPlayersAll(),15,udg_playerColor[GetPlayerId(p)+1] + GetPlayerName(p) + "|r has initiated a vote to kick " + udg_playerColor[pk+1] + GetPlayerName(Player(pk)) + "|r from the game.
	Type |cffffcc00-yes|r to Kick.  Must be 100% vote yes.")
    call PolledWait(15)
    if udg_kickVote==j then
        call RemovePlayer( Player(pk), PLAYER_GAME_RESULT_DEFEAT )
    else
        call DisplayTextToForce(GetPlayersAll(),"Kick Failed")
    endif
    set i=0
    loop
        set udg_kickVoters[i]=false
        set i=i+1
        exitwhen i>9
    endloop        
    call DestroyTrigger(T)
    call PauseTimer(t)
    call DestroyTimer(t)
    call DestroyTimerDialog(td)
 set T=null
 set p=null
 set t=null
 set td=null
endfunction

//===========================================================================
function Kick_Conditions takes nothing returns boolean
    return udg_kickVoters[9]==false or udg_kickVoters[9]==null
endfunction

function InitTrig_Kick takes nothing returns nothing
 local integer i=0
    set gg_trg_Kick = CreateTrigger(  )
    loop
        exitwhen i>8
        call TriggerRegisterPlayerChatEvent( gg_trg_Kick, Player(i), "-kick", false )
        set i=i+1
    endloop
    call TriggerAddCondition(gg_trg_Kick, Condition(function Kick_Conditions))
    call TriggerAddAction( gg_trg_Kick, function Kick_Actions )
endfunction
07-28-2006, 06:18 AM#4
The_AwaKening
I just was trying to avoid using a global, but oh well. I have a way I can just use my existing array and add to it I guess. Thanks guys, just wanted to see if it was possible.
07-28-2006, 08:58 AM#5
Captain Griffen
Quote:
Theres no need for handle vars, as hes using ints and not handles.

Quote:
type trigger extends handle
type triggercondition extends handle
type triggeraction extends handle

He wants to attach something to a handle. Only way to do it without globals is local handle variables.