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); } }
/// <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); }
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); } }
public void Build(Vector3 spawnAt) { foreach (StructureComponent component in StructureComponents.Values) { Vector3 v3 = (component.LocalPosition.ToVector3() + spawnAt); BaseEntity ent = GameManager.server.CreateEntity(component.Prefab, v3, component.LocalRotation.ToQuaternion()); ent.SpawnAsMapEntity(); BuildingBlock bb = ent.GetComponent <BuildingBlock>(); bb.blockDefinition = PrefabAttribute.server.Find <Construction>(bb.prefabID); bb.grade = component.Grade; bb.health = component.Health; if (bb.HasSlot(BaseEntity.Slot.Lock)) { if (component.HasCodeLock) { BaseEntity baseEntity = GameManager.server.CreateEntity("build/locks/lock.code", Vector3.zero, new Quaternion()); baseEntity.OnDeployed(bb); if (!string.IsNullOrEmpty(component.LockCode)) { CodeLock codeLock = baseEntity.GetComponent <CodeLock>(); codeLock.SetFlag(BaseEntity.Flags.Locked, true); codeLock.SetFieldValue("code", component.LockCode); codeLock.SetFieldValue("whitelistPlayers", component.LockWList); } baseEntity.gameObject.Identity(); baseEntity.SetParent(bb, "lock"); baseEntity.Spawn(); bb.SetSlot(BaseEntity.Slot.Lock, baseEntity); } else if (component.HasKeyLock) { BaseEntity baseEntity = GameManager.server.CreateEntity("build/locks/lock.key", Vector3.zero, new Quaternion()); baseEntity.OnDeployed(bb); int code = int.Parse(component.LockCode); if ((code & 0x80) != 0) { KeyLock keyLock = baseEntity.GetComponent <KeyLock>(); keyLock.SetFieldValue("keycode", (code & 0x7F)); keyLock.SetFieldValue("firstKeyCreated", true); keyLock.SetFlag(BaseEntity.Flags.Locked, true); } baseEntity.gameObject.Identity(); baseEntity.SetParent(bb, "lock"); baseEntity.Spawn(); bb.SetSlot(BaseEntity.Slot.Lock, baseEntity); } } bb.SendNetworkUpdateImmediate(); } foreach (DeployableComponent component in DeployableComponents.Values) { Vector3 v3 = (component.LocalPosition.ToVector3() + spawnAt); BaseEntity ent = GameManager.server.CreateEntity(component.Prefab, v3, component.LocalRotation.ToQuaternion()); ent.SpawnAsMapEntity(); if (component.HasOwner) { SleepingBag sleepingBag = ent.GetComponent <SleepingBag>(); sleepingBag.deployerUserID = component.DeployedBy; sleepingBag.niceName = component.BagName; } else if (component.IsCupBoard) { BuildingPrivlidge buildingPrivlidge = ent.GetComponent <BuildingPrivlidge>(); buildingPrivlidge.authorizedPlayers = component.AuthedPlayers; } else if (component.HasStorage) { StorageContainer storageContainer = ent.GetComponent <StorageContainer>(); var items = component.ItemList; foreach (var item in items) { Item newItem = ItemManager.CreateByItemID((int)item["id"], (int)item["amount"], (bool)item["blueprint"]); newItem.MoveToContainer(storageContainer.inventory); } if (ent.HasSlot(BaseEntity.Slot.Lock)) { if (component.HasCodeLock) { BaseEntity baseEntity = GameManager.server.CreateEntity("build/locks/lock.code", Vector3.zero, new Quaternion()); baseEntity.OnDeployed(ent); if (!string.IsNullOrEmpty(component.LockCode)) { CodeLock codeLock = baseEntity.GetComponent <CodeLock>(); codeLock.SetFlag(BaseEntity.Flags.Locked, true); codeLock.SetFieldValue("code", component.LockCode); codeLock.SetFieldValue("whitelistPlayers", component.LockWList); } baseEntity.gameObject.Identity(); baseEntity.SetParent(ent, "lock"); baseEntity.Spawn(); ent.SetSlot(BaseEntity.Slot.Lock, baseEntity); } else if (component.HasKeyLock) { BaseEntity baseEntity = GameManager.server.CreateEntity("build/locks/lock.key", Vector3.zero, new Quaternion()); baseEntity.OnDeployed(ent); int code = int.Parse(component.LockCode); if ((code & 0x80) != 0) { KeyLock keyLock = baseEntity.GetComponent <KeyLock>(); keyLock.SetFieldValue("keycode", (code & 0x7F)); keyLock.SetFieldValue("firstKeyCreated", true); keyLock.SetFlag(BaseEntity.Flags.Locked, true); } baseEntity.gameObject.Identity(); baseEntity.SetParent(ent, "lock"); baseEntity.Spawn(); ent.SetSlot(BaseEntity.Slot.Lock, baseEntity); } } } else if (component.HasPainting) { Signage signage = ent.GetComponent <Signage>(); if (component.Painting != null) { byte[] painting = component.Painting; signage.textureID = FileStorage.server.Store(painting, FileStorage.Type.png, signage.net.ID); } if (component.PaintingLocked) { signage.SetFlag(BaseEntity.Flags.Locked, true); } signage.SendNetworkUpdate(); } ent.SendNetworkUpdateImmediate(); } foreach (SpawnableComponent component in SpawnableComponents.Values) { Vector3 v3 = (component.LocalPosition.ToVector3() + spawnAt); BaseEntity ent = GameManager.server.CreateEntity(component.Prefab, v3, component.LocalRotation.ToQuaternion()); ent.SpawnAsMapEntity(); ent.SendNetworkUpdateImmediate(); } }
public void ClearWhitelist() => codeLock.SetFieldValue("whitelistPlayers", new List <ulong>());