~starkingdoms/starkingdoms

ref: 28b96352b6cdc2a7bf0bd91ec8de51d6ccab11c4 starkingdoms/crates/client/src/networking/handlers.rs -rw-r--r-- 6.3 KiB
28b96352 — core network refactor 8 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
use bevy_ecs::prelude::*;
use nalgebra::{Rotation2, Scale3, Translation3};
use starkingdoms_common::packet::{DespawnPartPacket, EnergyUpdatePacket, LoginResponsePacket, MessagePacket, OpenCraftingUiPacket, PartPositionsPacket, PlanetPositionsPacket, PlayerLeavePacket, PlayerListPacket, SpawnPartPacket, SpawnPlayerPacket};
use starkingdoms_common::PartType;
use crate::components::{Camera, Chat, Menu, OtherPlayerBundle, Part, PartBundle, Player, PlayerBundle, PlayerResources, PlayerUsername, ServerId, Texture, Transform};
use crate::networking::texture_name;

pub fn handle_login_response(mut reader: EventReader<LoginResponsePacket>, mut player: Query<Entity, With<Player>>, mut commands: Commands) {
    for packet in reader.read() {
        let player = player.single();
        commands.entity(player).insert(ServerId(packet.id));
    }
}

pub fn handle_message(mut reader: EventReader<MessagePacket>, mut chat: ResMut<Chat>) {
    for message in reader.read() {
        chat.messages.push(
            format!("{}: {}", message.actor, message.content)
        );
    }
}

pub fn handle_existing_players_list(mut reader: EventReader<PlayerListPacket>, mut commands: Commands) {
    for packet in reader.read() {
        for (server_id, username) in &packet.players {
            commands.spawn(OtherPlayerBundle {
                part: PartBundle {
                    transform: Transform {
                        translation: Translation3::new(0.0, 0.0, 0.0),
                        rotation: Rotation2::new(0.0),
                        scale: Scale3::new(25.0, 25.0, 1.0)
                    },
                    texture: Texture {
                        name: "hearty.svg".to_string()
                    },
                    server_id: ServerId(*server_id),
                    part: Part(false),
                },
                username: PlayerUsername {
                    username: username.clone()
                }
            });
        }
    }
}

pub fn handle_spawn_player(mut reader: EventReader<SpawnPlayerPacket>, mut commands: Commands) {
    for SpawnPlayerPacket { id: server_id, username } in reader.read() {
            commands.spawn(OtherPlayerBundle {
                part: PartBundle {
                    transform: Transform {
                        translation: Translation3::new(0.0, 0.0, 0.0),
                        rotation: Rotation2::new(0.0),
                        scale: Scale3::new(25.0, 25.0, 1.0)
                    },
                    texture: Texture {
                        name: "hearty.svg".to_string()
                    },
                    server_id: ServerId(*server_id),
                    part: Part(false),
                },
                username: PlayerUsername {
                    username: username.clone()
                }
            });
    }
}

pub fn handle_spawn_part(mut reader: EventReader<SpawnPartPacket>, mut commands: Commands) {
    for SpawnPartPacket { id: server_id, part } in reader.read() {
        commands.spawn(PartBundle {
                transform: Transform {
                    translation: Translation3::new(part.transform.x, part.transform.y, 0.0),
                    rotation: Rotation2::new(part.transform.rot),
                    scale: Scale3::new(25.0, 25.0, 1.0),
                },
                texture: Texture {
                    name: texture_name(part.part_type, part.flags.attached),
                },
                server_id: ServerId(*server_id),
                part: Part(part.flags.attached),
            });
    }
}

pub fn handle_part_positions(mut reader: EventReader<PartPositionsPacket>, mut parts_query: Query<(Entity, &ServerId, &mut Transform, &mut Texture, &mut Part)>, mut player: Query<&ServerId, With<Player>>, mut camera: ResMut<Camera>) {
    for PartPositionsPacket { parts } in reader.read() {
        for (this_id, part) in parts {
            for (_, server_id, mut transform, mut texture, mut bevy_part) in &mut parts_query {
                if *this_id == server_id.0 {
                    transform.translation.x = part.transform.x;
                    transform.translation.y = part.transform.y;
                    transform.rotation = Rotation2::new(part.transform.rot);

                    if part.flags.attached && !bevy_part.0 {
                        texture.name = texture_name(part.part_type, part.flags.attached);
                        bevy_part.0 = true;
                    } else if !part.flags.attached && bevy_part.0 {
                        texture.name = texture_name(part.part_type, part.flags.attached);
                        bevy_part.0 = false;
                    }
                }

                if part.part_type == PartType::Hearty {
                    let player_id = player.single();
                    if player_id.0 == server_id.0 {
                        camera.x = -part.transform.x;
                        camera.y = -part.transform.y;
                    }
                }
            }
        }
    }
}


pub fn handle_energy_update(mut reader: EventReader<EnergyUpdatePacket>, mut player_res: ResMut<PlayerResources>) {
    for EnergyUpdatePacket { amount, max } in reader.read() {
        player_res.fuel_amount = *amount;
        player_res.fuel_max = *max;
    }
}

pub fn handle_crafting_ui(mut reader: EventReader<OpenCraftingUiPacket>, entities: Query<(Entity, &ServerId)>, mut commands: Commands) {
    for OpenCraftingUiPacket { id } in reader.read() {
        for (entity, server_id) in &entities {
            if server_id.0 == *id {
                commands.entity(entity)
                    .insert(Menu);
            }
        }
    }
}

pub fn handle_player_leave(mut reader: EventReader<PlayerLeavePacket>, mut part_query: Query<(Entity, &ServerId), With<Part>>, mut commands: Commands) {
    for PlayerLeavePacket { id } in reader.read() {
        for (entity, server_id) in &mut part_query {
            if server_id.0 == *id {
                commands.entity(entity).despawn();
            }
        }
    }
}

pub fn handle_despawn_part(mut reader: EventReader<DespawnPartPacket>, mut part_query: Query<(Entity, &ServerId), With<Part>>, mut commands: Commands) {
    for DespawnPartPacket { id } in reader.read() {
        for (entity, server_id) in &mut part_query {
            if server_id.0 == *id {
                commands.entity(entity).despawn();
            }
        }
    }
}