Урок [Мини-Гайд] Выпадение предметов . Item Drops .

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Для того , чтобы у юнита была опция выпадения предметов , необходим базовый класс "Creature" :
"BaseClass" "Creature"
Все манипуляции следует проводить в файле "npc_units_custom.txt" в блоке "Creature"
Код:
"Creature"
    {
      "ItemDrops"
      {
        "Consumables"
        {
          "Item"
          {
            "1"       "item_health_potion"
            "2"       "item_health_potion"
            "3"       "item_mana_potion"
            "4"       "item_mana_potion"
            "5"       "item_enchanted_mango"
          }
          "Chance"      "12"
        }
        "StatTomes"
        {
          "Item"
          {
            "1"       "item_book_of_strength"
            "2"       "item_book_of_agility"
            "3"       "item_book_of_intelligence"
          }
          "Chance"      "1"
        }
        "Trinkets"
        {
          "Item"
          {
            "1"       "item_slippers"
            "2"       "item_gauntlets"
            "3"       "item_mantle"
            "4"       "item_wind_lace"
            "5"       "item_orb_of_venom"
            "6"       "item_blight_stone"
            "7"       "item_branches"
            "8"       "item_branches"
            "9"       "item_branches"
            "10"      "item_ring_of_protection"
            "11"      "item_sobi_mask"
            "12"      "item_stout_shield"
            "13"      "item_faerie_fire"
          }
          "Chance"      "8"
        }
      }
    }
"Consumables" , "StatTomes" и "Trinkets" являются названиями списков , которые могут быть абсолютно произвольными .
"Chance" - шанс выпадения одного предмета из списка.
____________
Гайд является идейным продолжением этих двух гайдов : создание кастомного юнита и поведение юнита т.к. является частью блока "Creature"
И является переводом части стастьи http://moddota.com/forums/discussion/224/datadriven-units/p1.
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, это из силтбрейкера, его ток добавили считай
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Может кто копался в их диалогах и по ним сделает мини-гайд? А то не охота самому в них разбираться, но скоро мне понадобится.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
[quote author=I_GRIN_I link=topic=1612.msg10588#msg10588 date=1500238674]
Илья, ты про разговорные пузырьки?
[/quote]

хахха, да, про speechBubble. Стандартные же перестали работать.
А тут смотрел на ютюбе прохождение этой компании и увидел, что они там были.
Взял на заметку себе глянуть в будущем, но может кто-то уже глянул и разобрался с ними.
 

Son1cPr00wer

Пользователь
23 Сен 2017
43
2
vk.com
Проект
Whack-A-Meepo
По теме - я долго мучался с выпадением, скрестил бульдога с носорогом (пример с форума, с моддб и с вольво), получилось не очень красиво, зато работает, может кому пригодится(как смотрю, на форуме новичков в кодинге много).

Код:
-- Create the game mode when we activate
function Activate()
	ListenToGameEvent("entity_killed", OnEntityKilled, nil)
	ListenToGameEvent("dota_player_killed", OnHeroKilled, self)
    --В этом файле и есть список предметов
	GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")
end
 
--Если кого-либо убили на карте, выпадает шмот из списка
 function OnEntityKilled (event)
  local killedEntity = EntIndexToHScript(event.entindex_killed)
  if killedEntity ~= nil then
		print("-----------------------------------Creature Killed--------------------------------------")
		RollDrops(killedEntity)

	end
end

--Если убили героя, выпадает весь его шмот
function OnHeroKilled(data)
print("----------------------------------------Hero Killed----------------------------------------")
	local killedEntity = PlayerResource:GetSelectedHeroEntity(data.PlayerID)
  if killedEntity:GetNumItemsInInventory() ~=0 then
	  for i=0,5 do
			local item = killedEntity:GetItemInSlot(i);
			if item ~= nil then
				local position = killedEntity:GetAbsOrigin()
				local name = item:GetAbilityName()
				killedEntity:RemoveItem(item)		
				CreateDrop(name, position)
			end
		end
  end
	
end

--Обработка списка для крипов
 function RollDrops(unit)
  local DropInfo = GameRules.DropTable[unit:GetUnitName()]
  if DropInfo then
    for item_name,chance in pairs(DropInfo) do
      if RollPercentage(chance) then
        --Создание вещи
        local item = CreateItem(item_name, nil, nil)
        local pos = unit:GetAbsOrigin()
        local drop = CreateItemOnPositionSync( pos, item )
        item:LaunchLoot(false, 200, 0.75, pos+RandomVector(RandomFloat(150,200)))
      end
    end
  end
end

--Здесь выкидываем вещи героя
function CreateDrop (itemName, pos)
  local newItem = CreateItem(itemName, nil, nil)
  newItem:SetPurchaseTime(0)
  CreateItemOnPositionSync(pos, newItem)
  newItem:LaunchLoot(false, 300, 0.75, pos + RandomVector(RandomFloat(50, 350)))
 end

Код:
--В этом файле прописал лут для самого большого крипа в стаке
"Drops" 
{ 

  "MaxTime"    "60"
  "MaxDropsOnScreen" "3"
 
  "ItemQualityColors"
  {
    "artifact" "#FFA500" //Orange
    "epic"   "#8847FF" //Purple
    "rare"   "#4B69FF" //Blue
    "common"  "#00FF00" //Lime Green
    "component" "#FFFFFF" //White
    "consumable" "#FFFFFF" //White
  }
	
	
	////For Small creep camps
		"npc_dota_neutral_kobold_taskmaster"
  { 
    "item_egg_shell"			"20"
    "item_clarity"				"20"
    "item_enchanted_mango"		"18"
		"item_faerie_fire"			"25"
		"item_flask"				"15"
		"item_branches"				"18"
		"item_circlet"				"13"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_slippers"				"10"
		"item_gauntlets"			"10"
    "item_mantle"				"10"
    "item_wind_lace"			"11"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"13"
    "item_sobi_mask"			"13"
		"item_stout_shield"			"13"
  }
	  "npc_dota_neutral_forest_troll_high_priest"
  { 
    "item_egg_shell"			"20"
    "item_clarity"				"20"
    "item_enchanted_mango"		"18"
		"item_faerie_fire"			"25"
		"item_flask"				"15"
		"item_branches"				"18"
		"item_circlet"				"13"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_slippers"				"10"
		"item_gauntlets"			"10"
    "item_mantle"				"10"
    "item_wind_lace"			"11"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"13"
    "item_sobi_mask"			"13"
		"item_stout_shield"			"13"
  }
	  "npc_dota_neutral_gnoll_assassin"
  { 
    "item_egg_shell"			"15"
    "item_clarity"				"16"
    "item_enchanted_mango"		"12"
		"item_faerie_fire"			"20"
		"item_flask"				"12"
		"item_branches"				"14"
		"item_circlet"				"10"
		"item_book_of_strength"		"1"
    "item_book_of_agility"		"1"
    "item_book_of_intelligence"	"1"
		"item_slippers"				"8"
		"item_gauntlets"			"8"
    "item_mantle"				"8"
    "item_wind_lace"			"9"
    "item_orb_of_venom"			"7"
    "item_blight_stone"			"7"
    "item_bottle"				"1"
    "item_quelling_blade"		"3"
    "item_ring_of_protection"	"9"
    "item_sobi_mask"			"9"
		"item_stout_shield"			"9"
  }
	  "npc_dota_neutral_ghost"
  { 
    "item_egg_shell"			"20"
    "item_clarity"				"20"
    "item_enchanted_mango"		"18"
		"item_faerie_fire"			"25"
		"item_flask"				"15"
		"item_branches"				"18"
		"item_circlet"				"13"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_slippers"				"10"
		"item_gauntlets"			"10"
    "item_mantle"				"10"
    "item_wind_lace"			"11"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"13"
    "item_sobi_mask"			"13"
		"item_stout_shield"			"13"
  }
	  "npc_dota_neutral_harpy_storm"
  { 
    "item_egg_shell"			"20"
    "item_clarity"				"20"
    "item_enchanted_mango"		"18"
		"item_faerie_fire"			"25"
		"item_flask"				"15"
		"item_branches"				"18"
		"item_circlet"				"13"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_slippers"				"10"
		"item_gauntlets"			"10"
    "item_mantle"				"10"
    "item_wind_lace"			"11"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"13"
    "item_sobi_mask"			"13"
		"item_stout_shield"			"13"
  }
	////For Medium creep camps
	
	  "npc_dota_neutral_centaur_khan"
  { 
    "item_egg_shell"			"10"
    "item_clarity"				"11"
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_circlet"				"6"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_wind_lace"			"5"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"5"
    "item_sobi_mask"			"5"
		"item_stout_shield"			"6"
		"item_tome_of_knowledge"	"1"
		"item_belt_of_strength"		"10"
		"item_robe"					"10"
    "item_boots_of_elves"		"10"
		"item_chainmail"			"9"
		"item_gloves"				"9"
		"item_cloak"				"9"
		"item_magic_wand"			"10"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_bracer"				"3"
		"item_soul_ring"			"3"
		"item_wraith_band"			"3"
		"item_poor_mans_shield"		"3"
		"item_null_talisman"		"3"
  }
	  "npc_dota_neutral_alpha_wolf"
  { 
    "item_egg_shell"			"10"
    "item_clarity"				"11"
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_circlet"				"6"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_wind_lace"			"5"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"5"
    "item_sobi_mask"			"5"
		"item_stout_shield"			"6"
		"item_tome_of_knowledge"	"1"
		"item_belt_of_strength"		"10"
		"item_robe"					"10"
    "item_boots_of_elves"		"10"
		"item_chainmail"			"9"
		"item_gloves"				"9"
		"item_cloak"				"9"
		"item_magic_wand"			"10"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_bracer"				"3"
		"item_soul_ring"			"3"
		"item_wraith_band"			"3"
		"item_poor_mans_shield"		"3"
		"item_null_talisman"		"3"
  }
	  "npc_dota_neutral_satyr_soulstealer"
  { 
    "item_egg_shell"			"10"
    "item_clarity"				"11"
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_circlet"				"6"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_wind_lace"			"5"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"5"
    "item_sobi_mask"			"5"
		"item_stout_shield"			"6"
		"item_tome_of_knowledge"	"1"
		"item_belt_of_strength"		"10"
		"item_robe"					"10"
    "item_boots_of_elves"		"10"
		"item_chainmail"			"9"
		"item_gloves"				"9"
		"item_cloak"				"9"
		"item_magic_wand"			"10"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_bracer"				"3"
		"item_soul_ring"			"3"
		"item_wraith_band"			"3"
		"item_poor_mans_shield"		"3"
		"item_null_talisman"		"3"
  }
	  "npc_dota_neutral_ogre_magi"
  { 
    "item_egg_shell"			"10"
    "item_clarity"				"11"
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_circlet"				"6"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_wind_lace"			"5"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"5"
    "item_sobi_mask"			"5"
		"item_stout_shield"			"6"
		"item_tome_of_knowledge"	"1"
		"item_belt_of_strength"		"10"
		"item_robe"					"10"
    "item_boots_of_elves"		"10"
		"item_chainmail"			"9"
		"item_gloves"				"9"
		"item_cloak"				"9"
		"item_magic_wand"			"10"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_bracer"				"3"
		"item_soul_ring"			"3"
		"item_wraith_band"			"3"
		"item_poor_mans_shield"		"3"
		"item_null_talisman"		"3"
  }	  
	"npc_dota_neutral_mud_golem"
  { 
    "item_egg_shell"			"10"
    "item_clarity"				"11"
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_circlet"				"6"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_wind_lace"			"5"
    "item_orb_of_venom"			"9"
    "item_blight_stone"			"9"
    "item_bottle"				"1"
    "item_quelling_blade"		"5"
    "item_ring_of_protection"	"5"
    "item_sobi_mask"			"5"
		"item_stout_shield"			"6"
		"item_tome_of_knowledge"	"1"
		"item_belt_of_strength"		"10"
		"item_robe"					"10"
    "item_boots_of_elves"		"10"
		"item_chainmail"			"9"
		"item_gloves"				"9"
		"item_cloak"				"9"
		"item_magic_wand"			"10"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_bracer"				"3"
		"item_soul_ring"			"3"
		"item_wraith_band"			"3"
		"item_poor_mans_shield"		"3"
		"item_null_talisman"		"3"
		"item_banana"				"1"	
  }	 
	
	////For Hard creep camps	
	
	"npc_dota_neutral_satyr_hellcaller"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_bottle"				"1"
		"item_tome_of_knowledge"	"1"
		"item_oblivion_staff"		"8"
		"item_void_stone"			"8"
		"item_ring_of_health"		"8"
		"item_lifesteal"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
  }	 
	"npc_dota_neutral_polar_furbolg_ursa_warrior"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_bottle"				"1"
		"item_tome_of_knowledge"	"1"
		"item_oblivion_staff"		"8"
		"item_void_stone"			"8"
		"item_ring_of_health"		"8"
		"item_lifesteal"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
  }	 
	"npc_dota_neutral_enraged_wildkin"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_bottle"				"1"
		"item_tome_of_knowledge"	"1"
		"item_oblivion_staff"		"8"
		"item_void_stone"			"8"
		"item_ring_of_health"		"8"
		"item_lifesteal"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
  }	 
	"npc_dota_neutral_dark_troll_warlord"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
    "item_bottle"				"1"
		"item_tome_of_knowledge"	"1"
		"item_oblivion_staff"		"8"
		"item_void_stone"			"8"
		"item_ring_of_health"		"8"
		"item_lifesteal"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
  }	 
	
	////For Ancient creep camps
	
	"npc_dota_neutral_black_dragon"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_platemail"			"5"
		"item_tome_of_knowledge"	"1"
		"item_talisman_of_evasion"	"5"
		"item_hyperstone"			"3"
		"item_ultimate_orb"			"3"
		"item_demon_edge"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
		"item_ogre_axe"				"5"
		"item_blade_of_alacrity"	"5"
		"item_staff_of_wizardry"	"5"
		"item_mithril_hammer"		"5"
		"item_javelin"				"5"
		"item_broadsword"			"7"
  }	 
	"npc_dota_neutral_granite_golem"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_platemail"			"5"
		"item_tome_of_knowledge"	"1"
		"item_talisman_of_evasion"	"5"
		"item_hyperstone"			"3"
		"item_ultimate_orb"			"3"
		"item_demon_edge"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
		"item_ogre_axe"				"5"
		"item_blade_of_alacrity"	"5"
		"item_staff_of_wizardry"	"5"
		"item_mithril_hammer"		"5"
		"item_javelin"				"5"
		"item_broadsword"			"7"
  }	 
	"npc_dota_neutral_big_thunder_lizard"
  { 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_platemail"			"5"
		"item_tome_of_knowledge"	"1"
		"item_talisman_of_evasion"	"5"
		"item_hyperstone"			"3"
		"item_ultimate_orb"			"3"
		"item_demon_edge"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"1"
		"item_ogre_axe"				"5"
		"item_blade_of_alacrity"	"5"
		"item_staff_of_wizardry"	"5"
		"item_mithril_hammer"		"5"
		"item_javelin"				"5"
		"item_broadsword"			"7"
  }	 
	"npc_dota_neutral_prowler_shaman"
	{ 
    "item_enchanted_mango"		"9"
		"item_flask"				"7"
		"item_book_of_strength"		"3"
    "item_book_of_agility"		"3"
    "item_book_of_intelligence"	"3"
		"item_platemail"			"5"
		"item_tome_of_knowledge"	"1"
		"item_talisman_of_evasion"	"5"
		"item_hyperstone"			"5"
		"item_ultimate_orb"			"3"
		"item_demon_edge"			"3"
		"item_candle"				"3"
		"item_spirit"				"3"
		"item_banana"				"8"
		"item_ogre_axe"				"5"
		"item_blade_of_alacrity"	"5"
		"item_staff_of_wizardry"	"5"
		"item_mithril_hammer"		"5"
		"item_javelin"				"5"
		"item_broadsword"			"7"
  }	
}
Форматирование съехало куда-то ;D
Пишу в Notepad++, привык просто)
 
Последнее редактирование модератором:

Son1cPr00wer

Пользователь
23 Сен 2017
43
2
vk.com
Проект
Whack-A-Meepo
хахха, да, про speechBubble. Стандартные же перестали работать.
А тут смотрел на ютюбе прохождение этой компании и увидел, что они там были.
Взял на заметку себе глянуть в будущем, но может кто-то уже глянул и разобрался с ними.
Сегодня лазил по файлам силта, обнаружил, что на крипов вешается модифаер на старте modifier_npc_dialog или modifier_npc_dialog_notify (он вроде как при принятии квеста, если таковой имеется, или наоборот)
Вот например кусок кода одного из солдат на ограх, которого надо было спасти
Код:
function modifier_imprisoned_soldier:OnTeleported( params )
	if IsServer() then
		if params.unit == self:GetParent() then
			self:GetParent():RemoveAbility( self:GetAbility():GetAbilityName() )
			self:GetParent():Interrupt()
			self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_npc_dialog", { duration = -1 } )
			self:Destroy()

			local hAnimationBuff = self:GetParent():FindModifierByName( "modifier_stack_count_animation_controller" )
			if hAnimationBuff ~= nil and self:GetParent():GetUnitName() ~= "npc_dota_radiant_captain" and self:GetParent():GetUnitName() ~= "npc_dota_creature_friendly_ogre_tank" then
				local nRandomAnim = RandomInt( 0, 3 )
				if nRandomAnim == 0 then
					hAnimationBuff:SetStackCount( ACT_DOTA_IDLE_SLEEPING )
					self:GetParent():RemoveModifierByName( "modifier_npc_dialog" )
				end
				if nRandomAnim == 1 then
					hAnimationBuff:SetStackCount( ACT_DOTA_LOOK_AROUND )
				end
				if nRandomAnim == 2 then
					hAnimationBuff:SetStackCount( ACT_DOTA_SHARPEN_WEAPON )
				end
			end
		end	
	end
