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" ?


Dodatki SourceMod












