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(); }
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); } } }