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()
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 é:
- buscar os dados
- alterar os campos com setters comuns
- chamar
Update()
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(...)
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.
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
- Query Language & Data Retrieval — construção da seleção com
Key/Where/Withantes deUpdate/Delete - RPC & Server-side Game Logic — o Pipeline de Handlers e a semântica de aborto usada pelos métodos de extensão de Entity