2013-01-16 8 views
0

음, 분명히하기 위해 폰은 C++과 매우 유사한 언어입니다. 저는 비트 마스크 권한 (PHP에서)이 필요한 관리자 제어판을 프로그래밍 중이며 PHP에 대한 권한 (제대로 된 적이 없기 때문에)을 제대로 변환했는지 여부는 실제로 알지 못합니다. 나는 define()을 사용하여 권한을 정의했다. 여기에 원래 (전당포에)입니다 방법은 다음과 같습니다 나는 비트 플래그를 비교하고 대부분의 시간은 그냥 따라 EAdminFlags_All 권한을 인식이 비트 마스크 정의를 폰에서 PHP로 변환하는 방법은 무엇입니까?

define("EAdminFlags_None",0); 
    define("EAdminFlags_BasicAdmin",1); 
    define("EAdminFlags_CanGiveGuns",1 << 0); 
    define("EAdminFlags_HouseAdmin",1 << 1); 
    define("EAdminFlags_IRCAdmin",1 << 2); 
    define("EAdminFlags_BusinessAdmin",1 << 3); 
    define("EAdminFlags_AdminManage",1 << 4); 
    define("EAdminFlags_Scripter",1 << 5); 
    define("EAdminFlags_HelperManage",1 << 6); 
    define("EAdminFlags_Unbannable",1 << 7); 
    define("EAdminFlags_CanRefundSelf",1 << 8); 
    define("EAdminFlags_VehicleAdmin",1 << 9); 
    define("EAdminFlags_AntiCheat",1 << 10); 
    define("EAdminFlags_BigEars",1 << 11); 
    define("EAdminFlags_SetName",1 << 12); 
    define("EAdminFlags_CanHide",1 << 13); 
    define("EAdminFlags_Invisible",1 << 14); 
    define("EAdminFlags_GiveDrugs",1 << 15); 
    define("EAdminFlags_Unban",1 << 16); 
    define("EAdminFlags_WeatherManage",1 << 17); 
    define("EAdminFlags_GiveRestrictedGun",1 << 18); 
    define("EAdminFlags_TeleportOthers",1 << 19); 
    define("EAdminFlags_CanBanAdmins",1 << 20); 
    define("EAdminFlags_GiveMats",1 << 21); 
    define("EAdminFlags_StatsManage",1 << 22); 
    define("EAdminFlags_FamilyAdmin",1 << 23); 
    define("EAdminFlags_FactionAdmin",1 << 24); 
    define("EAdminFlags_MassCmds",1 << 25); 
    define("EAdminFlags_Nuke",1 << 26); 
    define("EAdminFlags_RangeBan",1 << 27); 
    define("EAdminFlags_GiveMoney",1 << 28); 
    define("EAdminFlags_Donations",1 << 29); 
    define("EAdminFlags_ServerManager",1 << 30); 
    define("EAdminFlags_All",-1); 

: 나는 PHP에서 그것을 정의하는 방법

//Pawn 
enum EAdminFlags (<<= 1) { 
    EAdminFlags_None = 0, 
    EAdminFlags_BasicAdmin = 1, //kick, fine, etc 0 
    EAdminFlags_CanGiveGuns, //1 
    EAdminFlags_HouseAdmin, //2 
    EAdminFlags_IRCAdmin, //3 
    EAdminFlags_BusinessAdmin, //4 
    EAdminFlags_AdminManage, //5 can see invisible admins/manipulate admin flags 
    EAdminFlags_Scripter, //getpvars, reloadcmds, stuff only scripters should need 6 
    EAdminFlags_HelperManage, // 7 manage helpers/teachers 
    EAdminFlags_Unbannable, //unbanable under ANY circumstances 8 
    EAdminFlags_CanRefundSelf, //can refund himself 
    EAdminFlags_VehicleAdmin, //10 can manipulate player vehicles 
    EAdminFlags_AntiCheat, //immune to the anticheat 11 
    EAdminFlags_BigEars, //can /bigears, /bigfamilyears, /bigmouth 
    EAdminFlags_SetName, //13 
    EAdminFlags_CanHide, //can toggle/untoggle hidden on themselves 14 
    EAdminFlags_Invisible, //Invisible on admins list(like 9999s before) 15 
    EAdminFlags_GiveDrugs, //server manager, can restart the server/do rcon cmds, create job cars 16 
    EAdminFlags_Unban, //can unban, oban, oprison people 17 
    EAdminFlags_WeatherManage, //can manage weather/time 18 
    EAdminFlags_GiveRestrictedGun, //can give restircted guns 19 
    EAdminFlags_TeleportOthers, //can teleport other people 20 
    EAdminFlags_CanBanAdmins, //can ban other admins(or any punishments) 21 
    EAdminFlags_GiveMats, //can give materials 22 
    EAdminFlags_StatsManage, //23 /setstat, /sethp, /setarmor 
    EAdminFlags_FamilyAdmin, //24 
    EAdminFlags_FactionAdmin, //25 
    EAdminFlags_MassCmds, //26 can do /masstphere, /massmoney, /masskick, /massnuke 
    EAdminFlags_Nuke, //27 can do things like /nuke, sparta, rangeban 
    EAdminFlags_RangeBan, //28 can range ban 
    EAdminFlags_GiveMoney, //29 can /givemoney /money 
    EAdminFlags_Donations, //30 can give DPS/set donate rank 
    EAdminFlags_ServerManager, //can restart the server, etc, use /noooc, /nopms, /nonewb 
    EAdminFlags_All = -1, 
}; 

