|
|
|
|
Добавление способности
|
|
CHLSN | Дата: Вторник, 24 Мая 2011, 10:50:51 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| Вот мы использовали все бафы на снижение защиты, а надо бы еще. Добавляем триггерно юниту способность, а по истечении таймера удаляем её.
Что происходит: если время действия = 5 сек. а cooldown = 2 сек. То, наложив на юнита заклинание несколько раз, оно не продлится, а удалится через 5 сек. Как дать понять машине, что не нужно удалять способность, если искуственный бафф (способность) еще на юните?
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
Kartoha | Дата: Вторник, 24 Мая 2011, 13:33:05 | Сообщение # 2 |
10 уровень
Группа: Ветераны
Сообщений: 2851
Награды: 1
Блокировки:
| CHLSN, проверка на наличие баффа: Code GetUnitAbilityLevel(whichUnit, buffcode) > 0 С помощью неё можно сделать цикл: Code loop exitwhen GetUnitAbilityLevel(whichUnit, buffcode) == 0 call TriggerSleepAction (0.10) endloop call UnitRemoveAbility(whichUnit, abilityId) Получится, что триггер подождет, пока бафф пропадет и тогда отберет способность.
Карта-пример по такому принципу.
|
|
|
|
CHLSN | Дата: Вторник, 24 Мая 2011, 13:36:04 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| Kartoha, а если я не использую бафф (ибо он у большинства способностей заменяется)?
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
Kartoha | Дата: Вторник, 24 Мая 2011, 13:38:21 | Сообщение # 4 |
10 уровень
Группа: Ветераны
Сообщений: 2851
Награды: 1
Блокировки:
| CHLSN, ну аналогичный цикл на проверку того, с помощью чего ты заменил бафф, или так не получится?
|
|
|
|
CHLSN | Дата: Вторник, 24 Мая 2011, 13:44:40 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| Kartoha, есть заклинание. Его длительность = 0.01 (если поставить 0, то бафф будет вечным). Соответственно кастуем, добавляем юниту способность. Вот и все. И как бы юнит без баффа при этом остается.
Хотя если существуют заклинания с не сбивающимся баффом, то все гуд, но сомневаюсь, что такие есть: Цель Область - указатель Область - площадь Вызов единицы - без указания Вызов единицы - указатель Вызов единицы - площадь
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
FkoFF | Дата: Вторник, 24 Мая 2011, 13:48:36 | Сообщение # 6 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| присваивай по хэндлу юнита отсчет для таймера, и, если отсчет не равен нулю в момент добавления способности - всего лишь установить отсчет на новое значение, вместо создания таймера и прочих прилюдий.
|
|
|
|
CHLSN | Дата: Вторник, 24 Мая 2011, 13:52:11 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| FkoFF, не совсем понял идею, и про какой таймер ты говоришь
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
FkoFF | Дата: Вторник, 24 Мая 2011, 14:00:52 | Сообщение # 8 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| CHLSN, эээм...
Code
function GATcb takes nothing returns nothing local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Data,ti,0) local integer ui=GetHandleId(u) local integer abilcode=LoadInteger(udg_Data,ti,1) local real time=LoadReal(udg_Data,ui,abilcode)
if time>0 then set time=time-0.1 call SaveReal(udg_Data,ui,abilcode,time) else call UnitRemoveAbility(u,abilcode) call SaveReal(udg_Data,ui,abilcode,0) call FlushChildHashtable(udg_Data,GetHandleId(t)) call DestroyTimer(t) set t=null endif
endfunction
function GiveAbilityTimed takes unit u, integer abilcode, integer lvl, real duration returns nothing local timer t local integer ui =GetHandleId(u) local integer ti if LoadReal(udg_Data,ui,abilcode) == null or LoadReal(udg_Data,ui,abilcode)<=0 then set t=CreateTimer() set ti=GetHandleId(t) call UnitAddAbility(u,abilcode) call SetUnitAbilityLevel(u,abilcode,lvl) call SaveInteger(udg_Data,ti,1,abilcode) call SaveUnitHandle(udg_Data,ti,0,u) call SaveReal(udg_Data,GetHandleId(u),abilcode,duration) call TimerStart(t,0.1,true,function GATcb) set t=null else call SaveReal(udg_Data,ui,abilcode,duration) endif endfunction
Функция берет юнита U, равкод способности, нужный уровень способности, реальное число-длительность нахождения спелла у юнита.
|
|
|
|
CHLSN | Дата: Вторник, 24 Мая 2011, 14:16:21 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| FkoFF, отлично, все так, как я и предполагал, только я хотел не время сохранять, а количество скастованных на юнита заклинаний одного типа. Вот только вопрос у меня возник и тогда и сейчас: LoadReal(udg_Data,ui,abilcode) == null or LoadReal(udg_Data,ui,abilcode)<=0 - эта строчка исключает возможность необнуленных значений в хеш? Или хеш инициализируется с нулями?
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
FkoFF | Дата: Вторник, 24 Мая 2011, 14:23:11 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| CHLSN, если значения в хэш нет то попытка вызвать его выдаст null, по этому проверяются оба варианта. Если там будет 0 то значит что заклинание уже было скастованно на героя и уже отвисело, хотя, впрочем, можно от этого избавиться вписав в функцию GATcb строчку call RemoveSavedReal(udg_Data,ui,abilcode) вместо call SaveReal(udg_Data,ui,abilcode,0)
|
|
|
|
CHLSN | Дата: Среда, 01 Июня 2011, 01:03:16 | Сообщение # 11 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| FkoFF, ок, если карта не вылетит после первого же запуска или не заторкает, помощь на счет хеша окажется очень уместной ) Добавлено (01-06-2011, 01:03) --------------------------------------------- FkoFF, вспомнил охрененное НО. Некоторые спеллы заносят данные в хеш по хендлу юнита, и, естественно, данные эти надо подчищать.
Дак вот, что делать? Удалять из хеш эти данные, и не юзать call FlushChildHashtable() (используя в качестве дочерних ключей исключительно известные константные значения (то бишь не хендлы объектов)) ?
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
SirNikolas | Дата: Среда, 01 Июня 2011, 06:51:18 | Сообщение # 12 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Создавать несколько хэш-таблиц.
|
|
|
|
CHLSN | Дата: Среда, 01 Июня 2011, 07:19:11 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| SirNikolas, спасибо, кэп )) сам-то что-то не додумался )
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
FkoFF | Дата: Среда, 01 Июня 2011, 08:45:06 | Сообщение # 14 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (SirNikolas) Создавать несколько хэш-таблиц. Quote (CHLSN) SirNikolas, спасибо, кэп )) сам-то что-то не додумался ) Не вздумай создавать хэштаблицы. Сами хэш таблицы -самые массивные объекты в игре и создавать много ХТ - опасно. Тоесть для каждого спелла своя хт - бред, а вот для каждой системы (сколько их будет, 20-30?) - можно себе позволить.
У меня был случай - сунул в периодический триггер строку set udg_Hash = InitHashtable() и удивлялся что через 20-30 минут игры у меня игра фаталила.
Quote (CHLSN) FkoFF, вспомнил охрененное НО. Некоторые спеллы заносят данные в хеш по хендлу юнита, и, естественно, данные эти надо подчищать. эмм, какие еще спеллы заносят инфу по хэндлу ЮНИТА а не таймера? в любом случае call FlushSaved[Real|Integer|String|Boolean|Handle](ht,parentkey,childkey),
|
|
|
|
CHLSN | Дата: Среда, 01 Июня 2011, 08:51:43 | Сообщение # 15 |
10 уровень
Группа: Проверенные
Сообщений: 1627
Награды: 0
Репутация: 132
Блокировки:
| Quote (FkoFF) эмм, какие еще спеллы заносят инфу по хэндлу ЮНИТА а не таймера? Вот такие, хитроумные))
Quote (FkoFF) а вот для каждой системы (сколько их будет, 20-30?) - можно себе позволить. За всю историю карты пока что обошелся только одной, поэтому для этой системы думаю вполне можно выделить вторую.
Я в контакте и на warcraft3ft.info. Кто может сказать, почему **** дизайнер писал вместо "pt" "px" в CSS, благодаря чему нужно смотреть форум через лупу с Ctrl++?
|
|
|
|
|
|
|
|
|
|
|