BossHP: Add second version of damage callback.
Not fully finished yet trough.
This commit is contained in:
parent
c22297b1a0
commit
eb94163ef8
@ -191,6 +191,19 @@ public void OnMapStart()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char sHurtTrigger[64 * 2];
|
||||||
|
int iHurtTriggerDelim;
|
||||||
|
KvConfig.GetString("hurttrigger", sHurtTrigger, sizeof(sHurtTrigger));
|
||||||
|
if(sHurtTrigger[0])
|
||||||
|
{
|
||||||
|
if((iHurtTriggerDelim = FindCharInString(sHurtTrigger, ':')) == -1)
|
||||||
|
{
|
||||||
|
LogError("Delimiter ':' not found in \"hurttrigger\"(%s) in \"%s\"", sHurtTrigger, sSection);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sHurtTrigger[iHurtTriggerDelim] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool bMultiTrigger = view_as<bool>(KvConfig.GetNum("multitrigger", 0));
|
bool bMultiTrigger = view_as<bool>(KvConfig.GetNum("multitrigger", 0));
|
||||||
bool bNameFixup = view_as<bool>(KvConfig.GetNum("namefixup", 0));
|
bool bNameFixup = view_as<bool>(KvConfig.GetNum("namefixup", 0));
|
||||||
int iTimeout = KvConfig.GetNum("timeout", -1);
|
int iTimeout = KvConfig.GetNum("timeout", -1);
|
||||||
@ -288,6 +301,12 @@ public void OnMapStart()
|
|||||||
Config.fKillTriggerDelay = fKillTriggerDelay;
|
Config.fKillTriggerDelay = fKillTriggerDelay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(sHurtTrigger[0])
|
||||||
|
{
|
||||||
|
Config.SetHurtTrigger(sHurtTrigger);
|
||||||
|
Config.SetHurtOutput(sHurtTrigger[iHurtTriggerDelim + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
g_aConfig.Push(Config);
|
g_aConfig.Push(Config);
|
||||||
} while(KvConfig.GotoNextKey(false));
|
} while(KvConfig.GotoNextKey(false));
|
||||||
|
|
||||||
@ -433,6 +452,31 @@ public void OnEntitySpawned(int entity)
|
|||||||
|
|
||||||
LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput);
|
LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char sHurtTrigger[64];
|
||||||
|
Config.GetHurtTrigger(sHurtTrigger, sizeof(sHurtTrigger));
|
||||||
|
|
||||||
|
int iHurtTriggerHammerID = -1;
|
||||||
|
if(sHurtTrigger[0] == '#')
|
||||||
|
iHurtTriggerHammerID = StringToInt(sHurtTrigger[1]);
|
||||||
|
|
||||||
|
if((iHurtTriggerHammerID == -1 && sHurtTrigger[0] && StrEqual(sTargetname, sHurtTrigger)) || iHurtTriggerHammerID == iHammerID)
|
||||||
|
{
|
||||||
|
char sHurtOutput[64];
|
||||||
|
Config.GetHurtOutput(sHurtOutput, sizeof(sHurtOutput));
|
||||||
|
|
||||||
|
if(StrEqual(sHurtOutput, "OnTakeDamage"))
|
||||||
|
{
|
||||||
|
SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostHurt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bool Once = !Config.bMultiTrigger;
|
||||||
|
HookSingleEntityOutput(entity, sHurtOutput, OnEntityOutputHurt, Once);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogMessage("Hooked hurttrigger %s:%s", sHurtTrigger, sHurtOutput);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,7 +487,7 @@ void OnTrigger(int entity, const char[] output, SDKHookType HookType = view_as<S
|
|||||||
|
|
||||||
int iHammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
int iHammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||||
|
|
||||||
PrintToServer("OnTrigger(%d:\"%s\":#%d, \"%s\")", entity, sTargetname, iHammerID, output);
|
// PrintToServer("OnTrigger(%d:\"%s\":#%d, \"%s\")", entity, sTargetname, iHammerID, output);
|
||||||
|
|
||||||
for(int i = 0; i < g_aConfig.Length; i++)
|
for(int i = 0; i < g_aConfig.Length; i++)
|
||||||
{
|
{
|
||||||
@ -682,6 +726,66 @@ void OnKillTrigger(int entity, const char[] output, SDKHookType HookType = view_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnHurtTrigger(int activator, int entity, const char[] output, SDKHookType HookType = view_as<SDKHookType>(-1))
|
||||||
|
{
|
||||||
|
char sTargetname[64];
|
||||||
|
GetEntPropString(entity, Prop_Data, "m_iName", sTargetname, sizeof(sTargetname));
|
||||||
|
|
||||||
|
int iHammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||||
|
|
||||||
|
int iTemplateNum = -1;
|
||||||
|
int iTemplateLoc = FindCharInString(sTargetname, '&', true);
|
||||||
|
if(iTemplateLoc != -1)
|
||||||
|
{
|
||||||
|
iTemplateNum = StringToInt(sTargetname[iTemplateLoc + 1]);
|
||||||
|
sTargetname[iTemplateLoc] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < g_aConfig.Length; i++)
|
||||||
|
{
|
||||||
|
CConfig Config = g_aConfig.Get(i);
|
||||||
|
|
||||||
|
char sHurtTrigger[64];
|
||||||
|
Config.GetHurtTrigger(sHurtTrigger, sizeof(sHurtTrigger));
|
||||||
|
|
||||||
|
if(!sHurtTrigger[0])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int iHurtTriggerHammerID = -1;
|
||||||
|
if(sHurtTrigger[0] == '#')
|
||||||
|
{
|
||||||
|
iHurtTriggerHammerID = StringToInt(sHurtTrigger[1]);
|
||||||
|
|
||||||
|
if(iHurtTriggerHammerID != iHammerID)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(!sTargetname[0] || !StrEqual(sTargetname, sHurtTrigger))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char sHurtOutput[64];
|
||||||
|
Config.GetHurtOutput(sHurtOutput, sizeof(sHurtOutput));
|
||||||
|
|
||||||
|
if(!StrEqual(output, sHurtOutput))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(iHurtTriggerHammerID == -1)
|
||||||
|
LogMessage("Triggered hurt boss %s(%d) from output %s", sTargetname, entity, output);
|
||||||
|
else
|
||||||
|
LogMessage("Triggered hurt boss #%d(%d) from output %s", iHurtTriggerHammerID, entity, output);
|
||||||
|
|
||||||
|
if(HookType != view_as<SDKHookType>(-1) && !Config.bMultiTrigger)
|
||||||
|
{
|
||||||
|
if(HookType == SDKHook_OnTakeDamagePost)
|
||||||
|
SDKUnhook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostHurt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void OnEnvEntityMakerEntitySpawned(const char[] output, int caller, int activator, float delay)
|
public void OnEnvEntityMakerEntitySpawned(const char[] output, int caller, int activator, float delay)
|
||||||
{
|
{
|
||||||
if(!g_aConfig)
|
if(!g_aConfig)
|
||||||
@ -724,6 +828,11 @@ public void OnEntityOutputKill(const char[] output, int caller, int activator, f
|
|||||||
OnKillTrigger(caller, output);
|
OnKillTrigger(caller, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnEntityOutputHurt(const char[] output, int caller, int activator, float delay)
|
||||||
|
{
|
||||||
|
OnHurtTrigger(activator, caller, output);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnTakeDamagePost(int victim, int attacker, int inflictor, float damage, int damagetype)
|
public void OnTakeDamagePost(int victim, int attacker, int inflictor, float damage, int damagetype)
|
||||||
{
|
{
|
||||||
OnTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost);
|
OnTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost);
|
||||||
@ -739,6 +848,11 @@ public void OnTakeDamagePostKill(int victim, int attacker, int inflictor, float
|
|||||||
OnKillTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost);
|
OnKillTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnTakeDamagePostHurt(int victim, int attacker, int inflictor, float damage, int damagetype)
|
||||||
|
{
|
||||||
|
OnHurtTrigger(attacker, victim, "OnTakeDamage", SDKHook_OnTakeDamagePost);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnGameFrame()
|
public void OnGameFrame()
|
||||||
{
|
{
|
||||||
if(!g_aBoss)
|
if(!g_aBoss)
|
||||||
@ -1051,7 +1165,8 @@ bool BossInit(CBoss _Boss)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HookSingleEntityOutput(entity, sShowOutput, OnEntityOutputShow, true);
|
bool Once = !_Config.bMultiTrigger;
|
||||||
|
HookSingleEntityOutput(entity, sShowOutput, OnEntityOutputShow, Once);
|
||||||
}
|
}
|
||||||
|
|
||||||
LogMessage("Hooked showtrigger %s:%s", sShowTrigger, sShowOutput);
|
LogMessage("Hooked showtrigger %s:%s", sShowTrigger, sShowOutput);
|
||||||
@ -1077,12 +1192,40 @@ bool BossInit(CBoss _Boss)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HookSingleEntityOutput(entity, sKillOutput, OnEntityOutputKill, true);
|
bool Once = !_Config.bMultiTrigger;
|
||||||
|
HookSingleEntityOutput(entity, sKillOutput, OnEntityOutputKill, Once);
|
||||||
}
|
}
|
||||||
|
|
||||||
LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput);
|
LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char sHurtTrigger[64];
|
||||||
|
_Config.GetHurtTrigger(sHurtTrigger, sizeof(sHurtTrigger));
|
||||||
|
|
||||||
|
if(sHurtTrigger[0])
|
||||||
|
{
|
||||||
|
Format(sHurtTrigger, sizeof(sHurtTrigger), "%s&%04d", sHurtTrigger, iTemplateNum);
|
||||||
|
|
||||||
|
char sHurtOutput[64];
|
||||||
|
_Config.GetHurtOutput(sHurtOutput, sizeof(sHurtOutput));
|
||||||
|
|
||||||
|
int entity = INVALID_ENT_REFERENCE;
|
||||||
|
while((entity = FindEntityByTargetname(entity, sHurtTrigger)) != INVALID_ENT_REFERENCE)
|
||||||
|
{
|
||||||
|
if(StrEqual(sHurtOutput, "OnTakeDamage"))
|
||||||
|
{
|
||||||
|
SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostHurt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bool Once = !_Config.bMultiTrigger;
|
||||||
|
HookSingleEntityOutput(entity, sHurtOutput, OnEntityOutputHurt, Once);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogMessage("Hooked hurttrigger %s:%s", sHurtTrigger, sHurtOutput);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char sBoss[64];
|
char sBoss[64];
|
||||||
|
@ -28,6 +28,8 @@ methodmap CConfig < Basic
|
|||||||
myclass.SetString("sKillTrigger", "");
|
myclass.SetString("sKillTrigger", "");
|
||||||
myclass.SetString("sKillOutput", "");
|
myclass.SetString("sKillOutput", "");
|
||||||
myclass.SetFloat("fKillTriggerDelay", 0.0);
|
myclass.SetFloat("fKillTriggerDelay", 0.0);
|
||||||
|
myclass.SetString("sHurtTrigger", "");
|
||||||
|
myclass.SetString("sHurtOutput", "");
|
||||||
myclass.SetBool("bMultiTrigger", false);
|
myclass.SetBool("bMultiTrigger", false);
|
||||||
myclass.SetBool("bNameFixup", false);
|
myclass.SetBool("bNameFixup", false);
|
||||||
myclass.SetInt("iTimeout", -1);
|
myclass.SetInt("iTimeout", -1);
|
||||||
@ -153,6 +155,26 @@ methodmap CConfig < Basic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool GetHurtTrigger(char[] buffer, int length)
|
||||||
|
{
|
||||||
|
return this.GetString("sHurtTrigger", buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHurtTrigger(const char[] buffer)
|
||||||
|
{
|
||||||
|
this.SetString("sHurtTrigger", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool GetHurtOutput(char[] buffer, int length)
|
||||||
|
{
|
||||||
|
return this.GetString("sHurtOutput", buffer, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHurtOutput(const char[] buffer)
|
||||||
|
{
|
||||||
|
this.SetString("sHurtOutput", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
property bool bMultiTrigger
|
property bool bMultiTrigger
|
||||||
{
|
{
|
||||||
public get()
|
public get()
|
||||||
@ -189,9 +211,6 @@ methodmap CConfig < Basic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
property bool IsBreakable {
|
property bool IsBreakable {
|
||||||
public get() {
|
public get() {
|
||||||
return (this.iMethod == eConfigMethod_Breakable);
|
return (this.iMethod == eConfigMethod_Breakable);
|
||||||
|
Loading…
Reference in New Issue
Block a user