Как сложно... к этому в пту меня не готовили
но вроде понял, спасибо ещё раз
думаю мне достаточно писать nil по хендлу, это ближайший аналог к FlushChildHashatable
надо ковырять, в любом случае не плохо для первого дня знакомства с lua, я очень доволен, весьма удобно
if (data==nil) then data = {} HandleData[GetHandleId(u)] = data end
Чтобы повторно не создавать запись для юнита, а извлечь текущую? prog, просто я раньше начал писать чем ты отправил и я не видел твоего того сообщения =)
гарантии что это будет работать и не будет вызывать десинки т.к. сборщику мусора синхронизация не указ
я конечно лишь примерно представляю как это всё работает, но скорее всего не должно быть десинхов, если данные не использются больше, вроде бы как даже это логично, но будет десинх, если кривым кодом куда-то не туда обратится и попытаться получить какие либо данные
Такс, 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")
Дебага с надписью период нет, значит даже таймер не стартует =(
prog, ну да, через точку писать более удобней, чем через [скобочки], но мне можно себе такой вариант забрать или надо ещё что-то дополнительно записать? пошёл пробовать prog:
Сборщик сам не настолько крут, поэтому у меня там есть функции Purge и Reset для сноса данных из таблицы, а также целая либа CleanUp для перехвата смертей и удаления юнита, на которую либа хранения данных вешает свой хук в котором и подчищаются данные для таких юнитов.
Это печально, новые костыли, а я уже обрадовался, что ничего обнулять и чистить не нужно =(
prog, в любом случае свой вариант я хотя бы понимаю и это его главный плюс, но в понял тебя, можно же сделать многомерный массив prog:
одна таблица в которой внутри по таблице на каждый хендл
Насчет удобства я пока не могу оценить ибо вообще ничего не понимаю, что происходит, но очищать ничего не надо? юнит умер, его записи остались в таблице, сборщик мусора все сделает? тот самый сборщик о котором все говорят?
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
Кароче еще способ:
Движение: через создание и движение юнита-снаряда (приказ мув)
Столкновение: через детект урона жара
код луа
//! 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
Как же их колбасит, система дефолтного движения вызывает дикие дёрганья и неадекватность (но я её и не рассматривал, просто решил проверить на новом патче)
Цитата: "автор не смог найти и засунуть нормальные музыкальные темы для наг", так автор не ты? или о себе в 3 лице говоришь? а что за проблема с музыкой то, 13 лет у меня получилось заменить музыкальное оформление xgm.guru/p/wc3/nagaai, если надо ИИ можешь взять себе и переработать под свою расу, если ИИ конечно нету
А ещё нужен хоть 1 полный игровой скрин, а не только из редактора
prog, я готов к перевариванию этой информации
Событие нашёл, оно там рядом, а где менять урон то? в условии? в действии то точно урон уже нанёсся...
ммм?
По моему с атан2 что-то не так, возвращает число от -3 до 3 вместо 0-360 градусов
в jass формуле ещё какой-то bj_RADTODEG*atan2, вроде равен какой-то мелочи типа 0.0175, но всё равно угол не вернёт
Подставил bj_RADTODEG, всё заработало =)
Чтобы смотреть состояние способностей, как в 1 доте нужен дотахелпер, мемхак и AllySkillViewer. и не управлять....
А чтобы героя появились слева и ими управлять, это полный триггерный контроль, смотри на гуи в категории игрок => установка союза
а мы не будет использовать урон и вешать какой либо бафф, важен лишь факт соприкосновения, первый тик, после этого дамми снаряд будет уничтожен 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:
Юнитов в качестве снарядов лучше не юзать, большая нагрузка на движок. Юзайте даммика который стреляет по площади или по цели.
точно не подойдёт, визуально может быть и да, но с таким снарядом не столкнуться заранее
JackFastGame, это и собираемся выяснить, ещё не тестировалось особо, но жар перебирает юнитов движком игры, а не таймером+группой Maniac_91, точно я забыл просто как называется =)
» WarCraft 3 / Переделка кода на Lua
но вроде понял, спасибо ещё раз
думаю мне достаточно писать nil по хендлу, это ближайший аналог к FlushChildHashatable
надо ковырять, в любом случае не плохо для первого дня знакомства с lua, я очень доволен, весьма удобно
» WarCraft 3 / Переделка кода на Lua
А вот наверное понял
» WarCraft 3 / Переделка кода на Lua
» WarCraft 3 / Переделка кода на Lua
prog, просто я раньше начал писать чем ты отправил и я не видел твоего того сообщения =)
» WarCraft 3 / Переделка кода на Lua
Такс, prog, не получается =(
» WarCraft 3 / Переделка кода на Lua
пошёл пробовать
prog:
» WarCraft 3 / Удаление 6 лет работы с сайта, авторское право.
Прикольно будет видеть блокировку карт, в которые и так никто не играет, но могло бы сыграть человека 3 =)
» WarCraft 3 / Переделка кода на Lua
prog:
тот самый сборщик о котором все говорят?
» WarCraft 3 / Переделка кода на Lua
prog:
» WarCraft 3 / Отлов урона на 131 PTR
» WarCraft 3 / Удаление 6 лет работы с сайта, авторское право.
» WarCraft 3 / Самый производительный Bullet Hell
Движение: через создание и движение юнита-снаряда (приказ мув)
Столкновение: через детект урона жара
» WarCraft 3 / Heart of Tides
А ещё нужен хоть 1 полный игровой скрин, а не только из редактора
Ред. Берги
» WarCraft 3 / Отлов урона на 131 PTR
BlzSetEventDamage(NewDamage)
» WarCraft 3 / Отлов урона на 131 PTR
» WarCraft 3 / Отлов урона на 131 PTR
Событие нашёл, оно там рядом, а где менять урон то? в условии? в действии то точно урон уже нанёсся...
ммм?
Ред. Берги
» WarCraft 3 / [lua] Математические функции
в jass формуле ещё какой-то bj_RADTODEG*atan2, вроде равен какой-то мелочи типа 0.0175, но всё равно угол не вернёт
Подставил bj_RADTODEG, всё заработало =)
» WarCraft 3 / Заклинание: Вихрь Иллюзий
» WarCraft 3 / Заклинание: Вихрь Иллюзий
» WarCraft 3 / Иконки героев союзников слева
А чтобы героя появились слева и ими управлять, это полный триггерный контроль, смотри на гуи в категории игрок => установка союза
» WarCraft 3 / Самый производительный Bullet Hell
» WarCraft 3 / Самый производительный Bullet Hell
PT153, а то, случайно попало =)
» WarCraft 3 / Самый производительный Bullet Hell
» WarCraft 3 / Самый производительный Bullet Hell
DracoL1ch, но ведь если в фильтре гонять будет бытрее?
лично я использую да тот самый
quq_CCCP:
» WarCraft 3 / Самый производительный Bullet Hell
Maniac_91, точно я забыл просто как называется =)