0
5
6 лет назад
Отредактирован Lillikon
0

» WarCraft 3 / Способность: повышение атаки при каждом ударе

Охренеть тут холивар. То есть я правильно понял, если создать дополнительное событие Получает урон, то нагрузки будет меньше, + исключеается возможность абуза такой пассивки? Мой скилл должен был срабатывать от того, что у атакующего юнита была пассивная способность-пустыщка. Тогда получается нужно сделать так, что типа: владелец пустышки входит в область Вся карта - Добавить событие для триггера с действиями для пустышки; Юнит получает урон? И для этого способа триггер с дейсвиями пустышки ВООБЩЕ не должен иметь условий или даже событий, только делать действия?
0
5
6 лет назад
0

» WarCraft 3 / Способность: повышение атаки при каждом ударе

PT153:
То есть если нет таймера, то он создаст его, а если таймер есть, то он увеличит уровень способности? (я немного запутался просто)
Да, ведь так должен спел работать? Я из описания вопроса так понял.
И такой способ для события Получает урон?
Событие "Юнит атакован" срабатывает во время замаха. Это можно абузить. Для каждого юнита на карте нужно зарегистрировать событие по получению урона. Для каждого, потому что общей такой функции нет.
А как создать событие Получает урон, если такой функции нет?
quq_CCCP:
Очень баганая реализация с атакой, нужно отслеживать урон, это раз, два ненадо использовать конверт из гуи, not( some cond == false ),
Детект урона в помощь, системы бонус урона были на сайте, после каждого удара просто повышаешь счетчик на +1 ну и запускаешь таймер который снимит бонус.
Можно ссылочку, плиз. Я вроде просматривал какие-то материалы. Может пропустил...
0
5
6 лет назад
0

» WarCraft 3 / Способность: повышение атаки при каждом ударе

PT153:
крутил-крутил-вертел код, сделал так, вроде, работает, но мне кажется, что можно лучше
У тебя всё равно плодятся таймеры при каждом замахе. Через несколько минут игры будут лаги. Лучше глянь сообщение над своим.
Они бы не плодились, если бы была проверка на наличие способности, которую добавляешь (если уровень способности больше нуля, ничего не делаем). Но такой проверки нет.

Нашёл ошибку в своей реализации, исправил.
И такой способ для события Получает урон? То есть если нет таймера, то он создаст его, а если таймер есть, то он увеличит уровень способности? (я немного запутался просто)
0
5
6 лет назад
0

» WarCraft 3 / Способность: повышение атаки при каждом ударе

Globder:
Блин, почитай свой вопрос еще раз сам. Я вот не понял, что тебе в конце концов нужно. Урон не "отнимается" а наносится, в твоем случае.
Юнит бьет, получает +урон, потом бьет еще - +урон становится больше, +10,+20,+30, но если прошло 5 секунд, то +урон весь пропадает. Не получается перезапустить таймер.
UPD: крутил-крутил-вертел код, сделал так, вроде, работает, но мне кажется, что можно лучше
function Trig_Aura_Strenght_Conditions takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A00B', GetAttacker()) == 1 ) ) then
        return false
    endif
    if ( not ( GetRandomInt(1, 1) == 1 ) ) then
        return false
    endif
    return true
endfunction

function Aura_Strenght_Lost takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit caster = LoadUnitHandle(udg_Hash,id,47)
    local integer caster_id = GetHandleId(caster)
    local real time = LoadReal(udg_Hash,caster_id,200)
    
    set time = time + 0.05
    call SaveReal(udg_Hash,caster_id,200,time)
    if time == 5.00 then
        call UnitRemoveAbility(caster,'A00V')
        call DestroyTimer(t)
        call FlushChildHashtable(udg_Hash,id)
        call FlushChildHashtable(udg_Hash,caster_id)
    endif
    call BJDebugMsg(R2S(time))
endfunction

function Trig_Aura_Strenght_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local unit caster = GetAttacker()
    local integer caster_id = GetHandleId(caster)
    local integer ability_level = LoadInteger(udg_Hash,caster_id,201)
    local real time = 0.00
    call SaveUnitHandle(udg_Hash,id,47,caster)
    set ability_level = ability_level + 1
    call SaveInteger(udg_Hash,caster_id,201,ability_level)
    if GetUnitAbilityLevelSwapped('A00V',caster) == 0
        call UnitAddAbility(caster,'A00V')
        call SetUnitAbilityLevel(caster,'A00V',ability_level)
        call TimerStart(t,0.05,true,function Aura_Strenght_Lost)
    elseif GetUnitAbilityLevelSwapped('A00V',caster) >= 1
        call BJDebugMsg("Матерное слово")
        set time = 0.00
        call SaveReal(udg_Hash,caster_id,200,time)
        call SetUnitAbilityLevel(caster,'A00V',ability_level)
    endif
    //call AddHeroXP(caster,100,true)
endfunction

//===========================================================================
function InitTrig_Aura_Strenght takes nothing returns nothing
    set gg_trg_Aura_Strenght = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Aura_Strenght, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Aura_Strenght, Condition( function Trig_Aura_Strenght_Conditions ) )
    call TriggerAddAction( gg_trg_Aura_Strenght, function Trig_Aura_Strenght_Actions )
endfunction
0
5
6 лет назад
0

» WarCraft 3 / JASS создание и удаление эффекта

DracoL1ch:
время смерти эффектов - игровая константа, по дефолту 5с, в константах ищи
Спасибо, честно, не знал, что у эффектов может быть такой параметр) Проблема решена.
0
5
6 лет назад
Отредактирован Lillikon
0

» WarCraft 3 / Проблема со скиллом на JASS

ScopteRectuS:
Lillikon, точно, корень обязателен. Теорема Пифагора.
	a^2 + b^2 = c^2
Я никогда корень не использовал, а просто перемножал на 2. Так написано в подсказках по BJ в редакторе и так как я недавно изучаю JASS, то постоянно боюсь накосячить))
			set dx_c_e = enemy_x - center_x
            set dy_c_e = enemy_y - center_y
            set dist_c_e = (dx_c_e*dx_c_e+dy_c_e*dy_c_e)
В этой части кода даже без квадрата все пашет, ну а ошибку я писал выше) Оказывается надо было так:
			set dx_c_e = enemy_x - center_x
            set dy_c_e = enemy_y - center_y
            set dist_c_e = SquareRoot(dx_c_e*dx_c_e+dy_c_e*dy_c_e)
И я вообще охренел, ведь раньше я писал без SquareRoot и все работало, поэтому я и не так быстро нашел свою ошибку)
0
5
6 лет назад
0

» WarCraft 3 / Проблема со скиллом на JASS

Проблема решилась написанием SquareRoot в формуле вычисления дистанции. Странно, что в другом скилле мною эта формула использовалась с этой же ошибкой (SquareRoot не писал, забывал, наверное, из-за неопытности), но при этом все работало нормально... Мистика какая-то. Но буду признателен за другие предложения по оптимизации кода))
ScopteRectuS:
Покажите лучше карту, пока руками не потрогаешь, сложно сказать где проблема.
И да, так как углы известны уже заранее, то можно сразу же посчитать их:
local real point_1_x = target_x + 300.00 * Cos(0.00*bj_DEGTORAD)
local real point_1_y = target_y + 300.00 * Sin(0.00*bj_DEGTORAD)
>>>>
local real point_1_x = target_x + 300.00 * 1.0
local real point_1_y = target_y + 300.00 * 0.0
>>>>
local real point_1_x = target_x + 300.00
local real point_1_y = target_y + 0.00
>>>>
local real point_1_x = target_x + 300.00
local real point_1_y = target_y
Благодарю, проблему нашел. Всегда так, когда в отчаянии на форум бегу - дак тут же проблему увидел, а до этого - хрен)
0
5
6 лет назад
Отредактирован Lillikon
0

» WarCraft 3 / JASS - Дамми-юнит не исчезает

biridius:
call CreateUnit(GetOwningPlayer(caster),'e000',kursor_x,kursor_y,0.00)
set dummy = bj_lastCreatedUnit
нативная CreateUnit не записывает юнита в bj_lastCreatedUnit, это делают только БЖ функции (вон там префикс bj_)
поменяй на
set dummy = CreateUnit(GetOwningPlayer(caster),'e000',kursor_x,kursor_y,0.00)
Понал косяк. Спасибо) Записал так и все заработало:
set dummy = CreateUnit(GetOwningPlayer(caster),'e000',kursor_x,kursor_y,0.00)
0
5
6 лет назад
0

» WarCraft 3 / Юнит стандартного AI не использует способность Канал

Прочитал в другой теме, что это и правда нереально, стандартный ИИ не знает канал.
0
5
6 лет назад
0

» WarCraft 3 / Как сделать чтобы триггер узнавал на кого действует способность?

Нужно указать это в условиях триггера. В GUI это Тот кто применяет - Применяющий юнит; тот, кто цель - Юнит-цель применяемой способности (в некоторых руссицикаторах эта опция в GUI написана как ()
0
5
6 лет назад
0

» WarCraft 3 / Помощь в избавлении от BJ

Borodach:
триггеры
каст способности
движение часть 1
движение часть 2
Хоспади, добрый человек, спасибо! Хоть кто-то мне на пальцах объяснил! Меня это реально добивало)))) Сижу тут как "умный" и думаю интенсивно)
PT153:
Не все BJ функции зло. Злом являются те, кто использует локации, группы, кланы, делают вызов 1-й функции без доп. аргументов.
Конкретно в моем скилле при одном касте из-за этих BJ где-то 1к утечек на каст) Так что убрать их - маст хев.
0
5
6 лет назад
Отредактирован Lillikon
0

» WarCraft 3 / Помощь в избавлении от BJ

