Ir para o conteúdo principal
Version: bleeding-edge 🩸

Comunicação de pacotes

Tudo o que você precisa saber para se comunicar entre pacotes diferentes

No mundo nanos há 3 maneiras principais que você pode interagir com outros Pacotes. Nesta página vamos explicar em detalhes como fazer isso.

Eventos Personalizados

tip

Para mais informações e exemplos sobre o uso de eventos personalizados, por favor consulte os eventos.

Comunicação com pacotes do mesmo lado

Eventos personalizados são a maneira mais fácil de enviar dados ou informações para outros pacotes:

PackageOne/Server/Index.lua
local meu_parameter1 = 123
local meu_parameter2 = "olá lá"
local meu_parâmetroter3 = { important_stuff = "omg!" }

Eventos.Call("MyAwesomeEvent", meu_parameter1, meu_parâmetroter2, meu_parameter3)
PackageTwo/Server/Index.lua
Events.Subscribe("MyAwesomeEvent", function(parameter1, parameter2, parameter3)
Package.Log("Recebido " .. parameter1) -- Recebido 123
Pacote.Log("Recebido " .. parameter2) -- Recebido olá lá
Pacote.Log("Recebido " .. parâmetro3) -- Tabela recebida
fim)
info

Nota: Chamar eventos ativará o evento em todos os Pacotes.

Enviando dados através da rede

Enviar informações através da rede não é diferente de enviar pelo mesmo lado:

Server/Index.lua
local my_parameter1 = "dados legais da rede"

-- Chame este evento para todos os jogadores
eventos. roadcastRemote("GetThisFromServer", my_parameter1)

player_02 = GetPlayerSomehow()

-- Ou chame este evento para um jogador específico
Eventos.CallRemote("GetThisFromServer", player_02, meu_parâmetroter1)
Client/Index.lua
Events.Subscribe("GetThisFromServer", function(parameter1, parameter2, parameter3)
Package.Log("Recebido " .. parâmetro 1) -- Dados legais recebidos da rede
fim)
info

Nota: Chamando eventos de rede ativará o evento em todos os Pacotes do outro lado.

Funções exportadas de pacotes

Outra forma de comunicação é usando Funções Exportadas. Com Funções Exportadas, você pode definir funções em seu pacote, que podem ser chamadas por qualquer outro Pacote e ter um valor retornado.

info

Ao contrário dos eventos, funções exportadas podem retornar valores para o chamador. Mas você só pode chamar Funções Exportadas do mesmo lado (Servidor ou Cliente).

Exportando uma função

Para exportar funções, use o método Package.Export():

PackageOne/Server/Index.lua
-- Defines a function which you want to export
function SpawnCoolWeapon(location, rotation)
local cool_weapon = Weapon(location or Vector(), rotation or Rotator(), ...)
return arma_legal
fim

-- Exporta a função a ser chamada por outros Pacotes
Pacote.Export("SpawnCoolWeapon", SpawnCoolWeapon)

Chamando uma função exportada de outro pacote

Para chamar uma função exportada por outro pacote, use o método Package.Call():

PackageTwo/Server/Index.lua
-- Chama a função exportada
local cool_weapon = Package.Call("Pacote","SpawnCoolWeapon", Vector(), Rotador())

Usando Requerimento do Pacote

A última maneira de comunicar entre pacotes é carregando outros pacotes dentro do pacote atual:

PackageOne/Server/Index.lua
Package.Log("Olá do Pacote Um!")
PackageTwo/Server/Index.lua
Package.RequirePackage("PacoteU")

Package.Log("Olá do pacote Two!")

Saída

Olá da Package One!
Olá da Pacote Dois!

This will load the file Index.lua from PackageOne into the VM of PackageOne where you called Package.RequirePackage().

Also the Required Package will be sent to the clients, then you can RequirePackage in the client side too.

tip

It's recommended to set your Required Packages as library and load it as requirement in the Package.toml, this way the package is sent to the clients too.