end

Также в файле events.lua был обнаружен кусок кода. Как я понимаю, записки, которые нужно было читать и собирать для ачивки в этом ивенте работают на том же принципе, просто выглядят покрасочнее.
Код:
function CDungeon:OnDialogBegin( hPlayerHero, hDialogEnt )
	local Dialog = self:GetDialog( hDialogEnt )
	if Dialog == nil then
		print( "CDungeon:OnDialogBegin - ERROR: No Dialog found for " .. hDialogEnt:GetUnitName() )
		return
	end

	if self.bConfirmPending == true then
		print( "CDungeon:OnDialogBegin - Cannot dialog, a confirm dialog is pending." )
		return
	end

	if Dialog.szRequireQuestActive ~= nil then
		if self:IsQuestActive( Dialog.szRequireQuestActive ) == false then
			print( "CDungeon:OnDialogBegin - Required Active Quest for dialog line not active." )
			return
		end
	end

	local bShowAdvanceDialogButton = true
	local NextDialog = self:GetDialogLine( hDialogEnt, hDialogEnt.nCurrentLine + 1 ) 
	if Dialog.bPlayersConfirm == true or NextDialog == nil or NextDialog.bPlayersConfirm == true or Dialog.bForceBreak == true then
		bShowAdvanceDialogButton = false
	end

	local netTable = {}
	netTable["DialogEntIndex"] = hDialogEnt:entindex()
	netTable["PlayerHeroEntIndex"] = hPlayerHero:entindex()
	netTable["DialogText"] = Dialog.szText
	netTable["DialogAdvanceTime"] = Dialog.flAdvanceTime
	netTable["DialogLine"] = hDialogEnt.nCurrentLine
	netTable["ShowAdvanceButton"] = bShowAdvanceDialogButton
	netTable["SendToAll"] = Dialog.bSendToAll
	netTable["DialogPlayerConfirm"] = Dialog.bPlayersConfirm
	netTable["ConfirmToken"] = Dialog.szConfirmToken
	netTable["JournalEntry"] = hDialogEnt:FindAbilityByName( "ability_journal_note" ) ~= nil
	netTable["WardenNote"] = hDialogEnt:FindAbilityByName( "ability_warden_note" ) ~= nil

	--print("removing modifier from unit")
	hDialogEnt:RemoveModifierByName( "modifier_npc_dialog_notify" )

	for _,zone in pairs( self.Zones ) do
		zone:OnDialogBegin( hDialogEnt )
	end

	if Dialog.bPlayersConfirm == true then
		self.bConfirmPending = true
	end

	if Dialog.bSkipFacePlayer ~= true then 
		hDialogEnt.vOriginalFaceDir = hDialogEnt:GetOrigin() + hDialogEnt:GetForwardVector() * 50
		hDialogEnt:FaceTowards( hPlayerHero:GetOrigin() )
	end

	if Dialog.Gesture ~= nil then
		hDialogEnt:StartGesture( Dialog.Gesture )
	end

	if Dialog.Sound ~= nil then
		hDialogEnt:EmitSoundParams( Dialog.Sound, 0, VOICE_VOLUME, 0 )
	end

	if Dialog.bAdvance == true then
		hDialogEnt.nCurrentLine = hDialogEnt.nCurrentLine + 1
	end

	if Dialog.szGiveItemName ~= nil then
		local newItem = CreateItem( Dialog.szGiveItemName, nil, nil )
		if hPlayerHero:HasAnyAvailableInventorySpace() then
			hPlayerHero:AddItem( newItem )
		else
			if newItem ~= nil then
				local drop = CreateItemOnPositionSync( hPlayerHero:GetAbsOrigin(), newItem )
				local dropTarget = hPlayerHero:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) )
				newItem:LaunchLoot( false, 150, 0.75, dropTarget )
			end
		end
	end

	if Dialog.bDialogStopsMovement == true then
		hDialogEnt:SetMoveCapability( DOTA_UNIT_CAP_MOVE_NONE )
	end

	if hDialogEnt:FindAbilityByName( "ability_journal_note" ) ~= nil then
		local szJournalNumber = string.match( Dialog.szText, "chef_journal_(%d+)" )
		if szJournalNumber ~= nil then
			local nJournalNumber = tonumber( szJournalNumber );
			local nPlayerID = hPlayerHero:GetPlayerID()
			self:OnPlayerFoundChefNote( nPlayerID, nJournalNumber )
		end
	end

	if hDialogEnt:FindAbilityByName( "ability_warden_note" ) ~= nil then
		local szWardenNoteNumber = string.match( Dialog.szText, "warden_log_(%d+)" )
		if szWardenNoteNumber ~= nil then
			local nWardenNoteNumber = tonumber( szWardenNoteNumber );
			local nPlayerID = hPlayerHero:GetPlayerID()
			self:OnPlayerFoundWardenNote( nPlayerID, nWardenNoteNumber )
		end
	end

	if Dialog.bSendToAll == true then
		CustomGameEventManager:Send_ServerToAllClients( "dialog", netTable )
	else
		CustomGameEventManager:Send_ServerToPlayer( hPlayerHero:GetPlayerOwner(), "dialog", netTable )
	end
end
Причем для этих записок есть пустые скиллы вроде, но модифаеры в них не прописаны. Скорее всего для навешивания тупо используется фильтр по юнитам с параметрами
Код:
"MODIFIER_STATE_NO_HEALTH_BAR"       "MODIFIER_STATE_VALUE_ENABLED"
"MODIFIER_STATE_INVULNERABLE"        "MODIFIER_STATE_VALUE_ENABLED"
"MODIFIER_STATE_BLIND"           "MODIFIER_STATE_VALUE_ENABLED"
"MODIFIER_STATE_NOT_ON_MINIMAP"       "MODIFIER_STATE_VALUE_ENABLED"
Я в скриптинге и панорамах не силен, но может поможет чем.
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Да, спасибо, благодаря этому нашел на гитхабе их репозиторий.
 

alex_gadzy

Пользователь
28 Июн 2019
49
2
Как все это дело очистить? а то фпс падает от кол-ва дропа
 
Реклама: