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

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

Ответ
 
Ty3uK

offline
Опыт: 2,469
Активность:
Наработки для гуишников
Карта с наработками для легкого использования любым начинающим пользователем. Пояснения ниже.

Возможности

  • Движение юнитов
  • Подбрасывание юнитов
  • Даммикасты всех типов
  • Создание эффектов на время
  • Нанесение урона группе юнитов

Установка в карту


Для установки функции в карту, вам нужно скопировать ее из нестандартного кода карты (подробный список "что и куда" для каждой функции смотрим ниже), создать в своей карте переменную типа "хэштаблица" ("Hashtable") с названием Hashtable и инициализировать ее в триггере инициализации карты:
Код:
set udg_Hashtable = InitHashtable()


Что и куда копировать, чтобы "робило и пахало"

  • Движение юнита на расстояние - копируем MoveDummy_Timer, MoveDummy
  • Движение юнита в точку каста - копируем GetDistanceBetweenCoords, MoveDummy_Timer, MoveDummyToTarget
  • Подбрасывание юнита на расстояние - копируем TossUnit_Timer, TossUnitToTarget
  • Подбрасывание юнита в точку каста - копируем GetDistanceBetweenCoords, TossUnit_Timer, TossUnitToTarget
  • Даммикаст на цель - копируем DummycastToTarget
  • Даммикаст без цели - копируем DummycastNoTarget
  • Даммикаст в точку - копируем DummycastToPoint
  • Добавить эффект на юнита на время - копируем DestroyTimedEffect, AddTimedEffectToUnit
  • Добавить эффект на в точку на время - копируем DestroyTimedEffect, AddTimedEffectToPoint
  • Нанести урон в области - копируем DamageGroupOfUnit

Как же вызывать эти фичи


Вызываются эти функции через Личный сценарий (читай, Custom script). Как и куда:
Код:
call MoveDummy(кастер, юнит которого будем двигать, расстояние, скорость, удалять ли юнита в конце движения)

call MoveDummyToTarget(кастер, юнит которого будем двигать, скорость, удалять ли юнита в конце движения)

call TossUnit(юнит, расстояние, "эффект\\который\\создадим\\при\\приземлении")

call TossUnitToTarget(юнит, "эффект\\который\\создадим\\при\\приземлении")

call DummycastToTarget(кастер, равкод юнита, равкод способности, уровень способности, юнит-цель, "ид приказа")

call DummycastNoTarget(кастер, равкод юнита, равкод способности, уровень способности, "ид приказа")

call DummycastToPoint(кастер, равкод юнита, равкод способности, уровень способности, точка, "ид приказа")

call AddTimedEffectToUnit(юнит, "эффект", "точка прикрепления", время)

call AddTimedEffectToPoint(точка, "эффект", время)

call DamageGroupOfUnit(кастер, точка набора юнитов, радиус, урон, наносить ли урон зданиям, наносить ли урон иммунным к магии, наносить ли урон себе и союзникам)


Если что-то не понятно, то примеры применения есть в карте

Немного кода для тех, кто поймет


