Контакты Поиск

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

  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » RTV
RTV
Naykon Дата: Воскресенье, 26.02.2012, 10:54:19 | Сообщение # 1
Сообщений: 439
Репутация: -4 [ +/- ]
Переписываю ртв на свой лад столкнулся с проблемой когда высвечивает голосование иногда рандомом в сеню появляется текущая карта хотя она там не нужна!!! Как можно исправитьь ситуацию?
Code
    new Handle:hMapVoteMenu = CreateMenu(Handler_MapVoteMenu);
  SetMenuTitle(hMapVoteMenu, "%t", "Rock The Vote");
  AddMenuItem(hMapVoteMenu , "", "Лучше подумай дважды!", ITEMDRAW_DISABLED);
  AddMenuItem(hMapVoteMenu , "", "Прежде чем тыкать куда нибудь!\n \n", ITEMDRAW_DISABLED);
  SetMenuExitButton(hMapVoteMenu , true);
   
  for (new i = 0; i < g_NextMapsCount; i++)
  {
   AddMenuItem(hMapVoteMenu, g_MapNames[g_NextMaps[i]], g_MapNames[g_NextMaps[i]]);
  }

  new mapIdx;
  for (new i = g_NextMapsCount; i < (g_MapCount < GetConVarInt(g_Cvar_Maps) ? g_MapCount : GetConVarInt(g_Cvar_Maps)); i++)
  {
   mapIdx = GetRandomInt(0, g_MapCount - 1);
    
   while (IsInMenu(mapIdx))
    if(++mapIdx >= g_MapCount) mapIdx = 0;

   g_NextMaps[i] = mapIdx;
   AddMenuItem(hMapVoteMenu, g_MapNames[mapIdx], g_MapNames[mapIdx]);
  }
   
  decl String:nochange[64];
  Format(nochange, 64, "%T", "Don't Change", LANG_SERVER);
  AddMenuItem(hMapVoteMenu, nochange, nochange);
    
  SetMenuExitButton(hMapVoteMenu, false);
  VoteMenuToAll(hMapVoteMenu, 20);
    
  LogMessage("[RTV] Rockthevote was successfully started.");
}

public Action:Timer_ChangeMap(Handle:hTimer, Handle:dp)
{
  new String:map[65];
   
  ResetPack(dp);
  ReadPackString(dp, map, sizeof(map));
   
  ServerCommand("changelevel \"%s\"", map);
   
  return Plugin_Stop;
}
 
_wS_ Дата: Воскресенье, 26.02.2012, 11:33:28 | Сообщение # 2
Если переписываешь, то делай это с самого начала, а ты используешь чужой код и поэтому не понимаешь. Должно быть несколько глобальных переменных, чтобы можно было:

Quote
- запоминать, голосовал игрок или нет
- сколько всего было голосов
- сколько нужно голосов для запуска голосования
- др.


Чтобы в меню были только нужные карты, делай проверки перед AddMenuItem. Вникать в чужой код гораздо тяжелее, чем самому сделать свой скрипт.
 
Naykon Дата: Среда, 29.02.2012, 11:13:24 | Сообщение # 3
Сообщений: 439
Репутация: -4 [ +/- ]
Понял спс учту =)

Добавлено (29.02.2012, 11:13:24)
---------------------------------------------
А как сказать
"если до конца раунда осталось X секунд то
{
}"

 
_wS_ Дата: Среда, 29.02.2012, 11:37:39 | Сообщение # 4
У тебя нет никаких идей?

Code
#pragma semicolon 1
#include <sourcemod>

new MaxSec;

public OnPluginStart()
{
     HookEvent("round_start", round_start);
}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
     MaxSec = GetEventInt(event, "timelimit") + GetTime();
}

GetSecondsLeft()
{
     return MaxSec - GetTime();
}


Если GetSecondsLeft() вернет значение меньше 1, то раунд окончен.
GetTime() - число, растущее с каждой секундой.
 
Naykon Дата: Четверг, 01.03.2012, 10:08:05 | Сообщение # 5
Сообщений: 439
Репутация: -4 [ +/- ]
Code
public Action:Timer_ChangeMap(Handle:hTimer, Handle:dp)
{
  if  
  new String:map[65];
  ResetPack(dp);
  ReadPackString(dp, map, sizeof(map));
  ServerCommand("changelevel \"%s\"", map);
  return Plugin_Stop;
}


Как можно приметить код сюда??
Это RTV плагин. нужно чтоб changelevel запускалась в конце раунда ( полсе голосования )

Добавлено (29.02.2012, 21:54:26)
---------------------------------------------
А есть попроще способ совершить действие в конце раунда??

Добавлено (01.03.2012, 10:08:05)
---------------------------------------------

Code
  GetMenuItem(menu, param1, map, sizeof(map));
    
   if (param1 == GetConVarInt(g_Cvar_Maps))
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param1);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!");
    BfWriteString(h, xStR);
    EndMessage();
    }
     
    LogMessage("[RTV] Rockthevote has ended, current map kept.");
   }
   else
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param1);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s", map);
    BfWriteString(h, xStR);
    EndMessage();
    }

    LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map);
    WritePackString(dp, map);
    go = 1; //Если сюда вставить ServerCommand("changelevel \"%s\"", map); то уарта сметиться стразу после голосования
   }
    
   g_RTVEnded = true;
  }
}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{

  if (go = 1)
  {
  new String:map[65];
   
  ResetPack(dp);
  ReadPackString(dp, map, sizeof(map));
   
  ServerCommand("changelevel \"%s\"", map);
   
  return Plugin_Stop;
  }
}


В коде отметил где раньше было ServerCommand("changelevel \"%s\"", map); и карта менялась сразу.. я решил дать глобальную переменную go = 0; и поставить на место где было ServerCommand... Дальше из кода все понятно.. Но карта не меняется в начале раунда.. почему?
 
_wS_ Дата: Четверг, 01.03.2012, 14:06:11 | Сообщение # 6
Зачем в round_start делать return Plugin_Stop;? Ошибка в if (go = 1).
= это присвоение, == это сравнение.

И после этого:

Quote
ResetPack(dp);
ReadPackString(dp, map, sizeof(map));


Надо убить пак:

Quote
CloseHandle(dp);
 
Naykon Дата: Четверг, 01.03.2012, 17:37:22 | Сообщение # 7
Сообщений: 439
Репутация: -4 [ +/- ]
Code

GetMenuItem(menu, param1, map, sizeof(map));
      
    if (param1 == GetConVarInt(g_Cvar_Maps))
    {
      
     decl Handle:h;
     if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
     {
     BfWriteByte(h, param1);
     BfWriteByte(h, true);
     decl String:xStR[128];
     Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!");
     BfWriteString(h, xStR);
     EndMessage();
     }
       
     LogMessage("[RTV] Rockthevote has ended, current map kept.");
    }
    else
    {
      
     decl Handle:h;
     if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
     {
     BfWriteByte(h, param1);
     BfWriteByte(h, true);
     decl String:xStR[128];
     Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s", map);
     BfWriteString(h, xStR);
     EndMessage();
     }

     LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map);
     go = 1;  
    }
      
    g_RTVEnded = true;
   }
}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
   new String:map[65];
   if (go == 1)
   {
   ServerCommand("changelevel \"%s\"", map);
   }
}


Сделал так убрал dp и тп... эффект тот же ((
 
_wS_ Дата: Четверг, 01.03.2012, 17:52:11 | Сообщение # 8
Хм.. Ты создал пустую строку в переменной 'map' и делаешь changelevel map, хотя где имя самой карты?
 
Naykon Дата: Пятница, 02.03.2012, 11:42:52 | Сообщение # 9
Сообщений: 439
Репутация: -4 [ +/- ]
А для чего обычно нужно вот это?? Какую ф-ю выполянет??
ResetPack(dp);
ReadPackString(dp, map, sizeof(map));

Добавлено (02.03.2012, 11:42:52)
---------------------------------------------
Почти удалось изменить карту в начале следующего раунда вот так...

Code
new String:map[64];

public Round_Start(Handle:event, const String:name[], bool:dontBroadcast)
{   
  ServerCommand("changelevel \"%s\"", map);
}
    
public Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2)
{
  if (action == MenuAction_End)
  {
   CloseHandle(menu);
   menu = INVALID_HANDLE;
  }
  else if (action == MenuAction_Select)
  {
   new String:voter[64], String:choice[64];
   GetClientName(param1, voter, sizeof(voter));
   GetMenuItem(menu, param2, choice, sizeof(choice));
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param2);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x03 %s \x05проголосовал за \x03%s ", voter, choice);
    BfWriteString(h, xStR);
    EndMessage();
    }
     
   PrintToChatAll("[RTV] %t", "Selected Map", voter, choice);
  }  
  else if (action == MenuAction_VoteEnd)
  {
   new votes, totalVotes;
   GetMenuVoteInfo(param2, votes, totalVotes);
    
   if (totalVotes < 1)
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param2);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Никто не проголосовал");
    BfWriteString(h, xStR);
    EndMessage();
    }
     
    return;
   }
    
   GetMenuItem(menu, param1, map, sizeof(map));
    
   if (param1 == GetConVarInt(g_Cvar_Maps))
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param1);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!");
    BfWriteString(h, xStR);
    EndMessage();
    }
     
    LogMessage("[RTV] Rockthevote has ended, current map kept.");
   }
   else
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param1);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s", map);
    BfWriteString(h, xStR);
    EndMessage();
    }

    LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map);
    //ServerCommand("changelevel \"%s\"", map);
    new Handle:dp;
    //CreateDataTimer(5.0, Timer_ChangeMap, dp);
    WritePackString(dp, map);
    ResetPack(dp);
    ReadPackString(dp, map, sizeof(map));
    CloseHandle(dp);
   }
    
   g_RTVEnded = true;
  }
}


