RD42
|
efee24a57d
|
Merge pull request #20 from ricardoofnl/main
[saco] implement/match some func on saco
|
2026-10-04 18:38:39 +02:00 |
|
ricardoofnl
|
79abb3494b
|
[saco] Add FUNC_100120B0; the data buffer is exactly the 4096-byte read cap, and 4097 overshoots the frame by 8
|
2026-09-05 11:00:22 +07:00 |
|
ricardoofnl
|
265d31aa7a
|
[saco] Add FUNC_10011EB0; the new pins the download list at 0x206D and the wire record at 94 bytes
|
2026-09-05 11:00:22 +07:00 |
|
ricardoofnl
|
ee25a8d276
|
Unify FUNC_100B46D0 on the DWORD * return two lanes declared differently
|
2026-09-05 10:58:55 +07:00 |
|
ricardoofnl
|
ed0c20163a
|
[saco] Match GetSpecialAction; the branchless tail needs a BYTE destination or the sbb comes out 32-bit
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
d7ac8188fa
|
[saco] Match FUNC_1001B070; the count is read into an int before the guard and copied to the loop variable inside it, which is what sinks the store past the branch
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
e29832070a
|
[saco] Implement/match FUNC_100B5620; the quaternion to euler conversion doubles with x * 2.0f and reaches asin through the __CIasin intrinsic
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
0c65e210a2
|
[saco] Implement/match FUNC_100B58A0, FUNC_100B5830 and FUNC_100B5480; the D3DX slerp staging quaternions are declared output-first so the later ones land lower on the frame
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
f9d55b7a24
|
[saco] Implement/match FUNC_100B52B0, FUNC_100B5210 and FUNC_100B5500; the quaternion staging struct has to be filled in w,x,y,z field order and 0x100B52B0 is a verbatim second copy of FUNC_100B5260
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
d45d006d71
|
[saco] Implement/match FUNC_100B5260, FUNC_100B5420, FUNC_100B57E0, FUNC_100B5790 and FUNC_100B5740; the 12-byte stride on 0x10117400 makes it a three-element VECTOR array
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
c525ec2bc3
|
[saco] Implement/match seven more game/util.cpp functions; 0x100B56F0 patches a real function-pointer global instead of picking with a ternary, and the tail jmp needs the callee convention to match
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
ea57e6af81
|
[saco] Implement/match FUNC_100B44E0, FUNC_100B6470, VectorScale, FUNC_100B51E0 and FUNC_100B5180; the quaternion norm needs its tail sum parenthesised or MSVC folds the first square to the top of the x87 stack
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
78cf6daf38
|
[saco] Implement/match the 0x100B45xx-0x100B47xx GetModelInfo wrapper band; the store-then-reload of the returned pointer is the _asm mov <local>, reg fingerprint
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
0ffc91b7fd
|
[saco] Declare the ten new game/util.cpp helpers in util.h
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
40688d058b
|
[saco] Implement/match ten small game/util.cpp functions; the 0x100B45xx band is one-load accessors, 0x100B56D0 another three-pop GTA thunk, and 0x100B5720 an indirect call through a stored function pointer
|
2026-09-05 10:52:06 +07:00 |
|
ricardoofnl
|
b4379722db
|
[saco] Implement/match CChatWindow::FUNC_10067470; the outline is 8 draws above 1280 wide and 4 below, and field_8 must be read before field_0 or the spill lands after the pushes
|
2026-09-05 10:44:37 +07:00 |
|
ricardoofnl
|
33689c659d
|
[saco] Implement/match ClientCheck; independent if/return arms give the two tail-merged epilogues that an else-if chain cannot
|
2026-09-05 10:44:37 +07:00 |
|
ricardoofnl
|
ba47566596
|
[saco] Correct SetIPLs to spell out the last two patches; retail inlines the protect/memcpy/restore there instead of calling _patch, only the two spare frame slots and one materialised address differ now
|
2026-09-05 10:44:36 +07:00 |
|
ricardoofnl
|
35e99d286f
|
[saco] Match RelocatePedsListHack and ApplyNewColStoreSizePatch; both call VirtualProtect inline, the UnFuck helper in their place was wrong
|
2026-09-05 10:44:36 +07:00 |
|
ricardoofnl
|
5d6cc3b7e7
|
[saco] Implement/match CPlayerPed::FUNC_100ADB70; the dance names are three 16 by 16 char tables, and the model test is negated so the G table is the fallthrough
|
2026-09-05 10:44:36 +07:00 |
|
ricardoofnl
|
8df42ea4b3
|
[saco] Implement/match CPlayerPed::FUNC_100AE6A0; the table lookup returns a signed short, which is what sign-extends the low half of the packed result
|
2026-09-05 10:44:36 +07:00 |
|
ricardoofnl
|
f6708ef126
|
[saco] Match CUnkClass10::GetField80, the third accessor COMDAT; its inlined call site is inside FUNC_10002FA0
|
2026-09-05 10:35:25 +07:00 |
|
ricardoofnl
|
4750c5994f
|
[saco] Match FUNC_10006100 and the two accessor COMDATs it keeps alive; 0x1026EC2C is a CDXUTDialog and +0x13 is m_bVisible
|
2026-09-05 10:35:25 +07:00 |
|
ricardoofnl
|
237716a11e
|
[saco] Implement/match ScrUnk53; the three UI dispatch objects take a local placeholder class, the way net/netrpc.cpp already does it
|
2026-09-05 10:32:34 +07:00 |
|
ricardoofnl
|
3f93cdf486
|
[saco] Implement/match ScrUnkAD; it is CActorPed::ApplyAnimation and reuses the ScrUnk56 bool read order of 1, 2, 4, 3
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
70b76e9806
|
[saco] Match ScrUnk21; memset over the aggregate initializer, and the empty-name branch is the fall-through so the test is negated
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
0d9a1c9f3c
|
[saco] Implement/match ScrUnk5A; FUNC_100ABDD0 and FUNC_100ABDF0 take ecx, so both are CPlayerPed methods and the xor feeds the setter
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
f39b2c3da9
|
[saco] Call CChatWindow::AddChatMessage from FUNC_10017610 and drop the duplicate FUNC_10068020 declaration
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
662270a17a
|
[saco] Drop my duplicate CPlayerPed::FUNC_100AD440 declaration; another lane landed the same one
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
bc516c9fc8
|
[saco] Implement/match FUNC_100158D0, the unoccupied vehicle sync; the 0.05 lerp gate is a double literal here, unlike the trailer path
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
558f817285
|
[saco] Implement/match FUNC_10015140, the vehicle position resync; boats, helis and planes get a 2.0 Z snap limit through a local
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
b145cc82f5
|
[saco] Implement/match FUNC_10015C90, the trailer sync handler; the 0.5 gate is a <= chain and the 6.0/3.0 snap gate a > chain
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
67c7c34fc0
|
[saco] Implement/match FUNC_10014950, the special-action driver; every pair is two sequential ifs with &&, not an if/else
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
10dddab97e
|
[saco] Implement/match FUNC_10016370, the bullet sync handler; per-component float assignments keep the direct displacements a VECTOR copy would hide behind a lea
|
2026-09-05 10:07:58 +07:00 |
|
ricardoofnl
|
8d8b9e33d4
|
[saco] Implement/match FUNC_10014C40, the 3D position resync; the lerp factor is a mutable global so it lands in st(1) instead of an fmul operand
|
2026-09-05 10:07:57 +07:00 |
|
ricardoofnl
|
ef8d3e3354
|
[saco] Implement/match FUNC_10014E60; writing the snap tail at both exits lets the merge hoist the field_17C load above the IsAdded branch
|
2026-09-05 10:07:57 +07:00 |
|
ricardoofnl
|
8b78747e06
|
[saco] Match FUNC_10014380 and FUNC_10014390; both are class-body getters whose COMDATs need an in-TU caller
|
2026-09-05 10:07:57 +07:00 |
|
ricardoofnl
|
99dda3ded5
|
[saco] Implement/match CChatWindow::FUNC_10067940; the entry walk needs its own index bumped ahead of the rect advance, and the strlen guards are bare temps rather than a named length
|
2026-09-05 10:03:36 +07:00 |
|
ricardoofnl
|
c735f2f750
|
[saco] Implement/match ScrUnkAE, ScrUnkAF, ScrUnkB2, ScrUnkA0, ScrUnk39, ScrUnk7E and ScrUnk7F; the actor lookup lands in ecx because it is the this of a thiscall, not an allocator choice
|
2026-09-05 09:58:02 +07:00 |
|
ricardoofnl
|
1d0b3fac63
|
[saco] Implement/match ScrUnkA1; it forwards the two bytes straight to CVehiclePool::FUNC_1001EB30
|
2026-09-05 09:43:46 +07:00 |
|
ricardoofnl
|
39edc13d51
|
[saco] Match ScrUnk30 and CDownloadList::FUNC_10017D10; the guarded three-field update is an inline member, so the handler and its out-of-line COMDAT fall together
|
2026-09-05 09:43:46 +07:00 |
|
ricardoofnl
|
1df2731742
|
[saco] Match SendDeath and SetInteriorId; the killer id is a WORD out-param whose copy widens to a dword
|
2026-09-05 09:39:37 +07:00 |
|
ricardoofnl
|
3a04674340
|
[saco] Match FUNC_10004120; the counter is a free function whose loop index and bound are both locals declared ahead of the early return
|
2026-09-05 09:39:37 +07:00 |
|
ricardoofnl
|
8163d2e5ee
|
[saco] Match FUNC_10003FC0, the in-vehicle boundary check; the id is tested against INVALID_VEHICLE_ID before the range
|
2026-09-05 09:39:37 +07:00 |
|
ricardoofnl
|
5baa271d74
|
[saco] Match FUNC_10004280; GetAt is called twice and the pool bound check folds into GetSlotState
|
2026-09-05 09:39:37 +07:00 |
|
ricardoofnl
|
2cf8455402
|
[saco] Correct the SCRIPT_COMMAND ids in FUNC_100AD3E0 and FUNC_100AE1E0; the id is a masked relocation, so the byte diff cannot see a wrong command
|
2026-09-05 09:33:55 +07:00 |
|
ricardoofnl
|
558298089e
|
[saco] Match RequestSpawn, FUNC_10003F50 and FUNC_100041C0; the spectate reset is an else if, and a plain second if costs the jmp to the tail
|
2026-09-05 09:24:47 +07:00 |
|
ricardoofnl
|
3c8eb15683
|
[saco] Match five more CLocalPlayer members; SPAWN_INFO sits at +0x14F and the resend test duplicates its update arm rather than merging the conditions
|
2026-09-05 09:24:47 +07:00 |
|
ricardoofnl
|
e18f766850
|
[saco] Match five more CLocalPlayer members; the sync interval globals at 0x100FE0A8/0x100FE0AC default to 30
|
2026-09-05 09:24:47 +07:00 |
|
ricardoofnl
|
375a1b3aa3
|
[saco] Match four small CLocalPlayer members; the 1000 fallback has to be the trailing else, and the three key words are read through field_0
|
2026-09-05 09:24:47 +07:00 |
|