|
|
|
|
Баг триггерного дублирования способностей предмета
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 06:03:19 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Я случайно нашёл баг, как можно сделать триггерно, что при покупке 1-го предмета, герой может получить бонус как за 2 предмета.
И так, создаём торговца (любого, лишь бы продавал предметы). Создаём 2-х героев. Назовём их Hero1 и Hero2. Ставим на карте Hero1 рядом с торговцем. Hero2 ставим чуть подальше, что бы он не был в радиусе магазина (не обязательно что бы подальше от магазина, но желательно, что бы самому не запутаться). Создаём триггер с событием Предмет Продан (EVENT_PLAYER_UNIT_SELL_ITEM ). В действиях, триггерно отдаём купленный предмет второму герою (Hero2), ведь купил его первый герой (Hero1). Вот так:
Code function Trig_Bug_Actions takes nothing returns nothing call UnitAddItem( Hero2, GetSoldItem() ) endfunction
function InitTrig_Bug takes nothing returns nothing set gg_trg_Bug = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Bug, EVENT_PLAYER_UNIT_SELL_ITEM ) call TriggerAddAction( gg_trg_Bug, function Trig_Bug_Actions ) endfunction
В результате вы видите что у обоих героев есть купленный предмет, хотя купили мы один. Предмет дублировался. Затем, просто возмите Hero1, и передайте его предмет второму герою (Hero2). У Hero2 вы увидите двойной эффект! Но это ещё не всё. У Hero2 сейчас 2 предмета. По очереди выбросите оба предмета на землю. Вы увидите что когда вы выкинули второй предмет, первый исчез. Остался всего 1 предмет. Но посмотрите внимательно на героя. У него пустой инвентарь, но бонус от предмета остался! А если вы подберёте только что выброшенный предмет с земли, то у вас будет двойной бонус! Например если предмет даёт +2 ко всем статам, то он будет давать +4.
Я попробовал это с предметом со способностью Блинк, и у меня получился безоткатный Блинк! По такой же схеме купите у торговца Блинк первому герою (Hero1). Но на этот раз никому ничего не передавайте. Просто выберите Hero2, и кастуйте с помощью его предмета Блинк. Вам будет показано что есть откат, но вы всё равно сможете кастовать Блинк. Без отката! Работает это только у Hero2, то есть НЕ у того кто купил предмет.
И последнее. После того как вы купили предмет, возьмите любого из двух героев, выбросите его предмет на землю, и уничтожьте. В результате у второго героя, у которого ещё есть этот предмет в инвентаре, этот предмет станет невозможно не использовать, не выкинуть. Он станет мёртвым грузом в инвентаре.
Сообщение отредактировал FatalBlade - Суббота, 24 Ноября 2012, 06:35:03 |
|
|
|
Dreii | Дата: Суббота, 24 Ноября 2012, 08:10:51 | Сообщение # 2 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Таймер на .1 секунд
|
|
|
|
Pebbles | Дата: Суббота, 24 Ноября 2012, 11:22:06 | Сообщение # 3 |
7 уровень
Группа: Проверенные
Сообщений: 258
Награды: 0
Репутация: 1335
Блокировки:
| Вейт 0.00 сек вам поможет.
Yabba Dabba Doo!
|
|
|
|
Dreii | Дата: Суббота, 24 Ноября 2012, 11:46:48 | Сообщение # 4 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Quote (Pebbles) Вейт 0.00 сек вам поможет. Вейт ломает поток. ветй не может быть меньше 0.1 не знаешь не говори. заслуженый минус в репу
|
|
|
|
sumert | Дата: Суббота, 24 Ноября 2012, 12:09:17 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
| Минимальное значение на которое реагирует вейт = 0.04 сек, а не 0,1. Dreii дезинформирует вас. Но это происходит только тогда, когда карта очень оптимизирована (или чистая), а комп с неслабыми параметрами. Иначе происходит следующее: вейт неверно работает даже при значениях больше 1 сек. Например, я года эдак 4 назад делал AoS и создал таймер 10 сек. В то же время делал wait 10 сек и воскрешал юнита. Так как проект был слабо оптимизированным, но ни разу время таймера не совпало с wait. В основном таймер доходил до 0 и секунд еще 5 тупил, после чего воскрешал героя (а у меня тогда окно таймера уничтожалось при воскрешении героя). Самый оптимальный вариант делать действие по истечению таймера: намного точнее, чем wait.
|
|
|
|
Dreii | Дата: Суббота, 24 Ноября 2012, 12:34:55 | Сообщение # 6 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Quote (sumert) . Dreii дезинформирует вас. пфф
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 13:16:45 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| На самом деле я просто решил поделиться открытием. Что делать в данном случае я и сам знаю. Но спс всем.
Dreii, зачем ставить таймер на .1? Можно поставить на 0.0 (нулевой таймер), и всё будет работать.
P.S. И кстати, вейт 0.0 секунд ПОМОГАЕТ. Да, вейты не точны, но не 0.1 и не 0.04 - далеко не минимальное значение. Просто на таких значениях заданное время не будет точным. А больше всего вы это заметите если во время триггерного вейта свернёте игрy (minimize), или нажмёте на Меню, или приостановите игру в мультиплеере. Вейты так же не точно работают во время циклов и триггеров с событиями на периодический таймер.
Сообщение отредактировал FatalBlade - Суббота, 24 Ноября 2012, 13:22:43 |
|
|
|
Naturekid | Дата: Суббота, 24 Ноября 2012, 13:20:46 | Сообщение # 8 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| FatalBlade, тема кстати уже где-то была. Точно помню, что отвечал на подобный вопрос. Dreii, фейл.
|
|
|
|
Dreii | Дата: Суббота, 24 Ноября 2012, 13:24:33 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
| Quote (Naturekid) Dreii, фейл. пойду вены вскрою
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 13:36:51 | Сообщение # 10 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Naturekid, щас это не вопрос Другое дело что из-за этого бага, я кое-что не смог реализовать. Мне нужно было что бы при покупке предмета (именно EVENT_PLAYER_UNIT_SELL_ITEM, а не EVENT_PLAYER_UNIT_PICKUP_ITEM), проверялись кое какие условия, и если они возвращают false, то предмет удаляется а игроку возвращаются денги. Но оказалось что предмет удалялся а его способности нет. Я тогда выставил таймер на 0.0 секунд и бага больше не было.
Но я потому и сделал событием EVENT_PLAYER_UNIT_SELL_ITEM а не EVENT_PLAYER_UNIT_PICKUP_ITEM, потому что хочу, что бы условия проверялись ДО ТОГО как предмет попал в инвентарь. С таймером на 0.0 секунд, т.е. проверкой предметов когда они уже в инвентаре, это будет то же самое, что и EVENT_PLAYER_UNIT_PICKUP_ITEM.
EVENT_PLAYER_UNIT_SELL_ITEM - событие происходит ДО того как предмет попал в инвентарь. EVENT_PLAYER_UNIT_PICKUP_ITEM - событие происходит ПОСЛЕ того как предмет попал в инвентарь.
Придётся делать своим старым методом - покупка предметов через способности канал-пустышки.
Сообщение отредактировал FatalBlade - Суббота, 24 Ноября 2012, 13:42:06 |
|
|
|
SirNikolas | Дата: Суббота, 24 Ноября 2012, 13:45:40 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (FatalBlade) EVENT_PLAYER_UNIT_SELL_ITEM - событие происходит ДО того как предмет попал в инвентарь. EVENT_PLAYER_UNIT_PICKUP_ITEM - событие происходит ПОСЛЕ того как предмет попал в инвентарь. Внимание, вопрос: где находится предмет между этими двумя состояниями?
|
|
|
|
Naturekid | Дата: Суббота, 24 Ноября 2012, 13:54:02 | Сообщение # 12 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| SirNikolas, я честно скажу - тело вопроса не читал. По заголовку темы уже понялл о чём будет идти речь. Без задержки удаления предмета придётся удалять способность предмета из героя. Например покупка когтей и моментальное их удаление даст "предмет повышение силы атаки +15", которую следует удалить Б.е. - remove ability. Использование нулевой задержки и вправду всё поправляет и никаких багов там НЕ возникнет.
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 14:02:33 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| SirNikolas, думаю его пока не существует. Он создаётся после первого события, и как только он создаётся в инвентаре, происходит второе событие. А способности предметов добавляются отдельно, ДО того как предмет попал в инвентарь.
А вот то что подтверждает мою догадку, что предмет создаётся после EVENT_PLAYER_UNIT_SELL_ITEM. Когда я как реакцию на это событие, триггерно приказал герою выкинуть Проданный предмет, то этого не произошло. Скорее всего потому, что предмета ещё не существует. Вот если я ставлю таймер на 0.0, и только потом выкидываю предмет, то тогда да, оно работает.
|
|
|
|
SirNikolas | Дата: Суббота, 24 Ноября 2012, 14:04:38 | Сообщение # 14 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (FatalBlade) думаю, его пока не существует. А проверить? Вывести GetHandleId(it), GetItemTypeId(it), создать эффект в позиции предмета.
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 14:06:25 | Сообщение # 15 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Naturekid) Использование нулевой задержки и вправду всё поправляет и никаких багов там НЕ возникнет. Так и есть, но Quote (FatalBlade) хочу, что бы условия проверялись ДО ТОГО как предмет попал в инвентарь. И если false, то предмет удалялся.
Quote (SirNikolas) А проверить? Quote (FatalBlade) Когда я как реакцию на это событие, триггерно приказал герою выкинуть Проданный предмет, то этого не произошло. Скорее всего потому, что предмета ещё не существует. Вот если я ставлю таймер на 0.0, и только потом выкидываю предмет, то тогда да, оно работает.
Сообщение отредактировал FatalBlade - Суббота, 24 Ноября 2012, 14:06:52 |
|
|
|
Naturekid | Дата: Суббота, 24 Ноября 2012, 14:07:57 | Сообщение # 16 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| FatalBlade, опять таки лень разбираться в теле вопроса... Скажи - у тебя есть триггер для сложения зарядов? Там всё приведено в норму? Потому что у меня например в 1 очередь сторонние триггеры на получение-покупку предмета именно с ним могут конфликтовать. Можно в 2 словах - что ты хочешь сделать?
|
|
|
|
SirNikolas | Дата: Суббота, 24 Ноября 2012, 14:08:05 | Сообщение # 17 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Это не проверка. Вполне может быть, что предмет лежит на земле у магазина.
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 14:21:18 | Сообщение # 18 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Naturekid) Скажи - у тебя есть триггер для сложения зарядов? Там всё приведено в норму? Потому что у меня например в 1 очередь сторонние триггеры на получение-покупку предмета именно с ним могут конфликтовать. Есть. А проверял я всё то, что написал здесь, в отдельной карте, где этого триггера не было.
Quote (Naturekid) Можно в 2 словах - что ты хочешь сделать? Я не знаю как обьяснить это в двух словах, потому что ты не знаешь мою карту Есть пару предметов у меня в карте, которые покупаются стандартным образом, т.е. из магазина (остальные "иммитируют покупку" через абилки пустышки). У меня есть триггер на приказ о взятие предмета, и триггер на получение предмета. Второй триггер, который реагирует на уже полученный предмет в инвентаре, если условия дают false, он выбрасывает его на землю. Поскольку у меня есть 2 предмета, которые продаются стандартным образом, то хотелось бы реализовать, что если один из этих двух предметов был КУПЛЕН, а не ПОДНЯТ С ЗЕМЛИ, и если условие даёт false, то предмет удаляется, а голды возвращаются.
Сообщение отредактировал FatalBlade - Суббота, 24 Ноября 2012, 14:22:23 |
|
|
|
Naturekid | Дата: Суббота, 24 Ноября 2012, 14:22:55 | Сообщение # 19 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| FatalBlade, предмет пустышка относится к классу "усиливающие"? Если нет давай им определённый класс и делай во 2 триггере проверку на класс.
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 14:32:55 | Сообщение # 20 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Naturekid) FatalBlade, предмет пустышка относится к классу "усиливающие"? Не предмет пустышка, а Способность пустышка. Фактически, покупка всех предметов, кроме тех двух о которых идёт речь, на самом деле не "покупка", а иммитация покупки. Кастуется абилка канал - сразу продавец получает приказ stop. Затем проверяются условия, и если true, то герою даётся нужный предмет (сохранённый равкод в абилку), и отнимаются голды.
Quote (Naturekid) Если нет давай им определённый класс и делай во 2 триггере проверку на класс. Ты не понял. Второй триггер реагирует на событие EVENT_PLAYER_UNIT_PICKUP_ITEM, то есть когда предмет уже попал в инвентарь. В этом триггере, я не смогу проверить, поднят предмет с земли, или куплен в магазине.
Сообщение отредактировал FatalBlade - Суббота, 24 Ноября 2012, 14:36:08 |
|
|
|
Naturekid | Дата: Суббота, 24 Ноября 2012, 16:12:14 | Сообщение # 21 |
Группа: Заблокированные
Сообщений: 4982
Награды: 3
Репутация: 3347
Блокировки:
| То есть тебе нужно выудить следующее: получил ли юнит предмет с земли или с магазина?
|
|
|
|
FatalBlade | Дата: Суббота, 24 Ноября 2012, 17:04:21 | Сообщение # 22 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Naturekid) То есть тебе нужно выудить следующее: получил ли юнит предмет с земли или с магазина? Да!
|
|
|
|
|
|
|
|
|
|
|