Блок глобалок, что я объявил, и многострочные комментарии /*...*/. PT153:
Переписал код, оставил кое-какие комментарии.
xD, я просто скопипастил создание эффекта, а ведь нужно было убрать под таймером GetSpellTargetUnit().
Вот так верно будет.
раскрыть
globals
constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
constant string AttEffect_A000 = "origin"
endglobals
function spell1_dmg takes nothing returns nothing
local integer h = GetHandleId(GetExpiredTimer())
local unit target = LoadInteger(udg_spells_hashtable, h, 0)
local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
// Вместо определения локалки для кастера, сразу пихаем его в UnitDamageTargetBJ.
// Локалку всё также можно определить, но после endif её нужно обнулить.
// set caster = null
call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
if tik_count > 0 then
call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
*/ target, udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count)) // асинхронно, работает по сети.
call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, target, AttEffect_A000))
else
call FlushChildHashtable(udg_spells_hashtable, h) // удаляет все записи с parent ключом h.
call DestroyTimer(GetExpiredTimer()) // удаляет таймер.
endif
set target = null
endfunction
function Trig_spell1_cast_jass_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call TimerStart(t, 0.05, true, function spell1_dmg)
call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
set t = null // обнуление.
endfunction
Переписал код, оставил кое-какие комментарии.
Должен быть включён vJass в JNGP.
раскрыть
globals
constant string Effect_A000 = "Abilities\\Spells\\Orc\\LightningBolt\\LightningBoltMissile.mdx"
constant string AttEffect_A000 = "origin"
endglobals
function spell1_dmg takes nothing returns nothing
local integer h = GetHandleId(GetExpiredTimer())
local integer tik_count = LoadInteger(udg_spells_hashtable, h, 2)
// Вместо определения локалок для юнитов, сразу их пихаем в UnitDamageTargetBJ.
// Локалки всё также можно определить, но после endif их нужно обнулить.
// set caster = null и set target = null
call DestroyEffect(LoadEffectHandle(udg_spells_hashtable, h, 3))
if tik_count > 0 then
call UnitDamageTargetBJ(LoadUnitHandle(udg_spells_hashtable, h, 1),/*
*/ LoadUnitHandle(udg_spells_hashtable, h, 0),/*
*/ udg_spell1_dmg_period_count, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC)
call DisplayTextToPlayer(GetLocalPlayer(), 0., 0., I2S(tik_count)) // асинхронно, работает по сети.
call SaveInteger(udg_spells_hashtable, h, 2, tik_count - 1)
call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
else
call FlushChildHashtable(udg_spells_hashtable, h) // удаляет все записи с parent ключом h.
call DestroyTimer(GetExpiredTimer()) // удаляет таймер.
endif
endfunction
function Trig_spell1_cast_jass_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
call TimerStart(t, 0.05, true, function spell1_dmg)
call SaveUnitHandle(udg_spells_hashtable, h, 0, GetSpellTargetUnit())
call SaveUnitHandle(udg_spells_hashtable, h, 1, GetSpellAbilityUnit())
call SaveInteger(udg_spells_hashtable, h, 2, udg_spell1_time_period_count)
call SaveEffectHandle(udg_spells_hashtable, h, 3, AddSpecialEffectTarget(Effect_A000, GetSpellTargetUnit(), AttEffect_A000))
set t = null
endfunction
Апд. Ну и просто советы по улучшению кода принимаются, да. Если вдруг кто захочет...
Все BJ функции на нативки замени. Некоторые просто превращаются в нативки удалением постфикса BJ.
Все локалки, что наследуются от handle, нужно обнулять в конце функции.
После окончания действия таймер нужно удалить, а хеш почистить.
Вот это зря, у меня тоже так проблемы "сами" решались, а потом вновь появлялись, потому что так и не разобрался, в чём же дело.
У нейтрально-враждебного свой ИИ, он может прерывать приказы и делать прочую дичь, потому его вообще лучше не трогать.
Я вел речь про игрока, который вообще не обозначен (стоит None в настройках игроков), ему тоже нужен обзор, и я уверен, что дело в этом, потому что вряд ли у кого-то будет союз на Shared Vision с ним. Сделай ему во время инициализации модификатор видимости.
call FogModifierStart(CreateFogModifierRect(MyPlayer, FOG_OF_WAR_VISIBLE, GetWorldBounds(), false, true))
// Вместо GetWorldBounds() можно использовать bj_mapInitialPlayableArea.
Он не всегда необходим, ибо не каждый юнит, что у появляется на карте, должен быть проиндексирован, к тому же порой можно допустить повторение индексов.
Вот у меня на башни и миньоны разные структуры, то есть индексы повторяются. А некоторые юниты привязываются уже к ним (даммики, например), то есть они не индексируются.
Indexer больше подходит для новичков или не сильно продвинутых людей.
Ещё такая мистика была: у меня иногда юниты переставали кастовать способности, но иногда кастовали, что вообще сбивало с толку. Дело было опять-таки в кланах, когда я убирал Shared Vision или перемещал в другой клан, обзора у юнитов не было, потому и кастовать не могли, а иногда кастовали, только потому что при атаке область вокруг атакующего подсвечивается в определённом радиусе. PT153:
обзор ещё раз
Важный момент: обзор вокруг цели, а не вокруг даммика.
Проверь кд способности, дальность, ману, время каста и отхода у даммика, обзор ещё раз. Игрок, которым вообще не управляют (то есть его даже не обозначили) тем более должен делать дамми касты.
Ещё проверь доступность способности этим игрокам.
Есть проблема с LoadCode, потому что сохранение идёт через "code" + s, а загрузка через s. Я думаю, что нужно либо убрать вообще конкатенацию с "code", или добавить ей в LoadCode, а в RunCode её убрать.
1. Поставь отрицательный реген у маны. Если напрямую не получается, то выдели поле с регнерацией маны в Редакторе объектов и нажми Shift+Enter.
2. Нужен такой триггер.
Событие: Мана юнита ТвойЮнит становится Равно 0.
Действия: Убить юнита ТвойЮнит.
За идею даммика с аттачем спасибо. Но эта модель всё равно не воспроизводит эффекты способностей.
Сделал простую модель для даммика, можно выделять, а также все эффекты способностей будут отображаться на нём.
Есть аттач Origin Ref и анимация Stand. Больше ничего.
Переделай на это. Возможно, обёртка в //! nocjass не потребуется.
//! nocjass
key CodeParentKey
//! endnocjass
Есть проблема с LoadCode, потому что сохранение идёт через "code" + s, а загрузка через s. Я думаю, что нужно либо убрать вообще конкатенацию с "code", или добавить ей в LoadCode, а в RunCode её убрать.
» WarCraft 3 / Влияние освещения на кинематик фильтр
» WarCraft 3 / Пиратка против лицензии.
» XGM Конкурсы / Warcraft 3 Custom Campaign Contest 2019
» WarCraft 3 / Не могу найти не удалённый эффект
PT153:
Вот так верно будет.
Ред. PT153
» WarCraft 3 / Не могу найти не удалённый эффект
Должен быть включён vJass в JNGP.
» WarCraft 3 / Не могу найти не удалённый эффект
Ред. PT153
» WarCraft 3 / Не могу найти не удалённый эффект
Все локалки, что наследуются от handle, нужно обнулять в конце функции.
После окончания действия таймер нужно удалить, а хеш почистить.
» WarCraft 3 / Как сделать, чтобы невидимость по ночам работала и днём
Ред. PT153
» WarCraft 3 / Не работает даммикаст от лица врага
Bergi_Bear:
Ред. PT153
» WarCraft 3 / Обратная функция к GetHandleId()
Вот у меня на башни и миньоны разные структуры, то есть индексы повторяются. А некоторые юниты привязываются уже к ним (даммики, например), то есть они не индексируются.
Indexer больше подходит для новичков или не сильно продвинутых людей.
» WarCraft 3 / Не работает даммикаст от лица врага
Ещё такая мистика была: у меня иногда юниты переставали кастовать способности, но иногда кастовали, что вообще сбивало с толку. Дело было опять-таки в кланах, когда я убирал Shared Vision или перемещал в другой клан, обзора у юнитов не было, потому и кастовать не могли, а иногда кастовали, только потому что при атаке область вокруг атакующего подсвечивается в определённом радиусе.
PT153:
Ред. PT153
» WarCraft 3 / Не работает даммикаст от лица врага
Ещё проверь доступность способности этим игрокам.
» WarCraft 3 / Работа War3MapOptimizer
» WarCraft 3 / Библиотека Code
PT153:
» WarCraft 3 / Не работает даммикаст от лица врага
» WarCraft 3 / Два вопроса. Как сделать так, чтобы мана тратилась ежесекундно и
» WarCraft 3 / Как сделать так, чтобы в карте выигрывал тот игрок, у кого
Ред. PT153
» WarCraft 3 / Два вопроса. Как сделать так, чтобы мана тратилась ежесекундно и
2. Нужен такой триггер.
» WarCraft 3 / На основе какого юнита, лучше всего делать даммика ?
Есть аттач Origin Ref и анимация Stand. Больше ничего.
» WarCraft 3 / На основе какого юнита, лучше всего делать даммика ?
» XGM Конкурсы / Warcraft III Mini-Game Contest-2018
» WarCraft 3 / Проблема с объявлением глобальных переменных
8gabriel8:
» WarCraft 3 / Вопрос по устройству мемхака
Ред. PT153
» WarCraft 3 / Библиотека Code
» WarCraft 3 / Сокрытие эффекта способности "восстановить ману и здоровье"
ArchOracle: