.Bind(ContentKeyFunctions.OpenCraftingMenu,
new PointerInputCmdHandler(HandleOpenCraftingMenu))
.Bind(EngineKeyFunctions.Use,
- new PointerInputCmdHandler(HandleUse))
+ new PointerInputCmdHandler(HandleUse, outsidePrediction: true))
.Register<ConstructionSystem>();
SubscribeLocalEvent<ConstructionGhostComponent, ExaminedEvent>(HandleConstructionGhostExamined);
public override bool DropPart(EntityUid? partId, BodyPartComponent? part = null)
{
- var oldBody = CompOrNull<BodyPartComponent>(partId)?.Body;
+ if (partId == null || !Resolve(partId.Value, ref part))
+ return false;
if (!base.DropPart(partId, part))
return false;
+ var oldBody = part.Body;
if (oldBody == null || !TryComp<HumanoidAppearanceComponent>(oldBody, out var humanoid))
return true;
SubscribeLocalEvent<ConstructionComponent, ConstructionInteractDoAfterEvent>(EnqueueEvent);
// Event handling. Add your subscriptions here! Just make sure they're all handled by EnqueueEvent.
- SubscribeLocalEvent<ConstructionComponent, InteractUsingEvent>(EnqueueEvent, new []{typeof(AnchorableSystem), typeof(EncryptionKeySystem)});
+ SubscribeLocalEvent<ConstructionComponent, InteractUsingEvent>(EnqueueEvent, new []{typeof(AnchorableSystem)}, new []{typeof(EncryptionKeySystem)});
SubscribeLocalEvent<ConstructionComponent, OnTemperatureChangeEvent>(EnqueueEvent);
}
private bool TryCut(EntityUid toolEntity, EntityUid user, LatticeCuttingComponent component, EntityCoordinates clickLocation)
{
- if (!_mapManager.TryGetGrid(clickLocation.GetGridUid(EntityManager), out var mapGrid))
+ if (!_mapManager.TryFindGridAt(clickLocation.ToMap(EntityManager, _transformSystem), out var mapGrid))
return false;
var tile = mapGrid.GetTileRef(clickLocation);
|| tile.IsBlockedTurf(true))
return false;
- var ev = new LatticeCuttingCompleteEvent(clickLocation);
+ var ev = new LatticeCuttingCompleteEvent(coordinates);
return UseTool(toolEntity, user, toolEntity, component.Delay, component.QualityNeeded, ev);
}
}
if (!TryComp<ToolComponent?>(toolEntity, out var tool) && component.ToolComponentNeeded)
return false;
- if (!_mapManager.TryGetGrid(clickLocation.GetGridUid(EntityManager), out var mapGrid))
+ if (!_mapManager.TryFindGridAt(clickLocation.ToMap(EntityManager, _transformSystem), out var mapGrid))
return false;
var tile = mapGrid.GetTileRef(clickLocation);
if (!tileDef.CanCrowbar)
return false;
- var ev = new TilePryingDoAfterEvent(clickLocation);
+ var ev = new TilePryingDoAfterEvent(coordinates);
return UseTool(toolEntity, user, toolEntity, component.Delay, component.QualityNeeded, ev, toolComponent: tool);
}
return true;
}
- public virtual bool DropPart(EntityUid? partId, [NotNullWhen(true)] BodyPartComponent? part = null)
+ public virtual bool DropPart(EntityUid? partId, BodyPartComponent? part = null)
{
if (partId == null ||
!Resolve(partId.Value, ref part, false) ||
if (!coordinates.IsValid(entityManager))
return null;
-
mapManager ??= IoCManager.Resolve<IMapManager>();
-
- if (!mapManager.TryGetGrid(coordinates.GetGridUid(entityManager), out var grid))
+ var pos = coordinates.ToMap(entityManager, entityManager.System<SharedTransformSystem>());
+ if (!mapManager.TryFindGridAt(pos, out var grid))
return null;
-
if (!grid.TryGetTileRef(coordinates, out var tile))
return null;
_hands.PickupOrDrop(args.User, ent);
}
- // if tool use ever gets predicted this needs changing.
- _popup.PopupEntity(Loc.GetString("encryption-keys-all-extracted"), uid, args.User);
- _audio.PlayPvs(component.KeyExtractionSound, uid);
+ if (!_timing.IsFirstTimePredicted)
+ return;
+
+ // TODO add predicted pop-up overrides.
+ if (_net.IsServer)
+ _popup.PopupEntity(Loc.GetString("encryption-keys-all-extracted"), uid, args.User);
+ _audio.PlayPredicted(component.KeyExtractionSound, uid, args.User);
}
public void UpdateChannels(EntityUid uid, EncryptionKeyHolderComponent component)
private void OnInteractUsing(EntityUid uid, EncryptionKeyHolderComponent component, InteractUsingEvent args)
{
- if ( args.Handled || !TryComp<ContainerManagerComponent>(uid, out var storage))
+ if (args.Handled)
return;
if (HasComp<EncryptionKeyComponent>(args.Used))
args.Handled = true;
TryInsertKey(uid, component, args);
}
- else if (TryComp<ToolComponent>(args.Used, out var tool) && tool.Qualities.Contains(component.KeysExtractionMethod))
+ else if (TryComp<ToolComponent>(args.Used, out var tool)
+ && tool.Qualities.Contains(component.KeysExtractionMethod)
+ && component.KeyContainer.ContainedEntities.Count > 0) // dont block deconstruction
{
args.Handled = true;
TryRemoveKey(uid, component, args, tool);
var results = _physics.IntersectRay(locationMap.MapId, ray, dir.Length, returnOnFirstHit: true);
canAccessCenter = !results.Any();
}
-
+
// if user can access tile center then they can place floor
// otherwise check it isn't blocked by a wall
if (!canAccessCenter)
}
else if (HasBaseTurf(currentTileDefinition, ContentTileDefinition.SpaceID))
{
+ if (!_stackSystem.Use(uid, 1, stack))
+ continue;
+
+ args.Handled = true;
+ if (_netManager.IsClient)
+ return;
+
mapGrid = _mapManager.CreateGrid(locationMap.MapId);
var gridXform = Transform(mapGrid.Owner);
_transform.SetWorldPosition(gridXform, locationMap.Position);
location = new EntityCoordinates(mapGrid.Owner, Vector2.Zero);
PlaceAt(args.User, mapGrid, location, _tileDefinitionManager[component.OutputTiles[0]].TileId, component.PlaceTileSound, mapGrid.TileSize / 2f);
- args.Handled = true;
return;
}
}