Урок [Mini-гайд] Как выдавать здоровье и ману при убийстве героя противника.

anufis_ok

Пользователь
6 Фев 2020
17
5
Проект
Anufis RPG
Это mini гайд как дать нашему герою хп и ману после убиства противника.
Данный гайд будет полезен для начинающего или любителя делать PvP кастомки.


0.1 Без помощи барбонов мы создали простой проект и назвали его YouProject.
0.2 <<Весь полноценный код я оставил в конце.>>

1. При создании с нуля у каждого проекта создаётся addon_game_mode.lua в папке game/dota_addons/YouProject/scripts/vscripts.
Внутри файла находиться стоковый код.
Безымянный.png
2. Для начала нам нужно создать нашу функцию.
Безымянный.png
CAddonTemplateGameMode - наш гейм мод.
OnEntityKilled - название функции.
3. Создаём 2 локальные переменные для убийцы и убитого.
Безымянный.png
eAttacker - убийца.
eKilled - тот кого убили.
4. Теперь прописываем само событие.
Безымянный.png
Я подробно описал каждое своё действие. Думаю здесь вопросов нет.
5. Если мы хотим что бы нам давало и ману и здоровье, то дополняем наше событие след. текстом.
Безымянный.png
5.1 Все значения можно изменять на ваш вкус. Если у героя будет 2000hp максимально а вы напишете допустим 100 000 в nHeal. То герой просто восстановит своё здоровье до максимума. Аналогично с маной.
Подробнее про то какие бываю API функции тут.
6. Ради интереса сделаем что бы при убийстве героя 2 над героем 1 писалось сколько он получил здоровья за его убийство.
Безымянный.png
Аналогично можно сделать и с маной.
7.Но это ещё не всё. Наша игра не будет знать что ей делать с данной функцией. Она просто её запустит но взаимодействовать с ней не будет. Это нужно исправить.
Выше нашего кода мы видим уже созданную функцию, она называется "InitGameMode".
Она запускается активатором (функция активирующая другую функцию для взаимодействия с игрой. Звучит как костыль, и всё это можно упростить, но мы делаем всё с 0 и забивать себе голову пока не стоит. o_O)
InitGameMode по сути он пустой, и ничего того что нам нужно он не делает.
Для этого создаём так называемый Event handler. "Обработчик события " (Создавать его мы будем в InitGameMode)
Безымянный.png
Для удобства выводим print, что бы мониторить его в консоли. (Это нужно для того что бы понять запустилась функция или нет. Полезная штука для того что бы найти ошибку в коде. Вбейте её себе в привычку.)
Готово! Теперь наш код пустился в оборот игры.
Заходим в игру и проверяем наше чудо.
Безымянный.png
P.S. Сразу скажу что у себя в коде я поставил значение nHeal = 750 000. Поэтому оно отображает +750000. Мана также восстановилась.
Код для ленивых людей:
Lua:
if CAddonTemplateGameMode == nil then
    CAddonTemplateGameMode = class({})
end

function Precache( context )
  
end

function Activate()
    GameRules.AddonTemplate = CAddonTemplateGameMode()
    GameRules.AddonTemplate:InitGameMode()
end

function CAddonTemplateGameMode:InitGameMode()
    print( "OnEntityKilled created!" )
    ListenToGameEvent("entity_killed", Dynamic_Wrap(CustomGameMode, "OnEntityKilled"), self)
    GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
end

function CAddonTemplateGameMode:OnThink()
    if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
    elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    end
    return 1
end


function CAddonTemplateGameMode:OnEntityKilled(keys)

    local eAttacker = EntIndexToHScript(keys.entindex_attacker)
    local eKilled = EntIndexToHScript(keys.entindex_killed)

    if eAttacker and eAttacker:IsHero() and eKilled:IsHero() then   --если герой 1 убил героя 2
        --то добавить ему хп
        local nHeal = 250   --захиленное здоровье в еденицах
        eAttacker:SetHealth(eAttacker:GetHealth() + nHeal)
        local nMana = 1000  --добавлено маны в еденицах
        eAttacker:SetMana(eAttacker:GetMana() + nMana)
        SendOverheadEventMessage(nil, OVERHEAD_ALERT_HEAL, eAttacker, nHeal, nil)    --выводим видимое сообщение с отлеченным здоровьем
    end
end
Гайд исключительно для начинающих кастомщиков. ;) Просьба не агрится на то что я всё тщательно разжевываю.
 

Вложения

Последнее редактирование:
  • Нравится
Реакции: kain, xDes и DDSuper

LAPKI

