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

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

Ответ
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Experience and Respawn System
Experience and Respawn System - Система воскрешения монстров и получения с них денег и опыта, также опыт распределяется между союзниками в радиусе 600, для перенесения в карту выполните все действия описанные в триггере Init, по всем вопросам обращаться ко мне.
» Init
// Инит. нашей функции
function Init_Filter takes nothing returns boolean
//проверяем выбранного юнита на враждебного нейтрала, "PLAYER_NEUTRAL_AGGRESSIVE"
    return GetOwningPlayer(GetFilterUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE)
endfunction

function Trig_Init_Actions takes nothing returns nothing
// обьявление локалок

    local group g = CreateGroup()
    local unit e
    local integer i = 0
    local boolexpr b = Condition(function Init_Filter)
//
    set udg_id = 0
    set udg_Hero[0] = CreateUnit(Player(0), 'Hblm', 0, 0, 0) // delete
    call SetHeroLevel(udg_Hero[0], 20, false) // delete
    call GroupEnumUnitsInRange(g,0,0,10000000,b) // выбираем всех нейтралов
// цикл
    loop
        set e = FirstOfGroup(g)
        set udg_Creep[i] = e // устанавливаем в переменную нашего крипа
        set udg_X[i] = GetUnitX(e) // сохраняем его Х
        set udg_Y[i] = GetUnitY(e) // сохраняем его Н
        set i = i + 1 // добавляем к его массиву 1
        call GroupRemoveUnit(g, e) // удаляем его из группы
        exitwhen e == null // условие выхода из цикла
    endloop
// конец цикла    

// создаем глобавлки цвета , например Игрок красный имеет номер массива 0 и так делее...    
    set udg_Color[0] = "|cFFFF0000"
    set udg_Color[1] = "|cFF0000FF"
    set udg_Color[2] = "|cFF00FFFF"
    set udg_Color[3] = "|cFF4B009E"
    set udg_Color[4] = "|cFFFFDC00"
    set udg_Color[5] = "|cFFFF8C00"
    set udg_Color[6] = "|cFF00D850"
    set udg_Color[7] = "|cFFFF5AFF"
    set udg_Color[8] = "|cFFA9A9A9"
    set udg_Color[9] = "|cFF7EBFFF"
    set udg_Color[10] = "|cFF005A39"
    set udg_Color[11] = "|cFF683600"
//
    set udg_id = i // Сохраняем максимальный массив в глобалку
    set udg_Hash = InitHashtable() // создаем хэш-таблицу
// удаляем группу и условие, чтобы не было утечек
    call DestroyGroup(g)
    call DestroyBoolExpr(b)
// удалили
// обнуляем локалки
    set b = null
    set g = null
    set e = null
//обнулил
call TriggerClearActions(gg_trg_Init) // чистим действия
call DestroyTrigger(gg_trg_Init) // удаляем триггер чтобы он не оставался в памяти
set gg_trg_Init = null // очищаем
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger( )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction
» GetExp
//Функция опыта, золота и дропа.
function Trig_GetExp_Conditions takes nothing returns boolean
//проверяем умешего на враждебного нейтрала, "PLAYER_NEUTRAL_AGGRESSIVE"
    return GetOwningPlayer(GetTriggerUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) 
endfunction

function TextTag takes string s, unit u, integer r, integer g, integer b, integer v, player p returns nothing
// текстаг 
    local texttag txt = CreateTextTag() // создали наш текстаг
    // дальше идет его настройка
    
    //здесь мы прячем и показываем текст только себе
    call SetTextTagVisibility(txt, false) // прячем
    if GetLocalPlayer() == p then //проверка 
        call SetTextTagVisibility(txt, true) // показываем себе
    endif
    // показали
    call SetTextTagText(txt, s, .023) //не трогаем
    call SetTextTagPosUnit(txt, u, 20) //не трогаем
    call SetTextTagColor(txt, r, g, b, v) //не трогаем
    call SetTextTagVelocity(txt, 0.05 * Cos(1.571), 0.05 * Sin(1.571)) // пускаем текстаг вверх на 90°
    call SetTextTagFadepoint(txt, .75) //не трогаем
    call SetTextTagLifespan(txt, 3) // время текстага
    call SetTextTagPermanent(txt, false) //не трогаем
endfunction

