отлов убийства определенного крипа

  • Автор темы Автор темы Danis
  • Дата начала Дата начала

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Не могу найти пример с отловом убийства определенного крипа, если знаете как это делать расскажите, и еще одна просьба
как делать чтобы при убийстве крипа давался модификатор и он стакался?

Предполагаю так можно "отдавать" модификатор:
Код:
"OnOwnerDie"
{
  "RunScript"
{
 "ScriptFile" "file.lua"
 "Function" "Base" 
}
}

Код:
function Base(keys)
 if keys.attacker:IsHero() and not keys.attacker:HasModifier("modifier") then
 keys.ability:ApplyDataDrivenModifier(keys.caster,keys.attacker, "modifier",{})
 elseif keys.attacker:HasModifier("modifier") then
local current_stack = keys.attacker:GetStackCount()
keys.attacker:SetModifierStackCount("modifier",attacker,current_stack + 1)
end
 
Последнее редактирование модератором:
Danis, отслеживаешь убийство ентити и если ентити == твоему крипу, то выполняешь скрипт
 
I_GRIN_I, так?
Код:
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)

function onEntityKilled
 if entity_killed == nujnij_creep then
и та функция
end
 
[quote author=Danis link=topic=1025.msg5598#msg5598 date=1470312204]
I_GRIN_I, так?
Код:
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)

function onEntityKilled
 if entity_killed == nujnij_creep then
и та функция
end
[/quote]
Да, так.
Код:
function OnEntityKilled(event)
	local killedUnit = EntIndexToHScript( event.entindex_killed )
	local killedTeam = killedUnit:GetTeam()

	local killer = EntIndexToHScript( event.entindex_attacker )
	local killerTeam = hero:GetTeam()
 
что то не понял как кидать модификатор убийце можно по подробнее?
 
а еще подробнее? пожалуйста
 
Danis, ну во-первых стаки на модификаторе тебе надо получать так:
Код:
local current_stack = hCaster:GetModifierStackCount("modifier_stacks", hCaster)
Во-вторых, модификатор добавляется так:
Код:
hCaster:AddNewModifier(hCaster,hAbility,"modifier_stacks",{})
А стаки добавляются или отнимаются так:
Код:
hCaster:SetModifierStackCount("modifier_stacks", hCaster, stacks - 1)
 
Последнее редактирование модератором:
я вот так пробовал но не работает
Код:
if not keys.caster:IsAlive() and keys.attacker == keys.attacker then
		local modifier = "modifier_simple_creature_vision"
		if not keys.attacker:HasModifier(modifier) then
			keys.ability:ApplyDataDrivenModifier(keys.caster,keys.attacker, modifier,{})
		end

		local current_stack = keys.attacker:GetModifierStackCount(modifier,keys.attacker)
		keys.caster:SetModifierStackCount(modifier,keys.attacker,current_stack + 1)
	end
Мне бы код пассивки венги из дотаимбы, там такая же механика умения...
 
Последнее редактирование модератором:
Что это за

Код:
keys.attacker == keys.attacker

Это все равно, что написать

Код:
if not keys.caster:IsAlive() and 1 == 1 then

Ну и ты показываешь кусочек кода, значит ты уверен, что не работает именно он. Значит ты можешь сказать, где компилятор выдает ошибку или стопорится?
 
в самой абилке написано
Код:
"OnOwnerDie"
{
	"RunScript"
{ "ScriptFile" "расположение файла"
"Function"	"функция"
}
}
может не работать только код луа
 
Последнее редактирование модератором:
исправил в абилити кустом с OnOwnerDie на OnOwnerDied но оно все так же не работает и пишет что не может найти поле attacker
Код:
[ W VScript    ]: Script Runtime Error: ...anisversion\scripts\vscripts\vision.lua:7: attempt to index local 'attacker' (a nil value)
 
Значит нет такой переменной "attacker".
 
Последнее редактирование модератором:
Я не знаю, где-то разбирались с подобной проблемой, даже вроде бы я сам. Но не помню тему, можешь поискать на форуме.

Да и вообще раз Cry скидывал кусок, то скорее всего он скидывал рабочий кусок и такая переменная есть в событии убийства сущности. Проверь через вывод таблицы этого события есть ли там такая переменная. И если есть, значит ты что-то не так делаешь и скинь весь код вместе с кодом крипа/абилки. Ну а если нету, то ищи на форуме или в API полезные штуки.
 
Я скинул рабочий код, но дело в том что иногда attacker'a нету, по этому нужно после кода поставить проверку
Код:
if not killedUnit or not attacker then return end
Что бы в случае отсутствия убийцы или мертвого юнита, код далее не выполнялся.
 
