Raised This Month: $51 Target: $400
 12% 

Tank Damage Announce by griffin


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Lajtowy
Member
Join Date: Jun 2012
Old 07-13-2012 , 16:40   Tank Damage Announce by griffin
Reply With Quote #1

Hello,

I have problem with that plugin (Show tank dealt damage announce) the thing is when the tank is losting control there is print damage dealt to this tank (but he is still alive) and when he is proply killed by players there is no any information about the kill tank because was showed before but it was just losting control can someone help me with that?

PS Code was copied from: http://code.google.com/p/metafogl/so...ca6bd1d0eb3ac6

PHP Code:
#pragma semicolon 1
     
#include <sourcemod>
     
new     const           TEAM_SURVIVOR               2;
new     const           
TEAM_INFECTED               3;
new     const           
ZOMBIECLASS_TANK            8;                // Zombie class of the tank, used to find tank after he have been passed to another player
new             bool:   g_bEnabled                  true;
new             
bool:   g_bAnnounceTankDamage       false;            // Whether or not tank damage should be announced
new             bool:   g_bIsTankInPlay             false;            // Whether or not the tank is active
new                     g_iOffset_Incapacitated     0;                // Used to check if tank is dying
new                     g_iTankClient               0;                // Which client is currently playing as tank
new                     g_iLastTankHealth           0;                // Used to award the killing blow the exact right amount of damage
new                     g_iSurvivorLimit            4;                // For survivor array in damage print
new                     g_iDamage[MAXPLAYERS 1];
new             
Float:  g_fMaxTankHealth            6000.0;
new             
Handleg_hCvarEnabled              INVALID_HANDLE;
new             
Handleg_hCvarTankHealth           INVALID_HANDLE;
new             
Handleg_hCvarSurvivorLimit        INVALID_HANDLE;
     
public 
Plugin:myinfo =
{
        
name "Tank Damage Announce L4D2",
        
author "Griffin and Blade",
        
description "Announce damage dealt to tanks by survivors",
        
version "0.6.5c"
};
     
public 
OnPluginStart()
{
        
g_bIsTankInPlay false;
        
g_bAnnounceTankDamage false;
        
g_iTankClient 0;
        
ClearTankDamage();
        
HookEvent("tank_spawn"Event_TankSpawn);
        
HookEvent("player_death"Event_PlayerKilled);
        
HookEvent("round_start"Event_RoundStart);
        
HookEvent("round_end"Event_RoundEnd);
        
HookEvent("player_hurt"Event_PlayerHurt);
     
        
g_hCvarEnabled CreateConVar("l4d_tankdamage_enabled""1""Announce damage done to tanks when enabled"FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_NOTIFYtrue0.0true1.0);
        
g_hCvarSurvivorLimit FindConVar("survivor_limit");
        
g_hCvarTankHealth FindConVar("z_tank_health");
     
        
HookConVarChange(g_hCvarEnabledCvar_Enabled);
        
HookConVarChange(g_hCvarSurvivorLimitCvar_SurvivorLimit);
        
HookConVarChange(g_hCvarTankHealthCvar_TankHealth);
     
        
g_bEnabled GetConVarBool(g_hCvarEnabled);
        
CalculateTankHealth();
     
        
g_iOffset_Incapacitated FindSendPropInfo("Tank""m_isIncapacitated");
}
     
public 
OnMapStart()
{
        
// In cases where a tank spawns and map is changed manually, bypassing round end
        
ClearTankDamage();
}
     
public 
OnClientDisconnect_Post(client)
{
        if (!
g_bIsTankInPlay || client != g_iTankClient) return;
        
CreateTimer(0.1Timer_CheckTankclient); // Use a delayed timer due to bugs where the tank passes to another player
}
     
public 
Cvar_Enabled(Handle:convar, const String:oldValue[], const String:newValue[])
{
        
g_bEnabled StringToInt(newValue) > true:false;
}
     
public 
Cvar_SurvivorLimit(Handle:convar, const String:oldValue[], const String:newValue[])
{
        
g_iSurvivorLimit StringToInt(newValue);
}
     
public 
Cvar_TankHealth(Handle:convar, const String:oldValue[], const String:newValue[])
{
        
CalculateTankHealth();
}
     