function GetExp_Filter takes nothing returns boolean
// фильтр для группы
    return IsPlayerAlly(GetOwningPlayer(GetKillingUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO)
endfunction

function CountUnitsInGroupExp takes nothing returns nothing
// функция подсчета юнитов в группе
    set bj_groupCountUnits = bj_groupCountUnits + 1
endfunction

function Trig_GetExp_Actions2 takes nothing returns nothing
// функция воскрешения:

// обьявление локалок
    local timer t = GetExpiredTimer() // берем наш таймер
    local integer id = GetHandleId(t)
    local integer i = LoadInteger(udg_Hash, id, 0) // выгружаем id  умершего юнита
//    
    set udg_Creep[i] = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), LoadInteger(udg_Hash, id, 1), udg_X[i], udg_Y[i], GetRandomReal(0, 359)) // заменяем страго на нового, со случайным поворотом "GetRandomReal(0, 359)"
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl", udg_X[i], udg_Y[i])) // создаем эффект вострешения, если он вам не нужен то либо сотрите строку либо поставьте перед "call" вот это "//"
    call FlushChildHashtable(udg_Hash, id) // чистим хэш
    call DestroyTimer(t) // удаляем таймер
    set t = null // обнуляем переменную
endfunction

function Trig_GetExp_Actions takes nothing returns nothing
// обьявление локалок и глобалок

    local unit u = GetKillingUnit()
    local unit c = GetTriggerUnit()
    local integer lvl = GetUnitLevel(c)
    local integer lvl2 = GetHeroLevel(u)
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local integer exp = lvl2 * lvl + GetRandomInt(8, 13) // устанавливаем опыт, умножаем уровень убивающего на уровень умирающего + бонус от 8 до 13 опыта
    local integer gold = lvl2 * lvl + GetRandomInt(3, 8) // устанавливаем голд, умножаем уровень убивающего на уровень умирающего + бонус от 3 до 8 золота
    local group g = CreateGroup()
    local unit e
    local boolexpr b = Condition(function GetExp_Filter)
    local player pe
    local real x = GetUnitX(c)
    local real y = GetUnitY(c)
    set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
    set bj_forceRandomCurrentPick = GetLocalPlayer()
// локалки создали...

    if IsUnitType(u, UNIT_TYPE_HERO) == false then // проверка: если добивший юнит не герой (например суммон) то мы ищем его владельца
        set u = udg_Hero[GetPlayerId(bj_groupEnumOwningPlayer)] // обновляем владельца
        set lvl2 = GetHeroLevel(u) // уровень владельца
        set exp = lvl2 * lvl + GetRandomInt(8, 13) // перещитыаем опыт
        set gold = lvl2 * lvl + GetRandomInt(3, 8) // перещитыаем голд
    endif
//    
    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 600, b) // 600 - радиус пати (можете поставить больше)
    set bj_groupCountUnits = 0
    call ForGroup(g, function CountUnitsInGroupExp) //щитаем
    set exp = exp / bj_groupCountUnits // делим опыт на все союзников
