28

» WarCraft 3 / Вылет из лобби

PraetorianSM, ну если вы закинули туда же, куда и карты всегда загружаются при скачивании, то я правда хз
28

» WarCraft 3 / Вылет из лобби

Та скидывайте просто карты через дискорд или тут же, на хгм)
28

» WarCraft 3 / Как задействовать анимацию при касте скила

PT153, у меня только кастом гуи этой функции, может у автора её нет, поэтому я сразу кастом скрипт скинул, некоторые анимки вроде attack 1, attack 2 можно юзануть только по индексу (вроде), поэтому я подумал, что со спеллом такие же проблемы + версии могут отличаться
28

» WarCraft 3 / Как задействовать анимацию при касте скила

Если ты прописывал анимацию сюда
и она не сработала, то можно попробовать следующий вариант
меняешь цифру в кастом скрипте и смотришь какая анимка воспроизводится
Загруженные файлы
28

» WarCraft 3 / Текстуры.

А ты пробовал у импорта прописать путь к стандартной текстуре, а потом выбрать её в РО?

upd то, что ты хочешь заменить, вероятнее всего текстура почвы
28

» WarCraft 3 / Как нанести урон 1 раз, дамми юнитом который летит

Qulore, в группу заноси. Прежде чем нанести урон проверяешь, что юнит не в группе, потом вместе с уроном добавляешь его в группу

Загруженные файлы
28

» WarCraft 3 / Событие отряд вошёл в зону

Есть такое условие, как проверка находится ли юнит в области (логическая). Когда открою редактор, то скину скриншот, но у меня русские триггеры. - Ставишь любое нужное тебе событие - если юнит в области, то - действия

upd функция и скрин
RectContainsUnit takes rect r, unit whichUnit returns boolean

upd хотя в твоём случае достаточно просто выбрать всех юнитов в области через проверку типа юнита и дать им приказ
кат
Загруженные файлы
28

» WarCraft 3 / Какие блокираторы пути лучше использовать

В варике блокираторы пути 2х2 и 4х4 (маленький и большой). Воздух блочит путь для воздуха, суша для суши, двусторонний для суши и воздуха. Если в одной точке стоят 4 маленьких блокиратора, лучше заменить на один большой блокиратор. А вообще, лучше использовать вариант, который указал quq_CCCP. Там типо с фотошопом надо как-то работать, сетку желательно создать на которой будешь рисовать свой блокиратор пути... Короче на хгм есть где-то статейка, возможно найду


что делает блокиратор поля зрения я без понятия, скорее всего блочит и путь, и поле зрения, если поставить высоту препятствия
28

» Блог им. rsfghd / Волны помойных волн

WoLLFeR, вау, вульфер)
Не ожидал после стольких лет увидеть тебя снова на хгм, видимо природа в 2021 очистилась

Помойные волны не могут выглядеть красиво, с моими то знаниями)
28

» Блог им. rsfghd / Барьер со свалки

quq_CCCP, точно, но идеи приходят не сразу, да и в принципе нужно учить вектора. К сожалению, не справляюсь, очень разочарован в себе)
28

» WarCraft 3 / отлов автоатак при событии "юнит получает урон"

quq_CCCP, ну.. хорошая в плане не сильно замудренная, легка в реализации. Событие только висит, но оно вроде не много занимает. Да и вероятно с кодом можно поправить этот недостаточек

upd: хотя если говорить про урон с автоатак, то дико извиняюсь
28

» WarCraft 3 / Как заставить юнита отлететь/оттолкнуться в синематике

Сделал вариант на гуи, если тебе выше не подходят. Но тут чисто для синематика на одного юнита, просто чтобы ты понял суть

Вот скрины
Русификатор на триггерах!
Загруженные файлы
28

» Блог им. rsfghd / Барьер со свалки

Обнова (кому она нужна в принципе)
+ Переменные в дефайны (это типо оптимизация)
+ Исправлена ошибка с отталкиванием при росте барьера
+ Максимальная высота барьера (для сферического (и то, я не уверен, что у меня правильная формула))
+ Барьер может быть теперь земноводным, полёт настраивается в самом триггере
+ "Исправлена" ошибка с двойным уроном, таймер увеличен и добавлены настройки с дополнительным отталкиванием (юниты всё равно могут получить двойной урон, если оттолкнутся один в другого)
+ Юнитов не отталкивает в непроходимые зоны
+ Юниты, которых нельзя выкинуть с барьера, не получают кучу урона, вместо этого обновляется время дебаффа
- Специальный эффект (дамми) может криво спавнится на горах
- Очень сложно настроить барьер до оптимального значения, всё делается на ощупь (из-за плохого кода)
- Я не проверял все настройки, поэтому что-то может не работать (оч извиняюсь, но это рили много времени жрёт (исправлю, если кто-то напишет))
- Нет возможности добавить собственные условия без малейшего знания джасса (постараюсь что-нибудь придумать с этим в будущем)
- Некоторые значения лучше не ставить ниже единицы
- Минусовое значение урона не будет хилять (в будущем добавлю)
- Минусов больше, чем плюсов, я забыл остальные)
Код и настройки обновил в посте
Загруженные файлы
28

