28

» WarCraft 3 / Как ждать меньше 0.10? v2.0

Принятый ответ
только таймеры
иначе НИКАК
в следующий раз дам бан
28

» WarCraft 3 / vjass Нужна помощь

Принятый ответ
Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
и на будущее
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
28

» WarCraft 3 / Десинхронизация на карте (выложил карту)

А J фаил скидывать то смысла нет думаю...
не стоит тебе думать о таких вещах
ибо плохо получается
во первых в j файле весь код а не только триггеры
во вторых там всё записано в джасс и нету никакого гуи и разделения на триггеры
и в третьих (что самое важное) его можно открыть в БЛОКНОТЕ и заюзать поиск по файлу
28

» WarCraft 3 / Генерация handle'ов в Warcraft 3

Принятый ответ
Пушистый, создал и удалил 100к юнитов
результат счётчика 1100
на всякий случай сообщу что 1100 меньше чем 100к
так же не стоит забывать что вар тупит с большими сериями (если подряд создаётся/удаляется много объектов)
и начинает добавлять после последнего удалённого хэндла хотя предыдущие свободны и не занимают память
при следующей пересборке таблицы это проходит
для того чтобы счётчик адекватно реагировал на это надо чтобы размер серии счётчика был больше чем размер серии создаваемых объектов
я слегка модифицировал твой счётчик
globals
    leaderboard udg_HandleBoard = null
endglobals
define sizehc=300;
function HandleCounter_Update takes nothing returns nothing
   local integer i = 0
   local integer id
   local location array P
   local integer result=0
   local integer min=-1;
   loop
      exitwhen i >= sizehc
      set i = i + 1
      set P[i] = Location(0,0)
      set id = GetHandleId(P[i])
      id-=0x100000
      if(min==-1){
        min=id;
      }
      if(id>result){
        result=id;
      elseif(id<min)
        min=id;
      }
   endloop
   if(result-min>sizehc){
    result=min;
   else
    result-=sizehc
   }
   loop
      call RemoveLocation(P[i])
      set P[i] = null
      exitwhen i <= 1
      set i = i - 1
   endloop
   call LeaderboardSetItemValue(udg_HandleBoard,0,result)
endfunction

function HandleCounter_Actions takes nothing returns nothing
   set udg_HandleBoard = CreateLeaderboard()
   call LeaderboardSetLabel(udg_HandleBoard, "Handle Counter")
   call PlayerSetLeaderboard(GetLocalPlayer(),udg_HandleBoard)
   call LeaderboardDisplay(udg_HandleBoard,true)
   call LeaderboardAddItem(udg_HandleBoard,"Handles",0,Player(0))
   call LeaderboardSetSizeByItemCount(udg_HandleBoard,1)
   call HandleCounter_Update()
   call TimerStart(GetExpiredTimer(),0.1,true,function HandleCounter_Update)
endfunction

function InitTrig_HandleCounter takes nothing returns nothing
   call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction
у меня создаётся и удаляется более 2к юнитов сериями по 200
длинна серии счётчика задаётся в sizehc (в моём случае это 300)
вот триггер создания юнитов
function Trigcru takes nothing returns nothing
    local unit u= CreateUnit(Player(0),'hfoo',0,0,0)
    call RemoveUnit(u)
    set u=null
endfunction

function Trigcrul takes nothing returns nothing
    local integer i=0
    loop
        call Trigcru()
        exitwhen i==200
        set i=i+1
    endloop
    
     
endfunction

function Trig___________________________u_Actions takes nothing returns nothing
    local integer i=0
    loop
        call Trigcrul()
        call TriggerSleepAction(0.1)
        call DisplayTextToPlayer(GetLocalPlayer(),0,0,I2S(i))
        exitwhen i==10
        set i=i+1
    endloop
    set i=0
    call DisplayTextToPlayer(GetLocalPlayer(),0,0,"end")
    call TriggerSleepAction(1)
    
endfunction

//===========================================================================
function InitTrig___________________________u takes nothing returns nothing
    set gg_trg___________________________u = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg___________________________u, 2 )
    call TriggerAddAction( gg_trg___________________________u, function Trig___________________________u_Actions )
endfunction
28

» WarCraft 3 / Как ждать меньше 0.10?

Принятый ответ
Darknessay, ждать (иначе говоря wait или TriggerSleepAction) не может быть меньше чем 0,1 секунды и имеет погрешность в 0,1 секунды
единственный выход это переходить на таймеры
таймеры на гуи нормально не заюзаешь поэтому нужен джасс
если не нравиться то близы с радостью выслушают твои пожелания и включат в следующий патч
28

» WarCraft 3 / Ослабление

BrEd Pitt, без дами каста никак
либо спелы с кучей уровней либо куча спелов
напрямую менять нельзя
28

» WarCraft 3 / Десинхронизация на карте (выложил карту)

Fraps, пофиг какой дебаг
главное чтобы лог десинка был
да нужно играть с людьми
составив лог и зная время десинка мы получаем список функций которые могут приводить к десинку
проанализировав их все мы можем узнать что именно вызвало десинк
кэп подсказывает что проанализировать 10 строк кода найденные с помощью дебага намного проще чем анализировать весь код
Fraps, и скинь наконец j файл
28

» WarCraft 3 / Генерация handle'ов в Warcraft 3

Пушистый, сколько времени ждал?
gc ведь не сразу их подбирает
пока найдёт
пока покурит
пока соберёт
Пушистый, кинь свой счётчик в виде кода
а то переписывать со скрина нету никаких желаний
28