» Код для шаряших
Код:
function GetDistanceBetweenCoords takes real x1, real x2, real y1, real y2 returns real
    return SquareRoot((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
endfunction

function MoveDummy_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer hid = GetHandleId(t)
    local unit dummy = LoadUnitHandle(udg_Hashtable, hid, 0)
    local real angle = LoadReal(udg_Hashtable, hid, 1)
    local real distance = LoadReal(udg_Hashtable, hid, 2)
    local real speed = LoadReal(udg_Hashtable, hid, 3)
    local real d = LoadReal(udg_Hashtable, hid, 4)
    local real x = GetWidgetX(dummy) + speed * Cos(angle)
    local real y = GetWidgetY(dummy) + speed * Sin(angle)
    if d >= distance then
        if LoadBoolean(udg_Hashtable, hid, 5) then
            call RemoveUnit(dummy)
        else
            call PauseUnit(dummy, false)
        endif
        call FlushChildHashtable(udg_Hashtable, hid)
        call PauseTimer(t)
        call DestroyTimer(t)
    else
        call SetUnitPosition(dummy, x, y)
        call SaveReal(udg_Hashtable, hid, 4, d + speed)
    endif
    set dummy = null
    set t = null
endfunction

function MoveDummy takes unit caster, unit dummy, real distance, real speed, boolean remove returns nothing
    local timer t = CreateTimer()
    local integer hid = GetHandleId(t)
    local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster))
    call SaveAgentHandle(udg_Hashtable, hid, 0, dummy)
    call SaveReal(udg_Hashtable, hid, 1, Atan2(GetSpellTargetY()-GetWidgetY(caster), GetSpellTargetX()-GetWidgetX(caster)))
    call SaveReal(udg_Hashtable, hid, 2, distance)
    call SaveReal(udg_Hashtable, hid, 3, speed)
    call SaveBoolean(udg_Hashtable, hid, 5, remove)
    call PauseUnit(dummy, true)
    call TimerStart(t, .04, true, function MoveDummy_Timer)
    set t = null
endfunction

function MoveDummyToTarget takes unit caster, unit dummy, real speed, boolean remove returns nothing
    local timer t = CreateTimer()
    local integer hid = GetHandleId(t)
    local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster))
    call SaveAgentHandle(udg_Hashtable, hid, 0, dummy)
    call SaveReal(udg_Hashtable, hid, 1, angle)
    call SaveReal(udg_Hashtable, hid, 2, GetDistanceBetweenCoords(GetSpellTargetX(), GetWidgetX(caster), GetSpellTargetY(), GetWidgetY(caster)))
    call SaveReal(udg_Hashtable, hid, 3, speed)
    call SaveBoolean(udg_Hashtable, hid, 5, remove)
    call PauseUnit(dummy, true)
    call TimerStart(t, .04, true, function MoveDummy_Timer)
    set t = null
endfunction

function TossUnit_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer hid = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_Hashtable, hid, 0)
    local real angle = LoadReal(udg_Hashtable, hid, 1)
    local real distance = LoadReal(udg_Hashtable, hid, 2)
    local real d = LoadReal(udg_Hashtable, hid, 3)
    local real z = LoadReal(udg_Hashtable, hid, 5)
    local real x = GetWidgetX(u)
    local real y = GetWidgetY(u) 
    if d <= distance / 2  then
        set x = x + 10. * Cos(angle)
        set y = y + 10. * Sin(angle)
        set z = z + 25.
        call SetUnitPosition(u, x, y)
        call SetUnitFlyHeight(u, z, 0.)
    else
        set x = x + 10. * Cos(angle)
        set y = y + 10. * Sin(angle)
        set z = z - 25.
        call SetUnitPosition(u, x, y)
        call SetUnitFlyHeight(u, z, 0.)
    endif
    call SaveReal(udg_Hashtable, hid, 3, d + 10.)
    call SaveReal(udg_Hashtable, hid, 5, z)
    if z <= 0. then
        if HaveSavedString(udg_Hashtable, hid, 6) then
            call DestroyEffect(AddSpecialEffect(LoadStr(udg_Hashtable, hid, 6), x, y))
        endif
        call PauseTimer(t)
        call DestroyTimer(t)
        call PauseUnit(u, false)
        call FlushChildHashtable(udg_Hashtable, hid)
    endif
    set u = null
    set t = null
endfunction

function TossUnit takes unit u, real distance, string eff returns nothing
    local timer t = CreateTimer()
    local integer hid = GetHandleId(t)
    local real angle = Atan2(GetSpellTargetY() - GetWidgetY(u), GetSpellTargetX() - GetWidgetX(u))
    call SaveAgentHandle(udg_Hashtable, hid, 0, u)
    call SaveReal(udg_Hashtable, hid, 1, angle)
    call SaveReal(udg_Hashtable, hid, 2, distance)
    call SaveReal(udg_Hashtable, hid, 3, 10.)
    call SaveStr(udg_Hashtable, hid, 6, eff)
    if UnitAddAbility(u, 'Amrf') then
        call UnitRemoveAbility(u, 'Amrf')
    endif
    call PauseUnit(u, true)
    call TimerStart(t, .01, true, function TossUnit_Timer)
    set t = null
endfunction

function TossUnitToTarget takes unit u, string eff returns nothing
    local timer t = CreateTimer()
    local integer hid = GetHandleId(t)
    call SaveAgentHandle(udg_Hashtable, hid, 0, u)
    call SaveReal(udg_Hashtable, hid, 1, Atan2(GetSpellTargetY() - GetWidgetY(u), GetSpellTargetX() - GetWidgetX(u)))
    call SaveReal(udg_Hashtable, hid, 2, GetDistanceBetweenCoords(GetSpellTargetX(), GetWidgetX(u), GetSpellTargetY(), GetWidgetY(u)))
    call SaveReal(udg_Hashtable, hid, 3, 10.)
    call SaveStr(udg_Hashtable, hid, 6, eff)
    if UnitAddAbility(u, 'Amrf') then
        call UnitRemoveAbility(u, 'Amrf')
    endif
    call PauseUnit(u, true)
    call TimerStart(t, .01, true, function TossUnit_Timer)
    set t = null
endfunction

function DummycastToTarget takes unit caster, integer utype, integer atype, integer lvl, unit target, string order returns nothing
    local unit dummy = CreateUnit(GetOwningPlayer(caster), utype, GetWidgetX(caster), GetWidgetY(caster), 0.)
    call UnitAddAbility(dummy, atype)
    call IssueTargetOrderById(dummy, OrderId(order), target)
    call UnitApplyTimedLife(dummy, 'BTLF', .76)
    set dummy = null
endfunction

function DummycastNoTarget takes unit caster, integer utype, integer atype, integer lvl, string order returns nothing
    local unit dummy = CreateUnit(GetOwningPlayer(caster), utype, GetWidgetX(caster), GetWidgetY(caster), 0.)
    call UnitAddAbility(dummy, atype)
    call IssueImmediateOrderById(dummy, OrderId(order))
    call UnitApplyTimedLife(dummy, 'BTLF', .76)
    set dummy = null
endfunction

function DummycastToPoint takes unit caster, integer utype, integer atype, integer lvl, location loc, string order returns nothing
    local unit dummy = CreateUnit(GetOwningPlayer(caster), utype, GetWidgetX(caster), GetWidgetY(caster), 0.)
    call UnitAddAbility(dummy, atype)
    call IssuePointOrderById(dummy, OrderId(order), GetLocationX(loc), GetLocationY(loc))
    call UnitApplyTimedLife(dummy, 'BTLF', .76)
    set dummy = null
endfunction

function DestroyTimedEffect takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer hid = GetHandleId(t)
    call DestroyEffect(LoadEffectHandle(udg_Hashtable, hid, 0))
    call FlushChildHashtable(udg_Hashtable, hid)
    call DestroyTimer(t)
    set t = null
endfunction

function AddTimedEffectToUnit takes unit u, string e, string a, real time returns nothing
    local timer t = CreateTimer()
    local integer hid = GetHandleId(t)
    call SaveAgentHandle(udg_Hashtable, hid, 0, AddSpecialEffectTarget(e, u, a))
    call TimerStart(t, time, false, function DestroyTimedEffect)
    set t = null
endfunction

function AddTimedEffectToPoint takes location p, string e, real time returns nothing
    local timer t = CreateTimer()
    local integer hid = GetHandleId(t)
    local real x = GetLocationX(p)
    local real y = GetLocationY(p)
    call SaveAgentHandle(udg_Hashtable, hid, 0, AddSpecialEffect(e, x, y))
    call TimerStart(t, time, false, function DestroyTimedEffect)
    set t = null
endfunction

