A lilte poor ‘member’ system:
-Create empty .c file and it to “GAME” project
I created g_members.c
add to it:
#include "g_local.h"
/*
======================
====|*MEMBER ZONE*|===
=======================
----------------------------------------------------------------------
|||||||||||||||||||||||||||||ub3r@wp.pl|||||||||||||||||||||||||||||||
----------------------------------------------------------------------
*/
//Request member status
void G_refz_cmd(gentity_t *ent, unsigned int dwCommand, qboolean fValue)
{
char arg[MAX_TOKEN_CHARS];
if(ent == NULL || ent->client->sess.member) {
voteInfo_t votedata;
trap_Argv(1, arg, sizeof(arg));
memcpy( &votedata, &level.voteInfo, sizeof( voteInfo_t ) );
if( Cmd_CallVote_f(ent, 0, qtrue) ) {
memcpy( &level.voteInfo, &votedata, sizeof( voteInfo_t ) );
return;
} else {
memcpy( &level.voteInfo, &votedata, sizeof( voteInfo_t ) );
}
return;
}
if(ent) {
if(!Q_stricmp(memberPassword.string, "none") || !memberPassword.string[0]) {
CP("cpm \"Sorry, member status is disabled on this server.
\"");
return;
}
if(trap_Argc() < 2) {
CP("cpm \"Usage: member [password]
\"");
return;
}
trap_Argv(1, arg, sizeof(arg));
if(Q_stricmp(arg, memberPassword.string)) {
CP("cpm \"Invalid member password!
\"");
return;
}
ent->client->sess.member = 1;
ent->client->sess.spec_invite = TEAM_AXIS | TEAM_ALLIES;
AP(va("cp \"%s
^3has logged in.
\"", ent->client->pers.netname));
ClientUserinfoChanged( ent-g_entities );
}
}
next go to g_local.h
find(ln.2395):
void G_UnMuteClient(void);
below add:
void G_refz_cmd(gentity_t *ent, unsigned int dwCommand, qboolean fValue);
find:
int referee;
below add:
int member;
find:
extern vmCvar_t refereePassword;
below add:
extern vmCvar_t memberPassword;
In g_main.c
find:
vmCvar_t z_serverflags;
after this add:
vmCvar_t memberPassword;
find:
{ &vote_percent, "vote_percent", "50", 0, 0, qfalse, qfalse },
below add:
{ &memberPassword, "memberPassword", "pass", 0, 0, qfalse},
now go to g_cmds_ext.c and find:
{ "ref", qtrue, qtrue, G_ref_cmd, " <password>:^7 Become a referee (admin access)" },
below add line:
{ "member", qtrue,qtrue, G_refz_cmd, " " },
Now, in G_vote.c find:
(ln:361)
if( level.clients[ pid ].sess.referee ) {
G_refPrintf( ent, "Can't vote to kick referees!" );
return G_INVALID;
}
below add:
/*
----------------------------------------------------------------------
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
----------------------------------------------------------------------
*/
if( level.clients[ pid ].sess.member ) {
G_refPrintf( ent, "Can't vote to kick server members!" );
return G_INVALID;
}
if(level.clients[pid].sess.member) {
G_refPrintf(ent, "Can't vote to mute server members!");
return(G_INVALID);
}
//--------------------------------------------------------------------
That’s it :bump:
to login as a member type in console \member xxx
Server host can change member password by cvar \memberPassword xxx
Member cannot be kicked or muted by vote.
I hope i don’t forgotten about somethink 


