Я пробовал каналом с заданным приказом patrol. Когда отдаем приказ patrol, то получается что юнит не патрулирует, а бежит кастовать в точку, игноря всех. Я забил на этот способ. Потом пришла новая идея, а вдруг можно абузить этим способом. Представьте, сначала бежит патрулировать в одну точку, а когда дойдет, он же побежит обратно - получит другой приказ, и тут канал срабатывает, и мы узнаем завершение. Короче, не работает. Канал тоже не видит приказы patrol, только в начале SomeFire, ну это понятно. Но мне хочется свою систему патрулирования иметь. Но чекать поиском весь маршрут на наличие противников и прочее, не хочется. Проще отловить начальные приказы patrol, далее ловим завершение приказа, и в завершении готовый patrol отдать в точку, дошел - отдаем новый patrol в точку. дело - отследить.
пока самый оптимальный вариант - это таймером чекать изменилось ли положение маршрута, там нужно интервал таймера сделать больше. И пока работает хорошо, но насколько хорошо - неизвестно. Но я еще забываю, что юниты могут драться, и в патруле могут остановиться и подраться. Ну придется заигнорить патрулирование.
patrol => заменить на attack - тут визуальные эффекты портят все. рамку как найти. можно кое-что сделать))
biridius, у меня пишет чо нет какой то библиотеки. скинул бы давно скрин с ошибкой: "Библиотека ijl15.dll не найдена. загрузка blp-текстур невозможна", только лимит уже закончился. я хотел видеть текстуры натянутые на модель. А я этого не вижу. редактор должен как то с архивом игры иметь, а именно с текстурами?
так я извлек папку паладоса со всем содержимым. модель, текстуры, звуки на рабочий стол
KaneThaumaturge, в этом то и проблема всех мемхаков. это все нужно собирать. я понял, что вы еще не освоились. в начале я тоже таким же был. нехера не разбирался, и каждый фрейм разбираал
есть специальная нативка сокрытия фрейма. не все фреймы можно скрыть, тк есть такие фреймы, которые постоянно обновляются. ты скрываешь, а они снова показывают. еще можешь задеть какой то игровой процесс, и привести может еще и к фаталу. поэтому лучше сокрыть их другим способом
изменить размер BlzFrameSetScale(frame, 0.001) мы можем такой малюсенький размер указать, что его совсем не видно. Так у вас не будет вылетать от закрытия какого процесса. Но может вылететь, если фрейм не имеет размеров или не приспособлен к этому
фрейм за пределы экрана сдвинуть - самый безопасный. Однако, это делать нужно с фреймами которые существуют. Обычно с невидимыми-не существуемыми фреймами лучше не работать - игра вылетакет
KaneThaumaturge, спроси у этого человека он у нас специалист. он кучу наработок с фреймами недавно выложил с мемхаком. я мемхак не понимаю. я в рефорджете сижу. и мне нужно мемхаковские настройки применять, сбрасывать регистр с рефорджа, качать p/jass и прочкк =(
у офериста в ресурсах смотри. и он там описал. там нуен мемхак анрайза. я вот его скачал, но мне его не запустить
точно работает золото? какие проблемы с атакой и защитой? подсказать названия фреймов?
там короче статы все связаны друг с другом (если вы читали статью про позиционирование. там рассказывали что фреймы могут быть связаны). если ломаешь атаку/защиту, все остальное тоже ломается. короче все фреймы статов связаны точками друг с другом. самый первый фрейм - это атака в правом верхнем углу. потом защита или что там следом идет, и так далее. это как домино или коробки, связанные спичками. Как убираешь, и все остальные рушится.
BottomCenterUI инфу смотреть тут
"SimpleInfoPanelUnitDetail",0 - панель юнита
SimpleInfoPanelIconDamage,0-1 - информация об атаке и уроне. Тут показан тип атаки, урон. Тут два index = 0 и 1, дело в том, что могут быть показаны две атаки, как у ледяных змеи или химер. Атака мб выключена, и тогда фреймы не отображают инфу.
SimpleInfoPanelIconArmor,2 - информация об защите юнита. Тут показан тип брони и кол-во защиты. Эта броня есть у любого юнита.
У этих фреймов есть дочерние фреймы с одинаковыми именами, отличается только createContext.
"InfoPanelIconBackdrop" the image
"InfoPanelIconLevel" the shown techLevel (text)
"InfoPanelIconLabel" Damage/Armor..
"InfoPanelIconValue" the amount
типа для 1 атаки и 2 атаки context 0-1
"InfoPanelIconBackdrop", 0-1
"InfoPanelIconLevel", 0-1
"InfoPanelIconLabel",0-1
"InfoPanelIconValue", 0-1
а для защиты
"InfoPanelIconBackdrop", 2
"InfoPanelIconLevel", 2
"InfoPanelIconLabel", 2
"InfoPanelIconValue", 2
Перемещение этих фреймов лучше всего выполнять путем перемещения IconFrame «InfoPanelIconBackdrop», поскольку тексты позиционируются относительно IconFrame, а фреймы-родители контейнера, такие как «SimpleInfoPanelIconDamage», часто меняют положение в зависимости от выбранного юнита (если у него нет атаки, то атака выключена, и фрейм атаки тоже).
Можно разрушить положение всех фреймов. К примеру, хотел спрятать атаку, ибо BlzFrameSetVisible скрывает частично, моргает, поэтому спрятал так:
BlzFrameSetScale(BlzGetFrameByName("SimpleInfoPanelIconDamage",0), 0.001)
Фрейм атаки спрятал, но таким образом другие фреймы потеряли прежние позиции, и магнитом прилипли в одной точке
KaneThaumaturge, загружаем в указанном toc-file fdf-files. Все написано в разделе UI: Reading a FDF и UI: toc-Files
пояснения LoadTOCFile
Файл TOC - это файл со списком одного или нескольких файлов fdf (расширение фрейма, можете блокнотом открыть). Каждая строка - это путь к одному файлу fdf. Каждый fdf - это отдельный файл. В Warcraft 3 эти TOC-файлы используются для загрузки перечисленных файлов fdfs.
В варкрафте много fdf-files. В них записаны параметры фреймов: размеры, привязка,границы, фон или изображение, шрифт/техт и многое чего другое. Все фреймы поделены на типы. И иеще они могут иметь связи родитель-потомки. главный фрейм - родитель. внутри тела - потомки. Часто просто чтобы не прописывать одни и те же параметры, есть шаблоны. Очень много шаблонов. fdf-files очень много. В игре не все fdf-files могут быть включены игрой, разработчиками они могут быть выключены. Чтобы заимствовать параметры из fdf-files, нужно подключить/загрузить в игру. А помогает нам этот toc-file. Достаточно один раз загрузить при инициализации, и всю игру работает.
При создании фреймов мы часто указываем в триггерах шаблон из fdf-file. его можно указать, или можно не указывать, тогда у вас станд фрейм. В fdf-files часто используют наследования
KaneThaumaturge, может быть стоит обращаться к фрейму не при инициализации, а спустя какое то время со старта. Обычно может быть фрейм не инициализирован. Такое тоже бывает. Так у меня больше нет идеи почему не работает, надо самому смотреть =((
мб инфы много навалил в один док. стоило разбить на части. источник
тфу попробуй ResourceBarFrame?
у вас была
function GetCFrameByName takes string name, integer id returns integer
if pGetCFrameByName > 0 then
if name != "" then
return fast_call_2( pGetCFrameByName, GetStringAddress( name ), id )
endif
endif
return 0
endfunction
попробуй еще другие функции. в мемхаке кучу функции.
function GetFrameByName takes string name, integer id returns integer
return GetCFrameByName( name, id )
endfunction
тут оферист кучу примеров выкладывал. надо там в примерах заглянуть. если что
set gold = GetCFrameByName("ResourceBarGoldText",0)
call ClearFrameAllPoints(gold)
call SetFrameAbsolutePoint(gold,ANCHOR_CENTER,0.4,0.3)
чтобы сдвинуть фрейм необходимо чистить точки сначала. просто фреймы привязаны друг другом framepoints. Если пытаешься сдвинуть, то у вас не получится или фрейм растягивается. короче статьи не читаем и лень
пример <= первая карта. возможна там есть другие версии статьи
все функции даны. А тех, что нет, можно покопаться в fdf-files. И найти имя, чтобы обратиться к этому фрейму пример <= рефорджете. но все константы в фрейме вроде есть, они выведены в виде отдельных функции. даже больше функции в мемхаке.
теперь надо найти именную функцию в мемхаке. мы могли использовать в рефорджете такую функцию
BlzGetFrameByName("name",argument)
В мемхаке это может быть
GetCFrameByName?
типа если нужно изменить значение золота, то мы обращаемся к текстовому фрейму ResourceBarGoldText
GetCFrameByName("ResourceBarGoldText",0)
можем спрятать, изменить текст. и даже удалить или передвинуть
если что я в мемхаке не знаю как это должно быть. это надо тестить. так ли функция и прочее. Но так по идее работает.
игровая карта или границы камеры. Я еще до сих пор не знаю, что лучше. Начинал с границ камер bj_mapInitialCameraBounds, там столько ошибок было изначально в системе. Решил попробовать игровую карту bj_mapInitialPlayableArea. Это не значит, что границы камеры хуже. Но пока не знаю. Но в редакторе границы камеры не в 1:1, когда мне надо были размеры в 1:1. Сейчас я решил эту проблему.
--размеры границ камеры bj_mapInitialPlayableArea
PlayableArea_Width = GetRectWidthBJ(bj_mapInitialPlayableArea)
PlayableArea_Height = GetRectHeightBJ(bj_mapInitialPlayableArea)
--соотношение размеров игровой карты
AspectRatio_PlayableArea=PlayableArea_Width/PlayableArea_Height
игровая карта соотношение 1:1
w = 6656 (52)
h = 6656 (52)
AspectRatio_PlayableArea=w/h=1
теоретически размер мини-карты не изменяется, он остается таким же. Но обрезается границами, если расширяется или сужается размерами. BlzFrameGetWidth(frame) и BlzFrameGetHeight(frame) не показывают изменении, а значит от размеров фреймов не зависят. Но зависимость идет от размеров карты. ниже код, но в некоторых моментах работает с погрешностями при растягивании размеров границ. Пример соотношения 1:1, 1.08:1 работает ниже, а 0.92:1 с погрешностями, ладно лень уже
--игровая карта становится шире, а значит, и положение точки отсчета меняет тоже.
if AspectRatio_PlayableArea > 1.00 then
new_h=MiniMap_Height/AspectRatio_PlayableArea=0.138125/1.08=0.12789
MiniMap_y0=MiniMap_y0+( (MiniMap_Height-new_h)/2 )=0.006875+(0.138125-0.12789)/2=0.006875+0.0051175=0.0119925
MiniMap_Height = new_h
--Если хотите двигать центр фрейма framepoint_center то умножить лучше на 2.5. Как-то случайно нашел коэффициент. Потом понял, что он не нужен, тк я попутал framepoint_center с framepoint_bottomleft.
--умножаем тело отсчета на 2.5
--MiniMap_x0=MiniMap_x0*2.5
--MiniMap_y0=MiniMap_y0*2.5
--игровая карта становится растянутой, а значит, и точка отсчета меняет положение. Тут просто размеры поменяли.
elseif AspectRatio_PlayableArea < 1.00 then
new_w=MiniMap_Width*AspectRatio_PlayableArea=0.139375*0.92=0.128225
MiniMap_x0=MiniMap_x0+( (MiniMap_Width-new_w)/2 )=0.009375+(0.139375-0.128225)/2=0.009375+0.00893568=0.018
MiniMap_Width = new_w
--Если хотите двигать центр фрейма framepoint_center то умножить лучше на 2.5. Как-то случайно нашел коэффициент. Потом понял, что он не нужен, тк я попутал framepoint_center с framepoint_bottomleft.
--умножаем тело отсчета на 2.5
--MiniMap_x0=MiniMap_x0*2.5
--MiniMap_y0=MiniMap_y0*2.5
--если соотношение игровой карты 1:1, то точку отсчета не нужно менять
elseif PlayableArea_Width == PlayableArea_Height then
--умножаем тело отсчета на 2.5
--MiniMap_x0=MiniMap_x0*2.5
--MiniMap_y0=MiniMap_y0*2.5
end
оффсеты. тут есть небольшие отклонения. и они зависят от соотношения размеров миникарты.
раскрыть
if AspectRatio_MiniMap > 1.00 then
offsetx = 0.00
offsety = MiniMap_x0 / AspectRatio_MiniMap = 0.009375 / 1.009049774 = 0.009
elseif AspectRatio_MiniMap < 1.00 then
offsetx = MiniMap_y0 * AspectRatio_MiniMap = 0.006875 * 1.009049774 = 0.0069
offsety = 0.00
end
ну и код определения положения спрайта. Вводим мировые координаты, получаем экранные координаты. Точнее координаты миникарты
function GetScreenPosAtMiniMap(x,y)
local procent_X = (((PlayableArea_Width/2)+x)/PlayableArea_Width) --*100.00
local procent_Y = (((PlayableArea_Height/2)+y)/PlayableArea_Height) --*100.00
local ScreenX = (procent_X*MiniMap_Width) --/100.00
local ScreenY = (procent_Y*MiniMap_Height) --/100.00
print(ScreenX..","..ScreenY)
return (ScreenX),(ScreenY)
end
--пример вызова-создаем фрейм
QueueOrders.WayPointAtMiniMap[h][NumberOrder] = BlzCreateFrameByType("SPRITE", "MinimapWaypoint", gameUI, "MinimapWaypoint", 0)
local Sx, Sy = GetScreenPosAtMiniMap(GetOrderPointX(),GetOrderPointY())
BlzFrameSetAbsPoint(QueueOrders.WayPointAtMiniMap[h][NumberOrder], FRAMEPOINT_BOTTOMLEFT, MiniMap_x0+Sx, MiniMap_y0+Sy)
вот сама карта <= система добавления приказов в очередь. пока сырая. много чего дорабатывать надо. Суть в чем? когда мы выбираем мышью с помощью прицела цель, жмем на кнопку мыши. Тут нужно сбить очередь. Юнит получает приказ стоп при клике кнопки мыши, и тут же системой получает приказ следовать новому приказу. Новый запоминаем, и выполняем старый.
jasonrus96,
смотри. С мышью там все понятно, событие нажатия и отпускания кнопки мыши. С клавиатурой такого нету. Я еще и сам не вкурил окончательно. Но тут можно записать состояния. Когда вы держите кнопку, у вас постоянно всплывает один и тот же key. Если его отпустить, то у вас перестанет показывать.
Есть еще
BlzGetTriggerPlayerMetaKey() == 1 (жмут/держат) <= если держите кнопку, периодически у вас дебаг будет выводить о том, что кнопка зажата.
BlzGetTriggerPlayerMetaKey() == 0 (опускают) <= при опускании кнопки вам покажут ноль.
плюс нужно учитывать эти комбинации клавиш, числа будут разные. пока не знаю как работает это, но понял что несколько значении суммируются. Пример A = 1, B = 2. комбинация A+B=3. Хотя я сам не до конца понимаю работу. А что если у вас 1+3 или 2+2 - сумма одинаковая? так что не буду лезть вперед паровозом. ладно я на отдых
код с Shift
--чекаем pressed Shift
--https://www.hiveworkshop.com/threads/oskey-player-key-event.319903/
local ShiftOn = 0
TimerStart(CreateTimer(),0,false, function()
print("Create Keys")
for index = 8,255 do
local trigger = CreateTrigger()
TriggerAddAction(trigger, function()
if index == 160 and ShiftOn ~= BlzGetTriggerPlayerMetaKey() then
if BlzGetTriggerPlayerMetaKey() == 1 then
ShiftOn = 1
print("Shift нажат")
elseif BlzGetTriggerPlayerMetaKey() == 0 then
ShiftOn = 0
print("Shift отпущен")
end
--if GetLocalPlayer() ~= nil then
-- ShiftOn = BlzGetTriggerPlayerMetaKey()
--end
end
--print("OsKey:",index, "meta",BlzGetTriggerPlayerMetaKey())
end)
local key = ConvertOsKeyType(index)
for metaKey = 0,15,1 do
BlzTriggerRegisterPlayerKeyEvent(trigger, Player(0), key, metaKey, true)
BlzTriggerRegisterPlayerKeyEvent(trigger, Player(0), key, metaKey, false)
end
end
print("Done")
print("Press Keys to show the index of that oskey and its metakey")
end)
тут еще помни, что события клавиш и мыши нужно регистрировать после инициализации, то есть после 0.00 сек. А то во время загрузки могут нажать и сфаталит игра
так у всех кнопок, фреймов и прочее есть приставка к переменной Down - нажимание, и UP - отпускание. Посмотри. Но я сам еще не пробовал. Только с Shift-ом. И то по причине не работы события с Shift.
И какую задачу вы хотите исполнить? просто немного странно хп/ману показывать таким способом =) я даже могу хп/ману противника видеть.
Ты должен таймером обновлять информацию. Каждую 0.03 сек чекаем информацию. А так у вас не обновляется информация, триггер trig обновляет при выделении игроком юнита / при клике по юниту. А нужно каждую секунду обновлять информацию юнита.
Отслеживаем GetMainSelectedUnit и показываем его хп/ману
rsfghd,
Техника 'ANeg' - пассивка, которая заменяет способность на другую, с улучшенными характеристиками (в характеристиках указано несколько полей-слотов. Сколько слотов, столько и способностей, которые будут заменены. Максимум 4 абилки могут быть усовершенствованы. в одном слоте можно указать две абилки: первая эта та, которую хотят заменить, вторая эта та, которой заменяют. Вторая абилка, как правило, имеет улучшенные характеристики (например: больше урона, меньше перезарядки, меньше расхода маны и др). Также увеличивает силу атаки и скорость перемещения
Факты:
Если удалить технику, то вернется все на место.
КД можно изменить, снизить. Делаешь два бурана. У одного перезарядка: 30 секунд, у другого 10 секунд. Если запустить кулдаун первой абилки, и потом сразу же дать технику, то абилка заменяется на вторую. Но кулдаун в 30 секунд не сбрасывает. После перезарядки у вас будет меньше кулдауна - 10 секунд.
Раньше думал, что техника сбрасывает кд у абил с разными ID (например, буран и огненный столб - это две разные абилки, и разные ID). Так как абилы с одинаковым ID имеют общую перезарядку. На деле, после смены кд остается висеть на второй абилке. Пробовал активную способность с запущенным кд заменить на пассивку, в результате получал пассивку с кд. Что если использовать безумие + техника = пассивка с кд. безумие не сбивает приказы.
Если менять с пасивки на активку, то невозможно запустить активную способность. Она будто бы превратилась в пассивку, не кликается.
Если дать скилл "Техника" обычному юниту (не герою), то будет фатал...
Работая с данной способностью я заметил несколько интересных фактов.
Предупреждение: данная способность очень нестабильная и на нее влияет практически все, так что прежде чем говорить что я не прав, самостоятельно попробуйте разные варианты.
1)Если стандартная способность на основе "Канал" - то заменить можно только на канал, но при этом стартовая способность может быть например без цели, а новая как угодно настроенная.
2)Если заставить героя выучить пустышки и давать ему разные "Техники" то мы будем менять способности героя без потери кд, но кд и id приказа у этих способностей будет равно кд и id пустышки, у "Канала" немного по другому: id приказа берется не пустышки, а первой заменной способности , то есть у юнита был канал с id приказа "громовая поступь" мы заменили на "волну силы" и дальше везде будет волна силы.
3)Также с помощью "техники" возможно делать поочередную смену моделей героя: допустим у героя есть "перевоплощение" без времени действия и произношения, то мы можем превратить юнита A в юнита B и заменить техникой способность где, юнит B меняется на юнита C, при следующем юзе мы даем способность где, C меняем на A. И мы получаем трансформ с 3 последовательно меняющимися моделями, но ведь 3 это не предел, так можно менять хоть 6, хоть 10. Вся фишка в том, нужно указать в перевоплощений нормальную форму - ту, в которую хотите превратиться
4)Технику нельзя добавлять обычным юнитам, т.е только героям. (с) quq_CCCP
5)Если вы химичите со стандартными способностями, очень важную роль играет, что вы выучите первым, сам скил или технику
6)Если первая техника превращает скил в пассивку, то все следующие замененые скилы будут пассивными (например был скил "Волна силы" активный после замены, стал пассивный и любой другой который мы заменяем).
7)С помощью техники можно менять спелбуки.
Неудачи:
1)Попытка менять способность "Темный", с помощью "техники" провалилась.
Я понимаю, что тут очень мало информации, но это пока все, что я успел обнаружить. Vadik29
можно попробовать. ты либо что-то не так делаешь, или действительно никак. что за хб бар, может быть полоса героя?
--чистим точки фрейм, таким образом разрушая связь с другими фреймами. просто обычно привязаны фреймы точками, и ты не может двигать фрейм.
BlzFrameClearAllPoints(frame)
--двигаем фрейм
BlzFrameSetAbsPoint(frame, FRAMEPOINT_CENTER, 3, 0)
--привязываем фрейм frameA к другому фрейму frameB точками
BlzFrameSetPoint(frameA, FRAMEPOINT_BOTTOM, frameB, FRAMEPOINT_BOTTOM, offset_x, pffset_y)
еще тут <= см раздел BottomCenter UI parent (unit info- Inventory). тут названия всех фреймов и констант центральной панели
или тут
Survivalist, понял, что ты ищешь. это не нативки, а названия фреймов или константы. названия можно посмотреть в fdf-files. все что ты просишь, их очень много. И тем более они поделены на панели (панель транспорта, инфа юнита, панель группы, инфа панель итема, декора и пр).
Survivalist, что ты хочешь убрать?
кнопки приказов (атака 'Aatk', стоп 'Astp', патруль 'Apat, двигать 'Amov', удерживать Ahld', точка сбора 'ARal', изучить навыки 'AHer')? Их можно скрыть. Там в рефордже есть два способа: заблочить абилу у самого игрока, спрятать (hide) абилу у самого юнита. Можно еще попробовать удалить (может привести к ущербу. помню в старом варе удалив абилку Amov, он перестал фактически двигаться. Или совсем фаталило. Надеюсь в рефорджете все в норм). А еще можно задать положение x,y абилам
а если вам нужно просто панель убрать, то кнопки можно скрыть.
Но скрыв/заблочив кнопки, у вас не будут работать горячие клавиши. Можно просто CommandBarFrame за пределы экрана передвинуть. Так кнопки будут видимы игрой, но находится за пределами экрана.
код
Если хотите навсегда выключить, вот код (мне пригодился, когда нужно было скрыть показ кнопок) Недостаток: но с этим же способом вы скрываете родителей кнопок на панеле, и у вас не будут отображаться все кнопки способностей, предметы в магазине, исследования и пр. :
Ред. MpW
» WarCraft 3 / Многоточечное патрулирование
SomeFire, ну это понятно. Но мне хочется свою систему патрулирования иметь. Но чекать поиском весь маршрут на наличие противников и прочее, не хочется. Проще отловить начальные приказы patrol, далее ловим завершение приказа, и в завершении готовый patrol отдать в точку, дошел - отдаем новый patrol в точку. дело - отследить.
» WarCraft 3 / Как правильно пользоваться mdlvis?
так я извлек папку паладоса со всем содержимым. модель, текстуры, звуки на рабочий стол
Ред. MpW
» WarCraft 3 / Как правильно пользоваться mdlvis?
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
"SimpleInfoPanelUnitDetail",0 - панель юнита
SimpleInfoPanelIconArmor,2 - информация об защите юнита. Тут показан тип брони и кол-во защиты. Эта броня есть у любого юнита.
"InfoPanelIconBackdrop" the image
"InfoPanelIconLevel" the shown techLevel (text)
"InfoPanelIconLabel" Damage/Armor..
"InfoPanelIconValue" the amount
"InfoPanelIconBackdrop", 0-1
"InfoPanelIconLevel", 0-1
"InfoPanelIconLabel",0-1
"InfoPanelIconValue", 0-1
а для защиты
"InfoPanelIconBackdrop", 2
"InfoPanelIconLevel", 2
"InfoPanelIconLabel", 2
"InfoPanelIconValue", 2
Можно разрушить положение всех фреймов. К примеру, хотел спрятать атаку, ибо BlzFrameSetVisible скрывает частично, моргает, поэтому спрятал так:
BlzFrameSetScale(BlzGetFrameByName("SimpleInfoPanelIconDamage",0), 0.001)
Фрейм атаки спрятал, но таким образом другие фреймы потеряли прежние позиции, и магнитом прилипли в одной точке
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
В варкрафте много fdf-files. В них записаны параметры фреймов: размеры, привязка,границы, фон или изображение, шрифт/техт и многое чего другое. Все фреймы поделены на типы. И иеще они могут иметь связи родитель-потомки. главный фрейм - родитель. внутри тела - потомки. Часто просто чтобы не прописывать одни и те же параметры, есть шаблоны. Очень много шаблонов. fdf-files очень много. В игре не все fdf-files могут быть включены игрой, разработчиками они могут быть выключены. Чтобы заимствовать параметры из fdf-files, нужно подключить/загрузить в игру. А помогает нам этот toc-file. Достаточно один раз загрузить при инициализации, и всю игру работает.
При создании фреймов мы часто указываем в триггерах шаблон из fdf-file. его можно указать, или можно не указывать, тогда у вас станд фрейм. В fdf-files часто используют наследования
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
тфу попробуй ResourceBarFrame?
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
constant integer ANCHOR_TOP = 1
constant integer ANCHOR_TOPRIGHT = 2
constant integer ANCHOR_LEFT = 3
constant integer ANCHOR_CENTER = 4
constant integer ANCHOR_RIGHT = 5
constant integer ANCHOR_BOTTOMLEFT = 6
constant integer ANCHOR_BOTTOM = 7
constant integer ANCHOR_BOTTOMRIGHT = 8
call ClearFrameAllPoints(gold)
call SetFrameAbsolutePoint(gold,ANCHOR_CENTER,0.4,0.3)
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
статьи
пример <= рефорджете. но все константы в фрейме вроде есть, они выведены в виде отдельных функции. даже больше функции в мемхаке.
ResourceBarFrame, 0
ResourceBarGoldText, 0
ResourceBarLumberText, 0
ResourceBarSupplyText, 0
ResourceBarUpkeepText, 0
BlzGetFrameByName("name",argument)
GetCFrameByName?
типа если нужно изменить значение золота, то мы обращаемся к текстовому фрейму ResourceBarGoldText
GetCFrameByName("ResourceBarGoldText",0)
можем спрятать, изменить текст. и даже удалить или передвинуть
Ред. MpW
» WarCraft 3 / [RenderEdge] Memory Hack: Помогите найти фрейм золота
2 = ButtonFrame
3 = ChatMode
4 = CommandButton
5 = CursorFrame
6 = EditBox
7 = Frame
8 = FloatingFrame
9 = GameUI
10 = HeroBarButton
11 = HighlightFrame
12 = LayoutFrame
13 = MessageFrame
14 = Minimap
15 = ModelFrame
16 = PortraitButton
17 = ScreenFrame
18 = SimpleButton
19 = SimpleFontString
20 = SimpleFrame
21 = SimpleGlueFrame
22 = ???
23 = SimpleMessageFrame
24 = Slider
25 = SpriteFrame
26 = StatBar
27 = TextArea
28 = TextButtonFrame
29 = TextFrame
30 = UberToolTipWar3
31 = WorldFrameWar3
32 = GlueButtonWar3
33 = GlueTextButtonWar3
34 = GlueCheckBoxWar3
35 = GluePopupMenuWar3
36 = GlueEditBoxWar3
37 = SlashChatBox
38 = TimerTextFrame
39 = SimpleStatusBar
40 = StatusBar
41 = UpperButtonBar
42 = ResourceBar
43 = SimpleConsole
44 = PeonBar
45 = HeroBar
46 = TimeOfDayIndicator
47 = InfoBar
48 = TimeCover
49 = ProgressIndicator
50 = HeroLevelBar
51 = BuildTimeIndicator
52 = InfoPanelDestructableDetail
53 = InfoPanelItemDetail
54 = InfoPanelIconAlly
55 = InfoPanelIconHero
56 = InfoPanelIconGold
57 = InfoPanelIconFood
58 = InfoPanelIconRank
59 = InfoPanelIconArmor
60 = InfoPanelIconDamage
61 = InfoPanelCargoDetail
62 = InfoPanelBuildingDetail
63 = InfoPanelUnitDetail
64 = SimpleTexture
Ред. MpW
» WarCraft 3 / точные расчеты в lua
w=6912 (54)
h=6400 (50)
AspectRatio_PlayableArea=w/h=1.08
w=6400 (50)
h=6912 (54)
AspectRatio_PlayableArea=w/h=0.92
w = 6656 (52)
h = 6656 (52)
AspectRatio_PlayableArea=w/h=1
offsetx = 0.00
offsety = MiniMap_x0 / AspectRatio_MiniMap = 0.009375 / 1.009049774 = 0.009
elseif AspectRatio_MiniMap < 1.00 then
offsetx = MiniMap_y0 * AspectRatio_MiniMap = 0.006875 * 1.009049774 = 0.0069
offsety = 0.00
end
Ред. MpW
» WarCraft 3 / Отлов QWER с помощью jass
смотри. С мышью там все понятно, событие нажатия и отпускания кнопки мыши. С клавиатурой такого нету. Я еще и сам не вкурил окончательно. Но тут можно записать состояния. Когда вы держите кнопку, у вас постоянно всплывает один и тот же key. Если его отпустить, то у вас перестанет показывать.
BlzGetTriggerPlayerMetaKey() == 1 (жмут/держат) <= если держите кнопку, периодически у вас дебаг будет выводить о том, что кнопка зажата.
BlzGetTriggerPlayerMetaKey() == 0 (опускают) <= при опускании кнопки вам покажут ноль.
плюс нужно учитывать эти комбинации клавиш, числа будут разные. пока не знаю как работает это, но понял что несколько значении суммируются. Пример A = 1, B = 2. комбинация A+B=3. Хотя я сам не до конца понимаю работу. А что если у вас 1+3 или 2+2 - сумма одинаковая? так что не буду лезть вперед паровозом. ладно я на отдых
Ред. MpW
» WarCraft 3 / Отлов QWER с помощью jass
Ред. MpW
» WarCraft 3 / Отлов QWER с помощью jass
пример
Ред. MpW
» WarCraft 3 / Bars
Отслеживаем GetMainSelectedUnit и показываем его хп/ману
» WarCraft 3 / Как дать способности перезарядку?
Техника 'ANeg' - пассивка, которая заменяет способность на другую, с улучшенными характеристиками (в характеристиках указано несколько полей-слотов. Сколько слотов, столько и способностей, которые будут заменены. Максимум 4 абилки могут быть усовершенствованы. в одном слоте можно указать две абилки: первая эта та, которую хотят заменить, вторая эта та, которой заменяют. Вторая абилка, как правило, имеет улучшенные характеристики (например: больше урона, меньше перезарядки, меньше расхода маны и др). Также увеличивает силу атаки и скорость перемещения
Факты:
КД можно изменить, снизить. Делаешь два бурана. У одного перезарядка: 30 секунд, у другого 10 секунд. Если запустить кулдаун первой абилки, и потом сразу же дать технику, то абилка заменяется на вторую. Но кулдаун в 30 секунд не сбрасывает. После перезарядки у вас будет меньше кулдауна - 10 секунд.
Раньше думал, что техника сбрасывает кд у абил с разными ID (например, буран и огненный столб - это две разные абилки, и разные ID). Так как абилы с одинаковым ID имеют общую перезарядку. На деле, после смены кд остается висеть на второй абилке. Пробовал активную способность с запущенным кд заменить на пассивку, в результате получал пассивку с кд. Что если использовать безумие + техника = пассивка с кд. безумие не сбивает приказы.
Если менять с пасивки на активку, то невозможно запустить активную способность. Она будто бы превратилась в пассивку, не кликается.
Если дать скилл "Техника" обычному юниту (не герою), то будет фатал...
Предупреждение: данная способность очень нестабильная и на нее влияет практически все, так что прежде чем говорить что я не прав, самостоятельно попробуйте разные варианты.
1)Если стандартная способность на основе "Канал" - то заменить можно только на канал, но при этом стартовая способность может быть например без цели, а новая как угодно настроенная.
2)Если заставить героя выучить пустышки и давать ему разные "Техники" то мы будем менять способности героя без потери кд, но кд и id приказа у этих способностей будет равно кд и id пустышки, у "Канала" немного по другому: id приказа берется не пустышки, а первой заменной способности , то есть у юнита был канал с id приказа "громовая поступь" мы заменили на "волну силы" и дальше везде будет волна силы.
3)Также с помощью "техники" возможно делать поочередную смену моделей героя: допустим у героя есть "перевоплощение" без времени действия и произношения, то мы можем превратить юнита A в юнита B и заменить техникой способность где, юнит B меняется на юнита C, при следующем юзе мы даем способность где, C меняем на A. И мы получаем трансформ с 3 последовательно меняющимися моделями, но ведь 3 это не предел, так можно менять хоть 6, хоть 10. Вся фишка в том, нужно указать в перевоплощений нормальную форму - ту, в которую хотите превратиться
4)Технику нельзя добавлять обычным юнитам, т.е только героям. (с) quq_CCCP
5)Если вы химичите со стандартными способностями, очень важную роль играет, что вы выучите первым, сам скил или технику
6)Если первая техника превращает скил в пассивку, то все следующие замененые скилы будут пассивными (например был скил "Волна силы" активный после замены, стал пассивный и любой другой который мы заменяем).
7)С помощью техники можно менять спелбуки.
Неудачи:
1)Попытка менять способность "Темный", с помощью "техники" провалилась.
Я понимаю, что тут очень мало информации, но это пока все, что я успел обнаружить. Vadik29
» WarCraft 3 / Как дать способности перезарядку?
на графическом уровне можно визуализировать кулдаун, там кадры сменяются.
Ред. MpW
» WarCraft 3 / Нативки
Ред. MpW
» WarCraft 3 / Нативки
или тут
Ред. MpW
» WarCraft 3 / Нативки
пример
Ред. MpW
» WarCraft 3 / Убрать с панели или скрыть.
кнопки приказов (атака 'Aatk', стоп 'Astp', патруль 'Apat, двигать 'Amov', удерживать Ahld', точка сбора 'ARal', изучить навыки 'AHer')? Их можно скрыть. Там в рефордже есть два способа: заблочить абилу у самого игрока, спрятать (hide) абилу у самого юнита. Можно еще попробовать удалить (может привести к ущербу. помню в старом варе удалив абилку Amov, он перестал фактически двигаться. Или совсем фаталило. Надеюсь в рефорджете все в норм). А еще можно задать положение x,y абилам
а если вам нужно просто панель убрать, то кнопки можно скрыть.
Ред. MpW
» WarCraft 3 / Положение спрайта на мини-карте