Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

При подключении игроку с флагом ADMIN_LEVEL_G не выдаётся VIP префикс

, index out of bounds и неправильная выдача префикса для VIP
Статус пользователя mcrc
сообщение 1.8.2014, 4:42
Сообщение #1


Стаж: 12 лет

Сообщений: 70
Благодарностей: 6
Полезность: 70

Всем привет!
Есть плагин, который при подключении/отключении игрока пишет из какого он города.
Хочу ещё подкрутить, чтобы для игрока обладающего флагом доступа ADMIN_LEVEL_G в нотификации добавлялся префикс VIP.
Вроде написал правильно, но VIP пишет только, когда игрок отключается. При подключении, почему-то, не срабатывает.
Помогите поправить!

Ещё в логе вот такая ошибка стала появляться:
Код
L 07/31/2014 - 18:52:45: [AMXX] Run time error 4: index out of bounds
L 07/31/2014 - 18:52:45: [AMXX]    [0] colorchat.inc::ColorChat (line 70)
L 07/31/2014 - 18:52:45: [AMXX]    [1] sypex_geo.sma::client_disconnect (line 62)


Код плагина
Код:
#include <amxmodx>
#include <sypexgeo>
#include <colorchat>

enum _data
{
_ip[16],
_name[64],
_city[64],
_cc2iso[3],
_country[32],
_region[64]
}

new data[_data];


public client_connect(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return;

get_user_ip(id,data[_ip],15,1);
get_user_name(id,data[_name],63);

sxgeo_data(data[_ip],data[_city],63,data[_country],63,data[_region],63,data[_cc2
iso],2);


/*
* Заходит игрок Player - 89.67.32.89 [RU] Москва.
* if( equal(data[_city], "error") )
data[_city] = "****";
* data[_name] Имя игрока.
* data[_ip] IP Адрес.
* data[_country] Страна.
* data[_city] Город.
* data[_region] Регион.
* data[_cc2iso] Двухзначный код страны.
*/

if( get_user_flags(id) & ADMIN_LEVEL_G ) {
ColorChat(0,TEAM_COLOR,"* ^01Пришёл VIP ^3%s^1 - ^04%s",data[_name],data[_city]);
} else {
ColorChat(0,TEAM_COLOR,"* ^01Пришёл ^3%s^1 - ^04%s",data[_name],data[_city]);
}

}

public client_disconnect(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return;

get_user_ip(id,data[_ip],15,1);
get_user_name(id,data[_name],63);

sxgeo_data(data[_ip],data[_city],63,data[_country],63,data[_region],63,data[_cc2
iso],2);

if( get_user_flags(id) & ADMIN_LEVEL_G ) {
ColorChat(0,RED,"^3* Отключился VIP ^4%s^3 - %s",data[_name],data[_city]);
} else {
ColorChat(0,RED,"^3* Отключился ^4%s^3 - %s",data[_name],data[_city]);
}

}

Colorchat.inc
Код:
/* Fun functions
*
* by Numb
*
* This file is provided as is (no warranties).
*/


enum Color
{
NORMAL = 1, // clients scr_concolor cvar color
GREEN, // Green Color
TEAM_COLOR, // Red, grey, blue
GREY, // grey
RED, // Red
BLUE, // Blue
}

new TeamName[][] =
{
"",
"TERRORIST",
"CT",
"SPECTATOR"
}

ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...)
{
static message[256];

switch(type)
{
case NORMAL: // clients scr_concolor cvar color
{
message[0] = 0x01;
}
case GREEN: // Green
{
message[0] = 0x04;
}
default: // White, Red, Blue
{
message[0] = 0x03;
}
}

vformat(message[1], 251, msg, 4);

// Make sure message is not longer than 192 character. Will crash the server.
message[192] = '^0';

static team, ColorChange, index, MSG_Type;

if(id)
{
MSG_Type = MSG_ONE;
index = id;
} else {
index = FindPlayer();
MSG_Type = MSG_ALL;
}

team = get_user_team(index);
ColorChange = ColorSelection(index, MSG_Type, type);

ShowColorMessage(index, MSG_Type, message);

if(ColorChange)
{
Team_Info(index, MSG_Type, TeamName[team]);
}
}

ShowColorMessage(id, type, message[])
{
message_begin(type, get_user_msgid("SayText"), _, id);
write_byte(id)
write_string(message);
message_end();
}

Team_Info(id, type, team[])
{
message_begin(type, get_user_msgid("TeamInfo"), _, id);
write_byte(id);
write_string(team);
message_end();

return 1;
}

ColorSelection(index, type, Color:Type)
{
switch(Type)
{
case RED:
{
return Team_Info(index, type, TeamName[1]);
}
case BLUE:
{
return Team_Info(index, type, TeamName[2]);
}
case GREY:
{
return Team_Info(index, type, TeamName[0]);
}
}

return 0;
}

FindPlayer()
{
static i;
i = -1;

while(i <= get_maxplayers())
{
if(is_user_connected(++i))
{
return i;
}
}

return -1;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Legenda
сообщение 1.8.2014, 10:35
Сообщение #2


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

public client_connect(id)

на

public client_putinserver(id)

ЕМНИП в client_connect нельзя проверить флаги игрока...
ps sypexgeo очевидно самим найти?
а вообще все geoip очень кривые...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя usercn
сообщение 1.8.2014, 10:43
Сообщение #3


Стаж: 12 лет

Сообщений: 341
Благодарностей: 140
Полезность: 495

Из какой базы берутся названия городов?
Можно ли дополнить плагин, чтобы при написании в чат say /whois выпадало МОТD-окно со списком игроков:
1. Ник1 Украина Киев
2. Ник2 Польша Варшава
3. Ник3 Россия Курск
и т.д.


Просунутий сервер з максимумом зброї, можливо старійший в Україні
[UA] DNET CS Public Server #1
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 1.8.2014, 10:45
Сообщение #4


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

Цитата(usercn @ 1.8.2014, 12:43) *
Из какой базы берутся названия городов?
Можно ли дополнить плагин, чтобы при написании в чат say /whois выпадало МОТD-окно со списком игроков:
1. Ник1 Украина Киев
2. Ник2 Польша Варшава
3. Ник3 Россия Курск
и т.д.

из той базы, которую укажешь
но обычны старые и халявные базы используются, с такими же кривыми скриптами

конечно можно, за отдельную плату или попроси кого-либо бесплатно сделать...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mcrc
сообщение 3.8.2014, 6:11
Сообщение #5


Стаж: 12 лет

Сообщений: 70
Благодарностей: 6
Полезность: 70

Цитата
public client_connect(id)

на

public client_putinserver(id)

Спасибо! Вот это сработало

Цитата
а вообще все geoip очень кривые...

Точно)
У меня ещё один вопрос. Иногда игрок приходит из города, который, видимо, не знаком плагину.
И вместо названия города возвращается error или пустое значение.
Попытался его отловить:
Код:
   if( equal(data[_city], "error") ) 
data[_city] = "****";

но мне компилятор ошибку пишет:
Код
F:\cs\amx_plugins\_Compiler amxmodx 1.8.3\sypex_geo.sma(29) : error 047: arra
y sizes do not match, or destination array is too small

Пытался менять размерность для _city[64] до [1000], но всё равно не помогает.
Подскажите, как это поправить?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя tyne
сообщение 3.8.2014, 7:27
Сообщение #6


Стаж: 13 лет

Сообщений: 544
Благодарностей: 137
Полезность: 91

Цитата(mcrc @ 3.8.2014, 7:11) *
Точно)
У меня ещё один вопрос. Иногда игрок приходит из города, который, видимо, не знаком плагину.
И вместо названия города возвращается error или пустое значение.
Попытался его отловить:
Код:
   if( equal(data[_city], "error") ) 
data[_city] = "****";

но мне компилятор ошибку пишет:
Код
F:\cs\amx_plugins\_Compiler amxmodx 1.8.3\sypex_geo.sma(29) : error 047: arra
y sizes do not match, or destination array is too small

Пытался менять размерность для _city[64] до [1000], но всё равно не помогает.
Подскажите, как это поправить?


Мб с гео что-то не так?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mcrc
сообщение 3.8.2014, 9:06
Сообщение #7


Стаж: 12 лет

Сообщений: 70
Благодарностей: 6
Полезность: 70

Вот sypexgeo инклуд (может поможет):
sypexgeo.inc
Код:
#if defined _sypexgeo_included
#endinput
#endif

#define _sypexgeo_included

/**
*
* @output Город
* @example Москва
*/
native sxgeo_city(const ip[],const city[],city_len);

/**
*
* @output Страна | ISO-3166
* @example Россия | RU
* @
*/
native sxgeo_country(const ip[],const country[],country_len,const cc2iso[],cc2iso_len);

/**
*
* @output Город | Страна | Регион | ISO-3166
* @example Лыткарино | Россия | Московская область | RU
*/
native sxgeo_data(const ip[],const city[],city_len,const country[],country_len,const region_name[],region_len,const cc2iso[],cc2iso_len);

Цитата
Мб с гео что-то не так?

Что имеете ввиду?
В любом случае, в коде плагина мы же можем настроить вывод какой угодно информации

Отредактировал: mcrc, - 3.8.2014, 9:06
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 3.8.2014, 10:26
Сообщение #8


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

1. компилятор все правильно пишет
потому что ты какой-то бред сравниваешь...
equal сравнивает строки, а не фрукты с книгами
2. sypex_geo.sma
еще раз
sypexgeo.inc и sypex_geo.sma совершенно различные вещи
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mcrc
сообщение 3.8.2014, 10:55
Сообщение #9


Стаж: 12 лет

Сообщений: 70
Благодарностей: 6
Полезность: 70

Цитата(Legenda @ 3.8.2014, 15:26) *
1. компилятор все правильно пишет
потому что ты какой-то бред сравниваешь...
equal сравнивает строки, а не фрукты с книгами

Не спорю, я в программировании не силён.
Хочется, чтобы вместо error и пустого значения выводились хотя бы ***
Сможете помочь реализовать такой функционал?

Цитата
2. sypex_geo.sma
еще раз
sypexgeo.inc и sypex_geo.sma совершенно различные вещи

Да, я понимаю.
В первом посте я выложил содержимое sma, про соответствующий inc забыл и выложил только сейчас.
Или что-то ещё требуется?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: