implement get_entity and get_entity_mut

This commit is contained in:
bgkillas 2025-07-15 14:47:06 -04:00
parent 2a7d3a5c46
commit e9faa77b28
4 changed files with 37 additions and 48 deletions

View file

@ -7,8 +7,7 @@ use eyre::{Context, OptionExt, bail};
use modules::{Module, ModuleCtx, entity_sync::EntitySync};
use net::NetManager;
use noita_api::add_lua_fn;
use noita_api::addr_grabber::{grab_addrs, grabbed_fns, grabbed_globals};
use noita_api::noita::types::Entity;
use noita_api::addr_grabber::{grab_addrs, grabbed_globals};
use noita_api::noita::world::ParticleWorldState;
use noita_api::{
DamageModelComponent, EntityID, VariableStorageComponent,
@ -20,8 +19,6 @@ use noita_api::{
use rustc_hash::{FxHashMap, FxHashSet};
use shared::des::{Gid, RemoteDes};
use shared::{Destination, NoitaInbound, NoitaOutbound, PeerId, SpawnOnce, WorldPos};
#[cfg(target_arch = "x86")]
use std::arch::asm;
use std::array::IntoIter;
use std::backtrace::Backtrace;
use std::mem::MaybeUninit;
@ -156,26 +153,12 @@ fn init_particle_world_state(lua: LuaState) -> eyre::Result<()> {
pub fn ephemerial(entity_id: u32) -> eyre::Result<()> {
unsafe {
let entity_manager = grabbed_globals().entity_manager.read();
let entity: *mut Entity;
#[cfg(target_arch = "x86")]
asm!(
"mov ecx, {entity_manager}",
"push {entity_id:e}",
"call {get_entity}",
entity_manager = in(reg) entity_manager,
get_entity = in(reg) grabbed_fns().get_entity,
entity_id = in(reg) entity_id,
clobber_abi("C"),
out("ecx") _,
out("eax") entity,
);
#[cfg(not(target_arch = "x86"))]
let entity_manager = grabbed_globals().entity_manager.as_ref().unwrap();
if let Some(entity) = entity_manager
.as_ref()
.unwrap()
.get_entity_mut(entity_id as isize)
{
std::hint::black_box((entity_manager, grabbed_fns().get_entity));
entity = Default::default();
}
if let Some(entity) = entity.as_mut() {
entity.filename_index = 0;
} else {
bail!("Entity {entity_id} not found");

View file

@ -15,14 +15,12 @@ impl Module for WorldSync {
runs: Vec::with_capacity(16384),
};
let mut upd = std::array::from_fn(|_| None);
let time = std::time::Instant::now();
unsafe {
self.particle_world_state
.assume_init_ref()
.encode_world(ChunkCoord(-2, -7), &mut upd)?;
}
std::hint::black_box(upd);
noita_api::print!("{:?}", time.elapsed().as_micros());
let msg = NoitaOutbound::WorldSyncToProxy(WorldSyncToProxy::Updates(vec![update]));
ctx.net.send(&msg)?;
Ok(())