Steal nerves #1 - 30 минут назад (отредактировано ) 2

» Я очень плохой клоун =( / Брейншторм по контентной стратегии XGM

» предложение
Еще неплохо было в темах "заклинание на заказ" сделать удобный поиск. Конечно, поиск находит комментарии, но заходишь по ссылке, а тебя кидают на страницу с первыми сообщениями (а нужный коммент находится далеко за пределами, и ищите сами). Это и есть недостаток таких тем. Когда-то давно на форуме похожая тема была, искал долго. Но больше потом не лазил, зачем? сам сделаю. Имею в виду недостаток в поиске наработки/заказа. Я впервые дни столько наработок накачал, но потом, когда надо что-то конкретное, заново не захочешь рыться в этом
Удобно было бы сделать сортировку, отгруппировать заказы. Например, заклинание: "огненный шар, который летит и попадает в противника. И наносит дамаг." Отгруппировать заказ как магия, огонь, активное, цель итд. И с картинкой. Если кто-то захочет найти, то всегда найдет в этой теме.
это предложение
Steal nerves #2 - 3 часа назад (отредактировано ) 0

» WarCraft 3 / Генератор предметов

Artyom18, можно. только обычным не откроешь, а нужно скачать jngp и включить плагин USM. Этот плагин предоставляет новые гуишные функции (огромный набор) и много чего другого. Вообще-то это все есть на jass и можно было без этого плагина, но специально для гуишников предоставили функции. Походу у автора где-то используется нестандартная гуишная команда, и обычный редактор ее не распознает.
» пример
Давно когда начинал. Я пытался сделать итем Power Threads из доты. там простая подмена. используется обычная нативка. Она есть в варкрафте 3, но в гуишном варианте не отображается. А если включишь плагин, то тебе даст эту нативку в гуи. Станд. редактор не видит это и поэтому закрывает карту
native UnitAddItemToSlotById takes unit whichUnit, integer itemId, integer itemSlot returns boolean
у меня открывается
Steal nerves #3 - 11 часов назад (отредактировано ) 6

» Я очень плохой клоун =( / Брейншторм по контентной стратегии XGM

У нас такое тоже есть.
что-то не видел, я имел в виду вот так
прикреплены файлы
Steal nerves #4 - 12 часов назад (отредактировано ) 0

» Я очень плохой клоун =( / Брейншторм по контентной стратегии XGM

Есть допустим темы по варкрафту. Например, заклинания/иконки на заказ. Чтобы под сообщением заказа были прикреплены ответы (видел такое на других сайтах). Я думаю это классной идеей, чем листать n-количество страниц в поисках ответа. И приятно на глаз, чем видеть такое
это мое предположения, хотя этими разделами никто не пользуется, наверное
Вторая проблема - это нехватка наработок и интересных фитч. Хайв в этом плане интереснее, больше скилов триггерных и наработок с картинками (изображения отображают в мозгу какой это скилл и тд). У вас они разбросаны по всему сайту и форуму. Кстати я недавно нашел страничку, где было в ней кучу ссылок на наработки, алгоритмы и др.
Steal nerves #5 - 2 дня назад (отредактировано ) 0

» WarCraft 3 / Помогите исправить ошибку

» объяснение
если ты читал статью, то знаешь имеешь представление о том, что такое локальная переменная и в чем разница между глобальной переменной. И область их применения.
Kolya12, вот допустим есть два одинаковых юнитов с одинаковыми абилками. Один юнит принадлежит тебе, второй другому игроку. Ты применяешь скилл, который вешает эффект на 15 секунд. После чего должен удалиться эффект. Эффект нужно где-то сохранить, верно? И юнита, на которого повесили эффект, также нужно сохранить. Проще говоря нужны ссылки. нужно на что-то ссылать. Все переменные - это ссылки на объекты. Так вот, если вдруг другой игрок в это время возьмет и применит скилл, и перезапишет глобалки на юнита, и на эффект. Чтобы этого не было существуют локалки.
На самом деле локалки действуют внутри функции, это их недостаток (в гуи вообще не применимо, там часто будет вызов других функции). Внутри функции можно только с вэйтами поиграть. работает норм. Но, если вызвать отдельную функцию локалки не помогут, нужно с помощью глобалок переносить на другие функции или использовать аргументы функции. Ты берешь ссылку юнита и переносишь на другой триггер, где периодично что-то делает с ней (возможно там где-то по случайности переписали ее).
Есть проблема во времени, если будет задержка, то глобалки можно перезапить за это время. И в игре нарушится все. Нормально локалки работают с вэйтами внутри функции. Но, если хочется сделать что-то большое, например, каждую секунду наносить урон от лица юнита. То тут нужен таймер или триггер с периодичным таймером. Тут локалки не помогут. И кстати вэйт работает дольше указанного.
Если взять и создать несколько юнитов, и попробовать взять всех их заставить запустить одновременно одну способность. То тут выяснится, что триггер не выполняет параллельно, а последовательно. Можно проверить дебагом. Короче триггер выполняет поочередно, и мгновенное, если нет никаких временных задержек между ними. Может быть и есть исключение, но не проверял (например на ExecuteFunc). Проще говоря, локи не обязательны, не понятно зачем они нужны (но мне они нужны для удобства, еще плюсы в них есть), можно всю игру юзать глобалки (темповые глобалки, короче временные ссылки). На самом деле нужно посмотреть как используют МУИ (там используют массивы, для каждого потока можно создавать свой массив, например есть счетчик потока GetTriggerExecCount xgm.guru/p/wc3/184282 или использовать переменную в качестве счетчика).
Допустим, если два юнита запускают одновременно один скилл. Он обработает сначало первый запуск триггера, потом второй запуск. Короче два потока запускает последовательно. Но, если в триггере написано что между частями триггера есть вэйт, то пропустит и запустит следующий поток. То есть, первый поток остановится на паузу из-за вэйта, игра решит не ждать, и запустит следующий поток.
Кстати говоря, аргументы (параметры) функции - это тоже локальные переменные. Где-то прочел.
Представь, идет действие - потом какая задержка во времени (вэйтом или таймером) - затем продолжение триггера. Если во время задержки перезаписали ссылки. то все. Нужно делать так, чтобы не пересекались ссылки между собой. Для этого существует МУИ, хэш-таблица + хэндлы + локалки.
тут просто сложная система у тебя, так нагорожена и запутано. Я убрал лишнее и написал на jass. косяк в том, что между триггерами Jump и JumpFlyLoop есть ссылка (переменная), которую, видимо, перезаписывают. Также повторное использование другим юнитом перезапишет в Jump еще раз. Твои триггеры сложно было читать, все эти манипуляции локалками-глобалки, и наоборот, только путают. Где то в этих манипуляциях ты ошибся, раз не хотят опускать на землю. По логике их должно опустить после опр. времени (это после вэйта в Jump). Посмотрел бы как делаются прыжки на сайте. на хайве. Хотел недавно найти прыжок самурая-орка, когда в прыжке анимацию проигрывает, и показывает. что рубит сверху. Красиво сделано. Но не нашел (придеться самому делать), все время попадаются уродливые прыжки, особенно как у тебя (извини не хотел обидеть, просто прыжок не выглядит настоящим, реальным). гуи и муи много попадались.
прикреплены файлы
Steal nerves #6 - 3 дня назад (отредактировано ) 0

» WarCraft 3 / Помогите исправить ошибку

жалуется редактор на JumpSecPoint, неправильно написали где-то название переменной вот и ошибка. То есть такая переменная не существует и игра не распознает ее. Подсказка: ошибка в триггере JumpFlyLoop
убрал эту переменную, теперь указывается ошибку на другую строчку. Убрал, на еще одну. где-то с третьей попытки запустилось
р
прикреплены файлы
Steal nerves #7 - 3 дня назад (отредактировано ) 0

» WarCraft 3 / Помогите исправить ошибку

Kolya12, смотри на скрин
Пометил ошибки номерами на скрине:
  1. ошибка локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед поставил действие "включить триггер ...", а потом начал объявлять локи
  2. во-втором скрине там ты не объявил. Там на каждую функцию надо объявлять новые локальные переменные. то есть локалка работает внутри функции (конвентируй и посмотри как там устроено), в других функциях эта переменная не работает, ее не существует (короче область действия своя у локалки, вначале она объявляется, в конце блока функции перестает работать). вот пишешь: "set u = GetTriggerUnit()", но эта переменную игра может не распознать, так как не существует, даже, если она объявлена в другой функции (в другом триггере или где-то там еще) там другая локалка, хотя имена одинаковы. Во-втором скрине ты заново объяви
почему локалки не обнуляем?
прикреплены файлы
Steal nerves #11 - 3 дня назад (отредактировано ) 2

» WarCraft 3 / Простой вопрос по хэш-таблице

Doc, если бы локалку целочисленную объявил в начале и засунул хэндл, то можно было менять местами как хочешь? это можно проверить, сохранить что-нибудь в хэше и потом проверить дебагом
» код
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
//и потом мог бы и вот так
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,id)
set t = null
Steal nerves #12 - 3 дня назад 0

» WarCraft 3 / Смайлы

Вы что прикалываетесь?
прикреплены файлы
Steal nerves #13 - 3 дня назад (отредактировано ) 0

» WarCraft 3 / Помогите исправить ошибку

  1. первый скрин - это что-то с библиотекой. Скидывай карту.
  2. со вторым ты не правильно делаешь, видимо ты новичок. надо статьи прочитать. Ты просто с локалками что-то не то делаешь, надо через CS прописывать, просто гуи не видит локи. xgm.guru/p/wc3/jass_local_vars Но я не сторонник слать, ибо нет норм статьи у нас "как превратить из новичка в jassера".
» то что ты делаешь с локалками
я конвентировал в код
есть локалка JumpCaster и есть глобалка udg_JumpCaster - это две разные вещи
function Trig_Jump______________________2_Actions takes nothing returns nothing
    //локалки
	local unit JumpCaster 
    local location JumpCasterPoint
    local location JumpTargetPoint
    local location JumpSecSecPoint
    call CreateNUnitsAtLoc( 1, 'hfoo', Player(PLAYER_NEUTRAL_PASSIVE), GetSpellTargetLoc(), bj_UNIT_FACING ) //GetSpellTargetLoc() - это точка, утечка и BJ можно раскрыть
    set udg_JumpCaster = GetSpellAbilityUnit() //тут в глобалку засовываешь
    set udg_JumpCasterPoint = GetUnitLoc(GetSpellAbilityUnit()) //тут тоже в глобалку засовываешь
    set udg_JumpTargetPoint = GetUnitLoc(GetLastCreatedUnit()) //тоже в глобалку засовываешь
    call RemoveUnit( GetLastCreatedUnit() ) //я так понял ты создал даймика для проверки проходимости раз сразу удаляешь. мб проверять точку на проходимость заранее, в варе есть нативка
    call PauseUnitBJ( true, udg_JumpCaster ) //паузим кастера
    call SetUnitPathing( udg_JumpCaster, false ) //снимаем проходимость
    set udg_JumpTrailEffects[0] = GetLastCreatedEffectBJ() //это глобалка
    set udg_JumpTrailEffects[1] = GetLastCreatedEffectBJ() //зачем повторно? GetLastCreatedEffectBJ() - эта одна и та же, но в разных массивах храниться будет
    call UnitAddAbilityBJ( 'Amrf', udg_JumpCaster ) //глобалка, добавляем ворону
    call EnableTrigger( gg_trg_JumpFlyLoop_____________________u ) //включаем триггер, перемещает каждую 0,01 сек. ближе к точке, ссылка на кастера это udg_JumpCaster и точку udg_JumpTargetPoint, в качестве ссылки нужен тут хэш или МУИ + таймер 
    call SetUnitFlyHeightBJ( udg_JumpCaster, 350.00, 350.00 ) //поднимаем
    call TriggerSleepAction( 0.46 )  //вэйт, ждем
//после вэйта глобалки могут быть перезаписаны (например, тебе захочется нажать еще раз), лучше ссылать на локалки

    call SetUnitFlyHeightBJ( udg_JumpCaster, 0.00, 350.00 ) //опускаем
    call TriggerSleepAction( 0.30 ) //вэйт. ждем
    call ResetUnitAnimation( udg_JumpCaster )
    call DisableTrigger( gg_trg_JumpFlyLoop_____________________u ) //выкл. триггер
    call TriggerSleepAction( 0.03 ) //ждем
    call UnitRemoveAbilityBJ( 'Amrf', udg_JumpCaster ) //удаляем ворону
    call PauseUnitBJ( false, udg_JumpCaster ) //паузу снимаем
    call SetUnitPathing( udg_JumpCaster, true ) //проходимость включ.
    call RemoveLocation(udg_JumpTargetPoint) //все точки удалил?
    call RemoveLocation(udg_JumpCasterPoint)
    set udg_JumpCaster = null
    call DestroyEffectBJ( udg_JumpTrailEffects[0] )
    call DestroyEffectBJ( udg_JumpTrailEffects[1] )
//забываешь обнулить локалки типа юнит. точки
endfunction
» надо было так с локалками делать (не через менюшки ГУИ, а через код)
получился не полным
    local unit JumpCaster = GetSpellAbilityUnit()
    local location JumpCasterPoint = GetUnitLoc(GetSpellAbilityUnit())
    local location JumpTargetPoint = GetSpellTargetLoc()
    local location JumpSecSecPoint
    call CreateNUnitsAtLoc( 1, 'hfoo', Player(PLAYER_NEUTRAL_PASSIVE), JumpTargetPoint, bj_UNIT_FACING )
	call RemoveLocation(JumpTargetPoint)
	set JumpTargetPoint = GetUnitLoc(GetLastCreatedUnit()) //не знаю зачем такая сложность. мб ты даймиком проверяешь можно ли туда телепортнуть
» мои глаза
И почему при объявление спецэффектов локальными карта не запускается
local effect JumpTrailEffects[0]
local effect JumpTrailEffects[1]
потому что это неправильно тоже, нужно объявить что эта переменная с массивами, например
local effect array JumpTrailEffects
а потом уже
set JumpTrailEffects[0] = ...
set JumpTrailEffects[1] = ...
Steal nerves #14 - 3 дня назад (отредактировано ) 4

» WarCraft 3 / Как добавить итем в лавку?

xgm.guru/forum/showthread.php?t=615&page=1 пункт 2.9 (как триггером добавить в лавку)
xgm.guru/forum/showthread.php?t=31919 пример (если интересует система рынка, тут можно посмотреть, как сделать)
и мой пример (файл) - тоже система покупки и продажи предмета на jass
и закрой вопрос, если нашел ответ
прикреплены файлы
Steal nerves #15 - 4 дня назад (отредактировано ) 0

» WarCraft 3 / Как определить и сравнить расстояние между точками.

вот (пикаешь, потом перебираешь всех и находишь самого дальнего). Точки сам удалить не забудь
прикреплены файлы
Steal nerves #16 - 5 дней назад (отредактировано ) 2

» WarCraft 3 / Москиты

Можно еще вот это через Pick of Units (в предыдущей теме скидывал). Мб это уже было, но пригодится новичкам
» код
globals
unit UNITHERO
integer CountUn = 0
endglobals

function Trig_g_Conditions takes nothing returns boolean
    return( GetSpellAbilityId() == 'A000' )
endfunction

function Trig_X takes nothing returns nothing

if UNITHERO != GetEnumUnit() then
    set CountUn = CountUn + 1
endif
endfunction

function F_D takes nothing returns boolean
local real x1 = GetUnitX(UNITHERO)
local real y1 = GetUnitY(UNITHERO)
local real x2 = GetUnitX(GetFilterUnit())
local real y2 = GetUnitY(GetFilterUnit())

local real dx = x2 - x1
local real dy = y2 - y1

local real r = 400. //здесь указываем радиус (сами укажите) !!!

return (dx*dx + dy*dx < r*r)
endfunction

function Trig_g_Actions takes nothing returns nothing
local group g = CreateGroup()
local real x = GetUnitX(GetTriggerUnit())
local real y = GetUnitY(GetTriggerUnit())
local location loc = Location(x,y)
local boolexpr f = null 
local boolexpr f1 = Condition(function F_D)
set UNITHERO = GetTriggerUnit()
set CountUn = 0
//call GroupEnumUnitsInRange(g, x, y, 400., f) //ловит всех юнитов, находящихся в радиусе от точке, но москитов не ловит
//call GroupEnumUnitsInRangeCounted(g, x, y, 400., f, 4) //аналогична GroupEnumUnitsInRange, но берет определенное кол-во юнитов. Москитов не ловит
//call GroupEnumUnitsInRangeOfLoc(g, loc,400., f) //аналогична GroupEnumUnitsInRange. Москитов не ловит.
//call GroupEnumUnitsInRangeOfLocCounted(g, loc,400., f, 4) //аналогична GroupEnumUnitsInRangeCounted. Москитов не ловит.
//call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea ,f1) //ловит всех юнитов в области. Москитов не ловит.
//call GroupEnumUnitsInRectCounted(g,bj_mapInitialPlayableArea ,f1, 4) //ловит определенное кол-во юнитов в области. Москитов не ловит. 
//call GroupEnumUnitsSelected(g,GetTriggerPlayer(),f) //ловит юнитов. выделенным игроком. Москитов. очевидно. не ловит.
call GroupEnumUnitsOfPlayer(g,GetTriggerPlayer(),f1) //ловит всех-всех юнитов игрока на карте. Москитов ловит нормально.
//call GroupEnumUnitsOfType(g,"Peasant", f) //ловит всех-всех юнитов с этим именем. Нужно писать английский аналог название (например работник = Peasant). Ловит москитов.
//call GroupEnumUnitsOfTypeCounted(g,"Peasant", f, 4) //ловит опреденное кол-во юнитов группу. Ловит Москитов.


call ForGroup(g, function Trig_X)
call BJDebugMsg("Кол-во юнитов: " + I2S(CountUn))
call RemoveLocation(loc)
call DestroyGroup(g)
call DestroyBoolExpr(f)
call DestroyBoolExpr(f1)
set g = null
set f = null
set f1 = null
set loc = null
endfunction

//===========================================================================
function InitTrig_g takes nothing returns nothing
    set gg_trg_g = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_g, Player(0), EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_g, Condition( function Trig_g_Conditions ) )
    call TriggerAddAction( gg_trg_g, function Trig_g_Actions )
endfunction
еще советую посмотреть наработки с отрядами (формациями как в total war), как там управляют с москитами
прикреплены файлы
Steal nerves #17 - 5 дней назад 2

» WarCraft 3 / Как сделать триггерный приказ юниту двигаться к рандомной обл.?

» код
local rect R = //твоя область
local real x = GetRandomReal(GetRectMinX(R), GetRectMaxX(R))
local real y = GetRandomReal(GetRectMinY(R), GetRectMaxY(R))
и посылаем к этим случайным координатам
Steal nerves #18 - 5 дней назад (отредактировано ) 0

» WarCraft 3 / тригер тд

за такие вопросы надо наказывать, честно, надоело. См. простую карту
Ответ: нужно создать счетчик - целую переменную. При создании юнита - прибавляй, при смерти - убавляй
прикреплены файлы
Steal nerves #19 - 6 дней назад (отредактировано ) 0

» WarCraft 3 / Спящий юнит входит категорию целей духи?

у целей есть тип "Духи", но в триггерах нет такой фишки, как определить к какому типу цели относится юнит. Можно классификацию использовать. Заметил, что духи это есть у орочьих вардов, у них у всех есть классификация "страж", но такого типа классификации в триггерах тоже нет. Предлагаю использовать другие классы (добавь в РО)
во-вторых, как определить. что юнит спит. это другой вопрос. Тут в сон могут вогнать исскуственно с помощью абилки героя-вампира (проверяют с помощью классификации), или нейтралы ночью спят (там есть эти функции, только криво что-то работают)
Steal nerves #20 - 6 дней назад 0

» WarCraft 3 / Цепь молний пассивка

Alexey86, это если триггерную цель молнию не сделать. раньше у меня была где-то наработка (сделал тогда в точь-точь как и станд. цепь молнии). эта орба у нее минусов много
Steal nerves #21 - 6 дней назад (отредактировано ) 0

» WarCraft 3 / Не берет москитных юнитов в группу

есть еще один способ (это мне пришло в голову, вообще-то давно, но я это не реализовывал)
» пример
  1. берем GroupPickUnitsOfPlayer про которую сказал бедный quq_CCCP,
  2. в этой функции прописываем фильтр
  3. в фильтре проверяем попала ли точка юнита Caster в круг
function Find_Dummy takes nothing returns nothing
local real x1 = GetUnitX(Caster)
local real y1 = GetUnitY(Caster)
local real x2 = GetUnitX(GetFilterUnit())
local real y2 = GetUnitY(GetFilterUnit())

local real dx = x2 - x1
local real dy = y2 - y1

local real r = 500. //здесь указываем радиус (сами укажите) !!!

return (dx*dx + dy*dx < r*r)
endfunction
...
set Caster = GetTriggerUnit() //эта глобалка юнита
call GroupEnumUnitsOfPlayer( grp, pl, Condition( function Find_Dummy ))
...
Steal nerves #22 - 6 дней назад 0

» WarCraft 3 / Не берет москитных юнитов в группу

Нет нельзя. Функция не выделяет юнитов с этой способностью, нужно заранее сначала выбрать всех, а потом дать всем "Москиты". Даже события "юнит вызывает боевую единицу" не ловит. Словить можно по событию "юнит входит в регион ... ", но только регион, а не вокруг точки, как вы хотите выше. Пробуйте. как предложил GetLocalPlayer
Steal nerves #23 - 6 дней назад (отредактировано ) 1

» WarCraft 3 / Юниты на борту транспорта.

даю ссылки как отследить, а вот эффекты прибавите/убавите сами (это юзайте способности)
Steal nerves #24 - 1 неделю назад 0

» WarCraft 3 / Рандомизация героев

там не функция, а система. чаще всего берут массив переменной типа тип юнита, забивают в него всех героев. короче базу данных делают.
есть замечательная функция
GetRandomInteger //такая функция, ищи в гуи строчку Random Integer
выбирает случайное число, то есть массив от ... и до ...
проблема в том. что часто могут попадаться одни и те же числа, и это проблема рандома
Steal nerves #25 - 1 неделю назад 0

» WarCraft 3 / Как воскрешать умершего Героя способностью?

В целях можно заметить, что действует на мертвых. Мертвые - трупы, так нужен труп, а герой не оставляет труп (хотя остается в игре сам, иконка героя торчит и тд.). Хотя можно настроить так, чтоб оставлял труп (время смерти в РО задать и тип смерти сменить), но, к сожалению, это не работает (проверял). Без триггеров это не сделаешь. Недавно была тема как воскресить героя в АОЕ (что-то не смог найти)
Steal nerves #26 - 1 неделю назад 0

» WarCraft 3 / Jass New Gen Pack - Rebuild 1.3

B_KPOBATb, смотри в шапке темы, где написано "при наличии проблем". там написано если проблема при установке, то попробуй тогда архив скачать и распаковать архиватоваром
Steal nerves #27 - 1 неделю назад 0

» WarCraft 3 / Циклы в cJass

ImbaStyle, взял бы и дебагом проверил
Steal nerves #28 - 1 неделю назад (отредактировано ) 0

» WarCraft 3 / Циклы в cJass

exitwhen - это и есть выход. Рядом с ним прописывают условие (булеан). Как цикл работает? пошагово: сверху-вниз. и так до сих пор пока условие не выполнится (может бесконечно). Если не прописать туда норм условие выхода, то крит. ошибка. Он каждый раз проверяет. Пример, вот во второй функции:
set res = res * num операция вычисления (мы тут что-то делаем, с каждым разом перемножаем и res становится больше или меньше, если умножим на отр. число num)
exitwhen (i >= pow) если условие верно, то выходим из цикла, и перестаем пробегать сверху-вниз
set i = i + 1 прибавляем
во второй функции сколько раз (pow) перемножать на num. Это своего рода возведение в степень что ль? Это можно представить как pow - степень, num - число. Думаю, что первая функция это то же самая что вторая, абсолютно одинаковы. Есть функция близзардов Pow - возведение в степень. Извиняюсь, там про реальное число
Steal nerves #29 - 1 неделю назад (отредактировано ) 0

» WarCraft 3 / Вопрос про таймер

ImbaStyle, паузу тоже можно сделать) это надо продумать. можно не паузить таймер, а сохранять boolean а где-то в твоем коде доставать эту логическую и проверять. и тому подобное
и не обязательно при старте, можно от любого момента времени.
р
Steal nerves #30 - 1 неделю назад (отредактировано ) 1

