#pragma semicolon 1 #include #include #include #define PL_VERSION "1.1" new Handle:g_hKv = INVALID_HANDLE; new bool:g_bRegen[MAXPLAYERS+1]; new Handle:g_hRegenTimer[MAXPLAYERS+1]; new Handle:g_hRegenEnable = INVALID_HANDLE; new bool:g_bRegenEnable; new Handle:g_hRegenHP = INVALID_HANDLE; new g_iRegenHP; new Handle:g_hRegenTick = INVALID_HANDLE; new Float:g_fRegenTick; new Handle:g_hRegenDelay = INVALID_HANDLE; new Float:g_fRegenDelay; new Handle:g_hSpawn = INVALID_HANDLE; new Float:g_fSpawn; new Handle:g_hSpawnRandom = INVALID_HANDLE; new bool:g_bSpawnRandom; new bool:g_bSpawnMap; new Handle:g_hRedSpawns = INVALID_HANDLE; new Handle:g_hBluSpawns = INVALID_HANDLE; public Plugin:myinfo = { name = "TF2 Deathmatch", author = "MikeJS", description = "I wonder", version = PL_VERSION, url = "" }; public OnPluginStart() { CreateConVar("tf2dm", PL_VERSION, "TF2 Deathmatch version.", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY); g_hRegenEnable = CreateConVar("tf2dm_regen", "1", "Enable health regeneration.", FCVAR_PLUGIN|FCVAR_NOTIFY); g_hRegenHP = CreateConVar("tf2dm_regenhp", "1", "Health added per regeneration tick.", FCVAR_PLUGIN|FCVAR_NOTIFY); g_hRegenTick = CreateConVar("tf2dm_regentick", "0.1", "Delay between regeration ticks.", FCVAR_PLUGIN|FCVAR_NOTIFY); g_hRegenDelay = CreateConVar("tf2dm_regendelay", "4.0", "Seconds after damage before regeneration.", FCVAR_PLUGIN|FCVAR_NOTIFY); g_hSpawn = CreateConVar("tf2dm_spawn", "1.5", "Spawn timer.", FCVAR_PLUGIN|FCVAR_NOTIFY); g_hSpawnRandom = CreateConVar("tf2dm_spawnrandom", "1", "Enable random spawns.", FCVAR_PLUGIN|FCVAR_NOTIFY); HookConVarChange(g_hRegenEnable, Cvar_regenenable); HookConVarChange(g_hRegenHP, Cvar_regenhp); HookConVarChange(g_hRegenTick, Cvar_regentick); HookConVarChange(g_hRegenDelay, Cvar_regendelay); HookConVarChange(g_hSpawn, Cvar_spawn); HookConVarChange(g_hSpawnRandom, Cvar_spawnrandom); HookEvent("player_death", Event_player_death); HookEvent("player_hurt", Event_player_hurt); HookEvent("player_spawn", Event_player_spawn); HookEvent("teamplay_round_start", Event_round_start); HookEvent("teamplay_restart_round", Event_round_start); g_hRedSpawns = CreateArray(); g_hBluSpawns = CreateArray(); } public OnMapStart() { ClearArray(g_hRedSpawns); ClearArray(g_hBluSpawns); for(new i=0;i=iplayers;i++) PushArrayArray(GetArrayCell(g_hRedSpawns, i), vectors); } while(KvGotoNextKey(g_hKv)); KvGoBack(g_hKv); KvGoBack(g_hKv); } else { SetFailState("Red spawns missing. Map: %s Players: %i", map, iplayers); } if(KvJumpToKey(g_hKv, "blue")) { KvGotoFirstSubKey(g_hKv); do { KvGetVector(g_hKv, "origin", origin); KvGetVector(g_hKv, "angles", angles); vectors[0] = origin[0]; vectors[1] = origin[1]; vectors[2] = origin[2]; vectors[3] = angles[0]; vectors[4] = angles[1]; vectors[5] = angles[2]; for(new i=0;iGetMaxHealth(client)) health = GetMaxHealth(client); SetEntProp(client, Prop_Send, "m_iHealth", health, 1); SetEntProp(client, Prop_Data, "m_iHealth", health, 1); g_hRegenTimer[client] = CreateTimer(g_fRegenTick, Regen, client); } } public Action:Respawn(Handle:timer, any:client) { if(IsClientInGame(client) && IsClientOnTeam(client)) TF2_RespawnPlayer(client); } public Action:Event_player_death(Handle:event, const String:name[], bool:dontBroadcast) { CreateTimer(g_fSpawn, Respawn, GetClientOfUserId(GetEventInt(event, "userid"))); } public Action:Event_player_hurt(Handle:event, const String:name[], bool:dontBroadcast) { if(g_bRegenEnable) { new client = GetClientOfUserId(GetEventInt(event, "userid")); new attacker = GetClientOfUserId(GetEventInt(event, "attacker")); if(client!=attacker && attacker!=0) { g_bRegen[client] = false; if(g_hRegenTimer[client]!=INVALID_HANDLE) CloseHandle(g_hRegenTimer[client]); g_hRegenTimer[client] = CreateTimer(g_fRegenDelay, StartRegen, client); } } } public Action:Event_player_spawn(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "userid")); g_hRegenTimer[client] = CreateTimer(0.01, StartRegen, client); if(g_bSpawnRandom && g_bSpawnMap) CreateTimer(0.01, RandomSpawn, client); } public Action:Event_round_start(Handle:event, const String:name[], bool:dontBroadcast) { new ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "team_round_timer"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "func_regenerate"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "team_control_point_master"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "team_control_point"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "trigger_capture_area"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; /*ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "item_medkit_small"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "item_medkit_medium"))!=-1) AcceptEntityInput(ent, "Disable"); ent = MaxClients+1; while((ent = FindEntityByClassname(ent, "item_medkit_large"))!=-1) AcceptEntityInput(ent, "Disable");*/ for(new i=0;i<=MaxClients;i++) if(g_hRegenTimer[i]!=INVALID_HANDLE) CloseHandle(g_hRegenTimer[i]); } GetMaxHealth(client) { new class = _:TF2_GetPlayerClass(client); switch(class) { case 1: return 125; case 2: return 125; case 3: return 200; case 4: return 175; case 5: return 150; case 6: return 300; case 7: return 175; case 8: return 125; case 9: return 125; } return -1; } IsClientOnTeam(client) { new team = GetClientTeam(client); return team==2||team==3; }