Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Наработка
Версия Warcraft:
Reforged
Рекомендуется использовать доработанную версию.
Наработка, позволяющая изменять бонусные характеристики юнита в диапазоне +-4096. По сути является BonusMod переписанной на lua.
Типы праметров:
  • 1 Сила
  • 2 Ловкость
  • 3 Интеллект
  • 4 Урон
  • 5 Броня
  • 6 Регенерация здоровья
  • 7 Регенерация маны
  • 8 Модификатор видимости
Список функций
---@param target unit
---@param mod integer
function UnitClearBonus (target, mod) end

---@param target unit
---@param mod integer
---@param ammount integer
---@return boolean
function UnitSetBonus (target, mod, ammount) end

---@param target unit
---@param mod integer
---@return integer
function UnitGetBonus (target, mod) end

---@param target unit
---@param mod integer
---@param ammount integer
---@return boolean
function UnitAddBonus (target, mod, ammount) end
Перенос в свою карту
Способности
  • Все нестандартные способности. Их много, но простого способа переноса я пока не нашёл.
Триггеры
  • BonusMod
Код
do
	local POWERS   = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 }
	local MAX, MIN = POWERS[#POWERS], -POWERS[#POWERS]
	
	local ABILITY  = {
		--STR: 1 [1-13]
		FourCC('ZxF0'), -- +1
		FourCC('ZxF1'), -- +2
		FourCC('ZxF2'), -- +4
		FourCC('ZxF3'), -- +8
		FourCC('ZxF4'), -- +16
		FourCC('ZxF5'), -- +32
		FourCC('ZxF6'), -- +64
		FourCC('ZxF7'), -- +128
		FourCC('ZxF8'), -- +256
		FourCC('ZxF9'), -- +512
		FourCC('ZxFa'), -- +1024
		FourCC('ZxFb'), -- +2048
		FourCC('ZxFc'), -- -4096
		-- AGI 2 [14-26]
		FourCC('ZxG0'), -- +1
		FourCC('ZxG1'), -- +2
		FourCC('ZxG2'), -- +4
		FourCC('ZxG3'), -- +8
		FourCC('ZxG4'), -- +16
		FourCC('ZxG5'), -- +32
		FourCC('ZxG6'), -- +64
		FourCC('ZxG7'), -- +128
		FourCC('ZxG8'), -- +256
		FourCC('ZxG9'), -- +512
		FourCC('ZxGa'), -- +1024
		FourCC('ZxGb'), -- +2048
		FourCC('ZxGc'), -- -4096
		-- INT 3 [27-39]
		FourCC('ZxH0'), -- +1
		FourCC('ZxH1'), -- +2
		FourCC('ZxH2'), -- +4
		FourCC('ZxH3'), -- +8
		FourCC('ZxH4'), -- +16
		FourCC('ZxH5'), -- +32
		FourCC('ZxH6'), -- +64
		FourCC('ZxH7'), -- +128
		FourCC('ZxH8'), -- +256
		FourCC('ZxH9'), -- +512
		FourCC('ZxHa'), -- +1024
		FourCC('ZxHb'), -- +2048
		FourCC('ZxHc'), -- -4096
		-- DAMAGE 4 [40-52]
		FourCC('ZxB0'), -- +1
		FourCC('ZxB1'), -- +2
		FourCC('ZxB2'), -- +4
		FourCC('ZxB3'), -- +8
		FourCC('ZxB4'), -- +16
		FourCC('ZxB5'), -- +32
		FourCC('ZxB6'), -- +64
		FourCC('ZxB7'), -- +128
		FourCC('ZxB8'), -- +256
		FourCC('ZxB9'), -- +512
		FourCC('ZxBa'), -- +1024
		FourCC('ZxBb'), -- +2048
		FourCC('ZxBc'), -- -4096
		-- ARMOR 5 [53-65]
		FourCC('ZxA0'), -- +1
		FourCC('ZxA1'), -- +2
		FourCC('ZxA2'), -- +4
		FourCC('ZxA3'), -- +8
		FourCC('ZxA4'), -- +16
		FourCC('ZxA5'), -- +32
		FourCC('ZxA6'), -- +64
		FourCC('ZxA7'), -- +128
		FourCC('ZxA8'), -- +256
		FourCC('ZxA9'), -- +512
		FourCC('ZxAa'), -- +1024
		FourCC('ZxAb'), -- +2048
		FourCC('ZxAc'), -- -4096
		-- HP 6 [66-78]
		FourCC('ZxE0'), -- +1
		FourCC('ZxE1'), -- +2
		FourCC('ZxE2'), -- +4
		FourCC('ZxE3'), -- +8
		FourCC('ZxE4'), -- +16
		FourCC('ZxE5'), -- +32
		FourCC('ZxE6'), -- +64
		FourCC('ZxE7'), -- +128
		FourCC('ZxE8'), -- +256
		FourCC('ZxE9'), -- +512
		FourCC('ZxEa'), -- +1024
		FourCC('ZxEb'), -- +2048
		FourCC('ZxEc'), -- -4096
		-- MP 7 [79-91]
		FourCC('ZxC0'), -- +1
		FourCC('ZxC1'), -- +2
		FourCC('ZxC2'), -- +4
		FourCC('ZxC3'), -- +8
		FourCC('ZxC4'), -- +16
		FourCC('ZxC5'), -- +32
		FourCC('ZxC6'), -- +64
		FourCC('ZxC7'), -- +128
		FourCC('ZxC8'), -- +256
		FourCC('ZxC9'), -- +512
		FourCC('ZxCa'), -- +1024
		FourCC('ZxCb'), -- +2048
		FourCC('ZxCc'), -- -4096
		-- SIGHT 8 [92-104]
		FourCC('ZxC0'), -- +1
		FourCC('ZxC1'), -- +2
		FourCC('ZxC2'), -- +4
		FourCC('ZxC3'), -- +8
		FourCC('ZxC4'), -- +16
		FourCC('ZxC5'), -- +32
		FourCC('ZxC6'), -- +64
		FourCC('ZxC7'), -- +128
		FourCC('ZxC8'), -- +256
		FourCC('ZxC9'), -- +512
		FourCC('ZxCa'), -- +1024
		FourCC('ZxCb'), -- +2048
		FourCC('ZxCc') -- -4096
	}
	local TYPES    = #ABILITY / #POWERS
	
	---@param target unit
	---@param mod integer
	function UnitClearBonus (target, mod)
		if type(mod) ~= 'number' or mod < 1 or mod >= TYPES then
			return print('UnitGetBonus: Invalid mod', mod)
		end
		
		for i = 1, #POWERS do
			UnitRemoveAbility(target, ABILITY[(mod - 1) * #POWERS + i])
		end
	end
	
	---@param target unit
	---@param mod integer
	---@param ammount integer
	---@return boolean
	function UnitSetBonus (target, mod, ammount)
		if type(mod) ~= 'number' or mod < 1 or mod >= TYPES then
			print('UnitSetBonus: Invalid mod', mod)
			return false
		elseif type(ammount) ~= 'number' or ammount < MIN or ammount > MAX then
			print('UnitSetBonus: Bonus too high or low', ammount)
			return false
		end
		
		local ability = ABILITY[(mod - 1) * #POWERS + #POWERS]
		if ammount < 0 then
			ammount = MAX + ammount
			UnitAddAbility(target, ability)
			UnitMakeAbilityPermanent(target, true, ability)
		else
			UnitRemoveAbility(target, ability)
		end
		
		for i = #POWERS - 1, 1, -1 do
			ability = ABILITY[(mod - 1) * #POWERS + i]
			if ammount >= POWERS[i] then
				UnitAddAbility(target, ability)
				UnitMakeAbilityPermanent(target, true, ability)
				ammount = ammount - POWERS[i]
			else
				UnitRemoveAbility(target, ability)
			end
		end
		
		return true
	end
	
	---@param target unit
	---@param mod integer
	---@return integer
	function UnitGetBonus (target, mod)
		local ammount = 0
		
		if type(mod) ~= 'number' or mod < 1 or mod >= TYPES then
			return print('UnitGetBonus: Invalid mod', mod)
		end
		
		if GetUnitAbilityLevel(target, ABILITY[(mod - 1) * #POWERS + #POWERS]) > 0 then
			ammount = MIN
		end
		
		for i = 1, #POWERS do
			if GetUnitAbilityLevel(target, ABILITY[(mod - 1) * #POWERS + i]) > 0 then
				ammount = ammount + POWERS[i]
			end
		end
		
		return ammount
	end
	
	---@param target unit
	---@param mod integer
	---@param ammount integer
	---@return boolean
	function UnitAddBonus (target, mod, ammount)
		return UnitSetBonus(target, mod, UnitGetBonus(target, mod) + ammount)
	end
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
5
5 лет назад
1
Этот мод конечно неплохой,но все же хочется сделать мод на подобии "захват юнита"
ТОесть ты выбрал вражеского юнита,прописал команду и он перешел перед твое командование,
Сделать разоединение союза - тоесть например -unally 4-8 тоесть если написать то эти игроки не будут в союзе
Просто хочется более "фановых" модов
НО!Впринципе этот мод очень хороший,ничего не имею против,каким-нибудь могущественным картоделам может эта идея понравится,если захотите можете её воплотить,думаю будет реально забавно (пусть эти моды и ломают механику,но чисто поугарать над фигней в соло режимах всё же хочется)
0
32
5 лет назад
0
Ахахах, Krabs, как бы тебе объяснить так по культурней, что это не тот мод о котором подумал ты... это проста наработка дающая определённый функционал (написано выше), а бонус мод - оригинальной название с хайва ( и тут имеется в виду МОД - изменение(модификейшен) бонусного атрибута).
А то что написал ты, моды да, но они достаточно простые и делаются на гуи и не достойны какой либо отдельной наработки, (хотя чую NazarPunk уже пошёл делать)
2
29
5 лет назад
2
хотя чую NazarPunk уже пошёл делать
Так делал уже, нужно только подпилить напильником под свои нужды))
0
11
4 года назад
0
NazarPunk, я так понимаю что других вариантов реализовать подобное не появилось?

NazarPunk, пробовал сменить характеристики способности, но не хочет их менять (
0
27
4 года назад
Отредактирован MpW
0
wetalq, NazarPunk уже давно не было на xgm
0
23
4 года назад
0
но зачем он? Если у варкрафт и так есть нативки на все нужные параметры =)

логика хм!
1
32
4 года назад
Отредактирован Берги
1
но зачем он? Если у варкрафт и так есть нативки на все нужные параметры =)
так как по прежнему не работают нативки на смену характеристик способностей, и то что тут ошибка есть, является доказательством, что никто не использует эту систему и все попорежденму ковыряют РО, создавая кучу абил на все случаи жизни
Так вот, что за ошибка?
А конкретно неработоспособность 8 Мода - Радиуса видимости
		if type(mod) ~= 'number' or mod < 1 or mod >= TYPES then
			return print('UnitGetBonus: Invalid mod', mod)
		end
mod >= TYPES условие не обрабатывает 8 мод надо либо тут сделать mod > TYPES
либо вместо
local TYPES    = #ABILITY / #POWERS
поставить
local TYPES    = 1+(#ABILITY / #POWERS)
Я это обнаружил при попытке добавления 9 мода - скорости атаки
0
27
2 года назад
Отредактирован MpW
0
мне кажется мана реген неправильна работает. или совсем не работает. используете абилку маски соби
раскрыть
MANA_REGEN_SobiMask =((base_mana_regen + mana_regen_Intellect + другие бонусы типа чародейской ауры)*p) - реген от одной абилки. Если вообще нет никакого регена (реген != 0, главное чтоб был хотя бы один реген), то не будет работать реген и от маски. теперь даже отрицательный реген может получится, если указано отрицательное значение коэффициента. ВНИМАНИЕ: в этой формуле MANA_REGEN_SobiMask не учитывается реген от других соби масок, если у героя их несколько. Учитывают базовый реген, реген от инты +другие регены
MANA_REGEN_Common = mana_regen_Intellect + MANA_REGEN_SobiMask + другие бонусы типа чародейской ауры - общий реген (так как у героя работает только реген от инты и от других бонусов, а вот базовый реген не учитывается. Так как базовый реген не работает на герое)
MANA_REGEN_Common = mana_regen_Intellect + MANA_REGEN_SobiMask1 + MANA_REGEN_SobiMask2 + другие бонусы типа чародейской ауры - общий реген ((если абилок от маски соби несколько, они суммируются вот так)
Какие бонусы есть в игре? Это пассивки (чародейская аура, аура фонтана, маска соби не учитывается), активных заклинании с постепенным восстановлением не много (рев, леденящий крик, омоложение не учитывается,
base_mana_regen - базовый реген, который указан в РО юнита "Характеристики - Восстановление маны". Работает только у обычных юнитов, тестировал этот момент у героя. У героя показывает реген от интеллекта (базовый не работает у героя), но когда он одевает маску соби учитывается базовый реген. Благодаря базовому регену, можно сделать героя с уникальным регеном.
mana_regen_Intellect = Intellect * k - реген от интеллекта (где Intellect - кол-во интеллекта героя, k - константа "Характеристики героя: увеличение скорости восстановления за единицу разума", которая за каждую единицу маны восстанавливает заданное число)
p - процент от абилки

какие параметры не ввожу для регена маны, реакции никакой

найдена ошибка
заменить
		-- MP 7 [79-91]
		FourCC('ZxC0'), -- +1
		FourCC('ZxC1'), -- +2
		FourCC('ZxC2'), -- +4
		FourCC('ZxC3'), -- +8
		FourCC('ZxC4'), -- +16
		FourCC('ZxC5'), -- +32
		FourCC('ZxC6'), -- +64
		FourCC('ZxC7'), -- +128
		FourCC('ZxC8'), -- +256
		FourCC('ZxC9'), -- +512
		FourCC('ZxCa'), -- +1024
		FourCC('ZxCb'), -- +2048
		FourCC('ZxCc'), -- -4096
на это
	-- regen MP 7 [79-91]
	FourCC('ZxD0'), -- +1
	FourCC('ZxD1'), -- +2
	FourCC('ZxD2'), -- +4
	FourCC('ZxD3'), -- +8
	FourCC('ZxD4'), -- +16
	FourCC('ZxD5'), -- +32
	FourCC('ZxD6'), -- +64
	FourCC('ZxD7'), -- +128
	FourCC('ZxD8'), -- +256
	FourCC('ZxD9'), -- +512
	FourCC('ZxDa'), -- +1024
	FourCC('ZxDb'), -- +2048
	FourCC('ZxDc'), -- -4096
0
27
2 года назад
Отредактирован MpW
0
большая часть филдов рефорджете не работает. работают только геты (get), с них что-то да можно получить. А сеты (set) могут не работать, работают только set на хп/мана реген, армор, и у некоторых атрибутов героя. Нельзя видимо просто изменить поле
рабочие нативки (не все тут)
--[[ нативки рефорджета

--защита (работает норм).
native BlzGetUnitArmor takes unit whichUnit returns real --считывает базовый+бонус
native BlzSetUnitArmor takes unit whichUnit, real armorAmount returns nothing

native BlzGetUnitBaseDamage takes unit whichUnit, integer weaponIndex returns integer
native BlzGetUnitDiceNumber takes unit whichUnit, integer weaponIndex returns integer
native BlzGetUnitDiceSides takes unit whichUnit, integer weaponIndex returns integer
native BlzSetUnitBaseDamage takes unit whichUnit, integer baseDamage, integer weaponIndex returns nothing
native BlzSetUnitDiceNumber takes unit whichUnit, integer diceNumber, integer weaponIndex returns nothing
native BlzSetUnitDiceSides takes unit whichUnit, integer diceSides, integer weaponIndex returns nothing

native BlzGetUnitAttackCooldown takes unit whichUnit, integer weaponIndex returns real
native BlzSetUnitAttackCooldown takes unit whichUnit, real cooldown, integer weaponIndex returns nothing

native BlzGetUnitMaxHP takes unit whichUnit returns integer
native BlzSetUnitMaxHP takes unit whichUnit, integer hp returns nothing

native BlzGetUnitMaxMana takes unit whichUnit returns integer
native BlzSetUnitMaxMana takes unit whichUnit, integer mana returns nothing

native BlzUnitHideAbility takes unit whichUnit, integer abilId, boolean flag returns nothing

native BlzGetUnitAbilityManaCost takes unit whichUnit, integer abilId, integer level returns integer
native BlzSetUnitAbilityManaCost takes unit whichUnit, integer abilId, integer level, integer manaCost returns nothing

native BlzGetUnitAbilityCooldown takes unit whichUnit, integer abilId, integer level returns real
native BlzGetUnitAbilityCooldownRemaining takes unit whichUnit, integer abilId returns real
native BlzSetUnitAbilityCooldown takes unit whichUnit, integer abilId, integer level, real cooldown returns nothing

native BlzUnitHideAbility takes unit whichUnit, integer abilId, boolean flag returns nothing
native BlzUnitDisableAbility takes unit whichUnit, integer abilId, boolean flag, boolean hideUI returns nothing


BlzGetUnitRealField(GetTriggerUnit(), UNIT_RF_CAST_BACK_SWING)
BlzGetUnitRealField(GetTriggerUnit(), UNIT_RF_CAST_POINT)

]]
добавление функции
do
	local InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()

        function GetUnitDefenseType(unit)
            return BlzGetUnitIntegerField(unit, UNIT_IF_DEFENSE_TYPE)
        end
        function GetUnitAttackType(unit,index)
            return BlzGetUnitWeaponIntegerField(unit, UNIT_WEAPON_IF_ATTACK_ATTACK_TYPE, index)
        end
        function GetUnitAcquisitionRange(unit)
            return BlzGetUnitRealField(unit, UNIT_RF_ACQUISITION_RANGE)
        end
        function GetUnitSightRadius(unit)
            return BlzGetUnitRealField(unit, UNIT_RF_SIGHT_RADIUS)
        end
        
        
        function IsAttackUnitEnabled(unit,index)
            return BlzGetUnitWeaponBooleanField(unit, UNIT_WEAPON_BF_ATTACKS_ENABLED,index)
        end
        

        --общие параметры атрибутов: базовый+бонус (бонус можно исключить)
        function GetHeroAttributeStr(hero, includeBonuses)
            return GetHeroStr(hero, includeBonuses)
        end
        function GetHeroAttributeAgi(hero, includeBonuses)
            return GetHeroAgi(hero, includeBonuses)
        end
        function GetHeroAttributeInt(hero, includeBonuses)
            return GetHeroInt(hero, includeBonuses)
        end
        
        --базовые атрибуты героя
        function GetHeroStr_base(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_STRENGTH)
        end
        function GetHeroAgi_base(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_AGILITY)
        end
        function GetHeroInt_base(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_INTELLIGENCE)
        end
        --бонусные атрибуты героя
        function GetHeroStr_bonus(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_STRENGTH_WITH_BONUS)-GetHeroStr_base(hero)
        end
        function GetHeroAgi_bonus(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_AGILITY_WITH_BONUS)-GetHeroAgi_base(hero)
        end
        function GetHeroInt_bonus(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_INTELLIGENCE_WITH_BONUS)-GetHeroInt_base(hero)
        end
        
        --установить базовые (белые) атрибуты героя
        function SetHeroBaseStr(hero, value)
            SetHeroStr(hero, value, true)
        end
        function SetHeroBaseAgi(hero, value)
            SetHeroAgi(hero, value, true)
        end
        function SetHeroBaseInt(hero, value)
            SetHeroInt(hero, value, true)
        end
        --установить бонусные (зеленые) атрибуты героя
        function SetHeroBonusStr(hero, value)
            UnitClearBonus (hero, 1)
            UnitSetBonus (hero, 1, value)
        end
        function SetHeroBonusAgi(hero, value)
            UnitClearBonus (hero, 2)
            UnitSetBonus (hero, 2, value)
        end
        function SetHeroBonusInt(hero, value)
            UnitClearBonus (hero, 3)
            UnitSetBonus (hero, 3, value)
        end
        --добавить бонусные (зеленые) атрибуты героя
        function AddHeroBonusStr(hero, value)
            UnitAddBonus (target, 1, ammount)
        end
        function AddHeroBonusAgi(hero, value)
            UnitAddBonus (target, 2, ammount)
        end
        function AddHeroBonusInt(hero, value)
            UnitAddBonus (target, 3, ammount)
        end
        
        --основной атрибут героя (1-str, 3-agi, 2-int). влияет на атаку
        function GetHeroPrimaryAttribute(hero)
            return BlzGetUnitIntegerField(hero, UNIT_IF_PRIMARY_ATTRIBUTE)
        end
        function SetHeroPrimaryAttribute(hero, value) --установка не работает
            BlzSetUnitIntegerField( hero, UNIT_IF_PRIMARY_ATTRIBUTE, value)
        end
        

        function GetHeroStrPerLevel(hero) 
            return BlzGetUnitRealField(hero, UNIT_RF_STRENGTH_PER_LEVEL)
        end
        function GetHeroAgiPerLevel(hero) 
            return BlzGetUnitRealField(hero, UNIT_RF_AGILITY_PER_LEVEL)
        end
        function GetHeroIntPerLevel(hero) 
            return BlzGetUnitRealField(hero, UNIT_RF_INTELLIGENCE_PER_LEVEL)
        end

        --base regen hp/sec
        function GetUnitBaseRegenHP(unit)
            return BlzGetUnitRealField(unit, UNIT_RF_HIT_POINTS_REGENERATION_RATE)
        end
        function SetUnitBaseRegenHP(unit, value) 
            BlzSetUnitRealFieldBJ( unit, UNIT_RF_HIT_POINTS_REGENERATION_RATE, value )
        end
        --base regen mana/sec
        function GetUnitBaseRegenMana(unit)
            return BlzGetUnitRealField(unit, UNIT_RF_MANA_REGENERATION)
        end
        function SetUnitBaseRegenMana(unit, value)
            return BlzSetUnitRealField( unit, UNIT_RF_MANA_REGENERATION, value )
        end
        --bonus regen hp/sec
        function GetUnitBonusRegenHP(unit)
            return UnitGetBonus (unit, 6)
        end
        --bonus % увеличение mana regen от base regen
        function GetUnitBonusRegenMana(unit)
            return UnitGetBonus (unit, 7)
        end
        
        function SetUnitHP(unit,value)
            SetUnitState(unit, UNIT_STATE_LIFE, RMaxBJ(0,value))
        end
        function SetUnitMana(unit,value)
            SetUnitState(unit, UNIT_STATE_MANA, RMaxBJ(0,value))
        end
        
        function GetUnitBaseAttackSpeed(unit)
            if IsUnitType(unit, UNIT_TYPE_HERO) then
                return 1.00 + (GetHeroAttributeAgi(unit, false)/100)
            else
                return 1.00
            end
        end
        
        function GetUnitBonusAttackSpeed(unit)
            return UnitGetBonus (unit, 9)
        end
        
        function GetUnitAttackSpeed(unit, includeBonuses)
            if not includeBonuses then
                return GetUnitBaseAttackSpeed(unit) + GetUnitBonusAttackSpeed(unit)
            else
                return GetUnitBaseAttackSpeed(unit)
            end
        end
        
        function GetUnitBonusArmor(unit)
            return UnitGetBonus (unit, 5)
        end
        function GetUnitBaseArmor(unit)
            return BlzGetUnitArmor(unit)-GetUnitBonusArmor(unit)
        end
        
        
        
        

        TimerStart(CreateTimer(),0.5,true,function()
            print("основной атрибут: "..GetHeroPrimaryAttribute(HERO))
            
            --print("FFF str: "..GetHeroAttributeStr(HERO, true))
            --print("base str: "..GetHeroStr_base(HERO))
            --print("permament str: "..GetHeroStr_permament(HERO))
            --print("bonus str: "..GetHeroStr_bonus(HERO))
            
            --print("BaseRegenHP: "..GetUnitBaseRegenHP(HERO).." hp/sec")
            --print("BonusRegenHP: "..GetUnitBonusRegenHP(HERO).." hp/sec")
            --print("BaseRegenMana: "..GetUnitBaseRegenMana(HERO).." mana/sec")
            --print("BonusRegenMana: "..GetUnitBonusRegenMana(HERO)/100..." % от регена")
        end)
        
        local t = CreateTrigger()
        TriggerRegisterPlayerChatEvent( t, Player(0), "-change ", false )
        TriggerAddAction( t, function()
            local k = S2I(SubStringBJ(GetEventPlayerChatString(),9, StringLength(GetEventPlayerChatString())))
            
            print(k)
            --SetUnitBaseRegenHP(HERO, k)
            --SetUnitBaseRegenMana(HERO, k)
            
            --SetHeroBaseStr(HERO, GetHeroStr_base(HERO)+k, true)
            --SetHeroAgi_bonus(HERO, k)
            
            --SetHeroPrimaryAttribute(HERO, k)
            
            print("end")
        end)
        

        
        
end
end
0
27
2 года назад
Отредактирован MpW
0
функция UnitGetBonus может работать неправильно.
добавил в нее 9-ую модификацию - attack speed. кучу абил перчаток наплодил с разными параметрами со степенями двойки. ниче не менял, тока дополнил таблицы данными. так, то система работает. изучил как работает AS до дыр. В нее добавил ограничение от -80% до 400%.
вот пример:
было AS 0%
добавляю 5555, стало AS 400%
вычитаю -777, стало AS 4016%. должно быть -80%, тк в лимит упирается. откуда взялось 4016? так понимаю 4096-4016= -80 -короче че то не так. почему так работает странно. от чего работает. возможен баг, информацию не всегда верно выдает
пробую еще раз: к этому 4019 вычитаю -66, стало 400% - херня странно работает. должно отриц значение.
Решение: информацию о разных бонусах проще хранить в глобалках. До этого работает с ошибками, после внесения инфы в таблицы - не замечено.

гайд про скорость
Скорость атаки - это показатель ударов в секунду, или как часто взмахивает оружием ваш герой. Скорость атаки зависит от ловкости, аур, артефактов, скилов. Чем быстрее скорость атаки тем больше урона в определенное время наносит урона герой.
Для вывода формулы будут использованы некоторые понятия:
AS - attack speed - Скорость атаки, кол-во ударов в сек
BAS - basic attack speed - Базовая скорость атаки, кол-во ударов в сек
IAS - increase attack speed дополнительный процент. Складывается из ловкости героя и бонусов скорости атаки. Не может быть выше 400 или ниже -80. Изначально скорость не измерялась в процентах, но так пошло в варкрафте. Понижение и увеличение скорости осуществляется с помощью модификаторов-способностей. А еще дополнительно от ловкости через константы. Изначальная скорость юнитов равно 1.00 (100%). Максимум бонусом можно задать 4.00 (400%). Это в сумме: изначальная + бонусная = 100+400 = 500%. В варкрафте в максимум упирается в в этот потолок, это 5 ударов в сек. больше никак не сделать. ниже 100% нормы - уже скорость идет на понижение. самый минимальный предел = 20%. Ниже 20% никак нельзя поставить.
Складывается из ловкости героя и бонусов скорости атаки. Не может быть выше 400 или ниже -80.
0.20 = -80% IAS <= самый минимальный результат. ниже этого нельзя поставить.
1.00 = 0% IAS <= изначальную скорость принята считать за 1.00 (100%)
2.00 = 100% IAS <= при увеличении AS на 1.00 (100%), скорость увеличилась 2.00
Delay - Базовая задержка между ударами, сек. По-другому, Delay называют базовое время атаки Base attack time, BAT. или AttackCooldown. Можно проверить таймером от замаха до замаха - это будет считаться временем. Начало замаха означает начала атаки.
Time - время задержки после добавления модификации бонусов, сек. Этот параметр добавил специально, чтобы смотреть как меняется время задержки между атаками после добавления модификаторов.
Изначально в механике игры заложен параметр задержка между ударами - Delay, а не скорость атаки.
У подавляющего большинства героев Delay равен 1.7 сек, за исключением:
Magina - The Anti-Mage (Антимаг) – 1.45 сек.
Shandelzare Silkwood - The Vengeful Spirit (Венга) – 1.77 сек.
Balanar - The Night Stalker (Сталкер) – 1.8 сек.
Terrorblade - The Soul Keeper (Террорблейд) – 1.5 сек.
Чтобы рассчитать скорость атаки - AS, нам необходимо знать BAS и IAS героя:
Чтобы вычислить базовую скорость атаки (BAS), нужно количество выстрелов (ударов) разделить на время, за которое они произведены. За основу мы берем единицу, т.е. один удар, которым совершаем атаку за определенное время. То есть мы должны 1 разделить на Delay, так как пауза между выстрелами (ударами) равна 1.7 сек., отсюда: BAS =1/Delay=1/1.7 ≈ 0.6 выстрелов в секунду. Для вышеуказанных героев с отличающимися задержками от стандартной, все рассчитывается точно так же по формуле BAS =1/Delay.
IAS - дополнительный процент – процент увеличения скорости атаки, равен сумме процентов от ловкости, артефактов, умений, наложенных заклинаний и аур.
Измеряется IAS в % и подразделяется как бы на 2е группы:
  1. IAS от ловкости. Каждая единица ловкости увеличивает IAS на 1%. (Например, у героя ловкость равна 24, тогда IAS от ловкости = 24*1%=24%). (0.01) 1% взят из констант доты. В варкрафте значение это мб другим, оно равно 0.02 за каждую ловкость
  2. IAS от артефактов, умений, наложенных заклинаний и аур. Сразу указан в % и не тр***ет дополнительных расчетов. Все IAS складываются между собой. (Например, IAS от ловкости = 30%, IAS от Power treads = 30%, следовательно, общий (суммарный) IAS (Σ IAS)) = 60%)
Получается вот такая формула подсчета скорости:
AS = BAS* (1 + Σ IAS)=1/Delay*(1 + Σ IAS)
Примеры:
Silencer с ловкостью в 20 ед., тогда:
Σ IAS = 20 * 1% = 20%,
AS = 0.6 * (1+ 20%) ≈ 0,7 выстрелов (ударов) в секунду
Time = Delay / (1+ 20%) = 1.7 / 1.2 % = 1.4 сек - задержка между ударами
Axe с Power treads и MKB, ловкость = 35, тогда:
Σ IAS = 35 * 1% + 30% + 15% = 80%,
AS = 0.6* (1+80%) ≈ 1.1 выстрел (удар) в секунду
Time = Delay / (1+80%) = 1.7 / 1.8 % = 0.94 сек - задержка между ударами
        --BAS - базовая скорость атаки, показывает кол-во ударов в сек
        --BlzGetUnitAttackCooldown - новая нативка рефорджа
		function GetUnitBaseAttackSpeed(unit, index)
            return 1/BlzGetUnitAttackCooldown(unit, index)
        end
        
        --IAS - показывает % процентное содержание AS
		--это надо переделать, тк бонус от ловкости не относится к базовой (точно не уверен)
        function GetUnitIncreaseBaseAttackSpeed(unit)
            if IsUnitType(unit, UNIT_TYPE_HERO) then
                return 1.00 + (GetHeroAttributeAgi(unit, false)*0.02) --0.02% бонуса AS за каждую единицу ловкости
            else
                return 1.00
            end
        end
        
        --bonus IAS - показывает процент AS от абилок
        --делим на 100 тк результат из BonusMod выдают в виде целых чисел
        function GetUnitIncreaseBonusAttackSpeed(unit)
            return UnitGetBonus (unit, 9) / 100 --это UnitGetBonus надо будет переделать
        end
        
        function GetUnitIncreaseAttackSpeed(unit, includeBonuses)
            if not includeBonuses then
                return GetUnitIncreaseBaseAttackSpeed(unit) + GetUnitIncreaseBonusAttackSpeed(unit)
            else
                return GetUnitIncreaseBaseAttackSpeed(unit)
            end
        end
        
        --AS выдает кол-во ударов в сек
        function GetUnitAttackSpeed(unit, index)
            return GetUnitBaseAttackSpeed(unit, index) * GetUnitIncreaseAttackSpeed(unit, false)
        end
        
        --время задержки для атаки
        function GetUnitAttackTime(unit, index)
            return GetUnitBaseAttackSpeed(unit, index) / GetUnitIncreaseAttackSpeed(unit, false)
        end
0
18
2 года назад
0
МрачныйВорон, ты решил добавить через способности степени двойки скорость атаки?
0
27
2 года назад
Отредактирован MpW
0
Vlod, ну прямой нативки в рефордже на attack speed нет. Есть лишь нативка BlzGetUnitAttackCooldown / BlzSetUnitAttackCooldown. Конечно, можно этим отследить базовую скорость, зная задержку.
ты решил добавить через способности степени двойки скорость атаки?
да. это только всего лишь бонусы. Но если использовать это, тогда все скиллы должны быть полностью кастомными, и итемы тоже.
можно вообще работать только с BAT (AttackSpeed). а бонусы просто в интерфейс через фреймы информировать зелеными циферками.
точно также с base damage, base armor.
код
native BlzGetUnitArmor takes unit whichUnit returns real --считывает базовый+бонус
native BlzSetUnitArmor takes unit whichUnit, real armorAmount returns nothing

native BlzGetUnitBaseDamage takes unit whichUnit, integer weaponIndex returns integer
native BlzGetUnitDiceNumber takes unit whichUnit, integer weaponIndex returns integer
native BlzGetUnitDiceSides takes unit whichUnit, integer weaponIndex returns integer
native BlzSetUnitBaseDamage takes unit whichUnit, integer baseDamage, integer weaponIndex returns nothing
native BlzSetUnitDiceNumber takes unit whichUnit, integer diceNumber, integer weaponIndex returns nothing
native BlzSetUnitDiceSides takes unit whichUnit, integer diceSides, integer weaponIndex returns nothing
Нет только нативок на бонусы (их можно сделать или использовать BonusMod). Бонусы можно просто отображать через фркеймы. Но это еще больше работы.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.