private void OnStartPlacementAction(StartPlacementActionEvent args) { if (args.Handled) { return; } args.Handled = true; _placementMan.BeginPlacing(new() { EntityType = args.EntityType, IsTile = args.TileId != null, TileType = args.TileId != null ? _tileMan[args.TileId].TileId : (ushort)0, PlacementOption = args.PlacementOption, }); if (_placementMan.Eraser != args.Eraser) { _placementMan.ToggleEraser(); } }
/// <summary> /// This checks if the placement manager is currently active, and attempts to copy the placement information for /// some entity or tile into an action. This is somewhat janky, but it seem to work well enough. Though I'd /// prefer if it were to function more like DecalPlacementSystem. /// </summary> private void OnFillActionSlot(FillActionSlotEvent ev) { if (!_placementMan.IsActive) { return; } if (ev.Action != null) { return; } var actionEvent = new StartPlacementActionEvent(); ITileDefinition?tileDef = null; if (_placementMan.CurrentPermission != null) { actionEvent.EntityType = _placementMan.CurrentPermission.EntityType; actionEvent.PlacementOption = _placementMan.CurrentPermission.PlacementOption; if (_placementMan.CurrentPermission.IsTile) { tileDef = _tileMan[_placementMan.CurrentPermission.TileType]; actionEvent.TileId = tileDef.ID; } } else if (_placementMan.Eraser) { actionEvent.Eraser = true; } else { return; } if (tileDef != null) { if (tileDef is not ContentTileDefinition contentTileDef) { return; } var tileIcon = contentTileDef.IsSpace ? _spaceIcon : new SpriteSpecifier.Texture(new ResourcePath(tileDef.Path) / $"{tileDef.SpriteName}.png"); ev.Action = new InstantAction() { CheckCanInteract = false, Event = actionEvent, Name = tileDef.Name, Icon = tileIcon }; return; } if (actionEvent.Eraser) { ev.Action = new InstantAction() { CheckCanInteract = false, Event = actionEvent, Name = "action-name-mapping-erase", Icon = _deleteIcon, }; return; } if (string.IsNullOrWhiteSpace(actionEvent.EntityType)) { return; } ev.Action = new InstantAction() { CheckCanInteract = false, Event = actionEvent, Name = actionEvent.EntityType, Icon = new SpriteSpecifier.EntityPrototype(actionEvent.EntityType), }; }