» WarCraft 3 / Как заставить юнита отлететь/оттолкнуться в синематике

Вот, посмотри

код
scope MySc
globals
define private H = udg_Hash // Название твоей хэш-таблицы

define private AbilityID = 'A000' // ID способности
define private DummyID = 'u000' // ID дамми-юнита

define private Discarding = 5.00 // Сила отбрасывания
define private DiscardingTime = 1.00 // Время отбрасывания
endglobals
//==========================================================================
private function IsUnitDead takes unit u returns boolean
    return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction

private function move1 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real a = LoadReal(H,i,1)
    local real d = LoadReal(H,i,2)
    local real tm = LoadReal(H,i,3)+0.01
    
    if tm > DiscardingTime or IsUnitDead(u) then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
    else
        call SetUnitX(u,GetUnitX(u)+d*Cos(a))
        call SetUnitY(u,GetUnitY(u)+d*Sin(a))
        call SaveReal(H,i,2,d-(Discarding/DiscardingTime*0.01))
        call SaveReal(H,i,3,tm)
    endif
    
    set t = null
    set u = null
endfunction

private function Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer i = GetHandleId(t)
    local unit u = GetSpellTargetUnit()
    local unit uu = GetSpellAbilityUnit()
    
    //Создание дамми-щита
    set bj_lastCreatedUnit = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DummyID,GetUnitX(u),GetUnitY(u),Atan2(GetUnitY(uu)-GetUnitY(u),GetUnitX(uu)-GetUnitX(u))*bj_RADTODEG)
    call UnitApplyTimedLife(bj_lastCreatedUnit,'BTLF',1.)
    set bj_lastCreatedUnit = null
    //===================
    
    call SaveUnitHandle(H,i,0,u)
    call SaveReal(H,i,1,Atan2(GetUnitY(u)-GetUnitY(uu),GetUnitX(u)-GetUnitX(uu)))
    call SaveReal(H,i,2,Discarding)
    call TimerStart(t,0.01,true,function move1)
    
    set t = null
    set u = null
    set uu = null
endfunction

//===========================================================================
private function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == AbilityID
endfunction

function InitTrig_Phoenix takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition(t,Condition(function Conditions))
    call TriggerAddAction(t,function Actions)
    set t = null
endfunction
endscope
Загруженные файлы
28

» WarCraft 3 / Как заставить юнита отлететь/оттолкнуться в синематике

О, недавно делал помойные волны, там такой же принцип отталкивания работает
Вот и сама функция
private function move1 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real a = LoadReal(H,i,1)
    local real d = LoadReal(H,i,2)
    local real tm = LoadReal(H,i,3)+0.03
    
    if tm > WaveDiscardingTime then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
    else
        call SetUnitX(u,GetUnitX(u)+d*Cos(a))
        call SetUnitY(u,GetUnitY(u)+d*Sin(a))
        call SaveReal(H,i,2,d-(WaveDiscarding/WaveDiscardingTime*0.03))
        call SaveReal(H,i,3,tm)
    endif
    
    set t = null
    set u = null
endfunction
В ячейке 0 - юнит, 1 - угол куда отталкивать, 2 - сила отталкивания (WaveDiscarding), 3 (+0.03) - периодичность истекаемого таймера, чтобы через время остановить отталкивание
Вот формула d-(WaveDiscarding/WaveDiscardingTime*0.03)
WaveDiscarding и WaveDiscardingTime это глобалки, можешь просто сохранить в другие ячейки локальные значения

Upd: но некоторые моменты нужно учесть, у меня этого пока что нет и в итоге юнита может вытолкнуть за границы карты или в непроходимую местность
28

» Блог им. rsfghd / Барьер со свалки

Нашел много недоработок, например то, что барьер откидывает вне радиуса юнитов
Так же планирую сделать особенность для летающих юнитов, барьер всё-таки сферический, а не цилиндрический
28

» WarCraft 3 / Разрешенные цели и Типы целей.


Если тебе нужно, чтобы не кастовалось на здания союзника - убери галку союзники

Если хочешь, чтобы каст был только на здания врага, то убери галки войска игрока, союзника и поставь враги
Загруженные файлы
28

» WarCraft 3 / Не удаляется молния

