|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
Статистика к моду Предатор.
|
|
tavot | Дата: Среда, 21.10.2009, 13:54:15 | Сообщение # 1 |
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
| Плагин предатора использует события: 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 На данном этапе вывода статистике нету, только занесение данных в таблицу. Прозьба к Знатокам, посмотрите код, может какие ошибки увидите, или как оптимизировать....
Сообщение отредактировал tavot - Понедельник, 26.10.2009, 18:55:03 |
|
| |
PomanoB | Дата: Среда, 21.10.2009, 18:53:19 | Сообщение # 2 |
![PomanoB](/avatar/66/872586.png) Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| 1. Можно запоминать в глобальных переменных, те тех которые объявлены вне всяких функций 2. нельзя без модификации кода самого плагина Predator
http://romanov4400.mybrute.com
|
|
| |
tavot | Дата: Среда, 21.10.2009, 19:00:50 | Сообщение # 3 |
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
| PomanoB, 1 то есть обявляем их new CounterForPred А как записать в них и считать? ( И как правильно это называется? ) можно подробнее или где почитать? 2 о каких конкретно модификациях идет речь? Так как автор уже 2 года не поддерживает плагин, не думаю что выйдет новая версия с пофиксенными багами и тд... придется самому все исправлять по тихоньку. Мне кажется лучше внести изменения в мод и стату делать отдельным плагином а) Не будет "лишнего" кода б) Будет на много яснее где возникает ошибка а+б = Нюбское облегчение своей жизни )
|
|
| |
ZETA | Дата: Среда, 21.10.2009, 20:19:21 | Сообщение # 4 |
![ZETA](/avatar/89/680832.gif) Генерал-майор
Группа: Скриптеры
Сообщений: 369
Статус: Не в сети
| 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
Статус: Не в сети
| 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 |
![PomanoB](/avatar/66/872586.png) Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| http://forums.alliedmods.net/showthread.php?t=41241 - здесь написано про взаимодействие между плагинами, на ангдийском правда( Quote (tavot) вопрос к знатокам - правильно ли это? Да, правильно
http://romanov4400.mybrute.com
|
|
| |
ZETA | Дата: Четверг, 22.10.2009, 19:23:41 | Сообщение # 7 |
![ZETA](/avatar/89/680832.gif) Генерал-майор
Группа: Скриптеры
Сообщений: 369
Статус: Не в сети
| Quote (tavot) Можно ли когда человек выберет if(key==0) передать другому плагину? Или же когда он выбрал и уже стал предатором... Добавлены внешние функции... Code /* Возвращает, игрок хищник или нет */ native get_user_predator(id)
/* Превращает игрока в хищника id - индекс игрока type - тип хищника 1 - зелёный хищник 2 - серый хищник 3 - красный хищник 4 - белый хищник */ native set_user_predator(id, type)
Говори что думаешь и думай что говоришь...
Сообщение отредактировал ZETA - Пятница, 23.10.2009, 11:59:57 |
|
| |
tavot | Дата: Пятница, 23.10.2009, 11:55:14 | Сообщение # 8 |
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
| 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 |
![ZETA](/avatar/89/680832.gif) Генерал-майор
Группа: Скриптеры
Сообщений: 369
Статус: Не в сети
| Quote (tavot) Думаю ошбитсья сдесь сложно, так вот: 1 до выбора предатора - получаем правильный ответ 2 после выбора предатора - павильный 3 А вот после смерти предатора - ответ не правильный, т.е. в место 0 все вравно функция возвращает единицу. Даже после смерти. Поправил, насчет остального вечером напишу, обновил архив...
Говори что думаешь и думай что говоришь...
|
|
| |
tavot | Дата: Пятница, 23.10.2009, 12:54:49 | Сообщение # 10 |
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
| Проблему решил: Добавил в функцию 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 |
![PomanoB](/avatar/66/872586.png) Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Потому что register_logevent("eventRound_Start", 2, "1=Round_Start") регистрирует глобальное событие, id игрока не передается, тк нет такого игрока, а register_event("ResetHUD","startround","be") регистрирует событие для игрока Сделал также forward функцию, описание в inc файле
http://romanov4400.mybrute.com
|
|
| |
tavot | Дата: Понедельник, 26.10.2009, 02:55:22 | Сообщение # 12 |
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
| 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 |
![PomanoB](/avatar/66/872586.png) Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| 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
Статус: Не в сети
| PomanoB, Спасибо, все работает на отлично. Обновил первый пост: На данном этапе вывода статистике нету, только занесение данных в таблицу. Прозьба к Знатокам, посмотрите код, может какие ошибки увидите, или как оптимизировать...архив в первом посте, это мой первый плагин, так что здравую критику с поясненями как делать лучше, буду с удовольствием выслушивать. А пока что, приступаю к выводу статистики top15 для предатор мода.
|
|
| |
ZETA | Дата: Понедельник, 26.10.2009, 15:47:49 | Сообщение # 15 |
![ZETA](/avatar/89/680832.gif) Генерал-майор
Группа: Скриптеры
Сообщений: 369
Статус: Не в сети
| 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 |
|
| |
![](/.s/t/251/17.gif) | AMX Mod X Russian Community © 2006-2025 ![](/.s/img/cp/7.gif) | ![](/.s/t/251/18.gif) |
|
| |