AMX MOD X
Воскресенье, 19.05.2024, 02:30:24



Приветствую Вас Гость | RSS
[ Главная ] [ Работа с массивами - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Работа с массивами (создание и чтение)
Работа с массивами
HafnerДата: Вторник, 30.06.2009, 11:18:38 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
Всех приветствую, прошу помощи в следующем вопросе:
Имеем код из admin.sma , необходимо в NameData поместить всё из столбца "name", а в другой функции вывести всё содержимое массива
Code
  BlockedCount = 0

   new NameData[44]
   new qcolName = SQL_FieldNameToNum(query, "name")

   while (SQL_MoreResults(query))
   {
    SQL_ReadResult(query, qcolName, NameData, sizeof(NameData)-1);

    ++BlockedCount;

    SQL_NextRow(query)
   }
   
   SQL_FreeHandle(query)
   SQL_FreeHandle(sql)
   SQL_FreeHandle(info)

NameData я задал глобально, но почему-то выводит только одну строку (самую последнюю запись в таблице) :(

 
slogicДата: Вторник, 30.06.2009, 13:53:35 | Сообщение # 2
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
ты в цикле засовываешь в один и тот же массив значение поля name из очередной строки выборки, которую вернул запрос. либо тут же выводи (и забудь про массив), либо тебе придется использовать динамические массивы из 1.8.x.
 
HafnerДата: Вторник, 30.06.2009, 13:57:04 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
slogic, спасибо, а где можно почитать про динамические массивы? Вариант с выводом в цикле никак не подходит...
 
slogicДата: Вторник, 30.06.2009, 14:18:03 | Сообщение # 4
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Просмотрел cellarray.inc, навреное примерно вот так:

new Array:arr = ArrayCreate(44)

// в цикле...
ArrayPushString(arr, sizeof(NameData)-1)

// чтение...
ArrayGetString(arr, index, sTemp, sizeof(sTemp) - 1)

Я ими не пользовался, так что от чего отсчитываются элементы (от 0 или 1) сам определи.

 
HafnerДата: Вторник, 30.06.2009, 16:55:01 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
slogic, благодарю!

Сделал так:

Code
new Array:arr

public plugin_init()
{
              arr = ArrayCreate(44)
}

public players_blocked()
{
   new table[32], error[128], type[12], errno
     
   new Handle:info = SQL_MakeStdTuple()
   new Handle:sql = SQL_Connect(info, errno, error, 127)
     
   get_cvar_string("amx_sql_blocked", table, 31)
     
   SQL_GetAffinity(type, 11)
     
   if (sql == Empty_Handle)
   {
    server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error)
    return PLUGIN_HANDLED
   }

   new Handle:query
     
   if (equali(type, "sqlite"))
   {
    if (!sqlite_TableExists(sql, table))
    {
     SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( name TEXT NOT NULL DEFAULT '' )", table)
    }

    query = SQL_PrepareQuery(sql, "SELECT name FROM %s", table)
   } else {
    SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( `id` int(11) NOT NULL auto_increment, `name` varchar(32) NOT NULL default '' )", table)
    query = SQL_PrepareQuery(sql,"SELECT `name` FROM `%s`", table)
   }

   if (!SQL_Execute(query))
   {
    SQL_QueryError(query, error, 127)
    server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_BLOCKED", error)
   } else if (!SQL_NumResults(query)) {
    server_print("[AMXX] %L", LANG_SERVER, "NO_BLOCKED")
   } else {
    BlockedCount = 0
      
    new qcolName = SQL_FieldNameToNum(query, "name")

    while (SQL_MoreResults(query))
    {
     SQL_ReadResult(query, qcolName, NameData, sizeof(NameData)-1);
     ArrayPushString(arr, NameData)

     ++BlockedCount;

     SQL_NextRow(query)
    }
    
   
    SQL_FreeHandle(query)
    SQL_FreeHandle(sql)
    SQL_FreeHandle(info)
   }
     
   return PLUGIN_HANDLED
}

Далее вывожу, допустим:

Code

new buff[44];
          for (new ib=0; ib<10; ib++)
   {
                 ArrayGetString(arr, ib, buff, sizeof(buff)-1);
      server_print("%s",buff)
              }

Всё норм выводится, остается последний вопрос, как можно посчитать количество значений в массиве, дабы использовать в последнем цикле?

Сообщение отредактировал Hafner - Вторник, 30.06.2009, 16:55:52
 
PomanoBДата: Вторник, 30.06.2009, 16:59:51 | Сообщение # 6
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
new size = ArraySize(arr)

http://romanov4400.mybrute.com
 
KokaДата: Вторник, 30.06.2009, 20:32:35 | Сообщение # 7
Полковник
Группа: Пользователи
Сообщений: 169
Репутация: 1
Статус: Не в сети
вместо этого
Code
new buff[44];
            for (new ib=0; ib<10; ib++)
     {
                   ArrayGetString(arr, ib, buff, sizeof(buff)-1);
        server_print("%s",buff)
                }

можно так

Code

            for (new ib=0; ib<10; ib++)
     {
        server_print("%a",ArrayGetStringHandle(arr, ib))
                }

http://amxmodx.ucoz.ru/forum/12-3028-1


стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...

Сообщение отредактировал Koka - Вторник, 30.06.2009, 20:33:06
 
HafnerДата: Четверг, 02.07.2009, 19:25:25 | Сообщение # 8
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
Спасибо всем!

Доработал плагин до смены ника игрокам, у которых ник совпадает с указанным в таблице:

Code
  
         new buff[44]
         new sizeData = ArraySize(arr)
         for (new ib=0; ib<sizeData; ib++)
         {
                       ArrayGetString(arr, ib, buff, sizeof(buff)-1);

                if (equali(username,buff))
                       {
                           client_cmd(id, "setinfo name ^"%s^"", "ChangeNICK")
                           set_user_info(id, "name", "ChangeNICK")
                           break
             }                     
         }

Но возникла проблема, смена ника срабатывает только со второго раза и её легко можно обойти, то есть:
- нажимаю в игре дисконнект, в консоли пишу "name Admin", спокойно захожу на сервер с, по идее, заблокированным ником.
- если снова нажать на дисконнект и заного зайти на сервер без смены ника, то ник меняется плагином.

Прошу помочь, хотя бы где копать?

Добавлено (2009-07-02, 7:25 Pm)
---------------------------------------------
Идей нет никаких?

Тогда вопрос, достаточно ли с помощью client_cmd сменить ник у определенного игрока?

 
PAHANCSДата: Пятница, 03.07.2009, 03:17:18 | Сообщение # 9
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Quote (Hafner)
возникла проблема, смена ника срабатывает только со второго раза и её легко можно обойти

Правда я незнаю откудо взялась переменная "arr" и "ChangeNICK" сам подставиш, опробуй это:

Code

public client_infochanged(id) {
  new data0[32], data1[32]
  read_argv(0, data0 31)
  read_argv(1, data1, 31)
  if(equali(data0, "setinfo") && equali(data1, "name")) {
   new buff[44], data2[32]
   new sizeData = ArraySize(arr)
   read_argv(2, data2, 31)
   for(new ib=0; ib<sizeData; ib++) {
    ArrayGetString(arr, ib, buff, sizeof(buff)-1)
    if(equali(data2, buff)) {
     client_cmd(id, "setinfo name ^"%s^"", "ChangeNICK")
     set_user_info(id, "name", "ChangeNICK")      // я думаю это необязательно, предыдущая команда выполняет всё нужное.
     break
    }
   }
  }
  return PLUGIN_CONTINUE
}



PAHANCS
 
HafnerДата: Среда, 29.07.2009, 17:01:15 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
PAHANCS, спс за идею, проблему решил, ник меняется отлично и ВСЕГДА, если совпадает с указанным в таблице, НО теперь есть другая трабла...
Писал в этой теме http://amxmodx.ucoz.ru/forum/16-3189-1 , но там обсуждалась совсем другая проблема, поэтому все как-то проигнорили.

Вобщем проблема в следующем - после смены строчки:

Code
get_user_info(id, "name", newname, 31)

на:
Code
get_user_info(id, "[color=red]setinfo[/color] name", newname, 31)

в функции client_infochanged:
Code
public client_infochanged(id)
{
  if (!is_user_connected(id) || !get_pcvar_num(amx_mode))
  {
   return PLUGIN_CONTINUE
  }

  new newname[32], oldname[32]
   
  get_user_name(id, oldname, 31)
  get_user_info(id, "setinfo name", newname, 31)

  if (g_CaseSensitiveName[id])  
  {  
   if (!equal(newname, oldname))  
   {  
    accessUser(id, newname)  
   }  
  }  
  else  
  {  
  if (!equali(newname, oldname))
  {
   accessUser(id, newname)
  }
  }
  return PLUGIN_CONTINUE
}

у меня в консоле клиента при соединении с сервером дублируются сообщения:

Code
Connecting to 127.0.0.1:27015...
Connection accepted by 127.0.0.1:27015
* Privileges set  

BUILD 4554 SERVER (0 CRC)
Server # 476
Player connected
* Privileges set  
* Privileges set  
Player is joining the Counter-Terrorist force
Scoring will not start until both teams have players
* Privileges set

В принципе всё работает, но этот спам напрягает и мне кажется, что тут где-то ошибка.
Очень прошу глянуть и подсказать, это нормально или нет, а если так типа и должно быть, то как избавиться от спама в консоль - тупо удалить строчку:

Code
client_cmd(id, "echo ^"* %L^"", id, "PRIV_SET")

?????

P.S. если нужен полный код плагина, то я выкладывал его в теме указанной выше.

 
PAHANCSДата: Среда, 29.07.2009, 19:01:40 | Сообщение # 11
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Quote (Hafner)
get_user_info(id, "setinfo name", newname, 31)

Нет такой инфы у клиента "setinfo name", этим способом устанавливается,
к примеру client_cmd(id, "setinfo name ^"%s^"", "ChangeNICK"), за место
этого надо просто "name" :

get_user_info(id, "name", newname, 31)

так что ты зря менял эту строчку, скорей всего из-за неё и дублирует.


PAHANCS
 
HafnerДата: Среда, 29.07.2009, 19:31:44 | Сообщение # 12
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
Quote (PAHANCS)
так что ты зря менял эту строчку, скорей всего из-за неё и дублирует.

Так если в той строчке оставить name, то ник меняется со второго раза и обходится свободно.

 
PAHANCSДата: Среда, 29.07.2009, 19:38:25 | Сообщение # 13
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Quote (Hafner)

Так если в той строчке оставить name, то ник меняется со второго раза и обходится свободно

Я уже запутался что тебе надо, если тебе надо установить то надо с помощью этого:

set_user_info(id, "name", "ChangeNICK")


PAHANCS
 
PAHANCSДата: Среда, 29.07.2009, 20:03:07 | Сообщение # 14
Полковник
Группа: Пользователи
Сообщений: 183
Репутация: 4
Статус: Не в сети
Ни чего не изменяя просто замени свою функцию на мою и попробуй:
Прикрепления: ClChInf.sma (0.6 Kb)


PAHANCS

Сообщение отредактировал PAHANCS - Среда, 29.07.2009, 20:05:14
 
HafnerДата: Среда, 29.07.2009, 22:38:47 | Сообщение # 15
Лейтенант
Группа: Пользователи
Сообщений: 46
Репутация: 0
Статус: Не в сети
Этот код убирает дубли в консоле, но и со старым этого тоже не было.
Мне же нужно, чтобы НЕ БЫЛО спама в консоле и чтобы ВСЕГДА переименовывались ники из базы =/
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Работа с массивами (создание и чтение)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

AMX Mod X Russian Community © 2006-2024