Нет-нет, смотри. Мы прям стартуем игру, создаём молнию, убиваем юнита кастера и.. молния остаётся, это единственная созданная молния
В моей же карте если уничтожить кастующее здание всё нормально
Проблема не в глобалке, раньше молния была вообще локальной в нашем коде, я просто решил заменить на глобалку, результатов конечно особых не дало

Фаталок никаких не было, просто не можем удалить молнию, ссылка на неё потерялась где-то

А проверить существует ли молния или нет - никак.
Что по поводу
if LoadLightningHandle(H,i,3) != null then
    call DestroyLightning(LoadLightningHandle(H,i,3))
endif
?
Получается моя "проверка" существует ли молния на самом деле не рабочая?

HaveSavedHandle получается тоже бесполезным будет?

Я пока остановился на этом коде, если это имеет значение
Код
scope MySc
globals
    location LocationForGetZ = Location(0,0)
    string S = ""
endglobals

private function GetUnitZ takes unit u returns real
    call MoveLocation(LocationForGetZ,GetUnitX(u),GetUnitY(u))
    return GetLocationZ(LocationForGetZ)+GetUnitFlyHeight(u)
endfunction

private function IsUnitDead takes unit u returns boolean
	return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction

private function mt takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local real r = LoadReal(H,i,1)+0.01
    local unit u = LoadUnitHandle(H,i,0)
    local integer ii = GetHandleId(u)
    local unit uu = LoadUnitHandle(H,ii,1)
    
    if IsUnitDead(u) or IsUnitDead(uu) or LoadInteger(H,ii,4) == 1 then
        call PauseTimer(t)
        call DestroyTimer(t)
        call DestroyLightning(LoadLightningHandle(H,ii,3))
        call DestroyEffect(LoadEffectHandle(H,ii,5))
        call FlushChildHashtable(H,i)
        call FlushChildHashtable(H,ii)
		BJDebugMsg("чтрарапрв")
    else
        if r >= 0.10 then
            set ii = GetUnitTypeId(uu)
            if ii == 'h000' then
                set r = 0.05
            elseif ii == 'h001' then
                set r = 0.15
            elseif ii == 'h002' then
                set r = 0.25
            endif
            call SetUnitState(uu,UNIT_STATE_LIFE,GetUnitState(uu,UNIT_STATE_MAX_LIFE)*RMaxBJ(0,GetUnitLifePercent(uu)+r)*0.01)
            set r = 0.
        endif
        call SaveReal(H,i,1,r)
    endif
    
    set t = null
    set u = null
    set uu = null
endfunction

private function Actions takes nothing returns nothing
    local unit u = GetSpellAbilityUnit()
    local unit uu = GetSpellTargetUnit()
    local timer t = null
    local integer i = GetHandleId(u)
    local integer ii = GetUnitTypeId(u)
    
    if LoadLightningHandle(H,i,3) != null then
        call DestroyLightning(LoadLightningHandle(H,i,3))
    endif
    
    if LoadEffectHandle(H,i,5) != null then
        call DestroyEffect(LoadEffectHandle(H,i,5))
    endif
    
    if ii == 'h000' then
        set S = "HWPB"
    elseif ii == 'h001' then
        set S = "HWPB"
    elseif ii == 'h002' then
        set S = "HWPB"
    endif
    
    call SaveUnitHandle(H,i,1,uu)
    call SaveLightningHandle(H,i,3,AddLightningEx(S,true,GetUnitX(u),GetUnitY(u),GetUnitZ(u),GetUnitX(uu),GetUnitY(uu),GetUnitZ(uu)))
    call SaveEffectHandle(H,i,5,AddSpecialEffectTarget("Abilities\\Spells\\Human\\Resurrect\\ResurrectCaster.mdl",uu,"origin"))
    
    if LoadInteger(H,i,2) == 0 then
        call SaveInteger(H,i,2,1)
        set t = CreateTimer()
        call SaveUnitHandle(H,GetHandleId(t),0,u)
        call TimerStart(t,0.01,true,function mt)
        set t = null
    endif
    
    set u = null
    set uu = null
endfunction

//===========================================================================
private function Conditions takes nothing returns boolean
    local integer i = GetSpellAbilityId()
    return i == 'A000' or i == 'A001' or i == 'A002'// Прожимаемая абилка
endfunction

function InitTrig_Phoenix takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition(t,Condition(function Conditions))
    call TriggerAddAction(t,function Actions)
    set t = null
endfunction
endscope
28

» WarCraft 3 / Не удаляется молния

Мы сохраняли ссылку на молнию и в родительский ключ юнита-цели абилки (uu), но всё равно не помогло

Попробовали записать молнию в глобалку, она удалилась. Что ж с хэш-таблицей тогда? Что-то с родительским ключом кастующего юнита?

Жду пока друг проверит у себя это
Загруженные файлы