Ejemplo n.º 1
0
    private void RegisterOrder(BasePlayer player, VendingMachine vendingMachine)
    {
        if (pendingOrders == null)
        {
            pendingOrders = Facepunch.Pool.GetList <ProtoBuf.MarketTerminal.PendingOrder>();
        }
        if (HasPendingOrderFor(vendingMachine.net.ID))
        {
            return;
        }
        Marketplace entity;

        if (!_marketplace.TryGet(true, out entity))
        {
            Debug.LogError("Marketplace is not set", this);
            return;
        }
        uint num = entity.SendDrone(player, this, vendingMachine);

        if (num == 0)
        {
            Debug.LogError("Failed to spawn delivery drone");
            return;
        }
        ProtoBuf.MarketTerminal.PendingOrder pendingOrder = Facepunch.Pool.Get <ProtoBuf.MarketTerminal.PendingOrder>();
        pendingOrder.vendingMachineId = vendingMachine.net.ID;
        pendingOrder.timeUntilExpiry  = orderTimeout;
        pendingOrder.droneId          = num;
        pendingOrders.Add(pendingOrder);
        CheckForExpiredOrders();
        UpdateHasItems(false);
        SendNetworkUpdateImmediate();
    }
Ejemplo n.º 2
0
    public void Think()
    {
        _003C_003Ec__DisplayClass24_0 _003C_003Ec__DisplayClass24_ = default(_003C_003Ec__DisplayClass24_0);

        _003C_003Ec__DisplayClass24_._003C_003E4__this = this;
        if ((float)_sinceLastStateChange > stateTimeout)
        {
            Debug.LogError("Delivery drone hasn't change state in too long, killing", this);
            ForceRemove();
            return;
        }
        MarketTerminal entity;

        if (!sourceMarketplace.TryGet(true, out _003C_003Ec__DisplayClass24_.marketplace) || !sourceTerminal.TryGet(true, out entity))
        {
            Debug.LogError("Delivery drone's marketplace or terminal was destroyed, killing", this);
            ForceRemove();
            return;
        }
        VendingMachine entity2;

        if (!targetVendingMachine.TryGet(true, out entity2) && _state <= State.AscendBeforeReturn)
        {
            _003CThink_003Eg__SetState_007C24_7(State.ReturnToTerminal, ref _003C_003Ec__DisplayClass24_);
        }
        _003C_003Ec__DisplayClass24_.currentPosition = base.transform.position;
        float num = _003CThink_003Eg__GetMinimumHeight_007C24_1(Vector3.zero, ref _003C_003Ec__DisplayClass24_);

        if (_goToY.HasValue)
        {
            if (!_003CThink_003Eg__IsAtGoToY_007C24_6(ref _003C_003Ec__DisplayClass24_))
            {
                targetPosition = _003C_003Ec__DisplayClass24_.currentPosition.WithY(_goToY.Value);
                return;
            }
            _goToY = null;
            _sinceLastObstacleBlock = 0f;
            _minimumYLock           = _003C_003Ec__DisplayClass24_.currentPosition.y;
        }
        Vector3 waitPosition;

        switch (_state)
        {
        case State.Takeoff:
            _003CThink_003Eg__SetGoalPosition_007C24_3(_003C_003Ec__DisplayClass24_.marketplace.droneLaunchPoint.position + Vector3.up * 15f, ref _003C_003Ec__DisplayClass24_);
            if (_003CThink_003Eg__IsAtGoalPosition_007C24_4(ref _003C_003Ec__DisplayClass24_))
            {
                _003CThink_003Eg__SetState_007C24_7(State.FlyToVendingMachine, ref _003C_003Ec__DisplayClass24_);
            }
            break;

        case State.FlyToVendingMachine:
        {
            bool  isBlocked;
            float num2 = _003CThink_003Eg__CalculatePreferredY_007C24_0(out isBlocked, ref _003C_003Ec__DisplayClass24_);
            if (isBlocked && _003C_003Ec__DisplayClass24_.currentPosition.y < num2)
            {
                _003CThink_003Eg__SetGoToY_007C24_5(num2 + marginAbovePreferredHeight, ref _003C_003Ec__DisplayClass24_);
                return;
            }
            Vector3 descendPosition;
            config.FindDescentPoints(entity2, num2 + marginAbovePreferredHeight, out waitPosition, out descendPosition);
            _003CThink_003Eg__SetGoalPosition_007C24_3(descendPosition, ref _003C_003Ec__DisplayClass24_);
            if (_003CThink_003Eg__IsAtGoalPosition_007C24_4(ref _003C_003Ec__DisplayClass24_))
            {
                _003CThink_003Eg__SetState_007C24_7(State.DescendToVendingMachine, ref _003C_003Ec__DisplayClass24_);
            }
            break;
        }

        case State.DescendToVendingMachine:
        {
            Vector3 waitPosition2;
            config.FindDescentPoints(entity2, _003C_003Ec__DisplayClass24_.currentPosition.y, out waitPosition2, out waitPosition);
            _003CThink_003Eg__SetGoalPosition_007C24_3(waitPosition2, ref _003C_003Ec__DisplayClass24_);
            if (_003CThink_003Eg__IsAtGoalPosition_007C24_4(ref _003C_003Ec__DisplayClass24_))
            {
                _003CThink_003Eg__SetState_007C24_7(State.PickUpItems, ref _003C_003Ec__DisplayClass24_);
            }
            break;
        }

        case State.PickUpItems:
            _pickUpTicks++;
            if (_pickUpTicks >= pickUpDelayInTicks)
            {
                _003CThink_003Eg__SetState_007C24_7(State.AscendBeforeReturn, ref _003C_003Ec__DisplayClass24_);
            }
            break;

        case State.AscendBeforeReturn:
        {
            Vector3 descendPosition2;
            config.FindDescentPoints(entity2, num + preferredCruiseHeight, out waitPosition, out descendPosition2);
            _003CThink_003Eg__SetGoalPosition_007C24_3(descendPosition2, ref _003C_003Ec__DisplayClass24_);
            if (_003CThink_003Eg__IsAtGoalPosition_007C24_4(ref _003C_003Ec__DisplayClass24_))
            {
                _003CThink_003Eg__SetState_007C24_7(State.ReturnToTerminal, ref _003C_003Ec__DisplayClass24_);
            }
            break;
        }

        case State.ReturnToTerminal:
        {
            bool  isBlocked2;
            float num3 = _003CThink_003Eg__CalculatePreferredY_007C24_0(out isBlocked2, ref _003C_003Ec__DisplayClass24_);
            if (isBlocked2 && _003C_003Ec__DisplayClass24_.currentPosition.y < num3)
            {
                _003CThink_003Eg__SetGoToY_007C24_5(num3 + marginAbovePreferredHeight, ref _003C_003Ec__DisplayClass24_);
                return;
            }
            Vector3 vector = _003CThink_003Eg__LandingPosition_007C24_2(ref _003C_003Ec__DisplayClass24_);
            if (Vector3Ex.Distance2D(_003C_003Ec__DisplayClass24_.currentPosition, vector) < 30f)
            {
                vector.y = Mathf.Max(vector.y, num3 + marginAbovePreferredHeight);
            }
            else
            {
                vector.y = num3 + marginAbovePreferredHeight;
            }
            _003CThink_003Eg__SetGoalPosition_007C24_3(vector, ref _003C_003Ec__DisplayClass24_);
            if (_003CThink_003Eg__IsAtGoalPosition_007C24_4(ref _003C_003Ec__DisplayClass24_))
            {
                _003CThink_003Eg__SetState_007C24_7(State.Landing, ref _003C_003Ec__DisplayClass24_);
            }
            break;
        }

        case State.Landing:
            _003CThink_003Eg__SetGoalPosition_007C24_3(_003CThink_003Eg__LandingPosition_007C24_2(ref _003C_003Ec__DisplayClass24_), ref _003C_003Ec__DisplayClass24_);
            if (_003CThink_003Eg__IsAtGoalPosition_007C24_4(ref _003C_003Ec__DisplayClass24_))
            {
                _003C_003Ec__DisplayClass24_.marketplace.ReturnDrone(this);
                _003CThink_003Eg__SetState_007C24_7(State.Invalid, ref _003C_003Ec__DisplayClass24_);
            }
            break;

        default:
            ForceRemove();
            break;
        }
        if (_minimumYLock.HasValue)
        {
            if ((float)_sinceLastObstacleBlock > obstacleHeightLockDuration)
            {
                _minimumYLock = null;
            }
            else if (targetPosition.HasValue && targetPosition.Value.y < _minimumYLock.Value)
            {
                targetPosition = targetPosition.Value.WithY(_minimumYLock.Value);
            }
        }
    }