#Door, Locker, Gen Permissions

1 messages · Page 1 of 1 (latest)

steel orchid
#

So I had this code that would just check if the player had high enough keycard permissions to open the door/locker/gen, I had these functions ```csharp
public static bool HasKeycardPermission(DoorVariant door, Player player)
{
foreach (ItemBase item in player.ReferenceHub.inventory.UserInventory.Items.Values.ToList())
if (door.RequiredPermissions.CheckPermissions(item, player.ReferenceHub))
return true;

return false;

}
public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player)
{
foreach (ItemBase item in player.ReferenceHub.inventory.UserInventory.Items.Values.ToList())
if (item is InventorySystem.Items.Keycards.KeycardItem keycardItem)
return keycardItem.Permissions.HasFlagFast(chamber.RequiredPermissions);

return false;

}
public static bool HasKeycardPermission(Scp079Generator generator, Player player)
{
foreach (ItemBase item in player.ReferenceHub.inventory.UserInventory.Items.Values.ToList())
if (item is InventorySystem.Items.Keycards.KeycardItem keycardItem)
return keycardItem.Permissions.HasFlagFast(generator.RequiredPermissions);

return false;

}```But with the new 0.6.0 LabAPI update, they are broken and I've been trying to find how to fix it for half an hour now, so I'm assuming it's just something really simple and I'm just a little special lol

wary gust
#

the locked chamber and generator one only check the first keycard in the inventory, which is different from the door one. other than that i think people need more details like showing the code using it

#

additionally i suggest logging the perms to see whats happening when you use them

steel orchid
#
public static bool HasKeycardPermission(DoorVariant door, Player player)
{
    foreach (ItemBase item in player.Inventory.UserInventory.Items.Values.ToList())
        if (item is InventorySystem.Items.Keycards.KeycardItem keycardItem &&
                keycardItem.GetPermissions().HasFlagAny(door.RequiredPermissions))
            return true;

    return false;
}
public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player)
{
    foreach (ItemBase item in player.Inventory.UserInventory.Items.Values.ToList())
        if (item is InventorySystem.Items.Keycards.KeycardItem keycardItem &&
                keycardItem.GetPermissions().HasFlagAny(chamber.RequiredPermissions))
            return true;

    return false;
}
public static bool HasKeycardPermission(Scp079Generator generator, Player player)
{
    foreach (ItemBase item in player.Inventory.UserInventory.Items.Values.ToList())
        if (item is InventorySystem.Items.Keycards.KeycardItem keycardItem &&
                keycardItem.GetPermissions().HasFlagAny(generator.RequiredPermissions))
            return true;

    return false;
}``` Okay well I have this right, but I need `IDoorPermissionRequester requester` to go in the `keycardItem.GetPermissions()` part, so where do I get that? and also the code using it is just an opened door event or locker event etc, it checks if the player has the keycard with the correct permissions to open that thing in their inventory
wary gust
#

yeah we need to see that part

wary gust
gusty crypt
#
    public static bool HasLockerPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player)
    {
        return HasPlayerPermission(player, chamber.Base);
    }

    public static DoorPermissionFlags GetDoorPermission(Player player, IDoorPermissionRequester requester)
    {
        if (player.IsBypassEnabled)
            return DoorPermissionFlags.All;
        // you should prioritize something here
        IDoorPermissionProvider doorPermissionProvider = player.RoleBase as IDoorPermissionProvider;
        if (doorPermissionProvider != null)
            return doorPermissionProvider.GetPermissions(requester);
        foreach (Item item in player.Items.ToList())
            if (item is KeycardItem keycardItem)
                return keycardItem.Base.GetPermissions(requester);
        return DoorPermissionFlags.None;
    }
    public static bool HasPlayerPermission(Player player, IDoorPermissionRequester requester)
    {
        return HasPermissionFlag(requester, GetDoorPermission(player, requester));
    }
    public static bool HasPermissionFlag(IDoorPermissionRequester requester, DoorPermissionFlags flags)
    {
        return requester.PermissionsPolicy.CheckPermissions(flags);
    }
#

tbh still not really how it should work

#

prop you need to get the player actual thing so might aswell get some impression from how the game does it

wary gust
#

just cleaner and easier to read imo

gusty crypt
#

no Permissions getter for keycard so

steel orchid
steel orchid
# gusty crypt ```cs public static bool HasLockerPermission(LabApi.Features.Wrappers.Locker...

Thoughts?```csharp
public static bool HasKeycardPermission(Door door, Player player) =>
HasPlayerPermission(player, door.Base);

public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player) =>
HasPlayerPermission(player, chamber.Base);

public static bool HasKeycardPermission(Scp079Generator generator, Player player) =>
HasPlayerPermission(player, generator);

public static bool HasPlayerPermission(Player player, IDoorPermissionRequester requester) =>
HasPermissionFlag(requester, GetDoorPermission(player, requester));
public static bool HasPermissionFlag(IDoorPermissionRequester requester, DoorPermissionFlags flags) =>
requester.PermissionsPolicy.CheckPermissions(flags);

public static DoorPermissionFlags GetDoorPermission(Player player, IDoorPermissionRequester requester)
{
if (player.IsBypassEnabled)
return DoorPermissionFlags.All;

if (player.RoleBase is IDoorPermissionProvider doorPermissionProvider)
    return doorPermissionProvider.GetPermissions(requester);

foreach (Item item in player.Items.ToList())
    if (item is KeycardItem keycardItem)
        return keycardItem.Base.GetPermissions(requester);

return DoorPermissionFlags.None;

}```

gusty crypt
#

looks good

#

if you really feel like and want to add something like scp can open warhead and things and have an 05 in their inventory you get the flags and combine

novel steppe
#

i like nitpicking :3

steel orchid
#
public static bool HasKeycardPermission(Door door, Player player) =>
    HasPlayerPermission(player, door.Base);

public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player) =>
    HasPlayerPermission(player, chamber.Base);

