Урок Полезные API для ваших кастомок (30.07.2016 обновлено)

gameizeazy

Активный
10 Июн 2016
116
0
[quote author=CryDeS link=topic=1006.msg6822#msg6822 date=1478240056]
Судя по твоей догадливости и навыкам, у тебя ничего не выйдет.
Код:
function ResetAllAbilitiesCooldown(unit, refresh_items)
[/quote]
В каком смысле?
 

gameizeazy

Активный
10 Июн 2016
116
0
[quote author=CryDeS link=topic=1006.msg6822#msg6822 date=1478240056]
Судя по твоей догадливости и навыкам, у тебя ничего не выйдет.
Код:
function ResetAllAbilitiesCooldown(unit, refresh_items)
[/quote]
И твой тейбл и т.д уберал и ошибочку видел что где то там на 500 строке шото нету окончания
 

gameizeazy

Активный
10 Июн 2016
116
0
[quote author=CryDeS link=topic=1006.msg6822#msg6822 date=1478240056]
Судя по твоей догадливости и навыкам, у тебя ничего не выйдет.
Код:
function ResetAllAbilitiesCooldown(unit, refresh_items)
[/quote]
Я просто вписал эту функцию в код а уже ошибка...
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Ну так ты отыщи первое упоминание об ошибке в консоли. Затем ту строку, на которую ссылается консоль. Затем скинь весь код с указанием этой строки.
 

Pancer

Активный
30 Мар 2017
127
5
steamcommunity.com
Проект
MARVEL Heroes
Re: Полезные API для ваших кастомок (26.07.2016 обновлено)

[quote author=CryDeS link=topic=1006.msg5449#msg5449 date=1469535926]
table SaveAbilitiesCooldowns(hUnit) - сохраняет кд абилок и айтемов юнита в таблицу
Код:
function SaveAbilitiesCooldowns(unit)
  if not unit then return end
  
  local savetable = {}
  local abilities = unit:GetAbilityCount() - 1
  for i = 0, abilities do
    if unit:GetAbilityByIndex(i) then
      savetable[i] = unit:GetAbilityByIndex(i):GetCooldownTimeRemaining()
    end
  end

  savetable.items = {}

  for i = 0, 5 do
    if unit:GetItemInSlot(i) then
      savetable.items[unit:GetItemInSlot(i)] = unit:GetItemInSlot(i):GetCooldownTimeRemaining() 
    end
  end

  return savetable
end

nil SetAbilitiesCooldowns(hUnit, table) - устанавливает значение кд айтемов и абилок юнита из сохраненной таблицы.

Код:
function SetAbilitiesCooldowns(unit, settable)
  local abilities = unit:GetAbilityCount() - 1
  if not settable or not unit then return end
  for i = 0, abilities do
    if unit:GetAbilityByIndex(i) then
      unit:GetAbilityByIndex(i):StartCooldown(settable[i])
      if settable[i] == 0 then 
        unit:GetAbilityByIndex(i):EndCooldown() 
      end
    end
  end

  if settable.items then
    for item, cooldown in pairs(settable.items) do
      if item and IsValidEntity(item) then
        item:EndCooldown() 
        item:StartCooldown(cooldown) 
      end
    end
  end
end

Так как использовать кучу демедж фильтров не тру(да и они могут не работать вообще если их несколько), а лайфстил от магии сделать нужно, то я запилил такую вот штуку.
В ваш демедж фильтр
Код:
if (damagetype_const > 1 or skill_name ~= "") then
		local callback_data = {
				caster 		= attacker,
				target 		= victim, 
				skill_name 	= skill_name,
				damage 		= damage,
				damage_type = damagetype_const,
			}
		MagicLifesteal:GlobalListen(callback_data)
	end
И как отдельную библиотеку, которую подключите:
Код:
MagicLifesteal = class({})

local disabled_lifesteal_skills = {
	["necrolyte_heartstopper_aura"] = 1,
	["item_blade_mail"]				= 1,
}

function MagicLifesteal:GlobalListen( keys )
	local caster 		= keys.caster
	local target 		= keys.target
	local damage 		= keys.damage
	local skill_name 	= keys.skill_name
 
 	if disabled_lifesteal_skills[skill_name] then return end

 	if target:IsIllusion() then return end

	local lifesteal_pct = 0;
	if target == caster then return end
	if caster:HasModifier("modifier_skeleton_king_reincarnation_scepter_active") then return end
	
	if target:IsHero() then lifesteal_pct = MagicLifesteal:_GetUnitMagicLifesteal_toHero(caster) / 100
	else lifesteal_pct = MagicLifesteal:_GetUnitMagicLifesteal_toCreep(caster) / 100 end

	if lifesteal_pct == 0 then return end

	local particle_lifesteal = "particles/items3_fx/octarine_core_lifesteal.vpcf"
	local lifesteal_fx = ParticleManager:CreateParticle(particle_lifesteal, PATTACH_ABSORIGIN_FOLLOW, caster)
	ParticleManager:SetParticleControl(lifesteal_fx, 0, caster:GetAbsOrigin())

	if damage*lifesteal_pct < 1 or damage*lifesteal_pct > caster:GetHealth() or damage*lifesteal_pct > 1000000 then return end

	caster:Heal(damage*lifesteal_pct , caster)
end

function MagicLifesteal:_GetUnitMagicLifesteal_toCreep(unit)
	local total_lifesteal = 0;
	if not unit:HasInventory() then return 0 end
	
	for item_name, lifesteal_data in pairs(self.items) do
		if unit:HasItemInInventory(item_name) then
			local item = MagicLifesteal:_FindItemInInventory(unit, item_name)

			if (lifesteal_data.creep) then
				local amount = item:GetSpecialValueFor(lifesteal_data.creep)
				if amount > total_lifesteal then total_lifesteal = amount end
			end

			if(lifesteal_data.all) then
				local amount = item:GetSpecialValueFor(lifesteal_data.all)
				if amount > total_lifesteal then total_lifesteal = amount end
			end
		end
	end

	for ability_name, lifesteal_data in pairs(self.abilities) do
		if unit:HasAbility(item_name) then

			local ability = unit:FindAbilityByName(ability_name)

			if (lifesteal_data.creep) then
				local amount = ability:GetSpecialValueFor(lifesteal_data.creep)
				if amount > total_lifesteal then total_lifesteal = amount end
			end

			if(lifesteal_data.all) then
				local amount = ability:GetSpecialValueFor(lifesteal_data.all)
				if amount > total_lifesteal then total_lifesteal = amount end
			end

		end
	end
	return total_lifesteal;
end

function MagicLifesteal:_GetUnitMagicLifesteal_toHero(unit)
	local total_lifesteal = 0;
	if unit or not unit:HasInventory() then return 0 end
	for item_name, lifesteal_data in pairs(self.items) do
		if unit:HasItemInInventory(item_name) then
			local item = MagicLifesteal:_FindItemInInventory(unit, item_name)

			if (lifesteal_data.hero) then
				local amount = item:GetSpecialValueFor(lifesteal_data.hero)
				if amount > total_lifesteal then total_lifesteal = amount end
			end

			if(lifesteal_data.all) then
				local amount = item:GetSpecialValueFor(lifesteal_data.all)
				if amount > total_lifesteal then total_lifesteal = amount end
			end
		end
	end

	for ability_name, lifesteal_data in pairs(self.abilities) do
		if unit:HasAbility(item_name) then

			local ability = unit:FindAbilityByName(ability_name)

			if (lifesteal_data.hero) then
				local amount = ability:GetSpecialValueFor(lifesteal_data.hero)
				if amount > total_lifesteal then total_lifesteal = amount end
			end

			if(lifesteal_data.all) then
				local amount = ability:GetSpecialValueFor(lifesteal_data.all)
				if amount > total_lifesteal then total_lifesteal = amount end
			end

		end
	end
	return total_lifesteal;
end

function MagicLifesteal:_FindItemInInventory(unit, item_name)
	for i = 0, 5 do
		local item = unit:GetItemInSlot(i) 
		if item and item:GetName() == item_name then
			return item;
		end
	end
end

function MagicLifesteal:RegisterLifestealAbility( ability_name, all_lifesteal)
	self.abilities[ability_name] = self.abilities[ability_name] or {}
	self.abilities[ability_name].all = all_lifesteal;
end

function MagicLifesteal:RegisterLifestealAbility( ability_name, hero_lifesteal, creep_lifesteal)
	self.abilities[ability_name] = self.abilities[ability_name] or {};
	self.abilities[ability_name].hero = hero_lifesteal;
	self.abilities[ability_name].creep = creep_lifesteal;
end

function MagicLifesteal:RegisterLifestealItem(item_name, all_lifesteal)
	self.items[item_name] = self.items[item_name] or {};
	self.items[item_name].all = all_lifesteal;
end

function MagicLifesteal:RegisterLifestealItem(item_name, hero_lifesteal, creep_lifesteal)
	self.items[item_name] = self.items[item_name] or {};
	self.items[item_name].hero = hero_lifesteal;
	self.items[item_name].creep = creep_lifesteal;
end

function MagicLifesteal:_init()
	_G._MagicLifesteal = {}
	_G._MagicLifesteal.main = function( keys ) MagicLifesteal:GlobalListen( keys ); end

	self.items = {}
	self.abilities = {}
	--MagicLifesteal:RegisterLifestealItem("item_octarine_core", "hero_lifesteal", "creep_lifesteal")
	MagicLifesteal:RegisterLifestealItem("item_octarine_core_2", "hero_lifesteal", "creep_lifesteal")

end

MagicLifesteal:_init()
Что бы добавить ваши айтемы можно закинуть в этой же библиотеке в _init функцию или вообще куда угодно и когда угодно.
MagicLifesteal:RegisterLifestealItem(item_name, lifesteal_hero_key, lifesteal_creep_key)
либо
MagicLifesteal:RegisterLifestealItem(item_name, total_lifesteal_key)
lifesteal_hero_key, lifesteal_creep_key, total_lifesteal_key - ключевые слова из AbilitySpecial из датадривена для этого предмета.

Для лайфстила с абилок есть две другие функции, работающие по сути так же:
MagicLifesteal:RegisterLifestealAbility( ability_name, hero_lifesteal_key, creep_lifesteal_key)
MagicLifesteal:RegisterLifestealAbility( ability_name, all_lifesteal_key)


Ну и если вдруг не нужно лайфстилить с некоторых скиллов, в начале библиотеки есть табличка запрещенных на лайфстил скиллов(ибо лайфстилит с ЛЮБОЙ абилки, или с ЛЮБОГО типа урона не физического при атаке с руки).
[/quote]
Куда вставлять этот дэмдж фильтр?
 
Последнее редактирование модератором:

MahouShoujo

Продвинутый
3 Ноя 2016
251
23
Пишу в эпичном треде созданном дауном для даунов.

Особенно понравилась SaveAbout которая упадет на первой же абилке на кулдауне. Так держать.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Особенно понравилась SaveAbout которая упадет на первой же абилке на кулдауне. Так держать.
8052123.jpg
 
Последнее редактирование модератором:
Реклама: