Basic client that understands factions

This commit is contained in:
2020-09-05 17:45:07 -04:00
parent ab3f05f013
commit ae3ecb03c5
53 changed files with 432 additions and 8 deletions

View File

@ -0,0 +1,13 @@
extends Sprite
export var faction = 1 setget set_faction, get_faction
func _ready():
set_faction(faction)
func set_faction(new_faction):
faction = new_faction
texture = load("res://art/entities/player/dev/dev_player_" + str(faction) + ".png")
func get_faction():
return faction

View File

@ -0,0 +1,16 @@
extends Node
export(NodePath) var nameTextEdit
export(NodePath) var factionButtonsNode
onready var nameEdit : LineEdit = get_node(nameTextEdit)
onready var factionButtons = get_node(factionButtonsNode)
func _on_Button_button_down():
if nameEdit.text != "":
if factionButtons.currently_selected:
for i in range(1,len(GameData.factions)):
if GameData.factions[i] == factionButtons.currently_selected:
var created_char = yield(ServerConnection.create_character_async(nameEdit.text, i), "completed")
if created_char:
get_tree().change_scene("res://scenes/World.tscn")

View File

@ -0,0 +1,20 @@
extends Node
signal selection_updated(faction)
var currently_selected : String
func _ready():
get_child(0).queue_free()
for faction in GameData.factions:
if faction == "Electus":
return
var faction_button = Button.new()
faction_button.icon = load("res://art/gui/banners/" + faction.to_lower() + ".png")
faction_button.connect("button_down", self, "on_faction_select", [faction])
add_child(faction_button)
func on_faction_select(faction):
currently_selected = faction
emit_signal("selection_updated", faction)

View File

@ -0,0 +1,14 @@
extends LineEdit
var invalid_chars = " '.,;/\\,[](){}!@#$%^&*-=|_+1234567890\""
func _ready():
connect("text_changed", self, "validate_name")
func validate_name(name):
var cursor_pos = caret_position
for character in invalid_chars:
if character in text:
text = text.replace(character, "")
caret_position = cursor_pos

View File

@ -0,0 +1,8 @@
extends Node
var factions = [
"Burningwall",
"Lunaki",
"Regium",
"Electus"
]

View File

@ -4,19 +4,21 @@ signal tile_update(tile_data)
signal player_joined(user_id)
signal player_left(user_id)
signal player_pos_update(user_id, pos)
signal player_state_update(user_id, user_name, faction)
const KEY := "defaultkey"
const SERVER_ENDPOINT := "nakama.cloudsumu.com"
var _session : NakamaSession
var _client : NakamaClient = Nakama.create_client(KEY, SERVER_ENDPOINT, 7350, "http")
var _client : NakamaClient = Nakama.create_client(KEY, SERVER_ENDPOINT, 7350, "http", Nakama.DEFAULT_TIMEOUT, NakamaLogger.LOG_LEVEL.ERROR)
var _socket : NakamaSocket
var _precenses : Dictionary = {}
var _world_id
enum OPCODE {
tile_update = 1,
update_position = 2
update_position = 2,
player_state = 3
}
func authenticate_async(email : String, password : String) -> NakamaException:
@ -62,6 +64,11 @@ func join_world_async() -> Dictionary:
var match_join_result : NakamaRTAPI.Match = yield(_socket.join_match_async(world.payload), "completed")
if match_join_result.is_exception():
print("Join match error: %s - %s" % [match_join_result.exception.status_code, match_join_result.exception.message])
# THIS SECTION NEEDS TO BE UPADTED TO BE DECOUPLED
# IT SHOULD ALSO NOT CATCH ALL JOIN ERRORS!
get_tree().change_scene("res://scenes/CharacterCreation.tscn")
return {}
_world_id = world.payload
@ -95,7 +102,17 @@ func _on_socket_received_match_state(match_state: NakamaRTAPI.MatchData):
OPCODE.update_position:
var pos_data = JSON.parse(match_state.data).result
emit_signal("player_pos_update", pos_data["player"], Vector2(float(pos_data["x"]), float(pos_data["y"])))
OPCODE.player_state:
var state_data = JSON.parse(match_state.data).result
emit_signal("player_state_update", state_data["player"], state_data["name"], state_data["faction"])
func send_player_position(position : Vector2) -> void:
_socket.send_match_state_async(_world_id, OPCODE.update_position, JSON.print({X = str(position.x), Y = str(position.y)}))
func create_character_async(name : String, faction : int) -> Dictionary:
var character_response : NakamaAPI.ApiRpc = yield(_client.rpc_async(_session, "create_character", JSON.print({"name":name, "faction" : faction})), "completed")
if character_response.is_exception():
print("Create character error occured: %s" % character_response.exception.message)
return false
return true

View File

@ -11,6 +11,7 @@ func _ready():
ServerConnection.connect("player_joined", self, "on_player_join")
ServerConnection.connect("player_left", self, "on_player_leave")
ServerConnection.connect("player_pos_update", self, "on_player_pos_update")
ServerConnection.connect("player_state_update", self, "on_player_state_update")
func on_player_join(user_id):
@ -29,3 +30,12 @@ func on_player_pos_update(user_id, pos):
if user_id != ServerConnection._session.user_id:
var player_puppet : Node2D = puppets[user_id]
player_puppet.global_position = pos
func on_player_state_update(user_id, user_name, faction):
if user_id != ServerConnection._session.user_id:
if user_id in puppets:
var player_puppet : Node2D = puppets[user_id]
player_puppet.name = user_name
player_puppet.set_faction(faction)
else:
print("Could not update player state for nonexisting player!")