Initial commit
This commit is contained in:
179
scripting/towerdefense/handler/metalpacks.sp
Normal file
179
scripting/towerdefense/handler/metalpacks.sp
Normal file
@@ -0,0 +1,179 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user