function CriticalStike_CD takes nothing returns nothing
local integer h = GetHandleId(GetExpiredTimer())
call RemoveSavedBoolean(H, GetHandleId(LoadUnitHandle(H, h, 'srcU')), 'csCD') // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call FlushChildHashtable(H, h) // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call PauseTimer(GetExpiredTimer())
call DestroyTimer(GetExpiredTimer())
endfunction
function CriticalStike takes unit source, unit target, real dmg returns nothing
local timer t = CreateTimer()
call SaveBoolean(H, GetHandleId(source), 'csCD', true) // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call SaveAgentHandle(H, GetHandleId(t), 'srcU', source) // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call DestroyEffect(AddSpecialEffect("Damnation Orange.mdx", GetUnitX(target), GetUnitY(target)))
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", GetUnitX(target), GetUnitY(target))) // тут с эффектами отрегулируешь сам, впадлу вчитываться в ту помойку что ты кинул
call DestroyEffect(AddSpecialEffectTarget("Damnation Orange.mdx", target, "chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", target, "chest"))
call UnitDamageTarget(source , target, 40 * GetUnitAbilityLevel(source, 'Aimp') , true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call UnitDamageTarget(source , target, 0.06 * GetUnitState(target, UNIT_STATE_MAX_LIFE) , true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call TimerStart(t, 5, false, function CriticalStike_CD) // тут вместо 5 ставишь свое кд
set t = null
endfunction
вот код самого спелла, просто проверяешь if not LoadBoolean(H, GetHandleId(source), 'csCD') then и тд в своей системе урона и вызываешь функцию.
Вот твой спелл с готовой системой урона на чистом джассе.
globals
hashtable H = InitHashtable()
rect SysRect = null
unit uTemp = null
group gTemp = CreateGroup()
endglobals
function CriticalStike_CD takes nothing returns nothing
local integer h = GetHandleId(GetExpiredTimer())
call RemoveSavedBoolean(H, GetHandleId(LoadUnitHandle(H, h, 'srcU')), 'csCD') // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call FlushChildHashtable(H, h) // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call PauseTimer(GetExpiredTimer())
call DestroyTimer(GetExpiredTimer())
endfunction
function CriticalStike takes unit source, unit target, real dmg returns nothing
local timer t = CreateTimer()
call SaveBoolean(H, GetHandleId(source), 'csCD', true) // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call SaveAgentHandle(H, GetHandleId(t), 'srcU', source) // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call DestroyEffect(AddSpecialEffect("Damnation Orange.mdx", GetUnitX(target), GetUnitY(target)))
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", GetUnitX(target), GetUnitY(target))) // тут с эффектами отрегулируешь сам, впадлу вчитываться в ту помойку что ты кинул
call DestroyEffect(AddSpecialEffectTarget("Damnation Orange.mdx", target, "chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", target, "chest"))
call UnitDamageTarget(source , target, 40 * GetUnitAbilityLevel(source, 'Aimp') , true, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call UnitDamageTarget(source , target, 0.06 * GetUnitState(target, UNIT_STATE_MAX_LIFE) , true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call TimerStart(t, 5, false, function CriticalStike_CD) // тут вместо 5 ставишь свое кд
set t = null
endfunction
function UnitEvent takes trigger trig, playerunitevent whichEvent, code act returns trigger
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent( trig, Player( index ), whichEvent, null )
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
if act != null then
call TriggerAddAction( trig, act )
endif
return trig
endfunction
function Rect_Enter_Event takes trigger trig, real minX, real minY, real maxX, real maxY, code act returns trigger
local region rectRegion = CreateRegion( )
call SetRect( SysRect, minX, minY, maxX, maxY )
call RegionAddRect( rectRegion, SysRect )
call TriggerRegisterEnterRegion( trig, rectRegion, null )
if act != null then
call TriggerAddAction( trig, act )
endif
set rectRegion = null
return trig
endfunction
function Damaged_Handler takes unit source, unit target, real dmg returns nothing
if not LoadBoolean(H, GetHandleId(source), 'csCD') and GetUnitAbilityLevel(source, 'Aimt') > 0 and not IsUnitType(target, UNIT_TYPE_STRUCTURE) and IsUnitEnemy(target, GetOwningPlayer(source)) and GetUnitState(target, UNIT_STATE_LIFE) > 0 then // вместо H ставишь свою хештаблицу, в гуи помоему будет udg_H , если создавать хт с названием H
call CriticalStike(source, target, dmg)
endif
endfunction
function Damaged_Event takes nothing returns nothing
local real DMG = GetEventDamage( )
if DMG > 0 then
call DisableTrigger( GetTriggeringTrigger( ) )
call Damaged_Handler( GetEventDamageSource( ), GetTriggerUnit( ), DMG )
call EnableTrigger( GetTriggeringTrigger( ) )
endif
endfunction
function LoadTrig takes integer trig returns trigger
if LoadTriggerHandle( H, 'glob', trig ) == null then
call SaveTriggerHandle( H, 'glob', trig, CreateTrigger( ) )
endif
return LoadTriggerHandle( H, 'glob', trig)
endfunction
function Init_Unit_Damaged takes unit target returns nothing
if not IsUnitInGroup(target, LoadGroupHandle(H, 'glob', 'dmgG')) and GetUnitAbilityLevel( target, 'Aloc' ) <= 0 then
call GroupAddUnit(LoadGroupHandle(H, 'glob', 'dmgG'), target )
call TriggerRegisterUnitEvent(LoadTrig('dmgT'), target, EVENT_UNIT_DAMAGED )
endif
endfunction
function Attacked_Handler takes unit source, unit target returns nothing
call Init_Unit_Damaged( target )
endfunction
function Attacked_Event takes nothing returns nothing
call DisableTrigger( GetTriggeringTrigger( ) )
call Attacked_Handler( GetAttacker( ), GetTriggerUnit( ) )
call EnableTrigger( GetTriggeringTrigger( ) )
endfunction
function Unit_Enters_Handler takes unit entering returns nothing
call Init_Unit_Damaged( entering )
endfunction
function Unit_Enters_Event takes nothing returns nothing
call Unit_Enters_Handler( GetEnteringUnit( ) )
endfunction
function InitDamageSystem takes nothing returns nothing
local real minX = GetRectMinX( GetWorldBounds( ) )
local real maxX = GetRectMaxX( GetWorldBounds( ) )
local real minY = GetRectMinY( GetWorldBounds( ) )
local real maxY = GetRectMaxY( GetWorldBounds( ) )
set SysRect = Rect( 0, 0, 0, 0 )
call TriggerAddAction( LoadTrig('dmgT'), function Damaged_Event )
call SaveGroupHandle( H, 'glob', 'dmgG', CreateGroup( ) )
call UnitEvent( CreateTrigger( ), EVENT_PLAYER_UNIT_ATTACKED, function Attacked_Event )
call Rect_Enter_Event( CreateTrigger( ), minX, minY, maxX, maxY, function Unit_Enters_Event )
call GroupEnumUnitsInRect(gTemp, GetWorldBounds( ), null )
loop
set uTemp = FirstOfGroup(gTemp)
exitwhen uTemp == null
call Init_Unit_Damaged(uTemp)
call GroupRemoveUnit(gTemp, uTemp)
endloop
endfunction
function main takes nothing returns nothing
call ExecuteFunc("InitDamageSystem")
endfunction
Тебе нужно будет скопировать себе глобалки и инициализировать InitDamageSystem , не ебу как это на гуи делается, удачи😀
Если не хочешь чистить полностью родительский ключ, можно использовать функцию RemoveSavedHandle, при смерти юнита. Тут нужно хотя бы узнать что именно ты делаешь с юнитами, чтобы точно подсказать как лучше тебе поступить. Например, после конца способности, ты обязан чистить хештаблицу через FlushChildHashtable, тк эти данные тебе больше не нужны.
Да как и в доте 1, ептить. Просто инвиз, иконку на миникарте делаем прозрачной, как и саму модель юнита для врагов, поэтому даже на вардах юнитов то не видно.
Ну и кринж, если микрочелик долбаеб он и так поймает вирус из торрентов или порносайтов, а на мемхаке в ру комьюнити максимум что делали - это карты с запуском порнухи без вирусни. Если настолько боишься поймать вирус в war3 , то просто не играй в рандомные карты). Ты же не будешь скачивать хентай фнаф на пк? Так не играй в подозрительные карты. А насчет вредоносности, то навредить можно и БЕЗ мемхака. В хелхалте вообще vbs скрипт запускается при запуске карты, а что в нем находится знает только создатель карты 😀
Редакция : не увидел твой пример 3 когда писал текст. Забей это лучший способ
Не слушай грешников и используй христианскую PURE jass хеш таблицу. Значения замени на свои =>
SaveInteger(MyHashtable, GetHandleId(unit), StringHash("MyUnit") , 999)
Чтобы выгрузить значение используй =>
LoadInteger(MyHashtable, GetHandleId(unit), StringHash("MyUnit"))
Также можно сохранять и Real и Group и Unit, Str и тд, что позволяет сохранять хештаблица
в globals замени music bgMusic на sound bgMusic
Также замени функции CreateMusic и PlayMusic на CreateSound и StartSound . Также нужно заменить set bgMusic = CreateMusic(blablabla) на set bgMusic = CreateSound(song, false, false, true, 12700, 12700, "")
Там где ты устанавливаешь название музыки нужно дописать формат твоего музыкального файла : к примеру .mp3
В InitTriggers допиши в конце функции set t = null, иначе будет утечка.
TriggerRegisterTimerEventSingle замени на TriggerRegisterTimerEvent(t, 1.0, true), если нужно чтобы музыка изменялась каждую секунду
Если не надо то TriggerRegisterTimerEvent(t, 1.0, false)
Еще тебе нужно добавить call KillSoundWhenDone(bgMusic) НО это не полностью избавит тебя от утечки, нужно создать звук ОДИН раз и повторно использовать его.
Возможно я что-то упустил.
P.S. чатбот генерит плохой код, настоятельно рекомендую им не пользоваться. Тут можно было использовать таймеры, а также не создавать Sound каждый раз.
Таких людей очень мало, кто кодит на чистом джассе и разбирается во всем этом. На хгме очень мало вероятно такого встретить , тут людям нравится копрофилия, к сожалению🙁
» WarCraft 3 / [MemHack] Загрузка .mix файла с модельками прямо в игре
» WarCraft 3 / Проблема с ACac
» WarCraft 3 / Проблема с ACac
» WarCraft 3 / Проблема с ACac
» WarCraft 3 / Можно ли передать локалки другим функциям без takes
» WarCraft 3 / Shinobi Rumble v0.7fix2
Ред. SAND
» WarCraft 3 / Как вкатиться в WarCraft III и не привлечь внимание санитаров
» WarCraft 3 / Devistating Blow ( Фатальный удар )
» WarCraft 3 / Система атаки не рабоатет
call SetUnitState( u , UNIT_STATE_LIFE, GetUnitState( u, UNIT_STATE_LIFE ) + heal)
» WarCraft 3 / как создавать юнитов с уникальным HandleId ?
» WarCraft 3 / Интерфейс Новой доты от Драголича
» WarCraft 3 / Аналог Smoke of deceit из dota2
» WarCraft 3 / Аналог Smoke of deceit из dota2
» WarCraft 3 / Аналог Smoke of deceit из dota2
» WarCraft 3 / Опасен ли мемхак?
» WarCraft 3 / Всем привет. Как найти путь до модели *mdx ?
Ред. SAND
» WarCraft 3 / Как можно хранить значения в юнитах? Аналог SetUnitUserData
SaveInteger(MyHashtable, GetHandleId(unit), StringHash("MyUnit") , 999)
LoadInteger(MyHashtable, GetHandleId(unit), StringHash("MyUnit"))
» WarCraft 3 / Статьи про язык JASS
Также замени функции CreateMusic и PlayMusic на CreateSound и StartSound . Также нужно заменить set bgMusic = CreateMusic(blablabla) на set bgMusic = CreateSound(song, false, false, true, 12700, 12700, "")
Там где ты устанавливаешь название музыки нужно дописать формат твоего музыкального файла : к примеру .mp3
В InitTriggers допиши в конце функции set t = null, иначе будет утечка.
TriggerRegisterTimerEventSingle замени на TriggerRegisterTimerEvent(t, 1.0, true), если нужно чтобы музыка изменялась каждую секунду
Если не надо то TriggerRegisterTimerEvent(t, 1.0, false)
Еще тебе нужно добавить call KillSoundWhenDone(bgMusic) НО это не полностью избавит тебя от утечки, нужно создать звук ОДИН раз и повторно использовать его.
Возможно я что-то упустил.
Ред. SAND
» WarCraft 3 / Пак 3 способностей для Melee карт
» WarCraft 3 / Пак 3 способностей для Melee карт
» WarCraft 3 / Изменение закодированной карты
» IrInA Host Bot / верификация лучшей мапы 2023 года
» WarCraft 3 / Изменение закодированной карты