Skip to content

Commit 68a6ff1

Browse files
committed
- fix wrongly configured tileset
- fix players list - disconnect players on game end
1 parent 0c53f79 commit 68a6ff1

File tree

7 files changed

+48
-15
lines changed

7 files changed

+48
-15
lines changed

examples/multiplayer-bomber/godot/src/entities/rock.tscn

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[gd_scene load_steps=6 format=3 uid="uid://ciqjnvw2opgvk"]
22

3-
[ext_resource type="Texture2D" uid="uid://cb1y8d1bbygtk" path="res://assets/brickfloor.png" id="1_sl8s3"]
3+
[ext_resource type="Texture2D" uid="uid://doxassdyodvel" path="res://assets/brickfloor.png" id="1_sl8s3"]
44

55
[sub_resource type="RectangleShape2D" id="RectangleShape2D_l5afi"]
66
size = Vector2(48, 48)

examples/multiplayer-bomber/godot/src/game/world.tscn

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[ext_resource type="TileSet" uid="uid://do2l6lpuotti8" path="res://src/tiles/tileset.tres" id="1"]
44
[ext_resource type="PackedScene" uid="uid://ciqjnvw2opgvk" path="res://src/entities/rock.tscn" id="2"]
5-
[ext_resource type="FontFile" uid="uid://b1mhpw5ornbak" path="res://assets/montserrat.otf" id="4"]
5+
[ext_resource type="FontFile" uid="uid://dcgp8pqs7f2jv" path="res://assets/montserrat.otf" id="4"]
66
[ext_resource type="PackedScene" uid="uid://enwoaqi0rnei" path="res://src/entities/bomb.tscn" id="4_f1bha"]
77

88
[node name="World" type="World"]

examples/multiplayer-bomber/godot/src/tiles/tile_scene.tscn

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[gd_scene load_steps=3 format=3 uid="uid://c5m3rogpaglk1"]
22

3-
[ext_resource type="Texture2D" uid="uid://cb1y8d1bbygtk" path="res://assets/brickfloor.png" id="1"]
3+
[ext_resource type="Texture2D" uid="uid://doxassdyodvel" path="res://assets/brickfloor.png" id="1"]
44

55
[sub_resource type="RectangleShape2D" id="1"]
66
size = Vector2(48, 48)

examples/multiplayer-bomber/godot/src/tiles/tileset.tres

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://do2l6lpuotti8"]
22

3-
[ext_resource type="Texture2D" uid="uid://cb1y8d1bbygtk" path="res://assets/brickfloor.png" id="1"]
3+
[ext_resource type="Texture2D" uid="uid://doxassdyodvel" path="res://assets/brickfloor.png" id="1_la6op"]
44

55
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_qhkfp"]
6-
texture = ExtResource("1")
6+
texture = ExtResource("1_la6op")
77
texture_region_size = Vector2i(48, 48)
88
0:0/0 = 0
9-
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-24, -24, 24, -24, 24, 24, -24, 24)
9+
0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-24, -24, -24, 24, 24, 24, 24, -24)
1010
1:0/0 = 0
11+
2:0/0 = 0
12+
3:0/0 = 0
1113

1214
[resource]
1315
tile_size = Vector2i(48, 48)

examples/multiplayer-bomber/rust/src/game_state.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ impl GameState {
161161
.done();
162162
self.multiplayer.set_multiplayer_peer(&peer);
163163
self.peer = Some(peer);
164+
self.players
165+
.entry(self.multiplayer.get_unique_id())
166+
.or_insert(self.player_name.clone());
164167
}
165168

166169
#[func]
@@ -170,14 +173,16 @@ impl GameState {
170173
peer.create_client(address, Self::DEFAULT_PORT);
171174
self.multiplayer.set_multiplayer_peer(&peer);
172175
self.peer = Some(peer);
176+
self.players
177+
.entry(self.multiplayer.get_unique_id())
178+
.or_insert(self.player_name.clone());
173179
}
174180

