diff --git a/src/world/chat_handler.rs b/src/world/chat_handler.rs index 826d65a..8176fc9 100644 --- a/src/world/chat_handler.rs +++ b/src/world/chat_handler.rs @@ -1,12 +1,6 @@ use crate::{ - common::timestamp_secs, inventory::Storage, - ipc::zone::{ - ActorControlCategory, ActorControlSelf, ChatMessage, NpcSpawn, ServerZoneIpcData, - ServerZoneIpcSegment, - }, - opcodes::ServerZoneIpcType, - packet::{PacketSegment, SegmentData, SegmentType}, + ipc::zone::{ActorControlCategory, ActorControlSelf, ChatMessage}, world::ToServer, }; @@ -39,30 +33,12 @@ impl ChatHandler { .await; } "!spawnclone" => { - // spawn another one of us - let player = &connection.player_data; - - let mut common = connection - .get_player_common_spawn(Some(player.position), Some(player.rotation)); - common.spawn_index = connection.get_free_spawn_index(); - - let ipc = ServerZoneIpcSegment { - op_code: ServerZoneIpcType::NpcSpawn, - timestamp: timestamp_secs(), - data: ServerZoneIpcData::NpcSpawn(NpcSpawn { - common, - ..Default::default() - }), - ..Default::default() - }; - connection - .send_segment(PacketSegment { - source_actor: 0x106ad804, - target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc, - data: SegmentData::Ipc { data: ipc }, - }) + .handle + .send(ToServer::DebugSpawnClone( + connection.id, + connection.player_data.actor_id, + )) .await; } "!unlockaction" => { diff --git a/src/world/common.rs b/src/world/common.rs index ab62f3f..ca667db 100644 --- a/src/world/common.rs +++ b/src/world/common.rs @@ -90,6 +90,8 @@ pub enum ToServer { DebugNewNpc(ClientId, u32), /// Spawn an enemy debug NPC. DebugNewEnemy(ClientId, u32), + /// Spawn a debug clone. + DebugSpawnClone(ClientId, u32), } #[derive(Clone, Debug)] diff --git a/src/world/server.rs b/src/world/server.rs index dc8f32e..827578e 100644 --- a/src/world/server.rs +++ b/src/world/server.rs @@ -469,6 +469,39 @@ pub async fn server_main_loop(mut recv: Receiver) -> Result<(), std::i spawn, ); } + ToServer::DebugSpawnClone(_from_id, from_actor_id) => { + let actor_id = Instance::generate_actor_id(); + let spawn; + { + let Some(instance) = data.find_actor_instance_mut(from_actor_id) else { + break; + }; + + let Some(actor) = instance.find_actor(ObjectId(from_actor_id)) else { + break; + }; + + let NetworkedActor::Player(player) = actor else { + break; + }; + + spawn = NpcSpawn { + aggression_mode: 1, + common: player.common.clone(), + ..Default::default() + }; + + instance.insert_npc(ObjectId(actor_id), spawn.clone()); + } + + data.send_npc( + Actor { + id: ObjectId(actor_id), + ..Default::default() + }, + spawn, + ); + } ToServer::Disconnected(from_id) => { data.to_remove.push(from_id); }