@Override protected EventHandler<MouseEvent> getAction() { return mouseEvent -> { Optional<ITradingOffice> office = getPlayer().findTradingOffice(getCity()); Preconditions.checkArgument(office.isPresent(), "Trading office must be present"); for (EWare ware : MATERIALS) { int buyAmount = requirementsMap.get(ware).getBuyAmount().intValue(); getCity().move(ware, -buyAmount, getPlayer()); int needed = shipFactory.getUpgradeAmount(currentShip.get().getShipType(), ware); int fromWarhouse = needed - buyAmount; office.get().move(ware, -fromWarhouse, 0); } ShipyardOrderRefit event = new ShipyardOrderRefit(getCity().getCityState().getShipyardState(),currentShip.get(), currentShip.get().getShipUpgradeLevel().nextLevel(), city); clientServerEventBus.post(event); city.getPlayersShips().remove(currentShip.get()); getPlayer().getCompany().updateCash(-calculateTotalUpgradeCosts()); executeOnCloseButtonClicked(); }; }