~starkingdoms/starkingdoms

d1aef196f5bb5526aefa6f3785dcbaa4d9471e2d — core 1 year, 11 months ago d07a0e2
fix some weird stuff that happens on ff sometimes
3 files changed, 65 insertions(+), 39 deletions(-)

M server/src/main.rs
M starkingdoms-client/src/hub.ts
M starkingdoms-client/src/protocol.ts
M server/src/main.rs => server/src/main.rs +53 -28
@@ 97,7 97,8 @@ fn spawn_planets(mut commands: Commands) {
        .insert(AdditionalMassProperties::Mass(EARTH_MASS))
        .insert(ReadMassProperties::default())
        .with_children(|children| {
            children.spawn(Collider::ball((EARTH_SIZE + 3.) / SCALE))
            children
                .spawn(Collider::ball((EARTH_SIZE + 3.) / SCALE))
                .insert(ActiveEvents::COLLISION_EVENTS)
                .insert(Sensor);
        })


@@ 112,7 113,8 @@ fn spawn_planets(mut commands: Commands) {
        .insert(AdditionalMassProperties::Mass(MOON_MASS))
        .insert(ReadMassProperties::default())
        .with_children(|children| {
            children.spawn(Collider::ball((MOON_SIZE + 3.) / SCALE))
            children
                .spawn(Collider::ball((MOON_SIZE + 3.) / SCALE))
                .insert(ActiveEvents::COLLISION_EVENTS)
                .insert(Sensor);
        })


@@ 137,12 139,12 @@ fn module_spawn(
        );
        transform.rotate_z(angle);
        if part_query.iter().count() < FREE_MODULE_CAP {
            let mut entity = commands
                .spawn(PartBundle {
                    part_type: PartType::Cargo,
                    transform: TransformBundle::from(transform),
                });
            entity.insert(RigidBody::Dynamic)
            let mut entity = commands.spawn(PartBundle {
                part_type: PartType::Cargo,
                transform: TransformBundle::from(transform),
            });
            entity
                .insert(RigidBody::Dynamic)
                .with_children(|children| {
                    children
                        .spawn(Collider::cuboid(18.75 / SCALE, 23.4375 / SCALE))


@@ 162,7 164,7 @@ fn module_spawn(
                part: Part {
                    part_type: PartType::Cargo,
                    transform: proto_transform!(transform),
                }
                },
            };
            let buf = serde_json::to_vec(&packet).unwrap();



@@ 558,10 560,8 @@ fn on_message(
                                                }
                                            }
                                        }
                                        let mut module =
                                            attached_query.get_mut(select).unwrap();
                                        module.2.translation =
                                            vec3(x / SCALE, y / SCALE, 0.);
                                        let mut module = attached_query.get_mut(select).unwrap();
                                        module.2.translation = vec3(x / SCALE, y / SCALE, 0.);
                                    } else {
                                        for (i, child) in attach.children.clone().iter().enumerate()
                                        {


@@ 823,7 823,9 @@ fn convert_modules(
    mut packet_send: EventWriter<ServerEvent>,
) {
    for (_planet_entity, planet_type, children) in &planet_query {
        for (entity1, entity2, intersecting) in rapier_context.intersections_with(*children.first().unwrap()) {
        for (entity1, entity2, intersecting) in
            rapier_context.intersections_with(*children.first().unwrap())
        {
            if intersecting {
                let other = if *children.first().unwrap() == entity1 {
                    entity2


@@ 833,10 835,23 @@ fn convert_modules(
                let player_entity = if player_query.contains(other) {
                    other
                } else if attached_query.contains(other) {
                    attached_query.get(other).unwrap().1.associated_player.unwrap()
                } else { continue };
                    attached_query
                        .get(other)
                        .unwrap()
                        .1
                        .associated_player
                        .unwrap()
                } else {
                    continue;
                };
                let player_attach = player_query.get(player_entity).unwrap();
                convert_modules_recursive(*planet_type, player_attach.clone(), &mut attached_query, &mut collider_query, &mut packet_send);
                convert_modules_recursive(
                    *planet_type,
                    player_attach.clone(),
                    &mut attached_query,
                    &mut collider_query,
                    &mut packet_send,
                );
            }
        }
    }


@@ 857,12 872,12 @@ fn convert_modules_recursive(
                match planet_type {
                    PlanetType::Moon => {
                        *part_type = PartType::Hub;
                        let (mut collider, mut transform) = collider_query.get_mut(*children.first().unwrap()).unwrap();
                        *collider = Collider::cuboid(PART_HALF_SIZE / SCALE, PART_HALF_SIZE / SCALE);
                        let (mut collider, mut transform) =
                            collider_query.get_mut(*children.first().unwrap()).unwrap();
                        *collider =
                            Collider::cuboid(PART_HALF_SIZE / SCALE, PART_HALF_SIZE / SCALE);
                        *transform = Transform::from_xyz(0., 0., 0.);
                        let packet = Packet::DespawnPart {
                            id: child.index(),
                        };
                        let packet = Packet::DespawnPart { id: child.index() };
                        let buf = serde_json::to_vec(&packet).unwrap();
                        packet_send.send(ServerEvent::Broadcast(MessageType::Text, buf.clone()));



@@ 871,7 886,7 @@ fn convert_modules_recursive(
                            part: Part {
                                part_type: PartType::Hub,
                                transform: proto_transform!(transform),
                            }
                            },
                        };
                        let buf = serde_json::to_vec(&packet).unwrap();



@@ 880,7 895,13 @@ fn convert_modules_recursive(
                    _ => {}
                }
            }
            convert_modules_recursive(planet_type, attach.clone(), attached_query, collider_query, packet_send);
            convert_modules_recursive(
                planet_type,
                attach.clone(),
                attached_query,
                collider_query,
                packet_send,
            );
        }
    }
}


@@ 898,7 919,13 @@ fn on_close(
        if let ServerEvent::Close(addr) = packet {
            for (entity, player, attach) in &player_query {
                if player.addr == *addr {
                    despawn_module_tree(&mut commands, attach, &attached_query, &part_query, &mut packets);
                    despawn_module_tree(
                        &mut commands,
                        attach,
                        &attached_query,
                        &part_query,
                        &mut packets,
                    );
                    commands.entity(entity).despawn_recursive();

                    let packet = Packet::PlayerLeave { id: entity.index() };


@@ 931,9 958,7 @@ fn despawn_module_tree(
    for child in attach.children {
        if let Some(child) = child {
            commands.entity(child).despawn_recursive();
            let packet = Packet::DespawnPart {
                id: child.index(),
            };
            let packet = Packet::DespawnPart { id: child.index() };
            let buf = serde_json::to_vec(&packet).unwrap();
            packets.push(ServerEvent::Broadcast(MessageType::Text, buf.clone()));


M starkingdoms-client/src/hub.ts => starkingdoms-client/src/hub.ts +9 -8
@@ 1,6 1,6 @@
import createDebug from "debug";
import type {
    DespawnPartPacket,
  DespawnPartPacket,
  MessagePacket,
  Packet,
  PartPositionsPacket,


@@ 16,7 16,7 @@ import { global } from "./globals.ts";
import { startRender } from "./rendering.ts";
import { ButtonType } from "./protocol.ts";
import type Chatbox from "./components/Chatbox.svelte";
import {part_texture_url} from "./textures.js";
import { part_texture_url } from "./textures.js";
import * as PIXI from "pixi.js";

const logger = createDebug("hub");


@@ 201,7 201,7 @@ export async function hub_connect(
          let id = p.parts[i][0];
          let new_part = p.parts[i][1];

          /*if (global.parts_map.has(id)) {
          if (global.parts_map.has(id)) {
            let old_part = global.parts_map.get(id)!;
            let dx = new_part.transform.x - old_part.transform.x;
            let dy = new_part.transform.y - old_part.transform.y;


@@ 211,7 211,8 @@ export async function hub_connect(
            if (dx < CUTOFF_XY && dy < CUTOFF_XY && drot < CUTOFF_ROT) {
              continue; // this packet is under the cutoff, we don't care about it
            }
          }*/
          }

          global.parts_map.set(id, new_part);
          if (id === global.me?.part_id) {
            document.getElementById("pos-val-x")!.innerText = Math.round(


@@ 235,11 236,11 @@ export async function hub_connect(
      } else if (packet.t == PacketType.DespawnPart) {
        let p = <DespawnPartPacket>packet.c;
        let id = p.id;
        let part_sprite = global.rendering!.part_sprite_map.get(id);
        logger(`despawned part`);
        global.parts_map.delete(id);
        global.rendering!.part_sprite_map.delete(id);
        let part_sprite = global.rendering!.part_sprite_map.get(id)!;

        global.rendering!.app.stage.removeChild(part_sprite);
        global.rendering!.part_sprite_map.delete(id);
        global.parts_map.delete(id);
      } else if (packet.t == PacketType.PlayerLeave) {
        let p = <PlayerLeavePacket>packet.c;
        let username = global.players_map.get(p.id)!;

M starkingdoms-client/src/protocol.ts => starkingdoms-client/src/protocol.ts +3 -3
@@ 41,11 41,11 @@ export interface PartPositionsPacket {
  parts: [number, Part][];
}
export interface SpawnPartPacket {
    id: number;
    part: Part;
  id: number;
  part: Part;
}
export interface DespawnPartPacket {
    id: number;
  id: number;
}
export interface PlayerInputPacket {
  up: boolean;