diff options
| -rw-r--r-- | src/build/mkentprops.c | 14 | ||||
| -rw-r--r-- | src/con_.c | 6 | ||||
| -rw-r--r-- | src/con_.h | 6 | ||||
| -rw-r--r-- | src/demorec.c | 20 | ||||
| -rw-r--r-- | src/engineapi.c | 1 | ||||
| -rw-r--r-- | src/hook.c | 6 | ||||
| -rw-r--r-- | src/mem.h | 5 | 
7 files changed, 25 insertions, 33 deletions
diff --git a/src/build/mkentprops.c b/src/build/mkentprops.c index e99873b..321b954 100644 --- a/src/build/mkentprops.c +++ b/src/build/mkentprops.c @@ -148,23 +148,23 @@ F( "	for (int needclasses = %d; class; class = class->next) {", nclasses)  		// ever have more than a few classes/properties?  F( "		%sif (!strcmp(class->name, \"%s\")) {", else1, c->name)  _( "			struct SendTable *st = class->table;") -				// XXX: christ this is all awful :(  F( "			int needprops = %d;", c->props.sz) -_( "			for (struct SendProp *p = st->props; (char *)p -") -_( "					(char *)st->props < st->nprops * sz_SendProp;") +_( "			for (struct SendProp *p = st->props;") +_( "					mem_diff(p, st->props) < st->nprops * sz_SendProp;")  _( "					p = mem_offset(p, sz_SendProp)) {") +_( "				const char *varname = mem_loadptr(mem_offset(p, off_SP_varname));")  		char *else2 = "";  		for (struct prop **pp = c->props.data;  				pp - c->props.data < c->props.sz; ++pp) { -F( "				%sif (!strcmp(*(const char **)mem_offset(p, off_SP_varname), \"%s\")) {", -		else2, (*pp)->propname) // ugh +F( "				%sif (!strcmp(varname, \"%s\")) {", else2, (*pp)->propname)  F( "					has_%s = true;", (*pp)->varname)  			// from AM L4D2 SDK headers:  			// > SENDPROP_VECTORELEM makes [offset] negative to start with so we  			// > can detect that and set the SPROP_IS_VECTOR_ELEM flag.  			// apparently if we're loaded via VDF, it hasn't been flipped back -			// yet. just calling abs() on it as an easy solution. -F( "					%s = abs(*(int *)mem_offset(p, off_SP_offset));", (*pp)->varname) +			// yet. just calling abs() on everything as an easy solution. +F( "					%s = abs(*(int *)mem_offset(p, off_SP_offset));", +		(*pp)->varname)  _( "					if (!--needprops) break;")  _( "				}")  			else2 = "else "; @@ -497,13 +497,11 @@ SETTER(int, 2, con_setvari)  #undef SETTER  con_cmdcb con_getcmdcb(const struct con_cmd *cmd) { -	if (cmd->use_newcmdiface || !cmd->use_newcb) return 0; -	return cmd->cb; +	return !cmd->use_newcmdiface && cmd->use_newcb ? cmd->cb : 0;  }  con_cmdcbv1 con_getcmdcbv1(const struct con_cmd *cmd) { -	if (cmd->use_newcmdiface || cmd->use_newcb) return 0; -	return cmd->cb_v1; +	return !cmd->use_newcmdiface && !cmd->use_newcb ? cmd->cb_v1 : 0;  }  // vi: sw=4 ts=4 noet tw=80 cc=80 @@ -141,12 +141,12 @@ struct con_var { // ConVar in engine  	float fval;  	int ival;  	bool hasmin; -	// bool hasmax; // better packing here, might break engine ABI +	// bool hasmax; // better packing here, would break engine ABI  	float minval; -	bool hasmax; // just sticking to sdk position for now +	bool hasmax; // just sticking to sdk position  	float maxval;  	/* -	 * Our quickly-chucked in optional callback - doesn't match the engine!! +	 * Our quickly-chucked-in optional callback - doesn't match the engine!!  	 * Also has to be manually set in code, although that's probably fine anyway  	 * as it's common to only want a cvar to do something if the feature  	 * succesfully init-ed. diff --git a/src/demorec.c b/src/demorec.c index c8871bd..5c79384 100644 --- a/src/demorec.c +++ b/src/demorec.c @@ -351,6 +351,8 @@ static bool find_WriteMessages(void) {  	return false;  } +DECL_VFUNC_DYN(int, GetEngineBuildNumber) +  bool demorec_custom_init(void) {   	if (!has_vtidx_GetEngineBuildNumber || !has_vtidx_RecordPacket) {  		con_warn("demorec: custom: missing gamedata entries for this engine\n"); @@ -363,22 +365,8 @@ bool demorec_custom_init(void) {  	// > otherwise it's 12 bits  	// > there might be some other l4d2 versions where it's 11 but idk  	// So here we have to figure out the network protocol version! -	void *clientiface; -	uint buildnum; -	// TODO(compat): probably expose VEngineClient/VEngineServer some other way -	// if it's useful elsewhere later!? -	if (clientiface = factory_engine("VEngineClient013", 0)) { -		typedef uint (*VCALLCONV GetEngineBuildNumber_func)(void *this); -		buildnum = (*(GetEngineBuildNumber_func **)clientiface)[ -				vtidx_GetEngineBuildNumber](clientiface); -	} -	// add support for other interfaces here: -	// else if (clientiface = factory_engine("VEngineClient0XX", 0)) { -	//     ... -	// } -	else { -		return false; -	} +	// NOTE: assuming engclient != null as GEBN index relies on client version +	int buildnum = VCALL(engclient, GetEngineBuildNumber);  	// condition is redundant until other GetEngineBuildNumber offsets are added  	// if (GAMETYPE_MATCHES(L4D2)) {  		nbits_msgtype = 6; diff --git a/src/engineapi.c b/src/engineapi.c index ec3d857..15c780a 100644 --- a/src/engineapi.c +++ b/src/engineapi.c @@ -102,7 +102,6 @@ bool engineapi_init(int pluginver) {  	gamedata_init();  	con_init();  	if (!gameinfo_init()) { con_disconnect(); return false; } -  	if (has_vtidx_GetAllServerClasses && has_sz_SendProp &&  			has_off_SP_varname && has_off_SP_offset) {  		initentprops(VCALL(srvdll, GetAllServerClasses)); @@ -85,7 +85,9 @@ nosp:	con_warn("hook_inline: out of trampoline space\n");  	// pad with original bytes so we can do an 8-byte atomic write  	memcpy(jmp + 5, func + 5, 3);  	*(volatile uvlong *)func = *(uvlong *)jmp; // (assuming function is aligned) -	FlushInstructionCache(GetCurrentProcess(), func, len); +	// -1 is the current process, and it's a constant in the WDK, so it's +	// assumed we can safely avoid the useless GetCurrentProcess call +	FlushInstructionCache((void *)-1, func, len);  	return trampoline;  } @@ -95,7 +97,7 @@ void unhook_inline(void *orig) {  	int off = mem_load32(p + len + 1);  	uchar *q = p + off + 5;  	memcpy(q, p, 5); // XXX: not atomic atm! (does any of it even need to be?) -	FlushInstructionCache(GetCurrentProcess(), q, 5); +	FlushInstructionCache((void *)-1, q, 5);  }  #else @@ -68,6 +68,11 @@ static inline void mem_storeptr(void *to, const void *val) {   * to any pointer type */  static inline void *mem_offset(void *p, int off) { return (char *)p + off; } +/* returns the offset in bytes from one pointer to another (p - q) */ +static inline ssize mem_diff(const void *p, const void *q) { +	return (char *)p - (char *)q; +} +  #endif  // vi: sw=4 ts=4 noet tw=80 cc=80  | 
