30

» WarCraft 3 / запустить таймер из таймера

ну допустим мне его надо запаузить, а потом возобновить другим таймером
Так используйте функции
PauseTimer()
ResumeTimer()
30

» WarCraft 3 / запустить таймер из таймера

Создавал погодные эффекты, по этому всегда нужно было иметь разное время таймера после его перезапуска.
И вот зачем городить такие костыли, если вс решается довольно таки просто?
do
	local InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
		local i = math.random(5, 10)
		TimerStart(CreateTimer(), 1, true, function()
			i = i - 1
			if i == 0 then
				print('Смена эффекта')
				i = math.random(5, 10)
			end
		end)
	end
end
30

» WarCraft 3 / запустить таймер из таймера

Так я ж говорил, нужно просто вызывать таймер таймером
TimerStart(CreateTimer(), 1, false, function()
	print(1)
	TimerStart(CreateTimer(), 1, false, function()
		print(2)
		DestroyTimer(GetExpiredTimer())
	end)
	DestroyTimer(GetExpiredTimer())
end)
30

» WarCraft 3 / запустить таймер из таймера

Эммм....обьяснить сможешь ?
Всё просто, каждую секунду мы инкриментим i. Код можно представить так:
local i = 0 -- начинаем с нуля
TimerStart(CreateTimer(), 1, true, function()
	i = i + 1 -- увеличиваем счётчик
	if i == 5 then
		print('Прошло 5 секунд')
	elseif i == 13 then
		print('Прошло 13 секунд')
		PauseTimer(GetExpiredTimer())
		DestroyTimer(GetExpiredTimer())
	end
end)
И еще хотелось бы узнать есть ли разница между вот TimerStart(t,1,true,и вот эта вот функция допустим до 60 сек.) или TimerStart(t,60,false,function())
Всё зависит от задач, но в кратце можно объяснить так:
local i = 13
TimerStart(CreateTimer(), 1, false, function()
	print(i) --> 13
end)
local function myfunc()
	print(i) --> nil
end
local i = 13
TimerStart(CreateTimer(), 1, false, myfunc)
30

» WarCraft 3 / запустить таймер из таймера

Принятый ответ
Зачем такие сложности то?
do
	local i, a, b = 0, math.random(5, 10), math.random(5, 10)
	
	TimerStart(CreateTimer(), 1, true, function()
		i = i + 1
		if i == a then
			print('a')
		elseif i == a + b then
			print('b')
			PauseTimer(GetExpiredTimer())
			DestroyTimer(GetExpiredTimer())
		end
	end)
end
30

» WarCraft 3 / Огненный Дракон

Призываю Назара, он покажет на сколько короче и проще код на lua без хештаблиц...
Я прошлую способность этого автора переписал на zinc попутно оптимизировав и оставил критику. Но автор вместо того, чтоб её поправить, выложил такуюже кривую следующу.
30

» Администрация XGM / Лейба о файлах комментария

уверен?
В моём предыдущем комментарии ж такая лэйба. Перед отправлением комментария просто загрузите и удалите файл.
30

» Администрация XGM / Лейба о файлах комментария

Как я понял, я смог удалить файл из комментариев только потому, что я модератор.
Не обязательно быть модератором. Загружаешь файл в комментарии и потом удаляешь его.
30

» WarCraft 3 / lua и его странная математика

Принятый ответ
Потому что вы впервые столкнулись с double.
print(0.1+0.2==0.3) --> false
Почитать можете здесь. Примеры на других языках здесь.
30

» WarCraft 3 / Огненное Пламя

Rockmaf, без всякого сарказма, по сравнению с тем что было раньше, это просто шикарно. Но есть добавлю критики:
Если сюда дописать then, то заклинание будет работать на 1.26+
Избавьтесь от привычки всюду лепить вэйты:
Процитирую комментатора выше, эти действия бессмысслены
Не забивайте значения вручную, используйте константу bj_MAX_PLAYER_SLOTS ибо ваш код могут использовать на патче 1.30+ где 24 игрока.
IsUnitType(n,UNIT_TYPE_DEAD) не очень корректно работает, лучше подтянуть нативку UnitAlive()
У способности три уровня, а урон наносится фиксированный

Коли уж используете JNGP, то почему чистый jass? Держите, переписал на zinc, можете публиковать без моего авторства.
//! nocjass
native UnitAlive takes unit u returns boolean

