Pular para o conteúdo principal

Mutação de dados e extensão de Models

Última atualização: 16 de julho de 2026

Esta página cobre dois assuntos relacionados: alterar dados do jogo através de Update() e Delete(), e estender Models com comportamento de domínio na forma de métodos RPC nomeados.


Mutação de dados​

Quando usar​

Use mutação quando precisar persistir mudanças nos dados do jogo como estado:

  • atualizar campos de objetos retornados por uma consulta e salvá-los com Update()
  • aplicar uma única operação de atualização inline com Update(handler)
  • remover objetos incluídos em uma seleção com Delete()
informação

Este é o caminho padrão quando o resultado precisa ser uma mudança de estado armazenada, que possa ser recuperada depois e, quando aplicável, observada através da camada de dados.

Regra de base​

O PlayServ não exige técnicas especiais para modificar dados. O fluxo é:

  1. buscar os dados
  2. alterar os campos com setters comuns
  3. chamar Update()
observação

Se uma escrita é permitida ou não depende de quem chama e da Table. Por padrão um cliente do jogo não pode escrever, e em uma Table pertencente a um Player o cliente só escreve nas próprias linhas. Veja Access Control se um Update() ou Delete() for recusado.

Atualizar uma seleção​

Selecione um conjunto de objetos, modifique-os e persista as mudanças.

var players = PlayServ.Model<Player>()
.Where(player => player.Level >= 10);

// modify every selected object
players.Map(p => {
p.Coins += 100;
});

// modify a single object in the selection
players[0].Coins += 500;

// persist changes
players.Update();

Atualizar com um Handler​

Você também pode atualizar com uma única chamada Update(...) e um Handler inline.

players.Update(p => {
p.Coins += 100;
});

Delete​

Para excluir todos os objetos incluídos na seleção:

players.Delete();

Extensão de Models​

Quando usar​

Use a extensão de Model quando precisar anexar comportamento de domínio a um tipo de Model e executá-lo como um método RPC:

  • definir o comportamento como um método de extensão sobre um Model, via a API de Handlers de RPC
  • invocar esse comportamento a partir do código do cliente sobre uma Entity já obtida — por exemplo, player.Shoot(...)
informação

A extensão de Model permite que operações de gameplay sejam expressas como uma ação explícita — um método — executada através do Pipeline de Handlers de RPC, incluindo o comportamento de aborto.

Como funciona​

Um Model pode ser estendido com métodos RPC próprios, atrelados a um tipo de Entity — por exemplo, um NPC nasce, um Player atira, um baú abre. Quando esses métodos RPC executam, os dados do Model funcionam como o contexto deles.

Este caminho é o adequado quando a operação representa uma ação nomeada associada a um tipo de Entity, e não uma atualização direta de campo.

Clienteplayer.Shoot(...)chamada RPCHandler no servidorDoShoot — Model como contextoreturn truereturn falseO Pipeline seguea ação é aplicadaO Pipeline abortaa ação é rejeitada

Servidor: definir um método de extensão

PlayServ.Server.Model<Player>()
.DoShoot(vector => {
return false; // abort pipeline
});

Cliente: chamar o método de extensão

var player = await PlayServ.GetPlayer(playerId);
player.Shoot(vector3d);

Próximos passos​