Абилитиес
Код:
"fly_vision_bonus"
	{
		// General
		//-------------------------------------------------------------------------------------------------------------
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN"
		"BaseClass"						"ability_datadriven"
		"AbilityTexture"				"recipe"
		"MaxLevel"	"1"

		"AbilitySpecial"
		{
			"01"
			{
				"var_type"					"FIELD_INTEGER"
				"vision_bonus"				"2"
			}
		}

		"OnOwnerDied"
		{
			"RunScript"
			{
				"ScriptFile"	"mutations_vision/vision.lua"
				"Function"		"fly_vision_simple"
			}
		}

		"Modifiers"
		{
			"modifier_simple_creature_vision"
			{
				"Passive"	"1"
				"IsHidden"	"0"
				"Properties"
				{
					"MODIFIER_PROPERTY_BONUS_DAY_VISION"	"%vision_bonus"
				}
			}
		}
	}
Юнитс
Код:
"fly_simple"
		{
    // General
	    //----------------------------------------------------------------
	    "BaseClass"       "npc_dota_creature" // Базовый класс
	    "Model"         "models\props_wildlife\wildlife_birdsmall003.vmdl" // Модель
	    "ModelScale"      "2" // Размер модели
	    "Level"         "1" // Уровень
	    "HealthBarOffset"    "140" // Насколько высоко будет хп бар
	    "HasInventory"     "0" // Имеет ли инвентарь
	       //Дальше - смотрите по гайду
	    // Abilities
	    //----------------------------------------------------------------
	    "Ability1"       "fly_vision_bonus"
	    "Ability2"       ""
	    
	    // Armor
	    //----------------------------------------------------------------
	    "ArmorPhysical"     "0"
	    "MagicalResistance"   "0"
	    
	    // Attack
	    //----------------------------------------------------------------
	    "AttackCapabilities"  "DOTA_UNIT_CAP_MELEE_ATTACK"
	    "AttackDamageType"   "DAMAGE_TYPE_ArmorPhysical"
	    "AttackDamageMin"    "10"
	    "AttackDamageMax"    "10"
	    "AttackRate"      "1"
	    "AttackAnimationPoint" "1"
	    "AttackAcquisitionRange" "500"
	    "AttackRange"      "90"
	    "AttackRangeBuffer"		"560"
	    
	    // Bounty
	    //----------------------------------------------------------------
	    "BountyGoldMin"     "0"
	    "BountyGoldMax"     "0"
	    "BountyXP" 				"30"
	    
	    // Bounds
	    //----------------------------------------------------------------
	    "BoundsHullName"    "DOTA_HULL_SIZE_HERO"
	    "RingRadius"      "50"
	    
	    // Movement
	    //----------------------------------------------------------------
	    "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY"
	    "MovementSpeed"     "320"
	    "MovementTurnRate"   "0.4"
	    
	    // Status
	    //----------------------------------------------------------------
	    "StatusHealth"     "35"
	    "StatusHealthRegen"   "0"
	    "StatusMana"      "0"
	    "StatusManaRegen"    "0"
	    
	    // Vision
	    //----------------------------------------------------------------
	    "VisionDaytimeRange"  "1200"
	    "VisionNighttimeRange" "1200"
	    
	    // Team
	    //----------------------------------------------------------------
	    "TeamName"       "DOTA_TEAM_NEUTRALS"
	    "UseNeutralCreepBehavior"  "1"
	    "CombatClassAttack"   "DOTA_COMBAT_CLASS_ATTACK_BASIC"
	    "CombatClassDefend"   "DOTA_COMBAT_CLASS_DEFEND_BASIC"
	    "UnitRelationShipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"
		}
луа код абилки
Код:
function fly_vision_simple(keys)
	local attacker = keys.attacker
	if not keys.caster:IsAlive() then
		local modifier = "modifier_simple_creature_vision"
		if not attacker:HasModifier(modifier) then
			keys.ability:ApplyDataDrivenModifier(keys.caster,attacker, modifier,{})
		end

		local current_stack = attacker:GetModifierStackCount(modifier,attacker)
		keys.caster:SetModifierStackCount(modifier,attacker,current_stack + 1)
	end
end
 
Последнее редактирование модератором:
Вон, делай как Cry сказал и если не устроит такой вариант, то делай через ласт хит.

И тебе совершенно не надо делать проверку на живность:
Код:
if not keys.caster:IsAlive() then
Ты же код по убийству запускаешь, юнит всегда мертв. Это лишнее.
 
ну я вообще не понимаю что там надо написать чтобы оно заработало. :'(
или просто скажите как вскрыть чужой мод и его местонахождение
 
ну я вообще не понимаю что там надо написать чтобы оно заработало. :'(
или просто скажите как вскрыть чужой мод и его местонахождение
Тебя в гугле забанили?)
Или в поиске по форуму?
Тысячу раз обсуждалось, ИЩИТЕ.
Лентяи блин, вообще нифига сами делать не хотят, ладно бы просто спиздить чужой код и сделать на основе чужого свой, так нет, еще и скиньте им готовый распакованный чужой код.
 
Последнее редактирование модератором:
Реклама: