21

» WarCraft 3 / Как создать триггер заклинания через показатель маны?

^ Вот лайк. Чуть хитрости - и огромная экономия усилий. Только единственный недостаток - с другой абилой на основе такой же горелки стакаться не будет. Но это неактуально в 99% случаев.
21

» WarCraft 3 / Хак на память Warcraft3

Есть герой Психопомпа.
Из-за его способностей происходит следующее:
  • Каждый раз, когда любой герой кастует любой спелл и его перезарядка больше 1, перезарядка первой абилы Психопомпы приравнивается к перезарядке этой скастованной абилы, а манакост - к перезарядке этой абилы, умноженной x3/x4/x5/x6/x7 по лвлу прокачки.
  • Каждый раз, когда любой герой кастует любой спелл не-предмета и его перезарядка больше 1, Психомомпа ресает ману в 4 * перезарядка скастованной способности * уровень этой своей способности.
  • Каждый раз, когда любой герой кастует любой спелл не-предмета и его перезарядка больше 1, Психомомпа ресает здоровье в перезарядка скастованной способности * уровень этой своей способности.
Иногда (НЕ после каждой игры, но иногда) по выходу из вара происходит фатал.
Есть предположения о причинах? Или это само по себе потому, что постоянно передрачивается перезарядка способности и ее манакост?
КСТАТИ. У абилы не 10 лвлов, а 5, это "предусмотрительный" ифзенэлс из другого триггера. Так что loop каждый раз пытается вписать по 5 манакостов и перезарядок в первом триггере на несуществующие уровни абилы. Мб в этом причина??? Но почему тогда фатал иногда есть, а иногда не? Ну это я в люб. случае исправлю потом, главное, не забыть.
Коды ниже (триги, вызывающие эти функции, реагируют на каст любой абилы любым героем)
function MadBreathParametersChange takes nothing returns nothing
local integer i = 11
local real newcd = GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()))
if (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ
loop
exitwhen i < 1
set i = i-1
call SetAbilityCD ('A27Q', i, newcd)
call SetAbilityManaCost('A27Q',i,R2I(GetAbilityCD('A27Q',i) * (2 + i)))
endloop
ЗАДАЕМ ПЕРЕЗАРЯДКУ И МАНАКОСТ БЕЗУМНОГО ДЫХАНИЯ, УРОН УЖЕ ОТ НИХ ПОТОМ - ЗАКРЫТО.
else
endif
endfunction
function DelicacyEffect takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27S', u5) >= 1 ) then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + 4 * GetUnitAbilityLevelSwapped('A27S',u5))
else
endif
endloop
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ МАНУ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function PerceptionEffect takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
local unit u5
local group herounits = GetUnitsInRectAll(GetPlayableMapRect())
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
if ( GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit()) >= 1 ) and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ ЗДОРОВЬЕ
loop
set u5=FirstOfGroup(herounits)
exitwhen u5==null
call GroupRemoveUnit(herounits,u5)
if ( GetUnitAbilityLevelSwapped('A27T', u5) >= 1 ) then
call AddSpecialEffectTargetUnitBJ( "overhead", u5, "Psychopomp4.mdl" )
call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
call SetUnitState(u5, UNIT_STATE_LIFE, GetUnitState(u5, UNIT_STATE_LIFE) + GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) * GetUnitAbilityLevelSwapped('A27T',u5))
else
endif
endloop
ИЩЕМ СРЕДИ ГЕРОЕВ ТЕХ, У КОГО ЕСТЬ ПАССИВКА И ДОБАВЛЯЕМ ЗДОРОВЬЕ - ЗАКРЫТО.
else
endif
call DestroyGroup (herounits)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, herounits
set u5 = null
set herounits = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
21

» WarCraft 3 / Как создать триггер заклинания через показатель маны?

После просмотра вопроса повнимательнее... Автор условия на ману найти не может? В гуи же есть, как-то так вроде: Real Comparison - Боевая единица - Property - и пишешь там, что здоровье/мана такой-то единицы становится менее нужного значения и твои действия.
21

» WarCraft 3 / Как создать триггер заклинания через показатель маны?

Ну можно просто запустить периодический таймер (каждые 1.00 сек.), выбирать им все юниты с типом "летящий вертолет", у которых осталось мало маны (проверять количество) и приказывать садиться (у тебя там через морф или что, не могу понять, но не важно). Конечно, повлияет на производительность, но если карта не большая - почти не заметно. Зато реализовать очень легко.
21

» WarCraft 3 / Иконки на заказ

Простое задание.
Переделать через Button Manager изображения в иконки.
Первая иконка должна быть АКТИВНАЯ.
Вторая должна быть ПАССИВНАЯ и еще такая же пассивная перекрашенная в фотошопе ЧЕРНО-БЕЛАЯ.
Третья должна быть ПАССИВНАЯ.
Четвертая должна быть АВТОКАСТОВАЯ.
Иконка героя должна быть АКТИВНАЯ.
К каждой иконке должен быть затемненный вариант.
Назвать иконки так:
BTNVain1.blp
BTNVain2.blp
BTNVain22.blp
BTNVain3.blp
BTNVain4.blp
BTNVainHero.blp
DISBTNVain1.blp
DISBTNVain2.blp
DISBTNVain22.blp
DISBTNVain3.blp
DISBTNVain4.blp
DISBTNVainHero.blp
Сдавать архивом или отдельными ссылками.
Начать делать и отписать лучше сразу, чтобы не получилось, что одновременно уже делает кто-то другой (втч я).
Спасибо.
21

» WarCraft 3 / GetUnitsInRange и condition. Ловля мертвых героев.

С мертвыми героями в варе вообще странности (если кто, кстати, не знает, при массовых смертях и мб не только герой вообще может просто исчезнуть и последняя известная информация о нём опустошиться, так что всем советую на такой случай впиливать костыль пересоздания с запоминанием важнейших данных на момент смерти).
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Ну как что?! То же, что и для функции Алекса: local integer a = GetUnitAbility(u5,GetSpellAbilityId())
Я ведь ее пытаюсь заменить. Функция Алекса нормально действовала, но фаталила вар после игры.
/////////////////
ППЦ. ДУРДОМ.
Короче, после удаления в старой карте строчки со CloneAbility функции Алекса внезапно сохранили работоспособность (т. е. "проблема с malloc исчезла", а что на абилу будет вешаться глобально, меня это устраивает).
Полная уверенность, что раньше так не было... Видать, помолился здесь кто за меня, ну спасибо ему навеки.
В общем, пока сворачиваюсь, изучим последствия.
///////////
////////////////
Так. Ну вроде всё зшбс. Фатала нет.
Не использую клонабилити из шапки.
Просто впрямую использую call SetAbilityDataHeroRng и call GetAbilityDataHeroRng . Это чем-то грозит?
Что изменение ренджа теперь вешается на абилку в целом, а не на конкретную у конкретного юнита - понятно, но меня это устраивает.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

^ Компилится, но рендж не изменяется, хоть с добавлением вначале set lvl = lvl - 1, хоть без него
Функция WriteMemory из либы? Вот
function WriteMemory takes integer address, integer value returns nothing
set Memory[address / 4] = value Inline - friendly
endfunction
Т. е., ятп, деление есть.
/////////////
////////////
Попытка заменить в функции r на число - рендж не меняется.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Да уже делалось так!!! НИ хрена не помогает!!!
function SetSpellRange takes integer a, integer lvl, real r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4]=SetRealIntoMemory(r)
endif
endfunction
/////////
Тут главный бред, что когда я пытаюсь вместо 99999 прописать ЛЮБОЕ число, СРАЗУ получаются фаталы. Ну что это за чушь?!? А с 99999 получается нулевой рендж.
////////////
Опять вспоминаю про деревья корнями кверху.

И сразу готовую функцию офк хрен кто даст. Вот что значит НЕоплачиваемые помощники.
/////////////////
Мля, может, так ща попробовать
function SetSpellRange takes integer a, integer lvl, integer r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endif
endfunction

