OverviewFilesCommitsIssuesDocsReleasesPeers

godot-tumble_player_demo / levels / level_script.gd

91 lines · gd ref:
extends Node

onready var hyperGateway : HyperGateway
onready var hyperGossip : HyperGossip
onready var player_local : KinematicBody
onready var snapshotTimer : Timer

const knownPlayers = {}

signal new_player(id)

const EVENT_PLAYER_SNAPSHOT = 'player_snapshot'
const EVENT_PLAYER_MOVE = 'player_move'

var RemotePlayer = preload("res://TPS_controller_3.3/TPS_new_remote_player.tscn")

func _ready():
	if !hyperGateway:
		hyperGateway = get_node("../HyperGodot/HyperGateway")
	if !player_local:
		player_local = get_node("../Players/PlayerLocal")
	if !hyperGossip:
		hyperGossip = get_node("../HyperGodot/HyperGossip")
	if !snapshotTimer:
		snapshotTimer = get_node("../HyperGodot/GossipEventTimer")

func _on_HyperGossip_event(type, data, from):
	if type == EVENT_PLAYER_SNAPSHOT:
		on_remote_player_snapshot(data, from)
	elif type == EVENT_PLAYER_MOVE:
		on_remote_player_move(data, from)

func get_player_object(id):
	if knownPlayers.has(id): return knownPlayers[id]

	var remotePlayer = RemotePlayer.instance()
	knownPlayers[id] = remotePlayer

	add_child(remotePlayer)
	_broadcast_player_snapshot()

	return remotePlayer


func _broadcast_player_snapshot():
	var translation : Vector3 = player_local.translation
	var rotation : Vector3 = player_local.rotation_degrees
	
	var data = {
		#"profile": profile,
		"translation": {
			"x": translation.x,
			"y": translation.y,
			"z": translation.z
		},
		"rotation": {
			"x": rotation.x,
			"y": rotation.y,
			"z": rotation.z
		}
	}
	# print('Broadcasting', data)
	hyperGossip.broadcast_event(EVENT_PLAYER_SNAPSHOT, data)
	
func on_remote_player_snapshot(positionData, id):
	var remotePlayer = get_player_object(id)

	var translation : Vector3 = Vector3(positionData.translation.x, positionData.translation.y, positionData.translation.z)
	var rotation : Vector3 = Vector3(positionData.rotation.x, positionData.rotation.y, positionData.rotation.z)
	
	remotePlayer.update_position(
		translation,
		rotation
	)
func on_remote_player_move(directionData, id):
	var remotePlayer = get_player_object(id)
	remotePlayer.inputDirection = directionData

func _on_HyperGossip_listening(extension_name):
	_broadcast_player_snapshot()


func _on_GossipEventTimer_timeout():
	if hyperGateway.getIsGatewayRunning():
		_broadcast_player_snapshot()


func _on_HyperDebugUI_gossip_update_rate_changed(seconds : float):
	snapshotTimer.wait_time = seconds
	snapshotTimer.start(seconds)