public static bool HasKeycardPermission(Scp079Generator generator, Player player) =>
    HasPlayerPermission(player, generator);

public static bool HasPlayerPermission(Player player, IDoorPermissionRequester requester)
{
    DoorPermissionFlags flags = DoorPermissionFlags.None;

    if (player.IsBypassEnabled)
        flags = DoorPermissionFlags.All;
    
    if (player.RoleBase is IDoorPermissionProvider doorPermissionProvider)
        flags = doorPermissionProvider.GetPermissions(requester);

    foreach (Item item in player.Items)
        if (item is KeycardItem keycardItem)
            flags = keycardItem.Base.GetPermissions(requester);

    return requester.PermissionsPolicy.CheckPermissions(flags);
}```
#

There we go, beautiful

gusty crypt
#

If has bypass you can just return true since that what basegame do.

#

Also the flags dont add use |= to combine flags

novel steppe
steel orchid
#

We must make it as perfect as possible lmao ```csharp
public static bool HasKeycardPermission(Door door, Player player) =>
HasPlayerPermission(player, door.Base);

public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player) =>
HasPlayerPermission(player, chamber.Base);

public static bool HasKeycardPermission(Scp079Generator generator, Player player) =>
HasPlayerPermission(player, generator);

public static bool HasPlayerPermission(Player player, IDoorPermissionRequester requester)
{
DoorPermissionFlags flags = DoorPermissionFlags.None;

if (player.IsBypassEnabled)
    return true;


if (player.RoleBase is IDoorPermissionProvider doorPermissionProvider)
    flags = doorPermissionProvider.GetPermissions(requester);

foreach (Item item in player.Items)
    if (item is KeycardItem keycardItem)
        flags = keycardItem.Base.GetPermissions(requester);

return requester.PermissionsPolicy.CheckPermissions(flags);

}```

gusty crypt
# steel orchid We must make it as perfect as possible lmao ```csharp public static bool HasKeyc...
public static bool HasKeycardPermission(Door door, Player player) =>
    HasPlayerPermission(player, door.Base);

public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player) =>
    HasPlayerPermission(player, chamber.Base);

public static bool HasKeycardPermission(Scp079Generator generator, Player player) =>
    HasPlayerPermission(player, generator);

public static bool HasPlayerPermission(Player player, IDoorPermissionRequester requester)
{
    DoorPermissionFlags flags = DoorPermissionFlags.None;
    // If user has bypass we not gonna check any permission
    if (player.IsBypassEnabled)
        return true;
    // get SCP related permissions.
    if (player.RoleBase is IDoorPermissionProvider doorPermissionProvider)
        flags |= doorPermissionProvider.GetPermissions(requester);
    // getting all keycard permission. (If user has 05 and scientitst for example we use both)
    foreach (Item item in player.Items)
        if (item is KeycardItem keycardItem)
            flags |= keycardItem.Base.GetPermissions(requester);
    // checks the permission for the combined one
    return requester.PermissionsPolicy.CheckPermissions(flags);
}
#

the |= is needed

#

for example if you are an scp and have zone manager in your inventory (someone gave it to you) you can open scp related doors and zone manager related doors

steel orchid
#

Oh yeah, completely went over that message lol

gusty crypt
#

or if you are any human and have 05 and scientist card it combines both

#

not really great example but something like custom card related persm would combine

steel orchid
#

No I get it

#

Wow, we really nitpicking here, I think I need to do that with the project sometime, maybe on the weekend ```csharp
public static bool HasKeycardPermission(Door door, Player player) =>
HasPlayerPermission(player, door.Base);

public static bool HasKeycardPermission(LabApi.Features.Wrappers.LockerChamber chamber, Player player) =>
HasPlayerPermission(player, chamber.Base);

public static bool HasKeycardPermission(Scp079Generator generator, Player player) =>
HasPlayerPermission(player, generator);

public static bool HasPlayerPermission(Player player, IDoorPermissionRequester requester)
{
DoorPermissionFlags flags = DoorPermissionFlags.None;

if (player.IsBypassEnabled)
    return true;

if (player.RoleBase is IDoorPermissionProvider doorPermissionProvider)
    flags |= doorPermissionProvider.GetPermissions(requester);

foreach (Item item in player.Items)
    if (item is KeycardItem keycardItem)
        flags |= keycardItem.Base.GetPermissions(requester);

return requester.PermissionsPolicy.CheckPermissions(flags);

}```