Пример #1
0
cell_t L4D_SetSurvivorHealthBonus(IPluginContext *pContext, const cell_t *params)
{
	CBaseEntity *pPlayer;
	ENTINDEX_TO_CBASEENTITY(params[1], pPlayer);
	
	static int offset = 0;
	
	if(offset == 0)
	{
		if (!g_pGameConf->GetOffset("SurvivorHealthBonus", &offset) || !offset)
		{
			return pContext->ThrowNativeError("Could not read 'SurvivorHealthBonus' offset from GameConf");
		}
	}

	int healthbonus = params[2];
	*reinterpret_cast<int*>(reinterpret_cast<uint8_t*>(pPlayer) + offset) = healthbonus;

	L4D_DEBUG_LOG("SetSurvivorHealthBonus for %d -> %d", params[1], healthbonus);
	
	if (params[3] == 1)
	{
	
		static ICallWrapper *pWrapper = NULL;

		// Director::RestartScenario()
		if (!pWrapper)
		{
			REGISTER_NATIVE_ADDR("RecomputeTeamScores", 
				pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0));
		}
		
		void *gamerules = *g_pGameRules;
		unsigned char vstk[sizeof(void *)];
		unsigned char *vptr = vstk;

		*(void **)vptr = gamerules;
		
		pWrapper->Execute(vstk, NULL);
		L4D_DEBUG_LOG("SetSurvivorHealthBonus Called RecomputeTeamScores");
	}
	
	
	
	return 1;
}
Пример #2
0
cell_t L4D_GetSurvivorHealthBonus(IPluginContext *pContext, const cell_t *params)
{
	CBaseEntity *pPlayer;
	ENTINDEX_TO_CBASEENTITY(params[1], pPlayer);
	
	static int offset = 0;
	
	if(offset == 0)
	{
		if (!g_pGameConf->GetOffset("SurvivorHealthBonus", &offset) || !offset)
		{
			return pContext->ThrowNativeError("Could not read 'SurvivorHealthBonus' offset from GameConf");
		}
	}
	
	int healthbonus = *reinterpret_cast<int*>(reinterpret_cast<uint8_t*>(pPlayer) + offset);
	L4D_DEBUG_LOG("GetSurvivorHealthBonus for %d -> %d", params[1], healthbonus);
	
	return healthbonus;
}
Пример #3
0
// FireEntityOutput(int ent, const char[] output, int activator, float delay);
static cell_t FireEntityOutput(IPluginContext *pContext, const cell_t *params)
{
	if (!g_pFireOutput)
	{
		void *addr;
		if (!g_pGameConf->GetMemSig("FireOutput", &addr) || !addr)
		{
			return pContext->ThrowNativeError("\"FireEntityOutput\" not supported by this mod");
		}
#ifdef PLATFORM_WINDOWS
		int iMaxParam = 8;
		//Instead of being one param, MSVC broke variant_t param into 5 params..
		PassInfo pass[8];
		pass[0].flags = PASSFLAG_BYVAL;
		pass[0].type = PassType_Basic;
		pass[0].size = sizeof(int);
		pass[1].flags = PASSFLAG_BYVAL;
		pass[1].type = PassType_Basic;
		pass[1].size = sizeof(int);
		pass[2].flags = PASSFLAG_BYVAL;
		pass[2].type = PassType_Basic;
		pass[2].size = sizeof(int);
		pass[3].flags = PASSFLAG_BYVAL;
		pass[3].type = PassType_Basic;
		pass[3].size = sizeof(int);
		pass[4].flags = PASSFLAG_BYVAL;
		pass[4].type = PassType_Basic;
		pass[4].size = sizeof(int);
		pass[5].flags = PASSFLAG_BYVAL;
		pass[5].type = PassType_Basic;
		pass[5].size = sizeof(CBaseEntity *);
		pass[6].flags = PASSFLAG_BYVAL;
		pass[6].type = PassType_Basic;
		pass[6].size = sizeof(CBaseEntity *);
		pass[7].flags = PASSFLAG_BYVAL;
		pass[7].type = PassType_Float;
		pass[7].size = sizeof(float);
#else
		int iMaxParam = 4;

		PassInfo pass[4];
		pass[0].type = PassType_Object;
		pass[0].flags = PASSFLAG_BYVAL|PASSFLAG_OCTOR|PASSFLAG_ODTOR|PASSFLAG_OASSIGNOP;
		pass[0].size = SIZEOF_VARIANT_T;
		pass[1].flags = PASSFLAG_BYVAL;
		pass[1].type = PassType_Basic;
		pass[1].size = sizeof(CBaseEntity *);
		pass[2].flags = PASSFLAG_BYVAL;
		pass[2].type = PassType_Basic;
		pass[2].size = sizeof(CBaseEntity *);
		pass[3].flags = PASSFLAG_BYVAL;
		pass[3].type = PassType_Float;
		pass[3].size = sizeof(float);
#endif
		if (!(g_pFireOutput = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, iMaxParam)))
		{
			return pContext->ThrowNativeError("\"FireEntityOutput\" wrapper failed to initialize.");
		}
	}

	CBaseEntity *pActivator, *pCaller;
	void *pOutput = NULL;
	
	char *outputname;
	ENTINDEX_TO_CBASEENTITY(params[1], pCaller);
	pContext->LocalToString(params[2], &outputname);
	
	if ((pOutput = FindOutputPointerByName(pCaller,outputname)))
	{
		if (params[3] == -1)
		{
			pActivator = NULL;
		}
		else
		{
			ENTINDEX_TO_CBASEENTITY(params[3], pActivator);
		}

		ArgBuffer<void*, decltype(g_Variant_t), CBaseEntity*, CBaseEntity*, float> vstk(pOutput, g_Variant_t, pActivator, pCaller, sp_ctof(params[4]));

		g_pFireOutput->Execute(vstk, nullptr);

		_init_variant_t();
		return 1;
	}
	return pContext->ThrowNativeError("Couldn't find %s output on %i entity!", outputname, params[1]);
}