^ предыдущее = фатал, ща там попробую I2R(r)
///////////
//////////////
Благополучно не компилится
////////
///////
Ну бред, с**а, а время летит...
////////////
//////
///////////
/////////
function SetSpellRange takes integer a, integer lvl, real r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endif
endfunction
И так не компилится! Хочет по адресу integer писать!!!
//////////
////////////
function SetSpellRange takes integer a, integer lvl, real r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4]=SetRealIntoMemory(r)
endif
endfunction
Закомпилировалось, чую, ща сфаталит.
/////////////////
/////////////////////
//////////////////
Сфаталило.
/////////
///////////
Попробую так подсократить пока.
function SetSpellRange takes integer a, integer lvl, integer r returns nothing
local integer offset =ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endfunction
/////////////
/////////////
Ну и сразу сфаталило, ппц.
////////
///////////
function SetSpellRange takes integer a, integer lvl, integer r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = r
endif
endfunction
Мля, ну ведь так оно что-то пишет. Почему оно пишет 0? Оно просто НЕ хочет писать реалку.
///////// А, нет, тьфу, так оно вообще фаталит! Вообще уже мозги болят...
function SetSpellRange takes integer a, integer lvl, integer r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4] = r
endif
endfunction
Вот так пишет 0
//////////
А вот так фаталит, что через R2I(r), что просто через r
/////////
function SetSpellRange takes integer a, integer lvl, integer r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[offset+0x74+0x68*lvl] = R2I(r)
endif
endfunction
////////
////////////
Достало, только нервотрепка, походу, придется забить...
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Ну были же ошибки.
Нде. Пока так: абила действует, но вместо неограниченного ренджа делает его ренджем вплотную. Очевидно, почему-то записывается 0 или что-то вроде
function SetSpellRange takes integer a, integer lvl, integer r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4] = r
endif
endfunction
function GetSpellRange takes integer a, integer lvl returns integer
local integer offset = 0
local integer r = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set r = ReadMemory(offset+0x74+0x68*lvl)
endif
return r
endfunction
////
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ
if (u6 != null) and UnitHasBuffBJ(u5,'B0H6') == true then
loop
exitwhen i > 10
set i = i+1
if GetSpellRange(a, i) < 99999 then
call SetSpellRange(a,i,99999)
call UnitRemoveAbilityBJ( 'A27A', u5 )
call UnitRemoveBuffBJ( 'B0H6', u5 )
endif
endloop
endif
ДЕЛАЕМ НЕОГРАНИЧЕННУЮ ДАЛЬНОСТЬ СПОСОБНОСТИ, ЕСЛИ ОНА УЖЕ НЕ НЕОГРАНИЧЕННАЯ - ЗАКРЫТО.
////////
////////
/////////
Млять, очевидно, проблема в строчке записи, но че делать...
set Memory[a/4+0x54/4]=SetRealIntoMemory(I2R(r)) фаталит при вызове
WMem(offset+0x74+0x68*lvl,SetRealIntoMemory(I2R(r))) не компилится
write(offset+0x74+0x68*lvl,SetRealIntoMemory(I2R(r))) не компилится
//////////////////
/////////////////
function SetSpellRange takes integer a, integer lvl, real r returns nothing
local integer offset = 0
if a>0 then
set offset=ReadMemory(a+0x54)
set Memory[a/4+0x54/4]=SetRealIntoMemory(r)
endif
endfunction
Напрямую через реалку все равно так фаталит, С**А, как записать этот гребаный рендж 99999
///////////
Так, если вот тут поменять call SetSpellRange(a,i,99999) число 99999 на -99999, то фатал.
Значит, принимать число оно принимает...
///////
Какой-то капитальный бред! Меняю 99999 на 9999 - убираю одну девятку - фатал!
21

» WarCraft 3 / Нужна модель? - Вам сюда!

ППЦ. wc3 underground е**нутый какой-то.
Короче, больше суток точно не было активатора на мыло на мейлру от них, хотя три раза выполнялся resend.
Седня че-то на мыло пришло.
Естественно, думаю, что активатор, кликаю и захожу.
Нифига, акк так и неактивен.
Че за втф?
Захожу на мыло, перечитываю, че там прислали, а это мессага в стиле "вы у нас зарегались, но почему-то не постите, может, че не так?"
Б***Ь, да вы че, издеваетесь =) Ясен хрен, не так - активатора от вас на мыло не приходит.
Кликаю resend у них чисто на автомате... Активатор пришел МГНОВЕННО.
Кулстори, да.
Только толку нихрена почти в плане скачивания моделей ХотСа, куча ссылок, если не все, уже мертвые =/ Втч Викинги, Аларак и Трейсер.
Хотя лан, не так важно пока модели, как уже и было сказано, важнее от других мучений избавляться...
21

» WarCraft 3 / [Мемхак] Функции для способностей.

