private void LandingGearOnStateChanged(bool state) { if (!state) { return; } var ship = _landingGear.GetTopMostParent(typeof(IMyCubeGrid)); if (ship == null) { return; } IMyPlayer player = null; foreach (var workingCockpit in _landingGear.CubeGrid.FindWorkingCockpits()) { player = MyAPIGateway.Players.GetPlayerControllingEntity(workingCockpit.Entity); if (player != null) { break; } } var attachedEntity = _landingGear.GetAttachedEntity() as IMyCubeGrid; if (attachedEntity == null) { return; } if (!ProtectionHandler.IsProtected(attachedEntity)) { return; } if (player == null) { _landingGear.ApplyAction("Unlock"); // we turn it off to prevent 'spamming' _landingGear.RequestEnable(false); return; } if (ProtectionHandler.CanModify(player, attachedEntity)) { return; } _landingGear.ApplyAction("Unlock"); // we turn it off to prevent 'spamming' _landingGear.RequestEnable(false); }
public override void UpdateBeforeSimulation() { if (_multiplayerActive && MyAPIGateway.CubeBuilder != null && MyAPIGateway.CubeBuilder.BlockCreationIsActivated && MyAPIGateway.Session.Player != null && MyAPIGateway.Session.Player.Controller.ControlledEntity != null) { if (ChatCommandLogic.Instance != null && !ChatCommandLogic.Instance.AllowBuilding) { MyAPIGateway.CubeBuilder.DeactivateBlockCreation(); MyAPIGateway.Utilities.ShowNotification( "Protection is not loaded yet so any building is not allowed. Please try again later.", 2000, MyFontEnum.Red); } else if (ProtectionHandler.Config.ProtectionEnabled) { var cubeGrid = Support.FindLookAtEntity(MyAPIGateway.Session.Player.Controller.ControlledEntity, true, false, false, false, false, false) as IMyCubeGrid; if (_cachedGrid == null || (_cachedGrid != null && cubeGrid != _cachedGrid)) { if (cubeGrid != null && MyAPIGateway.Session.Player != null) { // TODO consider permission request from server instead of client side check... downside: might take a while if (!ProtectionHandler.CanModify(MyAPIGateway.Session.Player, cubeGrid) && ProtectionHandler.IsProtected(cubeGrid)) { _cachedGrid = cubeGrid; Deactivate(); } } } else { Deactivate(); } } } else if (!_multiplayerActive && (_multiplayerActive != (MyAPIGateway.Session.OnlineMode != MyOnlineModeEnum.OFFLINE))) { // we need to update it because it is not correctly initialized if the cube placer is created when the game loads _multiplayerActive = MyAPIGateway.Session.OnlineMode != MyOnlineModeEnum.OFFLINE; } base.UpdateBeforeSimulation(); }
public void ReceiveDamage(int damage, Vector2 knockback, float noControlTime) { if (!owner.recentlyHit) { if (protectionHandler != null) { if (!protectionHandler.IsProtected(knockback)) { owner.TakeDamage(damage, noControlTime); } } else { owner.TakeDamage(damage, noControlTime); } owner.recentlyHit = true; } }
private void _cubeGrid_OnBlockOwnershipChanged(IMyCubeGrid cubeGrid) { // only execute on server instance if (ChatCommandLogic.Instance != null && ChatCommandLogic.Instance.ServerCfg == null) { return; } if (_firstOwnershipChange) { _firstOwnershipChange = false; _cachedOwners = new List <long>(cubeGrid.GetAllSmallOwners()); return; } var allSmallOwners = cubeGrid.GetAllSmallOwners(); if (_cachedOwners == allSmallOwners) { return; } // if the grid wasn't owned or a owner was removed, we dont need to do anything but update the cached owners if (_cachedOwners.Count == 0 || _cachedOwners.Count > allSmallOwners.Count) { _cachedOwners = new List <long>(allSmallOwners); return; } var newOwners = allSmallOwners.Except(_cachedOwners).ToList(); if (newOwners.Count == 0) { return; } if (!ProtectionHandler.IsProtected(cubeGrid)) { _cachedOwners = new List <long>(allSmallOwners); return; } Dictionary <long, int> blocksPerOwner = new Dictionary <long, int>(); foreach (IMyCubeGrid attachedCubeGrid in cubeGrid.GetAttachedGrids(AttachedGrids.Static)) { List <IMySlimBlock> blocks = new List <IMySlimBlock>(); attachedCubeGrid.GetBlocks(blocks, b => b.FatBlock != null); foreach (IMySlimBlock block in blocks) { long ownerId = block.FatBlock.OwnerId; // we dont want the new owners, the small owners or the 'nobody' (0) if (ownerId == 0 || !attachedCubeGrid.BigOwners.Contains(ownerId) || newOwners.Contains(ownerId)) { continue; } if (!blocksPerOwner.ContainsKey(ownerId)) { blocksPerOwner.Add(ownerId, 1); } else { blocksPerOwner[ownerId]++; } } } var sortedBpo = new List <KeyValuePair <long, int> >(blocksPerOwner.OrderBy(pair => pair.Value)); // if we cannot identify an owner we allow the change if (sortedBpo.Count == 0) { _cachedOwners = new List <long>(allSmallOwners); return; } var bigOwner = sortedBpo[0].Key; List <IMySlimBlock> ownershipChangedBlocks = new List <IMySlimBlock>(); cubeGrid.GetBlocks(ownershipChangedBlocks, b => b.FatBlock != null && newOwners.Contains(b.FatBlock.OwnerId)); foreach (IMySlimBlock slimBlock in ownershipChangedBlocks) { var block = (Sandbox.Game.Entities.MyCubeBlock)slimBlock.FatBlock; // TODO check if the block was created/built just moments ago, do not change owner otherwise block.ChangeOwner(bigOwner, MyOwnershipShareModeEnum.None); ConnectionHelper.SendMessageToAllPlayers(new MessageSyncBlockOwner() { OwnerId = bigOwner, EntityId = block.EntityId }); // no need to update the cached owners as we don't want them to change } // TODO maybe allow the faction to build... }
private void LandingGearOnStateChanged(bool state) { if (!state) { return; } //private void LandingGearOnLockModeChanged(IMyLandingGear myLandingGear, SpaceEngineers.Game.ModAPI.Ingame.LandingGearMode landingGearMode) //{ // if (landingGearMode != SpaceEngineers.Game.ModAPI.Ingame.LandingGearMode.Locked) // return; if (ProtectionHandler.Config == null || !ProtectionHandler.Config.ProtectionEnabled || ProtectionHandler.Config.ProtectionAllowLandingGear) { return; } var ship = _landingGear.GetTopMostParent(typeof(IMyCubeGrid)); if (ship == null) { return; } IMyPlayer player = null; foreach (var workingCockpit in _landingGear.CubeGrid.FindWorkingCockpits()) { player = MyAPIGateway.Players.GetPlayerControllingEntity(workingCockpit.Entity); if (player != null) { break; } } var attachedEntity = _landingGear.GetAttachedEntity() as IMyCubeGrid; if (attachedEntity == null) { return; } if (!ProtectionHandler.IsProtected(attachedEntity)) { return; } if (player == null) { _landingGear.Unlock(); // we turn it off to prevent 'spamming' _landingGear.Enabled = false; return; } if (ProtectionHandler.CanModify(player, attachedEntity)) { return; } _landingGear.Unlock(); // we turn it off to prevent 'spamming' _landingGear.Enabled = false; }