Esempio n. 1
0
    private void OnToggleAction(EntityUid uid, BlockingComponent component, ToggleActionEvent args)
    {
        if (args.Handled)
        {
            return;
        }

        foreach (var shield in _handsSystem.EnumerateHeld(args.Performer))
        {
            if (shield == uid)
            {
                continue;
            }
            if (TryComp <BlockingComponent>(shield, out var otherBlockComp) && otherBlockComp.IsBlocking)
            {
                CantBlockError(args.Performer);
                return;
            }
        }

        if (component.IsBlocking)
        {
            StopBlocking(uid, component, args.Performer);
        }
        else
        {
            StartBlocking(uid, component, args.Performer);
        }

        args.Handled = true;
    }
Esempio n. 2
0
 private void OnShutdown(EntityUid uid, BlockingComponent component, ComponentShutdown args)
 {
     //In theory the user should not be null when this fires off
     if (component.User != null)
     {
         _actionsSystem.RemoveProvidedActions(component.User.Value, uid);
         BlockingShutdownHelper(uid, component, component.User.Value);
     }
 }
Esempio n. 3
0
    private void OnGetActions(EntityUid uid, BlockingComponent component, GetItemActionsEvent args)
    {
        if (component.BlockingToggleAction == null &&
            _proto.TryIndex(component.BlockingToggleActionId, out InstantActionPrototype? act))
        {
            component.BlockingToggleAction = new(act);
        }

        if (component.BlockingToggleAction != null)
        {
            args.Actions.Add(component.BlockingToggleAction);
        }
    }
Esempio n. 4
0
    private void OnEquip(EntityUid uid, BlockingComponent component, GotEquippedHandEvent args)
    {
        component.User = args.User;

        //To make sure that this bodytype doesn't get set as anything but the original
        if (TryComp <PhysicsComponent>(args.User, out var physicsComponent) && physicsComponent.BodyType != BodyType.Static &&
            !TryComp <BlockingUserComponent>(args.User, out var blockingUserComponent))
        {
            var userComp = EnsureComp <BlockingUserComponent>(args.User);
            userComp.BlockingItem     = uid;
            userComp.OriginalBodyType = physicsComponent.BodyType;
        }
    }
Esempio n. 5
0
    /// <summary>
    /// Called where you want someone to stop blocking and to remove the <see cref="BlockingUserComponent"/> from them
    /// Won't remove the <see cref="BlockingUserComponent"/> if they're holding another blocking item
    /// </summary>
    /// <param name="uid"> The item the component is attached to</param>
    /// <param name="component"> The <see cref="BlockingComponent"/> </param>
    /// <param name="user"> The person holding the blocking item </param>
    private void BlockingShutdownHelper(EntityUid uid, BlockingComponent component, EntityUid user)
    {
        if (component.IsBlocking)
        {
            StopBlocking(uid, component, user);
        }

        foreach (var shield in _handsSystem.EnumerateHeld(user))
        {
            if (HasComp <BlockingComponent>(shield) && TryComp <BlockingUserComponent>(user, out var blockingUserComponent))
            {
                blockingUserComponent.BlockingItem = shield;
                return;
            }
        }

        RemComp <BlockingUserComponent>(user);
        component.User = null;
    }
