Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Голосование за игрока
Голосование за игрока
Naykon Дата: Понедельник, 02.04.2012, 19:19:28 | Сообщение # 1
Сообщений: 439
Репутация: -4 [ +/- ]
Code
     // Находим игрока, за которого больше всего проголосовали
      new vots = 0, target_index = 0;
      for (new i = 1; i <= MaxClients; i++)
      {
          if (votes[i] > vots)
          {
              vots = votes[i];
              target_index = i;
          }
      }
      if (target_index > 0 && IsClientInGame(target_index))
      {
                 лялялялля
      }


Вот часть кода отвечающая за игрока за которого больше всего проголосовали.... но она определяется неправильно. 5 игроков из 9 Голосующих проголосовали за X игрока но все равно был выбран Y игрок...
Но когда 1 голос из 1 голосующего голосует за X то выбирается правильно.
Сделал вывод что игрок определяется правильно только при 100% голосов (но не всегда)
ППЦ какойто (((
 
Scarface_slv Дата: Понедельник, 02.04.2012, 21:57:19 | Сообщение # 2
Сообщений: 737
Репутация: 61 [ +/- ]
тут же есть урок создание голосования за кик игрока в начале раунда

Добавлено (02.04.2012, 21:57:19)
---------------------------------------------
а понял) ты отуда и скопировал этот код=)

 
_wS_ Дата: Вторник, 03.04.2012, 00:36:58 | Сообщение # 3
Thanks
Naykon, да, это часть кода и ошибок в нем нет. Ты наверно перед запуском голосования не очистил votes для каждого игрока и в нем по прежнему остались прошлые голоса - надо сбросить на 0.

Code
for (new i = 1; i <= MaxClients; i++) votes[i] = 0;
// и только после этого запускать голосование


И если игрок вышел с сервера или вошел, то опять надо сбросить на 0 голоса за него. Хотя не всегда, смотря как ты делаешь, я не знаю, просто говорю что все это надо учитывать.
 
Naykon Дата: Вторник, 03.04.2012, 09:31:49 | Сообщение # 4
Сообщений: 439
Репутация: -4 [ +/- ]
Code
    SetMenuExitButton(h_Menu, false);
  decl String:StR_Id[15], String:StR_Name[MAX_NAME_LENGTH];
  new players = 0;
  for (new i = 1; i <= MaxClients; i++)
  {
   votes[i] = 0;
   if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i))
   {
    IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id));
    GetClientName(i,StR_Name, sizeof(StR_Name));
    AddMenuItem(h_Menu, StR_Id, StR_Name);

    players += 1;
   }
  }


