summaryrefslogtreecommitdiffstats
path: root/src/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.cpp')
-rw-r--r--src/server.cpp27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/server.cpp b/src/server.cpp
index b1661ac..0d14c59 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -68,7 +68,7 @@ static bool g_srv_checked = false;
68 68
69static uintptr_t find_string(const char *s) { 69static uintptr_t find_string(const char *s) {
70 size_t n = strlen(s) + 1; 70 size_t n = strlen(s) + 1;
71 for (auto &r : g_server.ranges) { 71 for (auto &r : mod_server().ranges) {
72 const uint8_t *base = (const uint8_t *)r.lo; 72 const uint8_t *base = (const uint8_t *)r.lo;
73 size_t span = r.hi - r.lo; 73 size_t span = r.hi - r.lo;
74 for (size_t i = 0; i + n <= span; i++) 74 for (size_t i = 0; i + n <= span; i++)
@@ -92,7 +92,7 @@ static int datamap_offsets(const char *name, int want_type, int min_off,
92 if (!str) 92 if (!str)
93 return 0; 93 return 0;
94 int n = 0; 94 int n = 0;
95 for (auto &r : g_server.ranges) { 95 for (auto &r : mod_server().ranges) {
96 const uint8_t *base = (const uint8_t *)r.lo; 96 const uint8_t *base = (const uint8_t *)r.lo;
97 size_t span = r.hi - r.lo; 97 size_t span = r.hi - r.lo;
98 for (size_t off = 4; off + 0x18 <= span; off += 4) { 98 for (size_t off = 4; off + 0x18 <= span; off += 4) {
@@ -111,7 +111,7 @@ static int datamap_offsets(const char *name, int want_type, int min_off,
111 continue; 111 continue;
112 // DEFINE_KEYFIELD entries have an external name ("health"); plain 112 // DEFINE_KEYFIELD entries have an external name ("health"); plain
113 // DEFINE_FIELD entries have none. Either way it must be in server.so. 113 // DEFINE_FIELD entries have none. Either way it must be in server.so.
114 if (ext && !g_server.contains(ext)) 114 if (ext && !mod_server().contains(ext))
115 continue; 115 continue;
116 bool dup = false; 116 bool dup = false;
117 for (int i = 0; i < n; i++) 117 for (int i = 0; i < n; i++)
@@ -144,9 +144,9 @@ bool resolve_server_netvars() {
144 if ((retry++ % 100) != 0) 144 if ((retry++ % 100) != 0)
145 return false; 145 return false;
146 // server.so is only mapped once a map is running; refresh the module list. 146 // server.so is only mapped once a map is running; refresh the module list.
147 if (!g_server.valid()) 147 if (!mod_server().valid())
148 find_modules(); 148 find_modules();
149 if (!g_server.valid()) { 149 if (!mod_server().valid()) {
150 if (!fail_logged) { 150 if (!fail_logged) {
151 fail_logged = true; 151 fail_logged = true;
152 logd("server datamap: server.so not mapped yet"); 152 logd("server datamap: server.so not mapped yet");
@@ -209,7 +209,7 @@ bool resolve_server_netvars() {
209 "followtarget=%d spawnflags=%d hacked=%d npcstate=%d " 209 "followtarget=%d spawnflags=%d hacked=%d npcstate=%d "
210 "takedamage=%d mapname=%d armor=%d detonate=%d dmgradius=%d " 210 "takedamage=%d mapname=%d armor=%d detonate=%d dmgradius=%d "
211 "ammo=%d myweapons=%d juice_suit=%d juice_health=%d", 211 "ammo=%d myweapons=%d juice_suit=%d juice_health=%d",
212 g_server.path.c_str(), g_srv_health, g_srv_maxhealth, g_srv_lifestate, 212 mod_server().path.c_str(), g_srv_health, g_srv_maxhealth, g_srv_lifestate,
213 g_srv_modelindex, g_srv_absvelocity, g_srv_velocity, 213 g_srv_modelindex, g_srv_absvelocity, g_srv_velocity,
214 g_srv_activeweapon, g_srv_relationship, g_srv_followtarget, 214 g_srv_activeweapon, g_srv_relationship, g_srv_followtarget,
215 g_srv_spawnflags, g_srv_hacked, g_srv_npcstate, g_srv_takedamage, 215 g_srv_spawnflags, g_srv_hacked, g_srv_npcstate, g_srv_takedamage,
@@ -219,7 +219,7 @@ bool resolve_server_netvars() {
219 } else if (!fail_logged) { 219 } else if (!fail_logged) {
220 fail_logged = true; 220 fail_logged = true;
221 logf("server datamap: scan failed (server.so at %s)", 221 logf("server datamap: scan failed (server.so at %s)",
222 g_server.path.c_str()); 222 mod_server().path.c_str());
223 toastf(TOAST_WARN, "Server datamap scan failed; jumpbug assist limited"); 223 toastf(TOAST_WARN, "Server datamap scan failed; jumpbug assist limited");
224 } 224 }
225 return g_srv_ready; 225 return g_srv_ready;
@@ -275,6 +275,19 @@ int server_entity_health(int idx, int *maxhealth, int *lifestate,
275 return hp; 275 return hp;
276} 276}
277 277
278bool server_entity_velocity(int idx, Vector *out) {
279 if (!out || g_srv_velocity <= 0)
280 return false;
281 void *base = nullptr;
282 if (server_entity_health(idx, nullptr, nullptr, &base) < 0 || !base)
283 return false;
284 uintptr_t b = (uintptr_t)base;
285 out->x = *(float *)(b + g_srv_velocity);
286 out->y = *(float *)(b + g_srv_velocity + 4);
287 out->z = *(float *)(b + g_srv_velocity + 8);
288 return true;
289}
290
278int server_model_index(void *base) { 291int server_model_index(void *base) {
279 if (!base || g_srv_modelindex <= 0) 292 if (!base || g_srv_modelindex <= 0)
280 return -1; 293 return -1;