//    
    loop
        set e = FirstOfGroup(g)
        set pe = GetOwningPlayer(e)
        exitwhen e == null // условие выхода из цикла
            call AddHeroXP(e, exp, true) // даем экспу
            call TextTag("+" + I2S(exp) + " exp.", e, 200, 100, 200, 255, pe)
            if lvl < 1000 then // проверка на на босса (если монстр выше 1000 уровня то он босс, если хотите можете понизить уровень)
                call TextTag("+" + I2S(gold), c, 255, 255, 0, 255, bj_groupEnumOwningPlayer)
                call SetPlayerState(bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(bj_groupEnumOwningPlayer, PLAYER_STATE_RESOURCE_GOLD) + gold) // даем голду за моба
                if GetRandomReal(0, 100) < (lvl + 1) - GetRandomInt(lvl / 2, lvl) then // шанс на выподение предмета
                    // Цикл создания предмета
                    loop
                        set bj_lastCreatedItem = CreateItem(ChooseRandomItemEx(ITEM_TYPE_ARTIFACT, GetRandomInt(lvl / 2, lvl)), x, y) //ITEM_TYPE_ARTIFACT - тип предмета которого мы создаем
                        exitwhen bj_lastCreatedItem != null
                    endloop
                    // конец цикла
                    // дальше идет настрой самих предметов
                        call SetItemPlayer(bj_lastCreatedItem, pe, false) // владелец предмета
                        call SetItemInvulnerable(bj_lastCreatedItem, true) // неуязвимость предмета
                        call DisplayTextToPlayer(bj_forceRandomCurrentPick, 0, 0, "Игроку " + udg_Color[GetPlayerId(pe)] + GetPlayerName(pe) + "|r достался предмет " + GetItemName(bj_lastCreatedItem)) // сообщение игрокам о выподении предмета
                        call SetItemVisible(bj_lastCreatedItem, false) // прячем предмет от других игроков
                        call SaveUnitHandle(udg_Hash, GetHandleId(bj_lastCreatedItem), 0, e)
                        if bj_forceRandomCurrentPick == pe then
                            call SetItemVisible(bj_lastCreatedItem, true) // показываем предмет самому себе
                        endif
                        set bj_lastCreatedItem = null
                endif
            else
                set bj_forLoopAIndex = 0
               // если наш моб босс:
                call SetPlayerState(pe, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(pe, PLAYER_STATE_RESOURCE_GOLD) + gold / bj_groupCountUnits) // делим голду на кол-во человек в пати
                call TextTag("+" + I2S(gold / bj_groupCountUnits), c, 255, 255, 0, 255, pe) // текст голды
                set bj_lastCreatedUnit = CreateUnit(pe, 'e000', x, y, 0) // создаем сундук с предметами
                call ShowUnit(bj_lastCreatedUnit, false) //прячем его от других игроков
                if bj_forceRandomCurrentPick == pe then
                    call ShowUnit(bj_lastCreatedUnit, true) // показываем сунду самому себе
                endif
                loop // создаем предметы для сундука
                    exitwhen bj_forLoopAIndex == 6 // сколько будет предметов у сундука, в данном случае 6
                    loop
                        set bj_lastCreatedItem = CreateItem(ChooseRandomItemEx(ITEM_TYPE_ARTIFACT, GetRandomInt(lvl/2, lvl)), x, y) // создаем предмет тип Артефакт (ITEM_TYPE_ARTIFACT), со случайным уровнем 
                        exitwhen bj_lastCreatedItem != null
                    endloop
                    call SaveUnitHandle(udg_Hash, GetHandleId(bj_lastCreatedItem), 0, e) // протектем предмет, сохраняя на его хендле его владельца
                    call SetItemInvulnerable(bj_lastCreatedItem, true) // неуязвимость предмета
                    call UnitAddItem(bj_lastCreatedUnit, bj_lastCreatedItem) // даем даммику предметы
                    set bj_lastCreatedItem = null
                    set bj_forLoopAIndex = bj_forLoopAIndex + 1
                endloop
            endif
         
        call GroupRemoveUnit(g, e) // удаляем юнита из пати
    endloop
// закончился цикл с  опытом и предметами
// ищем id нашего крипа    
    set bj_forLoopAIndex = 0
    loop
        exitwhen c == udg_Creep[bj_forLoopAIndex]
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
// нашли он равен i    
// сохраняем его id и его тип 
    call SaveInteger(udg_Hash, id, 0, bj_forLoopAIndex)
    call SaveInteger(udg_Hash, id, 1, GetUnitTypeId(c))
// сохранили
    call TimerStart(t, 30 - lvl2 / 3, false, function Trig_GetExp_Actions2) // стартуем таймер с базовым временем 30 сек. и отнимаем (уровень нашего героя деленного на 3, "lvl2/3")
// дальше идет удаление проверки и удаление группы
    call DestroyGroup(g)
    call DestroyBoolExpr(b)
// удалили, теперь обнуляем все переменные
    set pe = null
    set b = null
    set g = null
    set e = null
    set t = null
    set u = null
    set c = null
// обнулили
endfunction

//===========================================================================
function InitTrig_GetExp takes nothing returns nothing
    set gg_trg_GetExp = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_GetExp, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_GetExp, Condition( function Trig_GetExp_Conditions ) )
    call TriggerAddAction( gg_trg_GetExp, function Trig_GetExp_Actions )
endfunction
» RemoveBox
//Удаление сундука

function Trig_RemoveBox_Conditions takes nothing returns boolean
// проверка на сундук
    return GetUnitTypeId(GetTriggerUnit()) == 'e000' 
endfunction

function Trig_RemoveBox_Actions takes nothing returns nothing
    call RemoveUnit(GetTriggerUnit()) // удаляем сундук
endfunction

//===========================================================================
function InitTrig_RemoveBox takes nothing returns nothing
    set gg_trg_RemoveBox = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_RemoveBox, EVENT_PLAYER_UNIT_DROP_ITEM )
    call TriggerAddCondition( gg_trg_RemoveBox, Condition( function Trig_RemoveBox_Conditions ) )
    call TriggerAddAction( gg_trg_RemoveBox, function Trig_RemoveBox_Actions )
endfunction
» ProtectItem
//Функция защиты от подбора предмета
function Trig_Protect_Item_Actions takes nothing returns nothing
// обьявление локалок
    local unit u = GetTriggerUnit()
    local unit c = LoadUnitHandle(udg_Hash, GetHandleId(GetManipulatedItem()), 0)
// 
    if u != c and c != null and GetUnitTypeId(u) != 'e000' then // проверка: подбираемый юнит ни коробка (GetUnitTypeId(u) != 'e000'), предмет не запротекчен (c != null), подбиратель не его владелец (u != c).
        call UnitRemoveItem(u,GetManipulatedItem()) // выбрасываем предмет
        if GetLocalPlayer() == GetOwningPlayer(u) then // пишем подбирателю что это не его предмет
            call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Этот предмет принадлежит игроку " + udg_Color[GetPlayerId(GetOwningPlayer(c))] + GetPlayerName(GetOwningPlayer(c))) // текст
        endif
    endif
    //обнуляем локалки
    set u = null
    set c = null
    //
endfunction

//===========================================================================
function InitTrig_Protect_Item takes nothing returns nothing
    set gg_trg_Protect_Item = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Protect_Item, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddAction( gg_trg_Protect_Item, function Trig_Protect_Item_Actions )
endfunction
» AddCreepToSystem
function Trig_AddCreepToSystem_Conditions takes nothing returns boolean
//проверяем входящего на нейтрала
    return GetOwningPlayer(GetTriggerUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE)
endfunction

function Trig_AddCreepToSystem_Actions takes nothing returns nothing
// обьявление локалок
    local integer i = 0
    local unit u = GetTriggerUnit()
    local boolean b = false
//

    loop // цикл, проверка что это не воскрешаемый нейтрал
        if udg_Creep[i] == u then //не трогаем
            set b = true //не трогаем
        endif //не трогаем
        exitwhen udg_Creep[i] == u or i == 6140 //не трогаем
        set i = i + 1 //не трогаем
    endloop //не трогаем
    if b == false then // если его раньше не было на карте
        set udg_id = udg_id + 1 // даем егому массив
        set udg_Creep[udg_id] = u //и сохраняем в глобалку
    endif //не трогаем
    //обнуляем
    set u = null
    //
endfunction

//===========================================================================
function InitTrig_AddCreepToSystem takes nothing returns nothing
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, GetWorldBounds())
    set gg_trg_AddCreepToSystem = CreateTrigger()
    call TriggerRegisterEnterRegion(gg_trg_AddCreepToSystem, rectRegion, null)
    call TriggerAddCondition(gg_trg_AddCreepToSystem, Condition( function Trig_AddCreepToSystem_Conditions ) )
    call TriggerAddAction(gg_trg_AddCreepToSystem, function Trig_AddCreepToSystem_Actions )
endfunction
Делал для себя, выложил сюда. ну теперь уже скоростной велик :)
Прикрепленные файлы
Тип файла: w3x Respawn System.w3x (34.1 Кбайт, 21 просмотров )

Отредактировано Vadik29, 21.08.2012 в 17:51.
Старый 17.08.2012, 17:20
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Vadik29, ну хотябыл не на гуи), относительно неплохо если без JNGP для новичков.
Старый 17.08.2012, 17:48
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
quq_CCCP, Думаю еще добавить создание рандомного идтема в зависимости от уровня)

Отредактировано Vadik29, 17.08.2012 в 18:08.
Старый 17.08.2012, 17:55
Doc

offline
Опыт: 63,163
Активность:
Код нормальный. Но мало отступов.
Ну и да, велосипед.
Старый 17.08.2012, 17:59
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Vadik29, юзай Script Language Aligner чтобы скрипт выглядел по человечески, ну я с полгода назад сделал такой же велосипед, но закачек просто уйма)
Старый 17.08.2012, 18:05
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
quq_CCCP, Да я сейчас не дома просто, его тут нету )
Vadik29 добавил:
Как на счет такого варианта ?
Создает предмет для случайного участника группы.
» Вот
function Trig_GetExp_Conditions takes nothing returns boolean
    return GetOwningPlayer(GetTriggerUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE)
