155 lines
4.9 KiB
GDScript
155 lines
4.9 KiB
GDScript
# MIT License
|
|
#
|
|
# Copyright (c) 2020-2020 Macaroni Studios AB
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
# SOFTWARE.
|
|
|
|
class_name GotmLobby
|
|
#warnings-disable
|
|
|
|
# A lobby is a way of connecting players with eachother as if they
|
|
# were on the same local network.
|
|
#
|
|
# Lobbies can be joined either directly through an 'invite_link', or by
|
|
# joining lobbies fetched with the 'GotmLobbyFetch' class.
|
|
|
|
##############################################################
|
|
# SIGNALS
|
|
##############################################################
|
|
# Peer joined the lobby.
|
|
# 'peer_user' is a 'GotmUser' instance.
|
|
# This is only emitted if you are in this lobby.
|
|
signal peer_joined(peer_user)
|
|
|
|
# Peer left the lobby.
|
|
# 'peer_user' is a 'GotmUser' instance.
|
|
# This is only emitted if you are in this lobby.
|
|
signal peer_left(peer_user)
|
|
|
|
|
|
|
|
##############################################################
|
|
# READ-ONLY PROPERTIES
|
|
##############################################################
|
|
# Globally unique identifier.
|
|
var id: String
|
|
|
|
# Other peers in the lobby with addresses.
|
|
# Is an array of 'GotmUser'.
|
|
var peers: Array = []
|
|
|
|
# You with address.
|
|
var me: GotmUser = GotmUser.new()
|
|
|
|
# Host user with address.
|
|
var host: GotmUser = GotmUser.new()
|
|
|
|
# Peers can join the lobby directly through this link.
|
|
var invite_link: String
|
|
|
|
|
|
|
|
##############################################################
|
|
# WRITABLE PROPERTIES
|
|
##############################################################
|
|
# Note that only the host can write to these properties.
|
|
|
|
# Name that is searchable using 'GotmLobbyFetch'
|
|
# Names longer than 64 characters are truncated.
|
|
var name: String = ""
|
|
|
|
# Prevent the lobby from showing up in fetches?
|
|
# Peers may still join directly through 'invite_link'
|
|
var hidden: bool = true
|
|
|
|
# Prevent new peers from joining?
|
|
# Also prevents the lobby from showing up in fetches.
|
|
var locked: bool = false
|
|
|
|
|
|
|
|
##############################################################
|
|
# METHODS
|
|
##############################################################
|
|
# Asynchronously join this lobby after leaving current lobby.
|
|
#
|
|
# Use 'var success = yield(lobby.join(), "completed")' to wait for the call to complete
|
|
# and retrieve the return value.
|
|
#
|
|
# Sets 'Gotm.lobby' to the joined lobby if successful.
|
|
#
|
|
# Asyncronously returns true if successful, else false.
|
|
func join() -> bool:
|
|
return yield(_GotmImpl._join_lobby(self), "completed")
|
|
|
|
|
|
# Leave this lobby.
|
|
func leave() -> void:
|
|
_GotmImpl._leave_lobby(self)
|
|
|
|
|
|
# Am I the host of this lobby?
|
|
func is_host() -> bool:
|
|
return _GotmImpl._is_lobby_host(self)
|
|
|
|
|
|
# Get a custom property.
|
|
func get_property(name: String):
|
|
return _GotmImpl._get_lobby_property(self, name)
|
|
|
|
|
|
|
|
################################
|
|
# Host-only methods
|
|
################################
|
|
# Kick peer from this lobby.
|
|
# Returns true if successful, else false.
|
|
func kick(peer: GotmUser) -> bool:
|
|
return _GotmImpl._kick_lobby_peer(self, peer)
|
|
|
|
|
|
# Store up to 10 of your own custom properties in the lobby.
|
|
# These are visible to other peers when fetching lobbies.
|
|
# Only properties of types String, int, float or bool are allowed.
|
|
# Integers are converted to floats.
|
|
# Strings longer than 64 characters are truncated.
|
|
# Setting 'value' to null removes the property.
|
|
func set_property(name: String, value) -> void:
|
|
_GotmImpl._set_lobby_property(self, name, value)
|
|
|
|
|
|
# Make this lobby filterable by a custom property.
|
|
# Filtering is done when fetching lobbies with 'GotmLobbyFetch'.
|
|
# Up to 3 properties can be set as filterable at once.
|
|
func set_filterable(property_name: String, filterable: bool = true) -> void:
|
|
_GotmImpl._set_lobby_filterable(self, property_name, filterable)
|
|
|
|
|
|
# Make this lobby sortable by a custom property.
|
|
# Sorting is done when fetching lobbies with 'GotmLobbyFetch'.
|
|
# Up to 3 properties can be set as sortable at once.
|
|
func set_sortable(property_name: String, sortable: bool = true) -> void:
|
|
_GotmImpl._set_lobby_sortable(self, property_name, sortable)
|
|
|
|
|
|
|
|
################################
|
|
# PRIVATE
|
|
################################
|
|
var _impl: Dictionary = {}
|