это погрешность
указано же, что пипеточники на красный цвет напипеткали аж 3 значения - FF0000 FF0202 FF0303 , и какой из них верный?
надо именно из кода игры получить
а еще может быть в разных патчах разные цвета прописаны, стопудов в game.dll сидят они
ты сейчас про CreateTimerDialogBJ ?
делай в глобалку - timerdialog td=null , тогда окно будет удаляться
даже если в глобалку напишешь timerdialog td - то не будет удаляться, надо с null
local timerdialog IvanWindow
вот у тебя и в локалке без null
у тебя даже нет
call PauseTimer(t)
call DestroyTimerDialog(td)
как ты там их вообще останавливаешь
и да, окно и таймер не связаны, т.е. после удаления только окна - таймер продолжит тикать
нету создания : trigger t=CreateTrigger(), timer t=CreateTimer() и двадцати остальных
нету убийства : GroupClear, DisableTrigger, KillDestructable, KillUnit, PauseTimer и ещё десятка остальных
нету очистки : RemoveItem, DestroyGroup, DestroyTimerDialog, RemoveWeatherEffect и ещё десятка остальных
естественно не указано, что смена погоды может крашить вар ( set we = AddWeatherEffect(GetPlayableMapRect(), "zzzz") + call EnableWeatherEffect(we, true) )
про string вообще ничего не указано. я молчу про высокие материи про стринг типа моего поста выше, но банально даже лимиты стринга не указаны
то есть ценность у статьи - такая себе, полумера, которая не покрывает заявленную тему
и да и нет
стринг это очень опасный тип, может быть даже самый опасный
если стринг переменную и можно обнулить, то нельзя обнулить память, которая была выделена под эту строку
при работе со стрингами забить оплимит можно в пару строк кода
ну а критануть вар так вообще одной строкой можно
Basically, every time you create a string that has a unique set of characters it will leak. (Note : These types of leaks are smaller than other leaks in terms of memory usage)
So if you do
Set Variable = "Hello"
Set Variable2 = "Hello"
it will only create one string leak. The reason why its leaking is that all strings in wc3 are simply pointers to the global string table. If you declare a new string, than it has to add the new string to the table if it doesn't exist. These leaks can't be cleared. In general, don't worry about it unless your processing custom chunks of strings
стоит разделять обнуление переменной и удаление объекта, на который ссылается эта переменная
если для всех объектов у нас есть функция очистки
то вот для стринга нет функции очистки
GroupClear(g)
DestroyGroup(g)
set g=null
call DisableTrigger(t)
call DestroyTrigger(t)
set t=null
call KillDestructable(d)
call RemoveDestructable(d)
set d=null
call KillUnit(u)
call RemoveUnit(u)
set u=null
call RemoveItem(it)
set it=null
call RemoveLocation(L)
set L=null
call ClearStringMemory(s) --- нет такой функции
set s=null --- переменная очищается автоматически
статьи по правильному созданию и обнулению всех типов переменных тоже нет до сих пор
как отметил IceFog
SubString позволяет по памяти ковыряться
если через чат вводить значения отступа XX от -20 и условно до -20000 (и дальше)
выдаваемые значения обычно разные, даже если одну и ту же карту перезапустить
EugeAl, ясно короче, сплошной хело ворлд вместо кодинга
что ещё надо?)
когда не работал с отладчиком - то конечно и знать не знаешь - что он позволяет делать в коде, который длиннее 10 строк
сидеть как слепой котёнок аутировать по два дня на каждый баг
да я скоро повешаюсь с этим джасом
мне приходится на другом языке всё кодить, чтобы там отладку делать хоть какую-то
на одном BJDebugMsg далеко не уедешь и будешь неделями бороться с оплимитом вместо отладки
хотя тут некоторые утверждают что оплимита не существует и за 20 лет с ним ни разу не сталкивались
ну если не кодить ничего сложнее "хелло ворлда" и счетчика убитых крипов, то наверное
в одну функцию приходится аж по три триггера засовывать, чтобы этого старпёра на пинках заставлять работать нормально
странно, что сообщество кодит карты и всякий софт, но не может накодить себе отладчик хотя бы примитивный
вот в этих штуках тоже нельзя отладку обычного жаса делать?
if SubString("|",-1,0)!="o" then
call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS,10.,"※ 워크래프트3 1.28기준으로 만든 맵이기 때문에, 다른 버전으로 이용하면 약간의 버그가 있을 수 있습니다.")
call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS,10.,"※ 리포지드로 플레이할 경우 클래식 그래픽으로 설정하셔야 원할한 플레이가 가능합니다.")
endif
if SubString("|",-1,0)!="o" then
call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS,10.,"※ Since this map was created based on Warcraft 3 1.28, there may be some bugs if used with a different version.")
call DisplayTimedTextToForce(bj_FORCE_ALL_PLAYERS,10.,"※ When playing with Reforged, you must set it to classic graphics to play smoothly.")
endif
родной F7 цепляется без учёта смещения 30 по Y и 8 по X
WMC цеплялся нормально (см сравнение ниже)
то есть вместо края экрана будет ресайз окна, если кликнуть. что полностью исключает возможность использования захвата мыши
каким же образом?
это религия альтернативно-кодеров?
каким образом можно писать что lua hrua cjass vjass ...{вставить ещё сотню языков} могут больше чем оригинал?
если они в конце компиляции тупо конвертят свой личный код в обычный жас
фактически это не больше чем обёртка от конфеты, только конфета остаётся всё той же
call Split("some text, можно на русском, можно и так и сяк, можно что-то такое даже")
loop
exitwhen(i >= 500)
какая же классика
что за мода у этих кодописарей задавать границы чисел на свой рандомный лад?
что тут 500 кусков вместо 8192, доступных в жасе
что в 99,9999% камерахаков вечно от 1650 до 3300 вместо 0-10000
я уж молчу, что такой код сплита благополучно загнётся на первом же оплимите, это база
ещё интереснее, что автору пришлось самому пилить сплит в 2к21, ведь до него никто этого для джаса не делал? иначе зачем
quq_CCCP: потому что вы что то не то делайте, сами себе создаёте проблему
ах да, это я такой криворукий, а не оплимит в варике
только вот сегодня утром опять наткнулся, уже в 3й раз в карте, на проблему оплимита в цикле, когда цикл тупо не доходит до конца и молча прерывается посередине
первый раз было с координатами юнитов - ладно, создал триггер вместо цикла - проблема решилась
вчера он аналогично не захотел обработать 50 строк длиннее 1000 символов - ну ладно, на тебе второй триггер
но нет же, сегодня во втором триггере заглох при обработке одной строки на 1400 символов (во время вызова доп функции) - пришлось делать триггер в триггере
итого 3 раза цикл из-за оплимита оборвался и не доработал, пока его на триггер не посадили
сидишь только и борешься с оплимитом в циклах сутками (а по пути на втором языке с нормальным отладчиком всё дублируешь),
действительно, никогда не было и вот опять
вместо работы над самой картой - для банальных вещей писать костыли к жасу, подпинывая эту калеку, чтобы он хоть как-то ходил
возвращает количество символов/байтов после перевода из юникода в системный ANSI (тоже самое и с обрезкой)
я про это выше и писал при использовании мультиязыков в одном стринге (знаки препинания - то это англ)
иероглифы и смайлы кста по 3 а не по 4 занимают, англ 1, ру 2
вот например код из карты, когда картоделу приходится проверять локаль из чата и резать разным количеством, чтобы выполнить одну и ту же команду:
во второй -чатстроке сиди считай 1+3+3+3=10 при написании кода
if SubString(s,0,6)=="-count" then
call Command__CountMain(s,true)
elseif SubString(s,0,10)=="-카운트" then
call Command__CountMain(s,false)
function Command__CountMain takes string s,boolean Eng returns nothing
if Eng==false then
set time=S2I(SubString(s,11,13))
else
set time=S2I(SubString(s,7,9))
endif
set s=SubString(s, StringLength(s) - 20, StringLength(s))
call BJDebugMsg(s)
то проблему можно увидеть
только вот вопрос - можно либо притворяться, что такой проблемы нет, либо открыто писать что она есть, но есть обходные пути
что, если у тебя УЖЕ есть готовая строка s - длиной 3500
и тебе нужно у неё обрезать последний символ?
при этом сохранив её в переменной, а не на экране в пропечатываемых 100 символах
как быть?
делить на 4 части по 1000, потом из последней отрезать , а потом опять сплюсовать s=s1+s2+s3+s4?
как это прекрасно, люблю жасы
особым бонусом будет смешанная строка из латиницы 1/1 + кириллицы 1/2 + иероглифов 1/4 - и сиди гадай, как бы тебе посередине иероглифа не разрезать во время попила на тысячные куски
хотя я уже днём это всё решил, это я так, бормочу после рутинного написания базовых функций, которые есть в нормальных языках
ответ конечно же будет таким:
set s=SubString(s,0,>1000) - не работает
при этом забавно, что крит во время исполнения SubString не выдаётся, как это будет при загрузке карты с кодом set s="1100 знаков"
т.е. и не крит и не нормальная работа
в итоге - обязательно во все карты теперь надо вводить функцию разбивки длинных 4000 строк на 4 по 1000, чтобы без ошибок нормально можно было работать с ними
а при использовании юникодных кодировок (не англ язык) - вообще по 500 символов получится (по 1000 длине строки, но по 500 буков)
т.е. фактически макс длина строки даже не 1000/4000, а 500/2000
Ред. host_pi
» WarCraft 3 / ЦВЕТ - как из игры получить точные значения playercolor в RGB кодировке ?
Ред. host_pi
» WarCraft 3 / ЦВЕТ - как из игры получить точные значения playercolor в RGB кодировке ?
указано же, что пипеточники на красный цвет напипеткали аж 3 значения - FF0000 FF0202 FF0303 , и какой из них верный?
надо именно из кода игры получить
а еще может быть в разных патчах разные цвета прописаны, стопудов в game.dll сидят они
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
тут нету константных цветов плеерных
Ред. host_pi
» WarCraft 3 / Переодически подвисает таймер
кури тут xgm.guru/p/wc3/kak-sdelat-3-raznykh-deystviya-s-odnoy-periodi-Nx...
Ред. host_pi
» WarCraft 3 / Переодически подвисает таймер
делай в глобалку - timerdialog td=null , тогда окно будет удаляться
даже если в глобалку напишешь timerdialog td - то не будет удаляться, надо с null
call PauseTimer(t)
call DestroyTimerDialog(td)
как ты там их вообще останавливаешь
и да, окно и таймер не связаны, т.е. после удаления только окна - таймер продолжит тикать
кури коменты тут xgm.guru/p/wc3/Kak-obnulit-dannyy-tip-peremennoy-iXc/comments/vi...
Ред. host_pi
» WarCraft 3 / Как обнулить данный тип переменной
нету убийства : GroupClear, DisableTrigger, KillDestructable, KillUnit, PauseTimer и ещё десятка остальных
нету очистки : RemoveItem, DestroyGroup, DestroyTimerDialog, RemoveWeatherEffect и ещё десятка остальных
естественно не указано, что смена погоды может крашить вар ( set we = AddWeatherEffect(GetPlayableMapRect(), "zzzz") + call EnableWeatherEffect(we, true) )
про string вообще ничего не указано. я молчу про высокие материи про стринг типа моего поста выше, но банально даже лимиты стринга не указаны
то есть ценность у статьи - такая себе, полумера, которая не покрывает заявленную тему
Ред. host_pi
» WarCraft 3 / Как обнулить данный тип переменной
стринг это очень опасный тип, может быть даже самый опасный
если стринг переменную и можно обнулить, то нельзя обнулить память, которая была выделена под эту строку
при работе со стрингами забить оплимит можно в пару строк кода
ну а критануть вар так вообще одной строкой можно
https://www.hiveworkshop.com/threads/documentation-string-type.2...
если для всех объектов у нас есть функция очистки
то вот для стринга нет функции очистки
DestroyGroup(g)
set g=null
call DestroyTrigger(t)
set t=null
call RemoveDestructable(d)
set d=null
call RemoveUnit(u)
set u=null
set it=null
set L=null
set s=null --- переменная очищается автоматически
Ред. host_pi
» WarCraft 3 / зачем в Substring start -1 (minus) ?
SubString позволяет по памяти ковыряться
если через чат вводить значения отступа XX от -20 и условно до -20000 (и дальше)
выдаваемые значения обычно разные, даже если одну и ту же карту перезапустить
Ред. host_pi
» WarCraft 3 / какой есть дебагер для жаса?
сидеть как слепой котёнок аутировать по два дня на каждый баг
Ред. host_pi
» WarCraft 3 / какой есть дебагер для жаса?
точнее, ТОЛЬКО ради проверки синтаксиса
Ред. host_pi
» WarCraft 3 / какой есть дебагер для жаса?
мне приходится на другом языке всё кодить, чтобы там отладку делать хоть какую-то
на одном BJDebugMsg далеко не уедешь и будешь неделями бороться с оплимитом вместо отладки
хотя тут некоторые утверждают что оплимита не существует и за 20 лет с ним ни разу не сталкивались
ну если не кодить ничего сложнее "хелло ворлда" и счетчика убитых крипов, то наверное
вот в этих штуках тоже нельзя отладку обычного жаса делать?
https://www.xgm.guru/p/wc3/warcode
Ред. host_pi
» WarCraft 3 / зачем в Substring start -1 (minus) ?
» WarCraft 3 / зачем в Substring start -1 (minus) ?
Ред. host_pi
» Администрация XGM / Обновление 2024 - Stage 15
flat-дизайн это так красиво!
а вы не делаете дизайн сайтов на заказ? клиентам бы понравилось такое портфолио
Ред. host_pi
» WarCraft 3 / Warcraft III - MultiWindow
WMC цеплялся нормально (см сравнение ниже)
то есть вместо края экрана будет ресайз окна, если кликнуть. что полностью исключает возможность использования захвата мыши
Ред. host_pi
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
Ред. host_pi
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
это религия альтернативно-кодеров?
каким образом можно писать что lua hrua cjass vjass ...{вставить ещё сотню языков} могут больше чем оригинал?
если они в конце компиляции тупо конвертят свой личный код в обычный жас
фактически это не больше чем обёртка от конфеты, только конфета остаётся всё той же
Ред. host_pi
» WarCraft 3 / String split, shuffle
что за мода у этих кодописарей задавать границы чисел на свой рандомный лад?
что тут 500 кусков вместо 8192, доступных в жасе
что в 99,9999% камерахаков вечно от 1650 до 3300 вместо 0-10000
ещё интереснее, что автору пришлось самому пилить сплит в 2к21, ведь до него никто этого для джаса не делал? иначе зачем
Ред. host_pi
» WarCraft 3 / Циклы и их лимиты (+ способы обхода лимитов)
только вот сегодня утром опять наткнулся, уже в 3й раз в карте, на проблему оплимита в цикле, когда цикл тупо не доходит до конца и молча прерывается посередине
первый раз было с координатами юнитов - ладно, создал триггер вместо цикла - проблема решилась
вчера он аналогично не захотел обработать 50 строк длиннее 1000 символов - ну ладно, на тебе второй триггер
но нет же, сегодня во втором триггере заглох при обработке одной строки на 1400 символов (во время вызова доп функции) - пришлось делать триггер в триггере
итого 3 раза цикл из-за оплимита оборвался и не доработал, пока его на триггер не посадили
действительно, никогда не было и вот опять
Ред. host_pi
» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?
я про это выше и писал при использовании мультиязыков в одном стринге (знаки препинания - то это англ)
иероглифы и смайлы кста по 3 а не по 4 занимают, англ 1, ру 2
во второй -чатстроке сиди считай 1+3+3+3=10 при написании кода
Ред. host_pi
» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?
такое сработает:
Ред. host_pi
» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?
только вот вопрос - можно либо притворяться, что такой проблемы нет, либо открыто писать что она есть, но есть обходные пути
и тебе нужно у неё обрезать последний символ?
при этом сохранив её в переменной, а не на экране в пропечатываемых 100 символах
как быть?
делить на 4 части по 1000, потом из последней отрезать , а потом опять сплюсовать s=s1+s2+s3+s4?
как это прекрасно, люблю жасы
Ред. host_pi
» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?
set s=SubString(s,0,>1000) - не работает
т.е. и не крит и не нормальная работа
т.е. фактически макс длина строки даже не 1000/4000, а 500/2000
Ред. host_pi
» WarCraft 3 / Спецэффекты в точке
на вин 10 есть ещё это Win + Ctrl + Shift + B