Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Всем добрый вечер, подскажите пожалуйста, как получить меткость игрока в течении раунда в % соотношении и как узнать меткость команды, так же в % соотношении. Пример: Аркадий стрелял с меткостью 62%, меткость остальных террористов —13%. Игра ксс 34
@7pElllHuK, считать выстрелы игрока и сравнивать с попадениями (через события player_hurt или с помощью хука SDKHook_OnTakeDamageAlivePost). Правда могут быть прострелы через нескольких игроков (авп может до трёх человек прострелить одним выстрелом) или попадения из дробовика, так что нужно будет ещё это как-то учитывать (таймером, например).
@7pElllHuK, считать выстрелы игрока и сравнивать с попадениями (через события player_hurt или с помощью хука SDKHook_OnTakeDamageAlivePost). Правда могут быть прострелы через нескольких игроков (авп может до трёх человек прострелить одним выстрелом) или попадения из дробовика, так что нужно будет ещё это как-то учитывать (таймером, например).
int iCountHit[MAXPLAYERS+1]; // Счетчик попаданий игрока
int iCountShoot[MAXPLAYERS+1]; // Счетчик выстрелов игрока
int iCountHitTeam[2]; // Счетчик попаданий команд (0 - команда Т, 1 - команда КТ)
int iCountShootTeam[2]; // Счетчик выстрелов команд (0 - команда Т, 1 - команда КТ)
public void OnPluginStart(){
HookEvent("round_start", OnRoundStart);
HookEvent("weapon_fire", OnWeaponFire);
HookEvent("player_hurt", OnPlayerHurt);
HookEvent("round_end", OnRoundEnd);
}
// Обнуляем счетчики попаданий и выстрелов для всех игроков и команд в начале раунда
public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast){
for(int client = 1; client <= MaxClients; client++)
{
iCountShoot[client] = iCountHit[client] = 0;
}
iCountShootTeam[0] = iCountHitTeam[1] = 0;
}
// Считаем выстрелы игрока и команд
public Action OnWeaponFire(Event event, const char[] name, bool dontBroadcast){
int client = GetClientOfUserId(event.GetInt("userid"));
iCountShoot[client]++; // Сохраняем каждый выстрел игрока
if(GetClientTeam(client) == 2) // Если игрок за Т, сохраняем выстрелы и для его команды
{
iCountShootTeam[0]++; // Сохраняем выстрелы команды Т
}
else // Если игрок за КТ...
{
iCountShootTeam[1]++; // Сохраняем выстрелы команды КТ
}
}
// Считаем попадания игроков и команд
public Action OnPlayerHurt(Event event, const char[] name, bool dontBroadcast){
int client = GetClientOfUserId(event.GetInt("userid"));
int attacker = GetClientOfUserId(event.GetInt("attacker"));
if((1 <= attacker && attacker <= MaxClients && IsClientInGame(attacker))
&& (1 <= client && client <= MaxClients && IsClientInGame(client)))
{
if(attacker != client) // Учитывем что игрок не может сам себе навредить
{
// Дальше все также, как и в функции OnWeaponFire
iCountHit[attacker]++;
if(GetClientTeam(attacker) == 2)
{
iCountHitTeam[0]++;
}
else
{
iCountHitTeam[1]++;
}
}
}
}
// Выводим статистику попаданий игроков и команд в конце раунда
public Action OnRoundEnd(Event event, const char[] name, bool dontBroadcast){
for(int client = 1; client <= MaxClients; client++)
{
if(IsClientInGame(client))
{
if(iCountHit[client] > 0 && iCountShoot[client] > 0) // Учитываем что игрок должен иметь больше 0 попаданий и выстрелов
{
float fPercentHits = iCountHit[client] / iCountShoot[client] * 100.0;
PrintToChatAll("Игрок %N имеет %.1f%% попаданий", client, fPercentHits);
}
}
}
if(iCountHitTeam[0] > 0 && iCountShootTeam[0] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда Т)
{
float fPercentHitsT = iCountHitTeam[0] / iCountShootTeam[0] * 100.0;
PrintToChatAll("Команда террористов имеет %.1f%% попаданий!", fPercentHitsT);
}
if(iCountHitTeam[1] > 0 && iCountShootTeam[1] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда КТ)
{
float fPercentHitsCT = iCountHitTeam[1] / iCountShootTeam[1] * 100.0;
PrintToChatAll("Команда спецназа имеет %.1f%% попаданий!", fPercentHitsCT);
}
}
Только это приблизительный код, так как есть моменты которые стоит учитывать и исправить
Да и лучше делать, как написал Grey83, через SDKHook_OnTakeDamageAlivePost, так как через player_hurt будет считать попадания если игрок нанесет урон с ножа/гранаты и тд
Хотя можно и в player_hurt все сделать, наверн
Пробовал
Вообще оно странно работает
При спавне пропа, когда устнавливаю флаг, тогда можно сделать чтобы оно или получало урон, или было твердым
Если менять значения во время игры, тогда можно подобрать что-то
И вот когда я получил необходимый мне флаг, и ставлю его в момент спавна пропа, ничего не меняется
int iCountHit[MAXPLAYERS+1]; // Счетчик попаданий игрока
int iCountShoot[MAXPLAYERS+1]; // Счетчик выстрелов игрока
int iCountHitTeam[2]; // Счетчик попаданий команд (0 - команда Т, 1 - команда КТ)
int iCountShootTeam[2]; // Счетчик выстрелов команд (0 - команда Т, 1 - команда КТ)
public void OnPluginStart(){
HookEvent("round_start", OnRoundStart);
HookEvent("weapon_fire", OnWeaponFire);
HookEvent("player_hurt", OnPlayerHurt);
HookEvent("round_end", OnRoundEnd);
}
// Обнуляем счетчики попаданий и выстрелов для всех игроков и команд в начале раунда
public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast){
for(int client = 1; client <= MaxClients; client++)
{
iCountShoot[client] = iCountHit[client] = 0;
}
iCountShootTeam[0] = iCountHitTeam[1] = 0;
}
// Считаем выстрелы игрока и команд
public Action OnWeaponFire(Event event, const char[] name, bool dontBroadcast){
int client = GetClientOfUserId(event.GetInt("userid"));
iCountShoot[client]++; // Сохраняем каждый выстрел игрока
if(GetClientTeam(client) == 2) // Если игрок за Т, сохраняем выстрелы и для его команды
{
iCountShootTeam[0]++; // Сохраняем выстрелы команды Т
}
else // Если игрок за КТ...
{
iCountShootTeam[1]++; // Сохраняем выстрелы команды КТ
}
}
// Считаем попадания игроков и команд
public Action OnPlayerHurt(Event event, const char[] name, bool dontBroadcast){
int client = GetClientOfUserId(event.GetInt("userid"));
int attacker = GetClientOfUserId(event.GetInt("attacker"));
if((1 <= attacker && attacker <= MaxClients && IsClientInGame(attacker))
&& (1 <= client && client <= MaxClients && IsClientInGame(client)))
{
if(attacker != client) // Учитывем что игрок не может сам себе навредить
{
// Дальше все также, как и в функции OnWeaponFire
iCountHit[attacker]++;
if(GetClientTeam(attacker) == 2)
{
iCountHitTeam[0]++;
}
else
{
iCountHitTeam[1]++;
}
}
}
}
// Выводим статистику попаданий игроков и команд в конце раунда
public Action OnRoundEnd(Event event, const char[] name, bool dontBroadcast){
for(int client = 1; client <= MaxClients; client++)
{
if(IsClientInGame(client))
{
if(iCountHit[client] > 0 && iCountShoot[client] > 0) // Учитываем что игрок должен иметь больше 0 попаданий и выстрелов
{
float fPercentHits = iCountHit[client] / iCountShoot[client] * 100.0;
PrintToChatAll("Игрок %N имеет %.1f%% попаданий", client, fPercentHits);
}
}
}
if(iCountHitTeam[0] > 0 && iCountShootTeam[0] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда Т)
{
float fPercentHitsT = iCountHitTeam[0] / iCountShootTeam[0] * 100.0;
PrintToChatAll("Команда террористов имеет %.1f%% попаданий!", fPercentHitsT);
}
if(iCountHitTeam[1] > 0 && iCountShootTeam[1] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда КТ)
{
float fPercentHitsCT = iCountHitTeam[1] / iCountShootTeam[1] * 100.0;
PrintToChatAll("Команда спецназа имеет %.1f%% попаданий!", fPercentHitsCT);
}
}
Только это приблизительный код, так как есть моменты которые стоит учитывать и исправить
Да и лучше делать, как написал Grey83, через SDKHook_OnTakeDamageAlivePost, так как через player_hurt будет считать попадания если игрок нанесет урон с ножа/гранаты и тд
Хотя можно и в player_hurt все сделать, наверн
Сообщения автоматически склеены:
Пробовал
Вообще оно странно работает
При спавне пропа, когда устнавливаю флаг, тогда можно сделать чтобы оно или получало урон, или было твердым
Если менять значения во время игры, тогда можно подобрать что-то
И вот когда я получил необходимый мне флаг, и ставлю его в момент спавна пропа, ничего не меняется
Привет всем!
Можно ли тут сделать,чтоб No Zoom срабатывал всегда?
На данный момент скидывается постоянно,даже когда просто перебираешь оружие.
Или может кто напишет простенький код.
Заранее благодарю!
Всем доброго времени суток, подскажите пожалуйста, как это реализовать:
Есть 2 сообщения под 1 условием, которые выводятся в конце раунда нужно вывести с начала первое сообщение (раунд закончился и выводится сообщение 1), затем закончился следующий раунд и выводится сообщение 2, потом опять заканчивается раунд и выводится опять 1 сообщение (Все по кругу идет, чтоб сообщения не повторялись).
Пример:
Код:
if (g_iCountHeadshoots[i]) //Убийства в голову
{
CPrintToChatAll("Игрок: Аркаша убил 2 игроков в голову"); //Это первое сообщение
CPrintToChatAll("Игрок: Аркаша убил 2 игроков"); //Это второе сообщение
}
Через GetRandomInt(); не вариант, так как по случайности 1 из 2 сообщений может быть продублировано подрят несколько раз
Всем доброго времени суток, подскажите пожалуйста, как это реализовать:
Есть 2 сообщения под 1 условием, которые выводятся в конце раунда нужно вывести с начала первое сообщение (раунд закончился и выводится сообщение 1), затем закончился следующий раунд и выводится сообщение 2, потом опять заканчивается раунд и выводится опять 1 сообщение (Все по кругу идет, чтоб сообщения не повторялись).
Пример:
Код:
if (g_iCountHeadshoots[i]) //Убийства в голову
{
CPrintToChatAll("Игрок: Аркаша убил 2 игроков в голову"); //Это первое сообщение
CPrintToChatAll("Игрок: Аркаша убил 2 игроков"); //Это второе сообщение
}
Через GetRandomInt(); не вариант, так как по случайности 1 из 2 сообщений может быть продублировано подрят несколько раз
Ну Вы уж постарайтесь представить, в следующий раз
C-подобный:
#pragma newdecls required
int iRounds;
public void OnPluginStart()
{
HookEvent("round_end", OnRoundEnd);
}
public void OnMapStart()
{
iRounds = 1;
}
public void OnRoundEnd(Event event, const char[] name, bool dbc)
{
// шаблонные сообщения с двумя параметрами
//
// @param %s - строка
// @param %d - число
//
// @warn порядок упоминания и количество параметров един для всех сообщений
static const char szTemplates[][] = {
"Сообщение 1: %s упал с %d этажа",
"Сообщение 2: %s упад с %d этажа и уехал"
}
for(int i = 1; i <= MaxClients; i++)
{
if(!IsClientInGame(i) || IsFakeClient(i) || IsClientSourceTV(i))
continue;
// Отправка шаблонного сообщения
PrintToChat(i, szTemplates[ChooseTemplateSync(i, sizeof(szTemplates))], GetClientNameEx(i), GetRandomInt(1, 10));
}
iRounds++;
}
// Правило выбора шаблонного сообщения
// Все клиенты получают один шаблон в момент времени
int ChooseTemplateSync(int iClient, any data)
{
return iRounds % view_as<int>(data);
}
// Каждый клиент получает свой шаблон в момент времени
int ChooseTemplateCustom(int iClient, any data)
{
static int iLastState[MAXPLAYERS+1];
iLastState[iClient]++;
if(iLastState[iClient] >= view_as<int>(data))
iLastState[iClient] = 0;
return iLastState[iClient];
}
char[] GetClientNameEx(int iClient)
{
char szBuffer[MAX_NAME_LENGTH];
if(!GetClientName(iClient, szBuffer, sizeof(szBuffer)))
szBuffer = "unnamed";
return szBuffer;
}
Ну Вы уж постарайтесь представить, в следующий раз
C-подобный:
#pragma newdecls required
int iRounds;
public void OnPluginStart()
{
HookEvent("round_end", OnRoundEnd);
}
public void OnMapStart()
{
iRounds = 1;
}
public void OnRoundEnd(Event event, const char[] name, bool dbc)
{
// шаблонные сообщения с двумя параметрами
//
// @param %s - строка
// @param %d - число
//
// @warn порядок упоминания и количество параметров един для всех сообщений
static const char szTemplates[][] = {
"Сообщение 1: %s упал с %d этажа",
"Сообщение 2: %s упад с %d этажа и уехал"
}
for(int i = 1; i <= MaxClients; i++)
{
if(!IsClientInGame(i) || IsFakeClient(i) || IsClientSourceTV(i))
continue;
// Отправка шаблонного сообщения
PrintToChat(i, szTemplates[ChooseTemplateSync(i, sizeof(szTemplates))], GetClientNameEx(i), GetRandomInt(1, 10));
}
iRounds++;
}
// Правило выбора шаблонного сообщения
// Все клиенты получают один шаблон в момент времени
int ChooseTemplateSync(int iClient, any data)
{
return iRounds % view_as<int>(data);
}
// Каждый клиент получает свой шаблон в момент времени
int ChooseTemplateCustom(int iClient, any data)
{
static int iLastState[MAXPLAYERS+1];
iLastState[iClient]++;
if(iLastState[iClient] >= view_as<int>(data))
iLastState[iClient] = 0;
return iLastState[iClient];
}
char[] GetClientNameEx(int iClient)
{
char szBuffer[MAX_NAME_LENGTH];
if(!GetClientName(iClient, szBuffer, sizeof(szBuffer)))
szBuffer = "unnamed";
return szBuffer;
}