Сейчас 19:49:16 Четверг, 18 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Баг триггерного дублирования способностей предмета (Герой получает двойной бонус купив всего 1 предмет)
Баг триггерного дублирования способностей предмета
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
Блокировки:
На самом деле я просто решил поделиться открытием. :D Что делать в данном случае я и сам знаю. Но спс всем. :)

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)
То есть тебе нужно выудить следующее: получил ли юнит предмет с земли или с магазина? %)

Да!


 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Баг триггерного дублирования способностей предмета (Герой получает двойной бонус купив всего 1 предмет)
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz