/// <summary> /// Used for open close logic /// </summary> public override void UpdateAfterSimulation10() { frameMod = (short)((frameMod + 1) % 3); if (frameMod > 0) { return; } if (myDoor == null) { return; } if (!myDoor.IsFunctional || !myDoor.IsWorking) { return; } //LogMessage("Looking for CustomName", false); string myName = myDoor.CustomName; if (_LastCustomName != myName) { _LastCustomName = myName; _IsActive = myName != null && myName.Contains("AutoDoor"); if (_IsActive) { int idx = myName.LastIndexOf('-'); if (idx >= 0 && idx + 1 < myName.Length) { string partialName = myName.Substring(idx + 1); float newDistValue = _DefaultDistValue; // try to parse it if (float.TryParse(partialName, out newDistValue)) { distValue = newDistValue; } else { distValue = _DefaultDistValue; } } else { distValue = _DefaultDistValue; } } } if (!_IsActive) { return; } // cache the block position var myWM = myDoor.WorldMatrix; var myBB = myDoor.LocalAABB; var minVec = myBB.Min; var maxVec = myBB.Max; minVec.Z -= distValue; maxVec.Z += distValue; //minVec.X = 0; //maxVec.X = 0; minVec.Y -= 0.05f; maxVec.Y = 0; myBB.Min = minVec; myBB.Max = maxVec; var myBackBB = myBB; myBB = myBB.Transform(ref myWM); // result if any player is within range bool playerInRange = false; //LogMessage("Got to player list lookup!", false); List <IMyPlayer> players = new List <IMyPlayer>(); // check to make sure players exist and then find all the players if (MyAPIGateway.Multiplayer != null && MyAPIGateway.Multiplayer.Players != null) { MyAPIGateway.Multiplayer.Players.GetPlayers(players); } //Base6Directions.Direction pForward = Base6Directions.Direction.Up; // look through for players in that are in range foreach (var player in players) { // check that there is a valid character if (player.PlayerCharacter == null) { continue; } // get there position var charPosition = player.PlayerCharacter.Entity.GetPosition(); //if( (myDoor.GetPosition() - charPosition).Length() < 10 ) { // LogMessage(myBackBB.ToString(), true); // LogMessage(myBB.ToString(), true); //} var result = myBB.Contains(charPosition); bool inRange = result == ContainmentType.Contains; //distVec.Length() <= distValue; //LogMessage(string.Format("inRange was {0}", inRange), true); if (!inRange) { continue; } //LogMessage(string.Format("Cen {0}", myBB.Center), true); //LogMessage(string.Format("Min {0}", myBB.Min), true); //LogMessage(string.Format("Max {0}", myBB.Max), true); // check for acces, we only open for friendlys if (!myDoor.HasPlayerAccess(player.PlayerId)) { continue; } //var charWM = player.PlayerCharacter.Entity.WorldMatrix; //pForward = Base6Directions.GetForward(ref charWM); //var dir = myWM.GetClosestDirection(distVec); // result //bool inOri = (pForward == myForward || pForward == myBackward);//&&(dir != Base6Directions.Direction.Up && dir != Base6Directions.Direction.Down); playerInRange = inRange; //&& inOri; if (playerInRange) { break; } } //LogMessage(string.Format("playerInRange was {0} and DoorState was {1}", playerInRange,_DoorState), false); if (toggleAction == null && !SetupToggleAction()) { return; } if (!playerInRange && _DoorState == _DoorOpen) { MyAPIGateway.Utilities.ShowNotification(string.Format("Closing {0}", (Entity as Sandbox.ModAPI.Ingame.IMyTerminalBlock).DisplayNameText), 1000, MyFontEnum.Red); toggleAction.Apply(myDoorBlock); } if (playerInRange && _DoorState == _DoorClosed) { MyAPIGateway.Utilities.ShowNotification(string.Format("Opening {0}", (Entity as Sandbox.ModAPI.Ingame.IMyTerminalBlock).DisplayNameText), 1000, MyFontEnum.Red); toggleAction.Apply(myDoorBlock); } }