1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-05-12 14:47:46 +00:00

Clean up talk event handling, use Event struct

This commit is contained in:
Joshua Goins 2025-05-05 21:15:03 -04:00
parent 873d7f5951
commit afbadf85c4
4 changed files with 42 additions and 46 deletions

View file

@ -1,9 +1,9 @@
--- TODO: find a way to hardcode it this way --- TODO: find a way to hardcode it this way
EVENT_ID = 131079 EVENT_ID = 131079
function onTalk(actorId, player) function onTalk(target, player)
-- has inn access -- has inn access
player:play_scene(actorId, EVENT_ID, 00001, 8192, 0) player:play_scene(target, EVENT_ID, 00001, 8192, 0)
-- doesn't have inn access -- doesn't have inn access
--player:play_scene(actorId, EVENT_ID, 00002, 8192, 0) --player:play_scene(actorId, EVENT_ID, 00002, 8192, 0)

View file

@ -21,7 +21,7 @@ use kawari::packet::{
ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, send_keep_alive, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, send_keep_alive,
}; };
use kawari::world::{ use kawari::world::{
Actor, ClientHandle, EffectsBuilder, FromServer, LuaPlayer, PlayerData, ServerHandle, Actor, ClientHandle, EffectsBuilder, Event, FromServer, LuaPlayer, PlayerData, ServerHandle,
StatusEffects, ToServer, WorldDatabase, handle_custom_ipc, server_main_loop, StatusEffects, ToServer, WorldDatabase, handle_custom_ipc, server_main_loop,
}; };
use kawari::world::{ChatHandler, Zone, ZoneConnection}; use kawari::world::{ChatHandler, Zone, ZoneConnection};
@ -726,7 +726,7 @@ async fn client_loop(
connection.send_inventory(true).await; connection.send_inventory(true).await;
} }
ClientZoneIpcData::StartTalkEvent { actor_id, event_id } => { ClientZoneIpcData::StartTalkEvent { actor_id, event_id } => {
// load scene // load event
{ {
let ipc = ServerZoneIpcSegment { let ipc = ServerZoneIpcSegment {
op_code: ServerZoneIpcType::EventStart, op_code: ServerZoneIpcType::EventStart,
@ -740,8 +740,6 @@ async fn client_loop(
..Default::default() ..Default::default()
}; };
dbg!(&ipc);
connection connection
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
@ -758,35 +756,12 @@ async fn client_loop(
if let Some(event_script) = if let Some(event_script) =
state.event_scripts.get(event_id) state.event_scripts.get(event_id)
{ {
// run script connection.event = Some(Event::new(&event_script));
lua.scope(|scope| { connection
let connection_data = scope .event
.create_userdata_ref_mut(&mut lua_player) .as_mut()
.unwrap(); .unwrap()
.talk(*actor_id, &mut lua_player);
let config = get_config();
let file_name = format!(
"{}/{}",
&config.world.scripts_location, event_script
);
lua.load(
std::fs::read(&file_name)
.expect("Failed to locate scripts directory!"),
)
.set_name("@".to_string() + &file_name)
.exec()
.unwrap();
let func: Function =
lua.globals().get("onTalk").unwrap();
func.call::<()>((actor_id.object_id.0, &connection_data))
.unwrap();
Ok(())
})
.unwrap();
} else { } else {
tracing::warn!("Event {event_id} isn't scripted yet! Ignoring..."); tracing::warn!("Event {event_id} isn't scripted yet! Ignoring...");
} }
@ -818,6 +793,7 @@ async fn client_loop(
.await; .await;
} }
// give back control to the player
{ {
let ipc = ServerZoneIpcSegment { let ipc = ServerZoneIpcSegment {
op_code: ServerZoneIpcType::Unk18, op_code: ServerZoneIpcType::Unk18,

View file

@ -1,6 +1,6 @@
use mlua::{Function, Lua}; use mlua::{Function, Lua};
use crate::config::get_config; use crate::{common::ObjectTypeId, config::get_config};
use super::{LuaPlayer, Zone}; use super::{LuaPlayer, Zone};
@ -50,4 +50,18 @@ impl Event {
}) })
.unwrap(); .unwrap();
} }
pub fn talk(&mut self, target_id: ObjectTypeId, player: &mut LuaPlayer) {
self.lua
.scope(|scope| {
let player = scope.create_userdata_ref_mut(player).unwrap();
let func: Function = self.lua.globals().get("onTalk").unwrap();
func.call::<()>((target_id, player)).unwrap();
Ok(())
})
.unwrap();
}
} }

View file

@ -1,7 +1,7 @@
use mlua::{FromLua, Lua, LuaSerdeExt, UserData, UserDataMethods, Value}; use mlua::{FromLua, Lua, LuaSerdeExt, UserData, UserDataMethods, Value};
use crate::{ use crate::{
common::{ObjectId, ObjectTypeId, Position, timestamp_secs, workdefinitions::RemakeMode}, common::{ObjectTypeId, Position, timestamp_secs, workdefinitions::RemakeMode},
ipc::zone::{ ipc::zone::{
ActionEffect, DamageElement, DamageKind, DamageType, EffectKind, EventScene, ActionEffect, DamageElement, DamageKind, DamageType, EffectKind, EventScene,
ServerZoneIpcData, ServerZoneIpcSegment, Warp, ServerZoneIpcData, ServerZoneIpcSegment, Warp,
@ -55,7 +55,7 @@ impl LuaPlayer {
fn play_scene( fn play_scene(
&mut self, &mut self,
actor_id: u32, target: ObjectTypeId,
event_id: u32, event_id: u32,
scene: u16, scene: u16,
scene_flags: u32, scene_flags: u32,
@ -65,10 +65,7 @@ impl LuaPlayer {
op_code: ServerZoneIpcType::EventScene, op_code: ServerZoneIpcType::EventScene,
timestamp: timestamp_secs(), timestamp: timestamp_secs(),
data: ServerZoneIpcData::EventScene(EventScene { data: ServerZoneIpcData::EventScene(EventScene {
actor_id: ObjectTypeId { actor_id: target,
object_id: ObjectId(actor_id),
object_type: 1,
},
event_id, event_id,
scene, scene,
scene_flags, scene_flags,
@ -78,8 +75,6 @@ impl LuaPlayer {
..Default::default() ..Default::default()
}; };
dbg!(&ipc);
self.queue_segment(PacketSegment { self.queue_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id,
@ -131,8 +126,8 @@ impl UserData for LuaPlayer {
); );
methods.add_method_mut( methods.add_method_mut(
"play_scene", "play_scene",
|_, this, (actor_id, event_id, scene, scene_flags, param): (u32, u32, u16, u32, u8)| { |_, this, (target, event_id, scene, scene_flags, param): (ObjectTypeId, u32, u16, u32, u8)| {
this.play_scene(actor_id, event_id, scene, scene_flags, param); this.play_scene(target, event_id, scene, scene_flags, param);
Ok(()) Ok(())
}, },
); );
@ -163,6 +158,17 @@ impl FromLua for Position {
} }
} }
impl UserData for ObjectTypeId {}
impl FromLua for ObjectTypeId {
fn from_lua(value: Value, _: &Lua) -> mlua::Result<Self> {
match value {
Value::UserData(ud) => Ok(*ud.borrow::<Self>()?),
_ => unreachable!(),
}
}
}
impl UserData for Zone { impl UserData for Zone {
fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) { fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
methods.add_method( methods.add_method(