» WarCraft 3 / Вопрос про таймер

» разъяснения
  1. берете таймер + хэндл и хэш-таблица (это простой пример). И можно массивы перебирать каждый раз (есть еще XAT на cjass).
  2. в чем суть этого метода? берете при старте игры запускаете один таймер на все.
  3. при запуске триггера или функции сохраняете текущее время этого таймера в хэше или переменную, при повторном запуске сверяете текущее время и прошедшее (сохраненное) время
есть такие команды как
TimerGetRemaining
TimerGetElapsed
TimerGetTimeout
из них можно вытащить текущее, сколько прошло, и заданное время
  1. таймер не обязательно удалять
вообще-то когда много таймеров работает это плохо, проседает. Лучше когда таймеров меньше было. Если у вас в течении игры работает 50 таймеров, не лучше ли сделать несколько?
есть еще баги с таймером xgm.guru/p/wc3/timer-exploit
смотри примеры, что скинул
насчет того, как пользоваться одним таймером в разных триггерах. Это в зависимости, того, что вы хотели сделать и как.
прикреплены файлы
Steal nerves #31 - 1 неделю назад 1

» WarCraft 3 / Вопрос для хитрых и находчивых.

мб нужно сменить ид приказ у абилки
Steal nerves #32 - 1 неделю назад (отредактировано ) 0

» WarCraft 3 / Любые агрументы в функциях

void - это nothing то есть ничего не возвращает функция, а саму функции называют doTheThing, а unit u - аргументы функции, мануалы про cjass почитай (хотя я тоже соглашусь, что написано очень плохо в мануалах. Нужно попробовать немного самим пописать коды)
можно представить как (если хорошо понимаешь jass)
function doTheThing takes unit u returns nothing
... //что-то делаешь с юнитом u (берем аргумент функции - unit u)
endfunction
GetMyUnit - такой не существует, видимо Док имеет в виду подставить свою переменную
» пример
например составил пример функции - определить уровень абилы юнита. Функция называется LV, u - юнит, id - целое число, равкод абилы. Возвращает целое число (уровень абилы).
function LV takes unit u, integer id returns integer
return GetUnitAbilityLevel(u, id)
endfunction 
'A000' - равкод абилы
local integer lv = LV(GetTriggerUnit(), 'A000') //узнаем уровень героя
и честно не понял вопрос темы?
Steal nerves #33 - 1 неделю назад (отредактировано ) 2

» WarCraft 3 / Как сделать атаку юнита по области?

xgm.guru/p/100/86640?postid=339693#comment5 сплэши атаки, см. про типы оружия
что ты такое сделал, что вылетает?
Steal nerves #34 - 2 недели назад (отредактировано ) 0