Но следующая карта грузится до 3 палок а на серверер циркулирет ошибка такого рода...

Code

---- Host_Changelevel ----
L 03/02/2012 - 10:29:24: -------- Mapchange to de_prodigy --------
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
L 03/02/2012 - 10:29:25: [rockthevote.smx] [RTV] Map Cycle Path: mapcycle.txt
Unknown command "sm_jt"
Unknown command "sm_jt_ratio"
Unknown command "sm_jt_version"
---- Host_Changelevel ----
L 03/02/2012 - 10:29:26: -------- Mapchange to de_prodigy --------
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
Attempted to create unknown entity type info_ladder!
Can't init info_ladder
L 03/02/2012 - 10:29:27: [rockthevote.smx] [RTV] Map Cycle Path: mapcycle.txt
Unknown command "sm_jt"
Unknown command "sm_jt_ratio"
Unknown command "sm_jt_version"
---- Host_Changelevel ----
 
_wS_ Дата: Пятница, 02.03.2012, 12:10:58 | Сообщение # 10
Quote (Naykon)
А для чего обычно нужно вот это?? Какую ф-ю выполянет?? ResetPack(dp); ReadPackString(dp, map, sizeof(map));

Сколько еще раз мне давать ссылку на API?

В этом вообще смысла нет:

Quote
new Handle:dp;
WritePackString(dp, map);
ResetPack(dp);
ReadPackString(dp, map, sizeof(map));
CloseHandle(dp);


Ты сам пак не создал (CreateDataPack) и уже что-то в него записываешь. Да и зачем он вообще здесь нужен, если ты его сразу же извлекаешь и уничтожаешь? Тебе же уже известна переменная map, а ты создаешь пак, записываешь туда ее и сразу же извлекаешь, смысла ноль.

И ты после старта раунда делаешь changelevel. Чтобы это делать, надо быть уверенным, что в переменной map записана хоть какая-то карта, может там пустая строка или хз что. На счет ошибки info_ladder в консоле, она у всех, не обращай внимания. Обращать внимание надо на подобное:

Quote
L 03/02/2012 - 10:29:27: [rockthevote.smx] [RTV] Map Cycle Path: mapcycle.txt


Где видно название плагина и ошибку в нем, да и часто показывает, на какой именно строке. И ты часто используешь StartMessageAll("SayText2"), было бы разумнее создать отдельную функцию для этого, чтобы не повторять 500 раз один и тот же код.

Code
TeamColorMsg(client_author, const String:MsG[])
{
     decl Handle:h;
     if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
     {
         BfWriteByte(h, client_author);
         BfWriteByte(h, true);
         BfWriteString(h, MsG);
         EndMessage();
     }
     else PrintToChatAll(MsG);
}
 
Naykon Дата: Пятница, 02.03.2012, 12:29:34 | Сообщение # 11
Сообщений: 439
Репутация: -4 [ +/- ]
Code
L 03/02/2012 - 10:29:24: -------- Mapchange to de_prodigy --------

Из этого видно что map видит de_prodigy за ее я голосовал в ртв
Т.Е я был на д2 и голосовал за продиджи ... карта начала менять но позже стала циркулировать постоянно ошибка в консоле сервкра.. и карта не менялась (3 палки и зависло)

Добавлено (02.03.2012, 12:29:34)
---------------------------------------------
На счет АПИ

Code

Вызывается на клиентских соединений. Если вы вернетесь правда, клиенту будет разрешено на сервере. Если вы вернетесь ложное (или возвращение ничего), то клиент будет отклонена. Если клиент отвергает это вперед или любой другой, OnClientDisconnect не будет вызван. Примечание: Не пишите на rejectmsg, если вы планируете возвращаться правда. Если несколько плагинов запись в строке буфера, оно не определено, какая строка плагина будет показано клиенту, но это гарантирует, один из них.


Это перевод google для начинающий врядли он понятен))))
 
_wS_ Дата: Пятница, 02.03.2012, 12:37:56 | Сообщение # 12
Хм, он всегда так переводит. Ты же видишь ключевые слова, и правильно сложить мысль не так и тяжело.
 
Naykon Дата: Пятница, 02.03.2012, 13:14:57 | Сообщение # 13
Сообщений: 439
Репутация: -4 [ +/- ]
Code
public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
  if (go == 1)
  {
  decl clients;
  decl Handle:h;
  if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
  {
  BfWriteByte(h, clients);
  BfWriteByte(h, true);
  decl String:xStR[128];
  Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Карта измениться на %s сейчас", map);
  BfWriteString(h, xStR);
  EndMessage();
  }

  LogMessage("[RTV] Rockthevote has ended, changing to map %s.", map);
  new Handle:dp;
  CreateDataTimer(5.0, Timer_ChangeMap, dp);
  WritePackString(dp, map);
  }
   
}
public Action:Timer_ChangeMap(Handle:hTimer, Handle:dp)
{
  new String:map[65];
   
  ResetPack(dp);
  ReadPackString(dp, map, sizeof(map));
   
  ServerCommand("changelevel \"%s\"", map);
   
  return Plugin_Stop;
}

public Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2)
{
  if (action == MenuAction_End)
  {
   CloseHandle(menu);
   menu = INVALID_HANDLE;
  }
  else if (action == MenuAction_Select)
  {
   new String:voter[64], String:choice[64];
   GetClientName(param1, voter, sizeof(voter));
   GetMenuItem(menu, param2, choice, sizeof(choice));
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param2);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x03 %s \x05проголосовал за \x03%s ", voter, choice);
    BfWriteString(h, xStR);
    EndMessage();
    }
     
   PrintToChatAll("[RTV] %t", "Selected Map", voter, choice);
  }  
  else if (action == MenuAction_VoteEnd)
  {
   new votes, totalVotes;
   GetMenuVoteInfo(param2, votes, totalVotes);
    
   if (totalVotes < 1)
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param2);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Никто не проголосовал");
    BfWriteString(h, xStR);
    EndMessage();
    }
     
    return;
   }
    
   GetMenuItem(menu, param1, map, sizeof(map));
    
   if (param1 == GetConVarInt(g_Cvar_Maps))
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param1);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x04[Карта]\x05 Текущая карта продлена!");
    BfWriteString(h, xStR);
    EndMessage();
    }
     
    LogMessage("[RTV] Rockthevote has ended, current map kept.");
   }
   else
   go = 1;
   {
    
    decl Handle:h;
    if ((h = StartMessageAll("SayText2")) != INVALID_HANDLE)
    {
    BfWriteByte(h, param1);
    BfWriteByte(h, true);
    decl String:xStR[128];
    Format(xStR, sizeof(xStR), "\x01\x04[Карта]\x05 Карта измениться на\x03 %s \x05в начале раунда", map);
    BfWriteString(h, xStR);
    EndMessage();
    }
   }
   g_RTVEnded = true;
  }
}


Кое что получилось..... После голсования карта меняется как начинается новый раунд, но после смены карта сразу же меняется ... Т.е карта тупо меняется как только подключается первый пользователь как можно заблокировать смену карты?? В общем нужно чтоб плагин выключался после меня карты а не бакапорил и менял карту сразу же неуспев подключиться)))
 
_wS_ Дата: Пятница, 02.03.2012, 15:47:35 | Сообщение # 14
Потому что происходит round_start и переменная go по прежнему равна 1..
 
Naykon Дата: Пятница, 02.03.2012, 16:32:05 | Сообщение # 15
Сообщений: 439
Репутация: -4 [ +/- ]
Точняк... добавил в раундстарт go = 0 и все ок.

Добавлено (02.03.2012, 16:32:05)
---------------------------------------------
А вот еще проблемка как можно записать если до окончания карты осталось 2 минуты то запустим голосование rtv.....?????

 
Форум » SourceMod >> CS:Source >> CSGO » Обсуждение » RTV
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: