From 06aa7ab70cd5b497364fc85c4464315a1e0426a7 Mon Sep 17 00:00:00 2001 From: ccgauche Date: Wed, 17 Feb 2021 00:11:05 +0100 Subject: [PATCH] Retrieves added + New ECS memory layout for plugins --- Cargo.lock | 1 + assets/plugins/hello.wasm | Bin 0 -> 285734 bytes assets/plugins/plugin1.plugin.tar | 4 +- common/Cargo.toml | 35 ++++--- common/src/lib.rs | 55 +++++++---- common/src/uid.rs | 9 ++ common/sys/src/plugin/memory_manager.rs | 103 ++++++++++++++++----- common/sys/src/plugin/mod.rs | 2 +- common/sys/src/plugin/module.rs | 118 +++++++++++++++++------- common/sys/src/plugin/wasm_env.rs | 42 ++++++--- common/sys/src/state.rs | 14 +-- plugin/api/Cargo.toml | 1 + plugin/api/src/lib.rs | 34 +------ plugin/rt/examples/hello.rs | 8 +- plugin/rt/src/lib.rs | 46 ++++++--- plugin/rt/src/retreive.rs | 12 ++- server/src/lib.rs | 15 +-- 17 files changed, 328 insertions(+), 171 deletions(-) create mode 100644 assets/plugins/hello.wasm diff --git a/Cargo.lock b/Cargo.lock index d8426940ff..d394200d4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5699,6 +5699,7 @@ name = "veloren-plugin-api" version = "0.1.0" dependencies = [ "serde", + "veloren-common", ] [[package]] diff --git a/assets/plugins/hello.wasm b/assets/plugins/hello.wasm new file mode 100644 index 0000000000000000000000000000000000000000..71c52f6d82ab31a9f165277f077f1f179b063fa5 GIT binary patch literal 285734 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 pYX0K#knUA=CrnN~e5q$WBJ&sI0qsr) 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 g+$>sk{C4oW fmt::Result { write!(f, "{}", self.0) } } +#[cfg(not(target_arch = "wasm32"))] impl Component for Uid { type Storage = FlaggedStorage>; } +#[cfg(not(target_arch = "wasm32"))] impl Marker for Uid { type Allocator = UidAllocator; type Identifier = u64; @@ -37,11 +41,14 @@ impl Marker for Uid { } } +#[cfg(not(target_arch = "wasm32"))] +#[derive(Debug)] pub struct UidAllocator { index: u64, mapping: HashMap, } +#[cfg(not(target_arch = "wasm32"))] impl UidAllocator { pub fn new() -> Self { Self { @@ -55,10 +62,12 @@ impl UidAllocator { pub fn remove_entity(&mut self, id: u64) -> Option { self.mapping.remove(&id) } } +#[cfg(not(target_arch = "wasm32"))] impl Default for UidAllocator { fn default() -> Self { Self::new() } } +#[cfg(not(target_arch = "wasm32"))] impl MarkerAllocator for UidAllocator { fn allocate(&mut self, entity: Entity, id: Option) -> Uid { let id = id.unwrap_or_else(|| { diff --git a/common/sys/src/plugin/memory_manager.rs b/common/sys/src/plugin/memory_manager.rs index b242587a45..353909439b 100644 --- a/common/sys/src/plugin/memory_manager.rs +++ b/common/sys/src/plugin/memory_manager.rs @@ -1,49 +1,105 @@ -use std::sync::atomic::{AtomicI32, AtomicU32, Ordering}; +use std::sync::atomic::{AtomicI32, AtomicPtr, AtomicU32, AtomicU64, Ordering}; -use serde::{Serialize, de::DeserializeOwned}; +use serde::{de::DeserializeOwned, Serialize}; +use specs::World; use wasmer::{Function, Memory, Value}; use super::errors::{MemoryAllocationError, PluginModuleError}; +// This structure wraps the ECS pointer to ensure safety +pub struct EcsAccessManager { + ecs_pointer: AtomicPtr, +} + +impl Default for EcsAccessManager { + + fn default() -> Self { + Self { + ecs_pointer: AtomicPtr::new(std::ptr::null_mut::<_>()) + } + } +} + +impl EcsAccessManager { + + pub fn execute_with(&self, world: &World, func: impl FnOnce() -> T) -> T { + self.ecs_pointer.store(world as *const _ as *mut _, Ordering::SeqCst); + let out = func(); + self.ecs_pointer.store(std::ptr::null_mut::<_>(), Ordering::SeqCst); + out + } + + pub fn get(&self) -> Option<&World> { + // ptr::as_ref will automatically check for null + unsafe {self.ecs_pointer.load(Ordering::SeqCst).as_ref()} + } +} pub struct MemoryManager { pub pointer: AtomicI32, - pub length: AtomicU32 + pub length: AtomicU32, } -impl MemoryManager { - - pub fn new() -> Self{ +impl Default for MemoryManager { + fn default() -> Self { Self { pointer: AtomicI32::new(0), length: AtomicU32::new(0), } } +} - // This function check if the buffer is wide enough if not it realloc the buffer calling the `wasm_prepare_buffer` function - // Note: There is probably optimizations that can be done using less restrictive ordering - pub fn get_pointer(&self, object_length: u32, allocator: &Function) -> Result { +impl MemoryManager { + + // This function check if the buffer is wide enough if not it realloc the buffer + // calling the `wasm_prepare_buffer` function Note: There is probably + // optimizations that can be done using less restrictive ordering + pub fn get_pointer( + &self, + object_length: u32, + allocator: &Function, + ) -> Result { if self.length.load(Ordering::SeqCst) >= object_length { return Ok(self.pointer.load(Ordering::SeqCst)); } let pointer = allocator .call(&[Value::I32(object_length as i32)]) .map_err(MemoryAllocationError::CantAllocate)?; - let pointer= pointer[0].i32().ok_or(MemoryAllocationError::InvalidReturnType)?; + let pointer = pointer[0] + .i32() + .ok_or(MemoryAllocationError::InvalidReturnType)?; self.length.store(object_length, Ordering::SeqCst); self.pointer.store(pointer, Ordering::SeqCst); Ok(pointer) } - - // This function writes an object to WASM memory returning a pointer and a length. Will realloc the buffer is not wide enough - pub fn write_data(&self, memory: &Memory, allocator: &Function ,object: &T) -> Result<(i32,u32),PluginModuleError> { - self.write_bytes(memory,allocator,&bincode::serialize(object).map_err(PluginModuleError::Encoding)?) + + // This function writes an object to WASM memory returning a pointer and a + // length. Will realloc the buffer is not wide enough + pub fn write_data( + &self, + memory: &Memory, + allocator: &Function, + object: &T, + ) -> Result<(i32, u32), PluginModuleError> { + self.write_bytes( + memory, + allocator, + &bincode::serialize(object).map_err(PluginModuleError::Encoding)?, + ) } - // This function writes an raw bytes to WASM memory returning a pointer and a length. Will realloc the buffer is not wide enough - pub fn write_bytes(&self, memory: &Memory, allocator: &Function ,array: &[u8]) -> Result<(i32,u32),PluginModuleError> { + // This function writes an raw bytes to WASM memory returning a pointer and a + // length. Will realloc the buffer is not wide enough + pub fn write_bytes( + &self, + memory: &Memory, + allocator: &Function, + array: &[u8], + ) -> Result<(i32, u32), PluginModuleError> { let len = array.len(); - let mem_position = self.get_pointer(len as u32, allocator).map_err(PluginModuleError::MemoryAllocation)? as usize; + let mem_position = self + .get_pointer(len as u32, allocator) + .map_err(PluginModuleError::MemoryAllocation)? as usize; memory.view()[mem_position..mem_position + len] .iter() .zip(array.iter()) @@ -52,9 +108,14 @@ impl MemoryManager { } } -// This function read data from memory at a position with the array length and converts it to an object using bincode -pub fn read_data(memory: &Memory, position: i32, length: u32) -> Result { - bincode::deserialize(&read_bytes(memory,position,length)) +// This function read data from memory at a position with the array length and +// converts it to an object using bincode +pub fn read_data( + memory: &Memory, + position: i32, + length: u32, +) -> Result { + bincode::deserialize(&read_bytes(memory, position, length)) } // This function read raw bytes from memory at a position with the array length @@ -63,4 +124,4 @@ pub fn read_bytes(memory: &Memory, position: i32, length: u32) -> Vec { .iter() .map(|x| x.get()) .collect::>() -} \ No newline at end of file +} diff --git a/common/sys/src/plugin/mod.rs b/common/sys/src/plugin/mod.rs index c393dacf13..2d2c0a8342 100644 --- a/common/sys/src/plugin/mod.rs +++ b/common/sys/src/plugin/mod.rs @@ -1,7 +1,7 @@ pub mod errors; +pub mod memory_manager; pub mod module; pub mod wasm_env; -pub mod memory_manager; use common::assets::ASSETS_PATH; use serde::{Deserialize, Serialize}; diff --git a/common/sys/src/plugin/module.rs b/common/sys/src/plugin/module.rs index fe314936cc..a150d5af03 100644 --- a/common/sys/src/plugin/module.rs +++ b/common/sys/src/plugin/module.rs @@ -1,19 +1,19 @@ -use std::{collections::HashSet, convert::TryInto, marker::PhantomData, sync::{Arc, Mutex, atomic::AtomicI32}}; -use specs::World; -use wasmer::{ - imports, Cranelift, Function, Instance, Memory, Module, - Store, Value, JIT, -}; +use std::{collections::HashSet, convert::TryInto, marker::PhantomData, sync::{Arc, Mutex}}; -use super::{errors::{PluginError, PluginModuleError}, memory_manager::{self, MemoryManager}, wasm_env::HostFunctionEnvironement}; +use common::{comp::Player, uid::UidAllocator}; +use common_net::sync::WorldSyncExt; +use specs::{World, WorldExt, saveload::MarkerAllocator}; +use wasmer::{imports, Cranelift, Function, Instance, Memory, Module, Store, Value, JIT}; -use plugin_api::{Action, Event}; +use super::{errors::{PluginError, PluginModuleError}, memory_manager::{self, EcsAccessManager, MemoryManager}, wasm_env::HostFunctionEnvironement}; + +use plugin_api::{Action, Event, Retreive}; #[derive(Clone)] // This structure represent the WASM State of the plugin. pub struct PluginModule { - ecs: Arc, + ecs: Arc, wasm_state: Arc>, memory_manager: Arc, events: HashSet, @@ -43,13 +43,42 @@ impl PluginModule { }); } - let ecs = Arc::new(AtomicI32::new(i32::MAX)); - let memory_manager = Arc::new(MemoryManager::new()); + fn raw_retreive_action(env: &HostFunctionEnvironement, ptr: u32, len: u32) -> i64 { + + println!("HOST DEBUG 1"); + // TODO: Handle correctly the error + let data: Retreive = env.read_data(ptr as _, len).unwrap(); + println!("HOST DEBUG 2"); + + let out = match data { + Retreive::GetEntityName(e) => { + println!("HOST DEBUG 3 {:?}",env.ecs.get().is_some()); + let world = env.ecs.get().expect("Can't get entity name because ECS pointer isn't set"); + println!("HOST DEBUG 4 {}",world.has_value::()); + println!("HOST DEBUG 5 {:?}",&*world.read_resource::()); + let player = world.read_resource::().retrieve_entity_internal(e.0).expect("Invalid uid"); + println!("HOST DEBUG 6"); + format!("{:?}",world.read_component::().get(player)) + } + }; + println!("{}",out); + let (ptr,len) = env.write_data(&out).unwrap(); + to_i64(ptr, len as _) + } + + fn dbg(a: i32) { + println!("WASM DEBUG: {}",a); + } + + let ecs = Arc::new(EcsAccessManager::default()); + let memory_manager = Arc::new(MemoryManager::default()); // Create an import object. let import_object = imports! { "env" => { "raw_emit_actions" => Function::new_native_with_env(&store, HostFunctionEnvironement::new(name.clone(), ecs.clone(),memory_manager.clone()), raw_emit_actions), + "raw_retreive_action" => Function::new_native_with_env(&store, HostFunctionEnvironement::new(name.clone(), ecs.clone(),memory_manager.clone()), raw_retreive_action), + "dbg" => Function::new_native(&store, dbg), } }; @@ -59,8 +88,16 @@ impl PluginModule { Ok(Self { memory_manager, ecs, - memory: instance.exports.get_memory("memory").map_err(PluginModuleError::MemoryUninit)?.clone(), - allocator: instance.exports.get_function("wasm_prepare_buffer").map_err(PluginModuleError::MemoryUninit)?.clone(), + memory: instance + .exports + .get_memory("memory") + .map_err(PluginModuleError::MemoryUninit)? + .clone(), + allocator: instance + .exports + .get_function("wasm_prepare_buffer") + .map_err(PluginModuleError::MemoryUninit)? + .clone(), events: instance .exports .iter() @@ -86,21 +123,17 @@ impl PluginModule { return None; } // Store the ECS Pointer for later use in `retreives` - self.ecs.store((&ecs) as *const _ as i32, std::sync::atomic::Ordering::SeqCst); - let bytes = { + let bytes = match self.ecs.execute_with(ecs, || { let mut state = self.wasm_state.lock().unwrap(); - match execute_raw(self,&mut state,event_name,&request.bytes) { - Ok(e) => e, - Err(e) => return Some(Err(e)), - } + execute_raw(self, &mut state, event_name, &request.bytes) + }) { + Ok(e) => e, + Err(e) => return Some(Err(e)), }; - // Remove the ECS Pointer to avoid UB - self.ecs.store(i32::MAX, std::sync::atomic::Ordering::SeqCst); Some(bincode::deserialize(&bytes).map_err(PluginModuleError::Encoding)) } } - // This structure represent a Pre-encoded event object (Useful to avoid // reencoding for each module in every plugin) pub struct PreparedEventQuery { @@ -122,9 +155,18 @@ impl PreparedEventQuery { } } -fn from_i64(i: i64) -> (i32,i32) { +fn from_i64(i: i64) -> (i32, i32) { let i = i.to_le_bytes(); - (i32::from_le_bytes(i[0..4].try_into().unwrap()),i32::from_le_bytes(i[4..8].try_into().unwrap())) + ( + i32::from_le_bytes(i[0..4].try_into().unwrap()), + i32::from_le_bytes(i[4..8].try_into().unwrap()), + ) +} + +pub fn to_i64(a: i32, b: i32) -> i64 { + let a = a.to_le_bytes(); + let b = b.to_le_bytes(); + i64::from_le_bytes([a[0], a[1], a[2], a[3], b[0], b[1], b[2], b[3]]) } // This function is not public because this function should not be used without @@ -136,10 +178,13 @@ fn execute_raw( event_name: &str, bytes: &[u8], ) -> Result, PluginModuleError> { + // This write into memory `bytes` using allocation if necessary returning a + // pointer and a length - // This write into memory `bytes` using allocation if necessary returning a pointer and a length - - let (mem_position,len) = module.memory_manager.write_bytes(&module.memory, &module.allocator, bytes)?; + let (mem_position, len) = + module + .memory_manager + .write_bytes(&module.memory, &module.allocator, bytes)?; // This gets the event function from module exports @@ -153,16 +198,23 @@ fn execute_raw( let function_result = func .call(&[Value::I32(mem_position as i32), Value::I32(len as i32)]) .map_err(PluginModuleError::RunFunction)?; - - // Waiting for `multi-value` to be added to LLVM. So we encode the two i32 as an i64 - let (pointer,length) = from_i64(function_result[0] - .i64() - .ok_or_else(PluginModuleError::InvalidArgumentType)?); + // Waiting for `multi-value` to be added to LLVM. So we encode the two i32 as an + // i64 + + let (pointer, length) = from_i64( + function_result[0] + .i64() + .ok_or_else(PluginModuleError::InvalidArgumentType)?, + ); // We read the return object and deserialize it - Ok(memory_manager::read_bytes(&module.memory, pointer, length as u32)) + Ok(memory_manager::read_bytes( + &module.memory, + pointer, + length as u32, + )) } fn handle_actions(actions: Vec) { diff --git a/common/sys/src/plugin/wasm_env.rs b/common/sys/src/plugin/wasm_env.rs index fc332fc505..ddacc968b2 100644 --- a/common/sys/src/plugin/wasm_env.rs +++ b/common/sys/src/plugin/wasm_env.rs @@ -1,22 +1,23 @@ -use std::sync::Arc; -use std::sync::atomic::AtomicI32; +use std::sync::{atomic::AtomicI32, Arc}; -use serde::{Serialize, de::DeserializeOwned}; +use serde::{de::DeserializeOwned, Serialize}; use wasmer::{Function, HostEnvInitError, Instance, LazyInit, Memory, WasmerEnv}; -use super::{errors::PluginModuleError, memory_manager::{self, MemoryManager}}; +use super::{errors::PluginModuleError, memory_manager::{self, EcsAccessManager, MemoryManager}}; #[derive(Clone)] pub struct HostFunctionEnvironement { - pub ecs: Arc, // This represent the pointer to the ECS object (set to i32::MAX if to ECS is availible) + pub ecs: Arc, /* This represent the pointer to the ECS object (set to i32::MAX if + * to ECS is availible) */ pub memory: LazyInit, // This object represent the WASM Memory pub allocator: LazyInit, // Linked to: wasm_prepare_buffer - pub memory_manager: Arc, // This object represent the current buffer size and pointer + pub memory_manager: Arc, /* This object represent the current buffer size and + * pointer */ pub name: String, // This represent the plugin name } impl HostFunctionEnvironement { - pub fn new(name: String,ecs: Arc,memory_manager: Arc) -> Self { + pub fn new(name: String, ecs: Arc, memory_manager: Arc) -> Self { Self { memory_manager, ecs, @@ -26,13 +27,23 @@ impl HostFunctionEnvironement { } } - // This function is a safe interface to WASM memory that writes data to the memory returning a pointer and length - pub fn write_data(&self, object: &T) -> Result<(i32,u32),PluginModuleError> { - self.memory_manager.write_data(self.memory.get_ref().unwrap(), self.allocator.get_ref().unwrap(), object) + // This function is a safe interface to WASM memory that writes data to the + // memory returning a pointer and length + pub fn write_data(&self, object: &T) -> Result<(i32, u32), PluginModuleError> { + self.memory_manager.write_data( + self.memory.get_ref().unwrap(), + self.allocator.get_ref().unwrap(), + object, + ) } - // This function is a safe interface to WASM memory that reads memory from pointer and length returning an object - pub fn read_data(&self, position: i32, length: u32) -> Result { + // This function is a safe interface to WASM memory that reads memory from + // pointer and length returning an object + pub fn read_data( + &self, + position: i32, + length: u32, + ) -> Result { memory_manager::read_data(self.memory.get_ref().unwrap(), position, length) } } @@ -41,8 +52,11 @@ impl WasmerEnv for HostFunctionEnvironement { fn init_with_instance(&mut self, instance: &Instance) -> Result<(), HostEnvInitError> { let memory = instance.exports.get_memory("memory").unwrap(); self.memory.initialize(memory.clone()); - let allocator = instance.exports.get_function("wasm_prepare_buffer").expect("Can't get allocator"); + let allocator = instance + .exports + .get_function("wasm_prepare_buffer") + .expect("Can't get allocator"); self.allocator.initialize(allocator.clone()); Ok(()) } -} \ No newline at end of file +} diff --git a/common/sys/src/state.rs b/common/sys/src/state.rs index a58cdfd26f..3f0bad997a 100644 --- a/common/sys/src/state.rs +++ b/common/sys/src/state.rs @@ -208,12 +208,14 @@ impl State { #[cfg(feature = "plugins")] ecs.insert(match PluginMgr::from_assets() { Ok(plugin_mgr) => { - if let Err(e) = plugin_mgr - .execute_event(&ecs,"on_load", &plugin_api::event::PluginLoadEvent { game_mode: match game_mode { - resources::GameMode::Server => plugin_api::GameMode::Server, - resources::GameMode::Client => plugin_api::GameMode::Client, - resources::GameMode::Singleplayer => plugin_api::GameMode::Singleplayer, - } }) + if let Err(e) = + plugin_mgr.execute_event(&ecs, "on_load", &plugin_api::event::PluginLoadEvent { + game_mode: match game_mode { + resources::GameMode::Server => plugin_api::GameMode::Server, + resources::GameMode::Client => plugin_api::GameMode::Client, + resources::GameMode::Singleplayer => plugin_api::GameMode::Singleplayer, + }, + }) { tracing::error!(?e, "Failed to run plugin init"); tracing::info!( diff --git a/plugin/api/Cargo.toml b/plugin/api/Cargo.toml index db865e87e5..84d8e9b270 100644 --- a/plugin/api/Cargo.toml +++ b/plugin/api/Cargo.toml @@ -6,3 +6,4 @@ edition = "2018" [dependencies] serde = { version = "1.0.118", features = ["derive"] } +common = { package = "veloren-common", path = "../../common", features = ["no-assets"] } diff --git a/plugin/api/src/lib.rs b/plugin/api/src/lib.rs index 510169de17..ffaf761e94 100644 --- a/plugin/api/src/lib.rs +++ b/plugin/api/src/lib.rs @@ -1,8 +1,7 @@ - -use std::fmt; - use serde::{de::DeserializeOwned, Deserialize, Serialize}; +pub use common::{resources::GameMode, uid::Uid}; + #[derive(Deserialize, Serialize, Debug)] pub enum Action { ServerClose, @@ -20,35 +19,6 @@ pub trait Event: Serialize + DeserializeOwned + Send + Sync { type Response: Serialize + DeserializeOwned + Send + Sync; } -#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] -pub struct Uid(pub u64); - -impl Into for Uid { - fn into(self) -> u64 { self.0 } -} - -impl From for Uid { - fn from(uid: u64) -> Self { Self(uid) } -} - -impl fmt::Display for Uid { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.0) } -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] -pub enum GameMode { - /// The game is being played in server mode (i.e: the code is running - /// server-side) - Server, - /// The game is being played in client mode (i.e: the code is running - /// client-side) - Client, - /// The game is being played in singleplayer mode (i.e: both client and - /// server at once) - // To be used later when we no longer start up an entirely new server for singleplayer - Singleplayer, -} - pub mod event { use super::*; use serde::{Deserialize, Serialize}; diff --git a/plugin/rt/examples/hello.rs b/plugin/rt/examples/hello.rs index 2f596f1a02..6bf7c836a9 100644 --- a/plugin/rt/examples/hello.rs +++ b/plugin/rt/examples/hello.rs @@ -3,7 +3,7 @@ use veloren_plugin_rt::{ *, }; -#[veloren_plugin_rt::event_handler] +#[event_handler] pub fn on_load(load: PluginLoadEvent) { match load.game_mode { GameMode::Server => emit_action(Action::Print("Hello, server!".to_owned())), @@ -15,13 +15,11 @@ pub fn on_load(load: PluginLoadEvent) { #[event_handler] pub fn on_command_testplugin(command: ChatCommandEvent) -> Result, String> { Ok(vec![format!( - "Player of id {:?} sended command with args {:?}", - command.player, command.command_args + "Player of id {:?} named {} sended command with args {:?}", + command.player, command.player.get_entity_name(), command.command_args )]) } - - #[event_handler] pub fn on_player_join(input: PlayerJoinEvent) -> PlayerJoinResult { emit_action(Action::PlayerSendMessage( diff --git a/plugin/rt/src/lib.rs b/plugin/rt/src/lib.rs index d8aa0d4006..c5872f1d05 100644 --- a/plugin/rt/src/lib.rs +++ b/plugin/rt/src/lib.rs @@ -4,6 +4,8 @@ pub extern crate plugin_derive; pub mod retreive; +pub use retreive::*; + use std::convert::TryInto; pub use retreive::*; @@ -16,22 +18,28 @@ use serde::{de::DeserializeOwned, Serialize}; #[cfg(target_arch = "wasm32")] extern "C" { fn raw_emit_actions(ptr: *const u8, len: usize); - //fn raw_retreive_action(ptr: *const u8, len: usize) -> (i32, u32); + fn raw_retreive_action(ptr: *const u8, len: usize) -> i64; + pub fn dbg(i: i32); } -// pub fn retreive_action(_actions: &api::Retreive) -> Result { -// #[cfg(target_arch = "wasm32")] -// { -// let ret = bincode::serialize(&_actions).expect("Can't serialize action in emit"); -// unsafe { -// let (ptr,len) = raw_retreive_action(ret.as_ptr(), ret.len()); -// let a = ::std::slice::from_raw_parts(ptr as _, len as _); -// bincode::deserialize(&a) -// } -// } -// #[cfg(not(target_arch = "wasm32"))] -// unreachable!() -// } +pub fn retreive_action(_actions: &api::Retreive) -> Result { + #[cfg(target_arch = "wasm32")] + { + unsafe{dbg(0);} + let ret = bincode::serialize(&_actions).expect("Can't serialize action in emit"); + unsafe{dbg(1);} + unsafe { + dbg(2); + let (ptr,len) = from_i64(raw_retreive_action(ret.as_ptr(), ret.len())); + dbg(3); + let a = ::std::slice::from_raw_parts(ptr as _, len as _); + dbg(4); + bincode::deserialize(&a) + } + } + #[cfg(not(target_arch = "wasm32"))] + unreachable!() +} pub fn emit_action(action: api::Action) { emit_actions(vec![action]) } @@ -53,10 +61,18 @@ where bincode::deserialize(slice).map_err(|_| "Failed to deserialize function input") } +pub fn from_i64(i: i64) -> (i32, i32) { + let i = i.to_le_bytes(); + ( + i32::from_le_bytes(i[0..4].try_into().unwrap()), + i32::from_le_bytes(i[4..8].try_into().unwrap()), + ) +} + pub fn to_i64(a: i32, b: i32) -> i64 { let a = a.to_le_bytes(); let b = b.to_le_bytes(); - i64::from_le_bytes([a[0],a[1],a[2],a[3],b[0],b[1],b[2],b[3]]) + i64::from_le_bytes([a[0], a[1], a[2], a[3], b[0], b[1], b[2], b[3]]) } pub fn write_output(value: impl Serialize) -> i64 { diff --git a/plugin/rt/src/retreive.rs b/plugin/rt/src/retreive.rs index 1a805307ed..b214009776 100644 --- a/plugin/rt/src/retreive.rs +++ b/plugin/rt/src/retreive.rs @@ -1,13 +1,15 @@ use crate::api::Retreive; -trait GetEntityName { +pub trait GetEntityName { fn get_entity_name(&self) -> String; } impl GetEntityName for crate::api::event::Player { - fn get_entity_name(&self) -> String { - // crate::retreive_action(&Retreive::GetEntityName(self.id)).expect("Can't get entity name") - String::new() + #[cfg(target_arch = "wasm32")] + unsafe { + crate::dbg(-1); + } + crate::retreive_action(&Retreive::GetEntityName(self.id)).expect("Can't get entity name") } -} \ No newline at end of file +} diff --git a/server/src/lib.rs b/server/src/lib.rs index c45175d2a8..70a3bd2aec 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1037,12 +1037,15 @@ impl Server { command: kwd.clone(), command_args: args.split(' ').map(|x| x.to_owned()).collect(), player: plugin_api::event::Player { - id: plugin_api::Uid((self - .state - .ecs() - .read_storage::() - .get(entity) - .expect("Can't get player UUID [This should never appen]")).0), + id: plugin_api::Uid( + (self + .state + .ecs() + .read_storage::() + .get(entity) + .expect("Can't get player UUID [This should never appen]")) + .0, + ), }, }, );