» XGM Staff / Как вернуть аккаунт?

Я помню, когда мне надоел вакрафт (я не мог норм в него играть из-за слабого пк), и я ничего не делая, как по привычке заходил сюда на форум. Хотел удалится, так нельзя было. Решил ввести случайный пароль, чтобы не смог зайти. а потом спустя 2-3 месяца мне захотелось снова варкрафтить, и думал. что смогу без хгм. Но такое дело нужно было скачать собственные наработки, найти какие-то ответы на интересующие вопросы и еще найти ответы, которые забывал (записи решил вести и кучу наработок накачал и все это отсортировал по папкам), и прочее. но для этого не смог зайти обратно. сожалел сильно. мне было не восстановить. Присылал на майл.ру, и там в сообщении требовалось зайти по ссылке на хгм, так заходил и ничего не происходило. Не знаю, из-за этого не хотел заново регистрировать и прочее. решил, что это правильно, забил на это и на варкрафт в целом тоже. Так раз в полгода иногда проверял. Меня на хгм 2 года не было кажись. Четыре месяца назад я повторил процедуру и вот я здесь
Steal nerves #35 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Аура

LainMikoroso, тут я ему основы объяснил. потом пусть не удивляется "а почему у меня не работает" кстати про jass тут речи не идет, я просто не помню как называются переменные и все. а так согласен, перекосило не в ту сторону, когда увидел скриншот
Steal nerves #36 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Аура

