PHP Code:
#include <sourcemod>
#include <sdktools>
#define SCORE_DEBUG 1
#define L4D_TEAM_SURVIVORS 2
#define L4D_TEAM_INFECTED 3
#define L4D_TEAM_SPECTATE 1
new Handle:pm_var_max_hunters = INVALID_HANDLE;
new Handle:pm_var_start_heal_pts = INVALID_HANDLE;
new Handle:pm_var_pts_gain_map_completion = INVALID_HANDLE;
new Handle:pm_var_pts_loss_kit = INVALID_HANDLE;
new Handle:pm_var_pts_loss_pills = INVALID_HANDLE;
new Handle:pm_var_pts_loss_incap = INVALID_HANDLE;
new Handle:pm_var_pts_loss_per_second = INVALID_HANDLE;
new Handle:pm_var_endmap_pts_loss_yellow = INVALID_HANDLE;
new Handle:pm_var_endmap_pts_loss_red = INVALID_HANDLE;
new Handle:pm_var_pts_win_witch_killed = INVALID_HANDLE;
new Handle:pm_var_pts_win_tank_killed = INVALID_HANDLE;
new Handle:pm_var_pts_loss_per_ff = INVALID_HANDLE;
new Handle:pm_var_pts_loss_per_damage = INVALID_HANDLE;
new Handle:pm_var_death_percentage_loss = INVALID_HANDLE;
new Handle:pm_var_show_details = INVALID_HANDLE;
new Handle:pm_var_seconds = INVALID_HANDLE;
new timerMin;
new survAlive;
new mapFinished;
new mapCompletion;
new finishAlive;
new timerSec;
new currentScore;
new roundStarted;
new roundFinished;
public Plugin:myinfo =
{
name = "L4Pro",
author = "rodounet",
description = "Promod made for l4dfrance",
version = "0.0.0.1",
url = "http://www.l4dfrance.com/"
}
public OnPluginStart()
{
LoadTranslations("common.phrases");
RegAdminCmd("pm_reset", Command_Reset, ADMFLAG_BAN);
RegAdminCmd("pm_getscore", Command_GetScore, ADMFLAG_BAN);
RegAdminCmd("pm_displayvars", Command_DisplayVars, ADMFLAG_BAN);
RegConsoleCmd("say", Command_Say);
RegConsoleCmd("say_team", Command_Say);
pm_var_max_hunters = CreateConVar("pm_var_max_hunters", "3", "TODO: Maximum number of hunters.");
pm_var_start_heal_pts = CreateConVar("pm_var_start_heal_pts", "800", "Starting Heal points.");
pm_var_pts_gain_map_completion = CreateConVar("pm_var_pts_gain_map_completion", "100", "TODO: Points given per player for map completion.");
pm_var_death_percentage_loss = CreateConVar("pm_var_death_percentage_loss", "33", "Points lost on each damage received.");
pm_var_pts_loss_kit = CreateConVar("pm_var_pts_loss_kit", "0", "Points lost when kit is used.");
pm_var_pts_loss_pills = CreateConVar("pm_var_pts_loss_pills", "0", "Points lost when pills are used.");
pm_var_pts_loss_incap = CreateConVar("pm_var_pts_loss_incap", "0", "Points lost when survivor is incapacitated.");
pm_var_pts_loss_per_second = CreateConVar("pm_var_pts_loss_per_second", "0", "Points lost each second.");
pm_var_pts_loss_per_ff = CreateConVar("pm_var_pts_loss_per_ff", "1", "Points lost on friendly fire.");
pm_var_pts_loss_per_damage = CreateConVar("pm_var_pts_loss_per_damage", "1", "Points lost on each damage received.");
pm_var_pts_win_witch_killed = CreateConVar("pm_var_pts_loss_witch_killed", "0", "Points earned for killing a witch.");
pm_var_pts_win_tank_killed = CreateConVar("pm_var_pts_win_tank_killed", "0", "Points earned for killing a tank.");
pm_var_endmap_pts_loss_yellow = CreateConVar("pm_var_endmap_pts_loss_yellow", "0", "TODO: Points lost at the end of map if a player is yellow.");
pm_var_endmap_pts_loss_red = CreateConVar("pm_var_endmap_pts_loss_red", "0", "TODO: Points lost at the end of map if a player is red.");
pm_var_show_details = CreateConVar("pm_var_show_details", "1", "Display everything.");
pm_var_seconds = CreateConVar("pm_var_seconds", "1", "secondes");
roundStarted = 0;
HookEvent("player_left_start_area", Event_PlayerLeftStartArea);
HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("heal_success", Event_HealSuccess);
HookEvent("pills_used", Event_PillsUsed);
HookEvent("player_incapacitated", Event_Incap);
HookEvent("witch_killed", Event_WitchKilled);
HookEvent("tank_killed", Event_TankKilled);
HookEvent("friendly_fire", Event_FriendlyFire);
HookEvent("player_hurt_concise", Event_PlayerHurt);
HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre);
AutoExecConfig(true, "plugin_pRoDmod");
}
public Action:Event_PlayerLeftStartArea(Handle:event, const String:name[], bool:dontBroadcast)
{
if (!roundStarted)
{
StartScoring();
survAlive = 4;
finishAlive = 4;
timerMin = 0;
timerSec = 0;
mapCompletion = GetVersusDistance();
PrintToChatAll("The Round is Started, GL & HF");
DebugPrintToAll("finish alive : %d mapCompletion : %d map Finished : %d survAlive : %d", finishAlive, mapCompletion, mapFinished, survAlive);
return Plugin_Handled;
}
else
{
PrintToChatAll("The Round is already started");
}
return Plugin_Continue;
}
public Action:Command_Say(client, args)
{
if (roundStarted)
return Plugin_Continue;
decl String:sayWord[MAX_NAME_LENGTH];
GetCmdArg(1, sayWord, sizeof(sayWord));
new idx = (sayWord[0] == '!' && sayWord[1] == 'r' && sayWord[2] == 'e' && sayWord[3] == 's' && sayWord[4] == 'e' && sayWord[5] == 't');
if (idx)
{
Reset();
return Plugin_Handled;
}
return Plugin_Continue;
}
StartScoring()
{
if (roundStarted)
{
PrintToChatAll("=== ERROR: round already started. ===");
return;
}
currentScore = GetConVarInt(pm_var_start_heal_pts);
PrintToChatAll("=== Round Started ===");
PrintToChatAll("Starting points : %d", currentScore);
CreateTimer(1.0, Event_TimerSecond, _, TIMER_REPEAT);
roundStarted = 1;
DrawClientPanel();
}
GetVersusDistance()
{
new ent = -1, maxents = GetMaxEntities();
decl String:netclass[64];
for (new i = MaxClients+1; i <= maxents; i++)
{
if (IsValidEntity(i))
{
GetEntityNetClass(i, netclass, sizeof(netclass));
if (StrEqual(netclass, "CTerrorGameRulesProxy", false))
{
ent = i;
break;
}
}
}
if (ent > -1)
{
new offset = FindSendPropInfo("CTerrorGameRulesProxy", "m_iVersusDistance");
if (offset > 0)
{
if (GetEntData(ent, offset))
{
return GetEntData(ent, offset);
}
}
}
return -1;
}
public DrawClientPanel()
{
decl String:scoreStr[1024];
Format(scoreStr, 1024, "-> Score: %d pts.", currentScore);
decl String:timerStr[1024];
Format(timerStr, 1024, "-> Timer: %d min %d sec.", timerMin, timerSec);
decl String:survStr[1024];
Format(survStr, 1024, "-> Survivor : %d.", survAlive);
decl String:percentStr[1024];
Format(percentStr, 1024, "-> Percent Travelled : %d.", mapCompletion);
new Handle:panel = CreatePanel();
DrawPanelText(panel, scoreStr);
DrawPanelText(panel, timerStr);
DrawPanelText(panel, survStr);
DrawPanelText(panel, percentStr);
for (new i = 1; i < 9; i++)
{
if(IsClientInGameHuman(i))
{
SendPanelToClient(panel, i, Menu_Panel, 2);
/*
#if READY_DEBUG
PrintToChat(i, "[DEBUG] You have been sent the Panel.");
#endif
*/
}
}
CloseHandle(panel);
}
public Menu_Panel(Handle:menu, MenuAction:action, param1, param2) { return; }