AMX MOD X
Среда, 24.04.2024, 06:07:23



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

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

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Плагин KZ-Дуэль - статистика (Нужно придумать алгоритм, подробности в нутри)
Плагин KZ-Дуэль - статистика
tavotДата: Понедельник, 25.01.2010, 12:50:24 | Сообщение # 1
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Отступление для администрации:
Собственно пишу в этом разделе, так как "логичных" людей и здравых голов тут много, да и по походу выполнения задачи могут быть вопросы. Знаю что нарушаю кучу правил и по этому заранее изменяюсь ).

Собственно по теме:
Я пишу плагин Дуэль для КЗ сервера. Плагин уже в бета тестировании, но игрокам очень важно в последствии похвастаться своими результатам дуэлей, и было решено написать статистику, от куда сразу возник вопрос:
Как же учитывать результаты?
Учитывать все результаты - выводить их при помощи сортировки по нику или карте
тут более мене все просто, но помозговав с одним заядлым Джампером, но еще предложил сделать топ 15 дуэлянтов
тут тоже просто - лучший - у кого больше выигранных дуелей ( если не брать качество дуэлей )
И еще один вариант - топ 15 дуэлей для каждой карты свой, но как тогда оценивать качество дуэли?

В результатах дуэлей - следующие данные:

Code

Nick       Время        checkp  weapons   
omfg    03:27.642    43          usp

для обоих дуэлянтов, а так же на какое время обогнал победитель...

У кого какие мысли есть?
Мне интересно мнение как с точки зрения построения самой статистики, а так же с точки зрения нагрузок от каких либо вариантов ее исполнения.

 
PomanoBДата: Вторник, 26.01.2010, 13:47:21 | Сообщение # 2
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Подсчитать общее количество можно с помощью COUNT () ... GROUP BY

http://romanov4400.mybrute.com
 
ZefirДата: Вторник, 26.01.2010, 14:20:03 | Сообщение # 3
Майор
Группа: Пользователи
Сообщений: 83
Репутация: 5
Статус: Не в сети
PomanoB, правильно пишет, лучше всю нагрузку возложить на SQL, и желательно на другую машину, чтоб самому серваку не мешала.
По поводу организации, вариантов исполнения много. У тебя мод один, и есть победитель на каждой мапе. Можешь брать среднее время каждого участника и делить на количество побед, у кого самое маленькое значение тот и победил. То есть ( SUM(time_of_map) / COUNT(of_map) ) / COUNT(wins_of_map).

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


Чтобы правильно задать вопрос, нужно знать больше половины ответа...
Cerberus(Цербер) - начато публичное тестирование
Энциклопедия Counter-Strike


Сообщение отредактировал Zefir - Вторник, 26.01.2010, 14:21:27
 
tavotДата: Вторник, 23.02.2010, 01:16:46 | Сообщение # 4
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Спасибо за мнения и идеи ) буду пробовать, натолкнуло на определенные мысли )

Добавлено (16.02.2010, 02:25:51)
---------------------------------------------
Нужна помощь, ни как не могу разобраться вот в этом:

Code
  
// Thanks connor <img rel="usm" src="http://amxmodx.ucoz.ru/Smiles/biggrin.gif" border="0" align="absmiddle" alt=":D">
iMin = floatround(tiempo, floatround_floor)/60;  
iSec = tiempo - (60*iMin);
   
formatex(msgconvert[1], 31, "%02d:%s%.5f", iMin, iSec < 10 ? "0": "", iSec)

Результат выглядит вот так:
[Kz-Arg] NpGp finish in 00:08.25726 (0 GoCheck, Weapon: usp...)

Если же сделать вот так:
client_print(id,print_chat,"min: %d , sec: %d",iMin[id],iSec[id])

То получается вот что:
min: 0 , sec: 1090788806

Хочется все таки понять как это дело высчитывается..
вот оригинальный плагин ( ссылка)
https://forums.alliedmods.net/showthread.php?t=81692&highlight=kz_arg

или же в такой записи, запихнуть в этот запрос:

Code
new Handle:query = SQL_PrepareQuery(g_h_Sql_Connect,"INSERT INTO `kz_duel` (`W_name`,`L_name`,`W_time`,`L_time`,`R_time`,`map`) VALUES ('%s','%s','%d','%d','%d','%s')", name3,name,W_time[id],L_time[id],R_time[id],g_mapname)

запихнуть нужно соответственно в место W_time/
думается остальное по аналогии сделаю, просто у самого не получилось..

Добавлено (16.02.2010, 02:29:48)
---------------------------------------------
Вот что еще, объясните пожалуйста:
%s%.5f
%s - что это?
%.5f - это я так понимаю после точки (дробь) т.е. 0.12345 , если поставим %.4f - то будет 0,1234

Добавлено (16.02.2010, 02:47:10)
---------------------------------------------
Кажется разобрался )
так всегда, попросишь помощи и ответ на тебя сам находит :)
видать когда пытаешься составить вопрос - находишь и ответ, не даром говориться - в хорошем вопросе, уже есть половина ответа )

Но все равно хочу услышать объяснения по поводу %02d:%s%.5f

Добавлено (18.02.2010, 15:28:29)
---------------------------------------------
Ну вот, и дошло дело до хоть каких то результатов:
http://izlapzla.ru/jump/duel
Это бета тестрование плагина для выявления багов и сбора небольшой статистики для разработки самого топ15 дуэлей, а не просто списка как сейчас.

Особую благодарность хочу выразить:
PomanoB, за помощь в темах:
http://amxmodx.ucoz.ru/forum/9-3678-1
http://amxmodx.ucoz.ru/forum/9-3686-1
http://amxmodx.ucoz.ru/forum/9-3693-1
И особенно в http://amxmodx.ucoz.ru/forum/9-3662-1
+ за помощь по ICQ.

А так же: DaTa, ZETA, Zefir, И само собой все сообщество amxmodx.ucoz.ru

Добавлено (23.02.2010, 01:16:46)
---------------------------------------------
Вопрос появился:
Ни кто не знает как можно запретить нажатие кнопки старт? но при этом финишную кнопку нажимать можно )

 
ZETAДата: Вторник, 23.02.2010, 12:23:57 | Сообщение # 5
Генерал-майор
Группа: Скриптеры
Сообщений: 369
Репутация: 21
Статус: Не в сети
Quote (tavot)
Ни кто не знает как можно запретить нажатие кнопки старт? но при этом финишную кнопку нажимать можно )

Я в этом не шарю :D но вот вроде вырвал из Prokreedz



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

Сообщение отредактировал ZETA - Вторник, 23.02.2010, 23:38:01
 
PomanoBДата: Вторник, 23.02.2010, 12:43:03 | Сообщение # 6
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Надо блокировать Ham_Use если кнопка это кнопка старта, узнать это можно по имени кнопки

http://romanov4400.mybrute.com
 
tavotДата: Среда, 24.02.2010, 01:09:10 | Сообщение # 7
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
ZETA, PomanoB,
спасибо, есть поле для изучения, по окончанию отпишусь )
P/s/ с праздником всех )

Добавлено (24.02.2010, 00:59:25)
---------------------------------------------
PomanoB,

Code

public fwdUse(ent, id)
{
   
  new target[33]
  pev( ent, pev_target, target, sizeof target - 1 )
   
  if( equali( target, "counter_start" ) || equali( target, "clockstartbutton" ) || equali( target, "firsttimerelay" ) )
  {
   ColorChat(id,RED,"ETO KTOPKA START")
  }
  else if( equali( target, "counter_off" ) || equali( target, "clockstopbutton" ) || equali( target, "clockstop" ) )
  {
   ColorChat(id,GREY,"ETO KTOPKA FINSIH")
  }
   
  return FMRES_IGNORED;
}

Тут получается мы знаем на какую кнопку нажал игрок, но как сделать блок?
На сколько я понимаю - кнопка то уже нажалась и мы определили какая..
А надо что бы не передавалась головному плагину это событие когда человек находится в дуэли.

Добавлено (24.02.2010, 01:09:10)
---------------------------------------------
Пробовал return PLUGIN_HANDLED
не получилось (

 
PomanoBДата: Среда, 24.02.2010, 18:02:59 | Сообщение # 8
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Надо return FMRES_SUPERCEDE и причём ставить его выше основного плагина

http://romanov4400.mybrute.com
 
tavotДата: Четверг, 25.02.2010, 01:11:40 | Сообщение # 9
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
PomanoB,
Спасибо сейчас попробую.
А то вчера полез в основной плагин снова, и там сделал то что нужно.
Но думается что лучше будет если это в моем плагине будет.

Не натыкался ли на толковый ФАК по hamsandwich ?
описание функций я нашел, но этого явно мало, да и к тмоу же там только описание что делает, а как использовать и что от чего нет.

Добавлено (25.02.2010, 00:36:18)
---------------------------------------------
Добавил return FMRES_SUPERCEDE
все равно проходит команда.
Плагин разумеется стоит выше по списку.

Добавлено (25.02.2010, 00:57:49)
---------------------------------------------
В основном плагине сделал вот такую конструкцию:

Code
  if(g_playerduel[id] == false){
    // Save Player Start Position
    g_playerwithstart[id] = true;
    pev(id, pev_origin, g_playerstartposition[id])
    g_player_prelastcp[id] = g_playerstartposition[id]
        
    // Start Player climbing
    start_climb(id)
         
    // Default Start for Players
    if( !g_is_defaultstart )
    {
     new mapname[64]
     get_mapname( mapname, 63)
     kz_set_start_origin(mapname, g_playerstartposition[id])
    }
   }else{
    client_print(id, print_chat, "Time is already start")
     
   }

Выдает предупреждение: Warning: Tag mismatch on line 1119
Вот строка №1119 - if(g_playerduel[id] == false){
Но при этом все работает как надо.
Ни как не могу понять из за чего...

Добавлено (25.02.2010, 01:11:40)
---------------------------------------------
Заменил строку на:
if(!g_playerduel[id])
И предупреждение исчезло.
в чем причина предупреждения? форма записи устаревшая илил подводные камни?

 
PomanoBДата: Четверг, 25.02.2010, 09:53:39 | Сообщение # 10
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Quote (tavot)
все равно проходит команда

Возможно у тебя зарегистрирована ПОСТ версия, в то время как основной плагин использует ПРЕ версию Ham_Use, посмотри стоит ли 1 последним параметром в RegisterHam(), если стоит это пост, если нет то пре

Quote (tavot)
в чем причина предупреждения?

Причина в том, что ты сравниваешь тип "целове число" с типом "булево значение"
Значение false будет всегда 0, но значение true не обязательно будет 1, это любое отличное от 0, поэтому и возникает предупреждение


http://romanov4400.mybrute.com
 
tavotДата: Суббота, 06.03.2010, 12:20:54 | Сообщение # 11
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Добрался до написания вывода топ15 дуэлей не сервере.
и тут же столкнулся с проблемой, так как инглийский мой ужазстный. самому сложно разобраться с Float
Суть проблемы:
Есть данные в колонке W_time вида 54.546 - это в секундах.
Есть запрос который захватывает все данные, НО
если вывожу при помощи %d %f %.5f - это охинея.
Пробовал выводить при помощи %s - выводится, но как текст, а мне еще предстоит выделить минуты, секунды и доли секунд.
Т.е. Пример:
из таблицы приходят данные: 192.755 - целое число выводим 192.755/60 ( отбрасывая дробь), далее секунды 192.755 - 6*3(3 получили в прошлом действии)
Преобразуем и получаем: 03:12.755

Вот такая вот проблема. думал сделать как текст, потом при образовывать в цифры и тд, но подумал что это не правильно и решил обратиться в очередной раз за помощью )

Добавлено (28.02.2010, 15:54:59)
---------------------------------------------
Проблема решена.

Добавлено (06.03.2010, 12:17:36)
---------------------------------------------
Проблема:
Ни как не могу сделать ранк ( 1 2 3 ч 5 6 ... 15 место) в выводе рекордов
вот код:

На php странице сделал I++ и все ок, а если делаю тут - то нумерация начинается в обратную сторону
т.е 15 14 ... 2 1

В чем проблема?
if else и 2 запрсоа - это я тестировал разные способы. в оригинале естественно один запрос )

Добавлено (06.03.2010, 12:20:54)
---------------------------------------------
Вот такой вариант (i3+1) везде просто 1:

Code
   format(g_text, max_len, "<tr align=center%s><td>%d<td>%s<td>%s<td>%02d:%s%.3f<td>%02d:%s%.3f<td>%02d:%s%.3f%s", ((i%2)==0) ? " " : " bgcolor=#A4BED6",(i3+1),player1, player2, Wminutos, Wsegundos < 10 ? "0" : "", Wsegundos,Lminutos, Lsegundos < 10 ? "0" : "", Lsegundos,Rminutos, Rsegundos < 10 ? "0" : "", Rsegundos, g_text)

тоже не работает
 
PomanoBДата: Суббота, 06.03.2010, 13:13:28 | Сообщение # 12
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Сделай 16 - (i++)

http://romanov4400.mybrute.com
 
tavotДата: Суббота, 06.03.2010, 14:01:16 | Сообщение # 13
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
PomanoB, я тоже об этом подмал )
но что будет если строк меньше 15 ?

Code
12 результат
13 результат
14 результат
15 результат

Добавлено (06.03.2010, 14:01:16)
---------------------------------------------
Так что отпадает.

 
PomanoBДата: Суббота, 06.03.2010, 15:32:08 | Сообщение # 14
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Тогда надо изменить порядок сортировки в запросе и его формирование
Code
new g_text[5096]  
public stats(id){  
     
   //ColorChat(id,BLUE, "[Duel] Sorry, under construction")  
   //ColorChat(id,BLUE, "[Duel] Web stats: http://izlapzla.ru/jump/duel")  
     

   new player1[33],player2[33]  
   new Float:W_time  
   new Float:L_time  
   new Float:R_time  
   new max_len = charsmax(g_text)  
   new map[33]  
   get_mapname(map,90)  
     
   new i  
   new i2=16  
   new i3  
   new len  
     
   len = format(g_text, max_len, "<html><head><body bgcolor=#94AEC6><table width=100%% cellpadding=2 cellspacing=0 border=0><tr bgcolor=#52697B align=center><td>#<td>%s<td>%s<td>%s<td>%s<td>%s%s","Win","Loss", "Time Winner","Time Loser","Time Difference",g_text)  
     
     
   new Handle:query = SQL_PrepareQuery(g_h_Sql_Connect,"SELECT * FROM `kz_duel`  WHERE map='%s' ORDER BY `W_time` ASC LIMIT 15",map)  
   SQL_Execute(query)  
   while (SQL_MoreResults(query))  
   {  
    SQL_ReadResult(query,1, player1, 31)  
    SQL_ReadResult(query,2, player2, 31)  
    SQL_ReadResult(query,3, W_time)  
    SQL_ReadResult(query,4, L_time)  
    SQL_ReadResult(query,5, R_time)  
       
    new Wminutos, Float:Wsegundos  
    Wminutos = floatround(W_time, floatround_floor)/60  
    Wsegundos = W_time - (60*Wminutos)  
      
    new Lminutos, Float:Lsegundos  
    Lminutos = floatround(L_time, floatround_floor)/60  
    Lsegundos = L_time - (60*Lminutos)   
      
    new Rminutos, Float:Rsegundos  
    Rminutos = floatround(R_time, floatround_floor)/60  
    Rsegundos = R_time - (60*Rminutos)   
      
    i++  
     

   len += format(g_text[len], max_len - len, "<tr align=center%s><td>%d<td>%s<td>%s<td>%02d:%s%.3f<td>%02d:%s%.3f<td>%02d:%s%.3f%s", ((i%2)==0) ? " " : " bgcolor=#A4BED6",i,player1, player2, Wminutos, Wsegundos < 10 ? "0" : "", Wsegundos,Lminutos, Lsegundos < 10 ? "0" : "", Lsegundos,Rminutos, Rsegundos < 10 ? "0" : "", Rsegundos, g_text)  
    SQL_NextRow(query)  
    
      
   }   

   format(g_text[len], max_len - len, "</table></body></html>")  
     
   new header[80];  
   formatex(header, 79, " Duel Top15 ", id);  
   show_motd(id, g_text, header)  
   setc(g_text, max_len, 0)  

   return PLUGIN_HANDLED  
     
     
}

Как-то так


http://romanov4400.mybrute.com
 
tavotДата: Суббота, 06.03.2010, 18:49:42 | Сообщение # 15
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
PomanoB,
таким методом будет от 15 до первого места.
ка кто не логично выглядеть будет (
15 место
14 место
....
1 место
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Плагин KZ-Дуэль - статистика (Нужно придумать алгоритм, подробности в нутри)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

AMX Mod X Russian Community © 2006-2024