Tailer007, ну собственно вот наработка - xgm.guru/p/wc3/memory-hack-with-natives
Так же я расколупал китайскую карту и выкполупал мемхак на 1.27+, оно реально работает. так что можно не боятся что как плейграунд перейдут все на 1.27 и все, хана, капец. Все евро PvPGN сидящие на 1.27b и 1.28a тоже доступны.
Конечно, это создает некоторые сложности. Но когда это останавливало модмейкеров Warcraft 3?
Ну а с загрузкой и выгрузкой длл большой вопрос, мне бы тоже хотелось несколько плюшек запилить, но как сделать так чтобы у игроков все это не висело в памяти после игры, да и вовсе на том же айкапе можно поиграть в карту с мемхаком, а потом пойти в айдотку и крашнутся, очень бы не хотелось делать такие подлянки игрокам.
Tailer007, Ну нативки можно добавить самим, IseFog же делал уже, так же нам нечего боятся старших патчей, есть мемхак на 1.27+, с записью и всем чем над. Правд на старшие патчи оффсетов маловато. Щяс пока думаю над выгрузкой dll при выходе из карты, то хотелось бы напихать улучшалок, но вот они будут висеть всю игру, прока юзер не закроет вар.
В дота хелпере кстати вроде есть восстановление памяти, полезная штука, если делать изменения вроде детекта урона или еще чего.
Cadogan, ну как, руками... Есть такой предмет - книга заклинаний, его активная способность, является аналогом "skill menu", вмещающим 11 способностей. Еще есть такая способность - поставка ресурсов, она представляет из себя пустышку которая требует за каст золото или дерево, самое простое отказатся от дерева и сделать из него скиллпоинты.
Есть функция проверки кол-ва ловкости героя, при этом можно посмотреть сколько ловкости от характеристик и сколько от предметов, исходя из кол-ва ловкости вручать предметные абилки на атаку.
Самое простое - апгрейды, триггерно повышать уровень улучшения которое будет действовать на героя, увы это не идеальный вариант, но один из самых просты. Так же вручать способности предметов на регенерацию здоровья \ маны.
Напрямую - никак, есть место только под 5 способностей. Делать свою систему прокачки способностей из спеллбука или какие либо еще способы, на подобии рпгшных карт.
Аксид бомба, юзаю аксид бомбу и чертика в качестве основы для триггерных заклинаний со снарядом. Есть еще вариант, даммик с атакой и ядовитой стрелой - но у дамика должны быть те же визуальные параметры атаки что у юнита (точка начала атаки и так далее), чтобы снаряд вылетал из руки а не из жопы.
На юнитов подвергнутых паузе, не работает счетчик лимита урона, на этом баге основана связка способностей одного героя из доты, а именно Tiny -stone giant.
if GetLocalPlayer()==p then
call StoreInteger( gc, "GamesCount", "P"+I2S(GetPlayerId(GetLocalPlayer())), S2I(s) ) // поидее вот так я меняю ячейку
endif
Ты же через preloader вызываешь запись в кеш, локально для каждого игрока.
как сохранять данные в файл? А очень просто:
call Preload("\")\ncall StoreInteger( InitGameCache("cache"), "GameCount", "P"+I2S(GetPlayerId(GetLocalPlayer())), S2I("Count")) \n//") // сохраним на каждый комп файл
Примерно так, мб ошибки в ситаксисе есть, но записать в ячейку кеша можно без смены имени игрока, прям так.
Проверить наличие файла на машине юзера можно с помощью нативки GetSoundFileDuration, но у файла должно быть звуковое расширение, остальное неважно. Preloader'у же пофиг на расширение файла.
Мы сохраняем в геймкешь как в хештаблицу значение, запись и чтение производится по паре произвольных строк, если в хештаблице в качестве ключей используются целые числа, то в кеше строки.
Ты создаешь в кеше занятые ячейки, сам геймкешь похож на слк таблицу абилок.
потом локально ты записываешь в ячеку кеша нужные тебе данные:
If GetLocalPlayer() == Player(0) then
call StoreInteger( gc, "GamesCount", "P0", 129 )
endif
Данным кодом на машине красного игрока мы записали в ячейку кеша данные.
Далее нам нужно выполнить синхронизацию.
call TriggerSyncStart()
if GetLocalPlayer() == Player(0) then
call SyncStoredInteger(gc, "GamesCount", "P0")
endif
call TriggerSleepAction( 2.00 )
call TriggerSyncReady()
После чего толко ты можешь использовать данные.
Записать в кешь данные с машины игрока можно прямо в pld файле, не юзая никакие имена игроков и прочее говно.
call Preload("\")\ncall SetPlayerName(Player(15),\""+s+"\")\ncall ExecuteFunc(\"Test\")\n//") // сохраним на каждый комп файл
Вместо ExecuteFunc можно написать StoreInteger( InitGameChache("data.w3v"), "GameCounts", "p"+I2S(GetPlayerId(GetLocalPlayer)), GetPlayerGameCount() )
Важно чтобы имя кеша в карте и pld файле и карте было одинаковым, в данном случаи "data.w3v", но само название разумеется никакой роли не играет.
Bergi_Bear, имя файла разное для файла.
pld - preload data file, генерируется preload gen end
Ищешь в памяти адресс строк которые должны попасть в pld скрипт и меняешь их, если необходимо.
Ну а так строчку с сохранением в кешь пожалуйста.
В карте создаем и инициализируем кешь, как его назвать неважно.
В кеше N ячеек, по 1 для каждой игрока, записывешь в каждую глобально 0 (любую одинаковую информацию), потом вызываешь прелоад - глобально, но путь к файлу разный, у всех игроков, при этом содержимое примерно одинаковое, кроме данных, при этом запись в кешь ты производишь прямо в pld файле, достаточно инициализировать кешь с тем же именем что в игре, ну а после синхронизация данных между игроками.
в прелоаде можно делать примерно так:
код
function PreloadFiles takes nothing returns nothing
local gamecache gc = InitGameCache( "MMD.Dat" )
local string st = "Runner"
//===========================================================================
// preload runner id data
//===========================================================================
call StoreInteger(gc,st,"0",'E000') //1 - A
call StoreInteger(gc,st,"1",'E001') //2 - B
call StoreInteger(gc,st,"2",'E002') //3 - C
call StoreInteger(gc,st,"3",'E003') //4 - D
call StoreInteger(gc,st,"4",'E004') //5 - E
call StoreInteger(gc,st,"5",'E005') //6 - F
call StoreInteger(gc,st,"6",'E006') //7 - G
call StoreInteger(gc,st,"7",'E007') //8 - H
call StoreInteger(gc,st,"8",'E008') //9 - I
call StoreInteger(gc,st,"9",'E009') //10 - K
call StoreInteger(gc,st,"10",'E00A') //11 - J
call StoreInteger(gc,st,"11",'E00B') //12 - K
call StoreInteger(gc,st,"12",'E00C') //13 - L
call StoreInteger(gc,st,"13",'E00D') //14 - M
call StoreInteger(gc,st,"14",'E00E') //15 - N
call StoreInteger(gc,st,"15",'E00F') //16 - O
call StoreInteger(gc,st,"16",'E00G') //17 - P
call StoreInteger(gc,st,"17",'E00H') //18 - R
call StoreInteger(gc,st,"18",'E00I') //19 - S
call StoreInteger(gc,st,"19",'E00J') //20 - T
call StoreInteger(gc,st,"20",'E00K') //21 - U
call StoreInteger(gc,st,"21",'E00L') //22 - V
call StoreInteger(gc,st,"22",'E00M') //23 - W
call StoreInteger(gc,st,"Max",22) //Максимум эльфиек
set st = null
set gc = null
endfunction
Кстати у тебя же есть мемхак, ты можешь модифицировать все что пишется в pld файл по своему хотению.
function Is2cc takes real r, real cx, real cy, real px1, real py1, real px2, real py2 returns boolean
local real dx = 0.00
local real dy = 0.00
local real a = 0.00
local real b = 0.00
local real c = 0.00
set px1 = px1 - cx
set py1 = py1 - cy
set px2 = px2 - cx
set py2 = py2 - cy
set dx = px2 - px1
set dy = py2 - py1
set a = dx * dx + dy * dy
set b = 2.00 * ( px1 * dx + py1 * dy )
set c = px1 * px1 + py1 * py1 - r * r
if ( -b < 0.00 ) then
return ( c < 0.00 )
elseif ( -b < ( 2.00 * a ) ) then
return ( ( 4.0 * a * c - b * b ) < 0 )
endif
return ( a + b + c < 0 )
endfunction
Проверка на то что пересекает ли вектор окружность,
» WarCraft 3 / WFE - Warcraft Feature Extender
Так же я расколупал китайскую карту и выкполупал мемхак на 1.27+, оно реально работает. так что можно не боятся что как плейграунд перейдут все на 1.27 и все, хана, капец. Все евро PvPGN сидящие на 1.27b и 1.28a тоже доступны.
Конечно, это создает некоторые сложности. Но когда это останавливало модмейкеров Warcraft 3?
Ну а с загрузкой и выгрузкой длл большой вопрос, мне бы тоже хотелось несколько плюшек запилить, но как сделать так чтобы у игроков все это не висело в памяти после игры, да и вовсе на том же айкапе можно поиграть в карту с мемхаком, а потом пойти в айдотку и крашнутся, очень бы не хотелось делать такие подлянки игрокам.
» WarCraft 3 / WFE - Warcraft Feature Extender
В дота хелпере кстати вроде есть восстановление памяти, полезная штука, если делать изменения вроде детекта урона или еще чего.
» WarCraft 3 / WFE - Warcraft Feature Extender
» WarCraft 3 / Как настроить бонусы от характеристик
» WarCraft 3 / Так почему же юнит удаляется?
» WarCraft 3 / Как настроить бонусы от характеристик
» WarCraft 3 / Отравленный кинжал
все вредные абилки наносят 0 ед. урона перед эффектом.
» WarCraft 3 / Отравленный кинжал
» WarCraft 3 / Получить имя функции в jass как строку
» RenderEdge / [RenderEdge] Memory Hack
» WarCraft 3 / По поводу ракетного залпа Механика
» RenderEdge / [RenderEdge] Memory Hack
А как их искать?
Интересен GetFrameAdress
» WarCraft 3 / можно ли сменить анимацию дистанционной атаки на юнита?
» WarCraft 3 / Возможна ли без JASS автоматическая добыча древесины?
» RenderEdge / [RenderEdge] Memory Hack
» RenderEdge / [RenderEdge] Memory Hack
» RenderEdge / [RenderEdge] Memory Hack
» WarCraft 3 / Код Jaas, изменение кода в уже готовой наработке.
(гугли по сайту чаво это и как включить)
» WarCraft 3 / Система подсчета сыгранных игр
как сохранять данные в файл? А очень просто:
Проверить наличие файла на машине юзера можно с помощью нативки GetSoundFileDuration, но у файла должно быть звуковое расширение, остальное неважно. Preloader'у же пофиг на расширение файла.
» WarCraft 3 / Система подсчета сыгранных игр
потом локально ты записываешь в ячеку кеша нужные тебе данные:
Далее нам нужно выполнить синхронизацию.
Записать в кешь данные с машины игрока можно прямо в pld файле, не юзая никакие имена игроков и прочее говно.
Важно чтобы имя кеша в карте и pld файле и карте было одинаковым, в данном случаи "data.w3v", но само название разумеется никакой роли не играет.
Ред. quq_CCCP
» WarCraft 3 / Система подсчета сыгранных игр
pld - preload data file, генерируется preload gen end
Ищешь в памяти адресс строк которые должны попасть в pld скрипт и меняешь их, если необходимо.
Ну а так строчку с сохранением в кешь пожалуйста.
Ред. quq_CCCP
» WarCraft 3 / Система подсчета сыгранных игр
В кеше N ячеек, по 1 для каждой игрока, записывешь в каждую глобально 0 (любую одинаковую информацию), потом вызываешь прелоад - глобально, но путь к файлу разный, у всех игроков, при этом содержимое примерно одинаковое, кроме данных, при этом запись в кешь ты производишь прямо в pld файле, достаточно инициализировать кешь с тем же именем что в игре, ну а после синхронизация данных между игроками.
в прелоаде можно делать примерно так:
» WarCraft 3 / Система подсчета сыгранных игр
Ну нужен геймкешь и прелоад.
» WarCraft 3 / Система подсчета сыгранных игр
» WarCraft 3 / Polar