Ejemplo n.º 1
0
        object CanUseLockedEntity(BasePlayer player, CodeLock codeLock)
        {
            if (codeLock.IsLocked() == false)
            {
                return(null);
            }
            var building = (codeLock.GetParentEntity() as DecayEntity)?.GetBuilding();

            if (building == null)
            {
                Puts($"Couldn't find building for {codeLock.GetParentEntity()?.PrefabName}!");
                return(null);
            }
            if (building.buildingPrivileges.Count == 0)
            {
                return(null);
            }
            var tcLock = building.buildingPrivileges[0].GetSlot(BaseEntity.Slot.Lock) as CodeLock;

            if (tcLock == null)
            {
                return(null);
            }
            if (tcLock.code != codeLock.code)
            {
                return(null);
            }
            if (tcLock.whitelistPlayers.Contains(player.userID))
            {
                return(true);
            }
            return(null);
        }
Ejemplo n.º 2
0
        public static void On_DoorCode(CodeLock doorLock, BaseEntity.RPCMessage rpc)
        {
            if (!doorLock.IsLocked())
            {
                return;
            }
            string        code = rpc.read.String();
            DoorCodeEvent dc   = new DoorCodeEvent(doorLock, rpc.player, code);

            OnNext("On_DoorCode", dc);
            if ((!dc.IsCorrect() || !dc.allowed) && !dc.forceAllow)
            {
                Effect.server.Run(doorLock.effectDenied.resourcePath, doorLock, 0u, Vector3.zero, Vector3.forward);
                rpc.player.Hurt(1f, Rust.DamageType.ElectricShock, doorLock, true);
                return;
            }
            Effect.server.Run(doorLock.effectUnlocked.resourcePath, doorLock, 0u, Vector3.zero, Vector3.forward);
            doorLock.SetFlag(BaseEntity.Flags.Locked, false);
            doorLock.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
            List <ulong> whitelist = new List <ulong>();

            whitelist = (List <ulong>)doorLock.GetFieldValue("whitelistPlayers");
            if (!whitelist.Contains(rpc.player.userID))
            {
                whitelist.Add(rpc.player.userID);
                doorLock.SetFieldValue("whitelistPlayers", whitelist);
            }
        }
Ejemplo n.º 3
0
        public static void DoorCode(CodeLock doorLock, BaseEntity.RPCMessage rpc)
        {
            if (!doorLock.IsLocked())
            {
                return;
            }

            /*DoorCodeEvent dc = new DoorCodeEvent(doorLock, rpc);
             * OnDoorCode.OnNext(dc);*/
        }
        private bool CanPlayerBypassLock(BasePlayer player, CodeLock codeLock)
        {
            if (!codeLock.IsLocked())
            {
                return(true);
            }

            object hookResult = Interface.CallHook("CanUseLockedEntity", player, codeLock);

            if (hookResult is bool)
            {
                return((bool)hookResult);
            }

            return(IsPlayerAuthorizedToCodeLock(player.userID, codeLock) || IsCodeLockSharedWithPlayer(player, codeLock));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Initialize locks in a building
        /// </summary>
        /// <param name="privilege"></param>
        private void InitializeMasterLock(BuildingPrivlidge privilege)
        {
            BaseEntity baseLock = privilege.GetSlot(BaseEntity.Slot.Lock);

            if (baseLock is CodeLock)
            {
                string code = (baseLock as CodeLock).code;

                BuildingManager.Building building = privilege.GetBuilding();
                foreach (BuildingBlock block in building.buildingBlocks)
                {
                    if (block.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (block.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (!codeLock.IsLocked())
                        {
                            codeLock.code = code;
                            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
                            foreach (ProtoBuf.PlayerNameID player in privilege.authorizedPlayers)
                            {
                                codeLock.whitelistPlayers.Add(player.userid);
                            }
                            codeLock.SendNetworkUpdateImmediate();
                        }
                    }
                }
                foreach (DecayEntity entity in building.decayEntities)
                {
                    if (entity.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (!codeLock.IsLocked())
                        {
                            codeLock.code = code;
                            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
                            foreach (ProtoBuf.PlayerNameID player in privilege.authorizedPlayers)
                            {
                                codeLock.whitelistPlayers.Add(player.userid);
                            }
                            codeLock.SendNetworkUpdateImmediate();
                        }
                    }
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Can use door hook - called when someone tries to use a door with a codelock
        /// </summary>
        /// <param name="player">the player who tried to use the door</param>
        /// <param name="door">the door in question</param>
        /// <returns>can we open the door</returns>
        bool CanUseDoor(BasePlayer player, CodeLock lck)
        {
            // reflect to get the private code
            var codeField = typeof(CodeLock).GetField("code",
                                                      BindingFlags.NonPublic |
                                                      BindingFlags.Instance);

            var codeValue = (string)codeField.GetValue(lck);

            // if it's not locked or the code isn't all 0s there's nothing for us to do
            if (!lck.IsLocked() || codeValue != "0000")
            {
                return(true);
            }

            var door        = (Door)lck.GetParentEntity();
            var doorId      = GetDoorId(door);
            var doorOwnerId = Convert.ToString(door.OwnerID);
            var playerId    = Convert.ToString(player.userID);

            if (!acl.ContainsKey(doorId))
            {
                acl[doorId] = new List <string>();
            }

            if (acl[doorId].IndexOf(doorOwnerId) > -1)
            {
                return(true);
            }
            else
            {
                if (pending2FA.IndexOf(doorId + playerId) == -1)
                {
                    pending2FA.Add(doorId + playerId);
                    GetRequest(doorOwnerId, doorId, playerId);
                }
                return(false);
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Called from <c>CodeLock.UnlockWithCode(BaseEntity.RPCMessage)</c>
        /// </summary>
        public static void On_DoorCodeEntered(CodeLock codeLock, BaseEntity.RPCMessage rpc)
        {
            if (!codeLock.IsLocked())
                return;

            string code = rpc.read.String();
            Pre<DoorCodeEvent> preDoorCodeEvent = new Pre<DoorCodeEvent>(codeLock, rpc.player, code);

            OnNext("Pre_DoorCodeEntered", preDoorCodeEvent);

            if (preDoorCodeEvent.IsCanceled || (!preDoorCodeEvent.Event.IsCorrect() && !preDoorCodeEvent.Event.ForceAllow)) {
                Effect.server.Run(codeLock.effectDenied.resourcePath, codeLock, 0u, Vector3.zero, Vector3.forward);
                rpc.player.Hurt(1f, global::Rust.DamageType.ElectricShock, codeLock, true);
                return;
            }

            Effect.server.Run(codeLock.effectUnlocked.resourcePath, codeLock, 0u, Vector3.zero, Vector3.forward);

            codeLock.SetFlag(BaseEntity.Flags.Locked, false);
            codeLock.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);

            List<ulong> whitelist = new List<ulong>();

            whitelist = (List<ulong>) codeLock.GetFieldValue("whitelistPlayers");

            if (!whitelist.Contains(rpc.player.userID)) {
                whitelist.Add(rpc.player.userID);
                codeLock.SetFieldValue("whitelistPlayers", whitelist);
            }

            OnNext("On_DoorCodeEntered", preDoorCodeEvent.Event);
        }
Ejemplo n.º 8
0
 public static void DoorCode(CodeLock doorLock, BaseEntity.RPCMessage rpc)
 {
     if (!doorLock.IsLocked())
         return;
     string code = rpc.read.String();
     DoorCodeEvent dc = new DoorCodeEvent(doorLock, rpc.player, code);
     OnDoorCode.OnNext(dc);
     if ((!dc.IsCorrect() || !dc.allowed) && !dc.forceAllow)
     {
         Effect.server.Run(doorLock.effectDenied, doorLock, 0u, Vector3.zero, Vector3.forward);
         rpc.player.Hurt(1f, Rust.DamageType.ElectricShock, doorLock, true);
         return;
     }
     Effect.server.Run(doorLock.effectUnlocked, doorLock, 0u, Vector3.zero, Vector3.forward);
     doorLock.SetFlag(BaseEntity.Flags.Locked, false);
     doorLock.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
     List<ulong> whitelist = new List<ulong>();
     whitelist = (List<ulong>)doorLock.GetFieldValue("whitelistPlayers");
     if (!whitelist.Contains(rpc.player.userID))
     {
         whitelist.Add(rpc.player.userID);
         doorLock.SetFieldValue("whitelistPlayers", whitelist);
     }
 }
Ejemplo n.º 9
0
 public bool IsLocked()
 {
     return(CodeLock != null && CodeLock.IsLocked());
 }