14

» WarCraft 3 / как обновить функцию внутри таймерного периодического триггера?

EugeAl,
восхитительно
ещё есть - call TriggerClearActions(t)
я перед созданием темы криво накодил и голая set txt="222" не срабатывала
пришлось городить огород с переопределением тригера
а сейчас и тупо set txt="222" работает
и твоё решение подъехало вторым вариантом
14

» WarCraft 3 / Переместить триггером ящики-декор (Move)

может через создание двух декораций и отключение первой и включение второй
native SetDoodadAnimationRect takes rect r, integer doodadID, string animName, boolean animRandom returns nothing
native ShowDestructable takes destructable d, boolean flag returns nothing
14

» WarCraft 3 / Отдельный файл

	call PreloadGenClear()
	call PreloadGenStart()
	call Preload("111")
	call PreloadGenEnd("222\\333.txt")
14

» WarCraft 3 / Карта не может запуститься в локальной игре

объясни мне
как можно быть картоделом и до сих пор не знать что означает эта двойка?
Загруженные файлы
14

» WarCraft 3 / как заранее автоматически узнать кодировку каждого символа в строке?

расскажи хоть через какую фишку решил)
konvan5, чуть позже релиз готовится, это нужно было для другого кода, их оба надо релизить
14

» WarCraft 3 / Возможно ли триггерно пришить юниту тип героя и аттрибуты? +Мемхак

не замена, а присваивание героя
что такое "присваивание героя" ?
ты хочешь второй тип юнита "пришить"? что такое "пришить тип юнита" ?
или все-таки изменить тип юнита?
например благодаря добавлению типа
иъяснись подробнее?
какой тип добавить? у юнита только один тип - "тип юнита", нет?
вопрос из серии:
"можно ли пришить тип здания к футману?"
"можно ли чтобы мой юнит и летал и ходил одновременно"
"можно ли чтобы юнит бил с руки и стрелял одновременно"
"можно ли чтобы юнит был жив и был мертв одновременно"
"хочу одновременно и 0 и 1"
14

» WarCraft 3 / зачем в Substring start -1 (minus) ?

ещё по теме отсюда :
IceFog:
Если копирование функцией SubString происходит начиная с первого байта, а хэши входной строки и результата совпадают, то может быть возвращена изначально переданая строка, вместо ожидаемой подстроки.
Разработчик функции решил не создавать копию подстроки в памяти, а вместо этого временно поставить нуль-терминатор посреди оригинальной строки, передать указатель на неё в конструктор нового объекта-строки, после чего вернуть буфер в исходный вид.
Но память, которую он временно модифицировал, принадлежала менеджеру строк и её нельзя было трогать
Проблема усугубляется тем, что StringHash обрабатывает только первые 1023 байта, так что любые две строки, учитываемый регион которых совпадает, имеют одинаковый хэш, что увеличивает вероятность бага на больших строках.
SubString
RCString *__thiscall RCString::create_slice(RCString *this, RCString *result, __int16 start, __int16 end)
{
  const char *chars; // eax MAPDST
  size_t chars_length; // eax
  __int16 end_validated; // cx
  char original_char; // bl
  char *p_slice_nt_position; // esi
  RCString temp; // [esp+14h] [ebp-18h] BYREF
  int _try_level; // [esp+28h] [ebp-4h]

  chars = RCString::c_str(this);
  if ( chars && (chars_length = Storm_506_SStrLen(chars)) != 0 && start <= (__int16)chars_length )
  {
    end_validated = end;
    if ( end >= (__int16)chars_length )
      end_validated = chars_length;
    original_char = chars[end_validated];
    p_slice_nt_position = (char *)&chars[end_validated];
    *p_slice_nt_position = 0;
    RCString::ctor(&temp, &chars[start]);
    *p_slice_nt_position = original_char;
    _try_level = 1;
    RCString::from(result, &temp);
    LOBYTE(_try_level) = 0;
    RCString::dtor(&temp);
  }
  else
  {
    RCString::from(result, &RCString::null);
  }
  return result;
}

int __cdecl Jass::Common::SubString(JassString *source, int start, int end)
{
  const char *chars; // eax
  int id; // esi
  RCString slice; // [esp+8h] [ebp-18h] BYREF
  int _try_level; // [esp+1Ch] [ebp-4h]

  RCString::create_slice(&source->string, &slice, start, end);
  _try_level = 0;
  chars = RCString::c_str(&slice);
  id = GetJassStringId(chars);
  _try_level = -1;
  RCString::dtor(&slice);
  return id;
}
14

