Добавлен , опубликован
Способ реализации:
Lua
Версия Warcraft:
Невероятно дикий костыль, который позволяет узнать - "а сколько же зелёных бонусов атаки у нашего юнита?"
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
ScorpioT1000:
Так кешируй его при выделении юнита каждый раз и можно будет получать в любой момент

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

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

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

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