endfunction

function TextTag takes string s, unit u, integer r, integer g, integer b, integer v, player p returns nothing
    local force f = CreateForce()
    local texttag txt = CreateTextTag()
    call ForceAddPlayer(f, p)
    call SetTextTagVisibility(txt, false)
    if (IsPlayerInForce(GetLocalPlayer(), f)) then
        call SetTextTagVisibility(txt, true)
    endif
    call SetTextTagText(txt, s, .023)
    call SetTextTagPosUnit(txt, u, 20)
    call SetTextTagColor(txt, r, g, b, v)
    call SetTextTagVelocity(txt, 0.05 * Cos(90 * bj_DEGTORAD), 0.05 * Sin(90 * bj_DEGTORAD))
    call SetTextTagFadepoint(txt, .75)
    call SetTextTagLifespan(txt, 3)
    call SetTextTagPermanent(txt, false)
    call DestroyForce(f)
    set f = null
endfunction

function GetExp_Filter takes nothing returns boolean
    return IsPlayerAlly(GetOwningPlayer(GetKillingUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405
endfunction

function CountUnitsInGroupExp takes nothing returns nothing
    if IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) then
        set bj_groupCountUnits = bj_groupCountUnits + 1
    endif
endfunction

function Trig_GetExp_Actions2 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local integer i = LoadInteger(udg_Hash, id, 0)
    local real r = GetRandomReal(0, 150)
    local real h = GetRandomReal(0, 359)
    set udg_Creep[i] = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), GetUnitTypeId(udg_Creep[i]), udg_X[i], udg_Y[i], GetRandomReal(0, 359))
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl", udg_X[i], udg_Y[i]))
    call FlushChildHashtable(udg_Hash, id)
    call DestroyTimer(t)
    set t = null
endfunction

function Trig_GetExp_Actions takes nothing returns nothing
    local unit u = GetKillingUnit()
    local unit c = GetTriggerUnit()
    local integer lvl = GetUnitLevel(c)
    local integer lvl2 = GetHeroLevel(u)
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local integer exp = lvl2 * lvl + GetRandomInt(8, 13)
    local integer gold = lvl2 * lvl + GetRandomInt(3, 8)
    local player p = GetOwningPlayer(u)
    local integer i = 0
    local group g = CreateGroup()
    local unit e
    local boolexpr b = Condition(function GetExp_Filter)
    local item it
    local player pe
    local force f = CreateForce()
    if IsUnitType(u, UNIT_TYPE_HERO) == false then
        set u = udg_Hero[GetPlayerId(p)]
        set lvl2 = GetHeroLevel(udg_Hero[GetPlayerId(p)])
        set exp = lvl2 * lvl + GetRandomInt(8, 13)
        set gold = lvl2 * lvl + GetRandomInt(3, 8)
    endif
    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 600, b)
    set bj_groupCountUnits = 0
    call ForGroup(g, function CountUnitsInGroupExp)
    set exp = exp / bj_groupCountUnits
    loop
        set e = FirstOfGroup(g)
        set pe = GetOwningPlayer(e)
        if IsUnitAlly(e, p) and IsUnitType(e, UNIT_TYPE_HERO) then
            call AddHeroXP(e, exp, true)
            call TextTag("+" + I2S(exp) + " exp.", e, 200, 100, 200, 255, pe)
            if GetRandomReal(0, 100) < lvl + 5 then
                call ForceAddPlayer(f, pe)
                set it = CreateItem(ChooseRandomItemEx(ITEM_TYPE_PERMANENT, GetRandomInt(lvl / 2, lvl)), GetUnitX(c), GetUnitY(c))
                call SetItemPlayer(it, pe, false)
                call SetItemInvulnerable(it, true)
                call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Игроку " + GetPlayerName(pe) + " достался предмет " + GetItemName(it))
                call SetItemVisible(it, false)
                if (IsPlayerInForce(GetLocalPlayer(), f)) then
                    call SetItemVisible(it, true)
                endif
            endif
        endif
        call GroupRemoveUnit(g, e)
        exitwhen e == null
    endloop
    call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + gold)
    loop
        exitwhen c == udg_Creep[i]
        set i = i + 1
    endloop
    call SaveInteger(udg_Hash, id, 0, i)
    call TimerStart(t, 10, false, function Trig_GetExp_Actions2)
    call TextTag("+" + I2S(gold), c, 255, 255, 0, 255, p)
    call DestroyGroup(g)
    call DestroyBoolExpr(b)
    call DestroyForce(f)
    set f = null
    set pe = null
    set b = null
    set g = null
    set e = null
    set t = null
    set u = null
    set c = null
    set p = null
endfunction

//===========================================================================
function InitTrig_GetExp takes nothing returns nothing
    set gg_trg_GetExp = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_GetExp, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_GetExp, Condition( function Trig_GetExp_Conditions ) )
    call TriggerAddAction( gg_trg_GetExp, function Trig_GetExp_Actions )
endfunction


//Code indented using The_Witcher's Script language Aligner
//Download the newest version and report bugs at www.hiveworkshop.com
Старый 17.08.2012, 18:41
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
Можно было и с GUI сделать...
Старый 17.08.2012, 18:53
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Bornikkeny:
Можно было и с GUI сделать...
ага и с вирусом
Vadik29,
это
local force f = CreateForce()
local texttag txt=CreateTextTag() 
call ForceAddPlayer(f,p)
call SetTextTagVisibility(txt,false)
if (IsPlayerInForce(GetLocalPlayer(),f)) then
    call SetTextTagVisibility(txt,true)
endif
можно заменить на это
call SetTextTagVisibility(txt,false)
if GetLocalPlayer() == p then
call SetTextTagVisibility(txt,true)
endif
Старый 17.08.2012, 19:05
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
16GB, не, ну вирусы это одно, но получается что такие наработки вы делаете только для самих себя и вам подобным... Сами подумайте.
Старый 17.08.2012, 19:08
Doc

offline
Опыт: 63,163
Активность:
Bornikkeny, а для тебя что-то ничего не хочется сделать. Нужно на гуи - сделай.
Старый 17.08.2012, 19:23
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
Doc, получается что вы делайте сами себе материалы, которые у вас и так уже есть! OMG...
Старый 17.08.2012, 19:28
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
16GB, Точно, сейчас исправлю.
Vadik29 добавил:
» Вот
function Trig_GetExp_Conditions takes nothing returns boolean
    return GetOwningPlayer(GetTriggerUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE)
endfunction

function TextTag takes string s, unit u, integer r, integer g, integer b, integer v, player p returns nothing
    local texttag txt = CreateTextTag()
    call SetTextTagVisibility(txt, false)
    if GetLocalPlayer() == p then
        call SetTextTagVisibility(txt, true)
    endif
    call SetTextTagText(txt, s, .023)
    call SetTextTagPosUnit(txt, u, 20)
    call SetTextTagColor(txt, r, g, b, v)
    call SetTextTagVelocity(txt, 0.05 * Cos(90 * bj_DEGTORAD), 0.05 * Sin(90 * bj_DEGTORAD))
    call SetTextTagFadepoint(txt, .75)
    call SetTextTagLifespan(txt, 3)
    call SetTextTagPermanent(txt, false)
endfunction

function GetExp_Filter takes nothing returns boolean
    return IsPlayerAlly(GetOwningPlayer(GetKillingUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405
endfunction

function CountUnitsInGroupExp takes nothing returns nothing
    if IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) then
        set bj_groupCountUnits = bj_groupCountUnits + 1
    endif
endfunction

function Trig_GetExp_Actions2 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local integer i = LoadInteger(udg_Hash, id, 0)
    local real r = GetRandomReal(0, 150)
    local real h = GetRandomReal(0, 359)
    set udg_Creep[i] = CreateUnit(Player(PLAYER_NEUTRAL_AGGRESSIVE), GetUnitTypeId(udg_Creep[i]), udg_X[i], udg_Y[i], GetRandomReal(0, 359))
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl", udg_X[i], udg_Y[i]))
    call FlushChildHashtable(udg_Hash, id)
    call DestroyTimer(t)
    set t = null
endfunction

function Trig_GetExp_Actions takes nothing returns nothing
    local unit u = GetKillingUnit()
    local unit c = GetTriggerUnit()
    local integer lvl = GetUnitLevel(c)
    local integer lvl2 = GetHeroLevel(u)
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local integer exp = lvl2 * lvl + GetRandomInt(8, 13)
    local integer gold = lvl2 * lvl + GetRandomInt(3, 8)
    local player p = GetOwningPlayer(u)
    local integer i = 0
    local group g = CreateGroup()
    local unit e
    local boolexpr b = Condition(function GetExp_Filter)
    local item it
    local player pe
    if IsUnitType(u, UNIT_TYPE_HERO) == false then
        set u = udg_Hero[GetPlayerId(p)]
        set lvl2 = GetHeroLevel(udg_Hero[GetPlayerId(p)])
        set exp = lvl2 * lvl + GetRandomInt(8, 13)
        set gold = lvl2 * lvl + GetRandomInt(3, 8)
    endif
    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 600, b)
    set bj_groupCountUnits = 0
    call ForGroup(g, function CountUnitsInGroupExp)
    set exp = exp / bj_groupCountUnits
    loop
        set e = FirstOfGroup(g)
        set pe = GetOwningPlayer(e)
        if IsUnitAlly(e, p) and IsUnitType(e, UNIT_TYPE_HERO) then
            call AddHeroXP(e, exp, true)
            call TextTag("+" + I2S(exp) + " exp.", e, 200, 100, 200, 255, pe)
            if GetRandomReal(0, 100) < lvl + 5 then
                set it = CreateItem(ChooseRandomItemEx(ITEM_TYPE_PERMANENT, GetRandomInt(lvl / 2, lvl)), GetUnitX(c), GetUnitY(c))
                call SetItemPlayer(it, pe, false)
                call SetItemInvulnerable(it, true)
                call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Игроку " + GetPlayerName(pe) + " достался предмет " + GetItemName(it))
                call SetItemVisible(it, false)
                if GetLocalPlayer() == pe then
                    call SetItemVisible(it, true)
                endif
            endif
        endif
        call GroupRemoveUnit(g, e)
        exitwhen e == null
    endloop
    call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD) + gold)
    loop
        exitwhen c == udg_Creep[i]
        set i = i + 1
    endloop
    call SaveInteger(udg_Hash, id, 0, i)
    call TimerStart(t, 10, false, function Trig_GetExp_Actions2)
    call TextTag("+" + I2S(gold), c, 255, 255, 0, 255, p)
    call DestroyGroup(g)
    call DestroyBoolExpr(b)
    set pe = null
    set b = null
    set g = null
    set e = null
    set t = null
    set u = null
    set c = null
    set p = null
endfunction

//===========================================================================
function InitTrig_GetExp takes nothing returns nothing
    set gg_trg_GetExp = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_GetExp, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_GetExp, Condition( function Trig_GetExp_Conditions ) )
    call TriggerAddAction( gg_trg_GetExp, function Trig_GetExp_Actions )
endfunction

Отредактировано Vadik29, 17.08.2012 в 21:14.
Старый 17.08.2012, 19:53
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Bornikkeny:
Doc, получается что вы делайте сами себе материалы, которые у вас и так уже есть! OMG...
Мы делаем исключительно для себя. Скидываем можно сказать просто так, может кому пригодится.
Старый 17.08.2012, 20:11
NixEon
beeg kok
offline
Опыт: 8,143
Активность:
Неплохой код, но отступов нехватает, что ухудшает читабельность. Гуд. А товарищам, ноющим о ГУИ, стоит попытаться разобрать сей код.
Старый 17.08.2012, 20:20
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
Faion, тогда это уже действительно уныло. Надеюсь этот ресурс выйдет из "такого" положения...
Старый 17.08.2012, 20:26
SID69
DET
offline
Опыт: 19,693
Активность:
Парень изобритает новую модель велосипеда, по каеству такую же как и его предшественники. =_=
Старый 17.08.2012, 20:40
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Faion, Полностью согласен.
Bornikkeny, Ну и кэп, как бы намекает...
Делал для себя, выложил сюда.
Vadik29 добавил:
MMIceStar, Если у тебя есть предложения по оптимизации кода без Джнгп, то очень хочется их услышать.

Отредактировано Vadik29, 17.08.2012 в 21:28.
Старый 17.08.2012, 21:20
SID69
DET
offline
Опыт: 19,693
Активность:
Vadik29, что такое Оптимизация о_О?
Старый 17.08.2012, 21:25
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Старый 17.08.2012, 21:29
Arti

offline
Опыт: 11,196
Активность:
оптимизации кода это его внешний вид и читабельность, а не то что ты скинул )
Старый 17.08.2012, 23:32
Ответ

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

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

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

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



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