33

» WarCraft 3 / Переделка кода на Lua

Как сложно... к этому в пту меня не готовили
но вроде понял, спасибо ещё раз
думаю мне достаточно писать nil по хендлу, это ближайший аналог к FlushChildHashatable
надо ковырять, в любом случае не плохо для первого дня знакомства с lua, я очень доволен, весьма удобно
33

» WarCraft 3 / Переделка кода на Lua

prog, так, тока я не понял как чистить, смотрю в твой код и вижу фигу, мне нужно будет в каждую ячейку таблицы записать nill ?
А вот наверное понял
function CleanUp.OnDeath()
  local unit u = GetTriggerUnit()
  local id = GetHandleId(u)
 ** for n,h in ipairs(CleanUp.DeathHandlers) do h(u,id) end**
end
а как это для меня в минимальном варианте будет выглядеть?
33

» WarCraft 3 / Переделка кода на Lua

а вот это ?
  if (data==nil) then data = {} HandleData[GetHandleId(u)] = data end
Чтобы повторно не создавать запись для юнита, а извлечь текущую?
prog, просто я раньше начал писать чем ты отправил и я не видел твоего того сообщения =)
33

» WarCraft 3 / Переделка кода на Lua

гарантии что это будет работать и не будет вызывать десинки т.к. сборщику мусора синхронизация не указ
я конечно лишь примерно представляю как это всё работает, но скорее всего не должно быть десинхов, если данные не использются больше, вроде бы как даже это логично, но будет десинх, если кривым кодом куда-то не туда обратится и попытаться получить какие либо данные
Такс, prog, не получается =(
HandleData={}
gforce=CreateGroup()

function ForceUnit (u,a,d,s,flag)
    print("start")
GroupAddUnit(gforce, u)
local datan = HandleData[GetHandleId(u)]
datan.a = a
datan.d = d
datan.s = s
datan.flag = flag
end


TimerStart(CreateTimer(), 0.04, true, function()
ForGroup(gforce, function()
local u=GetEnumUnit()
local h=GetHandleId(u)
local data = HandleData[h]
local a=data.a
local d=data.d
local s=data.s
local flag=data.flag
print("period")
Дебага с надписью период нет, значит даже таймер не стартует =(
33

» WarCraft 3 / Переделка кода на Lua

prog, ну да, через точку писать более удобней, чем через [скобочки], но мне можно себе такой вариант забрать или надо ещё что-то дополнительно записать?
пошёл пробовать
prog:
Сборщик сам не настолько крут, поэтому у меня там есть функции Purge и Reset для сноса данных из таблицы, а также целая либа CleanUp для перехвата смертей и удаления юнита, на которую либа хранения данных вешает свой хук в котором и подчищаются данные для таких юнитов.
Это печально, новые костыли, а я уже обрадовался, что ничего обнулять и чистить не нужно =(
33

» WarCraft 3 / Удаление 6 лет работы с сайта, авторское право.

Ну вы-то все за, пока халявой пахнет
это же Россия, детка
Прикольно будет видеть блокировку карт, в которые и так никто не играет, но могло бы сыграть человека 3 =)
33

» WarCraft 3 / Переделка кода на Lua

prog, в любом случае свой вариант я хотя бы понимаю и это его главный плюс, но в понял тебя, можно же сделать многомерный массив
prog:
одна таблица в которой внутри по таблице на каждый хендл
Насчет удобства я пока не могу оценить ибо вообще ничего не понимаю, что происходит, но очищать ничего не надо? юнит умер, его записи остались в таблице, сборщик мусора все сделает?
тот самый сборщик о котором все говорят?
33

» WarCraft 3 / Переделка кода на Lua

prog, спасибо сам тоже только что до этого дошёл, даже всё работает
prog:
1 - массив-таблица с индексами по хендлу и еще одной таблицей в качестве значений
примерно так сделал:
------ новая толкалка
do
af={}
df={}
sf={}
flagf={}
gforce=CreateGroup()

function ForceUnit (u,a,d,s,flag)
GroupAddUnit(gforce, u)
af[GetHandleId(u)]=a
df[GetHandleId(u)]=d
sf[GetHandleId(u)]=s
flagf[GetHandleId(u)]=flag
end


TimerStart(CreateTimer(), 0.04, true, function()
ForGroup(gforce, function()
local u=GetEnumUnit()
local h=GetHandleId(u)
local a=af[h]
local d=df[h]
local s=sf[h]
local flag=flagf[h]
--action
local x=GetUnitX(u)
local y=GetUnitY(u)


df[h]=d-s
--Условия прекращения движения
if d <= 0 or Out(MoveX(x , s * 2 , a) , MoveY(y , s * 2 , a)) == false or IsUnitDeadBJ(u) then --or GetPointZ(x , y) <= GetPointZ(MoveX(x , s * 2 , a) , MoveY(y , s * 2 , a)) - 30
 GroupRemoveUnit(gforce, u)
if flag==0 then
KillUnit(u)
end
end 

-- движение выполняется всегда за исключением условий прекращения движения
SetUnitX(u, MoveX(x , s , a))
SetUnitY(u, MoveY(y , s , a))



---------
end)--group    
end)--timer
end
33

» WarCraft 3 / Отлов урона на 131 PTR

prog, а например имунные к магии или физическому урону, будут ли зарегистрированны в событии?
33

» WarCraft 3 / Удаление 6 лет работы с сайта, авторское право.

мы то все за, но хайвовцы начнут написывать нашей администрации с просьбой удалить контент
33

» WarCraft 3 / Самый производительный Bullet Hell

Кароче еще способ:
Движение: через создание и движение юнита-снаряда (приказ мув)
Столкновение: через детект урона жара
код луа
//! beginusercode

--какие то общие функции
function MoveX (x,  Dist,  Angle)
    return x+Dist*Cos(Angle*0.0175)
end
function MoveY (x,  Dist,  Angle)
    return x+Dist*Sin(Angle*0.0175)
end
function AbilityId(id)
    return id:byte(1) * 0x1000000 + id:byte(2) * 0x10000 + id:byte(3) * 0x100 + id:byte(4)
end
--триггер запуска снарядов (примитивный)
MissleClick = CreateTrigger()
for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
     TriggerRegisterPlayerMouseEventBJ(MissleClick, Player(i), bj_MOUSEEVENTTYPE_DOWN)
end
TriggerAddCondition(MissleClick, Condition(function() return BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_RIGHT end))
TriggerAddAction(MissleClick, function()
-- весь код экшена
local u=udg_Butcher
local mx=BlzGetTriggerPlayerMouseX()
local my=BlzGetTriggerPlayerMouseY()
local x=GetUnitX(u)
local y=GetUnitY(u)
local a=bj_RADTODEG*Atan2(my - y, mx - x)
--print(a)
local unit ud=CreateUnit(GetOwningPlayer(u), AbilityId('e000'), MoveX(x,30,a) ,MoveY(y,30,a) , a)

local nx=MoveX(x,2500,a)
local ny=MoveY(y,2500,a)
IssuePointOrder(ud, "move", nx, ny)

end)

-- триггер отлова урона через жар


gg_trg_DamageEvent = CreateTrigger(  )
for i = 0, bj_MAX_PLAYER_SLOTS - 1, 1 do
    TriggerRegisterPlayerUnitEvent(gg_trg_DamageEvent, Player(i), EVENT_PLAYER_UNIT_DAMAGING)
end
TriggerAddCondition( gg_trg_DamageEvent, Condition( function () return  BlzGetEventAttackType( ) == ConvertAttackType( 0 ) and  BlzGetEventDamageType( ) == ConvertDamageType( 8 ) and  BlzGetEventWeaponType( ) == ConvertWeaponType( 0 ) end))
TriggerAddAction( gg_trg_DamageEvent, function ()
BlzSetEventDamage(300)
KillUnit(GetEventDamageSource())
--print("урон от жара")

    end)
     

//! endusercode
Как же их колбасит, система дефолтного движения вызывает дикие дёрганья и неадекватность (но я её и не рассматривал, просто решил проверить на новом патче)
гифка
Загруженные файлы
33

» WarCraft 3 / Heart of Tides

Цитата: "автор не смог найти и засунуть нормальные музыкальные темы для наг", так автор не ты? или о себе в 3 лице говоришь? а что за проблема с музыкой то, 13 лет у меня получилось заменить музыкальное оформление xgm.guru/p/wc3/nagaai, если надо ИИ можешь взять себе и переработать под свою расу, если ИИ конечно нету
А ещё нужен хоть 1 полный игровой скрин, а не только из редактора
33

» WarCraft 3 / Отлов урона на 131 PTR

PrincePhoenix, но сути это не меняет... или я при событии DAMAGING могу сделать, GeteventDamage()=МОЁ ЧИСЛО?
33

» WarCraft 3 / Отлов урона на 131 PTR

prog, я готов к перевариванию этой информации
Событие нашёл, оно там рядом, а где менять урон то? в условии? в действии то точно урон уже нанёсся...
ммм?
33

» WarCraft 3 / [lua] Математические функции

По моему с атан2 что-то не так, возвращает число от -3 до 3 вместо 0-360 градусов
в jass формуле ещё какой-то bj_RADTODEG*atan2, вроде равен какой-то мелочи типа 0.0175, но всё равно угол не вернёт
Подставил bj_RADTODEG, всё заработало =)
33

» WarCraft 3 / Заклинание: Вихрь Иллюзий

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

» WarCraft 3 / Иконки героев союзников слева

Принятый ответ
Чтобы смотреть состояние способностей, как в 1 доте нужен дотахелпер, мемхак и AllySkillViewer. и не управлять....
А чтобы героя появились слева и ими управлять, это полный триггерный контроль, смотри на гуи в категории игрок => установка союза
33

» WarCraft 3 / Самый производительный Bullet Hell

PT153, почти нет =) группу же лучше глобальную одну и туже 1 раз создать и просто наполнять её, уж локальная группа точно лишнее
33

» WarCraft 3 / Самый производительный Bullet Hell

e==null - условие выхода из цикла, значит группа пуста, иначе он будет бесконечно гонять loop , что вызовет дикий лаг на пару секунд
33

» WarCraft 3 / Самый производительный Bullet Hell

а мы не будет использовать урон и вешать какой либо бафф, важен лишь факт соприкосновения, первый тик, после этого дамми снаряд будет уничтожен
DracoL1ch, но ведь если в фильтре гонять будет бытрее?
лично я использую да тот самый
loop-firstOfGroup
call GroupEnumUnitsInRange(perebor,x,y,80,null)
loop  
set e=FirstOfGroup(perebor)
exitwhen e==null 

//ACTIONS

call GroupRemoveUnit(perebor,e)
set e=null
endloop
DracoL1ch, не помню чтобы балиста била насквозь =(, но это бы очень подошло
quq_CCCP:
Юнитов в качестве снарядов лучше не юзать, большая нагрузка на движок. Юзайте даммика который стреляет по площади или по цели.
точно не подойдёт, визуально может быть и да, но с таким снарядом не столкнуться заранее
33

» WarCraft 3 / Самый производительный Bullet Hell

JackFastGame, это и собираемся выяснить, ещё не тестировалось особо, но жар перебирает юнитов движком игры, а не таймером+группой
Maniac_91, точно я забыл просто как называется =)