179 lines
5.1 KiB
SourcePawn
179 lines
5.1 KiB
SourcePawn
#pragma semicolon 1
|
|
|
|
#include <sourcemod>
|
|
|
|
#if defined INFO_INCLUDES
|
|
#include "../info/constants.sp"
|
|
#include "../info/enums.sp"
|
|
#include "../info/variables.sp"
|
|
#endif
|
|
|
|
/**
|
|
* Spawns all metalpacks (except the boss and reward metalpack).
|
|
*
|
|
* @param iMetalPackType The metal pack type.
|
|
* @return True on success, false otherwiseherwise.
|
|
*/
|
|
|
|
stock bool SpawnMetalPacks(TDMetalPackType iMetalPackType) {
|
|
int iNumPacks = 0;
|
|
if (!GetTrieValue(g_hMapMetalpacks, "quantity", iNumPacks)) {
|
|
return false;
|
|
}
|
|
|
|
if (iNumPacks <= 0) {
|
|
return true;
|
|
}
|
|
|
|
int iMetal = 0, iEntity;
|
|
float fLocation[3];
|
|
char sKey[32], sLocation[64], sLocationParts[6][16];
|
|
|
|
for (int iMetalPackId = 0; iMetalPackId < iNumPacks; iMetalPackId++) {
|
|
if (Metalpack_GetType(iMetalPackId) != iMetalPackType) {
|
|
continue;
|
|
}
|
|
|
|
Format(sKey, sizeof(sKey), "%d_metal", iMetalPackId);
|
|
|
|
if (!GetTrieValue(g_hMapMetalpacks, sKey, iMetal)) {
|
|
continue;
|
|
}
|
|
|
|
Format(sKey, sizeof(sKey), "%d_location", iMetalPackId);
|
|
|
|
if (!GetTrieString(g_hMapMetalpacks, sKey, sLocation, sizeof(sLocation))) {
|
|
continue;
|
|
}
|
|
|
|
ExplodeString(sLocation, " ", sLocationParts, sizeof(sLocationParts), sizeof(sLocationParts[]));
|
|
|
|
fLocation[0] = StringToFloat(sLocationParts[0]);
|
|
fLocation[1] = StringToFloat(sLocationParts[1]);
|
|
fLocation[2] = StringToFloat(sLocationParts[2]);
|
|
|
|
SpawnMetalPack2(TDMetalPack_Large, fLocation, iMetal, iEntity);
|
|
|
|
if (Metalpack_GetType(iMetalPackId) == TDMetalPack_Boss) {
|
|
ShowAnnotation(EntRefToEntIndex(iEntity), fLocation, 64.0, 60.0, "A reward spawned!");
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Spawns certain amount of metalpacks.
|
|
*
|
|
* @param iMetalPackType The metal pack type.
|
|
* @param iNumPacks Amount of metalpacks
|
|
* @return True on success, false otherwiseherwise.
|
|
*/
|
|
|
|
stock void SpawnMetalPacksNumber(TDMetalPackType iMetalPackType, int iNumPacks) {
|
|
|
|
int iMetal = 0, iEntity;
|
|
float fLocation[3];
|
|
char sKey[32], sLocation[64], sLocationParts[6][16];
|
|
|
|
for (int iMetalPackId = 0; iMetalPackId < iNumPacks; iMetalPackId++) {
|
|
if (Metalpack_GetType(iMetalPackId) != iMetalPackType) {
|
|
continue;
|
|
}
|
|
|
|
Format(sKey, sizeof(sKey), "%d_metal", iMetalPackId);
|
|
|
|
if (!GetTrieValue(g_hMapMetalpacks, sKey, iMetal)) {
|
|
continue;
|
|
}
|
|
|
|
Format(sKey, sizeof(sKey), "%d_location", iMetalPackId);
|
|
|
|
if (!GetTrieString(g_hMapMetalpacks, sKey, sLocation, sizeof(sLocation))) {
|
|
continue;
|
|
}
|
|
|
|
ExplodeString(sLocation, " ", sLocationParts, sizeof(sLocationParts), sizeof(sLocationParts[]));
|
|
|
|
fLocation[0] = StringToFloat(sLocationParts[0]);
|
|
fLocation[1] = StringToFloat(sLocationParts[1]);
|
|
fLocation[2] = StringToFloat(sLocationParts[2]);
|
|
|
|
SpawnMetalPack2(TDMetalPack_Large, fLocation, iMetal, iEntity);
|
|
ShowAnnotation(EntRefToEntIndex(iEntity), fLocation, 64.0, 5.0, "A Metalpack spawned!");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Spawns reward metal pack.
|
|
*
|
|
* @param iMetalPackType The type of metal pack.
|
|
* @param fLocation The location to place the metal pack.
|
|
* @param iMetal The ammount of metal to spawn.
|
|
* @noreturn
|
|
*/
|
|
|
|
stock void SpawnRewardPack(TDMetalPackSpawnType iMetalPackType, float fLocation[3], int iMetal) {
|
|
int iEntity;
|
|
SpawnMetalPack2(iMetalPackType, fLocation, iMetal, iEntity);
|
|
|
|
// Dirty hack to add outlines to the ammo packs
|
|
int PackRef = EntRefToEntIndex(iEntity);
|
|
int dispenser = CreateEntityByName("obj_dispenser");
|
|
|
|
DispatchKeyValue(dispenser, "spawnflags", "2");
|
|
DispatchKeyValue(dispenser, "solid", "0");
|
|
DispatchKeyValue(dispenser, "teamnum", "3");
|
|
|
|
SetEntProp(dispenser, Prop_Send, "m_usSolidFlags", 12); // FSOLID_TRIGGER|FSOLID_NOT_SOLID
|
|
SetEntProp(dispenser, Prop_Data, "m_nSolidType", 6); // SOLID_VPHYSICS
|
|
SetEntProp(dispenser, Prop_Data, "m_CollisionGroup", 1); //COLLISION_GROUP_DEBRIS
|
|
|
|
char model[PLATFORM_MAX_PATH];
|
|
float pos[3], ang[3];
|
|
|
|
GetEntPropString(PackRef, Prop_Data, "m_ModelName", model, sizeof(model));
|
|
GetEntPropVector(PackRef, Prop_Send, "m_vecOrigin", pos);
|
|
GetEntPropVector(PackRef, Prop_Send, "m_angRotation", ang);
|
|
SetEntProp(dispenser, Prop_Send, "m_bGlowEnabled", 1);
|
|
|
|
TeleportEntity(dispenser, pos, ang, NULL_VECTOR);
|
|
DispatchSpawn(dispenser);
|
|
SetEntityModel(dispenser, model);
|
|
SetVariantString("!activator");
|
|
AcceptEntityInput(dispenser, "SetParent", PackRef);
|
|
|
|
SDKHook(dispenser, SDKHook_OnTakeDamage, OnTakeDamage_Dispenser);
|
|
}
|
|
|
|
public Action OnTakeDamage_Dispenser(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3])
|
|
{
|
|
return Plugin_Stop;
|
|
}
|
|
|
|
/*======================================
|
|
= Data Functions =
|
|
======================================*/
|
|
|
|
/**
|
|
* Gets a metalpacks type.
|
|
*
|
|
* @param iMetalpackId The metalpacks id.
|
|
* @return A TDMetalPackType value.
|
|
*/
|
|
|
|
stock TDMetalPackType Metalpack_GetType(int iMetalpackId) {
|
|
char sKey[32];
|
|
Format(sKey, sizeof(sKey), "%d_type", iMetalpackId);
|
|
|
|
char sType[64];
|
|
GetTrieString(g_hMapMetalpacks, sKey, sType, sizeof(sType));
|
|
|
|
if (StrEqual(sType, "start")) {
|
|
return TDMetalPack_Start;
|
|
} else if (StrEqual(sType, "boss")) {
|
|
return TDMetalPack_Boss;
|
|
}
|
|
|
|
return TDMetalPack_Invalid;
|
|
} |