Урок panorama. Делаем связь между javascript и lua

Spoof1x

Пользователь
16 Авг 2023
14
4
Проект
дота 2 кастомка
Всем привет! Короче я хочу показать как совместить какую-нибудь функцию в js файле с lua.
И так, для начала если вы не знаете как сделать обычную панель с кнопкой ищете гайд на просторах кастом геймса
Предположим , что у вас уже есть кнопка , которая выполняет какую-то функцию(принтит в консоль что-то), давайте сделаем , чтобы эта функция например передавала сообщение в Lua скрипт и lua скрипт выведет его
JavaScript:
function test() {
    $.Msg("da")
    var data = {
        key: "test"
    }
    GameEvents.SendCustomGameEventToServer( "любое_название", data ); -- сама штука, передающая сигнал из js в луа
}
да, где написано любое название это название самого сигнала(оно может быть любым) , поэтому это и будет название моего сигнала/
Lua:
CustomGameEventManager:RegisterListener( "любое_название", test ) -- слушатель , который слушает сигнал в луа, ставьте в init , ибо иногда может тупить
function test(_,data)
    print(data.key)
end
обязательно этот скрипт должен быть в файле , который подгружен через require, ибо не получится
Снимок экрана 2023-09-26 193630.png
ну что ж , а что там по сигналам из lua в Javascript, ведь клиентов может быть много, а сервер то один , как быть, а валвы молодцы, ведь сделали, что можно посылать сигнал как всем клиентам, так и определенной команде или вообще одному игроку, давай рассмотрим способ посылания сигнала всем игрокам.
Lua:
CustomGameEventManager:Send_ServerToAllClients( "название сигнала", массив ) -- посылает всем клиентам
CustomGameEventManager:Send_ServerToTeam( team_number, "название сигнала", массив )-- посылает определенной команде
CustomGameEventManager:Send_ServerToPlayer(player_entity, "название сигнала", массив ) -- посылает определенному игроку
Lua:
function test()
    local data = {
        name = "test",
    }
    CustomGameEventManager:Send_ServerToAllClients( "любое_название",  data)
end
не забываем вызывать эту функцию где-то в инициализации или активации
теперь примем его в js

JavaScript:
GameEvents.Subscribe( "любое_значение", test); // что-то типо слушателя в lua только в js , test - функция которая вызовится


function test(data) {
    $.Msg(data.name) // принтим значение из массива data(точнее name) которое мы указали в lua
}
Снимок экрана 2023-09-26 211942.png
Думаю вы разобрались как и что, давайте я попробую создать кнопку при которой дается +50 голды, как я создавал кнопку показывать не буду, покажу лишь место как я передавал это , чтобы вы усвоили знания
JavaScript:
function OnButtonPressed() { // функция которая указана в кнопке
    var data = {
        playerID : Players.GetLocalPlayer() // передаем айди клиента, ибо как луа узнает кому давать 50 голды
    }
    GameEvents.SendCustomGameEventToServer( "сигнал", data ); // сама передача сигнала
 
}
теперь луа
Lua:
function test(_,data)
    local playerID = data.playerID -- получаем айди из массива
    local player = PlayerResource:GetPlayer(playerID) -- получаем игрока по айди
    local hero = player:GetAssignedHero()-- не забываем получить героя игрока, а то не получися и будет ошибка
    hero:ModifyGold(50, true, DOTA_ModifyGold_Unspecified) -- собственна даем голду
    print("easy")
end
-- слушатель я поставил в initgamemode ибо почему-то он не хотел работать, но это не настолько важно
1695754246116.png
xD но результат есть, будут вопросики , задавайте xD
Мой первый гайдик, не судите строго, возможно для кого-то это покажется самой базой из всех баз, но когда я пытался сделать что-то подобное не было не одного гайда, думаю щас кому-то понадобится <3
 
Последнее редактирование:
Реклама: