RazArt
offline
Опыт:
11,197Активность: |
Хеш-таблицы
ВступлениеВыход нового, 1.24, патча стал проблемой для многих игроков Warcraft’а, они потеряли возможность играть в большинство нестандартных карт. Это случилось из-за фикса старой ошибки близов, называемой Return Bug, благодаря которой мы могли получить Handle любого объекта, а некоторые хакеры открыть окно cmd. Взамен они дали возможность пользоваться хеш-таблицами, которые намного удобнее и быстрее (более подробно про хеш-таблицы можно узнать на страницах Wikipedia). В данную таблицу можно записывать абсолютно любые игровые объекты или переменные. Это может быть использовано для создания оригинальных способностей юнитов или дополнительных характеристик, таких как усталость, сытость, температура и т.д. Если у вас есть хотя бы минимальные знания жасса, то продолжим :) Список функций» Функции Код:
Как вы видите функций довольно много и рассказывать про каждую отдельно не имеет смысла, поэтому я расскажу лишь про основные. ИспользованиеИнициализацияСамой главной функцией из этого списка является функция “InitHashtable”. С помощью неё мы инициализируем хеш-таблицу для последующей работы с ней. В начале создадим глобальную переменную типа “Хеш-таблица (Hashtable)” и назовём её “Hash”, затем присвоим ей нужное значение: Код:
Получение Handle объектаЕсли мы хотим присваивать объектам какие-либо значения, то нам необходим хендл данного объекта. Получить его мы можем с помощью функции “GetHandleId”. В качестве аргумента мы передаём любой игровой объект и получаем число типа “Целочисленное (integer) ”. Пример: Код:
В данном примере мы присвоили переменной “ObjectHadle” хендл юнита, заранее занесённого в переменную “udg_Unit” Сохранение значенийТеперь когда таблица создана и мы умеем получать ссылки на объекты в неё можно записывать любые значения. Для записи используются функции с префиксом “Save” (например SaveInteger или SaveUnitHandle) из списка предоставленного выше. Простейшим примером использования данных функций является запись числа для юнита: Код:
В первом аргументе мы передаём функции “SaveReal” хеш-таблицу (“udg_Hash”), во втором хендл юнита “udg_Unit” (созданного ранее и записанного в переменную “udg_Unit”), для которого мы хотим записать это число, в третьем “номер ячейки” данного числа(“0”), ну а четвёртым мы передали само число(“1.00”). Если мы захотим записать другие числа, то мы можем либо перезаписать его, использую функцию: Код:
Либо записать их в другие ячейки: Код:
Загрузка значенийДля загрузки из таблицы используются функции с префиксом “Load” из списка предоставленного выше. Давайте напишем функцию для загрузки числа из прошлого примера и вывода его на экран: Код:
Сначала мы указываем функции хеш-таблицу (“udg_Hash”), затем даём ссылку на объект (“GetHandleId(udg_Unit)”), а в конце номер ячейки (“0”), из которой мы хотим получить это число. После выполнения этой функции переменная “Test” должна стать равной “1.00” и на экране появится соответствующая надпись ПроверкаЧто бы проверить занята ли ячейки или нет пользуются функциями: Код:
В качестве аргументов принимаются хеш-таблица, хендл объекта и номер ячейки. Если запись в ячейке уже существует, то вернётся значение “true”, если же ячейка свободна, то функция вернёт значение “false”. Пример: Код:
Удаление записиБывают ситуации когда необходимо удалить запись из ячейки. Например, стереть запись, содержащую какое-либо число, и записать в эту ячейку ссылку на таймер. Для этого используются функции: Код:
Примером очищения ячейки может служить код: Код:
Как и в прошлом примере, в качестве аргументов, мы указываем хеш-таблицу, ссылку на объект и номер ячейки. Полное удаление записейПоследние 2 функции, которые мы с вами разберём, будут “FlushParentHashtable” и “FlushChildHashtable”. FlushParentHashtable позволяет удалить нам абсолютно все записи из хеш-таблицы. В качестве аргумента указывается только очищаемая хеш-таблица. После использования донной функции хеш-таблицу приходиться инициализировать заново! Пример: Код:
А вот FlushChildHashtable нужна для удаления записей из одного объекта. Рекомендую использовать данную функцию, например при удалении юнита, так как даже есть вы удалите юнита функцией “RemoveUnit”, то его значения останутся в хеш-таблице. Пример: Код:
Примечания» Примечание 1 В 1 ячейке может храниться только 1 значение любого типа Правильно: Код:
Не правильно: Код:
» Примечание 2 Рекомендую вставлять такой код в любую карту, где вы работали с хеш-таблицами, по-моему очень удобно: Код:
Примеры использованияВзрыв юнитаПримером использования хеш-таблиц может служить простой пример со взрывом юнита. Например мы хотим, что бы юнит взорвался после каста заклинания. Это очень просто скажите вы. Но если нужно чтобы он взорвался через 5 секунд после каста заклинания? Особо остроумные могут конечно использовать действие “Wait”, но работа с таймерами куда лучше, так как wait может повести себя абсолютно не предсказуемо, вплоть до того что действия после него просто не будут выполняться. Код:
Если вы уже не плохо знаете жасс и ранее использовали кеш, то для вас не составит труда понять как работает данный пример, ну а для новичков я сделал подсказки и пример, который вы найдёте во вложении. ЗаклинанияА вот и вполне рабочие заклинания выполненные с использованием хеш-таблиц: Blink - Автор Bee Mana Drain - Автор Bee Fast Run - Автор RazArt Автор статьи – RazArt (irazart@gmail.com)Отредактировано RazArt, 27.11.2009 в 16:34. |
18.11.2009, 22:39 | #1
+1/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Nekit1234007
offline
Опыт:
11,916Активность: |
В примере забыл call FlushChildHashtable(udg_Hash, GetHandleId(t))
|
18.11.2009, 22:48 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
RazArt
offline
Опыт:
11,197Активность: |
Ой точно fixed
|
18.11.2009, 22:52 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Nekit1234007
offline
Опыт:
11,916Активность: |
А вообще статья труЪ. Чтоб у нубков было меньше вопросов. :)
|
18.11.2009, 22:57 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
XOR
offline
Опыт:
38,284Активность: |
Статья разжевана неплохо, но нужна только нубам имхо. Хотя.. Jassеры сами научаться, а гуишникам эти функции не к чему |
18.11.2009, 23:00 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
RazArt
offline
Опыт:
11,197Активность: |
XiMiKs, Эм... у половины жассеров даже не было списка функций для работы с хеш таблицами :)
Та и я не думаю что с таблицами всё станет сразу ясно юзверям, которые не юзали рб и кеш... Отредактировано RazArt, 18.11.2009 в 23:21. |
18.11.2009, 23:04 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
RazArt, полезно, спасибо. Тебя не затруднит сделать пример с локальной хеш таблицой. Былобы очееееень полезно. Заранее спасибо. Отредактировано Bee, 19.11.2009 в 00:27. |
19.11.2009, 00:15 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
А зачем она нужна локально?
RazArt:
Это как? Удаляет? |
19.11.2009, 00:41 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
Помогите сделать MUI из моего примера.
» Library
|
19.11.2009, 14:51 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Rewenger
The culprit will not die
offline
Опыт:
35,273Активность: |
RazArt, супер. Я не пользовался хэштаблицами именно потому, что было лень выяснять, как они работают. Теперь попользуемся, пожалуй; благо появилась разжёванная статья=) |
19.11.2009, 19:13 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Chester
Best for you!
offline
Опыт:
5,702Активность: |
Код:
Оптимальней Код:
Пример на cJass Код:
|
19.11.2009, 19:19 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
RazArt
offline
Опыт:
11,197Активность: |
Sebra, полностью удаляет все данные и собстно саму таблицу, поэтому её приходится заново инициализировать
Bee, давай ты просто скажешь что должно происходить, а я напишу на обычном жассе?) Так как сжассы и вжассы не моё... Отредактировано RazArt, 19.11.2009 в 20:31. |
19.11.2009, 20:19 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
|
19.11.2009, 21:51 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
LostCoast
offline
Опыт:
2,633Активность: |
У меня вопрос. А что если я не буду инициализировать хеш таблицу ? вроде бы и так всё работает.... Достаточно ли того что я в иницилиз. карты это делаю?
|
19.11.2009, 22:47 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
RazArt
offline
Опыт:
11,197Активность: |
Bee, лови, я думаю ты хотел именно энто :)
LostCoast, ничего не будет вроде... Я пробовал после флуша работать с ней, ничего не получилось, инициализировал заново, всё заработало. Ну да, инициализировал 1 раз и работай с ней 2All, советую всем новичкам скачать пример и узнать как создавать муи спелы. Если что муи спелы, это те спелы, которые могут заюзать сразу 100 юнитов, а не только 1 :) Отредактировано RazArt, 19.11.2009 в 23:07. |
19.11.2009, 22:49 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
RazArt, охосподи :) это же совсем другая способность и тоже не MUI
блииин, RazArt, ты меня не понял... не нужно для меня делать способность (я это и сам умею) .. мне нужно сделать способности для применения ее неограниченного кол-ва раз. я не знаю как это делается и поэтому спрашиваю. там в функции Actions должна создаваться каждое применение новая хеш таблица... т.е. смотри наприме я кастанул способность на воина, он передвигается, передвигается, и вдруг какойто другой воин тоже применяет такуеже способность. срабатывает одна и таже функция и хеш данные об передвигаемом воине перезаписываются. и у тебя не MUI спелл :) ты наверное не тот пример выложил)) Bee добавил: ты просто добавил отталкивание от преград :) но это всеравно не MUI ) |
19.11.2009, 23:29 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
RazArt
offline
Опыт:
11,197Активность: |
Bee
1) Юзать её можно сразу 5 юнитами на 1, будет всё норм работать, энто как раз таки муи 2) Не нужно для каждого каста создавать новую хеш-таблицу, потому что энто бред... Отредактировано RazArt, 19.11.2009 в 23:41. |
19.11.2009, 23:34 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
RazArt, скачай пример который ты выложил и проверь еще раз.
видел 2-3 такие способности - они отлично работали, только я немогу их найти :D |
19.11.2009, 23:40 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Killer574
Временно присутствующий.
offline
Опыт:
3,373Активность: |
Bee, не скачивал пример, но что-то в твоем коде мне подсказывает, что стоит просто стереть строку
инициализацию нужно делать только 1 раз имхо например в триггере инициализации :D |
19.11.2009, 23:41 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
RazArt
offline
Опыт:
11,197Активность: |
Я проверял, всё норм. Можно конечно ещё в юнита записать таймер и если прошлый не завершался дестрюкать его, но зачем...
Выглядит примерно так: » раскрыть Код:
Кста предыдущий оратор был прав :) Отредактировано RazArt, 19.11.2009 в 23:56. |
19.11.2009, 23:42 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|