Witam, mam taki kod do przechodzenia przez swoich graczy zaczerpnięty stąd: http://amxx.pl/topic...ory-w-semiclip/ (upload DarkGL'a) Przy pełnym serwerze (23) zwiększa on nawet obciążenie CPU serwera o ~10% (wersja, w której przenikanie było aktywne nieustannie). Kod jest dla mnie trochę niejasny, bo słabo znam działanie modułu fakemeta, dlatego trudno mi tu edytować i zachować sprawność pluginu. Widzicie tu jakieś możliwości edycji tak by plugin oszczędzał bardziej serwer?
#include <amxmodx> #include <engine> #include <fakemeta> #include <hamsandwich> const Float:DYSTANS = 100.0 new Druzyna[25]; new Gracze; new bool:przenik; new bool:Solidny[25]; new bool:Duch[25]; public plugin_init(){ register_plugin( "semiclip", "1.0", "diablix" ); register_forward( FM_AddToFullPack, "fwdFullPack", 1 ); register_logevent("round_start",2,"1=Round_Start"); Gracze = get_maxplayers(); } public client_disconnect(id) Druzyna[id] = 0; public round_start() set_task(0.7, "przenikanieON") public przenikanieON(){ przenik = true; set_task(10.0, "przenikanieOFF") } public przenikanieOFF() przenik = false; public client_PreThink(id){ if(!przenik) return FMRES_IGNORED; static Think, i; if(Think > id){ for( i = 1; i <= Gracze; i++ ){ if( !is_user_alive(i) ){ Solidny[ i ] = false; continue; } Druzyna[i] = _:get_user_team( i ); Solidny[i] = entity_get_int( i, EV_INT_solid ) == SOLID_SLIDEBOX ? true : false; } } Think = id; if(!Solidny[id]) return FMRES_IGNORED; for(i = 1; i <= Gracze; i++ ) { if(!is_user_alive(i) || !Solidny[i] || Duch[i] || id == i || entity_range(id, i) > DYSTANS) continue; if(Druzyna[i] == Druzyna[id]){ Duch[i] = true; entity_set_int(i, EV_INT_solid, SOLID_NOT); } } return FMRES_IGNORED; } public client_PostThink(id){ if(przenik){ static i; for(i = 1; i <= Gracze; i++){ if(Duch[i] && is_user_alive(i)){ Duch[i] = false; entity_set_int(i, EV_INT_solid, SOLID_SLIDEBOX ); } } } } public fwdFullPack(iHandle, e, iEntity, id, iFlags, iPlayer, pSet){ if(!przenik || !iPlayer || id == iEntity || !is_user_alive(id) || !is_user_alive(iEntity)) return FMRES_IGNORED; if( Solidny[id] && Solidny[iEntity] && Druzyna[id] == Druzyna[iEntity]) { static Float:fDystans; fDystans = entity_range(id, iEntity); if( fDystans < DYSTANS) { set_es(iHandle, ES_Solid, SOLID_NOT ); set_es(iHandle, ES_RenderMode, kRenderTransAlpha ); set_es(iHandle, ES_RenderAmt, floatround( fDystans * 3)); } } return FMRES_IGNORED; }
Przy okazji zapytam, bo mam wątpliwości w tej sprawie:
new bool:przenik, Solidny[25], Duch[25];
Czy teraz wszystkie 3 zmienne/tablice będą bool'owskie czy tylko "przenik" ?