UrsaBoss:
Там где ты уничтожаешь таймер в Flyin - можно заного запустить таймер и уже юзать Flyout
И ещё ты во Flyin используешь "location endfly" которая там просто висит, наверное ты забыл поменять на endfly_x/y
Вместо многократного использования GetHandleId(t) - занеси всё в одну integer и используй её
Обнулять нужно только указатели на игровой объект, обнулять real/integer/boolean/string не нужно.
Есть исключения, если игровой объект в игре будет всю игру (к примеру игрок) - то указатель на него не обязательно обнулять
Я уже переписываю код, исключая все замечания, которые учел и которые мне подсказали. Сейчас проблема только в том, как в формулу :
a = угол направления
x + range * Cos(a * bj_DEGTORAD)
y + range * Sin(a * bj_DEGTORAD)
добавить джижение 20 единиц. Я это не ферштейн и объяснить никто пока не смог.
0
5
6 лет назад
0

» WarCraft 3 / Помощь в избавлении от BJ

Hate:
я не имел ввиду буквально убрать слип не заменив ничем. все что вы делаете двумя функциями через слип должно делаться одной без него
Это я и так знал, но я запутался в формулах, а не в принципе.
a = угол направления
x + range * Cos(a * bj_DEGTORAD)
y + range * Sin(a * bj_DEGTORAD)
Как вставить в эту формулу то, что suriken сдвигается на 20 едениц?
0
5
6 лет назад
0

» WarCraft 3 / Помощь в избавлении от BJ

Hate:
call TriggerSleepAction() 
убрать

бж функции для исследования замечательно раскрываются с зажатием ctrl и кликом по ним

обнулять реалки довольно мощно

сравнивать логические с логическими так же не нужно

вместо точек используйте координаты

это на первое время

и да, закрывайте созданные вопросы если на них дали ответ
Если убрать call TriggerSleepAction(), то следом после таймера Flyin, который отвечает за полет сюрикена в точку endfly_x,endfly_y, запуститься таймер Flyout, который отвечает за полет сюрикена обратно к caster. В итоге сюрикен никуда не полетит и сразу исчезнет(проверено).
бж функции для исследования замечательно раскрываются с зажатием ctrl и кликом по ним
Это я и так знал, но я запутался в формулах, а не в принципе.
вместо точек используйте координаты
Это и пытаюсь сделать, избавившись от них сначала в функции Flyout (функцию Flyin пока не переписывал)
0
5
6 лет назад
0

» WarCraft 3 / Помощь с настройкой таймера и хэш-таблицы

UrsaBoss:
Это достаточно неправильный код, везде BJ функции, location и т.д.
Сначала потренируйся просто переместить любого юнита в нужные тебе координаты.
Вместо location используй координаты "x" и "y"
К примеру:
Вычисление угла между координатами (в радианах)
a = Atan2(m.y - GetUnitY(u), m.x - GetUnitX(u))
//m.x и m.y это "конечная" точка, в которую юнит должен переместиться
Чтобы вычислить "x" смещение от места где стоит юнит с нужными тебе углом (угол "a" в радианах):
x = GetUnitX(u) + 2000. * Cos(a)
//Там где 2000. - это нужное тебе расстояние, можно записать как 2000.00 (без разницы)
Чтобы вычислить "y" смещение от места где стоит юнит с нужными тебе углом (угол "a" в радианах):
y = GetUnitY(u) + 2000. * Sin(a)
//Там где 2000. - это нужное тебе расстояние, можно записать как 2000.00 (без разницы)
Ну а потом
SetUnitX(u, x)
SetUnitY(u, y)
Далее уже можешь передвигать юнита каждые 0.03 секунды по 5 точек.
К примеру тот же код что выше - заранее вычисляешь им координаты где должен в итоге оказаться твой юнит
Или если у тебя уже есть готовые координаты, к примеру если юнит летит в точку кастования способности
И этим же кодом выше передвигаешь юнита по 5 точек каждые 0.03 секунды
А чтобы поймать окончание "передвижения" просто каждый раз сравнивай дистанцию, если она будет меньше 10, то уничтожай таймер и т.д
Там где 10 я имел ввиду кол-во точек на которое передвигается юнит + 5
Вычисление дистанции между координатами
local real dx = m.x - x
local real dy = m.y - y
local real d = SquareRoot(dx * dx + dy * dy)
//Там где m.x и m.y - это конечные координаты
//А "x" и "y" - это текущие координаты юнита
Это боллее сложный способ для меня, так как я напрочь забыл весь матан, который учил)) Но я попробую, так как, в действительности, если знать подобные формулы - это реально проще. А все таки, почему таймер не сработал? Мне бы понять, где там реально ошибка) Я его определенно вставил криво.
0
5
6 лет назад
0

» WarCraft 3 / Помощь с локальными переменными

8gabriel8:
По идее, если сильно хочется, то можно и на GUI сделать MUI, то есть использование несколькими юнитами одновременно. Скинь карту с триггером, чтобы его переделал для примера. Только, как и упомянули, правильнее было бы использовать jass, на GUI получится костыльно.
(если остался, приложи без локалок триггер)
Спасибо, но уже нет необходимости) Решил написать тот же скилл на jass. Только начал изучать его, щас бьюсь с таймерами и хэш-таблицами.