XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Armageddon
Ацкий сосис
offline
Опыт: 888
Активность:
Система ассистирования
Выводит сообщение, когда убийству вражеского героя помогали союзники. Есть у кого такая?
Старый 20.02.2009, 00:54
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Armageddon, у фрога, и авторм АоМ. Без проблем делается простой регистрацией в переменную Attacked Unit
Старый 20.02.2009, 01:32
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Лично я ловил урон, заносил в массивчег.... Если при получении урона здоровье полное - обнуляем массив... При смерти извлекаем данные относительно стучавших ему по голове, можно, например, сделать распределение золота в зависимости от нанесённого урона....
Тут также можно ловить касты по конкретному герою, т..е кинул замедление и без единого удара тебе бы засчитало ассист...
Старый 20.02.2009, 14:07
Armageddon
Ацкий сосис
offline
Опыт: 888
Активность:
Код:
library AssistanceSystem initializer Init_AssistanceSystem

globals
    // Настройки
    private constant real Time = 10. // Время от последнего удара, после которого не засчитывается
    private constant integer Award = 200 // Бонус за помощь
    private constant boolean Split = true // Делить ли награду
    private constant string Msg1 = "Принимал участие " // Фраза кто помогал
    private constant string Msg2 = " золота!" // Фраза полного выигрыша
    private constant string Msg3 = " часть золота!" // Фраза, если выигрыш делится
    private constant string GoldColor = "|c00FFDE00" // Цвет золота
    
//=====Ничё не менять!=====\\
    private unit array Targets
    private timer array Timers
    private timer array T
    private trigger Trigger1 = CreateTrigger() 
    private trigger Trigger2 = CreateTrigger()
    private group Heroes = CreateGroup()
    private integer Skip
    private integer Total
    
    public integer array Assists
endglobals
//*************************************************************************

function GetPlayerNameColored takes player id returns string
    local playercolor col = GetPlayerColor(id)
    local string r = GetPlayerName(id)
    
    if col == PLAYER_COLOR_RED then
        set r="|cffff0000"+r+"|r"
    elseif col == PLAYER_COLOR_BLUE then
        set r="|cff0000ff"+r+"|r"
    elseif col == PLAYER_COLOR_CYAN then
        set r="|cff93ffc9"+r+"|r"
    elseif col == PLAYER_COLOR_PURPLE then
        set r="|cff400080"+r+"|r"
    elseif col == PLAYER_COLOR_YELLOW then
        set r="|cffffff00"+r+"|r"
    elseif col == PLAYER_COLOR_ORANGE then
        set r="|cffff8000"+r+"|r"
    elseif col == PLAYER_COLOR_GREEN then
        set r="|cff00c400"+r+"|r"
    elseif col == PLAYER_COLOR_PINK then
        set r="|cffff80c0"+r+"|r"
    elseif col == PLAYER_COLOR_LIGHT_GRAY then
        set r="|cff808080"+r+"|r"
    elseif col == PLAYER_COLOR_LIGHT_BLUE then
        set r="|cffc1c1ff"+r+"|r"
    elseif col == PLAYER_COLOR_AQUA then
        set r="|cff5e5e2f"+r+"|r"
    elseif col == PLAYER_COLOR_BROWN then
        set r="|cff004000"+r+"|r"
    else
        set r="|cff000000"+r+"|r"
    endif
    
    return r
endfunction

function GetPlayerColorS takes player id returns string
    local playercolor col = GetPlayerColor(id)
    local string r = ""
    
    if col == PLAYER_COLOR_RED then
        set r="|cffff0000"
    elseif col == PLAYER_COLOR_BLUE then
        set r="|cff0000ff"
    elseif col == PLAYER_COLOR_CYAN then
        set r="|cff93ffc9"
    elseif col == PLAYER_COLOR_PURPLE then
        set r="|cff400080"
    elseif col == PLAYER_COLOR_YELLOW then
        set r="|cffffff00"
    elseif col == PLAYER_COLOR_ORANGE then
        set r="|cffff8000"
    elseif col == PLAYER_COLOR_GREEN then
        set r="|cff00c400"
    elseif col == PLAYER_COLOR_PINK then
        set r="|cffff80c0"
    elseif col == PLAYER_COLOR_LIGHT_GRAY then
        set r="|cff808080"
    elseif col == PLAYER_COLOR_LIGHT_BLUE then
        set r="|cffc1c1ff"
    elseif col == PLAYER_COLOR_AQUA then
        set r="|cff5e5e2f"
    elseif col == PLAYER_COLOR_BROWN then
        set r="|cff004000"
    else
        set r="|cff000000"
    endif
    
    return r
endfunction

private function Reset takes nothing returns nothing
    local integer i = 0
    local timer t = GetExpiredTimer()
    
    loop
        exitwhen Timers[i]==t
        
        if i>Total then
            call BJDebugMsg("AS Error: |cffff0000Таймер не найден.")
            set t = null
            return
        endif
        set i = i + 1
    endloop
    
    call PauseTimer(t)
    set t = null
    set Timers[i] = null
    set Targets[i] = null
endfunction

