7

» WarCraft 3 / Hash в луа

prog:
Ельнур, ну вот, на примере твоего кода
DataStorage у тебя это глобальная переменная и если ты с тем-же именем объявишь переменную в другом триггере и запишешь туда {}, т.е. новую пустую таблицу, то это затрет значения записанные в первом триггере, старые значения записанные туда раньше потеряются. И наоборот, если такая переменная будет у каждого триггера своя, то и значения внутри будут независимые между триггерами. Ну и самый полезный вариант - использовать одну переменную на несколько триггеров, но записывать туда пустую таблицу только один раз в одном единственном месте - тогда данные из этой таблицы будут доступны в нескольких триггерах.
Далее
local data = { caster = u, target = u1}
Здесь создается новая таблица, в которую записано два значения по ключам "caster" и "target", взятые из переменных u и u1. В хештаблице у тебя это были бы, скорее всего, числовые ключи хештаблицы, а в луа ключи у таблицы могут быть практически чем угодно.
DataStorage[GetHandleId(t1)] = data
А здесь у тебя таблица из переменной data записывается в таблицу DataStorage по хендлу таймера, чтобы потом забрать эту таблицу по тому же хендлу и получать из неё лежащие внутри значения.

а как ее чистить я думаю глобалки не обнуляются сборщиком мусора
Записывать nil по ключу который хочешь обнулить.
Например, вот так
local t = GetExpiredTimer()
DataStorage[GetHandleId(t)] = nil
DestroyTimer(t) -- удалять ненужный таймер обязательно, сборщик мусора может не понять что это мусор
спасибо а можно использовать для всех триггеров один дата стораж ведь там он сохраняет по хендлу значит между собой не будут стакаться...
7

» WarCraft 3 / Hash в луа

а хотя дата стораж же привязан к хендлу таймера так что думаю можно одним обойтись и они не будут перезаписываться если одинаковое название буедт caster target

а как ее чистить я думаю глобалки не обнуляются сборщиком мусора
7

» WarCraft 3 / Hash в луа

prog:
Ну, я же не вижу твой код - это нужно использовать в соответствующем триггере, естественно - пример приведен без всего "лишнего" кода, вроде триггеров и обработки событий - только минимум необходимый чтобы показать работу с таблицами.
do
  local d = InitGlobals -- записываем InitGlobals в переменную
  function InitGlobals() -- заменяем оригинальную InitGlobals своей
       d() -- вызываем оригинальную InitGlobals из переменной
       InitMyTrigger2()
  end
end
do
function InitMyTrigger2()
DataStorage = {} -- глобальная переменная с lua таблицей вместо хештаблицы
function spelleffectr()
local u = GetSpellAbilityUnit()
local u1 = GetSpellTargetUnit()
if GetSpellAbilityId() == FourCC('A002') and GetUnitTypeId(u) == FourCC('Hpal') then
PauseUnit(u,false)
local i = CreateItem(FourCC('I000'),GetUnitX(u),GetUnitY(u))
UnitAddItem(u,i)
local i1 = CreateItem(FourCC('I001'),GetUnitX(u),GetUnitY(u))
UnitAddItem(u,i1)
local t1 = CreateTimer()
local cot1 = timerdistance
TimerStart(t1,0.05,true,cot1)
local data = { caster = u, target = u1}
DataStorage[GetHandleId(t1)] = data
end
end
function timerdistance()
local t = GetExpiredTimer()
local data = DataStorage[GetHandleId(t)]
local u = data.caster
local u1 = data.target
DisplayTimedTextToPlayer(Player(0),0,0,10,GetUnitName(u1))
end
local t = CreateTrigger()
local cot = spelleffectr
local evenk = EVENT_PLAYER_UNIT_SPELL_EFFECT
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t,p0,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p1,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p2,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p3,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p4,evenk,nil)
TriggerAddAction(t,cot)
end
end
смотри если я буду использовать DataStorage для всех триггеров и для всех триггеров напишу напишу caster target они не будут между собой переписываться?
7

» WarCraft 3 / Hash в луа

local u1 = GetCaster() -- нет такой функции, тут должно быть получение кастера
local u2 = GetTarget() -- такой функции тоже нет, тут должно быть получение цели
все работает только скажи имена caster target когда будешь в другом триггере указывать оно не будет между собой стакаться? или надо писать caster1 target1 ...?
или можно для каждого триггера отдельный DataStorage1...2...3... замутить? = {} -- глобальная переменная с lua таблицей вместо хештаблицы
7

» WarCraft 3 / Hash в луа

prog:
DataStorage = {} -- глобальная переменная с lua таблицей вместо хештаблицы

------

local t = CreateTimer()
local u1 = GetCaster() -- нет такой функции, тут должно быть получение кастера
local u2 = GetTarget() -- такой функции тоже нет, тут должно быть получение цели
local data = { caster = u1, target = u2}
DataStorage[GetHandleId(t)] = data

----

local t = GetExpiredTimer()  -- не помню есть ли такая функция, тут должно быть получение таймера
local data = DataStorage[GetHandleId(t)]
local u1 = data.caster
local u2 = data.target
Кому нужен хеш, когда можно сделать так?
вместо caster и таргета писать GetSpellAbilityUnit(), GetSpellTargetUnit()?
7

» WarCraft 3 / Hash в луа

quq_CCCP:
Ельнур, а зачем тебе вовсе все это надо, если даже жасс сложно, мб гуи, простенькие дамми касты и все такое. конфетные войны, замок скиби - годные карты сделанные на гуи. Будет пахать на всех версиях в придачу.
да джасс легок не пойму зачем они луа прикрепили

локалки так же работают например если ты поставишь do
function trigger
local
function timer
здесь local не рабоатет обьявленная в trigger хотя мне говорили обратное, но все равно радует то что обнулении нет и код быстрее будет
end

хеш прекрасно работает думаю только хеш буду чистить и код быстрее буде тписаться))

думаю сборщик мусоа не умеет чистить хеш таблицы хаха)
7

» WarCraft 3 / Hash в луа

Steal nerves:
Ельнур, тебе нужны многомерные массивы? я правильно понимаю? посмотри в инете как на луа пишут
мне нужен таймер внутри который сохранены кастер и таргет чтобы проверять дистанцию
и ордер кастера чтобы прерывать
  1. Безжалостный рывок. Дальность применения 800. кд 15 сек.
Бежит в цель на максимальной скорости (522), при столновении наносит (Сила х 3 (вкл бонусы) урона) и получает 33% от макс значения Адреналина (маны).
7

» WarCraft 3 / Hash в луа

Steal nerves:
Ельнур, я просто предложил. в LUA ты уже лучше меня понимаешь, тк на нем уже сидишь. Возможно есть какие то там способы
я нихера не понимаю я пишу как в джассе и стираю все ненужные endif endfunction и не обнуляю)) думаю первая карты выйдет кпц лаганным, и еще для каждой свистелки свои триггеры а не общий раньше для всех способностей один триггер)), а сейчас для каждой отдельный без кондишенов с ифами....
7

» WarCraft 3 / Hash в луа

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

Steal nerves:
можно, но возможен такой вариант
нихера не понял) если можно старый простой понятный вариант то его сделаю( если сделается)
7

» WarCraft 3 / Hash в луа

prog:
Можно, но не нужно.
я полный нуль в луа и это выглядит лучше для меня чем кложур) и примеров кложур ноль
7

» WarCraft 3 / конверт ордер defend в луа

тему пора закрывать добавил ему изначально в ро бонус к броне с 2 уровнями работает
if GetIssuedOrderId() == 852055 and GetUnitTypeId(u) == FourCC('Hpal') then
DisplayTimedTextToPlayer(Player(0),0,0,10,"order")
SetUnitAbilityLevel(u,FourCC('AId0'),2)
end
if GetIssuedOrderId() == 852056 and GetUnitTypeId(u) == FourCC('Hpal') then
SetUnitAbilityLevel(u,FourCC('AId0'),1)
end
7

» WarCraft 3 / конверт ордер defend в луа

quq_CCCP:
Ельнур, быть может 'Ald0'?
В гуях укажи эту абилку, а потом конвертни в код скопируй рокод абилки.

prog, тут тоже кстати не тот луа, о котором все говорят. Но пока инфы на понятном языке нет (китайцы только), спорить с вами не буду.
call UnitAddAbilityBJ( 'AId0', GetTriggerUnit() )

да это не луа но можно запомнить его ифы как функции пишутся и когда варик окончательно сдохнет чуть легче будет перейти в тот же роблокс или дота 2 это как с джассом если ты его не знаешь то ты не можешь писать в луа варкрафт) ну и + это не нужно обнулять
7

» WarCraft 3 / конверт ордер defend в луа

там было 3 sss просто )) GEtisssued orderid
if GetIssuedOrderId() == 852055 and GetUnitTypeId(u) == FourCC('Hpal') then
UnitAddAbiliy(u,FourCC('Aid0'))
end
if GetIssuedOrderId() == 852056 and GetUnitTypeId(u) == FourCC('Hpal') then
UnitRemoveAbiliy(u,FourCC('Aid0'))
end
дебаг высвечивает но абилка не добавляется пробовал два варианта с AId0 и Aid0

даже рпробовал вместо ' > " все равно не добавляет
7

» WarCraft 3 / конверт ордер defend в луа

