CustomGames.ru - Dota 2 пользовательские игры

Создание нового героя в определенной точке, с полным удалением старого

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн oplkill

  • 34
  • Мощь: 0
  • Jungle race и Simple Dota 2 Editor
Всем привет!

Я новичок в dota 2 картостроении, перешел из warcraft 3 и решил перенести оттуда карту на подобии "Random units"
И по мере создания столкнулся с одной вещью как:
Что надо после смерти старого героя игрока, полностью удалять(чтобы и следа от него и не осталось) и создать нового в нужной точке

Пробовал различные способы какие мог найти в dota 2 api wiki
Часто натыкался на ошибки типо: "Функция получила 1 аргумент, но ожидает - 2", когда в офф вики написан только 1 аргумент...

Заранее благодарю!



РЕШЕНИЕ:
Включить респавн героев
« Последнее редактирование: 03-01-2016, 22:02:21 от oplkill »

Оффлайн Илья

  • Супермодератор
  • 1909
  • Мощь: 16
Обычно в такой ситуации используют функцию:
Код
PlayerResource:ReplaceHeroWith(PlayerID, "npc_dota_hero_name", gold, xp)

Полазий по Гитхабу, посмотри чужой код. Я реализовывал режим в своем моде подобно стандартному дотерскому death match через эту функцию. Сразу предупрежу, что могут быть напряги с Иллюзиями, ибо они тоже запускают эту функцию. 

Можешь и через
Цитировать
handle CreateHeroForPlayer(string unitName, handle player)
попробовать. Но сомневаюсь, что она тебе подойдет.


Оффлайн Илья

  • Супермодератор
  • 1909
  • Мощь: 16
Но эти функции касаются именно смены "типа персонажа", а не инвентаря и прочего. Инвентарь ручками надо чистить. 

Оффлайн oplkill

  • 34
  • Мощь: 0
  • Jungle race и Simple Dota 2 Editor
Илья, с инвентарём, скилами это все конечно, у каждого свое, но ReplaceHero, да создает новго героя, заменяя старого, но с одним но... Как избавиться от трупа старого героя? А также мертвой метки на мини-карте?

Оффлайн Илья

  • Супермодератор
  • 1909
  • Мощь: 16
Илья, с инвентарём, скилами это все конечно, у каждого свое, но ReplaceHero, да создает новго героя, заменяя старого, но с одним но... Как избавиться от трупа старого героя? А также мертвой метки на мини-карте?


Труп пропадет сам, да и иконка ведь привязана к игроку, а не модельке.

Оффлайн oplkill

  • 34
  • Мощь: 0
  • Jungle race и Simple Dota 2 Editor
Цитата: Илья
Труп пропадет сам, да и иконка ведь привязана к игроку, а не модельке.




Ну не скажи...
Код
-- This function is called whenever any player sends a chat message to team or All
function GameMode:OnPlayerChat(keys)
  local teamonly = keys.teamonly
  local userID = keys.userid
  local playerID = self.vUserIds[userID]:GetPlayerID()

  local text = keys.text
 
 
 
  --local point = Entities:FindByName( nil, "spawnhero"):GetAbsOrigin()
  local heronew = PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_axe", 0, 0)
  --CreateHeroForPlayer("npc_dota_hero_axe", globalPlayerTEST)
end
Заменяется герой, старый умирает и оставляет за собой метку. Спустя время не заметил, чтобы они исчезли... Можно ли какнить задать время "разложения"(как в варике) если тут это конечно есть...
Код
"DOTAHeroes"
{
    "npc_dota_hero_templar_assassin_template"
    {
        "override_hero"                "npc_dota_hero_abaddon"            // Hero to override
        "Ability1"                    "templar_assassin_refraction_holdout"        // Ability 1
        "Ability2"                    "unselectable"
        "VisionNighttimeRange"        "1800"                                        // Range of vision at night time.
        
        "MinimapIcon"               "minimap_candybucket"
        "MinimapIconSize"           "0"
    }
}
Задание картинки иконки и ее размера не влияют... (У второго героя AXE теже самые свойства имеются...)

Оффлайн Илья

  • Супермодератор
  • 1909
  • Мощь: 16
Весьма странная штука. Попробуй использовать GetPlayerOwnerID().

Ток для него нужен entiindex, например:

Код
function ForTest:InitGameMode()
ListenToGameEvent('npc_spawned', Dynamic_Wrap(ForTest, 'OnNPCSpawned'), self)
end

function ForTest:OnNPCSpawned(data)
local npc = EntIndexToHScript(data.entindex)
local id = npc:GetPlayerOwnerID()
PlayerResource:ReplaceHeroWith(id, "npc_dota_hero_abaddon", 0, 0)
end

Оффлайн Илья

  • Супермодератор
  • 1909
  • Мощь: 16
И у тебя ошибку еще выдает о том, что не может обратиться к entity, т.е. ты где-то берешь пустой entity и с ним пытаешься работать. 

Если ошибка в этой функции, которой ты скинул код, то я думаю, дело в этом присваивании
Код
  local playerID = self.vUserIds[userID]:GetPlayerID()

Ну, просто потому что я такую строчку впервые вижу, за свою недолгую практику в модах.
Ну и т.к. там именно "create" не может осуществить,а  он у тебя только тут:
Код
heronew = PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_axe", 0, 0)

ну и в закоментированном
Код
CreateHeroForPlayer("npc_dota_hero_axe", globalPlayerTEST)
« Последнее редактирование: 03-01-2016, 18:06:32 от Илья »

Оффлайн oplkill

  • 34
  • Мощь: 0
  • Jungle race и Simple Dota 2 Editor
Хм, я сейчас попробовал сделать новый мод ОверТхров и вставил туда замену и там такого бага нет...
Видимо Barebone что-то мутит не так...
Спасибо!

Оффлайн oplkill

  • 34
  • Мощь: 0
  • Jungle race и Simple Dota 2 Editor
Найдена причина почему старые герои не удалялись!
У меня была включена эта настройка:
Код
ENABLE_HERO_RESPAWN = false
Видимо надо позволить им респавниться, но задать время респавна можно хоть 9999, труп и метки на экране исчезают сразу после появления замены.
« Последнее редактирование: 03-01-2016, 22:01:31 от oplkill »