HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Creating triggers during a trigger (dynamic triggers) problem

09-07-2006, 03:20 PM#1
grupoapunte
Hello, well here i have a very big problem, as you can see in the code i have a function that creates a trigger, this trigger is used to know if a player makes a DUBLE KILL or TRIPLE KILL (double kill must happends within 5 secs of the first kill, and triple within 4 secs of the second kill) I made it this way because i have only 1 trigger to revive any hero (instead of 1 trigger per player to revive the heroes). The problem is in function "ReviveHero_BonusKillsReset" where i can't find a way to set variable iKiller so i can identify the player for which the trigger works. I can't set the waits betwen the revival time because the time is variable and it maybe lower than 9 seconds. Any idea of how can i fix this? or how can i identify the trigger with a specific player?

Collapse JASS:
function ReviveHero_BonusKillsReset takes nothing returns nothing
    call PolledWait(5.0)
    if (udg_BonusKills[iKiller] == 2) then //variable iKiller should be the player number for which the trigger is working
        call PolledWait(4.0)
    endif
    set udg_BonusKills[iKiller] = 0 //variable iKiller should be the player number for which the trigger is working
    call DestroyTrigger(GetTriggeringTrigger())
endfunction

function ReviveHero_BonusKills takes integer iKiller, unit uDead returns nothing
    local trigger t = null
    
    set udg_BonusKills[iKiller] = udg_BonusKills[iKiller] + 1
    if (udg_BonusKills[iKiller] > 2) then
        call DisplayTextToForce(udg_Players, (udg_Player_Colors[iDead] + GetPlayerName(pDead) + "|r|c00ff0000 made a TRIPLE KILL!!!|r"))
        set udg_BonusKills[iKiller] = 0
    elseif (udg_BonusKills[iKiller] == 2) then
        call DisplayTextToForce(udg_Players, (udg_Player_Colors[iDead] + GetPlayerName(pDead) + "|r|c000000ff made a DOUBLE KILL!!!|r"))
    else
        set t = CreateTrigger()
        call TriggerAddAction(t, function ReviveHero_BonusKillsReset)
        call TriggerExecute(t)
        set t = null
    endif
endfunction

function Trig_Revive_Hero_Conditions takes nothing returns boolean
    if (IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true) then
        return true
    endif
    return false
endfunction

function Trig_Revive_Hero_Actions takes nothing returns nothing
    local unit uDead = GetTriggerUnit()
    local player pDead = GetOwningPlayer(GetTriggerUnit())
    local player pKiller = GetOwningPlayer(GetKillingUnit())
    local integer iDead = GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))
    local integer iKiller = GetConvertedPlayerId(GetOwningPlayer(GetKillingUnit()))
    local integer iWait = (GetHeroLevel(uDead) / 2) * GetRandomInt(1, 3)
    local timer t = CreateTimer()
    local timerdialog w = CreateTimerDialogBJ( t, GetPlayerName(pDead) )
    local location l = GetPlayerStartLocationLoc(pDead)
    local integer iAux = udg_Team_Of_Player[iKiller]
    
    // Start Timer, Set Deaths
    call TimerStart(t, I2R(iWait), false, null)
    set udg_Deaths[iDead] = udg_Deaths[iDead] + 1
    call MultiboardSetItemValueBJ(udg_KillBoard, 3, udg_KillBoardPos[iDead], I2S(udg_Deaths[iDead]))
    
    // Find Killer
    if ((iAux == 1 or iAux == 2) and iAux != udg_Team_Of_Player[iDead]) then
        
        if (pKiller != Player(5) and pKiller != Player(11)) then
            set udg_Kills[iKiller] = udg_Kills[iKiller] + 1
            call MultiboardSetItemValueBJ( udg_KillBoard, 2, udg_KillBoardPos[iKiller], I2S(udg_Kills[iKiller]) )
            call ReviveHero_BonusKills(iKiller, uDead)
        endif
        
        call DisplayTextToForce(udg_Players, (udg_Player_Colors[iDead] + GetPlayerName(pDead) + udg_DeathBanner[GetRandomInt(1, 18)] + udg_Player_Colors[iKiller] + GetPlayerName(pKiller) + "|r"))
        
    else
        call DisplayTextToForce(udg_Players, (udg_Player_Colors[iDead] + GetPlayerName(pDead) + "|r likes to die!"))
    endif
    
    // Start Wait
    call TriggerSleepAction(1.00)
    call SetUnitPositionLoc(uDead, l)
    call PolledWait(iWait)
    
    // Revive
    call ReviveHeroLoc(uDead, l, false)
    call PanCameraToTimedLocForPlayer(pDead, l, 0.60)
    
    // Clear Leaver
    if (IsPlayerInForce(pDead, udg_Leavers) == true) then
        call RemoveUnit(uDead)
        call ForceRemovePlayerSimple(pDead, udg_Leavers)
    endif
    
    // Clean
    call DestroyTimerDialog(w)
    call DestroyTimer(t)
    call RemoveLocation(l)
    set uDead = null
    set pDead = null
    set pKiller = null
    set w = null
    set t = null
    set l = null
endfunction

//===========================================================================
function InitTrig_Revive_Hero takes nothing returns nothing
    set gg_trg_Revive_Hero = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(0), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(1), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(2), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(3), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(4), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(6), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(7), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(8), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(9), EVENT_PLAYER_UNIT_DEATH )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Revive_Hero, Player(10), EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_Revive_Hero, Condition( function Trig_Revive_Hero_Conditions ) )
    call TriggerAddAction( gg_trg_Revive_Hero, function Trig_Revive_Hero_Actions )
endfunction

Thanks!
09-07-2006, 03:37 PM#2
Vexorian
I don't really think this needs a dynamic trigger approach
09-07-2006, 03:43 PM#3
aquilla
I would just have a timer for each player and start it when the player kills a unit, and increase a variable. When the timer expires simply set multikills or whatever to 0.

I don't see any point in using a dynamic trigger in your code..

edit: damn, I write slowly today :(