private function Timer takes nothing returns nothing
    local unit dam = GetEventDamageSource()
    local player pdam = GetOwningPlayer(dam)
    local unit targ = GetTriggerUnit()
    local player ptarg = GetOwningPlayer(targ)
    local integer i = GetPlayerId(ptarg)+(Skip*GetPlayerId(pdam))
    
    if not IsUnitEnemy(dam,ptarg) or pdam==ptarg or GetEventDamage()<.1 or IsUnitType(dam,UNIT_TYPE_HERO)  then
        set targ = null
        set dam = null
        return
    endif
    
    if Timers[i]==null then
        if T[i]==null then
            set T[i] = CreateTimer()
        endif
        set Timers[i] = T[i]
        set Targets[i] = targ
        call TimerStart(Timers[i],Time,false,function Reset)
    else
        call PauseTimer(Timers[i])
        call TimerStart(Timers[i],Time,false,function Reset)
    endif
    
    set dam = null
    set targ = null
endfunction

private function Death takes nothing returns nothing
    local unit killer = GetKillingUnit()
    local player pkill = GetOwningPlayer(killer)
    local unit dieer = GetTriggerUnit()
    local integer i = GetPlayerId(GetOwningPlayer(dieer))
    local integer id = i
    local player array pa
    local integer count = 0
    local integer playid
    local string msg 
    local string endmsg = Msg2
    local integer gold = Award
    
    local integer killergold = GetHeroLevel(dieer)*GetRandomInt(8,12) + GetRandomInt(180,260)
    
    local string mess = GetPlayerNameColored(pkill) + " убил " + GetPlayerNameColored(Player(i)) + ". +" + GoldColor + I2S(killergold)+"|r золота!"
    
    loop
        exitwhen i>Total
        if Targets[i]==dieer then
            if pkill!=Player((i-id)/Skip) then
                set count = count + 1
                set playid = (i-id)/Skip
                set pa[count] = Player(playid)
                set Assists[playid] = Assists[playid] + 1
            endif
            set Targets[i] = null
            call PauseTimer(Timers[i])
            set Timers[i] = null
        endif
        
        set i = i + Skip
    endloop
    
    if count==0 then
        set killer = null
        set dieer = null
        return
    elseif count>1 then
        set endmsg = Msg3
    endif
    if Split then
        set gold = Award/count
    endif
    
    set i = 1
    set msg = Msg1 + GetPlayerNameColored(pa[i])
        set udg_Assists[GetPlayerId(pa[i])+1] = udg_Assists[GetPlayerId(pa[i])+1] + 1
        //set mess = I2S(GetPlayerId(pa[i])+1)
        //call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,mess)
        //call ConditionalTriggerExecute( gg_trg_UpdateMultiBoard )
    //call MultiboardSetItemValueBJ( GetLastCreatedMultiboard(), 6, udg_Players[pa[i]], ( "   " + I2S(udg_Assists[GetForLoopIndexA()]) ) )
    loop
        exitwhen i>count
        call SetPlayerState(pa[i], ConvertPlayerState(1), GetPlayerState(pa[i], ConvertPlayerState(1)) + gold)
        set i = i + 1
    endloop
    set i = 2
    set count = count - 1
    loop
        exitwhen i>count
        set msg = msg + ", " + GetPlayerNameColored(pa[i])
        set udg_Assists[GetPlayerId(pa[i])+1] = udg_Assists[GetPlayerId(pa[i])+1] + 1
        set i = i + 1        
    endloop
    if count>0 then
        set msg = msg + " и " + GetPlayerNameColored(pa[i])
        set udg_Assists[GetPlayerId(pa[i])+1] = udg_Assists[GetPlayerId(pa[i])+1] + 1
        //set mess = I2S(GetPlayerId(pa[i])+1)
        //call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,mess)
    endif
    set msg = msg + ".  +"+GoldColor+I2S(gold)+"|r"+endmsg 
    call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,mess)
    call DisplayTextToForce(bj_FORCE_ALL_PLAYERS,msg)
    call ConditionalTriggerExecute( gg_trg_UpdateMultiBoard )
    
    set killer = null
    set dieer = null
endfunction

// Start the system for the unit
public function Register takes unit u returns nothing
    if IsUnitInGroup(u,Heroes) then
        call BJDebugMsg("AS Error: |cffff0000"+GetUnitName(u)+"Уже внесён в систему. Проваливай.")
        return
    endif
    call GroupAddUnit(Heroes,u)
    call TriggerRegisterUnitEvent(Trigger1, u, EVENT_UNIT_DAMAGED)
    call TriggerRegisterUnitEvent(Trigger2, u, EVENT_UNIT_DEATH)
endfunction

private function Init_AssistanceSystem takes nothing returns nothing
    local integer i = GetPlayers()-1
    
    call TriggerAddAction( Trigger1, function Timer)
    call TriggerAddAction( Trigger2, function Death)
    
    set Skip = i+1
    set Total = (Skip*i)+i-1
endfunction

endlibrary


Собственно вот эта библиотека. Но у меня баг в том, что если героя убьют, а после этот умерший герой надумает отомстить, то система проигнорирует его и не засчитает. Не могу найти багу.
Старый 20.02.2009, 19:54
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 08:27.