Godot 4 · GDScript
Группы и кланы
Группы (кланы/гильдии) позволяют игрокам объединяться. Игрок принадлежит максимум к одной группе. Членство имеет роли и права, которые применяются на сервере.
Требования
Группы должны быть включены для вашей игры (в панели) и входить в ваш тариф. Если отключены, вызовы групп завершаются неудачей с error_code "forbidden".
Политики вступления: open (любой вступает мгновенно), request (требуется одобрение), invite_only и closed.
Создание группы
Создайте группу; вызывающий становится её лидером. При желании передайте тег, описание, политику вступления и лимит участников. Слушайте 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("Created %s" % group.name)
else: print("Failed: %s" % error_code) # e.g. 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
}Обзор и вступление
Получите список или найдите группы, затем вступите в одну. join_group работает только для открытых групп; для групп с политикой request вместо этого отправьте запрос на вступление (ниже).
Gamdato.groups_listed.connect(_on_groups)
Gamdato.list_groups("dra") # search by name
Gamdato.group_joined.connect(_on_joined)
Gamdato.join_group(group_id) # open groups only
func _on_groups(groups: Array) -> void:
for grp in groups:
print("%s - %d members" % [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
}Сведения о группе и участники
Получите полные сведения о группе вместе со списком её участников. Опустите id, чтобы получить свою группу. Приходит через group_info_loaded.
Gamdato.group_info_loaded.connect(_on_group_info)
Gamdato.get_group_info() # your own group
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
}Приглашения (от группы игроку)
Участники с правами приглашают игроков, получают список приглашений и отвечают на адресованные им.
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) # accept# 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
}Запросы на вступление (от игрока группе)
Для групп с политикой request: игрок просит вступить, а проверяющий (с правами) одобряет или отклоняет.
Gamdato.group_request_created.connect(_on_req)
Gamdato.create_group_request(group_id, "Please let me in")
# Reviewer side:
Gamdato.list_group_requests("incoming") # -> group_requests_listed
Gamdato.respond_group_request(request_id, true) # approve# 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
}Управление участниками
Лидеры и офицеры управляют составом: исключают участника, меняют роль участника или передают лидерство.
Gamdato.kick_group_member(player_key)
Gamdato.assign_group_role(player_key, "admin") # not "leader"
Gamdato.transfer_group_leadership(player_key)Роли и ранги применяются на стороне сервера. Отсутствие прав возвращает error_code "forbidden" или "insufficient_rank". Чтобы сделать кого-то лидером, используйте transfer_group_leadership, а не assign_group_role.
Выход или роспуск
Участник покидает группу; лидер может полностью её распустить.
Gamdato.group_left.connect(_on_left)
Gamdato.leave_group() # status: "left" or "disbanded"
Gamdato.disband_group() # leader only
func _on_left(ok: bool, status: String, error_code: String) -> void:
if ok: print("You %s the group" % status)