function DamageGroup_Filter takes nothing returns boolean
    local integer hid = GetHandleId(GetExpiredTimer())
    local unit t = GetFilterUnit()
    local unit u = LoadUnitHandle(udg_Hashtable, hid, 0)
    local real damage = LoadReal(udg_Hashtable, hid, 3)
    local boolean dbuilds = LoadBoolean(udg_Hashtable, hid, 4)
    local boolean dmagicimmune = LoadBoolean(udg_Hashtable, hid, 5)
    local boolean dally = LoadBoolean(udg_Hashtable, hid, 6)
    if (dally and dbuilds) or (dally and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) or (IsUnitEnemy(t, GetOwningPlayer(u)) and dbuilds) or (IsUnitEnemy(t, GetOwningPlayer(u)) and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) then
        call UnitDamageTarget(u, t, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    endif
    set u = null
    set t = null
    return true
endfunction

function DamageGroup takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer hid = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_Hashtable, hid, 0)
    local real radius = LoadReal(udg_Hashtable, hid, 2)
    call GroupEnumUnitsInRange(LoadGroupHandle(udg_Hashtable, hid, 1), GetWidgetX(u), GetWidgetY(u), radius, Filter(function DamageGroup_Filter))
    call DestroyGroup(LoadGroupHandle(udg_Hashtable, hid, 1))
    call FlushChildHashtable(udg_Hashtable, hid)
    call DestroyTimer(t)
    set t = null
    set u = null
endfunction

function DamageGroupOfUnit takes unit u, location loc, real radius, real damage, boolean dbuilds, boolean dmagicimmune, boolean dally returns nothing
    local group g = CreateGroup()
    local unit target
    call GroupEnumUnitsInRange(g, GetLocationX(loc), GetLocationY(loc), radius, null)
    loop
        set target = FirstOfGroup(g)
        exitwhen target == null
            if (dally and dbuilds) or (dally and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) or (IsUnitEnemy(target, GetOwningPlayer(u)) and dbuilds) or (IsUnitEnemy(target, GetOwningPlayer(u)) and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) then
                call UnitDamageTarget(u, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            endif
            call GroupRemoveUnit(g, target)
    endloop
    call DestroyGroup(g)
    set target = null
    set g = null
endfunction

Вопрос-ответ

  • Как узнать равкод способности? В РО нажимаем Ctrl + D. Вместо названия способности появляется набор букв вида 'А000', который и надо записывать в нужную вам функцию.
  • Как узнать ордер способности (для даммикаста)? В РО ищем строчку вида "приказ" (прошу прощения, у меня англ редактор, поэтому не могу сказать точно) и слово, которое там написано и есть наш ордер. Примеры: thunderclaps, fireboat and etc.
Прикрепленные файлы
Тип файла: w3x GUI_Must_Die_v1.2.w3x (21.2 Кбайт, 111 просмотров )

Отредактировано Ty3uK, 25.02.2012 в 08:17.
Старый 24.02.2012, 16:35
Suite
┌_____┐
offline
Опыт: 11,222
Активность:
умница 5+ для новичков, то что надо)
Старый 24.02.2012, 19:25
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Nerevar:
инфо сюда перебирается чтоли?
что за инфо?
Ty3uK:
Наработки для гуишников
"гуишники" которых я себе представляю, не знают что за существа "Равкоды" и "айди", и врятле пользуются кастом скриптом. так что это скорей для тех, кто разбирается в жаззе
Старый 24.02.2012, 20:49
nomer231

offline
Опыт: 210
Активность:
Спасибо огромное
Старый 24.02.2012, 20:49
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Амбидекстрия:
что за инфо?
укоз такой,откуда переезжают сюда не только люди,но и их наработки
Автор думаю стоило бы в коде сделать комментарии к выполняемым действиям,ибо думаю юзер если уж и захочет использовать данный код,то в скором времени захочет разобраться что\куда\зачем\почему\откуда и комментарии в таком случае не будут лишними,возможно наставишь таким образом человека на путь истинный джасса
Также лучше не используй таймер с периодом 0.01
Старый 24.02.2012, 21:59
Ty3uK