CalculateTankHealth()
{
        
g_fMaxTankHealth GetConVarFloat(g_hCvarTankHealth);
        if (
g_fMaxTankHealth <= 0.0g_fMaxTankHealth 1.0// No dividing by 0!
}
     
public 
Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
{
        if (!
g_bIsTankInPlay) return; // No tank in play; no damage to record
     
        
new victim GetClientOfUserId(GetEventInt(event"userid"));
        if (
victim != GetTankClient() ||        // Victim isn't tank; no damage to record
                
IsTankDying()                                   // Something buggy happens when tank is dying with regards to damage
                                        
) return;
     
        new 
attacker GetClientOfUserId(GetEventInt(event"attacker"));
        
// We only care about damage dealt by survivors, though it can be funny to see
        // claw/self inflicted hittable damage, so maybe in the future we'll do that
        
if (attacker == ||                                                    // Damage from world?
                
!IsClientInGame(attacker) ||                            // Not sure if this happens
                
GetClientTeam(attacker) != TEAM_SURVIVOR
                                        
) return;
     
        
g_iDamage[attacker] += GetEventInt(event"dmg_health");
        
g_iLastTankHealth GetEventInt(event"health");
}
     
public 
Event_PlayerKilled(Handle:event, const String:name[], bool:dontBroadcast)
{
        if (!
g_bIsTankInPlay) return; // No tank in play; no damage to record
     
        
new victim GetClientOfUserId(GetEventInt(event"userid"));
        if (
victim != g_iTankClient) return;
     
        
// Award the killing blow's damage to the attacker; we don't award
        // damage from player_hurt after the tank has died/is dying
        // If we don't do it this way, we get wonky/inaccurate damage values
        
new attacker GetClientOfUserId(GetEventInt(event"attacker"));
        if (
attacker && IsClientInGame(attacker)) g_iDamage[attacker] += g_iLastTankHealth;
     
        
// Damage announce could probably happen right here...
        
CreateTimer(0.1Timer_CheckTankvictim); // Use a delayed timer due to bugs where the tank passes to another player
}
     
public 
Event_TankSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
        new 
client GetClientOfUserId(GetEventInt(event"userid"));
        
g_iTankClient client;
     
        if (
g_bIsTankInPlay) return; // Tank passed
     
        // New tank, damage has not been announced
        
g_bAnnounceTankDamage true;
        
g_bIsTankInPlay true;
        
// Set health for damage print in case it doesn't get set by player_hurt (aka no one shoots the tank)
        
g_iLastTankHealth GetClientHealth(client);
}
     
public 
Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
        
g_bIsTankInPlay false;
        
g_iTankClient 0;
        
ClearTankDamage(); // Probably redundant
}
     
// When survivors wipe or juke tank, announce damage
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
        
// But only if a tank that hasn't been killed exists
        
if (g_bAnnounceTankDamage)
        {
                
PrintRemainingHealth();
                
PrintTankDamage();
        }
        
ClearTankDamage();
}
     
