#include <vip_core>
#include <sdktools>
#pragma newdecls required
public Plugin myinfo =
{
name = "[VIP] Everyday Gift Status",
author = "AlmazON",
description = "[VIP] Повседневный Подарок Статуса",
version = "0.1.5",
url = "
Сообщество администраторов игровых серверов HLmod.ru"
}
static const char sKills[] = "player_death",
sModel[] = "models/items/cs_gift.mdl",
sSound[] = "items/gift_drop.wav";
#define DAY 24
bool g_bGift, g_bTimeGift[DAY];
char g_sDay[1], g_sGroup[64];
float g_fGift[3];
int g_iCount, g_iGifts, g_iGiftsMax, g_iKillsPlayers, g_iVIP_NewVIP, g_iVIP_Renewal;
public void OnPluginStart()
{
ConVar cvar;
(cvar = CreateConVar("vip_egs_gifts", "3", "Number of drop-in gifts.\n0 - disable.", _, true, -DAY.0, true, DAY.0)).AddChangeHook(ChangeCvar_Gifts);
ChangeCvar_Gifts(cvar, g_sDay, g_sDay);
(cvar = CreateConVar("vip_egs_group", "vip", "VIP-status Group.")).AddChangeHook(ChangeCvar_Group);
cvar.GetString(g_sGroup, sizeof(g_sGroup));
(cvar = CreateConVar("vip_egs_kills", "3", "Number of kills for activation.\n0 - reset.", _, true, 0.0)).AddChangeHook(ChangeCvar_Kills);
g_iKillsPlayers = cvar.IntValue;
(cvar = CreateConVar("vip_egs_newvip", "-10.0", "Time of status for new VIP players (hours).\n-0 - temporal.")).AddChangeHook(ChangeCvar_NewVIP);
g_iVIP_NewVIP = RoundToCeil(cvar.FloatValue * 3600.0);
(cvar = CreateConVar("vip_egs_renewal", "100.0", "Renewal for VIP players (hours).\n0 - ignore, - - temporal.")).AddChangeHook(ChangeCvar_Renewal);
g_iVIP_Renewal = RoundToCeil(cvar.FloatValue * 3600.0);
AutoExecConfig(true, "VIP-EverydayGiftStatus", "vip");
}
public void OnPluginEnd()
{
int egs;
if ((egs = FindEntityByClassname(-1, "vip-egs")) != -1) RemoveEdict(egs);
}
public void ChangeCvar_Gifts(ConVar convar, const char[] oldValue, const char[] newValue)
{
if (g_iGiftsMax)
{
for (int i; i < sizeof(g_bTimeGift); ++i)
{
g_bTimeGift
= false;
}
g_sDay[0] = 0;
if ((g_iGiftsMax = convar.IntValue) == 0)
{
UnhookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
if (0 < g_iGifts)
{
g_iGifts = g_bGift = false;
UnhookEvent(sKills, Event_PlayerDeath);
OnPluginEnd();
}
}
}
else if ((g_iGiftsMax = convar.IntValue)) HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}
public void ChangeCvar_Group(ConVar convar, const char[] oldValue, const char[] newValue)
{
strcopy(g_sGroup, sizeof(g_sGroup), newValue);
}
public void ChangeCvar_Kills(ConVar convar, const char[] oldValue, const char[] newValue)
{
if ((g_iKillsPlayers = convar.IntValue) == 0)
{
g_bGift = false;
convar.SetString(oldValue);
}
}
public void ChangeCvar_NewVIP(ConVar convar, const char[] oldValue, const char[] newValue)
{
g_iVIP_NewVIP = RoundToCeil(convar.FloatValue * 3600.0);
}
public void ChangeCvar_Renewal(ConVar convar, const char[] oldValue, const char[] newValue)
{
g_iVIP_Renewal = RoundToCeil(convar.FloatValue * 3600.0);
}
public void OnAutoConfigsBuffered()
{
PrecacheModel(sModel);
PrecacheSound(sSound);
}
public void Event_RoundStart(Event event, const char[] target, bool dontBroadcast)
{
if (g_bGift) g_iCount = GetRandomInt(0 > g_iGiftsMax, g_iKillsPlayers);
else
{
char buffer[5];
FormatTime(buffer, sizeof(buffer), "%d%H");
if (g_sDay[0] != buffer[1])
{
g_sDay[0] = buffer[1];
int i;
float time = DAY.0/(i = 0 > g_iGiftsMax ? -g_iGiftsMax:g_iGiftsMax);
do
{
g_bTimeGift[RoundToNearest(GetRandomFloat(--i * time, i * time - 1.0))] = true;
}
while (0 < i);
}
if (g_bTimeGift[(g_iCount = StringToInt(buffer[sizeof(buffer)-3]))])
{
g_bTimeGift[g_iCount] = false;
if (g_iGifts++ == 0) HookEvent(sKills, Event_PlayerDeath);
}
g_iCount = 0;
}
}
public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
if (g_bGift)
{
if (g_iCount == g_iKillsPlayers) g_iCount = GetRandomInt(0, g_iKillsPlayers);
if (--g_iCount == 0)
{
//Code CreateGift() by inklesspen
int gift, rotor, trigger;
DispatchKeyValue(gift = CreateEntityByName("prop_physics_override"), "classname", "vip-egs");
DispatchKeyValue(gift, "model", sModel);
DispatchKeyValue(gift, "physicsmode", "2");
DispatchKeyValueFloat(gift, "massScale", 1.0);
char target[19];
FormatEx(target, sizeof(target), "vip-egs_%i", gift);
DispatchKeyValue(gift, "targetname", target);
GetClientAbsOrigin(GetClientOfUserId(event.GetInt("userid")), g_fGift);
DispatchKeyValueVector(gift, "origin", g_fGift);
DispatchSpawn(gift);
SetEntProp(gift, Prop_Send, "m_usSolidFlags", 8);
SetEntProp(gift, Prop_Send, "m_CollisionGroup", 1);
DispatchKeyValueVector(rotor = CreateEntityByName("func_rotating"), "origin", g_fGift);
DispatchKeyValue(rotor, "maxspeed", "150");
DispatchKeyValue(rotor, "friction", "0");
DispatchKeyValue(rotor, "dmg", "0");
DispatchKeyValue(rotor, "solid", "0");
DispatchKeyValue(rotor, "spawnflags", "64");
FormatEx(target[8], sizeof(target), "rotor_%i", rotor);
DispatchKeyValue(rotor, "targetname", target);
DispatchSpawn(rotor);
SetEntPropEnt(rotor, Prop_Send, "m_hOwnerEntity", gift);
// Format(target, sizeof(target), "%s,Kill,,0,-1", target);
// DispatchKeyValue(gift, "OnKilled", target);
SetVariantString("!activator");
AcceptEntityInput(gift, "SetParent", rotor, rotor);
DispatchKeyValue(trigger = CreateEntityByName("trigger_multiple"), "model", sModel);
DispatchKeyValueVector(trigger, "origin", g_fGift);
DispatchKeyValue(trigger, "wait", "0");
DispatchKeyValue(trigger, "spawnflags", "64");
FormatEx(target[8], sizeof(target), "trig_%i", trigger);
DispatchKeyValue(trigger, "targetname", target);
DispatchSpawn(trigger);
// Format(target, sizeof(target), "%s,Kill,,0,-1", target);
// DispatchKeyValue(rotor, "OnKilled", target);
float vec[3];
GetEntPropVector(gift, Prop_Send, "m_vecMins", vec);
SetEntPropVector(trigger, Prop_Send, "m_vecMins", vec);
GetEntPropVector(gift, Prop_Send, "m_vecMaxs", vec);
SetEntPropVector(trigger, Prop_Send, "m_vecMaxs", vec);
SetEntProp(trigger, Prop_Send, "m_nSolidType", 2);
SetEntProp(trigger, Prop_Send, "m_fEffects", GetEntProp(trigger, Prop_Send, "m_fEffects") | 32);
SetVariantString("!activator");
AcceptEntityInput(trigger, "SetParent", rotor, rotor);
AcceptEntityInput(rotor, "Start");
SetEntPropEnt(trigger, Prop_Send, "m_hOwnerEntity", rotor);
HookSingleEntityOutput(trigger, "OnStartTouch", OnStartTouch);
}
}
else
{
int client = GetClientOfUserId(event.GetInt("userid"));
if (!IsFakeClient(client) && (g_iVIP_Renewal || !VIP_IsClientVIP(client)) && ++g_iCount == g_iKillsPlayers) g_bGift = true;
}
}
public void OnStartTouch(const char[] output, int caller, int activator, float delay)
{
if (activator <= MaxClients && !IsFakeClient(activator))
{
int i;
if (VIP_IsClientVIP(activator))
{
if (!g_iVIP_Renewal || !(i = VIP_GetClientAccessTime(activator)) || !GetTrieValue(VIP_GetVIPClientTrie(activator), "ClientID", delay))
{
PrintHintText(activator, "[VIP]\nYou already have VIP benefits.\ngift.");
return;
}
if (delay == -1.0)
{
if (0 > g_iVIP_Renewal || VIP_GetClientAuthType(activator) == AUTH_FLAGS)
{
PrintHintText(activator, "[VIP]\nCurrent status has no renewal. в\gift!");
return;
}
i = g_iVIP_Renewal;
}
}
else
{
i = g_iVIP_NewVIP;
delay = -1.0;
}
UnhookSingleEntityOutput(caller, "OnStartTouch", OnStartTouch);
g_bGift = false;
if (--g_iGifts == 0) UnhookEvent(sKills, Event_PlayerDeath);
if (delay != -1.0)
{
VIP_SetClientAccessTime(activator, (0 > g_iVIP_Renewal ? -g_iVIP_Renewal:g_iVIP_Renewal) + i, true);
for (i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i)) PrintToChat(i, "\x01\04[GiftStatus] \x01Player \x03%N \x01picked up \x05gift \x01- extension VIP.", activator);
}
PrintHintText(activator, "Вы продлили себе VIP!");
}
else
{
VIP_SetClientVIP(activator, 0 > i ? -i:i, _, g_sGroup, 0 < i);
for (i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i)) PrintToChat(i, "\x01\04[GiftStatus] \x01Player \x03%N \x01took \x05gift \x01с VIP-status.\n Congratulations!", activator);
}
PrintHintText(activator, "You received a VIP status as a gift!");
}
if ((i = GetEntPropEnt(caller, Prop_Send, "m_hOwnerEntity")) != -1)
{
if ((activator = GetEntPropEnt(i, Prop_Send, "m_hOwnerEntity")) != -1) AcceptEntityInput(activator, "Kill");
AcceptEntityInput(i, "Kill");
}
AcceptEntityInput(caller, "Kill");
EmitAmbientSound(sSound, g_fGift, activator);
}
}