AMX MOD X
Суббота, 20.04.2024, 14:21:08



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

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

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Статистика к моду Предатор. (Разработка с 0. Вопросов много.)
Статистика к моду Предатор.
tavotДата: Среда, 21.10.2009, 13:54:15 | Сообщение # 1
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Плагин предатора использует события:
ResetHUD - при старте раунда проверяются нужные требования (фраги и деньги) что бы вызвать меню для выбора предатора
DeathMsg - вызывается функция "отнимания" предатора unpredator

На данный момент у меня работает плагин так:
1 соединение с базой
2 ResetHUD
3 если человек выбрал предатора - идет запись в базу
4 DeathMsg
5 если чел был предатором и умер идет запись в базу

Вопрос 1: не будет ли такой метод сильно загружать игровой сервер/сервер/базу sql и тд
Или же можно как то собирать эти события для каждого игрока и вносить их в базу только при client_disconnect, если можно, то как?

Вопрос 2:
Можно ли когда человек выберет if(key==0) передать другому плагину?
Или же когда он выбрал и уже стал предатором...

Code

       //---------------[PREDATOR CHOOSE]---------------
       public func_menu(id,key) // если открылось меню ( при опред. условиях) и он выбрал 1 - предатор, 2 - не предатор
       {
       if(key==0)
       {
        set_user_frags(id,get_user_frags(id)-get_cvar_num("admin_frags_predator"))
        cs_s et_us er_mo ney(i d,cs_ get_user_money(i d)-get_cvar_num("admin_money_predator"))
        ispredator[id]=1
        plasma[id]=get_cvar_num("admin_plasma_predator")
        set_user_health(id,200)
        cs_set_user_armor(id,500,CS_ARMOR_VESTHELM)
        set_user_ gra vit y(i d,0 .5)       
        set_user_rendering(id,kRenderFxGlowShell,0,0,0,kRenderTransAlpha,20)
        set_user_footsteps(id,1)
        cs_set_user_ mode l(id ,"pr edat or1")
        c lient_cmd(id,"spk predator/crpredator")
        set_hudmessage(0,30,200,-1.0,0.75,0,3.0,10.0,0.15,0.5,1)
        show_hudmessage(id,"You are now a forest predator")
        cs_set_user_nvg(id,1)
        new HUD[51]
        format(HUD,50,"You got %i Plasma shots left.",plasma[id])
        message_begin(MSG_ONE, msgtext, {0,0,0}, id)
        write_byte(0)
        write_string(HUD)
        message_end()
       }
       if(key==1)
       {
        if(get_cvar_num("admin _everyo ne_pred ator")= =0)
        {      
         d elay[id]=3
         set_hudmessage(0,30,200,-1.0,0.75,0,3.0,10.0,0.15,0.5,1)
         show_hudmessage(id,"You are NOT a predator. U will have to wait 3 rounds to be predator.")
        }
        if(get_cvar_num("admin_everyone_predator")!=0)
        {
         client_cmd(id,"kill")
         set_hudmessag e(0,3 0,200 ,-1.0 ,0.75 ,0,3. 0,10.0,0.15,0.5,1)
         show_hudmessage(id,"You have to be a predator so dont fool around.")
        }
       }
       }

В аттаче оригинальный мод.

В архве
predator.sma - оснвной мод
predator_test.sma - статистика
predator.inc

На данном этапе вывода статистике нету, только занесение данных в таблицу.
Прозьба к Знатокам, посмотрите код, может какие ошибки увидите, или как оптимизировать....

Прикрепления: predator.sma (71.1 Kb) · Predator_stats2.rar (27.1 Kb)


Сообщение отредактировал tavot - Понедельник, 26.10.2009, 18:55:03
 
PomanoBДата: Среда, 21.10.2009, 18:53:19 | Сообщение # 2
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
1. Можно запоминать в глобальных переменных, те тех которые объявлены вне всяких функций
2. нельзя без модификации кода самого плагина Predator


http://romanov4400.mybrute.com
 
tavotДата: Среда, 21.10.2009, 19:00:50 | Сообщение # 3
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
PomanoB,
1 то есть обявляем их
new CounterForPred
А как записать в них и считать? ( И как правильно это называется? )
можно подробнее или где почитать?
2 о каких конкретно модификациях идет речь? Так как автор уже 2 года не поддерживает плагин, не думаю что выйдет новая версия с пофиксенными багами и тд... придется самому все исправлять по тихоньку.
Мне кажется лучше внести изменения в мод и стату делать отдельным плагином
а) Не будет "лишнего" кода
б) Будет на много яснее где возникает ошибка
а+б = Нюбское облегчение своей жизни )
 
ZETAДата: Среда, 21.10.2009, 20:19:21 | Сообщение # 4
Генерал-майор
Группа: Скриптеры
Сообщений: 369
Репутация: 21
Статус: Не в сети
Quote (tavot)
Вопрос 1: не будет ли такой метод сильно загружать игровой сервер/сервер/базу sql и тд Или же можно как то собирать эти события для каждого игрока и вносить их в базу только при client_disconnect, если можно, то как?

Можно обновлять базу по окончании карты, все события пишутся в переменную/ые, а в конце карты уже все это дело посылается в бд, конце карты ловиться с помощью plugin_end...

Quote (tavot)
можно подробнее или где почитать?

Ну перво-наперво AMX Mod X Wiki статьи
А еще видел статью на AMX-X.RU. Сам не читал, но вроде написано неплохо...


Говори что думаешь и думай что говоришь...
 
tavotДата: Четверг, 22.10.2009, 16:31:10 | Сообщение # 5
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Quote (PomanoB)
1. Можно запоминать в глобальных переменных, те тех которые объявлены вне всяких функций

С этим я только что разобрался, спасибо за наводку, а так же Спасибо ZETA, за литературу, помогло )

Пока что решил в базу записывать при выходе игрока, не вижу особого смысла держать все данные до смены карты.

PomanoB,
Можно по подробнее о необходимых изменениях в основном плагине?

Добавлено (22.10.2009, 16:31:10)
---------------------------------------------
Что то я не доконца въехал:

Code

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"

public plugin_init() {
       register_plugin(PLUGIN, VERSION, AUTHOR)
       register_clcmd("say /test","functest")
       register_clcmd("say /rezult ","funrez")
       // Add your code here...
}

new test[33]= {0, ...}

public functest(id)
{
       test[id]=test[id] + 1
      }

public client_disconnect(id)
{
       server_print("test fun : %d :", test[id])
}

public funrez(id)
{
       client_print(id,print_chat,"Test fun : %d :",test[id])
}

И так команда say /test - введена 2 раза
Пишу say /rezult - получаю test fun : 2 : - вроди бы как все правильно
но это же сообщение получит и тот кто не разу не ввидил сообщение test
а так же при реконекте...

что то видимо я не допонимаю с массивами. илил с id ...

по моей логике ( как я понимаю)
test[id] -> test - массив, id - id игрока ( допустим #3 после рекконекта #4 )

Где я что то упустил или ошибаюсь?
Появилась идея:

Code

public client_disconnect(id)
{
server_print("test fun : %d :", test[id])
test[id]=0
}

С этим test[id]=0 делом - все как и задуманно, но вопрос к знатокам - правильно ли это?


Сообщение отредактировал tavot - Четверг, 22.10.2009, 16:46:32
 
PomanoBДата: Четверг, 22.10.2009, 17:15:33 | Сообщение # 6
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
http://forums.alliedmods.net/showthread.php?t=41241 - здесь написано про взаимодействие между плагинами, на ангдийском правда(
Quote (tavot)
вопрос к знатокам - правильно ли это?

Да, правильно


http://romanov4400.mybrute.com
 
ZETAДата: Четверг, 22.10.2009, 19:23:41 | Сообщение # 7
Генерал-майор
Группа: Скриптеры
Сообщений: 369
Репутация: 21
Статус: Не в сети
Quote (tavot)
Можно ли когда человек выберет if(key==0) передать другому плагину? Или же когда он выбрал и уже стал предатором...

Добавлены внешние функции...

Code

/* Возвращает, игрок хищник или нет  */
native get_user_predator(id)

/* Превращает игрока в хищника
id - индекс игрока
type - тип хищника
1 - зелёный хищник
2 - серый хищник
3 - красный хищник
4 - белый хищник */
native set_user_predator(id, type)

Прикрепления: PredatorMode.rar (61.8 Kb)


Говори что думаешь и думай что говоришь...

Сообщение отредактировал ZETA - Пятница, 23.10.2009, 11:59:57
 
tavotДата: Пятница, 23.10.2009, 11:55:14 | Сообщение # 8
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
ZETA,
Спасибо, работает на ура.

Код обращений к базе уже готов и работает ( правда еще не "красивый" ).
Теперь осталось придумать как сделать проверку:
1 стал ли человек предатором - используем get_user_predator - если 1 то записывам в массив +1
2 Но если предатор не умер, в следующем раунде будет вновь +1, а это не по задумке
Так как в задумке - сколько раз человек СТАЛ предатором, а не играл раундов.
В изночальной моей задумке +1 делалось когда игрок выберает какой либо класс ( один из 4 )

Вобщем пока что буду думать, и по примеру ZETA попробую остальные интересующие меня события передать другому плагину, т.е. моей статистике )

