R1KO
fuck society
- Сообщения
- 9,457
- Реакции
- 7,786
- Команда форума
- #1
Хочу переписать DM. Чтобы не обсуждать это дело здесь (т.к. это немного другой плагин), предлагаю делать этот тут.
Что имеется на данный момент:
Что планируется добавить:
На все перечисленные функции будут введены переменные, для того, чтобы каждый мог настроить всё под себя.
Последняя на данный момент версия кода:
Свои пожелания/предложения/обнаруженные баги отписывать ниже.
Что имеется на данный момент:
- Автоматическое возрождение игроков при смерти (с задержкой в пол секунды)
- Удаление трупов после смерти
- Защиту при появлении игрока
- Удаление зон покупки оружия.
- Автоматическое пополнение патронов.
Что планируется добавить:
- Меню оружия при спавне.
- Удаление оружия при выбрасывании и смерти.
- Автоматический баланс игроков.
- Запрет конца раунда.
- Удаление заложников.
На все перечисленные функции будут введены переменные, для того, чтобы каждый мог настроить всё под себя.
Последняя на данный момент версия кода:
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <cstrike>
#include <sdktools>
new Handle:Timer_Respawn[MAXPLAYERS+1] = {INVALID_HANDLE, ... },
Handle:Timer_Dissolve[MAXPLAYERS+1] = {INVALID_HANDLE, ... },
Handle:Timer_Protect[MAXPLAYERS+1] = {INVALID_HANDLE, ... };
new Handle:g_Dissolve_Enabled = INVALID_HANDLE,
Handle:g_NoBuyZone_Enabled = INVALID_HANDLE;
new bool:g_dissolve_enabled,
bool:g_nobuyzone_enabled,
bool:g_spawn_protect;
new g_ActiveWepOffs = -1;
public Plugin:myinfo =
{
name = "DeathMatch",
author = "R1KO & KorDen",
version = "1.0",
url = "http://hlmod.ru"
};
public OnPluginStart()
{
CreateConVar("cssdm_version", "2.1.6-compat", "Fake cvar for monitors", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
g_Dissolve_Enabled = CreateConVar("dm_dissolve_enabled", "1", "Включить/Выключить расстворение трупов.");
g_NoBuyZone_Enabled = CreateConVar("dm_nobuyzone_enabled", "1", "Включить/Выключить запрет зон закупок.");
g_Spawn_Protect = CreateConVar("dm_spawn_protect", "1.0", "Время защиты игрока при спавне (0 - отключено).");
HookEvent("player_death", OnPlayerDeath);
HookEvent("player_spawn", OnPlayerSpawn);
HookEvent("player_team", OnPlayerTeam);
g_ActiveWepOffs = FindSendPropOffs("CCSPlayer", "m_hActiveWeapon");
if (g_ActiveWepOffs > 0)
{
HookEvent("weapon_reload", Event_CheckDepleted);
HookEvent("weapon_fire_on_empty", Event_CheckDepleted);
}
}
public OnMapStart()
{
//---------------
g_dissolve_enabled = GetConVarBool(g_Dissolve_Enabled);
g_nobuyzone_enabled = GetConVarBool(g_NoBuyZone_Enabled);
g_spawn_protect = GetConVarFloat(g_Spawn_Protect);
//----------------
if(g_nobuyzone_enabled)
{
new i = -1;
while ((i = FindEntityByClassname(i, "func_buyzone")) != -1)
{
if (IsValidEntity(i)) AcceptEntityInput(i, "Kill");
}
}
public Event_CheckDepleted(Handle:event, const String:name[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
new entity = GetEntDataEnt2(client, g_ActiveWepOffs);
if (entity > 0) SetEntProp(client, Prop_Data, "m_iAmmo", 200, 4, GetEntProp(entity, Prop_Data, "m_iPrimaryAmmoType"));
}
public OnPlayerTeam(Handle:event, const String:name[], bool:silent)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if (client > 0)
{
new team = GetEventInt(event, "team");
if (team > 1)
Timer_Respawn[client] = CreateTimer(1.0, f_Respawn, client);
else
KillTimerS(client);
}
}
public OnPlayerSpawn(Handle:event, const String:name[], bool:silent)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if (client > 0)
{
if(g_spawn_protect > 0)
{
SetEntProp(client, Prop_Data, "m_takedamage", 0);
team = GetClientTeam(client);
if (team == 2) SetNewColor(client, 255, 75, 75, 200);
else if (team==3) SetNewColor(client, 75, 75, 255, 200);
Timer_Protect[client] = CreateTimer(g_spawn_protect, ProtectTimer_CallBack, client);
}
}
}
public Action:ProtectTimer_CallBack(Handle:timer, any:client)
{
if (IsClientInGame(client) && IsPlayerAlive(client))
{
SetEntProp(client, Prop_Data, "m_takedamage", 2);
SetNewColor(client, 255, 255, 255, 255);
}
// Timer_Protect[client] = INVALID_HANDLE;
KillTimer(Timer_Protect[client]);
}
SetNewColor(client, r, g, b, a)
{
SetEntityRenderMode(client, RENDER_TRANSCOLOR);
SetEntityRenderColor(client, r, g, b, a);
}
public OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if(g_dissolve_enabled)
{
if (IsValidEntity(client) && IsClientInGame(client))
{
new ragdoll = GetEntPropEnt(client, Prop_Send, "m_hRagdoll");
if(ragdoll > 0)
{
new Handle:datapack = INVALID_HANDLE;
Timer_Dissolve[client] = CreateDataTimer(2.0, f_Dissolve, datapack, TIMER_FLAG_NO_MAPCHANGE);
WritePackCell(datapack, ragdoll);
WritePackCell(datapack, client);
ResetPack(datapack);
}
}
}
Timer_Respawn[client] = CreateTimer(3.0, f_Respawn, client);
}
public Action:f_Dissolve(Handle:timer, Handle:datapack)
{
new ragdoll = ReadPackCell(datapack);
new client = ReadPackCell(datapack);
if(IsValidEntity(ragdoll))
AcceptEntityInput(ragdoll, "kill");
// Timer_Dissolve[client] = INVALID_HANDLE;
KillTimer(Timer_Dissolve[client]);
}
public Action:f_Respawn(Handle:timer, any:client)
{
//Timer_Respawn[client] = INVALID_HANDLE;
KillTimer(Timer_Respawn[client]);
if (IsClientInGame(client) && !IsPlayerAlive(client))
CS_RespawnPlayer(client);
}
public OnClientDisconnect(client)
KillTimerS(client);
KillTimerS(client)
{
if (Timer_Respawn[client] != INVALID_HANDLE)
{
KillTimer(Timer_Respawn[client]);
Timer_Respawn[client] = INVALID_HANDLE;
}
if (Timer_Dissolve[client] != INVALID_HANDLE)
{
KillTimer(Timer_Dissolve[client]);
Timer_Dissolve[client] = INVALID_HANDLE;
}
if (Timer_Protect[client] != INVALID_HANDLE)
{
KillTimer(Timer_Protect[client]);
Timer_Protect[client] = INVALID_HANDLE;
}
}
Свои пожелания/предложения/обнаруженные баги отписывать ниже.
Последнее редактирование: