Ломаю голову: хочу сделать так, чтоб в зону входил юнит, и выводился на экран в типе string, к примеру, ID этого юнита(не ID типа юнита, а ID юнита!). Не знаю, как к нему обратиться. И я не понял, в каком типе данных оно хранится. Как я понял - integer. На скринах просто показано, как по дефолту работает отображение уровня юнита при входе в зону. Думаю, должно быть похоже чем-то. Если тема заезженная, подскажите, где искать плз.
screen0 - на триггерах(с конвертированием to string).
screen1 - просто конвертировал в текст на jass. Утечки не устранял.

Принятый ответ

Мне в итоге неоткуда брать этот h - ключ, по которому я всё записал...
Это будет юнит, которого атаковали т.е. GetTriggerUnit(). Вся задача шаринга между несколькими триггерами в том, чтобы определить какие данные между этими триггерами у нас уже есть общие и отталкиваясь от них записать другие данные в хеш. В данном случае мы вешаем данные на GetSpellAbilityUnit() и загружаем по GetTriggerUnit(). Самого кастера, как я понимаю, здесь записывать никуда не нужно.
А некоторым комментаторам советую постыдиться, редкий случай, когда человек сам что-то пытается понять и пробует что-то делать, а вам лишь бы эго потешить.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
30
5 лет назад
1
И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
Учитывая обилие custom script в триггерах, тебе будет проще работать с твоим кодом, если ты его конвертируешь в Jass напрямую.

Вообще пользоваться GUI и не переходить на нормальное представление кода есть смысл только если ты вообще не знаешь ничего о программировании и не планируешь узнавать, например, если ты чисто моделлер или ландшафтер.
0
11
5 лет назад
Отредактирован PT153
0
SaveUnitHandle(mytable, GetHandleId(caster), 0, target)
Я только не понимаю: 0 - это значение, с которым мы сохраняем кастера? А если кастеров много, они все будут записываться в значение 0?
Конфликтовать не будут, так как мы сохраняем пары id конкретного кастера + значение - 0. И когда мы достаём кастера из значения 0, как таблица понимает, какои id у этого кастера? Если все кастеры будут со значением 0...
Clamp:
И желательно переписать с триггеров на Jass, а я не особо шарю, позавчера начал делать.
Учитывая обилие custom script в триггерах, тебе будет проще работать с твоим кодом, если ты его конвертируешь в Jass напрямую.

Вообще пользоваться GUI и не переходить на нормальное представление кода есть смысл только если ты вообще не знаешь ничего о программировании и не планируешь узнавать, например, если ты чисто моделлер или ландшафтер.
Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
DopaMine:
Я немного представляю. Поэтому и понимаю логику локальных переменных, и понимаю, почему у меня не работает для нескольких кастеров. Но с хэш-таблицами пока не понял, как это: значение кастера всегда 0, но когда мы загружаем кастера по значению 0, таблица понимает, какого кастера я загружаю. Как это? Ключ одинаков для всех кастеров, получается. Я прав?
А, мы загружаем тоже по паре ключиков, ясно. СПАСИБО ВСЕМ!
1
29
5 лет назад
Отредактирован Doc
1
Да, все так. Второй ключ нужен на случай конфликта первичных ключей, т.е. когда хочется хранить больше данных по одному хендлу.
Я тут соглашусь, что с кастом скриптом будет сложновато, т.к. уже пойдут условия и т.д. и лучше попробовать все это уже чистым текстом выразить.
0
11
5 лет назад
0
Doc:
Да, все так. Второй ключ нужен на случай конфликта первичных ключей, т.е. когда хочется хранить больше данных по одному хендлу.
Я тут соглашусь, что с кастом скриптом будет сложновато, т.к. уже пойдут условия и т.д. и лучше попробовать все это уже чистым текстом выразить.
Хорошо, спасибо! А вы писАли, что нужно проверять, есть ли что-то в хэш таблице, это надо запрашивать пару? Не знаю, как логически это будет,
function ProverkaHesha takes nothing returns boolean
return GetВТаблицеСодержитсяЧто-то() == "mytable, GetHandleId(caster), 0, target"
endfinction
Так по логике? И что тогда за Get должен быть? Или я вообще не понял:DDD
1
27
5 лет назад
1
вот проверка тема
проверка хэндла
native HaveSavedHandle takes hashtable table, integer parentKey, integer childKey returns boolean
проверка числа integer или real проверяем условием A>0
обычно изначально в ячейках если ничего не записано, то вернет 0 или null
0
11
5 лет назад
0
Steal nerves:
вот проверка тема
проверка хэндла
native HaveSavedHandle takes hashtable table, integer parentKey, integer childKey returns boolean
проверка числа integer или real проверяем условием A>0
обычно изначально в ячейках если ничего не записано, то вернет 0 или null
Хмм...( А как это именно внутри функции с условием
написать? И что такое число A?
0
27
5 лет назад
Отредактирован MpW
0
Я только не понимаю: 0 - это значение, с которым мы сохраняем кастера? А если кастеров много, они все будут записываться в значение 0?
parentKey - родительский ключ
childKey - младший ключ
ты похоже не понимаешь как работает. хэндл у объектов разный, это просто счетчик объектов. например, создается первый футман ему перечисляют номер 1000 (1000-это условно, просто handle берет большие значения), спавнится второй футман он имеет номер 1001, создается третий футман 1002, создается стрелок 1003, декор 1004 итд. короче у разных кастеров не мб конфликта тк хэндлы разные
конфликты могут быть в коде, если старший и младший ключи совпадают. например 2 разных триггера, короче 2 абилки. Но имеют одинаковые ключи (первый: handle,0 второй: handle,0. Может произойти так что в одном триггере сохранишь, а в каком-нибудь втором из них перезапишешь данные. надо во втором триггере изменить младший ключ. изменить во втором во так: handle,1 - будет совсем другая ячейка)
А как это именно внутри функции с условием написать?
На гуи есть готовое решение. В разделе Boolean => HaveSavedHandle
И что такое число A?
Ну можно числа загружать из хэша
LoadInteger(Hash,id,0)>0 //в разделе integer
LoadReal(Hash,id,0)>0 //в разделе real

Кстати есть вот такая готовая функция BJ, в разделе boolean. не знал что есть
функция
function HaveSavedValue takes integer key, integer valueType, integer missionKey, hashtable table returns boolean
    if (valueType == bj_HASHTABLE_BOOLEAN) then
        return HaveSavedBoolean(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_INTEGER) then
        return HaveSavedInteger(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_REAL) then
        return HaveSavedReal(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_STRING) then
        return HaveSavedString(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_HANDLE) then
        return HaveSavedHandle(table, missionKey, key)
    else
        // Unrecognized value type - ignore the request.
        return false
    endif
endfunction
0
11
5 лет назад
0
Steal nerves:
Я только не понимаю: 0 - это значение, с которым мы сохраняем кастера? А если кастеров много, они все будут записываться в значение 0?
parentKey - родительский ключ
childKey - младший ключ
ты похоже не понимаешь как работает. хэндл у объектов разный, это просто счетчик объектов. например, создается первый футман ему перечисляют номер 1000 (1000-это условно, просто handle большие значения), спавнится второй футман он имеет номер 1001, создается третий футман 1002, создается стрелок 1003, декор 1004 итд. короче у разных кастеров не мб конфликта тк хэндлы разные
конфликты могут быть в коде, если старший и младший ключи совпадают. например 2 разных триггера, короче 2 абилки. Но имеют одинаковые ключи (первый: handle,0 второй: handle,0. Может произойти так что в одном триггере сохранишь, а в каком-нибудь втором из них перезапишешь данные. надо во втором триггере изменить младший ключ. изменить во втором во так: handle,1 - будет совсем другая ячейка)
А как это именно внутри функции с условием написать?
На гуи есть готовое решение. В разделе Boolean => HaveSavedHandle
И что такое число A?
Ну можно числа загружать из хэша
LoadInteger(Hash,id,0)>0 в разделе integer
LoadReal(Hash,id,0)>0 в разделе real
Кстати есть вот такая готовая функция BJ, не знал что есть
функция
function HaveSavedValue takes integer key, integer valueType, integer missionKey, hashtable table returns boolean
    if (valueType == bj_HASHTABLE_BOOLEAN) then
        return HaveSavedBoolean(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_INTEGER) then
        return HaveSavedInteger(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_REAL) then
        return HaveSavedReal(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_STRING) then
        return HaveSavedString(table, missionKey, key)
    elseif (valueType == bj_HASHTABLE_HANDLE) then
        return HaveSavedHandle(table, missionKey, key)
    else
        // Unrecognized value type - ignore the request.
        return false
    endif
endfunction
Спасибо за помощь, буду обдумывать, я всё ближе и ближе к окончательному пониманию))
Steal nerves:
((цитата
Кстати есть вот такая готовая функция BJ, в разделе boolean. не знал что есть
» функция
Я так понял, она проверяет, есть ли хоть какое-то значение в таблице? И если его нет, то дальше не будет работать
Doc:
Нет дефолтного "глобального" хеша, сначала создаем глобальную переменную типа hashtable (например назовем ее mytable), делаем InitHashtable, затем SaveUnitHandle(mytable, GetHandleId(caster), 0, target), затем, чтобы по caster достать target - LoadUnitHandle(mytable, GetHandleId(caster), 0)
Соответственно твой второй триггер на событие атаки должен быть всегда включен и должен проверять, что хештаблица что-либо содержит (вместо условия что есть сейчас). + нужно делать RemoveSavedHandle для очистки в самом конце.
Первыи триггер готов. Теперь поподробнее: откуда второи триггер знает, что такое "caster", когда я пишу к примеру во втором триггере:
local unit newcaster = LoadUnitHandle(mytable,GetHandleId(caster),0)
??? Как это работает? caster - это же локальная переменная...
0
26
5 лет назад
0
никак это не работает, сами подумать не можете вообще?
0
11
5 лет назад
0
Hate:
никак это не работает, сами подумать не можете вообще?
Спасибо! Я думаю уже 12 часов, знаете ли. Просто непонятно, как устроено. В примере из статьи про хэш таблицы парень записывает в таблицу хэндл таимера
local timer t = CreateTimer()
local integer h = GetHandleId(t)
А в другои функции он обращается к истёкшему таимеру. А у меня, к примеру таимер истёк ещё в предыдущем триггере и я не могу его никак вызвать в новом триггере...
0
26
5 лет назад
0
ну вы подумайте как передать нужные данные куда вам нужно. без скринов или кода другим людям остается гадать на кофейной гуще как вы сделали и что у вас не выходит
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.