Browse Source
fixed player count
fixed player count
61 changed files with 495 additions and 460 deletions
-
8default_env.tres
-
30project.godot
-
4resources/lanes/start/1.tres
-
4resources/lanes/start/2.tres
-
4resources/lanes/start/3.tres
-
4resources/lanes/start/4.tres
-
BINresources/ui/i18n.de.translation
-
BINresources/ui/i18n.en.translation
-
8scenes/game/Game.tscn
-
8scenes/menus/DirectHostMenu.tscn
-
13scenes/menus/DirectJoinMenu.tscn
-
2scenes/menus/MainMenu.tscn
-
1scenes/player/HumanPlayer.tscn
-
10scenes/player/Player.tscn
-
5scenes/road/roadBump.tscn
-
4scenes/road/roadCornerLarge.tscn
-
5scenes/road/roadCornerLargeFlipped.tscn
-
5scenes/road/roadCornerLarger.tscn
-
5scenes/road/roadCornerLargerFlipped.tscn
-
6scenes/road/roadCornerSmall.tscn
-
6scenes/road/roadCornerSmallFlipped.tscn
-
11scenes/road/roadCurved.tscn
-
11scenes/road/roadCurvedFlipped.tscn
-
6scenes/road/roadLoop.tscn
-
3scenes/road/roadRamp.tscn
-
2scenes/road/roadRampFlipped.tscn
-
3scenes/road/roadRampLong.tscn
-
3scenes/road/roadRampLongCurved.tscn
-
2scenes/road/roadRampLongCurvedFlipped.tscn
-
2scenes/road/roadRampLongFlipped.tscn
-
2scenes/road/roadStraight.tscn
-
2scenes/road/roadStraightLong.tscn
-
9scenes/road/roadStraightLongBump.tscn
-
5scenes/road/roadStraightSkew.tscn
-
5scenes/road/roadStraightSkewFlipped.tscn
-
170scripts/game/game.gd
-
152scripts/game/gamestate.gd
-
6scripts/game/local_storage.gd
-
6scripts/game/route.gd
-
59scripts/game/world.gd
-
4scripts/menus/direct_host.gd
-
13scripts/menus/direct_join.gd
-
2scripts/menus/ingame.gd
-
18scripts/menus/lobby.gd
-
2scripts/menus/main.gd
-
2scripts/menus/server.gd
-
2scripts/menus/server_create.gd
-
8scripts/networking/client.gd
-
4scripts/networking/game_server.gd
-
47scripts/networking/server.gd
-
10scripts/player/base_inventory.gd
-
46scripts/player/base_player.gd
-
46scripts/player/bot_controls.gd
-
2scripts/player/bot_inventory.gd
-
4scripts/player/human_controls.gd
-
3scripts/player/human_inventory.gd
-
10scripts/player/inventory_preview.gd
-
99scripts/player/player.gd
-
4scripts/player/race_car.gd
-
27scripts/road/road.gd
-
1scripts/road/roads_factory.gd
@ -1,9 +1,15 @@ |
|||||
[gd_resource type="Environment" load_steps=2 format=2] |
[gd_resource type="Environment" load_steps=2 format=2] |
||||
|
|
||||
[sub_resource type="ProceduralSky" id=1] |
[sub_resource type="ProceduralSky" id=1] |
||||
|
sky_top_color = Color( 1, 0.945098, 0.65098, 1 ) |
||||
|
sky_horizon_color = Color( 0.984314, 0.956863, 0.898039, 1 ) |
||||
|
ground_bottom_color = Color( 0, 0, 0, 1 ) |
||||
|
ground_horizon_color = Color( 0.321569, 0.321569, 0.321569, 1 ) |
||||
|
ground_curve = 0.00594603 |
||||
|
sun_color = Color( 0.980392, 0.815686, 0.376471, 1 ) |
||||
|
|
||||
[resource] |
[resource] |
||||
background_mode = 2 |
background_mode = 2 |
||||
background_sky = SubResource( 1 ) |
background_sky = SubResource( 1 ) |
||||
ambient_light_color = Color( 1, 1, 1, 1 ) |
|
||||
|
ambient_light_color = Color( 1, 0.980392, 0.929412, 1 ) |
||||
ambient_light_sky_contribution = 0.0 |
ambient_light_sky_contribution = 0.0 |
@ -1,13 +1,18 @@ |
|||||
[gd_scene load_steps=3 format=2] |
|
||||
|
[gd_scene load_steps=4 format=2] |
||||
|
|
||||
[ext_resource path="res://assets/road/roadCurved.obj" type="ArrayMesh" id=1] |
[ext_resource path="res://assets/road/roadCurved.obj" type="ArrayMesh" id=1] |
||||
[ext_resource path="res://resources/road/roadCurved.tres" type="Curve3D" id=2] |
|
||||
|
[ext_resource path="res://scripts/road/road.gd" type="Script" id=2] |
||||
|
[ext_resource path="res://resources/road/roadCurved.tres" type="Curve3D" id=3] |
||||
|
|
||||
[node name="roadCurved" type="MeshInstance"] |
[node name="roadCurved" type="MeshInstance"] |
||||
mesh = ExtResource( 1 ) |
mesh = ExtResource( 1 ) |
||||
material/0 = null |
material/0 = null |
||||
material/1 = null |
material/1 = null |
||||
material/2 = null |
material/2 = null |
||||
|
script = ExtResource( 2 ) |
||||
|
speed_constrains = PoolVector3Array( 0, 0.5, 0.14, 1.5, 2, 0.14 ) |
||||
|
force_penalties = PoolVector3Array( 0, 0, 4 ) |
||||
|
torque_penalties = PoolVector3Array( 0, 0, 2 ) |
||||
|
|
||||
[node name="Path" type="Path" parent="."] |
[node name="Path" type="Path" parent="."] |
||||
curve = ExtResource( 2 ) |
|
||||
|
curve = ExtResource( 3 ) |
@ -1,13 +1,18 @@ |
|||||
[gd_scene load_steps=3 format=2] |
|
||||
|
[gd_scene load_steps=4 format=2] |
||||
|
|
||||
[ext_resource path="res://assets/road/roadCurvedFlipped.obj" type="ArrayMesh" id=1] |
[ext_resource path="res://assets/road/roadCurvedFlipped.obj" type="ArrayMesh" id=1] |
||||
[ext_resource path="res://resources/road/roadCurvedFlipped.tres" type="Curve3D" id=2] |
|
||||
|
[ext_resource path="res://scripts/road/road.gd" type="Script" id=2] |
||||
|
[ext_resource path="res://resources/road/roadCurvedFlipped.tres" type="Curve3D" id=3] |
||||
|
|
||||
[node name="roadCurvedFlipped" type="MeshInstance"] |
[node name="roadCurvedFlipped" type="MeshInstance"] |
||||
mesh = ExtResource( 1 ) |
mesh = ExtResource( 1 ) |
||||
material/0 = null |
material/0 = null |
||||
material/1 = null |
material/1 = null |
||||
material/2 = null |
material/2 = null |
||||
|
script = ExtResource( 2 ) |
||||
|
speed_constrains = PoolVector3Array( 0, 0.5, 0.14, 1.5, 2, 0.14 ) |
||||
|
force_penalties = PoolVector3Array( 0, 0, 4 ) |
||||
|
torque_penalties = PoolVector3Array( 0, 0, 2 ) |
||||
|
|
||||
[node name="Path" type="Path" parent="."] |
[node name="Path" type="Path" parent="."] |
||||
curve = ExtResource( 2 ) |
|
||||
|
curve = ExtResource( 3 ) |
@ -1,150 +1,50 @@ |
|||||
extends Node |
|
||||
|
extends Spatial |
||||
|
|
||||
const MAX_PEERS = 4 |
|
||||
const LOBBY_READY_WAIT_TIME = 3 |
|
||||
|
class_name Game |
||||
|
|
||||
var World = preload("res://scenes/game/World.tscn") |
|
||||
var Player = preload("res://scenes/player/Player.tscn") |
|
||||
var HumanPlayer = preload("res://scenes/player/HumanPlayer.tscn") |
|
||||
var BotPlayer = preload("res://scenes/player/BotPlayer.tscn") |
|
||||
|
var players:Array |
||||
|
var route:Route |
||||
|
var first:Player |
||||
|
var last:Player |
||||
|
|
||||
var players = {} |
|
||||
|
const REMOVE_LAST = 2 |
||||
|
|
||||
var game_name = "" |
|
||||
var bots:bool = false |
|
||||
var game_running:bool = false |
|
||||
|
|
||||
signal players_changed(players) |
|
||||
signal game_ready(ready) |
|
||||
signal game_started() |
|
||||
signal game_ended() |
|
||||
|
func _ready(): |
||||
|
route = get_node("route") |
||||
|
if is_network_master(): |
||||
|
route.rpc("add_road",roads_factory.START, -1) |
||||
|
|
||||
|
|
||||
remote func set_player(id, new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false): |
|
||||
players[id] = {"name" : new_name, "color" : new_color, "ready" : new_ready, "prepared" : false} |
|
||||
emit_signal("players_changed", players) |
|
||||
|
func _physics_process(delta): |
||||
|
if is_network_master(): |
||||
|
set_player_order() |
||||
|
check_autotrack() |
||||
|
|
||||
if get_tree().is_network_server(): |
|
||||
var all_ready = true |
|
||||
for p_id in players: |
|
||||
rpc_id(id, "set_player", p_id, players[p_id].name, players[p_id].color, players[p_id].ready) |
|
||||
rpc_id(p_id, "set_player", id, new_name, new_color, new_ready) |
|
||||
all_ready = all_ready && players[p_id].ready |
|
||||
rpc("game_ready", all_ready) |
|
||||
|
|
||||
|
func set_player_order(): |
||||
|
players = get_node("players").get_children() |
||||
|
players.sort_custom(PlayerSorter,"sort") |
||||
|
if players.size() > 0 && players[0] != first: |
||||
|
new_first(players[0]) |
||||
|
if players.size() > 0 && players[players.size()-1] != last: |
||||
|
last = players[players.size()-1] |
||||
|
|
||||
func update_player(new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false): |
|
||||
if get_tree().is_network_server(): |
|
||||
set_player(get_tree().get_network_unique_id(), new_name, new_color, new_ready) |
|
||||
else: |
|
||||
rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready) |
|
||||
|
|
||||
|
func new_first(player): |
||||
|
if first != null: |
||||
|
first.rpc("set_first",false) |
||||
|
first = player |
||||
|
first.rpc("set_first",true) |
||||
|
|
||||
remotesync func remove_player(id): |
|
||||
players.erase(id) |
|
||||
|
|
||||
if has_node("/root/world"): |
|
||||
var world = get_node("/root/world") |
|
||||
var world_players = world.get_node("players") |
|
||||
if world_players.has_node(str(id)): |
|
||||
world_players.remove_child(world_players.get_node(str(id))) |
|
||||
|
func check_autotrack(): |
||||
|
if first != null: |
||||
|
if first.position.x != -1 && route.get_last_road() != null: |
||||
|
if first.position.x == route.get_last_road().get_index(): |
||||
|
route.rpc("add_road", roads_factory.STRAIGHT, -1) |
||||
|
|
||||
emit_signal("players_changed", players) |
|
||||
|
|
||||
|
|
||||
remotesync func game_ready(all_ready:bool): |
|
||||
if get_tree().is_network_server(): |
|
||||
if all_ready: |
|
||||
game_running = true |
|
||||
else: |
|
||||
game_running = false |
|
||||
emit_signal("game_ready", all_ready) |
|
||||
|
|
||||
|
|
||||
remotesync func prepare_game(): |
|
||||
get_tree().set_pause(true) |
|
||||
|
|
||||
var world = World.instance() |
|
||||
get_tree().get_root().add_child(world) |
|
||||
|
|
||||
get_tree().get_root().get_node("main_menu").hide() |
|
||||
|
|
||||
for p_id in players: |
|
||||
var controls |
|
||||
var player = players[p_id] |
|
||||
|
|
||||
var player_scene = Player.instance() |
|
||||
player_scene.set_network_master(p_id) |
|
||||
player_scene.set_name(str(p_id)) |
|
||||
player_scene.set_player_name(player.name) |
|
||||
player_scene.set_player_color(player.color) |
|
||||
world.get_node("players").add_child(player_scene) |
|
||||
|
|
||||
if p_id == get_tree().get_network_unique_id(): |
|
||||
controls = HumanPlayer.instance() |
|
||||
controls.set_name("HumanControl_" + str(p_id)) |
|
||||
world.add_child(controls) |
|
||||
controls.set_player(player_scene.get_path()) |
|
||||
controls.set_network_master(p_id) |
|
||||
|
|
||||
player_scene.set_start(player_scene.get_index()) |
|
||||
|
|
||||
if bots: |
|
||||
for index in range(MAX_PEERS-players.size()): |
|
||||
var bot_index = players.size() + index |
|
||||
var player_scene = Player.instance() |
|
||||
player_scene.set_name("bot_player" + str(bot_index)) |
|
||||
player_scene.set_player_color(Color(randf(),randf(),randf())) |
|
||||
world.get_node("players").add_child(player_scene) |
|
||||
player_scene.add_to_group("bots") |
|
||||
if get_tree().is_network_server(): |
|
||||
var bot = BotPlayer.instance() |
|
||||
bot.set_name("bot" + str(bot_index)) |
|
||||
world.add_child(bot) |
|
||||
bot.set_player(player_scene.get_path()) |
|
||||
bot.set_network_master(get_tree().get_network_unique_id()) |
|
||||
player_scene.set_start(bot_index) |
|
||||
if players.has(get_tree().get_network_unique_id()): |
|
||||
rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) |
|
||||
|
|
||||
if get_tree().is_network_server(): |
|
||||
if players.has(get_tree().get_network_unique_id()): |
|
||||
player_prepared(get_tree().get_network_unique_id()) |
|
||||
else: |
|
||||
rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) |
|
||||
|
|
||||
|
|
||||
remotesync func player_prepared(id): |
|
||||
if get_tree().is_network_server(): |
|
||||
players[id].prepared = true |
|
||||
var all_prepared = true |
|
||||
for p_id in players: |
|
||||
all_prepared = all_prepared && players[p_id].prepared |
|
||||
if all_prepared: |
|
||||
rpc("post_start_game") |
|
||||
|
|
||||
|
|
||||
remotesync func post_start_game(): |
|
||||
get_tree().set_pause(false) |
|
||||
emit_signal("game_started") |
|
||||
|
|
||||
|
|
||||
remotesync func set_bots(has_bots:bool): |
|
||||
bots = has_bots |
|
||||
|
|
||||
|
|
||||
func quit_game(): |
|
||||
if has_node("/root/world"): |
|
||||
get_node("/root/world").queue_free() |
|
||||
|
|
||||
players.clear() |
|
||||
if get_tree().get_root().has_node("multiplayer_menu"): |
|
||||
get_tree().get_root().get_node("multiplayer_menu").show() |
|
||||
get_tree().get_root().get_node("main_menu").hide() |
|
||||
elif get_tree().get_root().has_node("main_menu"): |
|
||||
get_tree().get_root().get_node("main_menu").show() |
|
||||
game_running = false |
|
||||
bots = false |
|
||||
game_name = "" |
|
||||
|
|
||||
emit_signal("game_ended") |
|
||||
|
class PlayerSorter: |
||||
|
static func sort(a, b): |
||||
|
return a.position.x > b.position.x || a.position.x == b.position.x && a.position.y > b.position.y |
@ -0,0 +1,152 @@ |
|||||
|
extends Node |
||||
|
|
||||
|
const MAX_PEERS = 4 |
||||
|
const LOBBY_READY_WAIT_TIME = 3 |
||||
|
|
||||
|
var Game = preload("res://scenes/game/Game.tscn") |
||||
|
var Player = preload("res://scenes/player/Player.tscn") |
||||
|
var HumanPlayer = preload("res://scenes/player/HumanPlayer.tscn") |
||||
|
var BotPlayer = preload("res://scenes/player/BotPlayer.tscn") |
||||
|
|
||||
|
var game:Game |
||||
|
var players = {} |
||||
|
|
||||
|
var game_name = "" |
||||
|
var bots:bool = false |
||||
|
var game_running:bool = false |
||||
|
|
||||
|
signal players_changed(players) |
||||
|
signal game_ready(ready) |
||||
|
signal game_started() |
||||
|
signal game_ended() |
||||
|
|
||||
|
|
||||
|
remote func set_player(id, new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false): |
||||
|
players[id] = {"name" : new_name, "color" : new_color, "ready" : new_ready, "prepared" : false} |
||||
|
emit_signal("players_changed", players) |
||||
|
|
||||
|
if get_tree().is_network_server(): |
||||
|
var all_ready = true |
||||
|
for p_id in players: |
||||
|
rpc_id(id, "set_player", p_id, players[p_id].name, players[p_id].color, players[p_id].ready) |
||||
|
rpc_id(p_id, "set_player", id, new_name, new_color, new_ready) |
||||
|
all_ready = all_ready && players[p_id].ready |
||||
|
rpc("game_ready", all_ready) |
||||
|
|
||||
|
|
||||
|
func update_player(new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false): |
||||
|
if get_tree().is_network_server(): |
||||
|
set_player(get_tree().get_network_unique_id(), new_name, new_color, new_ready) |
||||
|
else: |
||||
|
rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready) |
||||
|
|
||||
|
|
||||
|
remotesync func remove_player(id): |
||||
|
players.erase(id) |
||||
|
|
||||
|
if game != null: |
||||
|
var game_players = game.get_node("players") |
||||
|
if game_players.has_node(str(id)): |
||||
|
game_players.remove_child(game_players.get_node(str(id))) |
||||
|
|
||||
|
emit_signal("players_changed", players) |
||||
|
|
||||
|
|
||||
|
remotesync func game_ready(all_ready:bool): |
||||
|
if get_tree().is_network_server(): |
||||
|
if all_ready: |
||||
|
game_running = true |
||||
|
else: |
||||
|
game_running = false |
||||
|
emit_signal("game_ready", all_ready) |
||||
|
|
||||
|
|
||||
|
remotesync func prepare_game(): |
||||
|
get_tree().set_pause(true) |
||||
|
|
||||
|
game = Game.instance() |
||||
|
get_tree().get_root().add_child(game) |
||||
|
|
||||
|
get_tree().get_root().get_node("main_menu").hide() |
||||
|
|
||||
|
for p_id in players: |
||||
|
var controls |
||||
|
var player = players[p_id] |
||||
|
|
||||
|
var player_scene = Player.instance() |
||||
|
player_scene.set_network_master(p_id) |
||||
|
player_scene.set_name(str(p_id)) |
||||
|
game.get_node("players").add_child(player_scene) |
||||
|
player_scene.set_player_name(player.name) |
||||
|
player_scene.set_player_color(player.color) |
||||
|
|
||||
|
if p_id == get_tree().get_network_unique_id(): |
||||
|
controls = HumanPlayer.instance() |
||||
|
controls.set_name("HumanControl_" + str(p_id)) |
||||
|
game.add_child(controls) |
||||
|
controls.set_player(player_scene.get_path()) |
||||
|
controls.set_network_master(p_id) |
||||
|
|
||||
|
player_scene.set_start(player_scene.get_index()) |
||||
|
|
||||
|
if bots: |
||||
|
for index in range(MAX_PEERS-players.size()): |
||||
|
var bot_index = players.size() + index |
||||
|
var player_scene = Player.instance() |
||||
|
player_scene.set_name("bot_player" + str(bot_index)) |
||||
|
game.get_node("players").add_child(player_scene) |
||||
|
player_scene.set_player_name("Bot " + str(bot_index)) |
||||
|
player_scene.set_player_color(Color(randf(),randf(),randf())) |
||||
|
player_scene.add_to_group("bots") |
||||
|
if get_tree().is_network_server(): |
||||
|
var bot = BotPlayer.instance() |
||||
|
bot.set_name("bot" + str(bot_index)) |
||||
|
game.add_child(bot) |
||||
|
bot.set_player(player_scene.get_path()) |
||||
|
bot.set_network_master(get_tree().get_network_unique_id()) |
||||
|
player_scene.set_start(bot_index) |
||||
|
if players.has(get_tree().get_network_unique_id()): |
||||
|
rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) |
||||
|
|
||||
|
if get_tree().is_network_server(): |
||||
|
if players.has(get_tree().get_network_unique_id()): |
||||
|
player_prepared(get_tree().get_network_unique_id()) |
||||
|
else: |
||||
|
rpc_id(1, "player_prepared", get_tree().get_network_unique_id()) |
||||
|
|
||||
|
|
||||
|
remotesync func player_prepared(id): |
||||
|
if get_tree().is_network_server(): |
||||
|
players[id].prepared = true |
||||
|
var all_prepared = true |
||||
|
for p_id in players: |
||||
|
all_prepared = all_prepared && players[p_id].prepared |
||||
|
if all_prepared: |
||||
|
rpc("post_start_game") |
||||
|
|
||||
|
|
||||
|
remotesync func post_start_game(): |
||||
|
get_tree().set_pause(false) |
||||
|
emit_signal("game_started") |
||||
|
|
||||
|
|
||||
|
remotesync func set_bots(has_bots:bool): |
||||
|
bots = has_bots |
||||
|
|
||||
|
|
||||
|
func quit_game(): |
||||
|
if game != null: |
||||
|
game.queue_free() |
||||
|
game = null |
||||
|
|
||||
|
players.clear() |
||||
|
if get_tree().get_root().has_node("multiplayer_menu"): |
||||
|
get_tree().get_root().get_node("multiplayer_menu").show() |
||||
|
get_tree().get_root().get_node("main_menu").hide() |
||||
|
elif get_tree().get_root().has_node("main_menu"): |
||||
|
get_tree().get_root().get_node("main_menu").show() |
||||
|
game_running = false |
||||
|
bots = false |
||||
|
game_name = "" |
||||
|
|
||||
|
emit_signal("game_ended") |
@ -1,59 +0,0 @@ |
|||||
extends Spatial |
|
||||
|
|
||||
var players:Array |
|
||||
var route:Route |
|
||||
var first:Player |
|
||||
var last:Player |
|
||||
|
|
||||
const REMOVE_LAST = 1 |
|
||||
|
|
||||
|
|
||||
func _ready(): |
|
||||
route = get_node("route") |
|
||||
if is_network_master(): |
|
||||
route.rpc("add_road","Start", -1) |
|
||||
|
|
||||
func _physics_process(delta): |
|
||||
if is_network_master(): |
|
||||
set_player_order() |
|
||||
#destroy_after_last() |
|
||||
check_autotrack() |
|
||||
|
|
||||
|
|
||||
func set_player_order(): |
|
||||
players = get_node("players").get_children() |
|
||||
players.sort_custom(PlayerSorter,"sort") |
|
||||
if players.size() > 0 && players[0] != first: |
|
||||
new_first(players[0]) |
|
||||
if players.size() > 0 && players[players.size()-1] != last: |
|
||||
last = players[players.size()-1] |
|
||||
|
|
||||
|
|
||||
func new_first(player): |
|
||||
if first != null: |
|
||||
first.rpc("set_first",false) |
|
||||
first = player |
|
||||
first.rpc("set_first",true) |
|
||||
var p_id = first.get_network_master() |
|
||||
route.rpc("set_network_master",p_id) |
|
||||
|
|
||||
|
|
||||
func destroy_after_last(): |
|
||||
if last != null: |
|
||||
if last.position.x != -1: |
|
||||
var max_index = last.position.x - REMOVE_LAST |
|
||||
if max_index > 0: |
|
||||
for i in range(max_index): |
|
||||
route.rpc("remove_road", i) |
|
||||
|
|
||||
|
|
||||
func check_autotrack(): |
|
||||
if first != null: |
|
||||
if first.position.x != -1 && route.get_last_road() != null: |
|
||||
if first.position.x == route.get_last_road().get_index(): |
|
||||
route.rpc("add_road", roads_factory.STRAIGHT, -1) |
|
||||
|
|
||||
|
|
||||
class PlayerSorter: |
|
||||
static func sort(a, b): |
|
||||
return a.position.x > b.position.x || a.position.x == b.position.x && a.position.y > b.position.y |
|
@ -1,46 +0,0 @@ |
|||||
extends Node |
|
||||
|
|
||||
class_name BasePlayer |
|
||||
|
|
||||
export var player_color:Color |
|
||||
var player_name:String |
|
||||
|
|
||||
var is_out:bool = false |
|
||||
var position:Vector2 |
|
||||
var road_index:int = -1 |
|
||||
|
|
||||
puppet var slave_position:Vector2 |
|
||||
|
|
||||
|
|
||||
func get_race_car(): |
|
||||
pass |
|
||||
|
|
||||
|
|
||||
func get_player_name(): |
|
||||
return player_name |
|
||||
|
|
||||
|
|
||||
func set_player_name(new_name): |
|
||||
player_name = new_name |
|
||||
|
|
||||
|
|
||||
func get_player_color(): |
|
||||
return player_color |
|
||||
|
|
||||
|
|
||||
func set_player_color(new_color): |
|
||||
player_color = new_color |
|
||||
var material = SpatialMaterial.new() |
|
||||
material.set_albedo(player_color) |
|
||||
get_race_car().get_node("body").set_surface_material(1,material) |
|
||||
|
|
||||
|
|
||||
func set_start(position:int): |
|
||||
pass |
|
||||
|
|
||||
|
|
||||
remotesync func set_first(is_first:bool): |
|
||||
if is_first: |
|
||||
add_to_group("first") |
|
||||
else: |
|
||||
remove_from_group("first") |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue