Не мешай парнючто в тегах темы делает serva4ok ?
я не мешаю, не говорю что он плох и даже не критикую, просто интересноНе мешай парнюбесплатнозаниматься своим делом :buba:
Блин, с телефона писал. Хотел тэг написать server а не то что получилось.что в тегах темы делает serva4ok ?
fixedБлин, с телефона писал. Хотел тэг написать server а не то что получилось.
Оффтопя не мешаю, не говорю что он плох и даже не критикую, просто интересно
Простой плагин для DM
Описание: террористы теряют бомбу на базе кт и не могу до нее добраться.
Выводится автоматическое голосование "Вернуть бомбу террористам" "Да или Нет".
SM 1.9
CSS V34
#pragma semicolon 1
#include <sourcemod>
#include <sdktools_functions>
public void OnPluginStart()
{
HookEvent("bomb_dropped", Event_OnBombDropped, EventHookMode_Post);
}
public Action Event_OnBombDropped(Handle event, const char[] name, bool dontBroadcast)
{
DoVoteMenu(name);
return Plugin_Handled;
}
public Handle_VoteMenu(Handle:menu, MenuAction:action, param1, param2)
{
if (action == MenuAction_End)
{
// Вызывается после VoteEnd
CloseHandle(menu);
}
else if (action == MenuAction_VoteEnd)
{
// 0=да, 1=нет
if (param1 == 0)
{
new String:GiveC4[64];
GetMenuItem(menu, param1, GiveC4, sizeof(GiveC4));
}
}
}
DoVoteMenu(const String:GiveC4[])
{
if (IsVoteInProgress())
{
return;
}
new Handle:menu = CreateMenu(Handle_VoteMenu);
SetMenuTitle(menu, "Отдать бомбу Т?", GiveC4);
AddMenuItem(menu, GiveC4, "Да");
AddMenuItem(menu, "no", "Нет");
SetMenuExitButton(menu, false);
VoteMenuToAll(menu, 20);
}
public GiveC4(Handle:event, const String:name[], bool:silent)
{
new random_client = GiveC42();
if (random_client > 0)
{
// случайный игрок выбран, что-то делаем
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if (GetClientTeam(client) == 2)
GivePlayerItem(client, "weapon_c4");
}
}
GiveC42()
{
new indexes[MaxClients+1], players = 0;
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i)) indexes[players++] = i;
}
if (players > 0) return indexes[GetRandomInt(0, players-1)];
return 0;
}
Можно сделать так, ставить ворота на карту и ставить в это же место невидимый блок и убирать его при достижении 10 игроков.Менял карту и добавлял на нее такие вот ворота через которые нельзя пройти, возможно ли такое вот поле силовое поставить в плагин блок пост ? и когда игроков было бы 5 на 5 то эти ворота бы пропускали игроков, но не пропадали. И трудно ли это реализовать?
C4 может получить только Т игрок. Если это проверить дальше, то в случае выпадения КТ, бомба так и не вернется.:blush:C++:GiveC42() { new indexes[MaxClients+1], players = 0; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) indexes[players++] = i; } if (players > 0) return indexes[GetRandomInt(0, players-1)]; return 0; }
Возможно я что-то упускаю, но зачем это? И где вообще вызывается функция GiveC4 ?:blink:C++:new String:GiveC4[64]; GetMenuItem(menu, param1, GiveC4, sizeof(GiveC4));
#pragma semicolon 1
#pragma newdecls required
#include <cstrike>
#include <sdktools_functions>
Handle hTimer;
bool bDropped;
int iTime;
public void OnPluginStart()
{
ConVar cvar;
(cvar = CreateConVar("sm_c4_return_vote", "15", "The time after which a vote will be created if a bomb is not raised from the ground", _, true)).AddChangeHook(CVarChanged);
iTime = cvar.IntValue;
HookEvent("bomb_dropped", Event_Bomb);
HookEvent("bomb_pickup", Event_Bomb);
}
public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
iTime = cvar.IntValue;
}
public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
OnMapEnd();
}
public void OnMapEnd()
{
bDropped = false;
if(hTimer) delete hTimer;
}
public void Event_Bomb(Event event, const char[] name, bool dontBroadcast)
{
bDropped = name[5] == 'd';
if(bDropped) hTimer = CreateTimer((iTime + 0.0), Timer_Vote);
else OnMapEnd();
}
public Action Timer_Vote(Handle timer)
{
if(IsVoteInProgress()) return; // голосование ещё идёт
Menu menu = new Menu(Handle_VoteMenu);
menu.SetTitle("Отдать бомбу Т?");
menu.AddItem("yes", "Да");
menu.AddItem("no", "Нет");
menu.ExitButton = false;
menu.DisplayVoteToAll(15);
hTimer = null;
}
public int Handle_VoteMenu(Menu menu, MenuAction action, int param1, int param2)
{
if(action == MenuAction_End) delete menu;
else if(action == MenuAction_VoteEnd && !bDropped && !param1)
{
int clients[MAXPLAYERS+1], num;
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
clients[num++] = i;
if(num) GivePlayerItem(GetRandomInt(0, num-1), "weapon_c4");
}
}
AlexPa1, у тебя в событии никак не определяется местонахождение бомбы
И что за событие с каллбэком GiveC4?
У тебя код вообще нерабочий.
Что за хрень я только что смотрел? Сделайте мне развидеть это!
Если никто не поднимет брошенную бомбу в течение времени, установленном кваром sm_c4_return_vote, то будет создано голосование.
Если к этому времени раунд или карта завершится, то голосование не будет создано.
Если после окончания голосования бомба уже будет поднята или же раунд или карта будет завершёны, то ничего не произойдёт.
C++:#pragma semicolon 1 #pragma newdecls required #include <cstrike> #include <sdktools_functions> Handle hTimer; bool bDropped; int iTime; public void OnPluginStart() { ConVar cvar; (cvar = CreateConVar("sm_c4_return_vote", "15", "The time after which a vote will be created if a bomb is not raised from the ground", _, true)).AddChangeHook(CVarChanged); iTime = cvar.IntValue; HookEvent("bomb_dropped", Event_Bomb); HookEvent("bomb_pickup", Event_Bomb); } public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue) { iTime = cvar.IntValue; } public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason) { OnMapEnd(); } public void OnMapEnd() { bDropped = false; if(hTimer) delete hTimer; } public void Event_Bomb(Event event, const char[] name, bool dontBroadcast) { bDropped = name[5] == 'd'; if(bDropped) hTimer = CreateTimer((iTime + 0.0), Timer_Vote); else OnMapEnd(); } public Action Timer_Vote(Handle timer) { if(IsVoteInProgress()) return; // голосование ещё идёт Menu menu = new Menu(Handle_VoteMenu); menu.SetTitle("Отдать бомбу Т?"); menu.AddItem("yes", "Да"); menu.AddItem("no", "Нет"); menu.ExitButton = false; menu.DisplayVoteToAll(15); hTimer = null; } public int Handle_VoteMenu(Menu menu, MenuAction action, int param1, int param2) { if(action == MenuAction_End) delete menu; else if(action == MenuAction_VoteEnd && !bDropped && !param1) { int clients[MAXPLAYERS+1], num; for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) clients[num++] = i; if(num) GivePlayerItem(GetRandomInt(0, num-1), "weapon_c4"); } }
Обновил код:Плагин попросту не учитывает голоса.
#pragma semicolon 1
#pragma newdecls required
#include <cstrike>
#include <sdktools_functions>
Handle hTimer;
bool bDropped;
int iTime,
iLimit;
public void OnPluginStart()
{
ConVar cvar;
(cvar = CreateConVar("sm_c4_return_time", "15", "The time after which a vote will be created if a bomb is not raised from the ground. 0 - plugin disabled", _, true)).AddChangeHook(CVarChanged_Time);
iTime = cvar.IntValue;
(cvar = CreateConVar("sm_c4_return_votes", "60", "Percent required for successful C4 return vote.", _, true, 5.0, true, 100.0)).AddChangeHook(CVarChanged_Votes);
iLimit = cvar.IntValue;
HookEvent("bomb_dropped", Event_Bomb);
HookEvent("bomb_pickup", Event_Bomb);
LoadTranslations("basevotes.phrases");
}
public void CVarChanged_Time(ConVar cvar, const char[] oldValue, const char[] newValue)
{
iTime = cvar.IntValue;
}
public void CVarChanged_Votes(ConVar cvar, const char[] oldValue, const char[] newValue)
{
iLimit = cvar.IntValue;
}
public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
OnMapEnd();
}
public void OnMapEnd()
{
bDropped = false;
if(hTimer) delete hTimer;
}
public void Event_Bomb(Event event, const char[] name, bool dontBroadcast)
{
bDropped = iTime && name[5] == 'd';
if(bDropped) hTimer = CreateTimer((iTime + 0.0), Timer_Vote);
else OnMapEnd();
}
public Action Timer_Vote(Handle timer)
{
if(IsVoteInProgress()) return;
Menu menu = new Menu(Handle_VoteMenu);
menu.SetTitle("Отдать бомбу Т?");
menu.AddItem("1", "Да");
menu.AddItem("0", "Нет");
menu.ExitButton = false;
int clients[MAXPLAYERS+1], num;
for(int i = 1; i <= MaxClients; i++) if(IsClientValid(i, 3)) clients[num++] = i;
menu.DisplayVote(clients, num, 15);
hTimer = null;
}
public int Handle_VoteMenu(Menu menu, MenuAction action, int param1, int param2)
{
if(action == MenuAction_End) delete menu;
else if(action == MenuAction_VoteEnd && !bDropped && !param1)
{
char item[4];
int num, i, votes;
GetMenuVoteInfo(param2, i, votes);
menu.GetItem(param1, item, sizeof(item));
if(item[0] == '0' && param1 == 1) i = votes - i;
num = 100 * i / votes;
if((item[0] == '1' && num < iLimit && param1 == 0) || (item[0] == '0' && param1 == 1))
PrintToChatAll("[SM] %t", "Vote Failed", iLimit, num, votes);
else
{
PrintToChatAll("[SM] %t", "Vote Successful", num, votes);
int clients[MAXPLAYERS+1];
for(i = 1, num = 0; i <= MaxClients; i++) if(IsClientValid(i, 2, true))
clients[num++] = i;
if(num) GivePlayerItem(GetRandomInt(0, num-1), "weapon_c4");
}
}
}
stock bool IsClientValid(int client, int team, bool bots = false)
{
return IsClientInGame(client) && GetClientTeam(client) == team && IsPlayerAlive(client) && (bots || !IsFakeClient(client));
}