Godot 4 · GDScript
Grupos y clanes
Los grupos (clanes/gremios) permiten que los jugadores se unan. Un jugador pertenece como maximo a un grupo. La membresia tiene roles y permisos, todo validado en el servidor.
Requisitos
Los grupos deben estar habilitados para tu juego (en el panel) e incluidos en tu plan. Si estan deshabilitados, las llamadas de grupo fallan con error_code "forbidden".
Politicas de ingreso: open (cualquiera entra al instante), request (requiere aprobacion), invite_only y closed.
Crear un Grupo
Crea un grupo; quien lo llama se convierte en su lider. Opcionalmente puedes pasar una etiqueta, descripcion, politica de ingreso y limite de miembros. Escucha group_created.
Gamdato.group_created.connect(_on_group_created)
Gamdato.create_group("Dragons", {"tag": "DRG", "join_policy": "request"})
func _on_group_created(ok: bool, group: Dictionary, error_code: String) -> void:
if ok: print("Creado %s" % group.name)
else: print("Fallo: %s" % error_code) # ej. name_taken, already_in_group# group: Dictionary
{
"id": String, # pass this to join/info/request
"name": String,
"tag": String,
"description": String,
"join_policy": "open" | "request" | "invite_only" | "closed",
"max_members": int,
"member_count": int,
"created_at": String,
"my_role": String # your role in this group
}Explorar y Unirse
Lista o busca grupos, luego unete a uno. join_group solo funciona con grupos open; para grupos request, envia una solicitud de ingreso en su lugar (mas abajo).
Gamdato.groups_listed.connect(_on_groups)
Gamdato.list_groups("dra") # busca por nombre
Gamdato.group_joined.connect(_on_joined)
Gamdato.join_group(group_id) # solo grupos open
func _on_groups(groups: Array) -> void:
for grp in groups:
print("%s - %d miembros" % [grp.name, grp.member_count])# groups: Array, each group (no my_role here):
{
"id": String,
"name": String,
"tag": String,
"description": String,
"join_policy": String,
"max_members": int,
"member_count": int,
"created_at": String
}Detalles del Grupo y Miembros
Obtiene los detalles completos de un grupo junto con su lista de miembros. Omite el id para obtener tu propio grupo. Llega por la senal group_info_loaded.
Gamdato.group_info_loaded.connect(_on_group_info)
Gamdato.get_group_info() # tu propio grupo
func _on_group_info(group: Dictionary, members: Array) -> void:
if group.is_empty():
return
for m in members:
print("%s - %s" % [m.player_name, m.role])# group: Dictionary (same shape as Create a Group), or {} if you have none
# members: Array, each member:
{
"player_key": String,
"player_name": String,
"role": String,
"joined_at": String
}Invitaciones (del Grupo al Jugador)
Los miembros con permiso invitan jugadores, listan invitaciones y responden las que van dirigidas a ellos.
Gamdato.group_invite_sent.connect(_on_g_invite)
Gamdato.send_group_invite(player_key, "Join us!")
Gamdato.group_invitation_responded.connect(_on_g_resp)
Gamdato.list_group_invitations("incoming") # -> group_invitations_listed
Gamdato.respond_group_invitation(invitation_id, true) # aceptar# group_invitations_listed -> invitations: Array, each:
{
"id": String,
"direction": "incoming" | "outgoing",
"group_id": String,
"group_name": String,
"counterpart": {
"player_key": String,
"player_name": String
},
"status": String,
"message": String,
"created_at": String,
"responded_at": String, # null while pending
"expires_at": String
}Solicitudes de Ingreso (del Jugador al Grupo)
Para grupos request: un jugador pide unirse, y un revisor (con permiso) lo aprueba o rechaza.
Gamdato.group_request_created.connect(_on_req)
Gamdato.create_group_request(group_id, "Please let me in")
# Lado del revisor:
Gamdato.list_group_requests("incoming") # -> group_requests_listed
Gamdato.respond_group_request(request_id, true) # aprobar# group_requests_listed -> requests: Array, each:
{
"id": String,
"direction": "incoming" | "outgoing",
"group_id": String,
"group_name": String,
"player": {
"player_key": String,
"player_name": String
},
"status": String,
"message": String,
"created_at": String,
"responded_at": String # null while pending
}Gestionar Miembros
Lideres y oficiales gestionan la plantilla: expulsar a un miembro, cambiar el rol de un miembro o transferir el liderazgo.
Gamdato.kick_group_member(player_key)
Gamdato.assign_group_role(player_key, "admin") # no "leader"
Gamdato.transfer_group_leadership(player_key)Los roles y rangos se validan en el servidor. La falta de permiso devuelve error_code "forbidden" o "insufficient_rank". Para hacer lider a alguien usa transfer_group_leadership, no assign_group_role.
Salir o Disolver
Un miembro abandona el grupo; un lider puede disolverlo por completo.
Gamdato.group_left.connect(_on_left)
Gamdato.leave_group() # status: "left" o "disbanded"
Gamdato.disband_group() # solo el lider
func _on_left(ok: bool, status: String, error_code: String) -> void:
if ok: print("%s el grupo" % status)