Создавал погодные эффекты, по этому всегда нужно было иметь разное время таймера после его перезапуска.
И вот зачем городить такие костыли, если вс решается довольно таки просто?
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
Всё просто, каждую секунду мы инкриментим 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)
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
Призываю Назара, он покажет на сколько короче и проще код на lua без хештаблиц...
Я прошлую способность этого автора переписал на zinc попутно оптимизировав и оставил критику. Но автор вместо того, чтоб её поправить, выложил такуюже кривую следующу.
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
я знаю функции, только которые конвертируются из ГУИ.
Все с конвертирования начинали, я тоже иногда малоиспользуемые вещи конвертацией узнаю))
А на последнем патче можно и на luaперейти. Можно набрать ключевые слова и IDE вам все варианты покажет)
TeX13, так в чём проблема, абилку можете получить с помощью GetSpellAbility(). Останется только выбрать событие, при котором можно изменить данные способности. Они срабатывают в таком порядке:
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
Это приказ использования предмета в слоте, а не способности
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
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / Как реализовать перемещение моего юнита к курсору в гуи??
» WarCraft 3 / запустить таймер из таймера
Ред. nazarpunk
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / запустить таймер из таймера
» WarCraft 3 / Огненный Дракон
» Администрация XGM / Лейба о файлах комментария
» Администрация XGM / Лейба о файлах комментария
» WarCraft 3 / lua и его странная математика
Ред. nazarpunk
» WarCraft 3 / lua и его странная математика
Ред. nazarpunk
» WarCraft 3 / Огненное Пламя
Если сюда дописать then, то заклинание будет работать на 1.26+
» Администрация XGM / Agren и компания
» WarCraft 3 / Set Ability Integer value
А на последнем патче можно и на lua перейти. Можно набрать ключевые слова и IDE вам все варианты покажет)
» WarCraft 3 / Какими способами может быть отменено прицеливание способностью?
» WarCraft 3 / Dark Сrypt 2
» WarCraft 3 / Set Ability Integer value
» WarCraft 3 / Set Ability Integer value
» WarCraft 3 / Как узнать ID приказа?
» WarCraft 3 / Как узнать ID приказа?
Ред. nazarpunk
» WarCraft 3 / Как узнать ID приказа?
» WarCraft 3 / Как узнать ID приказа?
» Администрация XGM / Agren и компания
» Администрация XGM / Agren и компания
» WarCraft 3 / Юниты не перестают появляться