Короче, по-моему, бред какой-то, вот что вышло с налёту
Мне кажется, НЕ должно действовать, но уж на уровне текущего понимания
/
function SetSpellRange takes ability u integer r returns integer
local integer a=GetUnitAbility(u,id)
local integer offset = 0
local integer lvl = 0
if a>0 then
set offset=RMem(a+0x54)
set lvl=RMem(a+0x50)
WMem(offset+0x74+0x68*lvl,SetRealIntoMemory(r))
endif
return r
endfunction
function GetSpellRange takes ability u returns integer
local integer a=GetUnitAbility(u,id)
local integer offset = 0
local integer lvl = 0
local integer r = 0
if a>0 then
set offset=RMem(a+0x54)
set lvl=RMem(a+0x50)
set r = RMem(offset+0x74+0x68*lvl)
endif
return r
endfunction
А вообще это ппц. Автор с велосипедом уехал хрен знает куда и приходится собирать из досок самокат. Вот что значит НЕоплачиваемые помощники.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

DracoL1ch, что-то мы вообще уже кто в лес, кто по дрова, хз, я не меняю сейчас описания и у меня нет вопросов по перезарядкам.
Меня интересует функция изменения дальности спелла, не требующая для своего действия клонабилити. Что нужно, чтобы ее увидеть?
21

» WarCraft 3 / [Мемхак] Функции для способностей.

DracoL1ch, "не клонируя его, тогда он изменится у всех юнитов" - ну то есть как GetAbilityCD и SetAbilityCD из основного мемхака вешают изменение перезарядок на абилу, а не на юнита с ней.
Так в принципе вполне подойдет, только описания изменить ну и при вешании на "дагоны" всякие предметные, конечно, в обоюдоострые мечи превращается, но нормально. А на геройские абилы сохранит мощность, если, конечно, не -duplicate играется.

Если есть такая готовая функция, очень хотелось бы.
Потому что вышенаписанные SetAbilityDataHeroRng и GetAbilityDataHeroRng без предварительного использования CloneAbilityData (опять же как помню и вижу по сообщениям выше, сейчас уже перепроверять трудно, героя в отдельной карте просто не существует) просто не давали запустить карту.
21

» WarCraft 3 / [Мемхак] Функции для способностей.

И тишина
Блин, серьезно, я лучше тут заплачу, не жалко, если определим способ анонимно перекинуть деньги
21

» WarCraft 3 / Нужна модель? - Вам сюда!

Что за ... с WC3 Underground? Оно мейл. ру письма не принимает, что ли? Несколько часов на мыльницу письма с активацией акка дождаться не могу, 2 раза уже переотправка была. Короче, если кому не лень, если у кого там есть акк и если там эти модели (какие-то или все) еще есть, скиньте плз сюда из секции ХотСа модели Хроми, Трейсер и Аларака. Думаю, не только мне пригодятся.
21

» WarCraft 3 / Как может невидимый юнит дать врагам (и не только) ауру?

Первая идея - периодически создавать москитного даммика без модели рядом с ним и прокачивать ему ауру до ауры юнита
21

» WarCraft 3 / Ребят, а как сделать пассивку Тролля из дота 2?

Proshel_Doty, ну так вот и как ты предлагаешь ее запомнить, если не моим способом (повесить и на нее какую-нибудь невидимую и не имеющую баффа в статусе зарядную отметку, определяющую, как долго именно этот тролль бил именно этого атакованного и бил ли вообще)? Если такой отметки нет - цель новая, поступаем соответственно - удаляем все имеющиеся отметки от этого тролля, сбрасываем ему заряды скорости атаки на столько-то, новоатакованному отметку даем и сразу повышаем по одному разу новоатакованному - лвл отметки, а троллю - скорость атаки.
И, бтв, так и не до конца понимаю, сбрасываем троллю заряды скорости атаки на ноль или половину (влом смотреть ща лезть, как в д2 было/стало), хотя суть вопроса не меняется.
21

» WarCraft 3 / Ребят, а как сделать пассивку Тролля из дота 2?

Вешать как-то невидимо эти заряды через какую-то метку, связанную с троллем, не только на него самого, но и на атакованного; при обнаружении несоответствия количества принимать соответствующие меры по сбросу зарядов с тролля и предыдущего атакованного.
Грубовато, но вероятность ошибок минимальна, а при наличии только одного тролля в игре исключена.
Это просто первое, что пришло в голову.
21

» WarCraft 3 / War3map.j до и после оптимизации?

Сунуть-вынуть war3map.j иногда вообще чудеса необъяснимые творит.
У меня, помнится, мемхак как раз после чего-то такого стал работать.