Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Алгоритм
Версия Warcraft:
131+
Невероятно дикий костыль, который позволяет узнать - "а сколько же зелёных бонусов атаки у нашего юнита?"
function GetUnitGreenAttackBonus(hero)
		local bonus=0
		if IsUnitSelected(hero,GetOwningPlayer(hero)) then
			local frame=BlzGetFrameByName("InfoPanelIconValue",0)
			local text=BlzFrameGetText(frame) 
			if string.len(text)>=15 then
				bonus =  text:sub(text:find("|C")+10,-3)
			end
			bonus=tonumber(bonus)
		end
		return bonus
end
Зачем это нужно
Если есть скажем адекватный Бонус_Мод ? и функция GetUnitBonus. Бонус мод очень громоздкий, имеет лёгкий импорт только на новые карты, требует работу с РО, и так же полную кастомизацию всех бонусов в игре, для адекватной работы, а это нам не подходит.
А где это применяется
Ну как же где? всё в том же рефордже, есть функция для получения белого урона
BlzGetUnitBaseDamage(hero,0) -- юнит, индекс атаки
И мы сделали способность, которая наносит урон от силы атаки, (да теперь не обязательно наносить урон способностями от основных атрибутов героя). И нам для полного функционала не хватает зелёного урона, иначе способность не бафается свитком зверя или когтями атаки.. И вот приходит на помощь наша новая функция GetUnitGreenAttackBonus
Которую мы приплюсуем к нашему обычному урон, примерно это будет выглядеть вот так:
local damage=BlzGetUnitBaseDamage(hero,0)+data.HeroGreenDamage
ограничения при использовании:
К сожалению очень много нюансов и тонкостей в работе
  1. Как видите в коде выше я написал data.HeroGreenDamage скажем это отдельная ячейка в таблице луа или в хештаблице, где храниться значение о зелёной атаке. Ибо основное требование это ВЫБОР ЮНИТА.
Но можно написать и проще
local damage=BlzGetUnitBaseDamage(hero,0)+GetUnitGreenAttackBonus(hero)
Но тут надо всё таки прерваться и рассказать про...

Принцип работы

Чтобы получить зелёную атаку, нужно считать её из фрейма текущего выделенного юнита и занести в таблицу, а ещё нужно это значение очень часто обновлять, чтобы иметь актуальные данные. Но можно считывать и единожды, например при касте способности, продолжаем
ограничения при использовании:
  1. Юнит должен быть выбран и только один (выделение 2х и более скрывает фрейм и мы не видим нашу атаку)
  2. Будет нормально работать только в узких кругах (арены, мобы, рпг, PeonRpg, и прочие игры где не нужно управлять более чем 1 героем)
  3. Можно абузить, как в плюс так и себе во вред, снимая выделение, своего юнита, и игра будет помнить последний бонус. (только как вы будете активировать способности тогда?), и то если активировано запоминание
  4. Функция Get возможна, но она требует ещё более диких костылей, я попробовал, но как-то не пошло
  5. Мало тетировалось
Плюсы работы
  1. Та самая недостающая функция
  2. Можно тоже самое сделать и для брони, если будет нужно - я добавлю
  3. Сочетается с любыми системами бонусного урона, как с бонус модом так и с дефолт бонусами
  4. Работает как с зелёным так и с красным уроном
  5. Нет ограничений на размер бонуса
  6. Прекрасно работает в мультиплеере и не требует дополнительной синхронизации (спс Doc)

Благодарности

prog и pro100master
Если есть ещё нюансы, которые я упустил, обязательно пишите о них
`
ОЖИДАНИЕ РЕКЛАМЫ...
29
Десинкнет в мультиплеере без дополнительной синхронизации
33
Doc, проверял, не десинхает, специально же хотел это добавить, как плюс, спасибо
22
Doc, а почему фрейм должен десинхать? Он локальный
29
Поэтому и должен? Ты эту зеленую цифру используешь в любом вычислении, но т.к. юнит выделен только у одного игрока то числа у игроков будут разные. От вызова функции конечно же ничего не десинканет, десинканет использование ее результата. Если оно не десинкает так это потому что вы коряво проверяли...
33
Doc, ну достаточно проверяли, если юнит не выбран, то используется либо число из буфера, либо 0

Как проверял: дал юниту 1000 зелёной атаки, и нанёс урон способностью использующей зелёную атаку, у красного игрока был выбран герой с этой атакой, у синего игрока был выбран пеон, и пеон умер без десинха, вывод?
Если бы нужна была синхронизация, тогда бы на клиенте синего игрока пеон получил 0 урона, и на красном 1000, у красного умер, у синего живой, вывод?

Я не против засинхать, функция есть и проблем нет, но почему тогда работает?
38
Так кешируй его при выделении юнита каждый раз и можно будет получать в любой момент

Doc, фокус разве не синхронен сам по себе? Он же в реплеи пишется и в спектаторы передается
21
А насильно выбирать юнита перед подсчетом пробовали? Запоминаем предыдущее выделение, выбираем нашу цель, считываем, возвращаем старое выделение.
15
А насильно выбирать юнита перед подсчетом пробовали?
  • Выделение не происходит мгновенно по вызову функции.
  • Придется почистить выделение всех юнитов у текущего игрока, поскольку при выделении нескольких фрейм урона не рисуется.
29
ScorpioT1000:
Так кешируй его при выделении юнита каждый раз и можно будет получать в любой момент

Doc, фокус разве не синхронен сам по себе? Он же в реплеи пишется и в спектаторы передается
Селекшн синхронен, все так. У всех игроков кондишн пройдет, но инфа с фрейма то будет разная.
Почему могло сработать: наивно тестировали например, выделили юнита с зеленой атакой у нескольких игроков, а затем выделение сняли у всех кроме овнера, в итоге зеленое число в интерфейсе осталось, но скрылось. Правильный тест: сделать нескольких юнитов с зеленой атакой и у остальных игроков выделить именно его.
22
Doc, ну это правда что фрейм не создан для вычисление
То есть
1 игрок выделил юнит +15 атака зеленый
А у 2 игрока будет 0 урон от функции
Наносить урон 15 или 0 у разных игроков
Ты этот имел виду?

И на помощь прилёт синхронизации кода

Сихрн делать чтобы все игроки получили урон 15 от красного игрока который выделили
33
Я вчера ещё раз проверил никаких проблем нет, дополнительный синх не нужен, и я за синего вообще ни разу не выделял красного и не прокликивал его а атаку, и не мог бы прокликать, ибо оно записывается, только если игрок выбрал своего юнита
38
Кто-то говорил, что фреймы тоже синкаются как-то, может из-за этого. Возможно, там лейзи стнк какой-то
22
ScorpioT1000, синхает когда создается фрейм на всех =) а имитация локально текст позиция, перетаскивание фрейм предмета, курсор тоже фрейм и так далее....

то есть нельз создать фрейм только для красного а остальные не создали это нарушает а если все одинаково создать и показывать у каждые свои тексты так правильно
38
pro100master, да я понимаю, но речь о синке как у спектаторов
Чтобы оставить комментарий, пожалуйста, войдите на сайт.