// assuming kicker is admin qbool is_can_forcespec(gedict_t *victim, gedict_t *kicker) { if ( VIP_IsFlags(victim, VIP_NOTKICKABLE) && !is_real_adm(kicker) ) { G_sprint(kicker, 2, "You can't force_spec VIP \x8D %s as elected admin\n", (strnull( victim->netname ) ? "!noname!" : victim->netname)); return false; } if ( is_real_adm(victim) && !is_real_adm(kicker) ) { G_sprint(kicker, 2, "You can't force_spec real admin \x8D %s as elected admin\n", (strnull( victim->netname ) ? "!noname!" : victim->netname)); return false; } return true; }
void vote_check_nospecs () { int veto; if ( match_in_progress || intermission_running || match_over ) return; if ( !get_votes( OV_NOSPECS ) ) return; veto = is_admins_vote( OV_NOSPECS ); if( veto || !get_votes_req( OV_NOSPECS, true ) ) { vote_clear( OV_NOSPECS ); // set no specs mode cvar_fset("_k_nospecs", !cvar("_k_nospecs")); if ( veto ) G_bprint(2, "%s\n", redtext(va("No spectators mode %s by admin veto", OnOff(cvar("_k_nospecs"))))); else G_bprint(2, "%s\n", redtext(va("No spectators mode %s by majority vote", OnOff(cvar("_k_nospecs"))))); // kick specs if ( cvar("_k_nospecs") ) { gedict_t *spec; for ( spec = world; (spec = find_spc( spec )); ) { if ( VIP( spec ) & ALLOWED_NOSPECS_VIPS ) continue; // don't kick this VIP if ( is_real_adm(spec) ) continue; // don't kick real admin stuffcmd(spec, "disconnect\n"); // FIXME: stupid way } } return; } }