public 
Action:Timer_CheckTank(Handle:timerany:oldtankclient)
{
        if (
g_iTankClient != oldtankclient) return; // Tank passed
     
        
new tankclient FindTankClient();
        if (
tankclient && tankclient != oldtankclient)
        {
                
g_iTankClient tankclient;
     
                return; 
// Found tank, done
        
}
     
        if (
g_bAnnounceTankDamagePrintTankDamage();
        
ClearTankDamage();
        
g_bIsTankInPlay false// No tank in play
}
     
bool:IsTankDying()
{
        new 
tankclient GetTankClient();
        if (!
tankclient) return false;
     
        return 
bool:GetEntData(tankclientg_iOffset_Incapacitated);
}
     
PrintRemainingHealth()
{
        if (!
g_bEnabled) return;
        new 
tankclient GetTankClient();
        if (!
tankclient) return;
     
        
decl String:name[MAX_NAME_LENGTH];
        if (
IsFakeClient(tankclient)) name "AI";
        else 
GetClientName(tankclientnamesizeof(name));
        
PrintToChatAll("[SM] Tank (%s) had %d health remaining"nameg_iLastTankHealth);
}
     
PrintTankDamage()
{
        if (!
g_bEnabled) return;
        
PrintToChatAll("[SM] Damage dealt to tank:");
     
        new 
client;
        new 
percent_total// Accumulated total of calculated percents, for fudging out numbers at the end
        
new damage_total// Accumulated total damage dealt by survivors, to see if we need to fudge upwards to 100%
        
new survivor_index = -1;
        new 
survivor_clients[g_iSurvivorLimit]; // Array to store survivor client indexes in, for the display iteration
        
decl percent_damagedamage;
        for (
client 1client <= MaxClientsclient++)
        {
                if (!
IsClientInGame(client) || GetClientTeam(client) != TEAM_SURVIVOR) continue;
                
survivor_index++;
                
survivor_clients[survivor_index] = client;
                
damage g_iDamage[client];
                
damage_total += damage;
                
percent_damage GetDamageAsPercent(damage);
                
percent_total += percent_damage;
        }
        
SortCustom1D(survivor_clientsg_iSurvivorLimitSortByDamageDesc);
     
        new 
percent_adjustment;
        
// Percents add up to less than 100% AND > 99.5% damage was dealt to tank
        
if ((percent_total 100 &&
                
float(damage_total) > (g_fMaxTankHealth - (g_fMaxTankHealth 200.0)))
                )
        {
                
percent_adjustment 100 percent_total;
        }
     
        new 
last_percent 100// Used to store the last percent in iteration to make sure an adjusted percent doesn't exceed the previous percent
        
decl adjusted_percent_damage;
        for (new 
i<= survivor_indexi++)
        {
                
client survivor_clients[i];
                
damage g_iDamage[client];
                
percent_damage GetDamageAsPercent(damage);
                
// Attempt to adjust the top damager's percent, defer adjustment to next player if it's an exact percent
                // e.g. 3000 damage on 6k health tank shouldn't be adjusted
                
if (percent_adjustment != && // Is there percent to adjust
                        
damage &&  // Is damage dealt > 0%
                        
!IsExactPercent(damage// Percent representation is not exact, e.g. 3000 damage on 6k tank = 50%
                        
)
                {
                        
adjusted_percent_damage percent_damage percent_adjustment;
                        if (
adjusted_percent_damage <= last_percent// Make sure adjusted percent is not higher than previous percent, order must be maintained
                        
{
                                
percent_damage adjusted_percent_damage;
                                
percent_adjustment 0;
                        }
                }
                
PrintToChatAll("%4d (%d%%): %N"damagepercent_damageclient);
        }
}
     
ClearTankDamage()
{
        
g_iLastTankHealth 0;
        for (new 
1<= MaxClientsi++) { g_iDamage[i] = 0; }
        
g_bAnnounceTankDamage false;
}
     
     
GetTankClient()
{
        if (!
g_bIsTankInPlay) return 0;
     
        new 
tankclient g_iTankClient;
     
        if (!
IsClientInGame(tankclient)) // If tank somehow is no longer in the game (kicked, hence events didn't fire)
        
{
                
tankclient FindTankClient(); // find the tank client
                
if (!tankclient) return 0;
                
g_iTankClient tankclient;
        }
     
        return 
tankclient;
}
     
FindTankClient()
{
        for (new 
client 1client <= MaxClientsclient++)
        {
                if (!
IsClientInGame(client) ||
                        
GetClientTeam(client) != TEAM_INFECTED ||
                        !
IsPlayerAlive(client) ||
                        
GetEntProp(clientProp_Send"m_zombieClass") != ZOMBIECLASS_TANK)
                        continue;
     
                return 
client// Found tank, return
        
}
        return 
0;
}
     
GetDamageAsPercent(damage)
{
        return 
RoundToFloor(FloatMul(FloatDiv(float(damage), g_fMaxTankHealth), 100.0));
}
     
bool:IsExactPercent(damage)
{
        return (
FloatAbs(float(GetDamageAsPercent(damage)) - FloatMul(FloatDiv(float(damage), g_fMaxTankHealth), 100.0)) < 0.001) ? true:false;
}
     
public 
SortByDamageDesc(elem1elem2, const array[], Handle:hndl)
{
        
// By damage, then by client index, descending
        
if (g_iDamage[elem1] > g_iDamage[elem2]) return -1;
        else if (
g_iDamage[elem2] > g_iDamage[elem1]) return 1;
        else if (
elem1 elem2) return -1;
        else if (
elem2 elem1) return 1;
        return 
0;

Lajtowy is offline
Lajtowy
Member
Join Date: Jun 2012
Old 07-14-2012 , 04:00   Re: Tank Damage Announce by griffin
Reply With Quote #2

bump
Lajtowy is offline
eric0279
AlliedModders Donor
Join Date: May 2007
Old 07-23-2012 , 22:56   Re: Tank Damage Announce by griffin
Reply With Quote #3

bump, I have the same problem
eric0279 is offline
Lajtowy
Member
Join Date: Jun 2012
Old 07-24-2012 , 06:56   Re: Tank Damage Announce by griffin
Reply With Quote #4

This one work, if tank losing control damage is printed but if he die is printed again, so its better than this old one.

Last edited by asherkin; 07-26-2012 at 15:46. Reason: Removed binary, no source code.
Lajtowy is offline
Mr. Zero
Veteran Member
Join Date: Jun 2009
Location: Denmark
Old 07-24-2012 , 08:22   Re: Tank Damage Announce by griffin
Reply With Quote #5

Looks like its based somewhat of my old Rotoblin code. I would try increase the timer if it prints to chat upon tank being passed.

Replace all
CreateTimer(0.1, Timer_CheckTank
with
CreateTimer(0.5, Timer_CheckTank
Mr. Zero is offline
Lajtowy
Member
Join Date: Jun 2012
Old 07-24-2012 , 10:58   Re: Tank Damage Announce by griffin
Reply With Quote #6

Did you have coloured version of that? if yes can u pass me ?
Lajtowy is offline
eric0279
AlliedModders Donor
Join Date: May 2007
Old 07-24-2012 , 17:13   Re: Tank Damage Announce by griffin
Reply With Quote #7

Code:
PrintRemainingHealth()
{
        if (!g_bEnabled) return;
        new tankclient = GetTankClient();
        if (!tankclient) return;
     
        decl String:name[MAX_NAME_LENGTH];
        if (IsFakeClient(tankclient)) name = "AI";
        else GetClientName(tankclient, name, sizeof(name));
        PrintToChatAll("[HP TANK] Il reste %d HP a (%s).", name, g_iLastTankHealth);
}
The player's name does not appear, could you tell me how to fix this?

cordially
eric0279 is offline
shavit
AlliedModders Donor
Join Date: Dec 2011
Location: Israel
Old 07-24-2012 , 17:20   Re: Tank Damage Announce by griffin
Reply With Quote #8

Quote:
Originally Posted by eric0279 View Post
Code:
PrintRemainingHealth()
{
        if (!g_bEnabled) return;
        new tankclient = GetTankClient();
        if (!tankclient) return;
     
        decl String:name[MAX_NAME_LENGTH];
        if (IsFakeClient(tankclient)) name = "AI";
        else GetClientName(tankclient, name, sizeof(name));
        PrintToChatAll("[HP TANK] Il reste %d HP a (%s).", name, g_iLastTankHealth);
}
The player's name does not appear, could you tell me how to fix this?

cordially
%N instead of %d.
__________________
retired
shavit is offline
thetwistedpanda
Good Little Panda
Join Date: Sep 2008
Old 07-24-2012 , 17:56   Re: Tank Damage Announce by griffin
Reply With Quote #9

Actually, swap your name and iLastTankHealth to fix the issue. If you look at your code, you're using %d for name, and %s for g_iLastTankHealth - your values are backwards. Alternatively, this method doesn't require to you to get the client's name:
PHP Code:
PrintRemainingHealth()
{
        if (!
g_bEnabled
            return;

        new 
tankclient GetTankClient();
        if (!
tankclient
            return;

        if (
IsFakeClient(tankclient)) 
            
PrintToChatAll("[HP TANK] Il reste AI HP a (%d)."g_iLastTankHealth);
        else 
            
PrintToChatAll("[HP TANK] Il reste %N HP a (%d)."tankclientg_iLastTankHealth);

__________________

Last edited by thetwistedpanda; 07-24-2012 at 18:01.
thetwistedpanda is offline
eric0279
AlliedModders Donor
Join Date: May 2007
Old 07-24-2012 , 20:03   Re: Tank Damage Announce by griffin
Reply With Quote #10

Thanks shavit, I test the next tank.

edit : doesn't works :
Code:
PrintRemainingHealth()
{
        if (!g_bEnabled) 
            return;
        new tankclient = GetTankClient();
        if (!tankclient) return;
     
        decl String:name[MAX_NAME_LENGTH];
        if (IsFakeClient(tankclient)) name = "AI";
        else GetClientName(tankclient, name, sizeof(name));
        PrintToChatAll("[HP TANK] Il reste %d HP a (%N).", name, g_iLastTankHealth);
}
Quote:
PrintToChatAll("[HP TANK] Il reste %d HP a (%N).", name, g_iLastTankHealth);
>> It gives a random number instead of the nickname, I think it gives the userid?

The number of remaining HP to tank is not correct when the survivors are all on land.
A tank has 6000 hp in versus mode.

Screenshot :
first


second (Works) :


could you tell me how to fix this?

Last edited by eric0279; 07-25-2012 at 06:15.
eric0279 is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 09:15.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode