1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-06-20 23:17: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::{
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" => {

View file

@ -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)]

View file

@ -469,6 +469,39 @@ pub async fn server_main_loop(mut recv: Receiver<ToServer>) -> 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);
}