-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
use GetEntityClassname over GetEdictClassname
- Loading branch information
Showing
1 changed file
with
142 additions
and
142 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,142 +1,142 @@ | ||
#include <tf2c> | ||
#include <sdkhooks> | ||
#include <sdktools> | ||
#include <anymap> | ||
|
||
#pragma newdecls required | ||
#pragma semicolon 1; | ||
|
||
AnyMap WeaponMap; | ||
|
||
public Plugin myinfo = | ||
{ | ||
name = "TF2Classic-CritVsCond", | ||
author = "azzy", | ||
description = "Expansion upon TF2Classic's or_crit_vs_playercond attribute, allowing usage of every available condition", | ||
version = "1.0", | ||
url = "" | ||
} | ||
|
||
public void OnPluginStart() | ||
{ | ||
WeaponMap = new AnyMap(); | ||
|
||
ParseConfig(); | ||
|
||
RegConsoleCmd("sm_critvscond_reload", ReloadCommandHandler, "Reload configuration file"); | ||
|
||
for (int i = 1; i <= MaxClients; i++) | ||
if (IsClientInGame(i)) | ||
OnClientPutInServer(i); | ||
} | ||
|
||
void ParseConfig() | ||
{ | ||
char path[PLATFORM_MAX_PATH]; | ||
BuildPath(Path_SM, path, sizeof(path), "configs/TF2Classic-CritVsCond.cfg"); | ||
|
||
if(!FileExists(path)) | ||
SetFailState("[TF2Classic-CritVsCond] Configuration file not found: %s", path); | ||
|
||
KeyValues kv = new KeyValues("Weapons"); | ||
|
||
if(!kv.ImportFromFile(path)) | ||
SetFailState("[TF2Classic-CritVsCond] Unable to parse configuration file"); | ||
|
||
if(!kv.GotoFirstSubKey()) | ||
SetFailState("[TF2Classic-CritVsCond] No weapons listed"); | ||
|
||
do | ||
{ | ||
char weapon[5]; | ||
if(!kv.GetSectionName(weapon, sizeof(weapon))) | ||
SetFailState("[TF2Classic-CritVsCond] Invalid Configuration File"); | ||
|
||
int weaponid = StringToInt(weapon); | ||
int cond = kv.GetNum("cond"); | ||
int crittype = kv.GetNum("crittype"); | ||
|
||
if(!weaponid) | ||
SetFailState("[TF2Classic-CritVsCond] Invalid Weapon ID"); | ||
|
||
if(!cond) | ||
PrintToServer("[TF2Classic-CritVsCond] WARNING: Weapon ID %d may have invalid Cond check value. This is safe to ignore if value has been manually set to 0 (TF_COND_BURNING)", weaponid); | ||
|
||
if(!crittype) | ||
SetFailState("[TF2Classic-CritVsCond] Invalid Crit Type on weapon ID %d", weaponid); | ||
|
||
|
||
int weaponData[2]; | ||
weaponData[0] = cond; | ||
weaponData[1] = crittype; | ||
|
||
WeaponMap.SetArray(weaponid, weaponData, 2); | ||
|
||
PrintToServer("[TF2Classic-CritVsCond] Weapon ID %d parsed", weaponid); | ||
} | ||
while(kv.GotoNextKey()); | ||
} | ||
|
||
public void OnClientPutInServer(int client) | ||
{ | ||
SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage); | ||
} | ||
|
||
public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damageType, int& weapon, float damageForce[3], float damagePosition[3], int damagecustom) | ||
{ | ||
int weaponIndex; | ||
|
||
char classname[32]; | ||
GetEdictClassname(weapon, classname, 32); | ||
|
||
if(strcmp(classname, "obj_sentrygun") == 0) | ||
weaponIndex = GetWeaponIndex(GetPlayerWeaponSlot(attacker, TFWeaponSlot_Grenade)); | ||
else | ||
weaponIndex = GetWeaponIndex(weapon); | ||
|
||
int weaponData[2]; | ||
|
||
if(WeaponMap.GetArray(weaponIndex, weaponData, 2)) | ||
if(TF2_IsPlayerInCondition(victim, view_as<TFCond>(weaponData[0]))) | ||
switch(weaponData[1]) | ||
{ | ||
case 1: // crit | ||
{ | ||
damageType |= DMG_ACID; | ||
return Plugin_Changed; | ||
} | ||
|
||
case 2: // minicrit | ||
{ | ||
if (!TF2_IsPlayerInCondition(victim, TFCond_MarkedForDeath)) | ||
{ | ||
TF2_AddCondition(victim, TFCond_MarkedForDeath); | ||
SDKHook(victim, SDKHook_OnTakeDamagePost, Hook_RemoveMinicrits); | ||
} | ||
} | ||
} | ||
|
||
return Plugin_Continue; | ||
} | ||
|
||
Action Hook_RemoveMinicrits(int victim) | ||
{ | ||
SDKUnhook(victim, SDKHook_OnTakeDamagePost, Hook_RemoveMinicrits); | ||
TF2_RemoveCondition(victim, TFCond_MarkedForDeath); | ||
} | ||
|
||
public Action ReloadCommandHandler(int client, int args) | ||
{ | ||
PrintToServer("Reloading..."); | ||
ParseConfig(); | ||
} | ||
|
||
stock bool IsValidEnt(int ent) | ||
{ | ||
return ent > MaxClients && IsValidEntity(ent); | ||
} | ||
|
||
stock int GetWeaponIndex(int weapon) | ||
{ | ||
return IsValidEnt(weapon) ? GetEntProp(weapon, Prop_Send, "m_iItemDefinitionIndex"):-1; | ||
} | ||
#include <tf2c> | ||
#include <sdkhooks> | ||
#include <sdktools> | ||
#include <anymap> | ||
|
||
#pragma newdecls required | ||
#pragma semicolon 1; | ||
|
||
AnyMap WeaponMap; | ||
|
||
public Plugin myinfo = | ||
{ | ||
name = "TF2Classic-CritVsCond", | ||
author = "azzy", | ||
description = "Expansion upon TF2Classic's or_crit_vs_playercond attribute, allowing usage of every available condition", | ||
version = "1.0", | ||
url = "" | ||
} | ||
|
||
public void OnPluginStart() | ||
{ | ||
WeaponMap = new AnyMap(); | ||
|
||
ParseConfig(); | ||
|
||
RegConsoleCmd("sm_critvscond_reload", ReloadCommandHandler, "Reload configuration file"); | ||
|
||
for (int i = 1; i <= MaxClients; i++) | ||
if (IsClientInGame(i)) | ||
OnClientPutInServer(i); | ||
} | ||
|
||
void ParseConfig() | ||
{ | ||
char path[PLATFORM_MAX_PATH]; | ||
BuildPath(Path_SM, path, sizeof(path), "configs/TF2Classic-CritVsCond.cfg"); | ||
|
||
if(!FileExists(path)) | ||
SetFailState("[TF2Classic-CritVsCond] Configuration file not found: %s", path); | ||
|
||
KeyValues kv = new KeyValues("Weapons"); | ||
|
||
if(!kv.ImportFromFile(path)) | ||
SetFailState("[TF2Classic-CritVsCond] Unable to parse configuration file"); | ||
|
||
if(!kv.GotoFirstSubKey()) | ||
SetFailState("[TF2Classic-CritVsCond] No weapons listed"); | ||
|
||
do | ||
{ | ||
char weapon[5]; | ||
if(!kv.GetSectionName(weapon, sizeof(weapon))) | ||
SetFailState("[TF2Classic-CritVsCond] Invalid Configuration File"); | ||
|
||
int weaponid = StringToInt(weapon); | ||
int cond = kv.GetNum("cond"); | ||
int crittype = kv.GetNum("crittype"); | ||
|
||
if(!weaponid) | ||
SetFailState("[TF2Classic-CritVsCond] Invalid Weapon ID"); | ||
|
||
if(!cond) | ||
PrintToServer("[TF2Classic-CritVsCond] WARNING: Weapon ID %d may have invalid Cond check value. This is safe to ignore if value has been manually set to 0 (TF_COND_BURNING)", weaponid); | ||
|
||
if(!crittype) | ||
SetFailState("[TF2Classic-CritVsCond] Invalid Crit Type on weapon ID %d", weaponid); | ||
|
||
|
||
int weaponData[2]; | ||
weaponData[0] = cond; | ||
weaponData[1] = crittype; | ||
|
||
WeaponMap.SetArray(weaponid, weaponData, 2); | ||
|
||
PrintToServer("[TF2Classic-CritVsCond] Weapon ID %d parsed", weaponid); | ||
} | ||
while(kv.GotoNextKey()); | ||
} | ||
|
||
public void OnClientPutInServer(int client) | ||
{ | ||
SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage); | ||
} | ||
|
||
public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damageType, int& weapon, float damageForce[3], float damagePosition[3], int damagecustom) | ||
{ | ||
int weaponIndex; | ||
|
||
char classname[32]; | ||
GetEntityClassname(weapon, classname, 32); | ||
|
||
if(strcmp(classname, "obj_sentrygun") == 0) | ||
weaponIndex = GetWeaponIndex(GetPlayerWeaponSlot(attacker, TFWeaponSlot_Grenade)); | ||
else | ||
weaponIndex = GetWeaponIndex(weapon); | ||
|
||
int weaponData[2]; | ||
|
||
if(WeaponMap.GetArray(weaponIndex, weaponData, 2)) | ||
if(TF2_IsPlayerInCondition(victim, view_as<TFCond>(weaponData[0]))) | ||
switch(weaponData[1]) | ||
{ | ||
case 1: // crit | ||
{ | ||
damageType |= DMG_ACID; | ||
return Plugin_Changed; | ||
} | ||
|
||
case 2: // minicrit | ||
{ | ||
if (!TF2_IsPlayerInCondition(victim, TFCond_MarkedForDeath)) | ||
{ | ||
TF2_AddCondition(victim, TFCond_MarkedForDeath); | ||
SDKHook(victim, SDKHook_OnTakeDamagePost, Hook_RemoveMinicrits); | ||
} | ||
} | ||
} | ||
|
||
return Plugin_Continue; | ||
} | ||
|
||
Action Hook_RemoveMinicrits(int victim) | ||
{ | ||
SDKUnhook(victim, SDKHook_OnTakeDamagePost, Hook_RemoveMinicrits); | ||
TF2_RemoveCondition(victim, TFCond_MarkedForDeath); | ||
} | ||
|
||
public Action ReloadCommandHandler(int client, int args) | ||
{ | ||
PrintToServer("Reloading..."); | ||
ParseConfig(); | ||
} | ||
|
||
stock bool IsValidEnt(int ent) | ||
{ | ||
return ent > MaxClients && IsValidEntity(ent); | ||
} | ||
|
||
stock int GetWeaponIndex(int weapon) | ||
{ | ||
return IsValidEnt(weapon) ? GetEntProp(weapon, Prop_Send, "m_iItemDefinitionIndex"):-1; | ||
} |