Вы не правильно юзаете варкрафтоские переменные, например у вас событие с таймером. Он не дает каких либо варкрафтовским переменным данные (например, у вас на русском написано "Юнит триггера", это наверное GetTriggerUnit, но не существует его). Вам нужны какие-то данные от которых нужно отталкиваться, например берете группу и всех пикаете (есть GetEnumUnit() ). Когда вы всех пикаете через ForGroup, там перебирают всех через переменную GetEnumUnit
Если использовать другие события, то там аргументы передают. Например, юнит умирает (если не ошибаюсь) дает 4 переменные: TriggerUnit, убийца и умирающий. TriggerPlayer (если регистр события прикреплен на юнита, а не на игрока, то эта переменная не будет работать, не проверял). Хотя две переменные TriggerUnit и умирающий ссылаются на одного и того же юнита - умирающего юнита
Steal nerves #37 - 2 недели назад (отредактировано ) 5

» WarCraft 3 / Три неизвестных функции триггера?

» огромная инфа
GetTriggerEvalCount - сколько раз условие сработает (если триггер выключен, то событие с условием все равно работают, и будет прибавлять без конца). Еще понял, что, если выключен (через галочку), то это не будет работать. Есть специальная команда TriggerEvaluate, можно проверить с помощью нее. Это короче сколько раз прокатывает условие (см. TriggerEvaluate)
GetTriggerExecCount - сколько раз сработал триггер (если триггер выключен, то счетчик GetTriggerExecCount не засчитает это). Вроде это за поток отвечает, например Execute. Мне вот интересно, а вот в ForGroup проверить можно сколько потоков стало? вроде ничего не будет
TriggerEvaluate - проверка, проверяет есть ли у триггера условие. Проверяет скорее всего, то что прокатывает ли условие (пример функции ConditionalTriggerExecute). Можно на любом триггере проверить это. Если триггер выключен (не в самих триггерах, а в разделе редактора триггеров через галочку - если снять включен, то не работает проверка), то это не проверишь. Некоторые хитрецы используют функцию условия, это будет быстрее, а точнее раньше выполняется. С этим можно использовать TriggerEvaluate
TriggerExecute - запускает поток функции (действие триггера запускает), игнорируя условие и событие. Однако, не используйте варкрафтовские переменные вроде GetTriggerUnit(), так как они не будут работать, ибо они пусты и зависят от события.
TriggerExecuteWait - то же самое, что и TriggerExecute. В чем разница между двумя мне неизвестно. Проверял маленько.
ResetTrigger - перезапускает триггер и обнуляет значения GetTriggerEvalCount и GetTriggerExecCount
TriggerSleepAction - он же вэйт, паузит на время поток (не паузит весь триггер), короче действие (action). В условии эта штука не работает, обрывает поток. В некоторых функциях он также не работает, например ForGroup, В ForGroup видимо отдельные потоки создает и шлет, на каждого свой поток, если вставит там вэйт, то он обрубает поток и все. А то что внизу осталось, он до конца не обработает уже никогда. Это пример.
» раскрыть
Вот результаты:
  1. Вызов TriggerSleepAction внутри TriggerEvaluate убивает поток, и он никогда не возобновляется.
  2. Вызов TriggerSleepAction внутри TriggerExecute работает.
  3. Вызов TriggerSleepAction внутри TriggerExecuteWait выполняет то же самое, что и TriggerExecute.
  4. Иногда может обрывать поток в неожиданных местах. Например, ForGroup. А иногда работает.
