211 lines
7.0 KiB
GDScript
211 lines
7.0 KiB
GDScript
extends Node
|
|
|
|
signal pausing()
|
|
|
|
@onready var mainMenu = $CanvasLayer/MainMenu
|
|
@onready var baseMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/BaseMenu
|
|
@onready var hostMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Hosting
|
|
@onready var joinMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Joining
|
|
@onready var pauseMenu = $CanvasLayer/PauseMenu
|
|
@onready var optionMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu
|
|
@onready var addressEntry = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Joining/AddressEntry
|
|
@onready var username = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/BaseMenu/Username
|
|
@onready var hud = $CanvasLayer/HUD
|
|
@onready var healthbar = $CanvasLayer/HUD/HealthBar
|
|
@onready var upnpEnabled = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Hosting/upnpCheck
|
|
|
|
const SAVE_FILE: String = "user://options.res"
|
|
const Player = preload("res://Prefabs/player.tscn")
|
|
const PORT = 25565
|
|
var enet_peer = ENetMultiplayerPeer.new()
|
|
var paused: bool = false
|
|
var ingame: bool = false
|
|
var chimkin
|
|
var local_peer_id
|
|
|
|
@export var settings: Dictionary
|
|
@export var spawnpoint: Vector3 = Vector3(0, 6.376, 0)
|
|
|
|
func _unhandled_input(event):
|
|
#if (not is_multiplayer_authority()): return
|
|
if ingame and Input.is_action_just_pressed("quit"):
|
|
pause()
|
|
|
|
func _ready():
|
|
loadSave()
|
|
|
|
func _on_join_pressed():
|
|
baseMenu.hide()
|
|
joinMenu.show()
|
|
|
|
func _on_back_pressed_2(): #For join menu
|
|
joinMenu.hide()
|
|
baseMenu.show()
|
|
|
|
func _on_host_pressed():
|
|
baseMenu.hide()
|
|
hostMenu.show()
|
|
|
|
func _on_back_pressed_1(): #For host menu
|
|
hostMenu.hide()
|
|
baseMenu.show()
|
|
|
|
func _on_host_button_pressed():
|
|
hostMenu.hide()
|
|
mainMenu.hide()
|
|
hud.show()
|
|
ingame = true
|
|
|
|
enet_peer.create_server(PORT)
|
|
multiplayer.multiplayer_peer = enet_peer
|
|
multiplayer.peer_connected.connect(addPlayer)
|
|
multiplayer.peer_disconnected.connect(removePlayer)
|
|
addPlayer(multiplayer.get_unique_id())
|
|
if upnpEnabled.button_pressed:
|
|
upnpSetup()
|
|
|
|
func _on_join_button_pressed():
|
|
if addressEntry.text == "": return
|
|
joinMenu.hide()
|
|
mainMenu.hide()
|
|
hud.show()
|
|
ingame = true
|
|
|
|
enet_peer.create_client(addressEntry.text, PORT)
|
|
multiplayer.multiplayer_peer = enet_peer
|
|
|
|
func addPlayer(peer_id):
|
|
var player = Player.instantiate()
|
|
player.name = str(peer_id)
|
|
player.position = spawnpoint
|
|
add_child(player)
|
|
if player.is_multiplayer_authority():
|
|
player.healthChanged.connect(updateHealthBar)
|
|
local_peer_id = peer_id
|
|
|
|
func removePlayer(peer_id):
|
|
var player = get_node_or_null(str(peer_id))
|
|
if player:
|
|
player.queue_free()
|
|
|
|
func updateHealthBar(health):
|
|
healthbar.value = health
|
|
|
|
func _on_multiplayer_spawner_spawned(node):
|
|
if node.is_multiplayer_authority():
|
|
node.healthChanged.connect(updateHealthBar)
|
|
chimkin = node
|
|
|
|
func upnpSetup():
|
|
var upnp = UPNP.new()
|
|
var discoverResult = upnp.discover()
|
|
assert(discoverResult == UPNP.UPNP_RESULT_SUCCESS, "UPNP Discover Failed! Error %s" % discoverResult)
|
|
assert(upnp.get_gateway() and upnp.get_gateway().is_valid_gateway(), "UPNP Invalid Gateway!")
|
|
var mapResult = upnp.add_port_mapping(PORT)
|
|
assert(mapResult == UPNP.UPNP_RESULT_SUCCESS, "UPNP Port Mapping Failed! Error %s" % mapResult)
|
|
print("Success! Join Address: %s" % upnp.query_external_address())
|
|
|
|
func pause():
|
|
if paused:
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
|
pauseMenu.hide()
|
|
mainMenu.hide()
|
|
else:
|
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|
mainMenu.show()
|
|
pauseMenu.show()
|
|
paused = not paused
|
|
pausing.emit()
|
|
|
|
func _on_cancel_pressed():
|
|
optionMenu.hide()
|
|
baseMenu.show()
|
|
updateOptions()
|
|
|
|
func playerDisconnect(peer_id):
|
|
mainMenu.show()
|
|
enet_peer.disconnect_peer(peer_id, true)
|
|
|
|
func quit():
|
|
get_tree().quit()
|
|
|
|
func _on_main_menu_pressed():
|
|
var player = get_node_or_null(str(local_peer_id))
|
|
enet_peer.close()
|
|
|
|
func save():
|
|
var save_game = FileAccess.open(SAVE_FILE, FileAccess.WRITE)
|
|
save_game.store_line(JSON.stringify(settings))
|
|
save_game.close()
|
|
|
|
func loadSave():
|
|
if not FileAccess.file_exists(SAVE_FILE):
|
|
initSave()
|
|
var save_game = FileAccess.open(SAVE_FILE, FileAccess.WRITE)
|
|
save_game.store_line(JSON.stringify(settings))
|
|
save_game.close()
|
|
else:
|
|
var save_game = FileAccess.open(SAVE_FILE, FileAccess.READ)
|
|
var json = JSON.new()
|
|
json.parse(save_game.get_line())
|
|
settings = json.get_data()
|
|
save_game.close()
|
|
if settings["vsync"]:
|
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
|
|
else:
|
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
|
|
updateOptions()
|
|
|
|
func updateOptions():
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/FOV").value = settings["fov"]
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/Sensitivity").value = settings["sensitivity"]
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MasterVolume").value = settings["master_volume"]
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MusicVolume").value = settings["music_volume"]
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SoundFXVolume").value = settings["soundFX_volume"]
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/VSyncBox").button_pressed = settings["vsync"]
|
|
|
|
func initSave():
|
|
settings = {"fov": 75,
|
|
"sensitivity": 50,
|
|
"master_volume": 70,
|
|
"music_volume": 70,
|
|
"soundFX_volume": 70,
|
|
"vsync": true}
|
|
updateOptions()
|
|
|
|
func _on_apply_pressed():
|
|
settings = {
|
|
"fov": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/FOV").value,
|
|
"sensitivity": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/Sensitivity").value,
|
|
"master_volume": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MasterVolume").value,
|
|
"music_volume": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MusicVolume").value,
|
|
"soundFX_volume": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SoundFXVolume").value,
|
|
"vsync": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/VSyncBox").button_pressed
|
|
}
|
|
save()
|
|
if settings["vsync"]:
|
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
|
|
else:
|
|
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
|
|
baseMenu.show()
|
|
optionMenu.hide()
|
|
|
|
func _on_options_pressed():
|
|
optionMenu.show()
|
|
baseMenu.hide()
|
|
|
|
func _on_fov_value_changed(value):
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/FOVNum").text = str(value)
|
|
|
|
func _on_sensitivity_value_changed(value):
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SensitivityNum").text = str(value)
|
|
|
|
func _on_master_volume_value_changed(value):
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MasterVolumeValue").text = str(value)
|
|
|
|
func _on_music_volume_value_changed(value):
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MusicVolumeNum").text = str(value)
|
|
|
|
func _on_sound_fx_volume_value_changed(value):
|
|
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SoundFXVolumeValue").text = str(value)
|