Удаление бафа

UZzip

Продвинутый
2 Янв 2016
282
1
Как при получении одного бафа развеять другой?
 

UZzip

Продвинутый
2 Янв 2016
282
1
Мне нужно удалить modifier_templar_assassin_refraction_damage как только появился modifier_templar_assassin_refraction_absorb


Код:
function чё тут написать чтобы всё работало? типа герой применил способность такую то:

if caster:HasModifier("modifier_templar_assassin_refraction_damage") then
caster:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Так, давай по порядку:

как ты узнаешь, что твой герой получил modifier_templar_assassin_refraction_damage ?
 

UZzip

Продвинутый
2 Янв 2016
282
1
Илья, подглядел в вики что он именно так называется.
мне бы универсальный вариант, на отлов скастованного скила,
герой "мой герой" = применил способность "такую то способность"
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Ну то есть, ты еще не решил предшествующий твоему вопросу об "удалении модификатора", вопрос: "как узнать, что на героя скастовали модификатор?
 
Последнее редактирование модератором:

UZzip

Продвинутый
2 Янв 2016
282
1
Илья, выходит так.

Мне бы вот именно научиться отлавливать каст, это решит множество моих вопросов =)
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Есть событие,
dota_player_used_ability
Можешь глянуть тут его описание.
 

UZzip

Продвинутый
2 Янв 2016
282
1
Код:
['dota_player_used_ability'] = function( params, team )
		local hero = PlayerResource:GetSelectedHeroEntity( params.PlayerID )

		if InVision( hero, team ) then
			return true
		end

		return false
	end


? это можно переделать?
 

Adam Smith

Друзья CG
4 Окт 2014
473
2
[quote author=UZzip link=topic=834.msg3723#msg3723 date=1461007869]
Код:
['dota_player_used_ability'] = function( params, team )
		local hero = PlayerResource:GetSelectedHeroEntity( params.PlayerID )

		if InVision( hero, team ) then
			return true
		end

		return false
	end


? это можно переделать?
[/quote]
Зачем тебе фильтр? :eek:
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Создаешь слушателя события, затем в функции, что будет твой слушатель вызывать, смотришь: наложил ли кто на цель модификатор или применена ли была абилка та. Ну и затем удаляешь.
 

UZzip

Продвинутый
2 Янв 2016
282
1
Код:
ListenToGameEvent(' dota_player_used_ability', abilityname)
if caster:HasModifier("modifier_templar_assassin_refraction_damage") then
caster:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end
как то так?
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=UZzip link=topic=834.msg3732#msg3732 date=1461042739]
Код:
ListenToGameEvent(' dota_player_used_ability', abilityname)
if caster:HasModifier("modifier_templar_assassin_refraction_damage") then
caster:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end
как то так?
[/quote]
Нет не так
В твой InitGameMode тыкай
Код:
ListenToGameEvent('dota_player_used_ability', OnUsedAbility, self)
Далее ниже в коде вне функций тыкай:
Код:
function OnUsedAbility(keys)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string

--[[
тут будет все что тебе надо после того как абилка скастовалась. Узнать цель нельзя, этот слушатель возвращает момент КОГДА ИГРОК(PLAYER) скастовал скилл. 
если хочешь узнать куда кастуется, кем, на что и т.д используй order(фильтр)
]]
end

Немного фильтров, в тот же InitGameMode
Код:
local GameMode = GameRules:GetGameModeEntity()
GameMode:SetExecuteOrderFilter(OrderFilter, self)
Далее в коде
Код:
function AngelArena:OrderFilter(keys)
local order_type = keys.order_type
if order_type == DOTA_UNIT_ORDER_CAST_TARGET then
--вызовется ПЕРЕД кастом на какую либо цель
  for key, value in pairs(keys) do
   print(key,value)
  end
end
return true -- если разрешить выполнение ордера то вернуть true, иначе вернуть false
end

Типы ордеров тебе существующих:
Код:
DOTA_UNIT_ORDER_NONE
DOTA_UNIT_ORDER_MOVE_TO_POSITION
DOTA_UNIT_ORDER_MOVE_TO_TARGET
DOTA_UNIT_ORDER_ATTACK_MOVE
DOTA_UNIT_ORDER_ATTACK_TARGET	
DOTA_UNIT_ORDER_CAST_POSITION	
DOTA_UNIT_ORDER_CAST_TARGET
DOTA_UNIT_ORDER_CAST_TARGET_TREE
DOTA_UNIT_ORDER_CAST_NO_TARGET
DOTA_UNIT_ORDER_CAST_TOGGLE
DOTA_UNIT_ORDER_HOLD_POSITION
DOTA_UNIT_ORDER_TRAIN_ABILITY
DOTA_UNIT_ORDER_DROP_ITEM	
DOTA_UNIT_ORDER_GIVE_ITEM	
DOTA_UNIT_ORDER_PICKUP_ITEM
DOTA_UNIT_ORDER_PICKUP_RUNE
DOTA_UNIT_ORDER_PURCHASE_ITEM
DOTA_UNIT_ORDER_SELL_ITEM
DOTA_UNIT_ORDER_DISASSEMBLE_ITEM
DOTA_UNIT_ORDER_MOVE_ITEM
DOTA_UNIT_ORDER_CAST_TOGGLE_AUTO
DOTA_UNIT_ORDER_STOP	
DOTA_UNIT_ORDER_TAUNT
DOTA_UNIT_ORDER_BUYBACK
DOTA_UNIT_ORDER_GLYPH
DOTA_UNIT_ORDER_EJECT_ITEM_FROM_STASH
DOTA_UNIT_ORDER_CAST_RUNE
 
Последнее редактирование модератором:

UZzip

Продвинутый
2 Янв 2016
282
1
С гейм модом разобрался =) спасибо плюсанул.

теперь осталось доделать функцию.

Код:
function OnUsedAbility(keys)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string


if caster:HasModifier("modifier_templar_assassin_refraction_damage") then
caster:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end
end

или
Код:
function OnUsedAbility(keys)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string


hero:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end

оба варианта не сработали, ну и не удивительно, потому что я всё ещё не понял(
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=UZzip link=topic=834.msg3743#msg3743 date=1461053123]
С гейм модом разобрался =) спасибо плюсанул.

теперь осталось доделать функцию.

Код:
function OnUsedAbility(keys)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string


if caster:HasModifier("modifier_templar_assassin_refraction_damage") then
caster:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end
end

или
Код:
function OnUsedAbility(keys)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string


hero:RemoveModifierByName("modifier_templar_assassin_refraction_damage")

end

оба варианта не сработали, ну и не удивительно, потому что я всё ещё не понял(
[/quote]
По поводу первого кода:
У тебя caster не объявлен совсем, у кого ты проверяешь модификатор?
Делай так

Код:
function OnUsedAbility(keys)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string

print("ON USED ABILITY, HERONAME:", hero:GetUnitName, " playerid:", keys.PlayerID, " ability name = ", ability_name)

hero :RemoveModifierByName("modifier_templar_assassin_refraction_damage")


end
Это при использовании любой абилки уберет у кастера модификатор если таковой имеется.
p.s. условие не нужно, ибо RemoveModifierByName не жалуется на отсутствие модификатора, он его снимет если он есть, ежели его нет то он ничего не сделает.
p.s.s. проверь что скажет консоль на принт, она детально тебе скажет все при касте скилла, если молчит то неправильно вызываешь эту функцию.
 
Последнее редактирование модератором:

UZzip

Продвинутый
2 Янв 2016
282
1
CryDeS, консоль мне написала:
Код:
[ W Entity System    ]: Entity I/O attempted to invoke unknown private script function "QuestKill" on entity "dota_base_game_mode"!
раз 500 подряд одно и тоже... а я QuestKill вообще не трогал.
 
Последнее редактирование модератором:

UZzip

Продвинутый
2 Янв 2016
282
1
Код:
function OnUsedAbility(keys)
Say(nil, "ON USED ABILITY", false)
hero :RemoveModifierByName("modifier_templar_assassin_refraction_damage")
end

ибо RemoveModifierByName не жалуется на отсутствие модификатора, он его снимет если он есть, ежели его нет то он ничего не сделает.

жалуется и ещё как. текст выводит а баф не снимает

[quote author=КОНСОЛЬ][ Developer ]: ...me\dota_addons\zipn\scripts\vscripts\addon_game_mode.lua:88: attempt to index global 'hero' (a nil value)
[ Developer ]: stack traceback:
[ Developer ]: ...me\dota_addons\zipn\scripts\vscripts\addon_game_mode.lua:88: in function <...me\dota_addons\zipn\scripts\vscripts\addon_game_mode.lua:86>
[ W VScript ]: Script Runtime Error: ...me\dota_addons\zipn\scripts\vscripts\addon_game_mode.lua:88: attempt to index global 'hero' (a nil value)
[ W VScript ]: stack traceback:
[ W VScript ]: ...me\dota_addons\zipn\scripts\vscripts\addon_game_mode.lua:88: in function <...me\dota_addons\zipn\scripts\vscripts\addon_game_mode.lua:86>[/quote]
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Жалуется он у тебя на
attempt to index global 'hero' (a nil value)

Код:
function OnUsedAbility(keys)
Say(nil, "ON USED ABILITY", false)
hero :RemoveModifierByName("modifier_templar_assassin_refraction_damage")
end

У тебя тут не определен Hero: кому ты абилку удаляешь, nil`у?
 
Последнее редактирование модератором:

UZzip

Продвинутый
2 Янв 2016
282
1
Код:
function OnUsedAbility(keys)
Say(nil, "ON USED ABILITY", false)
local player = PlayerResource:GetPlayer( keys.PlayerID ) --hscript
local hero = PlayerResource:GetSelectedHeroEntity(keys.PlayerID) --hscript
local ability_name = keys.abilityname --string
hero :RemoveModifierByName("modifier_templar_assassin_refraction_damage")
end

консоль
Код:
[  VScript       ]: GetPlayer parameter 1: expected integer but got void.
 
Последнее редактирование модератором:
Реклама: