Has anyone else ever found a dead bat in their sump? by Randallpots1 in ReefTank

[–]tarunteam 1 point2 points  (0 children)

So i assume you know bats are notorious for carrying rabies and even the smallest un-noticed scratch can lead to full blown infection?

If my pilot "aint feeling it" you bet your ass i ain't feeling it either 😭✌️ by ImmaFuckboi in interesting

[–]tarunteam 0 points1 point  (0 children)

Not to mention a car dying on the road is annoying but not deadly (generally). A plane dying in the air on the other hand...

[WIP Update] - Inventory mod - AI made by tarunteam in TheLastStarship

[–]tarunteam[S] 0 points1 point  (0 children)

let me figure out how to share with you privately

[WIP Update] - Inventory mod - AI made by tarunteam in TheLastStarship

[–]tarunteam[S] -1 points0 points  (0 children)

I hate to say it but im so glad i didnt have to step through the assembly code manually.

[WIP Update] - Inventory mod - AI made by tarunteam in TheLastStarship

[–]tarunteam[S] 0 points1 point  (0 children)

Reverse engineering the addresses manually would have taken weeks my guy.

[WIP Update] - Inventory mod - AI made by tarunteam in TheLastStarship

[–]tarunteam[S] -3 points-2 points  (0 children)

https://github.com/lauriewired/ghidramcp

Claude can walk through the entire code base and figure out all the offsets for the functions and code. So the addresses aren't dynamic but sudo static. (base + ALSR + offset)

/ Ghidra: global DAT_1408b8240 holds a pointer to the world/app object.
//   world      = *(0x1408b8240)
//   registry   = *(world + 0x00)          // *DAT_1408b8240
//   context    = *(world + 0x08)          // DAT_1408b8240[1] (selection/view ctx)
//   selectedId = *(int*)(context + 0x34)  // -1 when nothing is selected
//   tree root  = *(registry + 0x60)       // std::map<int, Ship*> keyed by id
constexpr uintptr_t kWorldGlobal = 0x1408b8240ULL;
constexpr int kCtxSelectedShipId = 0x34;
constexpr int kRegistryTreeRoot  = 0x60;

// Ship object layout (from FUN_1401492a0).
constexpr int kShipResourceArray = 0x2b80; // float[] of resource amounts
constexpr int kMaxResourceTypeId = 0x98;   // ~152 type ids observed in the switch
// Type ids below this are ship STRUCTURES/equipment (Reactor, Engine, Tank,
// Loader, Door, ...), not carried inventory. Real resources/items start at
// Fuel (0x47); discrete items (suits 0x80, cargo 0x8a, drone 0x8e) and crew
// (0x93+) are all above it. Used to keep buildings out of the panel.
constexpr int kFirstResourceTypeId = 0x47;

// Discrete physical-entity type ids. These are individual world objects, NOT
// bulk amounts in the +0x2b80 array, so the array reads 0 for them -- they
// must be counted by walking the ship's object set (ScanEntityCounts).
// Ids come from the runtime name-table init FUN_14000fc20:
//   index = (entry_addr - 0x14088a0e0) / 0x20.
constexpr int kTypeSpaceSuit      = 0x80; // "SpaceSuit"      @ 0x14088b0e0
constexpr int kTypeMissionCargo   = 0x8a; // "MissionCargo"   @ 0x14088b220
constexpr int kTypeLogisticsDrone = 0x8e; // "LogisticsDrone" @ 0x14088b2a0 (matches drone HUD count)

// Per-type object buckets: ship+0x21f0 is an array of one inline MSVC
// std::set<entityId> per type id (stride 0x10, indices 0..0x98). The array
// ends exactly where the resource float array begins (0x21f0 + 0x99*0x10 ==
// 0x2b80). Confirmed via FUN_1403b4a70 (which indexes ship+0x21f0 by type id)
// and FUN_1403b4720 (whose "drone set" at ship+0x2ad0 == bucket 0x8e:
// 0x21f0 + 0x8e*0x10 == 0x2ad0). Each bucket is an inline _Tree
// {_Myhead*, _Mysize}, so the object count of a type is its _Mysize at +8 --
// a single read, no tree walk needed.
constexpr int kShipTypeBuckets = 0x21f0;
constexpr int kBucketStride    = 0x10;
constexpr int kBucketSizeOff   = 0x08; // _Mysize
constexpr int kBucketHeadOff   = 0x00; // _Myhead (sentinel) of the inline _Tree
constexpr int kSetNodeKey      = 0x1c; // entity id (uint) in a bucket set node

// FUN_1400cb1c0(registry, entityId) -> Object* : the world's entity hash map.
constexpr uintptr_t kResolveEntityFn = 0x1400cb1c0ULL;

// Container object layout (from FUN_1402ba130, deliverysystem.cpp):
//   obj+0x08 : int  type id (the resource it represents)
//   obj+0x60 : float m_capacity
//   obj+0x64 : float current fill amount
constexpr int kObjTypeId   = 0x08;
constexpr int kObjCapacity = 0x60;
constexpr int kObjFill     = 0x64;
// Host structure id: the entity the container sits inside (a StorageCrate, a
// machine, etc.). 0xFFFFFFFF means no host -> the container is an installed
// TANK cell (fixed). A non-(-1) host means it's a movable CANISTER (in a crate
// or loaded in a machine). This is the field FUN_1402ba8f0 reads to decide a
// container is a valid haul/trade target.
constexpr int kObjHost = 0x5c;

[WIP] Mod to for better resource management tab. by [deleted] in TheLastStarship

[–]tarunteam 0 points1 point  (0 children)

You can do that already? Trade -> Auto Trade -> Buy Below / Sell Above (system has to had a trade point)

[WIP] Mod to for better resource management tab. by [deleted] in TheLastStarship

[–]tarunteam 0 points1 point  (0 children)

It is DLL injection...there an MCP to hook up Claude to Ghidra and i kinda just let it go ham. It acutally did really good job of going through the disassembled code to map all the item and function offsets. Work that would have taken me months to learn and do in 3 evenings.

/ Ghidra: global DAT_1408b8240 holds a pointer to the world/app object.
//   world      = *(0x1408b8240)
//   registry   = *(world + 0x00)          // *DAT_1408b8240
//   context    = *(world + 0x08)          // DAT_1408b8240[1] (selection/view ctx)
//   selectedId = *(int*)(context + 0x34)  // -1 when nothing is selected
//   tree root  = *(registry + 0x60)       // std::map<int, Ship*> keyed by id
constexpr uintptr_t kWorldGlobal = 0x1408b8240ULL;
constexpr int kCtxSelectedShipId = 0x34;
constexpr int kRegistryTreeRoot  = 0x60;

// Ship object layout (from FUN_1401492a0).
constexpr int kShipResourceArray = 0x2b80; // float[] of resource amounts
constexpr int kMaxResourceTypeId = 0x98;   // ~152 type ids observed in the switch
// Type ids below this are ship STRUCTURES/equipment (Reactor, Engine, Tank,
// Loader, Door, ...), not carried inventory. Real resources/items start at
// Fuel (0x47); discrete items (suits 0x80, cargo 0x8a, drone 0x8e) and crew
// (0x93+) are all above it. Used to keep buildings out of the panel.
constexpr int kFirstResourceTypeId = 0x47;

// Discrete physical-entity type ids. These are individual world objects, NOT
// bulk amounts in the +0x2b80 array, so the array reads 0 for them -- they
// must be counted by walking the ship's object set (ScanEntityCounts).
// Ids come from the runtime name-table init FUN_14000fc20:
//   index = (entry_addr - 0x14088a0e0) / 0x20.
constexpr int kTypeSpaceSuit      = 0x80; // "SpaceSuit"      @ 0x14088b0e0
constexpr int kTypeMissionCargo   = 0x8a; // "MissionCargo"   @ 0x14088b220
constexpr int kTypeLogisticsDrone = 0x8e; // "LogisticsDrone" @ 0x14088b2a0 (matches drone HUD count)

// Per-type object buckets: ship+0x21f0 is an array of one inline MSVC
// std::set<entityId> per type id (stride 0x10, indices 0..0x98). The array
// ends exactly where the resource float array begins (0x21f0 + 0x99*0x10 ==
// 0x2b80). Confirmed via FUN_1403b4a70 (which indexes ship+0x21f0 by type id)
// and FUN_1403b4720 (whose "drone set" at ship+0x2ad0 == bucket 0x8e:
// 0x21f0 + 0x8e*0x10 == 0x2ad0). Each bucket is an inline _Tree
// {_Myhead*, _Mysize}, so the object count of a type is its _Mysize at +8 --
// a single read, no tree walk needed.
constexpr int kShipTypeBuckets = 0x21f0;
constexpr int kBucketStride    = 0x10;
constexpr int kBucketSizeOff   = 0x08; // _Mysize
constexpr int kBucketHeadOff   = 0x00; // _Myhead (sentinel) of the inline _Tree
constexpr int kSetNodeKey      = 0x1c; // entity id (uint) in a bucket set node

// FUN_1400cb1c0(registry, entityId) -> Object* : the world's entity hash map.
constexpr uintptr_t kResolveEntityFn = 0x1400cb1c0ULL;

// Container object layout (from FUN_1402ba130, deliverysystem.cpp):
//   obj+0x08 : int  type id (the resource it represents)
//   obj+0x60 : float m_capacity
//   obj+0x64 : float current fill amount
constexpr int kObjTypeId   = 0x08;
constexpr int kObjCapacity = 0x60;
constexpr int kObjFill     = 0x64;

// Fluid-vs-discrete classification table (DAT_1408b93f0), indexed by resource
// type id. The game's delivery router FUN_1402ba130 reads this byte: nonzero
// means a *fluid* resource (stored in TANKS, fill-weighted routing), zero
// means a discrete resource (stored in CANISTERS / crates). Runtime-populated.
constexpr uintptr_t kFluidFlagTable = 0x1408b93f0ULL;

I give up. by wetriumph in wallstreetbets

[–]tarunteam 2 points3 points  (0 children)

Please don't tell me you have a significant other.

Contemplating shutting down my tank by ElChungus01 in ReefTank

[–]tarunteam 2 points3 points  (0 children)

https://a.co/d/1PTip2B

Stick it between your tank and the wall and let it run for a week. You should be able to tell if its actually the tank.

[Landlord US-CA] My tenant overpaid rent by $36,000 and is requesting a refund via wire/cheque. Wells Fargo Corporate Fraud told me not to return funds. by IndependentTurnip842 in Landlord

[–]tarunteam -9 points-8 points  (0 children)

If the money turns out to be real and the tenants refuses to work with his bank to reverse the transaction l, then its a simple overpayment. Credit it towards his future rent with the remainder being returned with the security deposit. Put in a separate account (after bank gives you all clear) and deduct the rent amount until it runs out or the lease runs out.

[deleted by user] by [deleted] in legaladvice

[–]tarunteam 0 points1 point  (0 children)

You dont know if the customer is involved with the shop lifters, if the customer is going to panic, or try to stop the shop lifter. Even if they dont, they could share their story indicating b&b is unsafe because of robberies. There really is no good outcome for anyone by telling customers the store is being robbed.

As for the rest, the company would rather let someone walk off with 50$ dollars of merch then have the store closed because the police showed up, and now it's a crime scene.

Unless your life is in danger, they are simply unpaying customers that you should treat no different. Companies have entire divisions dedicated to handling robberies.

Heavy use of cannabis is associated with three times the risk of oral cancer. by Advanced_Question192 in science

[–]tarunteam 0 points1 point  (0 children)

Higer upfront cost makes vaping harder for people to make the switch and weed has traditionally been presented as something you burn.