TheMilka:
Ельнур:
BJDebugMsg(GetUnitName(GetOrderedUnit()) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
прикинь ничего не может прочитать евент
в смысле?
ну триггер не робит хотя все правильно создано
do
  local c = InitGlobals -- записываем InitGlobals в переменную
  function InitGlobals() -- заменяем оригинальную InitGlobals своей
       c() -- вызываем оригинальную InitGlobals из переменной
       InitMyTrigger1()
  end
end
do
function InitMyTrigger1()
function razboinikorder()
local u = GetOrderedUnit()
DisplayTimedTextToPlayer(Player(0),0,0,10,GetUnitName(u) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
DisplayTimedTextToPlayer(Player(0),0,0,10,"order")
end
local t5 = CreateTrigger()
local cot5 = razboinikorder
local evenk5 = EVENT_PLAYER_UNIT_ISSUED_ORDER
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t5,p0,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p1,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p2,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p3,evenk5,nil)
TriggerRegisterPlayerUnitEvent(t5,p4,evenk5,nil)
TriggerAddAction(t5,cot5)
end
end
ошибочка, триггер робит если я удалю твою строку DisplayTimedTextToPlayer(Player(0),0,0,10,GetUnitName(u) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
7

» WarCraft 3 / конверт ордер defend в луа

BJDebugMsg(GetUnitName(GetOrderedUnit()) + " выполняет приказ "+I2S(GetIsssuedOrderId()))
прикинь ничего не может прочитать евент
7

» WarCraft 3 / конверт ордер defend в луа

prog:
а ссылки на функции тем более.
Иногда есть смысл выносить функции в локальные переменные, но только когда они используются много раз в одном месте - доступ к локалкам быстрее доступа к глобалкам.

FourCC('ORDER_defend')
FourCC работает только с 4-символьными равкодами, пытаться подсунуть ему приказ смысла нет.
да это после много попыток пытался так проверить)) все равно не робит
7

» WarCraft 3 / конверт ордер defend в луа

TheMilka:
Ельнур:
TheMilka:
Ельнур:
852055
не робит if GetUnitTypeId(u) == FourCC('Hpal') and GetIsssuedOrderId() == 852055 then
Значит у тебя неправильное событие.

local t = CreateTrigger()
local cot = razboinikorder
local evenk = EVENT_PLAYER_UNIT_ISSUED_ORDER
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t,p0,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p1,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p2,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p3,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p4,evenk,nil)
TriggerAddAction(t,cot)
Ты совершенно неправильно строишь свой код. Не нужно выносить в переменные константы, созданные самой игрой, а ссылки на функции тем более.
Твой код становится ужасным, а твоё мышление тупится, как от резки ножиком для еды каменных булыжников.
GetUnitTypeId(u) == FourCC('Hpal') - Что за переменная 'u' ?
do
  local c = InitGlobals -- записываем InitGlobals в переменную
  function InitGlobals() -- заменяем оригинальную InitGlobals своей
       c() -- вызываем оригинальную InitGlobals из переменной
       InitMyTrigger1()
  end
end
do
function InitMyTrigger1()
function razboinikorder()
local u = GetOrderedUnit()
if GetUnitTypeId(u) == FourCC('Hpal') and GetIsssuedOrderId() == FourCC('ORDER_defend')  then
DisplayTimedTextToPlayer(Player(0),0,0,10,"order")
end
end
7

» WarCraft 3 / конверт ордер defend в луа

TheMilka:
Ельнур:
852055
не робит if GetUnitTypeId(u) == FourCC('Hpal') and GetIsssuedOrderId() == 852055 then
Значит у тебя неправильное событие.

local t = CreateTrigger()
local cot = razboinikorder
local evenk = EVENT_PLAYER_UNIT_ISSUED_ORDER
local p0 = Player(0)
local p1 = Player(1)
local p2 = Player(2)
local p3 = Player(3)
local p4 = Player(4)
TriggerRegisterPlayerUnitEvent(t,p0,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p1,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p2,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p3,evenk,nil)
TriggerRegisterPlayerUnitEvent(t,p4,evenk,nil)
TriggerAddAction(t,cot)
7

» WarCraft 3 / ифы и булекспры в луа

noyl:
У тебя просто каша какая-то, скажи что делает скилл.
Адреналин (пассивная) Расположение X 2 Y 1
Воитель не использует ману для способностей, вместо неё у него есть отдельный ресурс Адреналин, он показан в мпбаре.
Механика: его мп постоянно снижается на 2% от макс значения в секунду. Каждый раз, когда Воитель получает урон, он получает 5% от макс значения мп. Каждая атака воителя снижает его мп на 5% от ТЕКУЩЕГО значения, переводя эти 5% в дополнительный урон от атаки. Кроме того боевые способности так же расходуют этот ресурс для нанесения дополнительного урона.

      if GetUnitState(u,life) > 0.405 and GetUnitTypeId(u) == FourCC('Hpal') and GetUnitAbilityLevel(u,FourCC('A000')) > 0  then -- условия для перебора
работает спасибо
7

» WarCraft 3 / ифы не работают в damaging event lua

noyl:
Ельнур:
pro100master:
помилуй ельнура но карать варном
ифы не работают а без ифов дебаг высвечивает

кратко чтобы поняли
DisplayTimedTextToPlayer(Player(0),0,0,10,"NoIf")
if GetUnitTypeId(u1) == 'Hpal' and GetUnitAbilityLevel(u1,'A000') > 0 then
SetUnitState(u1,mana,GetUnitState(u1,maxmana)+GetUnitState(u1,maxmana)*RMaxBJ(0,5)*0.01)
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaged")
end
if GetUnitTypeId(u2) == 'Hpal' and GetUnitAbilityLevel(u2,'A000') > 0 then
SetUnitState(u2,mana,GetUnitState(u2,mana)-GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01)
BlzSetEventDamage(GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01+BlzGetEventDamage())
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaging")
end
высвечивает ноиф а остальное нет

крч вывод ифы и булеаны нигде не работают а без них все прекрасно рабоатет
Как if'ы могут не работать?
если бы работал дебаг высветился бы
1 пункт от ivanbakavan: 10.3 (ответ на вопрос есть в статьях) сделал два одинаковых вопроса подряд https://xgm.guru/p/wc3/245070
7

» WarCraft 3 / boolexpr не работает в луа

ScorpioT1000:
да, триггер в main создается? если нет, то предлагаю
вместо
local t = CreateTrigger()
обявить уникально глобальное имя типа
triggerSpellAdrenalin = CreateTrigger()
пробовал как и в .wct так и в .j один и тот же результат

сделал глобальной тот же результат

крч ребята я не понял но эт сработало InitGlobals мешает как то... что ли, стало работать
do
  local f = InitGlobals -- записываем InitGlobals в переменную
  function InitGlobals() -- заменяем оригинальную InitGlobals своей
       f() -- вызываем оригинальную InitGlobals из переменной
       InitMyTrigger()
  end

end
function InitMyTrigger()
function adrenalinremovemana()
DisplayTimedTextToPlayer(Player(0),0,0,10,"group")
local u = GetEnumUnit()
local mana = UNIT_STATE_MANA
local maxmana = UNIT_STATE_MAX_MANA
SetUnitState(u,mana,GetUnitState(u,maxmana)-GetUnitState(u,maxmana)*RMaxBJ(0,2)*0.01)
end
function Condition(unittypeadrenalin)
return GetUnitTypeId(GetFilterUnit()) == 'Hpal' and GetUnitAbilityLevel(GetFilterUnit(),'A000') > 0
end
function AdrenalinSeconds()
DisplayTimedTextToPlayer(Player(0),0,0,10,"seconds")
local r = Rect(-544.0, -864.0, -320.0, -640.0)
local filterr = unittypeadrenalin
local cot1 = adrenalinremovemana
local g = CreateGroup()
GroupEnumUnitsInRect(g, r, filterr)
ForGroup(g,cot1)
end
local t = CreateTrigger()
local cot = AdrenalinSeconds
TriggerRegisterTimerEvent(t,1.00,true)
TriggerAddAction(t, cot)
end

крч вывод ифы и булеаны нигде не работают а без них все прекрасно рабоатет
Загруженные файлы
7

» WarCraft 3 / ифы не работают в damaging event lua

pro100master:
помилуй ельнура но карать варном
ифы не работают а без ифов дебаг высвечивает

кратко чтобы поняли
DisplayTimedTextToPlayer(Player(0),0,0,10,"NoIf")
if GetUnitTypeId(u1) == 'Hpal' and GetUnitAbilityLevel(u1,'A000') > 0 then
SetUnitState(u1,mana,GetUnitState(u1,maxmana)+GetUnitState(u1,maxmana)*RMaxBJ(0,5)*0.01)
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaged")
end
if GetUnitTypeId(u2) == 'Hpal' and GetUnitAbilityLevel(u2,'A000') > 0 then
SetUnitState(u2,mana,GetUnitState(u2,mana)-GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01)
BlzSetEventDamage(GetUnitState(u2,mana)*RMaxBJ(0,5)*0.01+BlzGetEventDamage())
DisplayTimedTextToPlayer(Player(0),0,0,10,"Damaging")
end
высвечивает ноиф а остальное нет

крч вывод ифы и булеаны нигде не работают а без них все прекрасно рабоатет
7

» WarCraft 3 / ифы не работают в damaging event lua

pro100master:
помилуй ельнура но карать варном
пчм они не работают ведь все правильно а если их убрать то дебаг высветится но получится кривой скилл который по два раза будет действовать