175181
#[func]
176182
pub fn begin_game(&mut self) {
177183
if !self.multiplayer.is_server() {
178184
panic!("Only server can start a game!")
179185
}
180-
self.players.entry(1).or_insert(self.player_name.clone());
181186
self.base_mut().rpc("load_world".into(), &[]);
182187
let Some(world) = self.game_board.as_mut() else {
183188
panic!("no game board!")
@@ -239,6 +244,9 @@ impl GameState {
239244
}
240245
self.base_mut().emit_signal("game_ended".into(), &[]);
241246
self.players.clear();
247+
if let Some(peer) = self.peer.as_mut() {
248+
peer.close();
249+
};
242250
}
243251

244252
#[func]
@@ -247,6 +255,12 @@ impl GameState {
247255
}
248256
}
249257

258+
impl GameState {
259+
pub fn get_players(&self) -> &HashMap<i32, GString> {
260+
&self.players
261+
}
262+
}
263+
250264
impl GameSingleton for GameState {
251265
const NAME: &'static str = "GameState";
252266
}

examples/multiplayer-bomber/rust/src/lobby.rs

+16-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::game_state::{GameSingleton, GameState};
22
use godot::classes::{
3-
AcceptDialog, Button, Control, IControl, ItemList, Label, LineEdit, Os, Panel,
3+
AcceptDialog, Button, Control, IControl, ItemList, Label, LineEdit, MultiplayerApi, Os, Panel,
44
};
55
use godot::prelude::*;
66

@@ -27,12 +27,16 @@ pub struct Lobby {
2727
start_button: OnReady<Gd<Button>>,
2828
#[init(node = "ErrorDialog")]
2929
error_dialog: OnReady<Gd<AcceptDialog>>,
30+
#[init(val = OnReady::manual())]
31+
multiplayer: OnReady<Gd<MultiplayerApi>>,
3032
base: Base<Control>,
3133
}
3234

3335
#[godot_api]
3436
impl IControl for Lobby {
3537
fn ready(&mut self) {
38+
self.multiplayer
39+
.init(self.base().get_multiplayer().unwrap());
3640
let on_connection_failed = self.base().callable("on_connection_failed");
3741
GameState::singleton().connect("connection_failed".into(), on_connection_failed);
3842
let on_connection_success = self.base().callable("on_connection_success");
@@ -117,14 +121,21 @@ impl Lobby {
117121

118122
#[func]
119123
fn refresh_lobby(&mut self) {
120-
let mut players = GameState::singleton().bind().get_player_list();
121-
players.sort_unstable();
124+
// add current player at the top of the players list
122125
self.players_list.clear();
123126
self.players_list.add_item(GString::from(
124127
format! {"{} (You)", GameState::singleton().bind().player_name},
125128
));
126-
for player in players.iter_shared() {
127-
self.players_list.add_item(player);
129+
130+
let game_state = GameState::singleton();
131+
let binding = game_state.bind();
132+
let other_players = binding
133+
.get_players()
134+
.iter()
135+
.filter(|(player_id, _)| **player_id != self.multiplayer.get_unique_id());
136+
137+
for (_, player) in other_players {
138+
self.players_list.add_item(player.clone());
128139
}
129140
let is_server = self.base().get_multiplayer().unwrap().is_server();
130141
self.start_button.set_disabled(!is_server);

examples/multiplayer-bomber/rust/src/world.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ use godot::prelude::*;
88
pub struct World {
99
#[init(node = "Rocks")]
1010
pub rocks: OnReady<Gd<Node2D>>,
11+
#[init(node = "Players")]
12+
pub players: OnReady<Gd<Node2D>>,
1113
#[init(node = "Winner")]
1214
pub winner_label: OnReady<Gd<Label>>,
1315
#[init(node = "Score")]
1416
pub score: OnReady<Gd<ScoreBoard>>,
1517
#[init(node = "SpawnPoints")]
1618
pub spawn_points: OnReady<Gd<Node2D>>,
17-
#[init(node = "Players")]
18-
pub players: OnReady<Gd<Node2D>>,
1919
base: Base<Node2D>,
2020
}
2121

@@ -39,7 +39,13 @@ impl World {
3939
}
4040

4141
#[func]
42-
fn on_exit_game_pressed(&self) {
42+
fn on_exit_game_pressed(&mut self) {
43+
self.base_mut().rpc("end_game".into(), &[]);
44+
}
45+
46+
#[rpc(any_peer, call_local)]
47+
#[func(gd_self)]
48+
fn end_game(_this: Gd<Self>) {
4349
GameState::singleton().bind_mut().end_game();
4450
}
4551
}

0 commit comments

Comments
 (0)