До добавления игрока в меню голоса за него сбрасывались... дело очевидно не в этом((((
 
_wS_ Дата: Вторник, 03.04.2012, 10:10:12 | Сообщение # 5
Thanks
Ну тот же скрипт, который я дал в уроке для примера, работает? Значит ты где-то промазал, и в этом коде, что ты дал сейчас, тоже нет ошибок. Когда игрок голосует, проверяй в той ли он команде, в которой был, когда ты ему меню отправлял. Может раунд новый начался, может он перешел - надо все мелочи учитывать.
 
Naykon Дата: Вторник, 03.04.2012, 16:44:23 | Сообщение # 6
Сообщений: 439
Репутация: -4 [ +/- ]
Code
      new vots = 0, target_index = 0;
       for (new i = 1; i <= MaxClients; i++)
       {
           if (votes[i] > vots)
           {
               vots = votes[i];
               target_index = i;
           }
       }

Если я не ошибаюсь то вот это - vots = votes[i]; и так приравнивает победителя (votes[i]) к 0 сразу после завершения голосования
А уже target_index - передает что делать с победителем...

Выяснил точную суть ошибки. Если в 1 раунде был выбран игрок X то и в следующих этот игрок будет тоже выбраны независимо от результата (коррупция епт) а вот когда никто не голосует за игроков вообще тогда запускается Рандом:
Code
GetRandomClient()
{
  new indexes[MaxClients+1], players = 0;
  for (new i = 1; i <= MaxClients; i++)
  {
   if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i))
   {
    indexes[players++] = i;
   }
  }
  if (players > 0) return indexes[GetRandomInt(0, players-1)];
  return 0;
}


Лишь после рандома следующее голосование будет правильном((

Добавлено (03.04.2012, 16:44:23)
---------------------------------------------
Не могу разобраться укажи носом а ошибку пи*ц какой-то

Code
#include <sourcemod>
#include <cstrike>
#include <sdktools>
#include <sdktools_entoutput>
#include <sdktools_functions>  

new Handle:h_Menu, Handle:h_Timer, votes[MAXPLAYERS+1], timer_sec, all_votes;
new ct_client;  
new ct;  
new Handle:pMenu;

public OnPluginStart()
{
  HookEvent("round_start", Round_Start, EventHookMode_PostNoCopy);
  HookEvent("player_death", playerDeath);  
   
}

public Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{
  if (h_Timer != INVALID_HANDLE)
  {
   KillTimer(h_Timer);
   h_Timer = INVALID_HANDLE;
  }   
  if (h_Menu != INVALID_HANDLE) CloseHandle(h_Menu);  
  h_Menu = CreateMenu(Select_Func);
  SetMenuTitle(h_Menu, "Выберите ...\n \n");
  AddMenuItem(h_Menu, "", "Лучше подумай дважды!", ITEMDRAW_DISABLED);
  AddMenuItem(h_Menu, "", "Прежде !\n \n", ITEMDRAW_DISABLED);
  SetMenuExitButton(h_Menu, false);
  decl String:StR_Id[15], String:StR_Name[MAX_NAME_LENGTH];
  new players = 0;
  for (new i = 1; i <= MaxClients; i++)
  {
   votes[i] = 0;
   if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i))
   {
    IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id));
    GetClientName(i,StR_Name, sizeof(StR_Name));
    AddMenuItem(h_Menu, StR_Id, StR_Name);

    players += 1;
   }
  }
   
  if (players > 0)  
  {
   for (new i = 1; i <= MaxClients; i++)
   {
    if (IsClientInGame(i) && GetClientTeam(i) == 2) DisplayMenu(h_Menu, i, 15);
   }
    
   all_votes = 0; // сколько всего было голосов
   timer_sec = 15; // время голосования в сек.
   h_Timer = CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
  }
  else
  {
   CloseHandle(h_Menu);
   h_Menu = INVALID_HANDLE;
  }
}

public Select_Func(Handle:menu, MenuAction:action, i, option)
{
  new client;
  if (action == MenuAction_Select)
  {
   decl String:StR_Id[15];
   GetMenuItem(menu, option, StR_Id, sizeof(StR_Id));
   new target_index = GetClientOfUserId(StringToInt(StR_Id));
   if (target_index > 0)
   {
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, target_index);
    BfWriteByte(h, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "Игрок \x03%N", i, target_index);
    BfWriteString(h, xStR);
    EndMessage();
    }
   }
   else PrintToChat(i, "Игрок не найден");
  }
}

public Action:Timer_Func(Handle:timer, any:x)
{
      timer_sec -= 1;
      if (timer_sec > 0)
      {
          PrintHintTextToAll("Через:\n< %d сек >", timer_sec);
          return Plugin_Continue;
      }
      // Время истекло, голосование окончено
      h_Timer = INVALID_HANDLE;
      if (h_Menu != INVALID_HANDLE)
      {
          CloseHandle(h_Menu);
          h_Menu = INVALID_HANDLE;
      }
      PrintHintTextToAll("Голосование завершено (%d голосов)", all_votes);
      if (all_votes < 1)
   {
   new random_client = GetRandomClient();
   if (random_client > 0)
   {
    decl Handle:j;
    if ((j = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(j, random_client);
    BfWriteByte(j, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "Игрок\x03 %N", random_client);
    BfWriteString(j, xStR);
    EndMessage();
    }
    ct_client = random_client
    ИзменилЦвет(random_client, "255.252.52.52");
    Com_Menu(ct_client)
   }
   return Plugin_Stop;
  }  
      // Находим игрока, за которого больше всего проголосовали
      new vots = 0, target_index = 0;
      for (new i = 1; i <= MaxClients; i++)
      {
          if (votes[i] > vots)
          {
              votes[i] = 0;
              target_index = i;
          }
     
      }
      if (target_index > 0 && IsClientInGame(target_index))
      {
     ct_client = target_index;
    decl Handle:k;
   if ((k = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(k, ct_client);
    BfWriteByte(k, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "Игрок\x03 %N", ct_client);
    BfWriteString(k, xStR);
    EndMessage();
    }
    ИзменилЦвет(ct_client, "255.252.52.52");
    Com_Menu(ct_client)
      }
      else
   {
    ct_client = GetRandomClient();
   if (ct_client > 0)
   {
    target_index = ct_client
    decl Handle:n;
    if ((n = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(n, ct_client);
    BfWriteByte(n, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "\x03 %N \x04", ct_client);
    BfWriteString(n, xStR);
    EndMessage();
    }
    ИзменилЦвет(ct_client, "255.252.52.52");
    Com_Menu(ct_client)
   }
  }
      return Plugin_Stop;
}

wS_GetLookPos(ct_client, Float:wS_Pos[3])
{
      decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace;
      GetClientEyePosition(ct_client, EyePosition);
      GetClientEyeAngles(ct_client, EyeAngles);
      h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, wS_GetLookPos_Filter, ct_client);
      TR_GetEndPosition(wS_Pos, h_trace);
      CloseHandle(h_trace);
}  

public bool:wS_GetLookPos_Filter(ent, mask, any:i)
{
       return i != ent;
}

public Action:playerDeath(Handle:event, const String:name[], bool:dontBroadcast)  
{
  if (pMenu != INVALID_HANDLE) CloseHandle(pMenu);
  new userid = GetEventInt(event, "userid");
  new client = GetClientOfUserId(userid);
  if(client == ct_client)
  {
    decl Handle:l;
    if ((l = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(l, ct_client);
    BfWriteByte(l, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "\x04***\x03X убит!\x04***");
    BfWriteString(l, xStR);
    EndMessage();
    }
   ct_client = GetRandomClient();
   if (ct_client > 0)
   {
    client = ct_client
    decl Handle:n;
    if ((n = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(n, ct_client);
    BfWriteByte(n, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "Игрок\x03 %N ***", ct_client);
    BfWriteString(n, xStR);
    EndMessage();
    }
    ИзменилЦвет(ct_client, "255.252.52.52");
    Com_Menu(ct_client)
   }
   return Plugin_Stop;
  }
}

public OnClientDisconnect(client)
{
  for (new i = 1; i <= MaxClients; i++) votes[i] = 0;  
  if (client == ct_client)
  {
   decl Handle:l;
   if ((l = StartMessageAll("SayText2")) != INVALID_HANDLE)
   {
    BfWriteByte(l, ct_client);
    BfWriteByte(l, true);
    decl String:xStR[75];
    Format(xStR, sizeof(xStR), "\x04отключился!");
    BfWriteString(l, xStR);
    EndMessage();
   }
   ct_client = GetRandomClient();
   if (ct_client > 0)
   {
    client = ct_client
    decl Handle:n;
    if ((n = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
     BfWriteByte(n, ct_client);
     BfWriteByte(n, true);
     decl String:xStR[75];
     Format(xStR, sizeof(xStR), "\x03Игрок\x03 %N", ct_client);
     BfWriteString(n, xStR);
     EndMessage();
    }
    ИзменилЦвет(ct_client, "255.252.52.52");
    Com_Menu(ct_client)
   }
  return Plugin_Stop;
  }

}
   
GetRandomClient()
{
  new indexes[MaxClients+1], players = 0;
  for (new i = 1; i <= MaxClients; i++)
  {
   if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i))
   {
    indexes[players++] = i;
   }
  }
  if (players > 0) return indexes[GetRandomInt(0, players-1)];
  return 0;
}
 
_wS_ Дата: Вторник, 03.04.2012, 18:16:09 | Сообщение # 7
Thanks
1. На all_votes посмотри..
2. Зачем в 'public Select_Func' new client; ?
3. Ты очищаешь ВСЕ голоса, если выходит 1 игрок.. Не знаешь как цикл for работает?
4. Это что? ИзменилЦвет(ct_client, "255.252.52.52");
5. Переменные pMenu и ct вообще лишние
6. Сто раз 1 и тот же код повторяешь, урок про функции не читал или не понял

В следующий раз, если кода много, прикрепляй .sp файл, ибо неприятно исправлять неправильные отступы.
 
Naykon Дата: Вторник, 03.04.2012, 22:52:23 | Сообщение # 8
Сообщений: 439
Репутация: -4 [ +/- ]
Честно я собирал этот плагин опираясь на голосование за Кик поэтому это и происходит.. но я не представляю как можно это исправить т.е половину этого кода не понимаю... т.к 50% написал не я, обьясните мне:
1) Как раюотате цыкл for обясните на мини примере что вы имеете введу ..
Code
for (new i = 1; i <= MaxClients; i++)
  {
   votes[i] = 0;
   if (IsClientInGame(i) && GetClientTeam(i) == 3 && IsPlayerAlive(i))
   {
    IntToString(GetClientUserId(i), StR_Id, sizeof(StR_Id));
    GetClientName(i,StR_Name, sizeof(StR_Name));
    AddMenuItem(h_Menu, StR_Id, StR_Name);

    players += 1;
   }
  }


Я читаю это строка как: для (перемнная i; i <= количеству килентов; i=i+1 (т.е 2)); Если (Игрок в игре, он же игрет за СТ и он жив)......

В обще for (new i = 1; i <= MaxClients; i++) - для 1 любого игрока как я понимаю...
2) Функции на примерах из Википедии кое-что понял и может не совершено.. если в ваших силах то обьясните.

Лишние переменные не мешают они нужны были мне для еще одно дополнения - но я его вырезал чтоб не обнародовать плагин, с ИзменилЦвет - это роли на проблему не играет.... просто не стал копаться и искать в других скриптах как правильно написать функцию

3) Как заставить его работать нормально???