Активный
26 Окт 2018
127
29
Не агрюсь, просто конструктивные замечания
1. Слишком простая ситуация, которая даже человеком без навыков реализуется достаточно быстро, если делаете гайды, то либо описывайте теорию по тому, что проделали, либо используйте набор простых решений в составе сложного, чтобы ваш гайд был полезен, так как новечки, которые хотят этим заниматься сюда даже не зайдут, а новечки которые ничего не смыслят в этом и не хотят понимать как все работает скопипастят код и потом будет миллион вопросов по типу "как прикрутить это к моей реализации", хотя код элементарнейший.
2. Вы упомянули, что использовали шаблон barebones. Так зачем писать лишний код, когда слушатель уже вшит и более грамотно, а обработка смерти сущности есть в методе OnEntityKilled в файле events.lua, так почему же не переписать его?
3. Event handler это не событие, а, как можно понять из перевода, обработчик события, т.е. простыми словами это то, что выполняется, когда событие вызывается.
А что именно происходит (хотел расписать в технической лексике, но многие не поймут, так что буду по простому на пальцах) вы говорите системе "когда кто-то вызовет событие entity_killed выполнил код, который написан в методе OnEntityKilled класса CustomGameMode", (по технически - вы делигируете метод OnEntityKilled при вызове события entity_killed)
 

anufis_ok

Пользователь
6 Фев 2020
17
5
Проект
Anufis RPG
Не агрюсь, просто конструктивные замечания
1. Слишком простая ситуация, которая даже человеком без навыков реализуется достаточно быстро, если делаете гайды, то либо описывайте теорию по тому, что проделали, либо используйте набор простых решений в составе сложного, чтобы ваш гайд был полезен, так как новечки, которые хотят этим заниматься сюда даже не зайдут, а новечки которые ничего не смыслят в этом и не хотят понимать как все работает скопипастят код и потом будет миллион вопросов по типу "как прикрутить это к моей реализации", хотя код элементарнейший.
2. Вы упомянули, что использовали шаблон barebones. Так зачем писать лишний код, когда слушатель уже вшит и более грамотно, а обработка смерти сущности есть в методе OnEntityKilled в файле events.lua, так почему же не переписать его?
3. Event handler это не событие, а, как можно понять из перевода, обработчик события, т.е. простыми словами это то, что выполняется, когда событие вызывается.
А что именно происходит (хотел расписать в технической лексике, но многие не поймут, так что буду по простому на пальцах) вы говорите системе "когда кто-то вызовет событие entity_killed выполнил код, который написан в методе OnEntityKilled класса CustomGameMode", (по технически - вы делигируете метод OnEntityKilled при вызове события entity_killed)
1. Не согласен с вами. Люди понятия не имеют как и что сделать и лезут в гугл. Я просто привёл пример что бы люди хотя-бы имели представление что и как работает.
2. Почти никто из начинающих понятия не имеют что такое барбоны. А если и знают то сталкиваются с большим кол. гемора, по типу как убрать это, а оставить только это. Не советую вообще ними пользоваться ибо легче самому всё собрать что нужно. А слизывать от туда не все могут правильно.
3. Ошибся исправлю
 

Дикий Пёс

Продвинутый
28 Июн 2017
207
43
Проект
Petri Reborn
1. Не согласен с вами. Люди понятия не имеют как и что сделать и лезут в гугл. Я просто привёл пример что бы люди хотя-бы имели представление что и как работает.
2. Почти никто из начинающих понятия не имеют что такое барбоны. А если и знают то сталкиваются с большим кол. гемора, по типу как убрать это, а оставить только это. Не советую вообще ними пользоваться ибо легче самому всё собрать что нужно. А слизывать от туда не все могут правильно.
3. Ошибся исправлю
те люди которые понятия не имеют используют эти гайды максимум чтобы скопировать себе, хотеть чтото понимать их не заставить.
барбоны уже давно устарели, с ними только проблем больше, даже для новичков.

в гайде перевод названий переменных, но нет объяснений: что такое индекс, каким образом из него получается ентити, что название гейммода это класс, что такое классы впринципе, зачем прописывать в них функции если можно просто так, как работает принт, то что в нём можно выводить переменные, даже как открыть эту консоль нет и куда в ней смотреть, что такое апи функции, как на апи странице найти то что тебе нужно, и как это прописывать и так далее и тому подобное

чтобы понять этот гайд нужно уже знать как и что работает, по другому я хз как
 

anufis_ok

Пользователь
6 Фев 2020
17
5
Проект
Anufis RPG
те люди которые понятия не имеют используют эти гайды максимум чтобы скопировать себе, хотеть чтото понимать их не заставить.
барбоны уже давно устарели, с ними только проблем больше, даже для новичков.

в гайде перевод названий переменных, но нет объяснений: что такое индекс, каким образом из него получается ентити, что название гейммода это класс, что такое классы впринципе, зачем прописывать в них функции если можно просто так, как работает принт, то что в нём можно выводить переменные, даже как открыть эту консоль нет и куда в ней смотреть, что такое апи функции, как на апи странице найти то что тебе нужно, и как это прописывать и так далее и тому подобное

чтобы понять этот гайд нужно уже знать как и что работает, по другому я хз как
На подобный гайд ушёл бы не один час.
 
  • Нравится
Реакции: kain

xDes

Продвинутый
8 Ноя 2018
160
22
Проект
Boss Survival Adventure
мне кажется шикарный гайд, все подробно и с картинками, все супер, только жаль что большинство тупо копипастят даже не вникая
 
  • Нравится
Реакции: DDSuper и kain
Реклама: