Daro, можно попробовать делать банальное непосредственно для своей карты, а не как отдельный спеллпак для показа, тут уже нужна оригинальность, иначе зачем вообще это делать
Daro, спеллы максимально банальные и делали миллион раз уже, так что не знаю. я материалы никакие даже делать не хочу потому что всё уже существует, что уже говорить о самой публикации
из крусадера можно было бы вытащить разве что боссов со спеллами, когда доделаю, но и их прям оригинальными не назовёшь
спасибо)
Excalimbur, я же тебе сказал, он всё отменяет, у меня спеллы не кастуются, только ману отнимает, в чём прикол? что не понятно? посмотри на отдельной карте, с кодом всё ок
Eureka 7, ну меняй. ты же понимаешь, что стандартные кнопки/иконки и описания никуда не денутся и по сути у тебя место только там где не занято ещё? вот как тут например, где отображается хп и мп реген
отвечу за 1.26
кое-как изменить можно, а вот действующими сделать без мемхака нет
либо учим фреймы, либо выводим это в какое-нибудь другое место, например, мультиборд
и минусы на мой субъективный взгляд, которые можно и объективно вынести
сджасс, особенно с дефайнами, стрёмная вещь ибо иногда ты вообще ничерта не можешь разобрать где ошибка, потому что компилятор сам без понятия, пол часа будешь искать если не психанёшь
ненужная функция CastTarget, использующая игрока, у меня была, но я выпилил
проверка неуязвимости юнита через функцию Invuled, тоже бесполезно, у меня в примере можно дать неуязвимость юнитам и всё спокойно работает
стан нельзя наложить друг на друга, будет работать только самый первый, потому что каждый раз запускается новый таймер, удаляющий дебафф стана через время
нельзя настроить время стана
нельзя достать время стана
структура, имеющая лишь одно значение, юнита - бесполезно
вообще что эта система зачем-то сделана на структуре, в коде оно всяко будет выглядеть хуже моего примера на вджассе
вот пример его кода скомпилированного и моего
его
//JASSHelper struct globals:
constant integer si__StunSystem___Data=1
integer si__StunSystem___Data_F=0
integer si__StunSystem___Data_I=0
integer array si__StunSystem___Data_V
hashtable s__StunSystem___Data_HashTable=InitHashtable()
unit array s__StunSystem___Data_target
endglobals
//Generated allocator of StunSystem___Data
function s__StunSystem___Data__allocate takes nothing returns integer
local integer this=si__StunSystem___Data_F
if (this!=0) then
set si__StunSystem___Data_F=si__StunSystem___Data_V[this]
else
set si__StunSystem___Data_I=si__StunSystem___Data_I+1
set this=si__StunSystem___Data_I
endif
if (this>8190) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Unable to allocate id for an object of type: StunSystem___Data")
return 0
endif
set s__StunSystem___Data_target[this]=null
set si__StunSystem___Data_V[this]=-1
return this
endfunction
//Generated destructor of StunSystem___Data
function s__StunSystem___Data_deallocate takes integer this returns nothing
if this==null then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Attempt to destroy a null struct of type: StunSystem___Data")
return
elseif (si__StunSystem___Data_V[this]!=-1) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Double free of type: StunSystem___Data")
return
endif
set si__StunSystem___Data_V[this]=si__StunSystem___Data_F
set si__StunSystem___Data_F=this
endfunction
//library cjLib75hJKJ374s4e597nba9o7w45gf:
function cj_group_copy_75hJKJ3745gf takes nothing returns nothing
//# optional
call GroupAddUnit(cj_tmpgr_copy_nw509ert7, GetEnumUnit())
endfunction
//library cjLib75hJKJ374s4e597nba9o7w45gf ends
//library StunSystem:
function s__StunSystem___Data_CastTarget takes player p,unit u returns nothing
local unit DummyCaster=CreateUnit(p, 0x75303030, GetUnitX(u), GetUnitY(u), 0)
call IssueTargetOrder(DummyCaster, "thunderbolt", u)
call UnitApplyTimedLife(DummyCaster, 0, 1.00)
set DummyCaster=null
endfunction
function s__StunSystem___Data_Invuled takes unit u returns boolean
local real HP=GetWidgetLife(u)
local real MP=GetUnitState(u, UNIT_STATE_MANA)
local boolean res
call SetWidgetLife(u, HP + 0.001)
if ( HP != GetWidgetLife(u) ) then
call UnitDamageTarget(u, u, 0.001, false, true, null, null, null)
set res=( GetWidgetLife(u) == HP + 0.001 )
else
call UnitDamageTarget(u, u, 0.001, false, true, null, null, null)
set res=( GetWidgetLife(u) == HP )
call SetWidgetLife(u, HP)
endif
if ( res ) then
return not ( GetUnitState(u, UNIT_STATE_MANA) != MP )
endif
return res
endfunction
function s__StunSystem___Data_onEffect takes nothing returns nothing
local timer TIMER=GetExpiredTimer()
local integer DATA=LoadInteger(s__StunSystem___Data_HashTable, GetHandleId(TIMER), 0)
call UnitRemoveAbility(s__StunSystem___Data_target[DATA], 0x42303030)
call FlushChildHashtable(s__StunSystem___Data_HashTable, GetHandleId(TIMER))
call DestroyTimer(TIMER)
set TIMER=null
endfunction
function s__StunSystem___Data_onStun takes unit u,real dur returns nothing
local timer TIMER=CreateTimer()
local integer DATA=s__StunSystem___Data__allocate()
set s__StunSystem___Data_target[DATA]=u
if ( s__StunSystem___Data_Invuled(u) ) then
call SetUnitInvulnerable(u, false)
call s__StunSystem___Data_CastTarget(Player(15) , u)
call SetUnitInvulnerable(u, true)
else
call s__StunSystem___Data_CastTarget(Player(15) , u)
endif
call SaveInteger(s__StunSystem___Data_HashTable, GetHandleId(TIMER), 0, DATA)
call TimerStart(TIMER, dur, false, function s__StunSystem___Data_onEffect)
set TIMER=null
endfunction
function StunUnit takes unit u,real dur returns nothing
call s__StunSystem___Data_onStun(u , dur)
endfunction
//library StunSystem ends
мой
//JASSHelper struct globals:
endglobals
native UnitAlive takes unit id returns boolean
//library StunSystemLib:
function GetUnitStunTime takes unit u returns real
return LoadReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey)
endfunction
function SetUnitStunTime takes unit u,real time returns nothing
call SaveReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey, time)
endfunction
function StunSystemLib__CheckStunTime_1 takes nothing returns nothing
local unit u= GetEnumUnit()
local real r= LoadReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey) - 0.01
if r <= 0.00 or not UnitAlive(u) then
call UnitRemoveAbility(u, 'BPSE') // дебафф стану
call RemoveSavedReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey)
call GroupRemoveUnit(StunSystemLib__TempGroup, u)
else
call SaveReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey, r)
endif
set u=null
endfunction
function StunSystemLib__CheckStunTime takes nothing returns nothing
call ForGroup(StunSystemLib__TempGroup, function StunSystemLib__CheckStunTime_1)
if FirstOfGroup(StunSystemLib__TempGroup) == null then
call PauseTimer(StunSystemLib__TempTimer)
endif
endfunction
function StunUnit takes unit u,real time returns nothing
call IssueTargetOrder(StunSystemLib__TempUnit, "thunderbolt", u) // приказ
if FirstOfGroup(StunSystemLib__TempGroup) == null then
call TimerStart(StunSystemLib__TempTimer, 0.01, true, function StunSystemLib__CheckStunTime)
endif
if time > LoadReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey) then
call SaveReal(StunSystemLib__H, GetHandleId(u), StunSystemLib__StunKey, time)
call GroupAddUnit(StunSystemLib__TempGroup, u)
endif
endfunction
//===========================================================================
function InitTrig_StunSystem takes nothing returns nothing
//set gg_trg_StunSystem = CreateTrigger( )
set StunSystemLib__TempUnit=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'u000', 0.00, 0.00, 0.00) // дамі
endfunction
//library StunSystemLib ends
Vlod дал объективную, реальную оценку имеющейся проблемы, и вероятно он знал об этом с самого начала, я согласился, что решить это не смогу, поэтому предложил альтернативу решения, которая всё равно может не устроить, я извиняюсь за это - можете предложить как исправить если реально
ты же напротив, дал субъективную оценку, выдавая её за объективную, помимо этого вероятно не знал о механике нулевого времени, как и я собственно, посмотрев вышеуказанный ресурс, где время стана вообще стоит на 0.00, так что я поправлю это в своём примере
если бы ты даже вышеупомянутую мелочь назвал, что так можно, было бы намного больше пользы чем от всего остального, ибо ты назвал бы прямое упрощение и открыл новую механику для меня
а не очевидные вещи вроде этого: nazarpunk:
Хэштаблица на каждое заклинание это плохо, лучше использовать одну глобальную, резервируя ключи на каждое заклинание.
Таймер на каждого юнита лучше, ибо к нему поверх всего можно ещё данных прикрутить. В идеале вообще на таймер вешать struct и хранить всё в ней, а хэштаблицы использовать только для привязки структуры к таймеру.
У молотка скорость полёта как-бы есть, и если он вылетит прям по цели, то сразу стриггерит стан.
у молотка скорость нулевая, но он же долетает?
SetUnitFlyHeight, если выставить третий аргумент на 0.00, тоже ведь изменит свою высоту мгновенно? ты уверен что знаешь механику? nazarpunk:
Если в дизайне присутвует автозамена, то с дизайном явно что-то не так.
предлагай в таком случае как решить вопрос двух хэштаблиц с разным названием у пользователя
я должен как-то предугадывать название у человека? nazarpunk:
Таймер на каждого юнита лучше, ибо к нему поверх всего можно ещё данных прикрутить. В идеале вообще на таймер вешать struct и хранить всё в ней, а хэштаблицы использовать только для привязки структуры к таймеру.
зачем мне в этой системе прикручивать другие параметры? зачем мне структуры для одного параметра? ты не про библиотеку и её назначение говоришь, а уже за реальные возможности другого кодера и насколько просто это интегрировать будет для его работы nazarpunk:
Упоминание через каждые два слова "помойности" ресурса не оправдывает качество кода.
чего? может в том то и дело, что я говорю, что он не качественный, не претендует ни на что, что можно тупо забить, где я оправдываю качество кода если он говно? я говорил что ресурс говно а то что внутри нет? nazarpunk:
Система довольно таки простая. Переписать её на zinc со структурами, вывести хэштаблицу в глобал ивыложить как наработку.
система простая, для кодеров, да
а дальше чушь пошла, чтобы использовать конкретно мою хэштаблицу как глобальную, нужно как минимум 2 ресурса моих закинуть, чтобы был реальный профит, и тем не менее, человек может закидывать много других ресурсов от разных авторов где хэштаблицы с разными названиями, но выполняют одну и ту же функцию, например, привязка к таймеру данных, автозамена тут необходима, если не хочешь плодить хэштаблицы nazarpunk:
Так можно получить больше обЪективной критики и научиться писать более качественный код, а не прятаться за отмазками о "помойности".
твоя "обЪективная" критика завязана на субъективном мышлении, где каждый случай уникален, одному нужны структуры, кто-то делает всё на одной структуре и хранит её в юните, а кто-то не юзает и даже не знает что это такое, у второго может быть другая хэштаблица с другим названием уже, ты говоришь про удобство работы для кодеров, хотя кодерам оно нафиг не нужно, ибо сделают они это за пару минут и интегрируют куда надо вместе с этим, я же сделал в первую очередь для гуишников и показал варианты применения в карте, где используется гуи, где достаточно в кастомскрипте указать переменную юнита и время, вот и всё, практически так же легко как и кастомскриптное call RemoveLocation( udg_loc )
Если стан кастуется через молоток, почему даммик не двигается под цель заклинания?
потому что можно выставить радиус, соответствующий карте? nazarpunk:
Хэштаблица на каждое заклинание это плохо, лучше использовать одну глобальную, резервируя ключи на каждое заклинание.
спокойно можно убрать строку с хэштаблицей и автозаменой пройтись, подставив свою, если названия не совпадают, у меня одна глобальная хэштаблица, но есть некоторые исключения
как видишь, ключ уже есть, но если до этого работа с юнитами не была через ключи вджасса, то лучше само собой вместо key подставить integer и вписать своё число, короче это больше в силу возможностей импортирующего человека зависит, банальные знания джасса в принципе, хотя тем, кому оно бы пригодилось, джасс вероятно не знают nazarpunk:
Таймер лучше вешать прям на хэндл юнита и не заморачиваться с группами.
я не знал что лучше, таймера на каждого юнита или один таймер с группой, выбрал второе nazarpunk:
Одним словом довольно странная реализация довольно банальной задачи.
типичная триггерная система стана, позволяет использовать один стан на всю карту
настолько каловая система стана, что игроки будут оглушены в реальной жизни и не смогут в это говно вообще играть, психанут и разобьют монитор, поэтому лучше вообще ничего не юзать и пойти пить чай
я и не хвастался этим помойным ресурсом, поэтому оно и лежит в блоге и даже не заявлялось на публикацию, ты хочешь чтобы я это попросил в бездну закинуть из моего блога?)
я понимаю твоё недовольство, но на данный момент интересует факт в чём группа хуже, переделаю на таймера
Выстави просто целочисленную переменную и плюсуй каждый раз когда юнита наняли, при достижении потолка отключать найм, при смерти юнита отнимаешь от переменной и возобновляешь возможность найма
Если нужно, могу позже на отдельной карте пример сделать
» Блог им. rsfghd / какая-то фигня
это не кал только для тех, кто в первые это увидел
» Блог им. rsfghd / Спеллпак Привратника Ада 2.0
» WarCraft 3 / Пропадают предметы при улучшение здания
а в улучшенной версии здания есть эти предметы?
» Блог им. rsfghd / Спеллпак Привратника Ада 2.0
из крусадера можно было бы вытащить разве что боссов со спеллами, когда доделаю, но и их прям оригинальными не назовёшь
спасибо)
» WarCraft 3 / Пропадают предметы при улучшение здания
» Помойка Макебы / Блекджек в рефе
» WarCraft 3 / Великое ТД без конкуренции
» WarCraft 3 / Великое ТД без конкуренции
» WarCraft 3 / затраты на кастования не работают
» WarCraft 3 / Передача контроля игрока в случае лива
» WarCraft 3 / затраты на кастования не работают
» WarCraft 3 / Случайный спавн юнитов 1-3 лвла
» WarCraft 3 / система отсеивания юнитов
» WarCraft 3 / Можно ли изменить интерфейс в игре?
» WarCraft 3 / Можно ли изменить интерфейс в игре?
кое-как изменить можно, а вот действующими сделать без мемхака нет
либо учим фреймы, либо выводим это в какое-нибудь другое место, например, мультиборд
» WarCraft 3 / Получение информации из таблицы рекордов во время игры
Ред. rsfghd
» WarCraft 3 / лимит на определенного юнита 2 игрокам сразу.
» WarCraft 3 / Передача от юнита без разговора
» Блог им. rsfghd / система стана
сама функция стана работает само собой
Ред. rsfghd
» Мертвые Служат ТД / Обновление великого "Blya"
» Блог им. rsfghd / система стана
если бы ты даже вышеупомянутую мелочь назвал, что так можно, было бы намного больше пользы чем от всего остального, ибо ты назвал бы прямое упрощение и открыл новую механику для меня
а не очевидные вещи вроде этого:
nazarpunk:
nazarpunk:
» Блог им. rsfghd / система стана
SetUnitFlyHeight, если выставить третий аргумент на 0.00, тоже ведь изменит свою высоту мгновенно? ты уверен что знаешь механику?
nazarpunk:
я должен как-то предугадывать название у человека?
nazarpunk:
nazarpunk:
nazarpunk:
а дальше чушь пошла, чтобы использовать конкретно мою хэштаблицу как глобальную, нужно как минимум 2 ресурса моих закинуть, чтобы был реальный профит, и тем не менее, человек может закидывать много других ресурсов от разных авторов где хэштаблицы с разными названиями, но выполняют одну и ту же функцию, например, привязка к таймеру данных, автозамена тут необходима, если не хочешь плодить хэштаблицы
nazarpunk:
Ред. rsfghd
» Блог им. rsfghd / система стана
nazarpunk:
как видишь, ключ уже есть, но если до этого работа с юнитами не была через ключи вджасса, то лучше само собой вместо key подставить integer и вписать своё число, короче это больше в силу возможностей импортирующего человека зависит, банальные знания джасса в принципе, хотя тем, кому оно бы пригодилось, джасс вероятно не знают
nazarpunk:
nazarpunk:
» WarCraft 3 / лимит на определенного юнита 2 игрокам сразу.
» WarCraft 3 / Передача от юнита без разговора