» WarCraft 3 / Возможно ли триггерно пришить юниту тип героя и аттрибуты? +Мемхак

set x=GetUnitX(u)
set y=GetUnitY(u)
set f=GetUnitFacing(u)
call RemoveUnit(u)
set u = CreateUnit(0,'Hpal',x,y,f)
статы можно написать через TextTag рядом с юнитом и двигать по таймеру на x y юнита
либо через альтернативное отображение текста кем-нибудь самописное
либо
книги может можно удалять когда негерой на них тыкнет, добавить анимацию подбора книги и писать свою систему статов (атаки) на глобалках для юнитов-негероев
14

» WarCraft 3 / ЦВЕТ - как из игры получить точные значения playercolor в RGB кодировке ?

пипеткой
это погрешность
указано же, что пипеточники на красный цвет напипеткали аж 3 значения - FF0000 FF0202 FF0303 , и какой из них верный?
надо именно из кода игры получить
а еще может быть в разных патчах разные цвета прописаны, стопудов в game.dll сидят они
14

» WarCraft 3 / Переодически подвисает таймер

даже три окна в глобалке висят на веки вечные
ты сейчас про CreateTimerDialogBJ ?
делай в глобалку - timerdialog td=null , тогда окно будет удаляться
даже если в глобалку напишешь timerdialog td - то не будет удаляться, надо с null
local timerdialog IvanWindow
вот у тебя и в локалке без null

у тебя даже нет
call PauseTimer(t)
call DestroyTimerDialog(td)
как ты там их вообще останавливаешь
и да, окно и таймер не связаны, т.е. после удаления только окна - таймер продолжит тикать

твои
set IvanTimer =null
set IvanWindow=null
вообще ничего не делают относительно удаления таймерных объектов
кури коменты тут xgm.guru/p/wc3/Kak-obnulit-dannyy-tip-peremennoy-iXc/comments/vi...
14

» WarCraft 3 / Как обнулить данный тип переменной

Да есть же
нету создания : 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 вообще ничего не указано. я молчу про высокие материи про стринг типа моего поста выше, но банально даже лимиты стринга не указаны
то есть ценность у статьи - такая себе, полумера, которая не покрывает заявленную тему
14

» WarCraft 3 / Как обнулить данный тип переменной

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 --- переменная очищается автоматически
статьи по правильному созданию и обнулению всех типов переменных тоже нет до сих пор
14

» WarCraft 3 / зачем в Substring start -1 (minus) ?

как отметил IceFog
SubString позволяет по памяти ковыряться
если через чат вводить значения отступа XX от -20 и условно до -20000 (и дальше)
выдаваемые значения обычно разные, даже если одну и ту же карту перезапустить
	call BJDebugMsg(SubString("0123456789",0-S2I(XX),50))
Загруженные файлы
14

» WarCraft 3 / какой есть дебагер для жаса?

EugeAl, ясно короче, сплошной хело ворлд вместо кодинга
что ещё надо?)
когда не работал с отладчиком - то конечно и знать не знаешь - что он позволяет делать в коде, который длиннее 10 строк
сидеть как слепой котёнок аутировать по два дня на каждый баг
14

» WarCraft 3 / какой есть дебагер для жаса?

это же просто подсветки кода. Помогут найти синтаксическую ошибку
лол, щас бы ради проверки синтаксиса доп софт ставить
точнее, ТОЛЬКО ради проверки синтаксиса
14

» WarCraft 3 / какой есть дебагер для жаса?

да я скоро повешаюсь с этим джасом
мне приходится на другом языке всё кодить, чтобы там отладку делать хоть какую-то
на одном BJDebugMsg далеко не уедешь и будешь неделями бороться с оплимитом вместо отладки
хотя тут некоторые утверждают что оплимита не существует и за 20 лет с ним ни разу не сталкивались
ну если не кодить ничего сложнее "хелло ворлда" и счетчика убитых крипов, то наверное
в одну функцию приходится аж по три триггера засовывать, чтобы этого старпёра на пинках заставлять работать нормально
странно, что сообщество кодит карты и всякий софт, но не может накодить себе отладчик хотя бы примитивный
вот в этих штуках тоже нельзя отладку обычного жаса делать?