지금이가 EAdminFlags_NoneEAdminFlags_BasicAdmin입니다. PHP에서 이것을 어떻게 정의했는지에 대한 문제가있을 수 있습니다. 권한은 데이터베이스에 저장하고 예를 들어 원시 정수 값으로 저장됩니다 51531777 다음 그것과 같이 PHP에로드와 비교됩니다 :

$account = new Account(Auth::getUserID()); 
echo "Welcome ".$account->getUsername()."<br>"; 
if($account->getAdminPerms(EAdminFlags_FamilyAdmin)) { 
    echo "You are a family admin."; //testing purposes 
    //If the person has those permissions set then display he/she is a family admin but even if the permissions are set to EAdminFlags_BasicAdmin, it will still display it wrong 
} 
public function getAdminLevel() { 
    return $this->adminlevel; //This holds the integer value "51531777" 
} 
public function getAdminPerms($n) { 
    return ($this->adminlevel & (1 << $n)) != 0; 
} 

사전에 당신의 도움을 주셔서 감사합니다, 정말 감사 .

+0

"문제가있을 수 있습니다. 문제가 무엇입니까? 언뜻보기에 좋아 보인다. – feeela

+0

초보자로서 상수가 실제로 모두 올바르게 정의되었는지 확인 했습니까? 인쇄하여 2 : 1, 2, 4, 8, 16, 32, ...의 힘을 발휘하지 못하게하십시오. – Sven

+0

권한이 잘못 표시되거나 권한이 표시되지 않는 것을 보여줍니다. 또한 사용자가 플래그를 설정했는지 여부를 확인하지 않습니다. –

답변

1

와 같은 값을 가지고 있습니다 ...이 두 동일,가 특정 권리 플래그중인 검출 오류 :

public function getAdminPerms($n) { 
    return ($this->adminlevel & (1 << $n)) != 0; 
} 

입력은 정확한 위치에 설정된 1 비트 플래그 인 값이다. 당신은 잘못 다시 이동하지만, 당신이 할 필요가되고 하나 정수 값은 데이터베이스에서 읽어

public function getAdminPerms($n) { 
    return ($this->adminlevel & $n)) != 0; 
} 

방법은 다시 동일하게 작동합니다. 0 값에서 시작하여 모든 상수 값을 시프 팅하지 않고 비트 OR하여 모든 관리자 권한 플래그를 추가 할 수 있습니다.

$newAdmin = EAdminFlags_AntiCheat | EAdminFlags_CanGiveGuns; 
+0

감사합니다. 지금 막 거대한 문제를 해결하는 데 도움을주었습니다. 이제이 작업에 착수 할 수있게되었습니다. –

1
define("EAdminFlags_BasicAdmin",1); 
define("EAdminFlags_CanGiveGuns",1 << 0); 

0으로 이동하는 것은 기본적으로 널 작업입니다, 그래서 "cangiveguns는"상수에 대한 당신의 이동 작업이 바로 있다고 가정 basicadmin

+0

나는 그것을 바꾸어야한다고 생각합니다. –