//! zinc
library SpellFire {
    integer ABILITY_ID = 'A000';
    real EXPLODE_RANGE = 400;
    string EXPLODE_CENTER = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl";
    string EXPLODE_CIRCLE = "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl";
    integer EXPLODE_CIRCLE_COUNT = 12;
    integer DAMAGE = 100;
    
    // ---
    group g = CreateGroup();
    
    function onInit() {
        integer i;
        trigger t = CreateTrigger();
        TriggerAddCondition(t, Filter(function() -> boolean {
            return GetSpellAbilityId() == ABILITY_ID;
        }));
        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
        }
        TriggerAddAction(t, function(){
            unit target, caster = GetSpellAbilityUnit(); // кастер
            real a = bj_PI * 2 / EXPLODE_CIRCLE_COUNT , x = GetSpellTargetX(), y = GetSpellTargetY(); // координаты области каста
            integer i;
            real damage = GetUnitAbilityLevel(caster, ABILITY_ID) * DAMAGE;
            
            DestroyEffect(AddSpecialEffect(EXPLODE_CENTER, x, y));
            for (0 < i <= EXPLODE_CIRCLE_COUNT){
                DestroyEffect(AddSpecialEffect(EXPLODE_CIRCLE, x + EXPLODE_RANGE * Cos(a*i), y + EXPLODE_RANGE * Sin(a*i)));  
            }
            GroupEnumUnitsInRange(g, x, y , EXPLODE_RANGE, null);
            while (true){
                target = FirstOfGroup(g);
                if (target == null) { break; }
                if (IsUnitEnemy(target, GetOwningPlayer(caster)) && UnitAlive(target)){
                    UnitDamageTarget(caster, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS); // наносим урон
                }
                GroupRemoveUnit(g, target);
            }
            caster = null;
            target = null;
        });
    }
}
//! endzinc
//! endnocjass
30

» Администрация XGM / Agren и компания

Обратная совместимость это плохо и только тормозит развитие продукта, как вот вы этого не можете понять.
Так наболело, что аж подпишусь под каждым словом.
30

» WarCraft 3 / Set Ability Integer value

я знаю функции, только которые конвертируются из ГУИ.
Все с конвертирования начинали, я тоже иногда малоиспользуемые вещи конвертацией узнаю))
А на последнем патче можно и на lua перейти. Можно набрать ключевые слова и IDE вам все варианты покажет)
Загруженные файлы
30

» WarCraft 3 / Какими способами может быть отменено прицеливание способностью?

Может не сработать в случае, если игрок отправляет героя по шифту, в конце прожимает способность и меняет выбор.
30

» WarCraft 3 / Set Ability Integer value

TeX13, так в чём проблема, абилку можете получить с помощью GetSpellAbility(). Останется только выбрать событие, при котором можно изменить данные способности. Они срабатывают в таком порядке:
  • EVENT_PLAYER_UNIT_SPELL_CHANNEL
  • EVENT_PLAYER_UNIT_SPELL_CAST
  • EVENT_PLAYER_UNIT_SPELL_EFFECT
  • EVENT_PLAYER_UNIT_SPELL_ENDCAST
  • EVENT_PLAYER_UNIT_SPELL_FINISH
30

» WarCraft 3 / Set Ability Integer value

Может и не работать, лично не проверял, но кажись 0 уровень = 1, попробуй
Все Blz* функции 0 indexed, это было в описании патча.
кто-нибудь вообще эти функции проверял?
На хайве проверяли.
TeX13, что за странная любовь к BJ? Вы бы хоть посмотрели, во что они раскрываются:
function GetInventoryIndexOfItemTypeBJ takes unit whichUnit, integer itemId returns integer
    local integer index
    local item    indexItem

    set index = 0
    loop
        set indexItem = UnitItemInSlot(whichUnit, index)
        if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
            return index + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop
    return 0
endfunction

function GetItemOfTypeFromUnitBJ takes unit whichUnit, integer itemId returns item
    local integer index = GetInventoryIndexOfItemTypeBJ(whichUnit, itemId)

    if (index == 0) then
        return null
    else
        return UnitItemInSlot(whichUnit, index - 1)
    endif
endfunction
30

» WarCraft 3 / Как узнать ID приказа?

хм.. значит, чтобы узнать id приказа надо использовать способности напрямую
Ну да, предмет же использует стандартные способности. Можете в JASS режиме отдать приказ
Сконвертировать в триггер
call IssueImmediateOrderBJ( null, "instant" )
И найти его в списке приказов
constant integer instant=852200
30

» WarCraft 3 / Как узнать ID приказа?

Ид приказа = "852008"
Это приказ использования предмета в слоте, а не способности
public constant integer useslot1=852008
public constant integer useslot2=852009
public constant integer useslot3=852010
public constant integer useslot4=852011
public constant integer useslot5=852012
public constant integer useslot6=852013
30

» WarCraft 3 / Как узнать ID приказа?

Принятый ответ
TeX13, нужно ловить EVENT_UNIT_ISSUED_ORDER, а не EVENT_PLAYER_UNIT_SPELL_EFFECT.
30

» WarCraft 3 / Как узнать ID приказа?

Отловить приказ и вывести на экран не пробовали?

Бот уже нашёл правильный ответ
public constant integer raisedead=852197
public constant integer raisedeadoff=852199
public constant integer raisedeadon=852198
30

» Администрация XGM / Agren и компания

единственная проблема в том что в инкогнито не могу зайти на сайт
Странно, часто захожу с инкогнито на чужих компах и проблем не наблюдаю.
30

» Администрация XGM / Agren и компания

А так, я конечно, подожду, когда администрация исправит ошибку доступа на сайт с win xp
Нужно не сайт исправлять, а winXP: AES-256 для Windows XP.
30

» WarCraft 3 / Юниты не перестают появляться

Нужно дополнить условие проверкой, жива ли требуемая постройка.
И не плодить утечки групп раз в 20 секунд)