offline
Опыт: 2,469
Активность:
Мои наработки переезжают и на хайв, это не показатель. Или это такая форма "расизма"? Пояснения сделаю, а таймер на .01 юзал потому, что для прыжка не мог подобрать скорость для периода в .04. Спасибо за наставления
Старый 24.02.2012, 22:07
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
call AddTimedEffectToUnit(юнит, "эффект", "точка прикрепления", время)

call AddTimedEffectToUnit(точка, "эффект", время)
Мб должно быть так?
==>
call AddTimedEffectToPoint(юнит, "эффект", "точка прикрепления", время)

call AddTimedEffectToUnit(точка, "эффект", время)
И это не наставления,а советы=/
Старый 24.02.2012, 22:15
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
я глянул отличная наработка в джасе я 0=) а тут все более подробно Ставлю плюс спс!
Облегчит создание спелов.
Старый 24.02.2012, 22:17
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
И почему сия наработка подписана в подписи у тебя как [GUI Must Die] ? Она ведь наоборот облегчает жизнь гуишникам и дает лишний повод(коих тысячи) оставаться на гуи.Или рассчет на то что юзер рано или поздно начнет копаться\разбираться в "волшебном коде"?
Старый 24.02.2012, 22:22
Ty3uK

offline
Опыт: 2,469
Активность:
Точно, еще раз большое спасибо, Неревар. Очепятки меня преследуют. Но чуток не так, как ты поправил ^_^
Старый 24.02.2012, 22:23
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
хмм у меня проблема я так и не понял как правильно скопировать код подскажите!
Старый 24.02.2012, 22:23
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
» Инструкция
Читаешь что написано в пункте "Установка в карту"
Выбираешь нужно действие и копируешь функции с именами,выделенным жирным шрифтом в
"Что и куда копировать, чтобы "робило и пахало""
Вызываешь кастом скриптом нужную функцию и передаешь параметры,указанные в "Как же вызывать эти фичи"
Старый 24.02.2012, 22:29
Hanabishi
COOL STATUS
offline
Опыт: отключен
Ty3uK, сделай ивенты, это самое больное место здесь.
Т.е. чтобы нужная функция срабатывала по окончании движения юнита итп
Старый 24.02.2012, 22:33
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
нече не понял эх(
тоесть весь код копировать не надо?
допустим нужны все действия как быть?
Старый 24.02.2012, 22:35
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Выбираешь нужное действие из списка,смотришь названия каких функций выделены жирным шрифтом возле этого действия,копируешь их себе.если нужны все действия - копируй весь код=/
Старый 24.02.2012, 22:37
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
весь код копировал около 300 ошибок вылезло как быть?
переменную создавал как сказано.
Старый 24.02.2012, 22:42
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Вот на этом ошибка =/
С - локалка юнит
I - интегер локалка
call AddTimedEffectToPoint(C, "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", "weapon", (12-I).)
Старый 25.02.2012, 00:21
alpha

offline
Опыт: 7,387
Активность:
Vadik29:
call AddTimedEffectToPoint(C, "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", "weapon", (12-I).)
что за точка? Ты здоров?
Старый 25.02.2012, 02:25
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
alpha, прочитай коменты выше вот например
Ошибка
call AddTimedEffectToUnit(C, "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", "weapon", (12-I).)

Отредактировано Vadik29, 25.02.2012 в 07:14.
Старый 25.02.2012, 06:46
Ty3uK

offline
Опыт: 2,469
Активность:
Давайте включим мозг- функция называется AddTimedEffectToPoint. Так с какого покемона ты туда юнита лепишь? -_- исправил очепятку в первом посте
Ty3uK добавил:
Nerevar, маст дай потому, что этим я демонстрируют, что жасс может здорово облегчить жизнь. Плюс нет утечек и бж ^_^
Насчет инвентов - не знаю. Как же гуишники будут их вызывать? Уж если они жните вместо точки лепят в аргументы -_-
Ty3uK добавил:
И как бы время - это реальная, а не целочисленная
Старый 25.02.2012, 08:28
Ответ

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

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

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

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



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