IsTriggerWaitOnSleeps, - эта особая проверка триггера, проверяет включена ли пауза (короче вэйт TriggerSleepAction будет работать, иначе нет). С этой функцией связана другая функция TriggerWaitOnSleeps. IsTriggerWaitOnSleeps возвращает истину true - значит вэйт включен, false - вэйт выключен. Кстати я долго мучался, оказывается, что, если все в первый раз, то функция вернет false, даже, если вэйт работает.
TriggerWaitOnSleeps - функция которая включает вэйт (true) и выключает вэйт (false). Короче пропускает время ожидания вэйта. У меня эта функция работает не сразу, или вообще не работала, тыкал пока не заработало.
прикреплены файлы
Steal nerves #38 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Png формат

Куда вставлять? ты имеешь в виду на сайт xgm.guru , то тебе надо вопрос к создателям сайта и в другом разделе задавать. Тоже вставлял png, а показывает ссылку. Конвентируй в форматы gif jpg, что делать. Бывали и другие случаи: Написал коммент, загрузил Файл, жмешь отправить. Показывают вам коммент, а сами файлы и изображения пропадают. Вместо изображения ссылка. Нужно обновить страницу в браузере, и тогда покажут.
Один раз хотел добавить еще один файл (через вкладку загрузить файлы), так не добавляется новый. Тогда можно сделать проще - отправить второе сообщение с прикрепленным файлом, короче должно быть два комментария, но сливаются в один.
Steal nerves #39 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / ИИ. Поиск и выбор участка для строительства

Проблема в том, что, если в этой точке построено здание, то IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY) не помогает (это терраин проверяет, а вот то что там построено или нет ему пофиг). Посмотрел в триггерах, есть только текстуры земли - уберспласты (там эти текстурки для здания) - нет функции такой в библиотеке jngp для проверки точки. Пробовал через группу, но там своя заминка (походу выборка ловит тех юнитов, точки которых попали в выборку, а не на целиком. Точно не проверял, но не работает с группой),
Clamp, решил через проверку
if (IssueBuildOrderById(YT, 'hhou', x, y) == false) then если не может построить, значит там здание или что-нибудь еще.
Clamp, помог еще твоя ссылка ExecuteFunc. видимо у меня лимит был, не хотело работать (просто дебаг не отобрал. и раб стоял). Хотя это уже не нужно было
А да слегка подвисает на секунду =(
Урра короче без лагов сделал (версия 3), подредактировать недоработку и будет норм
прикреплены файлы
Steal nerves #40 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / SquareRoot

SquareRoot - это математический корень
dx * dx - можно возвести в степень два, но в варкрафте такого нет, да и не нужно
dx - вектор, точнее его проекция на оси x (из конца вычитаем начало, этим мы можем узнать направление)
Steal nerves #41 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / Не читает код ниже двух строк

Все работает. работает с специальными переменными, типа GetFilterUnit(). Вообще это условие, если это условие (фильтр) истинно, то этого юнита (GetFilterUnit), подходящего по условию, оставляет, а остальных отсеивает. У тебя, если условие истинно, выбирает всех. Мне кажется не работает. потому что радиус слишком маленький 90 - слишком маленький, едва ли кого выделишь. Надо еще дебагом проверять (выводи на экран) и проверяй кол-во юнитов в группе. Так написал, что не понятно, что тебе нужно. И вопрос закрыт? (закрой тему)
» чтобы глобалки объявлять скачай jngp, подключи jasshelper (V jass)
в самом наверху триггера можно писать
globals
integer TTT = 0 //целочисленная
endglobals
Steal nerves #42 - 2 недели назад 0

» WarCraft 3 / Где ошибка

Что не работает?
Steal nerves #43 - 2 недели назад 0
Steal nerves #45 - 2 недели назад (отредактировано ) 0

» WarCraft 3 / GetUnitsInRange и condition. Ловля мертвых героев.

EvilPenguin, если действительно так не работает, не пробовал сохранять координаты при смерти героев, а потом проверить не попадают ли эти координаты в область и ресаем?
Steal nerves #46 - 3 недели назад (отредактировано ) 0

» WarCraft 3 / Способность с зарядами.

можно (удалить и добавить заново) точно не уверен.надо посмотреть на сайте/на форуме. поищите на слова осветительный заряд, сторожевая сова. но это будет гемор с бд (одинаковые абилки, но с разными зарядами)
можно сделать еще продажу предмета самому себе xgm.guru/forum/showthread.php?t=45020
лучше бы напрямую как-то влиять, но к не счастью нет таких нативок. Есть у нас не стандартное решение - взлом памяти - memort hack. Ждем вездесущего драколича, мб он даст интересный ответ. ну ничего подожди немного. сейчас он спит
Steal nerves #47 - 3 недели назад 0
Steal nerves #48 - 3 недели назад (отредактировано ) 0

» WarCraft 3 / Система покупки и продажи предмета

всмысле нормализуй "абилки", "итемы"?
ну в этом то и хитрость, когда в лавке 5 стэков, покупаешь и становится 4 стэка и 1 еще в кулдауне. Чтобы этого кулдауна не было, я ему добавлял повторно этот же тип (текущий стэк == максимальный стэк == 4). Никогда проблем не было, но иногда что-то итемы пропадают.
Ну и на том и проверки у меня. Если кол-во слотов больше 11, то значит больше не давать.

короче не знаю в чем проблема. была до этого предыдущая версия. Это будет замечено в этой старой версии Item v8 (ссылка), я подобрал 6 итемов с земли и заложил в лавку. потом подобрал еще 6 итемов, 5 заложил также в лавку. один уже не мог (так и должно, ибо мест нет).
потом купил в лавке (дебаг показывает что в лавке стало снова 10, теперь могу снова заложить итем в лавку), я заложил (дебаг говорит что там 11, но на самом деле там стало 9, просто проданный/заложенный занял место другого, а тот исчез видимо). исправил это дело с помощью интервала (в РО всем итемам выставил интервал пополнения (кулдауна) на ноль и все заработало, и немного в коде подправил (хотя ничего критичного, скорее косметический характер), но больше не знаю что. в новой версии бывают баги, но редко
прикреплены файлы
Steal nerves #49 - 3 недели назад (отредактировано ) 0

» WarCraft 3 / Хеш-таблица против обуза глобальных массивных переменных

У обычных массивов от переменной, то там индекс не такой большой (от -8192 до 8192). Нельзя туда ни хэндлы всунуть, ни равкоды. Равкод к счастью можно заменить на тип переменную как тип юнита. А в хэш-таблицу все влезает, и норм. Обычные массивы неудобны еще тем, что там нельзя аттачить, приходится делать более сложные конструкции с пробегом цикла и проверками, чтобы найти нужный индекс. А вот в хэше можно сразу лепить аттач (по хэндлу юнита).
Различны способы хранения - (удобно когда массивов больше - удобно сделать сложную конструкцию). В более простых конструкциях этого не нужно.
xgm.guru/p/100/183113 массивы хэша
xgm.guru/p/100/183650 пробовал реализовать с помощью неких констант, когда не хватало ячеек
Steal nerves #50 - 3 недели назад 0