From a992393435fe903963fbd19477bc1164d204f0d3 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 28 Mar 2025 00:26:31 -0400 Subject: [PATCH] Move LuaPlayer to it's own module --- src/world/connection.rs | 54 +---------------------------------- src/world/lua.rs | 63 +++++++++++++++++++++++++++++++++++++++++ src/world/mod.rs | 5 +++- 3 files changed, 68 insertions(+), 54 deletions(-) create mode 100644 src/world/lua.rs diff --git a/src/world/connection.rs b/src/world/connection.rs index 95c260a..564a464 100644 --- a/src/world/connection.rs +++ b/src/world/connection.rs @@ -1,4 +1,3 @@ -use mlua::{UserData, UserDataMethods}; use tokio::net::TcpStream; use crate::{ @@ -11,7 +10,7 @@ use crate::{ }; use super::{ - Inventory, Item, Zone, + Inventory, Item, LuaPlayer, Zone, ipc::{ ActorSetPos, ClientZoneIpcSegment, ContainerInfo, ContainerType, InitZone, ItemInfo, ServerZoneIpcData, ServerZoneIpcSegment, StatusEffect, StatusEffectList, UpdateClassInfo, @@ -325,54 +324,3 @@ impl ZoneConnection { } } } - -#[derive(Default)] -pub struct LuaPlayer { - pub player_data: PlayerData, - pub status_effects: StatusEffects, - queued_segments: Vec>, -} - -impl LuaPlayer { - fn queue_segment(&mut self, segment: PacketSegment) { - self.queued_segments.push(segment); - } - - fn send_message(&mut self, message: &str) { - let ipc = ServerZoneIpcSegment { - op_code: ServerZoneIpcType::ServerChatMessage, - timestamp: timestamp_secs(), - data: ServerZoneIpcData::ServerChatMessage { - message: message.to_string(), - unk: 0, - }, - ..Default::default() - }; - - self.queue_segment(PacketSegment { - source_actor: self.player_data.actor_id, - target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, - }); - } - - fn give_status_effect(&mut self, effect_id: u16, duration: f32) { - self.status_effects.add(effect_id, duration); - } -} - -impl UserData for LuaPlayer { - fn add_methods>(methods: &mut M) { - methods.add_method_mut("send_message", |_, this, message: String| { - this.send_message(&message); - Ok(()) - }); - methods.add_method_mut( - "give_status_effect", - |_, this, (effect_id, duration): (u16, f32)| { - this.give_status_effect(effect_id, duration); - Ok(()) - }, - ); - } -} diff --git a/src/world/lua.rs b/src/world/lua.rs new file mode 100644 index 0000000..03040ed --- /dev/null +++ b/src/world/lua.rs @@ -0,0 +1,63 @@ +use mlua::{UserData, UserDataMethods}; + +use crate::{ + common::timestamp_secs, + opcodes::ServerZoneIpcType, + packet::{PacketSegment, SegmentType}, +}; + +use super::{ + PlayerData, StatusEffects, + ipc::{ServerZoneIpcData, ServerZoneIpcSegment}, +}; + +#[derive(Default)] +pub struct LuaPlayer { + pub player_data: PlayerData, + pub status_effects: StatusEffects, + pub queued_segments: Vec>, +} + +impl LuaPlayer { + fn queue_segment(&mut self, segment: PacketSegment) { + self.queued_segments.push(segment); + } + + fn send_message(&mut self, message: &str) { + let ipc = ServerZoneIpcSegment { + op_code: ServerZoneIpcType::ServerChatMessage, + timestamp: timestamp_secs(), + data: ServerZoneIpcData::ServerChatMessage { + message: message.to_string(), + unk: 0, + }, + ..Default::default() + }; + + self.queue_segment(PacketSegment { + source_actor: self.player_data.actor_id, + target_actor: self.player_data.actor_id, + segment_type: SegmentType::Ipc { data: ipc }, + }); + } + + fn give_status_effect(&mut self, effect_id: u16, duration: f32) { + self.status_effects.add(effect_id, duration); + } +} + +impl UserData for LuaPlayer { + fn add_methods>(methods: &mut M) { + methods.add_method_mut("send_message", |_, this, message: String| { + this.send_message(&message); + Ok(()) + }); + methods.add_method_mut( + "give_status_effect", + |_, this, (effect_id, duration): (u16, f32)| { + this.give_status_effect(effect_id, duration); + Ok(()) + }, + ); + } +} diff --git a/src/world/mod.rs b/src/world/mod.rs index f8d0a17..44d7d1c 100644 --- a/src/world/mod.rs +++ b/src/world/mod.rs @@ -7,10 +7,13 @@ mod chat_handler; pub use chat_handler::ChatHandler; mod connection; -pub use connection::{LuaPlayer, PlayerData, StatusEffects, ZoneConnection}; +pub use connection::{PlayerData, StatusEffects, ZoneConnection}; mod database; pub use database::{CharacterData, WorldDatabase}; mod inventory; pub use inventory::{EquippedContainer, Inventory, Item}; + +mod lua; +pub use lua::LuaPlayer;