Transferir la propiedad de un objeto
Transferir la propiedad de un objeto
Los objetos dinámicos de Eco tienen un propietario que determina quién puede actuar como autoridad sobre ellos. La propiedad puede cambiarse durante la vida del objeto siempre que el nuevo propietario pertenezca al mismo canal.
Importante
Los objetos estáticos no permiten cambiar de propietario. La transferencia de propiedad está destinada a objetos dinámicos.
Identificar al propietario
Objeto expone tres formas relacionadas para consultar la propiedad:
objeto.owner
objeto.ownerID
objeto.isMineowner devuelve el Jugador, ownerID su identificador y isMine indica si el objeto pertenece al jugador local. fileciteturn212file0
Transferir a otro jugador
La propiedad puede asignarse mediante owner o ownerID:
objeto.owner = jugador;También puede utilizarse el identificador:
objeto.ownerID = jugador.id;Eco valida que el objeto sea dinámico y que el jugador destino pertenezca al canal del objeto. Si la comprobación es válida, actualiza primero el propietario local y envía una solicitud RequestSetOwner al servidor. fileciteturn212file0 fileciteturn213file0
Cliente
│
│ RequestSetOwner
▼
Servidor
│
├── valida jugador
├── actualiza propiedad
└── propaga el nuevo propietarioCondición: mismo canal
No debe intentarse transferir un objeto a un jugador que no esté en su canal.
Canal 10
├── Objeto 100
│ └── Propietario: Jugador A
├── Jugador A
└── Jugador B ← destino válido
Canal 20
└── Jugador C ← destino inválidoLa implementación comprueba Eco.EstaJugadorEnCanal(value, channelID) antes de enviar la solicitud. fileciteturn213file0
Transferencia a nadie
Asignar ownerID = 0 elimina el propietario explícito:
objeto.ownerID = 0;El protocolo permite este valor y Eco lo envía mediante RequestSetOwner. fileciteturn213file0
El significado exacto de un objeto sin propietario debe decidirse dentro de la arquitectura del juego; no debe confundirse automáticamente con "propiedad del servidor".
Autoridad y diseño de gameplay
La propiedad debe formar parte del diseño de autoridad de la entidad. Un patrón habitual es:
Objeto de jugador
↓
Propietario = jugador que lo controla
Objeto compartido
↓
Propietario = autoridad elegida por el juego
Objeto estático
↓
Propiedad no transferibleNo conviene utilizar isMine como sustituto de todas las comprobaciones de autoridad. isMine sólo responde a si el propietario actual coincide con el jugador local.
Propiedad y sincronización
Transferir propiedad no sustituye a la sincronización del estado. Son dos operaciones diferentes:
Cambiar propietario
│
└── determina quién tiene autoridad
Sincronizar estado
│
└── distribuye los datos del objetoDespués de una transferencia, la lógica del nuevo propietario debe utilizar el sistema de sincronización y RFC apropiado para continuar actualizando el objeto.
Relación con canales
La propiedad está asociada al canal del objeto. Por tanto, cambiar de canal y transferir propiedad son operaciones distintas:
Transferencia
Objeto ───────────→ nuevo jugador
Cambio de canal
Objeto ───────────→ nuevo canalLa implementación de Objeto también expone onTransfer para notificar cuando un objeto está siendo transferido a otro canal. fileciteturn212file0
Errores frecuentes
Intentar cambiar el propietario de un objeto estático
Eco rechaza esta operación porque los IDs estáticos no permiten cambiar de propietario. fileciteturn212file0
Asignar un jugador de otro canal
El destino debe estar en el mismo canal que el objeto. La implementación comprueba esta condición antes de enviar la petición. fileciteturn213file0
Suponer que isMine concede autoridad automáticamente
isMine describe la propiedad local; la lógica de autoridad del juego sigue siendo responsabilidad de la integración.
Referencias
Objeto
Identidad, ownership, ciclo de vida y estado de los objetos de red.
Sincronizar una entidad
Cómo mantener el estado sincronizado después de establecer la autoridad.
Instanciar y destruir objetos
Creación dinámica, IDs y destrucción de objetos.
TNet
Repositorio upstream de la arquitectura heredada.
