extensions/tf2/natives.cpp
changeset 3606 e75ddff9d0b9
parent 3555 6bdae240dfbd
child 3713 a825343bb3f2
     1.1 --- a/extensions/tf2/natives.cpp	Wed Aug 15 16:05:16 2012 +0100
     1.2 +++ b/extensions/tf2/natives.cpp	Wed Aug 15 23:29:00 2012 +0100
     1.3 @@ -39,11 +39,11 @@
     1.4  {
     1.5  	static ICallWrapper *pWrapper = NULL;
     1.6  
     1.7 -	// CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float)
     1.8 +	// CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float, int=4)
     1.9  	if(!pWrapper)
    1.10  	{
    1.11  		REGISTER_NATIVE_ADDR("MakeBleed",
    1.12 -			PassInfo pass[3]; \
    1.13 +			PassInfo pass[4]; \
    1.14  			pass[0].flags = PASSFLAG_BYVAL; \
    1.15  			pass[0].size = sizeof(CBaseEntity *); \
    1.16  			pass[0].type = PassType_Basic; \
    1.17 @@ -53,7 +53,10 @@
    1.18  			pass[2].flags = PASSFLAG_BYVAL; \
    1.19  			pass[2].size = sizeof(float); \
    1.20  			pass[2].type = PassType_Basic; \
    1.21 -			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 3))
    1.22 +			pass[3].flags = PASSFLAG_BYVAL; \
    1.23 +			pass[3].size = sizeof(int); \
    1.24 +			pass[3].type = PassType_Basic; \
    1.25 +			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4))
    1.26  	}
    1.27  
    1.28  	CBaseEntity *pEntity;
    1.29 @@ -80,6 +83,8 @@
    1.30  	*(CBaseEntity **)vptr = NULL;
    1.31  	vptr += sizeof(CBaseEntity *);
    1.32  	*(float *)vptr = sp_ctof(params[3]);
    1.33 +	vptr += sizeof(float);
    1.34 +	*(int *)vptr = 4;
    1.35  
    1.36  	pWrapper->Execute(vstk, NULL);
    1.37  
    1.38 @@ -449,12 +454,16 @@
    1.39  {
    1.40  	static ICallWrapper *pWrapper = NULL;
    1.41  
    1.42 -	//CTFPlayer::Regenerate()
    1.43 +	//CTFPlayer::Regenerate( bool=true )
    1.44  
    1.45  	if (!pWrapper)
    1.46  	{
    1.47  		REGISTER_NATIVE_ADDR("Regenerate", 
    1.48 -			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0));
    1.49 +			PassInfo pass[1]; \
    1.50 +			pass[0].flags = PASSFLAG_BYVAL; \
    1.51 +			pass[0].size = sizeof(bool); \
    1.52 +			pass[0].type = PassType_Basic; \
    1.53 +			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1))
    1.54  	}
    1.55  
    1.56  	CBaseEntity *pEntity;
    1.57 @@ -462,7 +471,15 @@
    1.58  	{
    1.59  		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
    1.60  	}
    1.61 -	pWrapper->Execute(&pEntity, NULL);
    1.62 +	
    1.63 +	unsigned char vstk[sizeof(void *) + sizeof(bool)];
    1.64 +	unsigned char *vptr = vstk;
    1.65 +
    1.66 +	*(void **)vptr = (void *)pEntity;
    1.67 +	vptr += sizeof(void *);
    1.68 +	*(bool *)vptr = true;
    1.69 +
    1.70 +	pWrapper->Execute(vstk, NULL);
    1.71  
    1.72  	return 1;
    1.73  }