Esempio n. 6
0
    /// <summary>
    /// Called where you want the user to stop blocking.
    /// </summary>
    /// <param name="item"> The entity with the blocking component</param>
    /// <param name="component"> The <see cref="BlockingComponent"/></param>
    /// <param name="user"> The entity who's using the item to block</param>
    /// <returns></returns>
    public bool StopBlocking(EntityUid item, BlockingComponent component, EntityUid user)
    {
        if (!component.IsBlocking)
        {
            return(false);
        }

        var xform = Transform(user);

        var shieldName = Name(item);

        var blockerName = Identity.Entity(user, EntityManager);
        var msgUser     = Loc.GetString("action-popup-blocking-disabling-user", ("shield", shieldName));
        var msgOther    = Loc.GetString("action-popup-blocking-disabling-other", ("blockerName", blockerName), ("shield", shieldName));

        //If the component blocking toggle isn't null, grab the users SharedBlockingUserComponent and PhysicsComponent
        //then toggle the action to false, unanchor the user, remove the hard fixture
        //and set the users bodytype back to their original type
        if (component.BlockingToggleAction != null && TryComp <BlockingUserComponent>(user, out var blockingUserComponent) &&
            TryComp <PhysicsComponent>(user, out var physicsComponent))
        {
            if (xform.Anchored)
            {
                _transformSystem.Unanchor(xform);
            }

            _actionsSystem.SetToggled(component.BlockingToggleAction, false);
            _fixtureSystem.DestroyFixture(physicsComponent, BlockingComponent.BlockFixtureID);
            physicsComponent.BodyType = blockingUserComponent.OriginalBodyType;
            _popupSystem.PopupEntity(msgUser, user, Filter.Entities(user));
            _popupSystem.PopupEntity(msgOther, user, Filter.Pvs(user).RemoveWhereAttachedEntity(e => e == user));
        }

        component.IsBlocking = false;

        return(true);
    }
Esempio n. 7
0
 private void OnUnequip(EntityUid uid, BlockingComponent component, GotUnequippedHandEvent args)
 {
     BlockingShutdownHelper(uid, component, args.User);
 }
Esempio n. 8
0
    /// <summary>
    /// Called where you want the user to start blocking
    /// Creates a new hard fixture to bodyblock
    /// Also makes the user static to prevent prediction issues
    /// </summary>
    /// <param name="uid"> The entity with the blocking component</param>
    /// <param name="component"> The <see cref="BlockingComponent"/></param>
    /// <param name="user"> The entity who's using the item to block</param>
    /// <returns></returns>
    public bool StartBlocking(EntityUid item, BlockingComponent component, EntityUid user)
    {
        if (component.IsBlocking)
        {
            return(false);
        }

        var xform = Transform(user);

        var shieldName = Name(item);

        var blockerName = Identity.Entity(user, EntityManager);
        var msgUser     = Loc.GetString("action-popup-blocking-user", ("shield", shieldName));
        var msgOther    = Loc.GetString("action-popup-blocking-other", ("blockerName", blockerName), ("shield", shieldName));

        if (component.BlockingToggleAction != null)
        {
            //Don't allow someone to block if they're in a container.
            if (_containerSystem.IsEntityInContainer(user) || !_mapManager.TryFindGridAt(xform.MapPosition, out var grid))
            {
                CantBlockError(user);
                return(false);
            }

            //Don't allow someone to block if someone else is on the same tile or if they're inside of a doorway
            var playerTileRef = xform.Coordinates.GetTileRef();
            if (playerTileRef != null)
            {
                var intersecting = _lookup.GetEntitiesIntersecting(playerTileRef.Value);
                var mobQuery     = GetEntityQuery <MobStateComponent>();
                var doorQuery    = GetEntityQuery <DoorComponent>();
                var xformQuery   = GetEntityQuery <TransformComponent>();

                foreach (var uid in intersecting)
                {
                    if (uid != user && mobQuery.HasComponent(uid) || xformQuery.GetComponent(uid).Anchored&& doorQuery.HasComponent(uid))
                    {
                        TooCloseError(user);
                        return(false);
                    }
                }
            }

            //Don't allow someone to block if they're somehow not anchored.
            _transformSystem.AnchorEntity(xform);
            if (!xform.Anchored)
            {
                CantBlockError(user);
                return(false);
            }
            _actionsSystem.SetToggled(component.BlockingToggleAction, true);
            _popupSystem.PopupEntity(msgUser, user, Filter.Entities(user));
            _popupSystem.PopupEntity(msgOther, user, Filter.Pvs(user).RemoveWhereAttachedEntity(e => e == user));
        }

        if (TryComp <PhysicsComponent>(user, out var physicsComponent))
        {
            var fixture = new Fixture(physicsComponent, component.Shape)
            {
                ID             = BlockingComponent.BlockFixtureID,
                Hard           = true,
                CollisionLayer = (int)CollisionGroup.WallLayer
            };

            _fixtureSystem.TryCreateFixture(physicsComponent, fixture);
        }

        component.IsBlocking = true;

        return(true);
    }