ZETA,
Не мог бы ты в основном файле добавить коментариев что к чему, в тобой добавленном коде, мне признатсья что то не допетрить (

Добавлено (23.10.2009, 11:55:14)
---------------------------------------------
Вобщем есть маленькая проблемка:
вот сделал для теса:

Code

public test(id)
{
  if(get_user_predator(id))
  {
  client_print(id,print_chat, " Pravda - predator " )
  }
  else
  {
  client_print(id,print_chat, " Ne pravda - Ne predator " )
  }
}

Думаю ошбитсья сдесь сложно,
так вот:
1 до выбора предатора - получаем правильный ответ
2 после выбора предатора - павильный
3 А вот после смерти предатора - ответ не правильный, т.е. в место 0 все вравно функция возвращает единицу.
Даже после смерти.


Сообщение отредактировал tavot - Пятница, 23.10.2009, 10:56:19
 
ZETAДата: Пятница, 23.10.2009, 12:01:19 | Сообщение # 9
Генерал-майор
Группа: Скриптеры
Сообщений: 369
Репутация: 21
Статус: Не в сети
Quote (tavot)
Думаю ошбитсья сдесь сложно, так вот: 1 до выбора предатора - получаем правильный ответ 2 после выбора предатора - павильный 3 А вот после смерти предатора - ответ не правильный, т.е. в место 0 все вравно функция возвращает единицу. Даже после смерти.

Поправил, насчет остального вечером напишу, обновил архив...


Говори что думаешь и думай что говоришь...
 
tavotДата: Пятница, 23.10.2009, 12:54:49 | Сообщение # 10
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Проблему решил:
Добавил в функцию unpredator
is_predator[id]=false

Oo. не обновлял форум, не видел предыущего поста ZETA, но сделали мы одно и тоже ) Спасибо )

Добавлено (23.10.2009, 12:54:49)
---------------------------------------------
Появился вопрос:
Почему при использовании:
register_logevent("eventRound_Start", 2, "1=Round_Start") - Код не работает
register_event("ResetHUD","startround","be") - работает

Code

new dbpred[33]
public startround или public eventRound_Start(id)
{
   if(get_user_predator(id))
   {
   dbpred[id]=dbpred[id] + 1;
   client_print(id,print_chat, " 1 predators is : %d :", dbpred[id])
   }
   else
   {
   client_print(id,print_chat, " 2 Else predators is : %d :", dbpred[id])
   }
}

Не получает от get_user_predator еденицу, только ноль.


Сообщение отредактировал tavot - Пятница, 23.10.2009, 13:04:19
 
PomanoBДата: Суббота, 24.10.2009, 10:47:08 | Сообщение # 11
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Потому что
register_logevent("eventRound_Start", 2, "1=Round_Start")
регистрирует глобальное событие, id игрока не передается, тк нет такого игрока, а
register_event("ResetHUD","startround","be")
регистрирует событие для игрока

Сделал также forward функцию, описание в inc файле

Прикрепления: PredatorMode.zip (11.9 Kb)


http://romanov4400.mybrute.com
 
tavotДата: Понедельник, 26.10.2009, 02:55:22 | Сообщение # 12
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
PomanoB,
Спасибо за пояснение, теперь допетрил ) чувствую надо иди искать инфу о событиях, что бы додумать алгоритм подсчета.

Сейчас с женушкой идем покупать ноут )
как приду погляжу на то что новую функцию )

Добавлено (25.10.2009, 14:45:20)
---------------------------------------------
PomanoB,
Посомтрел на твои изменения, все просто супер, так как мне и было нужно. работы сократилось сразу почти до нуля.
Сейчас попробую привести код в приличный вид. и попробую по аналогии сделать для остальных нужных мне событий такой же форвард )
А так уже плагин работает по следующему алгоритму:
1 Клиент авторизуется на сервере
а) Если он есть в базе - считываем его ранее заработанные очки
б) если нету - добавляем в базу
2 считаем во время игры его становления предатором и смерти
3 Записываем в базу.

Добавлено (26.10.2009, 00:29:52)
---------------------------------------------
На данный момент:
1 Ведется подсчет сколько раз и какого вида был игрок Хищником
2 Сколько раз пустил плазму
3 Сколько раз убил плазмой
4 Сколько раз убил с ножа
5 Сколько раз игрок ( человек) убил Хищника

Если кто о знает этот мод, ни чего я не забыл?

А пока что начинаю сводить подсчеты и запросы к базе в единое целое.

Добавлено (26.10.2009, 02:55:22)
---------------------------------------------
Вопрос 1:
При вот таком запросе:

Code
"INSERT INTO `stats` ( `name` , `pred` )VALUES( '%s', 0 )", s_Name )

Злоумышлинник не сможет сделать sql инъекцию или как там это называется?
Это безопасно?
Вопрос 2:
При таком запросе ники в которых есть кавычки ' - в базу не заносятся.


Сообщение отредактировал tavot - Понедельник, 26.10.2009, 03:24:25
 
PomanoBДата: Понедельник, 26.10.2009, 08:27:42 | Сообщение # 13
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Code

new unquoted_name[32]
get_user_name(id,unquoted_name,31)
SQL_QuoteString(g_SQL_Connection , g_UserName[id], 31, unquoted_name)

Так будет безопасно и с кавычками всё ок
g_SQL_Connection - результат функции SQL_Connect()


http://romanov4400.mybrute.com
 
tavotДата: Понедельник, 26.10.2009, 13:13:55 | Сообщение # 14
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
PomanoB,
Спасибо, все работает на отлично.
Обновил первый пост:
На данном этапе вывода статистике нету, только занесение данных в таблицу.
Прозьба к Знатокам, посмотрите код, может какие ошибки увидите, или как оптимизировать...архив в первом посте, это мой первый плагин, так что здравую критику с поясненями как делать лучше, буду с удовольствием выслушивать.

А пока что, приступаю к выводу статистики top15 для предатор мода.

 
ZETAДата: Понедельник, 26.10.2009, 15:47:49 | Сообщение # 15
Генерал-майор
Группа: Скриптеры
Сообщений: 369
Репутация: 21
Статус: Не в сети
1. Поправь граматику в predator.inc, чтобы слов "выстриле" и "хичника" не было :)
2. Ты везде написал мой ник с ошибкой ^_^ Не [M|A|N], а [M|E|N]. Это слово произошло не от слова man)
3. Собственно теперь по коду

Code

/* стал ли предатором и каким - Работает */
public user_predator(id,type)
{
   if(type==0){
   server_print("Iz human ")
   }
   if(type==1){
   pred[id]=pred[id]+1;   
   }
   if(type==2){
   pred[id]=pred[id]+1;
   }
   if(type==3){
   pred[id]=pred[id]+1;
   }
   if(type==4){
   pred[id]=pred[id]+1;
   }
}

В этой функции передается стал ли игрок хищником, но не указывается каким! Поэтому это функцию можно сократить...И к чему эта надпись Iz human?

Code

/* стал ли предатором и каким - Работает */
public user_predator(id,type)
{
     if(type==0){
      server_print("Iz human ")
     }
     else pred[id]++
}

И еще небольшое примечание, увеличение переменной на 1 можно писать вместо переменная=переменная+1 просто переменная++. Так компактней выглядит, да и практичней...

Например вместо plasmahit[id]=plasmahit[id]+1 просто plasmahit[id]++


Говори что думаешь и думай что говоришь...

Сообщение отредактировал ZETA - Понедельник, 26.10.2009, 16:05:29
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Статистика к моду Предатор. (Разработка с 0. Вопросов много.)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

AMX Mod X Russian Community © 2006-2024