diff -r 5da587408e5a -r 3d62874b9071 extensions/tf2/natives.cpp --- a/extensions/tf2/natives.cpp Thu Mar 11 22:00:46 2010 -0500 +++ b/extensions/tf2/natives.cpp Thu Mar 18 11:35:05 2010 -0400 @@ -159,6 +159,120 @@ return 1; } +cell_t TF2_AddCondition(IPluginContext *pContext, const cell_t *params) +{ + static ICallWrapper *pWrapper = NULL; + + // CTFPlayerShared::AddCond(int, float) + if (!pWrapper) + { + REGISTER_NATIVE_ADDR("AddCondition", + PassInfo pass[2]; \ + pass[0].flags = PASSFLAG_BYVAL; \ + pass[0].size = sizeof(int); \ + pass[0].type = PassType_Basic; \ + pass[1].flags = PASSFLAG_BYVAL; \ + pass[1].size = sizeof(float); \ + pass[1].type = PassType_Basic; \ + pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2)) + } + + CBaseEntity *pEntity; + if (!(pEntity = UTIL_GetCBaseEntity(params[1], true))) + { + return pContext->ThrowNativeError("Client index %d is not valid", params[1]); + } + + void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset); + + unsigned char vstk[sizeof(void *) + sizeof(int) + sizeof(float)]; + unsigned char *vptr = vstk; + + *(void **)vptr = obj; + vptr += sizeof(void *); + *(int *)vptr = params[2]; + vptr += sizeof(int); + *(float *)vptr = *(float *)¶ms[3]; + + pWrapper->Execute(vstk, NULL); + + return 1; +} + +cell_t TF2_RemoveCondition(IPluginContext *pContext, const cell_t *params) +{ + static ICallWrapper *pWrapper = NULL; + + // CTFPlayerShared::RemoveCond(int) + if (!pWrapper) + { + REGISTER_NATIVE_ADDR("RemoveCondition", + PassInfo pass[1]; \ + pass[0].flags = PASSFLAG_BYVAL; \ + pass[0].size = sizeof(int); \ + pass[0].type = PassType_Basic; \ + pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1)) + } + + CBaseEntity *pEntity; + if (!(pEntity = UTIL_GetCBaseEntity(params[1], true))) + { + return pContext->ThrowNativeError("Client index %d is not valid", params[1]); + } + + void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset); + + unsigned char vstk[sizeof(void *) + sizeof(int)]; + unsigned char *vptr = vstk; + + *(void **)vptr = obj; + vptr += sizeof(void *); + *(int *)vptr = params[2]; + + pWrapper->Execute(vstk, NULL); + + return 1; +} + +cell_t TF2_SetPowerplayEnabled(IPluginContext *pContext, const cell_t *params) +{ + static ICallWrapper *pWrapper = NULL; + + // CTFPlayer::SetPowerPlayEnabled(bool) + if (!pWrapper) + { + REGISTER_NATIVE_ADDR("SetPowerplayEnabled", + PassInfo pass[1]; \ + pass[0].flags = PASSFLAG_BYVAL; \ + pass[0].size = sizeof(bool); \ + pass[0].type = PassType_Basic; \ + pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1)) + } + + CBaseEntity *pEntity; + if (!(pEntity = UTIL_GetCBaseEntity(params[1], true))) + { + return pContext->ThrowNativeError("Client index %d is not valid", params[1]); + } + + bool bEnablePP = false; + if (params[2] != 0) + { + bEnablePP = true; + } + + unsigned char vstk[sizeof(void *) + sizeof(bool)]; + unsigned char *vptr = vstk; + + *(void **)vptr = (void *)pEntity; + vptr += sizeof(void *); + *(bool *)vptr = bEnablePP; + + pWrapper->Execute(vstk, NULL); + + return 1; +} + cell_t TF2_Respawn(IPluginContext *pContext, const cell_t *params) { static ICallWrapper *pWrapper = NULL; @@ -201,6 +315,28 @@ return 1; } +cell_t TF2_Regenerate(IPluginContext *pContext, const cell_t *params) +{ + static ICallWrapper *pWrapper = NULL; + + //CTFPlayer::Regenerate() + + if (!pWrapper) + { + REGISTER_NATIVE_ADDR("Regenerate", + pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0)); + } + + CBaseEntity *pEntity; + if (!(pEntity = UTIL_GetCBaseEntity(params[1], true))) + { + return pContext->ThrowNativeError("Client index %d is not valid", params[1]); + } + pWrapper->Execute(&pEntity, NULL); + + return 1; +} + cell_t TF2_GetResourceEntity(IPluginContext *pContext, const cell_t *params) { return g_resourceEntity; @@ -223,5 +359,9 @@ {"TF2_RemovePlayerDisguise", TF2_RemoveDisguise}, {"TF2_GetResourceEntity", TF2_GetResourceEntity}, {"TF2_GetClass", TF2_GetClass}, + {"TF2_RegeneratePlayer", TF2_Regenerate}, + {"TF2_AddCondition", TF2_AddCondition}, + {"TF2_RemoveCondition", TF2_RemoveCondition}, + {"TF2_SetPlayerPowerPlay", TF2_SetPowerplayEnabled}, {NULL, NULL} };