diff options
| author | salmonik <salmonik@tuta.io> | 2026-11-04 16:18:21 +0100 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-11-04 16:18:21 +0100 |
| commit | c803fd1f425e7ea8e78f83afd481e58326fb1610 (patch) | |
| tree | dbb69170330efdd497b984962d1c46a4105d7d1d | |
| parent | Items: hide full ammo pickups; robust close-target projection (diff) | |
| download | hl2h-c803fd1f425e7ea8e78f83afd481e58326fb1610.tar.gz hl2h-c803fd1f425e7ea8e78f83afd481e58326fb1610.zip | |
Netvars: handle RecvPropArray3 array props
m_iAmmo and m_hMyWeapons were not resolving (both -1). Array props keep their
element descriptor in m_pArrayProp and its offset can hold the array base; the
walker was also treating a non-null m_pDataTable on an array as a nested table
and skipping the name match. Process array props by name, use the element
offset when present, and log the first 16 array props under HL2H_DEBUG.
| -rw-r--r-- | src/netvars.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/netvars.cpp b/src/netvars.cpp index 2747c29..9b7e3c9 100644 --- a/src/netvars.cpp +++ b/src/netvars.cpp | |||
| @@ -67,10 +67,18 @@ static void collect_netvars(uintptr_t table, uintptr_t base_off, int depth) { | |||
| 67 | if (dump) | 67 | if (dump) |
| 68 | logd(" [%s] %s type=%d off=%d(0x%x) table=%s array=%s", tname, pname2, | 68 | logd(" [%s] %s type=%d off=%d(0x%x) table=%s array=%s", tname, pname2, |
| 69 | ptype, poff, poff, ptable ? "yes" : "no", parray ? "yes" : "no"); | 69 | ptype, poff, poff, ptable ? "yes" : "no", parray ? "yes" : "no"); |
| 70 | if (ptable) { | 70 | if (ptable && !parray) { |
| 71 | collect_netvars(ptable, base_off + (uint32_t)poff, depth + 1); | 71 | collect_netvars(ptable, base_off + (uint32_t)poff, depth + 1); |
| 72 | continue; | 72 | continue; |
| 73 | } | 73 | } |
| 74 | if (parray) { | ||
| 75 | static int alogs = 0; | ||
| 76 | if (alogs < 16) { | ||
| 77 | alogs++; | ||
| 78 | logd("netvar array %s poff=%d eoff=%d base=%d", pname2, poff, | ||
| 79 | *(int32_t *)(parray + 0x2C), (int)base_off); | ||
| 80 | } | ||
| 81 | } | ||
| 74 | 82 | ||
| 75 | if (strcmp(pname2, "m_lifeState") == 0 && g_net.lifestate < 0) { | 83 | if (strcmp(pname2, "m_lifeState") == 0 && g_net.lifestate < 0) { |
| 76 | g_net.lifestate = (int)(base_off + (uint32_t)poff); | 84 | g_net.lifestate = (int)(base_off + (uint32_t)poff); |
| @@ -115,12 +123,28 @@ static void collect_netvars(uintptr_t table, uintptr_t base_off, int depth) { | |||
| 115 | } else if (strcmp(pname2, "m_hMyWeapons") == 0 && | 123 | } else if (strcmp(pname2, "m_hMyWeapons") == 0 && |
| 116 | g_net.my_weapons < 0) { | 124 | g_net.my_weapons < 0) { |
| 117 | int off = (int)(base_off + (uint32_t)poff); | 125 | int off = (int)(base_off + (uint32_t)poff); |
| 118 | if (off >= 0x20 && off <= 0x2000) | 126 | if (parray) { |
| 127 | int32_t eoff = *(int32_t *)(parray + 0x2C); | ||
| 128 | if (eoff) | ||
| 129 | off = (int)(base_off + (uint32_t)eoff); | ||
| 130 | } | ||
| 131 | if (off >= 0x20 && off <= 0x2000) { | ||
| 119 | g_net.my_weapons = off; | 132 | g_net.my_weapons = off; |
| 133 | logd("netvar: m_hMyWeapons base_off=%d poff=%d parray=%p -> %d", | ||
| 134 | (int)base_off, poff, (void *)parray, off); | ||
| 135 | } | ||
| 120 | } else if (strcmp(pname2, "m_iAmmo") == 0 && g_net.ammo < 0) { | 136 | } else if (strcmp(pname2, "m_iAmmo") == 0 && g_net.ammo < 0) { |
| 121 | int off = (int)(base_off + (uint32_t)poff); | 137 | int off = (int)(base_off + (uint32_t)poff); |
| 122 | if (off >= 0x20 && off <= 0x2000) | 138 | if (parray) { |
| 139 | int32_t eoff = *(int32_t *)(parray + 0x2C); | ||
| 140 | if (eoff) | ||
| 141 | off = (int)(base_off + (uint32_t)eoff); | ||
| 142 | } | ||
| 143 | if (off >= 0x20 && off <= 0x2000) { | ||
| 123 | g_net.ammo = off; | 144 | g_net.ammo = off; |
| 145 | logd("netvar: m_iAmmo base_off=%d poff=%d parray=%p -> %d", | ||
| 146 | (int)base_off, poff, (void *)parray, off); | ||
| 147 | } | ||
| 124 | } else if (strcmp(pname2, "m_iTeamNum") == 0 && g_net.teamnum < 0) { | 148 | } else if (strcmp(pname2, "m_iTeamNum") == 0 && g_net.teamnum < 0) { |
| 125 | g_net.teamnum = (int)(base_off + (uint32_t)poff); | 149 | g_net.teamnum = (int)(base_off + (uint32_t)poff); |
| 126 | } else if (strcmp(pname2, "m_vecOrigin") == 0 && g_net.origin < 0) { | 150 | } else if (strcmp(pname2, "m_vecOrigin") == 0 && g_net.origin < 0) { |
