1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-06-21 07:27:45 +00:00

Make !spawnclone debug command networked

This commit is contained in:
Joshua Goins 2025-06-18 20:57:20 -04:00
parent d216bebce9
commit c1dc138e3c
3 changed files with 41 additions and 30 deletions

View file

@ -1,12 +1,6 @@
use crate::{ use crate::{
common::timestamp_secs,
inventory::Storage, inventory::Storage,
ipc::zone::{ ipc::zone::{ActorControlCategory, ActorControlSelf, ChatMessage},
ActorControlCategory, ActorControlSelf, ChatMessage, NpcSpawn, ServerZoneIpcData,
ServerZoneIpcSegment,
},
opcodes::ServerZoneIpcType,
packet::{PacketSegment, SegmentData, SegmentType},
world::ToServer, world::ToServer,
}; };
@ -39,30 +33,12 @@ impl ChatHandler {
.await; .await;
} }
"!spawnclone" => { "!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 connection
.send_segment(PacketSegment { .handle
source_actor: 0x106ad804, .send(ToServer::DebugSpawnClone(
target_actor: connection.player_data.actor_id, connection.id,
segment_type: SegmentType::Ipc, connection.player_data.actor_id,
data: SegmentData::Ipc { data: ipc }, ))
})
.await; .await;
} }
"!unlockaction" => { "!unlockaction" => {

View file

@ -90,6 +90,8 @@ pub enum ToServer {
DebugNewNpc(ClientId, u32), DebugNewNpc(ClientId, u32),
/// Spawn an enemy debug NPC. /// Spawn an enemy debug NPC.
DebugNewEnemy(ClientId, u32), DebugNewEnemy(ClientId, u32),
/// Spawn a debug clone.
DebugSpawnClone(ClientId, u32),
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

View file

@ -469,6 +469,39 @@ pub async fn server_main_loop(mut recv: Receiver<ToServer>) -> Result<(), std::i
spawn, 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) => { ToServer::Disconnected(from_id) => {
data.to_remove.push(from_id); data.to_remove.push(from_id);
} }