Mac SERVER_PlayerUpdateExperience: void __fastcall (pGame ECX, pUnit EDX, nPrevLevel, nXpGain)
ECX = pGame (saved to [EBP-0x10], reloaded later for the level-up path). EDX = pUnit (NULL and type-0 checks; stat 0xd experience get/set; class at +4 for the max-XP lookup). [EBP+0xc] = nXpGain (added to the current XP and clamped). [EBP+8] = nPrevLevel (CMP EAX,[EBP+8] against the new level at 0x002812c9). There are no other stack reads and it ends in a plain RET. SERVER_KillExperience 0x00280c8c loads ECX/EDX and stores [ESP] (the level) and [ESP+4] (the XP from SERVER_CalculateExperienceForUnit), then returns without reading EAX. Same roles as the Windows twin 0x0057e510.
Changes 1, applied together
Set prototype
mac 0x00281222signatureundefined SERVER_PlayerUpdateExperience(void)→void SERVER_PlayerUpdateExperience(D2GameStrc* pGame, D2UnitStrc* pUnit, int32_t nPrevLevel, int32_t nXpGain)conventionunknown→__fastcall