2
7
3 года назад
2

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

выглядит очень страшно
0
7
6 лет назад
0

» WarCraft 3 / TEXTTAG

Hate, Отлично, то что нужно, благодарю
0
7
6 лет назад
0

» WarCraft 3 / Storm & Stone 2

Ух как под запарился, молодец
7
7
6 лет назад
Отредактирован WoLLFeR
7

» WarCraft 3 / Сколько единиц расстояния в одной клетке?

Если не ошибаюсь:
Маленькая(серая) 32х32
Средняя(белая) 128х128
Большая(желтая) 512х512
С шагом в 4 раза
2
7
6 лет назад
Отредактирован WoLLFeR
2

» WarCraft 3 / Крашит карту

Надеюсь ты на 0 не делил? И странные значения не вводил. Попробуй отключать триггер или некоторые улучшения удаляй по очереди и проверяй, конечно на отдельной, резервной мапе, так ты должен найти ошибку.
0
7
6 лет назад
0

» WarCraft 3 / какими программами можно открыть карту в editore

BrEd Pitt, тут ты, возможно, прав
0
7
6 лет назад
0

» WarCraft 3 / какими программами можно открыть карту в editore

BrEd Pitt, О каких деньгах речь вообще ведёте? Тут люди тратят годы на варик, кто-то в пустую, а кто-то переходит потом на другие платформы или без труда изучает языки программирования. Благодаря этой самой трате математика и программирование в учёбе идёт без труда, я так думаю, тем более это дело не скучное. Если вы вообще не видите перспектив, это не означает что их нет.
raritan, а что там за квесты такие, что сам не можешь сделать? Может тебе просто не хватает знаний? А?
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

quq_CCCP, так бы сразу написали, я бы не мучился. Статьи о том как это устанавливать. Но теперь не нужно.
1
7
6 лет назад
Отредактирован WoLLFeR
1

» WarCraft 3 / Звуки при передвижении.

Мне кажется даже расчет по координатам не даст нужный результат, тут как бы ещё и от анимации зависит
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

quq_CCCP, Намного быстрее? доли секунды что ли? Я бы заметил тогда. Речь наверно ведёте о нагрузке памяти. Да и в общем дело такое, я не умею пользоваться фильтрами так, как хотелось бы, мне удобнее циклом, я понимаю как сделать так, как мне нужно. Я с фильтрами уже замучился, найти бы статью или наработку, которая мне нормально объяснит что к чему, искал, видимо плохо, или не правильно.
0
7
6 лет назад
Отредактирован WoLLFeR
0

» WarCraft 3 / Оптимизация

ScopteRectuS, Уфф, морока, но в целом ясно почему так происходит.
quq_CCCP:
фильтр намного быстрее перебирает...
(Выбираем всех)Фильтр: проверяет, добавляет в группу, потом я произведу нужные действия через цикл.
(Выбираем всех в группу)Цикл: проверяет, производит действия.
В целом видно, что фильтр добавляет в группу после перебора, в отличии от цикла. Да, тут явно фильтр быстрее, так как цикл будет удалять из группы (лишние действия). Ещё что-нибудь?
Но цикл удобнее, имхо, кому как, в некоторых случаях мб фильтр будет намного эффективнее.
0
7
6 лет назад
Отредактирован WoLLFeR
0

» WarCraft 3 / Оптимизация

quq_CCCP:
WoLLFeR, почему проще?
Потому что в фильтр я не могу обратиться, я не могу поставить туда условие связанное с кастером, потому что фильтр вызывается в таймере. Мне нужно, чтобы именно кастеру засчитывали нанесённый урон(он убивает(чтобы опыт зачислился), он своим не наносит урон). Либо я что-то не знаю, точнее как сделать иначе (внимательно на код в вопросе взгляните, мне приходится сохранять кастера, чтобы фильтр настроить, разве это удобно?). А как показал ScopteRectuS, используя всего лишь условие сразу видно, что не нужны лишние функции и могу непосредственно выбрать всё связанное с кастером, просто загрузив его хэндл привязанный к таймеру. Если не сложно, расскажите в чём преимущество фильтра, может я просто не знаю?
function FilterR takes nothing returns boolean

	local integer p = LoadInteger(udg_Hash,StringHash("x"),1)
	
return  IsPlayerEnemy(Player(p), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction
Чтобы не заниматься подобной ерундой (не приводящей к нужному результату), как на коде сверху, проще будет сделать так, без фильтра и всё сразу:
   if ( GetWidgetLife( Dummy ) < 0.405 ) then

        set  g  =  CreateGroup( )

        call GroupEnumUnitsInRange( g, xd, yd, 500.0, null )
        loop
            set  f  =  FirstOfGroup( g )
            exitwhen ( f == null )
            call GroupRemoveUnit( g, f )

            if IsUnitEnemy( f, GetOwningPlayer( Caster ) ) and ( GetWidgetLife( f ) > 0.405 ) and ( not IsUnitType( f, UNIT_TYPE_STRUCTURE ) ) and ( not IsUnitType( f, UNIT_TYPE_FLYING ) ) then
                call UnitDamageTarget( Caster, f, 400.0, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null )
            endif
Да, я понимаю, что с глобалкой я решу это, но что, если мне хотелось бы обойтись без неё? Предположим, если я юзаю спелл, он через таймер нанесёт урон через 1 секунду с помощью глобалки Кастера, но а если в этот момент, точнее где-то в 0.5 после моего юза, юзает кто-то еще, тогда глобалка запишет последнего кастера и урон в результате двух юзов сочтется для последнего кастера. Я так могу от своего же скилла подохнуть.
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

ScopteRectuS, вот этого я не знал. Значит циклом проще всё-таки.
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

ScopteRectuS, я понял, и всё же условием обойтись проще, хотя в таком случаи выбираются ВСЕ юниты в области и только при условии им наносит урон, а остальных просто перебирает и удаляет.
2
7
6 лет назад
Отредактирован WoLLFeR
2

» WarCraft 3 / Оптимизация

ClotPh, я о том же, без глобалки иногда не обойтись, когда нужно установить её в других триггерах, а вот локалки как раз подходят для того, чтобы их на разок юзнуть, обнулить и забыть.
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

quq_CCCP, а, ну если фильтр, тогда да. А почему это я должен забыть про одновременность?
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

quq_CCCP, а как же MUI функционал? Глобалки не могут одновременно иметь несколько значений, ну разве что если это массив.
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

ScopteRectuS, Огромное спасибо, никак не мог понять работу с отрядами, то есть с фильтром, оказывается можно было обойтись одним условием. Это всё облегчает. Благодарю за советы.
Extremator:
А я вот вижу проверку на 0.405 хп, вместо проверки мёртвости юнита
Так это же, юнит умирает когда у него хп не ноль, а где-то 0.4. Кончено у меня целостный урон я мог бы и так написать:
GetUnitState(whichUnit, UNIT_STATE_LIFE) <= 0
Но и в этом случаи всё равно работало бы, кроме одного: а если предположим у юнита (мёртвого) 0.3 здоровья, он мёртв, но его выделит в отряд и нанесёт ему ещё урон, но зачем? Он как бы итак мёртв.
quq_CCCP:
В фильтрах незачем объявлять локалки, для этого есть темповые глобалки.
Не думаю, что от глобалок лучше станет, как написал ScopteRectuS, можно обойтись условием, не создавая лишних функций.
0
7
6 лет назад
0

» WarCraft 3 / Оптимизация

biridius:
timerer еще не обнулил в самой нижней функции
Всё. Спасибо большое.
2
7
6 лет назад
2

» WarCraft 3 / Что содержится в WC III в папке redist?

Как я понял, что-то со звуком связанное...
Загруженные файлы
2
7
6 лет назад
Отредактирован WoLLFeR
2

» WarCraft 3 / Оптимизация

biridius, так, сейчас поправлю. А вот насчет Хэша и переменной игрока, которую я использую тут. Это место больше всего задаёт вопрос.
function FilterR takes nothing returns boolean
local unit z = LoadUnitHandle(udg_Hash,StringHash("x"),1)
local player p = GetOwningPlayer(z)
set z = null
return  IsPlayerEnemy(p, GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
biridius, что-то я тупанул, в общем, можно было просто игрока в хэш сохранить. Насчет группы, её отчистить просто, а потом уничтожить, или как?
function FilterR takes nothing returns boolean
local player p = LoadPlayerHandle(udg_Hash,StringHash("x"),1)
return  IsPlayerEnemy(p, GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction
biridius, и всё-таки, переменная игрока будет утечкой? может получить индекс игрока, только как?
biridius, Взял индекс, проще, надеюсь правильно
call SaveInteger(udg_Hash,StringHash("x"),1,GetPlayerId(GetOwningPlayer(Caster)))
biridius, Ну как-то так, утечки всё равно есть, но не грубые. Если найдёте еще, напишите пожалуйста.
Результат:
local integer p = LoadInteger(udg_Hash,StringHash("x"),1)
return  IsPlayerEnemy(Player(p), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING)
endfunction
function Trig_R_Boom takes unit d, unit c returns nothing
local real x = GetUnitX(d)
local real y = GetUnitY(d)
local group g = CreateGroup()
local unit f
call GroupEnumUnitsInRange(g, x, y,500,Condition(function FilterR))
    loop
    set f = FirstOfGroup(g)
    exitwhen f == null
    call UnitDamageTarget(c,f,400, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
    call GroupRemoveUnit(g,f)
endloop
call GroupClear(g)
call DestroyGroup(g)
set g = null
set f = null
endfunction
function Trig_LOCAL_TimerR takes nothing returns nothing
local timer timerer = GetExpiredTimer()
local integer i = GetHandleId(timerer)
local unit Caster = LoadUnitHandle(udg_Hash,i,4)
local unit Dummy = LoadUnitHandle(udg_Hash,i,3)
local real xd = GetUnitX(Dummy)
local real yd = GetUnitY(Dummy)
if (GetWidgetLife(Dummy) < 0.405) then
call Trig_R_Boom (Dummy,Caster)
call FlushChildHashtable(udg_Hash,i)
call FlushChildHashtable(udg_Hash,StringHash("x"))
call DestroyTimer(timerer)
set Dummy = CreateUnit(GetOwningPlayer(Caster),'u001',xd,yd,0)
call UnitApplyTimedLife(Dummy,'BTLF', 2)
else
set xd=GetUnitX(Dummy)+10*Cos(GetUnitFacing(Dummy)*bj_DEGTORAD)
set yd=GetUnitY(Dummy)+10*Sin(GetUnitFacing(Dummy)*bj_DEGTORAD)
call SetUnitPosition(Dummy,xd,yd)
endif
set Caster = null
set Dummy = null
set timerer = null
endfunction

function Trig_R_Actions takes nothing returns nothing
local unit Caster = GetTriggerUnit()
local real xt = GetSpellTargetX()
local real yt = GetSpellTargetY()
local real xc = GetUnitX(Caster)
local real yc = GetUnitY(Caster)
local real Angle = bj_RADTODEG * Atan2(yt-yc,xt-xc)
local unit Dummy = CreateUnit(GetOwningPlayer(Caster),'u000',xc,yc,Angle)
local timer timerer = CreateTimer()
local integer i = GetHandleId(timerer)
call SetUnitAnimation( Dummy, "Birth" )
call UnitApplyTimedLife(Dummy,'BTLF', 1)
call SaveUnitHandle(udg_Hash,i,3,Dummy)
call SaveUnitHandle(udg_Hash,i,4,Caster)
call SaveInteger(udg_Hash,StringHash("x"),1,GetPlayerId(GetOwningPlayer(Caster)))
call TimerStart(timerer, 0.01, true, function Trig_LOCAL_TimerR)
set Caster = null
set Dummy = null
endfunction
0
7
6 лет назад
0

» WarCraft 3 / ОТРЯДЫ

Hate:
на каждый снаряд делаешь группу, в нее заносишь всех кто был поражен
done
Тогда у меня будет целые две группы в таймере, мне итак горя хватает.
0
7
6 лет назад
0

» WarCraft 3 / ОТРЯДЫ

Итак, видимо мой косяк. Я накладывал бафф с помощью скилла, и из за него была задержка, поэтому повторно юзался скилл, и всё-таки у кого-нибудь есть пример с подобным спеллом?
0
7
6 лет назад
Отредактирован WoLLFeR
0

» WarCraft 3 / Нагрузка карты

Reform, не знаю на сколько быстро работает хэш, но он работает с хэндлами, а если ты потеряешь где-то локалку, или хэндл, значит у тебя образовалась утечка. Точно могу сказать, что с Хэшом можно MUI скиллы делать, основанные на привязке к локальным таймерам, и потом отчистить таблицу. Это быстро и эффективно.
2
7
6 лет назад
2

» WarCraft 3 / Нагрузка карты

Reform, Не плохо подметил, но я бы не сливал все в один триггер, для порядка, но некоторые вещи можно слить в один триггер, например покупка предметов, их рецепты, тоже для порядка, комментариями там отметить, вообще хорошо.
В целом, кол-во триггеров не особо вредит игре, если вредит, заметишь в самом начале игры. Беспокоится лучше о утечках, которые возникают при работе триггеров, локалки обнулять, вместо точек координаты XY использовать, глобалок меньше, Хэш в помощь.