Встреченные баги в 1.29

» опубликован
Если данная тема уже существует, или я её создал не в том месте - укажите мне на ошибку, пожалуйста.
Здесь я бы хотел поделиться найденными багами. Возможно Вы пожелаете дополнить этот список. Далее список можно будет перевести и отправить разработчикам.
call SetUnitDiceSides( GetTriggerUnit(), 1, 0 )
в GUI редакторе в качестве индекса атаки можно выбрать только значение 0. Хотя первая аткака начинается не с 0 а с 1
call UnitAddAbilityBJ( udg_lSpell, GetTriggerUnit() )
call UnitHideAbility( GetTriggerUnit(), udg_lSpell, true )
call UnitHideAbility( GetTriggerUnit(), udg_lSpell, false )
Если герою дать обилку, сначала его спрятать, а потом отобразить - то абилке скроется, но не отобразится вновь
call UnitDisableAbility( GetTriggerUnit(), udg_lSpell, true, true )
call UnitDisableAbility( GetTriggerUnit(), udg_lSpell, false, false )
если абилку сначала заблочить, потом отобразить - то абилка не отобразится
call SetItemName( GetLastCreatedItem(), "test name" )
call DisplayTextToForce( GetPlayersAll(), GetUnitName(GetTriggerUnit()) )
если юниту поменять имя, а потом попытаться это имя узнать - то вернётся дефолтное имя юнита, а не установленное триггером
call SetItemName( GetLastCreatedItem(), "item name" )
call SetItemTooltip( GetLastCreatedItem(), "tooltip" )
если попытаться присвоить предмету уникальное имя или описание - то имя и описание поменяется у ВСЕХ предметов данного типа (а не одного лишь
call SetAbilityResearchTooltip( udg_lSpell, "test value 1", 1 )
call SetAbilityResearchTooltip( udg_lSpell, "test value 2", 2 )
не работает изменение описания для указанного уровня в окне изучения героических способностей
Следующий баг не до конца изучен:
Когда пытаюсь вывести строку, в которой используется символ % - вместо этого символа и символов рядом стоящих - подставляются странные значения, похожие на адреса данных.
set udg_itemStatASpd[i] = 0.05 * (1 + 0.1 * I2R(level-1))
set udg_items_descr[i] = name + " |cffffcc33(L" + I2S(level) + ")|r\n"
set udg_items_descr[i] = udg_items_descr[i] + "+" + I2S(udg_itemStatHp[i]) + " HP\n"
set udg_items_descr[i] = udg_items_descr[i] + "+" + I2S(R2I(udg_itemStatASpd[i] * 100)) + "% attack speed\n"
Т е вместо "% a" подставилась какая-то херь
Комментарий пользователя Sergarr, :
Возможно, это связано с недокументированной добавленной функцией целого деления (a % b), и интерпретатор делает черт знает что, когда он видит этот процент в строке.
Попробуй поставить два процента подряд вместо одного: %%. Обычно в языках программирования это работает с подобного рода символами.
Хотя, конечно, это очень сильная хрень.

 

Просмотров: 1 894

» Лучшие комментарии


Cancel #1 - 4 месяца назад 0
При создании мультибордов - они отображаются не в правом кглу широкоформатного режима. Выходит, что в широкоформате они отображаются почти по центру
pro100master #2 - 4 месяца назад -21
У тя руки просто кривые...
Cancel #3 - 4 месяца назад 1
pro100master, ну-ка расскажи как надо
Нет возможности устанавливать здоровье вне учёта временных прибавок к здоровью от активных заклинаний.
Например, лог действий:
юнит воспльзовался способностью "аватар", который прибавляет ему 500 ед. здоровья
пока эффект аватара не закончился ему через скрипт установили SetMaxUnitHP = 700
по истечению использования способности "аватар" здоровье юнита уменьшается на 500 ед. и принимает значение в 200 единиц.
Разумеется, можно изощряться и налаживать системы отлова активных способностей и прочих эффектов, дающих временные бонусы к здоровью - затем при установке здоровья к желаемому значению прибавлять полученное значение бонуса здоровья - но это всё костыли. Хотелось бы иметь возможность задавать здоровье юнита без учёта от активных эффектов (возможно - в качестве дополнительной функции, не изменяя механику старой функции)
DracoL1ch #4 - 4 месяца назад 0
@Cancel - вообще не понял проблемы. Или ты с процентными бонусами хочешь работать?
Cancel #5 - 4 месяца назад 0
DracoL1ch, если ты герою установишь максимальный HP как 700 единиц, и при этом у героя заюзана абилка Аватар - то после завершения абилки "аватар" здоровье юнита уменьшится до 200 единиц.
pro100master #6 - 4 месяца назад 4
Cancel, аватар дает хп а потом отнимает... а триггерно дает максимальный хп все верно хотите увеличить хп то получи сначало текуший макс хп и прибавь хп вот так надо а не просто указать который установит как новый значение
Cancel #7 - 4 месяца назад -1
pro100master, если задача стоит установить абсолютный запас здоровья, а не её прибавку - то придётся отслеживать все активные воздействия. Задача не стоит в том, чтобы добавить воину n HP, задача стоит в том, чтобы воину установпить n HP, а в данный момент это можно делать только наладив отслеживание бафов на макс hp
Doc #8 - 4 месяца назад -1
call SetItemName( GetLastCreatedItem(), "item name" )
call SetItemTooltip( GetLastCreatedItem(), "tooltip" )
если попытаться присвоить предмету уникальное имя или описание - то имя и описание поменяется у ВСЕХ предметов данного типа (а не одного лишь
Мне кажется так и задумано? Ну типа оно конечно делает функцию намного менее полезной но как я понял вся та же хрень и с абилками.
16GB #9 - 4 месяца назад 1
Doc,
Ну просто логично было бы тогда передавать в функцию айди предмета типо 'I000', а не конкретный предмет. Раз меняется у всех.
Cancel #10 - 4 месяца назад 0
Doc, да, с абилками та же хрень. Но есть два основания полагать, что это баг: на юнитах система с уникальными именами работает, и как сказал 16GB, если было бы задумано менять строку у всех предметов - то нет смысла в аргументах запрашивать предмето, вместо типа предмета.
Скорее всего ошибка заключается в том, что все предметы одного экземпляра ссылаются на одну и ту же строку локализации, и вместо того, чтобы менять ссылку на строку - меняется сама строка.
DracoL1ch #11 - 4 месяца назад 0
потому что не проверить, является ли id предметом или чем, а с предметом намного проще. Другой вопрос, что нужно вообще иначе API создавать, но близзам виднее офк, они ж боги
Doc #12 - 4 месяца назад 0
Скорее всего у юнитов есть конкретные имена т.к. у героев например есть таблица имен из которой выбирается одно из них. У абилок и итемов скорее всего ссылка на оригинальную таблицу. Они выдали сырое АПИ, а нужен был новый функционал по сути.
pro100master #13 - 4 месяца назад 0
думаю 1.30 исправят так как публичный тестирование ведут...
Clamp #14 - 4 месяца назад (отредактировано ) 1
потому что не проверить, является ли id предметом или чем, а с предметом намного проще.
Вспомнился случай, когда мне нужно было узнавать, является ли определённый тип юнитов зданием. Я был весьма удивлён, что единственный способ это узнать заключается в создании временного юнита и проверке его типа.
Подумать только, чтобы получить одно конкретное булевое значение из конкретного указанного в РО типа войск приходится грузить все данные этого типа!
Как Адольф описывал перебор группы юнитов:
"Милый, заберешь сегодня нашего малого из детского садика."
Милый идет в садик, забирает оттуда домой всех детей, приводит их домой и начинает по одному проверять, не его ли это сын, если нет - отправляет ребенка назад в садик.
Cancel #15 - 4 месяца назад 0
Clamp, я в таких случаях кодирую нужную информацию в имя юнита, например "|c00000001|rФерма" и "|c00000002|rПехотинец", при проверке я извлекаю sub string от 3 до 10 и перевожу в число, с данным числом и работаю. В твоём случае ты бы мог считав значение "1" - понять что это здание
Clamp #16 - 4 месяца назад 0
Cancel, ужасающе несистемное решение, если честно.
» системное решение
    private bool isUnitTypeIdStructure(int typeId) {
        unit temp = CreateUnit(Player(14), typeId, 0.0, 0.0, 0.0);
        bool result =  IsUnitType(temp, UNIT_TYPE_STRUCTURE);
        ShowUnit(temp, false); 
        KillUnit(temp);
        RemoveUnit(temp);
        return result;
    }
Cancel #17 - 4 месяца назад 0
Clamp, чем твоё решение системнее? ТЕм что создаёт юнита и кучу информации, связанную с этим?
Clamp #18 - 4 месяца назад 0
Тем, что его можно просто вставить в код любой карты и оно сразу же будет работать, без плясок с бубном и левых операций в РО?
Cancel #19 - 4 месяца назад 0
Clamp, тебе в каждой карте нужно узнавать классификацию типа объекта? У меня проблема другого рода - при игре по сети очень сильные задержки при общении клиентов. Поэтому я стараюсь как можно меньше давать нагрузки на сеть (а значит - на создание данных, которые должны синхронизироваться между клиентами). Создавать юнита, чтобы узнать свойство его типа - непозволительная роскошь, я лучше для такой узкой задачи не поленюсь, и вложу свойства в флаги имени
Doc #20 - 4 месяца назад 0
Я очень сомневаюсь что данные каждого юнита отдельно синхронизируются. Решение клампа можно было бы здорово улучшить кешем.
Cancel #21 - 4 месяца назад 0
Doc, подумай сам - если юнит создаётся - об этом должен узнать каждый клиент, в том числе узнать все параметры созданного юнита. Тоже самое когда юнит удаляется.
И тут всё зависит от того, как часто эта функция вызывается - если на этапе инициализации, чтобы узнать и сохранить параметр - то ок, а если в событии малой переодичности - то дорого выходит
Doc #22 - 4 месяца назад (отредактировано ) 2
Нет, не должен. Учите матчасть. Локстеп работает не так. Юнит создается одновременно у всех потому что у всех выполняется один и тот же код. Синхронизация конкретного юнита тут не нужна. Десинк можно определить прохешировав весь стейт (хендлы) и сравнив его с клиентами.
Doc #24 - 4 месяца назад (отредактировано ) 2
Иначе никаких баталий 300 на 300 игра бы не потянула, тем более в 2003 году.
Cancel #25 - 4 месяца назад 0
Doc, скажи, в Warcraft скрипт отрабатывается на сервере, или на всех клиентах?
Clamp #26 - 4 месяца назад 0
Решение клампа можно было бы здорово улучшить кешем.
Если не сложно, можешь пояснить кодом?

Doc #27 - 4 месяца назад 4
DracoL1ch #28 - 4 месяца назад 0
IsUnitIdType, ребята со зданиями. Не все свойства может проверить, но хоть попробуйте
Про группы - отдельная тема, по факту двиг умеет сразу фильтровать по игроку и айди юнита, но эти возможности в апи вынесены никак почти
Sergarr #30 - 4 месяца назад 0
Cancel:
Doc, пруфы есть?
Если бы код исполнялся только на сервере/хосте, то десинка бы не существовало в принципе. Десинк есть, значит код исполняется на всех компьютерах.
Doc #31 - 4 месяца назад 3
Какие пруфы нужны кроме GetLocalPlayer?
Cancel #32 - 4 месяца назад (отредактировано ) 0
Sergarr, мб тогда кто-нибудь подскажет всвязи с чем на карте может появляться следующая проблема: у игрока мало юнитов (не больше десяти) но при игре по сети очень большая задержка перед выполнением приказов. Например - крестьянин может начать строить башню лишь секунд через 10 после того, как игрок приказал это сделать. В одиночной игре с ботами такого не встречается. Карта не защищена wayofworlds.atlassian.net/wiki/spaces/SS/overview . Видео, где это производится www.youtube.com/watch?time_continue=366&v=C3tKPnKTVCo на 11:56 по таймингу
Это старая карта, полностью сделанная на GUI, сейчас делаю её заново на JASS
Но так как я до сих пор не понял в чём проблема - рискую снова нарваться на эту ошибку
DracoL1ch #33 - 4 месяца назад 0
Раз в одиночной не встречается, проблема слишком большого числа данных для синхронизации по сети. Каждый игрок имеет свой лимит приказов + внутренние GameCache засоряют канал, когда используется синхронизация.
Cancel #34 - 4 месяца назад 0
DracoL1ch, какие данные именно синхронизируются? Меня тут убеждают (если я правильно понял) что данные не синхронизируются а генерируются на каждом клиенте отдельно. GameCache не использую. ДИалог собственно начался с того, что я стараюсь лишний раз не генерить юнита когда это не нужно - а на меня обвалились с критикой, что это не нагружает канал синхронизации.
Sergarr #35 - 4 месяца назад (отредактировано ) 0
Cancel:
DracoL1ch, какие данные именно синхронизируются? Меня тут убеждают (если я правильно понял) что данные не синхронизируются а генерируются на каждом клиенте отдельно. GameCache не использую. ДИалог собственно начался с того, что я стараюсь лишний раз не генерить юнита когда это не нужно - а на меня обвалились с критикой, что это не нагружает канал синхронизации.
Как написано здесь:
Doc:
Иначе никаких баталий 300 на 300 игра бы не потянула, тем более в 2003 году.
Deterministic lockstep is a method of networking a system from one computer to another by sending only the inputs that control that system, rather than the state of that system.
Т.е. синхронизируется не все данные, а лишь ввод данных игроками, в контексте варкрафта это, в основном, отдача приказов юнитам. Создание юнита - это не приказ игрока, потому что код создания юнита зашит в карте и исполняется параллельно на всех компьютерах, а приказы от игроков поступают динамически уже в процессе игры.
Cancel #36 - 4 месяца назад 0
Sergarr, в моей карте одновременно присутствует не так много юнитов, т. е. сомневаюсь что десятисекундные задержки происходят по этой причине. Зато большая загруженность по коду, где юниты созадются, для каждого их них формируются хеш таблицы с параметрами и т. д., поэтому мне важно разобраться что именно вызывает такие задержки. Посмотрите реплей сами - там не так много войск чтобы вызывать проблемы
Sergarr #37 - 4 месяца назад 0
Cancel:
Sergarr, в моей карте одновременно присутствует не так много юнитов, т. е. сомневаюсь что десятисекундные задержки происходят по этой причине. Зато большая загруженность по коду, где юниты созадются, для каждого их них формируются хеш таблицы с параметрами и т. д., поэтому мне важно разобраться что именно вызывает такие задержки. Посмотрите реплей сами - там не так много войск чтобы вызывать проблемы
Если ты про видео, то там задержка секунды 2, а не 10. Тот клик, от которого там можно насчитать 10 секунд, сопровождается сообщением об недостатке золота. Задержка в 1-2 секунды может иногда наблюдаться на любой карте, если у кого-нибудь из играющих плохой интернет.
Cancel #38 - 4 месяца назад 0
Sergarr, речь не о видео, а о карте, и на этой карте довольно часто задержки по 10 секунд перед принятием приказа о строительстве
DracoL1ch #39 - 4 месяца назад 0
Только приказы и синхронизируются + кэш. Проблема может быть в количестве приказов или медленном хосте
KingMaximax #40 - 4 месяца назад (отредактировано ) 0
Doc:
Какие пруфы нужны кроме GetLocalPlayer?
Так можно и на десинк нарваться, наверно. (Если только Метелицы снова не курили что-то...)
Ведь кд, меняет всем абилкам тоже.
Пс: Кд для б.е. меняет как на все абилки, а вот возращает с получения кд абилки от юнита в нуль, а вот глобальный показывает на сколько было изменено кд абилки, но вот только это глобально, а не на 1 юнита, когда я делал на 1 одинёшенького.
Alexander12 #41 - 4 месяца назад 0
Насчет описание предметов, то что при изменение у одного - менялось и другие, пока нашел единственный выход - использовать дамми предметы(пустышки). Лучше всего их добавить вручную через mpq, в описании и где нужен текст нужно добавить хотя-бы пробел, чтобы текст можно было редактировать. Тем самым можно создавать "динамичные" предметы, ограничение - число дамминок
2 комментария удалено
KingMaximax #44 - 4 месяца назад (отредактировано ) 0
На счёт % в строке, их сам компилятор WE преобразовывает в: %<символ> не ясно что он делает в строках, скорее что-то кривое)))))
» cat
i,u,o 2
d 2664588
g 1.29494e-272
e 6.859665e-308
f 0.000000
x 137c83b
h,l,yw,z,j,t - ничего особенного
n - bug fatal error
p 003DACD4
c ; a 0x1.dacd400000002p-1020
b b
m m
q q
k k
v v
r r
s (Иероглифы, бессмысленный набор знаков по юникоду, а Notepad++ прочитал как системные символы(ASCII), скорее они и есть)
call BJDebugMsg(I2S(i%2)) // до
call BJDebugMsg(I2S(i)) // после это не мод
Хз, что, но это компилятор переводит сразу в текст из %<символ> во что-то наркоманское, но это очевидно, что-то метелицы недопилили явно, поспешили. Возможно тот % formatstring как я думал, скорее недопилиный или чтобы можно было наподобие этого: "<Aslo,DataB1,%>%" Ну или как Полях изменения интерфейса... Хотя ещё не полнятно точно..