Сейчас 06:37:45 Пятница, 29 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Булин нарушает работу...
lawsonДата: Понедельник, 16 Января 2012, 13:09:45 | Сообщение # 1
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
И так я вот вчера столкнулся с очень мне непонятной проблемой, которую так сходу я объяснить не смогу и поэтому распишу все как можно подробней чтобы вы поняли в чем проблема. Саму проблему я решил, но так и не понял суть ее возникновения.
Ну в общем вчера в очередной раз тестируя ИИ я обнаружил один маленький, но очень важный баг с системой сборки предметов. Баг заключался в том что когда бот закупал последний из списка предмет и у него оставались удаленные предметы - которые он должен был обратно вернуть по окончанию сборки, он просто не возвращал их, связанно это было с тем что сама функция на возвращения удаленных предметов не вызывалась после того как бот закупал последний предмет, но к самой проблеме система сборки ни какого отношения не имеет, я тоесть расказываю с чего все началось. С недавних пор я перенес Саму систему сборки с триггерно-событийного на таймер так было удобней - все в одном триггере, да и теперь можно было писать новые условия уже с предметами. Но так как баг(удаления предметов) был связан с системой внутри таймера пришлось искать ее решения. Исправить баг, теоретически, было не трудно, я запили несколько функция которые вызывались при совпадении условия в таймере выглядело оно так(первоначально):
Quote
if (золото игрока >= price) and (price != 0) then
call ItemTimer(bot) - это сама функция которая вызывалась при условии что у игрока было золота больше или равно чем следующий в списке предмет - следовательно покупал его.
endif

Но возникла одна проблема: таймер(глобальный) остановить нельзя ни в коем случае, а отсрочить действия на болле длительный период тоже - так как бот может закупать один предмет(1 секунда) или несколько предметов(более времени). Для решения этой проблемы я решил ввести что-то чтобы предотврашало вызов функции закупки каждый раз, иначе при постоянном вызове этой функции боту просто давался бы один и тоже предмет до тех пор пока деньги бы не закончились. Решением этой просблемы, и созданием новой от той что я пишу, был ввод простой БУЛЬКИ которая бы давала знать: покапает сейчас бот чтолибо или нет, следовательно вызывать функцию или нет. Все это должно было выглядить так:
Quote
if (золото игрока >= price) and (price != 0) then
if (Buying == false) then - false означало бы что бот свободен в данный момент и может закупать предметы
call ItemTimer(bot) - функция закупки
set Buying = true- true дало бы понять что бот в данный момент занят - тоесть уже закупает предметы.
endif
endif

Выглядело все очень просто. Сначала я подумал создать глобальну массив БУЛЬКУ но еще раз подумав решил что это очень муторно, тоесть надо будет для каждого игрока писать его номер и все такое. Я решил написать бульку в саму структуру по которой бот делает список и закупает последующие предметы - ведь какая разница где будет находится булька, а так мне еще и не надо будет делать ее массивом.
Выглядело оно так:
Quote
struct MYSTRUCT
boolean Buying = false - тоесть при создании структуры он всегда имеет значение ложь, это означало бы что юнит может закупать предметы.
..... Все остальное....
endstruct

Ну а дальше было бы все просто загрузить значение в условия находящиеся в таймере.
Quote
if (золото игрока >= price) and (price != 0) then
if (MYSTRUCT.Buying == false) then - false означало бы что бот свободен в данный момент и может закупать предметы
call ItemTimer(bot) - функция закупки
set MYSTRUCT.Buying = true - true дало бы понять что бот в данный момент занят - тоесть уже закупает предметы.
endif
endif

А по окончанию сборки булька в структуре снова приобретала бы значение false.
Ну подумав что я все сделал правильно решил тестировать. И вот здесь возникла проблема о которой я так много писал - система не заработала. Я сначала не понял в чем проблема, ведь все теоретически должно работать. Ну и я как всегда начиная искать источник проблемы: по началу я думал проблема в самой системе сборки, так как я ее недавно перенес возможно я что то забыл - я решил ввести БЖМСЖ в условие что бот свободен и может закупать предметы:
Quote
if (золото игрока >= price) and (price != 0) then
if (MYSTRUCT.Buying == false) then
call BJDebugMsg("Its Buying") - простая БЖ дала бы мне знать сработало ли условие что юнит свободен.
call ItemTimer(bot)
set MYSTRUCT.Buying = true
endif
endif

При тестировании мне ничего не выдало, и сразу же пришло в голову что структурка просто не грузится из хеша, но если она не грузится из хеша то тогда и цену предмета я не могу узнать - тоесть и первые условия тоже не сработают, так решил ввести еще одно БЖМСЖ уже чуть выше:
Quote
if (золото игрока >= price) and (price != 0) then
call BJDebugMsg("Call to buy") - этим я хотел проверить срабатывает ли вообще условия
if (MYSTRUCT.Buying == false) then
call BJDebugMsg("Its Buying")
call ItemTimer(bot)
set MYSTRUCT.Buying = true
endif
endif

И понятно что я получаю, условие не срабатывает следовательно БЖ не выводит. Ну и теперь я думаю что проблема связана с неправельно загрузкой юнита по хжндлу которого грузится структура. Я решая проверит это, ввожу БЖ уже выше всех условий - после загрузки структурки, чтобы мне вывело цену первого из списка предмета.
Quote
call BJDebugMsg(I2S(MYSTRUCT.price)) - выведет мне цену первого из списка предмета.

И мне нормально без проблем выводит цену первого предмета - значит структура грузится из хеша, тогда остается еще одна проблема, может сам хэндл не верен - тоесть я не загружаю правильно юнита. Ввожу еще БЖ которая выведет мне имя юнит по которому я пойму правильно ли я указал хэндл по загрузке структуры из хеша - и мне нормально вывело имя...... тут у меня ступор: если стурктура грузится и хэндл юнита верен почему не работает условие??? И вот так бьясь головой об стол минут 20, уже решая написать проблему на форум, я решаю просто проверить заменить бульку в структуре на просто integer, и так я ни чего не меняя в системе а поменяв только тип переменной и значения тоесть:
Quote
boolean Buying = false / integer Buying = 0
struct MYSTRUCT
integer Buying = 0
endstruct

Тоесть: false/true - 0/1, 0 - означало бы ложь, а 1 означала бы правда, как вы видите я ни чего не поменял толком. И вот уже не возлагая ни каких надежд на то что это сработает - ведь какая разница булька или integer, я тестирую и вижу что система заработала, мне все выводит, я в непонятках с радостями думаю теперь все позади, все подчишаю, удаляю все БЖ ну думаю система заработала. И где - то минут через 10 возникает вопрос а что это было? Почему булька не хотела грузится из структуры, а инт работает без проблем, ну и я думаю все снова повторить, ведь я мог чтото изменить и забыть что , и если бы система опять не заработала бы это означало бы что проблема в самой перменной - поставив все на свои места я вижу что система опять не работает так как и ожидалось. Ну теперь все понятно, структура просто не хочет грузить данный тип переменной, и даже если бы это, как вы видите она даоже нарушила частично работку самой структуры так как условия на проверку золота тоже не срабатывало.
Так вот кто мне объяснит с чем это связано, собсна хочется узнать изза чего данный тип перменной нарушил всю систему и почему это сделал булька, ведь я даже понятия не имею если это ссылается вообще на весь vJASS!


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Понедельник, 16 Января 2012, 14:20:35
 

SirNikolasДата: Понедельник, 16 Января 2012, 15:03:35 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Прочитал.

Может быть, нужно писать не MYSTRUCT.Bying, а mystructlocalvar.Bying?


 

lawsonДата: Понедельник, 16 Января 2012, 15:28:18 | Сообщение # 3
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (SirNikolas)
Может быть, нужно писать не MYSTRUCT.Bying, а mystructlocalvar.Bying?

Не ник эт я образно. Вот как я гружу структуру:
local MUSTRUCT Table = LoadInteger(дальше по хэндлу)


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

SirNikolasДата: Понедельник, 16 Января 2012, 16:03:23 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Еще как вариант - ты перепутал true и false. Больше ничего не идет в голову.

 

lawsonДата: Понедельник, 16 Января 2012, 16:36:09 | Сообщение # 5
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (SirNikolas)
Еще как вариант - ты перепутал true и false.

Не Ник это было бы слишком просто. Я ж писал, что ничего не менял а только изменил тип переменной. А возможно ли такая ошибка в вЖассе что булеан терятся в структуре изза большого кол-ва дейтсвий? Я вот сейчас попробовал для одного бота сделать Булеан глобалку которая работает по такому же принципу только она не в структуре находится а объявлена как глобалка, все нормально сработало.
Добавлено (16 Январь 2012, 16:36:09)
---------------------------------------------
Quote (SirNikolas)
Еще как вариант - ты перепутал true и false

Ник даже если бы и перепутал, почему тогда условия выше не сработали? Ведь они не зависели от значения переменной, как будто бул нарушил частично работу структуры.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Понедельник, 16 Января 2012, 16:43:59
 

  • Страница 1 из 1
  • 1
Поиск:

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