Добавлено (03.04.2012, 22:52:23)
---------------------------------------------
Обратите внимание на этот пост - http://world-source.ru/forum/102-2422-1

 
_wS_ Дата: Среда, 04.04.2012, 04:59:38 | Сообщение # 9
Thanks
Quote (Naykon)
http://world-source.ru/forum/102-2422-1

Не буду обращать, надоело на твои глупые вопросы отвечать, ты не стараешься. Неужели тяжело в API посмотреть синтаксис команды и все остальное на счет нее? ... !

Code
BanClient(client, time, flags, const String:reason[], const String:kick_message[]="");

Ты не указал кик-сообщение.. Ты указал причину (не помню для чего она). На счет цикла for. Запусти этот глупый скрипт и поймешь как оно работает.. :

Code
for (new i = 1; i < 6; i++) PrintToServer("-> %d", i);


Quote
1
2
3
4
5


Я говорил уже, да и самому додуматься несложно (но ты видимо не можешь, я не представляю почему и как это возможно). Если не знаешь ты или не понимаешь какой-то кусок кода, вставь в то место PrintToServer чтобы увидеть чему равны непонятные тебе переменные и тд. У меня уже нет терпения на такие разговоры.
 
Naykon Дата: Суббота, 15.09.2012, 02:44:35 | Сообщение # 10
Сообщений: 439
Репутация: -4 [ +/- ]
Code
       new vots = 0;
   new Lider = 0;
   if (Player > 0)
   {
     VoterAll += 1;
              Voter[Player] += 1;        
    for (new i = 1; i <= MaxClients; i++)
    {
     if (Voter[i] > vots)
     {
      vots = Voter[i];
      Lider = i;
       
     }
    }
     decl String:format[300];
     Format(format, sizeof(format), "%N", Lider);  
     PrintHintTextToAll("Статистика: %s", format);
   }


Запись такого рода показывает лидера голосования, подскажите как написать в окне PrintHintTextToAll всех за кого голосуют и сколько голосов отданы за каждого номинанта. (В сообщении игроки меняются местами, тот за кого больше проголосовали тот вверху..) Ранее не сталкивался, поэтому прошу помочь. Зарание благодарю.
 
Scarface_slv Дата: Суббота, 15.09.2012, 12:17:03 | Сообщение # 11
Сообщений: 737
Репутация: 61 [ +/- ]
в сам цикл засунуть не пробовал?
 
Naykon Дата: Суббота, 15.09.2012, 12:34:21 | Сообщение # 12
Сообщений: 439
Репутация: -4 [ +/- ]
пробывал тоже самое.. я не пойму как составить строку чтоб писало внизу:
1.NAME (голоса)
2.NAME2 (голоса)
3.NAME3 (голоса)
...

(((( и если честно я с трудом понимаю эту запись:
Code

new vots = 0;
     for (new i = 1; i <= MaxClients; i++)
     {
      if (Voter[i] > vots)
      {
       vots = Voter[i];
       Lider = i;
         
      }
     }

этой частью кода пользовался с урока.
 
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » Голосование за игрока
  • Страница 1 из 1
  • 1
Поиск: