make get function for std map work

This commit is contained in:
bgkillas 2025-07-18 19:08:52 -04:00
parent bd237869e7
commit d15ccb2f5d
3 changed files with 19 additions and 48 deletions

View file

@ -8,7 +8,6 @@ use modules::{Module, ModuleCtx, entity_sync::EntitySync};
use net::NetManager;
use noita_api::add_lua_fn;
use noita_api::addr_grabber::{grab_addrs, grabbed_globals};
use noita_api::noita::types::TagManager;
use noita_api::noita::world::ParticleWorldState;
use noita_api::{
DamageModelComponent, EntityID, VariableStorageComponent,
@ -330,41 +329,6 @@ fn module_on_world_init(_lua: LuaState) -> eyre::Result<()> {
fn module_on_world_update(_lua: LuaState) -> eyre::Result<()> {
//let _tracker = TimeTracker::new("on_world_update");
if noita_api::raw::game_get_frame_num()? > 120 {
unsafe {
let gg = grabbed_globals()
.entity_manager
.as_ref()
.unwrap()
.as_ref()
.unwrap();
noita_api::print!("{:?}", gg.iter_component_managers().collect::<Vec<_>>());
if let Some(e) = gg
.iter_entities()
.find(|e| e.name.to_string() == "DEBUG_NAME:player")
{
noita_api::print!("{:?}", gg.iter_all_components(e).collect::<Vec<_>>())
}
let mgr = (0x01206fac as *const *const TagManager)
.as_ref()
.unwrap()
.as_ref()
.unwrap();
noita_api::print!("{:?}", mgr);
noita_api::print!("{:?}", mgr.tags.iter().collect::<Vec<_>>());
noita_api::print!("{:?}", mgr.tags.iter().collect::<Vec<_>>().len());
noita_api::print!("{:?}", mgr.tags.len);
let mgr = (0x01204b30 as *const *const TagManager)
.as_ref()
.unwrap()
.as_ref()
.unwrap();
noita_api::print!("{:?}", mgr);
noita_api::print!("{:?}", mgr.tags.iter().collect::<Vec<_>>());
noita_api::print!("{:?}", mgr.tags.iter().collect::<Vec<_>>().len());
noita_api::print!("{:?}", mgr.tags.len);
}
}
with_every_module(|ctx, module| module.on_world_update(ctx))
}

View file

@ -45,6 +45,15 @@ impl<'a> StdString {
let actual_len = slice.iter().position(|&b| b == 0).unwrap_or(self.size);
str::from_utf8(&slice[..actual_len]).unwrap()
}
pub fn get(&self, index: usize) -> u8 {
unsafe {
if self.capacity <= 16 {
self.buffer.sso_buffer[index]
} else {
self.buffer.buffer.add(index).read()
}
}
}
}
impl From<&str> for StdString {
fn from(value: &str) -> Self {
@ -90,17 +99,14 @@ impl PartialOrd for StdString {
impl Eq for StdString {}
impl Ord for StdString {
fn cmp(&self, other: &Self) -> Ordering {
match self.size.cmp(&other.size) {
Ordering::Less => Ordering::Less,
Ordering::Equal => {
if self == other {
Ordering::Equal
} else {
Ordering::Less
let smallest = self.size.min(other.size);
for i in 0..smallest {
match self.get(i).cmp(&other.get(i)) {
Ordering::Equal => continue,
non_eq => return non_eq,
}
}
Ordering::Greater => Ordering::Greater,
}
self.size.cmp(&other.size)
}
}
#[repr(transparent)]
@ -140,7 +146,8 @@ pub struct StdMapNode<K, V> {
pub parent: *const StdMapNode<K, V>,
pub right: *const StdMapNode<K, V>,
pub color: bool,
pad: [u8; 3],
pub end: bool,
unk: [u8; 2],
pub key: K,
pub value: V,
}
@ -187,7 +194,7 @@ impl<K: 'static, V: 'static> StdMap<K, V> {
StdMapIter {
root: self.root,
current: unsafe { self.root.as_ref().unwrap().parent },
parents: Vec::with_capacity(12),
parents: Vec::with_capacity(8),
}
}
pub fn iter_keys(&self) -> impl Iterator<Item = &'static K> {

View file

@ -4,6 +4,6 @@ use crate::noita::types::{StdMap, StdString};
#[derive(Debug)]
pub struct TagManager {
unk1: [isize; 3],
pub tags: StdMap<StdString, usize>,
pub tags: StdMap<StdString, [u8; 4]>,
//TODO unk
}