» WarCraft 3 / Генерация handle'ов в Warcraft 3

если речь про хэндлы то кроме удаления объектов нужно обнулять переменные
хэндлы бывают разными
100к точек это меньше 1 метра
а 100к юнитов это намного больше
28

» WarCraft 3 / Десинхронизация на карте (выложил карту)

Fraps, а как мы должны понять в каком месте десинк?
читать весь код?
а так мы бы просто дебаг сделали и узнали что приводит к десинку
к слову по правилам академии ты сам должен был сделать дебаг и скинуть результаты
и если так хочешь чтобы мы проверили код то кидай не карту а j файл
+ десинк бывает ещё из за кривого ланда и кривых моделей
28

» WarCraft 3 / Освобождается ли память корректно после удаления триггера

Принятый ответ
наличия триггера на получение урона для каждого юнита
так делать нельзя
это же полный бред
просто добавляем событие к уже существующему триггеру вот и всё
нормального сборщика мусора в варе нет и скорее всего не будет(если близы даже рб поленились убрать то о нормальном gc можно забыть)
так же не стоит забывать что сборщик мусора срабатывает не сразу
если мне не изменяет память то save сохраняет объекты и значения переменных
а при загрузке восстанавливает связи (заносит значения в переменные, регистрирует события и прочее)
так что всякий мусор просто не проходит
а вообще лучше забей на это
в варе есть более серьёзные утечки от которых нельзя избавиться
например руны
+ создание и удаление триггеров вредит намного больше чем пара сотен килобайт памяти
да и вряд ли у тебя за игру будет 50к юнитов
28

» WarCraft 3 / Освобождается ли память корректно после удаления триггера

событие это 4 байта вроде
50к событий тогда занимают целые 200кб
так что можно особо не волноваться
но вообще если ты удаляешь триггеры значит ты криво написал код
при нормальной архитектуре в этом нету необходимости
28

» WarCraft 3 / Смена оружия.

Принятый ответ
molot39, очень очень очень криво и костыльно
gabriel_fisher, заводишь логическую переменную (назовём её isItem)
устанавливаем переменную isItem в false(ложь/нет)
циклом перебираешь слоты с 1 по 6
если предмет в слоте "переменная цикла" имеет 2 уровень и не равен подобранному предмету то устанавливаем isItem в true(истина/да)
после цикла идёт условие
если isItem равно true(истина/да) то
выбрасываем подобранный предмет
для того чтобы было муи нужно юзать локалки и джасс
подробнее можно найти там
28

» WarCraft 3 / Существует вообще такой способ?

quq_CCCP, создавать в прелоаде никто и не собирается
сначала считываем данные (своего рода маска) а потом накладываем эту маску на функцию создания триггеров
28

» WarCraft 3 / Fatal Error при загрузке карты?

Принятый ответ
Кет, это 4 оператора взятых из вджасс и сиджасс
видимо так юные айсфроги называют эти 2 диалекта jass
ответ прост
качаем джнгп последней версии и ЧИТАЕМ МАНУАЛЫ
28

» WarCraft 3 / Утечка при вызове функции

ещё вроде можно сделать так
function CreateProjectile takes nothing returns unit
return CreateUnit(Player(0),'hpea',0,0,0)
endfunction
28

» WarCraft 3 / Баланс в карте

Clamp, гейм дизайнер это понятно
вроде ктото ещё кроме него есть
если как я уже писал мне не изменяет память
28

» WarCraft 3 / Существует вообще такой способ?

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

» WarCraft 3 / Существует вообще такой способ?

так и ручками изменить файл будет посложнее ибо надо знать алгоритм шифрования либо часть часто используемых кодов
28

» WarCraft 3 / Существует вообще такой способ?

Clamp, учитывая вопрос автора он "впервые открыл WE"
ну по крайне мере джасс не особо хорошо знает
иначе бы сам нашёл ответ
так что я скинул всё что может понадобиться для того чтобы разобраться в прелоаде
если триггеров много то делать кучу файлов не лучшее решение
лучше 1 файл с загрузочным кодом который бы говорил какие триггеры надо выключать
28

» WarCraft 3 / С глобальными перемеными будет работать или локальные лучше?

Принятый ответ
Denis55, перезапись будет
но из за того что это гуи локалки использовать нельзя (условия это другая функция)
так что выход лишь 1
вместо переменных подставляй сразу значения
или сделай бд всех цен
и вместо того чтобы делать по триггеру на каждый тип юнита сделай 1 триггер который будет брать параметры из бд и проверять хватает ли ресурсов
если хватает то отнимает цену из бд от текущего количества
если нет то пишет что не хватает
вот статья про бд
28

» WarCraft 3 / World Editor (вопрос)

XmegatronX, то что написали работает (хоть и кривовато)
если ты не умеешь читать(или писать) это твои и только твои проблемы
28

» WarCraft 3 / Существует вообще такой способ?

Принятый ответ
FlyTab, ему нужно чтобы когда игрок играет первый раз триггер работал
а при втором запуске карты не работал
для этого нужно хранить данные на диске
для одиночной игры это можно сделать через кэш
для мультиплеера с помощью прелоада
и то и то описано в статьях
для того чтобы сделать это придётся прочитать часть 2 раздела и почти половину 1 раздела
это около 30 статей
вот некоторые из них (в порядке возрастания сложности)
если чтото знаешь можешь не читать