Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
Плагин Semi-clip
tavot Дата: Четверг, 25.02.2010, 12:48:34 | Сообщение # 1
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
Код самого плагина: Code
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #define PLUGIN "New Plug-In" #define VERSION "0.0.1" #define AUTHOR "Svoloch" #include <fun> #include <engine> #include <fakemeta> #include <sqlx> #include <cstrike> new p_render new bool:sclip[32] public server_frame(){//Semi-clip //*if(get_pcvar_num(p_climb)){ new players[32],num,i,j,Float:c1[3],Float:c2[3] new Float:c1z[3],Float:c2z[3] new id_i,id_j,cflags_i,cflags_j get_players(players,num,"ac") //new Float:c1d[3],Float:c2d[3],xyadd,zadd for(i=0;i<num;i++){ id_i=players[i] //***cflags_i=timer[id_i-1][TMR_CFLAGS] //**if(!(cflags_i&CF_PAUSE)){ //solid(players[i]) entity_get_vector(id_i,EV_VEC_origin,c1) //entity_get_vector(players[i],EV_VEC_velocity,c1d) c1z[2]=c1[2] c1[2]=0.0 for(j=0;j<num;j++){ id_j=players[j] //cflags_j=timer[id_j-1][TMR_CFLAGS] if(!(cflags_j)&&i!=j){ entity_get_vector(id_j,EV_VEC_origin,c2) //entity_get_vector(players[j],EV_VEC_velocity,c2d) c2z[2]=c2[2] c2[2]=0.0 if(vector_distance(c1,c2)<90&&vector_distance(c1z,c2z)<110){ if(!(cflags_i&&cflags_j)){//&&vector_distance(c1,c2)>25&&vector_distance(c1z,c2z)>30)){ unsolid(id_i) unsolid(id_j) j=num } } } if(j+1== num)sol id(id_i ) } / /**} } //*} return PLUGIN_CONTINUE } //Make client solid public solid(id){ set_user_rendering(id,kRenderFxNone,0,0,0,kRenderNormal,255) entity_set_int(id,EV_INT_solid,SOLID_BBOX) sclip[id-1]=false return PLUGIN_CONTINUE } //Make client unsolid public unsolid(id){ new test=1 if(test==1)set_user_rendering(id,kRenderFxHologram,0,0,0,kRenderTransAdd,0) else set_user_rendering(id,kRenderFxPulseSlow,0,0,0,kRenderTransTexture,50) entity_set_int(id,EV_INT_solid,SOLID_NOT) sclip[id-1]=true return PLUGIN_CONTINUE } public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) // Add your code here... }
Код рабочий, проверял только что. Собрать то я его собрал, но вот не доконца понимаю как это дело работает, хочется разобраться, от сюда следующие вопросы: public server_frame () - Как я понимаю выполняется в каждом кадре? - не будет ли это нагрузкой на сервер? В другом варианте этого плагина видел: register_forward(FM_AddToFullPack, "addToFullPack", 1) - догадки есть кое какие что это, но полного понимания нет. SOLID_BBOX и SOLID_NOT - так же, догадки, но без понимания. entity_get_vector(id_i,EV_VEC_origin,c1) - видно что получается вектор - а nxj за вектор. по смыслу понятно что расстояние между двумя игроками. И собственно правильность алгоритма: 1 если игрок подходит к другому ближе чем на if(vector_distance(c1,c2)<90&&vector_distance(c1z,c2z)<110) - это оба вектора для обоих игроков, так? То ему public unsolid(id) 2 Как только расстояние больше чем ... то ему дается public solid(id)
Буду рад любым пояснениям, правкам, замечаниям!
Сообщение отредактировал tavot - Четверг, 25.02.2010, 13:09:27
PomanoB Дата: Четверг, 25.02.2010, 13:02:28 | Сообщение # 2
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
Quote (tavot )
Как я понимаю выполняется в каждом кадре? - не будет ли это нагрузкой на сервер?
Да, в каждом кадре, и нагрузка конечно значительная)
Quote (tavot )
FM_AddToFullPack
http://amxmodx.ucoz.ru/forum/9-1615-1
Quote (tavot )
SOLID_BBOX и SOLID_NO
см hlsdk_const.inc
Quote (tavot )
entity_get_vector(id_i,EV_VEC_origin,c1)
EV_VEC_origin - это значит что хотим получить вектор координат
Quote (tavot )
И собственно правильность алгоритма:
Да, алгоритм именно такой
http://romanov4400.mybrute.com
tavot Дата: Четверг, 25.02.2010, 13:10:50 | Сообщение # 3
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
PomanoB , Спасибо, побрел читать ) Вот другой вариант:
Code
public addToFullPack(es, e, ent, host, hostflags, player, pSet) { if( get_pcvar_num(cvar_enable) != 1 ) return FMRES_IGNORED; if(player) { if( is_number_into(host, 1, 32) && is_number_into(ent, 1, 32) && host != ent ) { set_es(es, ES_Solid, SOLID_NOT) if( (!g_playerisvip[ent] && is_user_alive(host) || !g_playerisvip[ent] && !g_idspecting[0][host]) && !kz_botis_valid(ent) && !g_playerhaveinvis[host] ) { kz_set_es(es, TRANS_MODE) } else if( !g_playerisvip[ent] && !is_user_alive(host) && g_idspecting[0][host] && !kz_botis_valid(ent) ) { if( !g_playerhaveinvis[host] && g_idspecting[1][host] != ent ) { kz_set_es(es, TRANS_MODE) } else if( g_playerhaveinvis[host] && g_idspecting[1][host] != ent ) { kz_set_es(es, INVIS_ORIGIN_MODE) } } else if( kz_botis_valid(ent) || g_playerhaveinvis[host] ) { kz_set_es(es, INVIS_ORIGIN_MODE) } } } else if( g_playerhavewater[host] ) { if( g_watersents[ent] ) { set_es(es, ES_Effects, EF_NODRAW) } } return FMRES_IGNORED } stock kz_set_es(es, {VIEW_ID_MODE,_}:mode) { set_es(es, ES_RenderFx, mode == TRANS_MODE ? kRenderFxDistort : kRenderFxGlowShell ) set_es(es, ES_RenderColor, 0.0, 0.0, 0.0) set_es(es, ES_RenderMode, mode == TRANS_MODE ? kRenderTransAdd : kRenderTransAlpha ) set_es(es, ES_RenderAmt, mode == TRANS_MODE ? 127.0 : 0.0 ) if( mode == INVIS_ORIGIN_MODE ) set_es(es, ES_Origin, { 999999999.0, 999999999.0, 999999999.0 } ) }
Но тут постоянно игрок полупрозрачный. Это как раз к вопросу про: register_forward(FM_AddToFullPack, "addToFullPack", 1)
Я так понимаю нагрузка меньше, но и нет этого эффекта прозрачный/не прозрачный. Этого можно достичь не используя server_frame?
Сообщение отредактировал tavot - Четверг, 25.02.2010, 13:11:18
PomanoB Дата: Четверг, 25.02.2010, 13:15:46 | Сообщение # 4
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
http://forums.alliedmods.net/showthread.php?t=69728 Отсюда плагин скачай Но надо подредактировать поставить проверку на дистанцию в самом AddToFullPack
http://romanov4400.mybrute.com
MaIN Дата: Пятница, 26.02.2010, 10:03:42 | Сообщение # 5
Подполковник
Группа: Пользователи
Сообщений: 109
Статус: Не в сети
Какой семи-клип грузит сервер меньше остальных? и от чего это зависит? Объясните пожалуйста, а то я не очень въехал в ваш разговор.
Сообщение отредактировал MaIN - Пятница, 26.02.2010, 10:05:10
tavot Дата: Пятница, 26.02.2010, 11:14:48 | Сообщение # 6
Генерал-майор
Группа: Пользователи
Сообщений: 256
Статус: Не в сети
MaIN , на сколько я понял грузит очень тот который использует: public server_frame() - так как это дело происходит каждый кадр.
MaIN Дата: Пятница, 26.02.2010, 12:57:39 | Сообщение # 7
Подполковник
Группа: Пользователи
Сообщений: 109
Статус: Не в сети
tavot , спасибо теперь дошло)
PomanoB Дата: Пятница, 26.02.2010, 19:18:57 | Сообщение # 8
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
AddToFullPack Тоже очень часто вызывается Всё можно проверить с помощью amxmodx_profiler
http://romanov4400.mybrute.com
AMX Mod X Russian Community © 2006-2025