public async UniTaskVoid HandleRequestWithdrawUserGold(RequestHandlerData requestHandler, RequestWithdrawUserGoldMessage request, RequestProceedResultDelegate <ResponseWithdrawUserGoldMessage> result) { #if UNITY_STANDALONE && !CLIENT_BUILD IPlayerCharacterData playerCharacter; if (!GameInstance.ServerUserHandlers.TryGetPlayerCharacter(requestHandler.ConnectionId, out playerCharacter)) { result.InvokeError(new ResponseWithdrawUserGoldMessage() { message = UITextKeys.UI_ERROR_NOT_LOGGED_IN, }); return; } // Get gold AsyncResponseData <GoldResp> goldResp = await DbServiceClient.GetGoldAsync(new GetGoldReq() { UserId = playerCharacter.UserId }); if (!goldResp.IsSuccess) { result.InvokeError(new ResponseWithdrawUserGoldMessage() { message = UITextKeys.UI_ERROR_INTERNAL_SERVER_ERROR, }); return; } if (goldResp.Response.Gold - request.gold < 0) { result.InvokeError(new ResponseWithdrawUserGoldMessage() { message = UITextKeys.UI_ERROR_NOT_ENOUGH_GOLD_TO_WITHDRAW, }); return; } // Update gold AsyncResponseData <GoldResp> changeGoldResp = await DbServiceClient.ChangeGoldAsync(new ChangeGoldReq() { UserId = playerCharacter.UserId, ChangeAmount = -request.gold }); if (!changeGoldResp.IsSuccess) { result.InvokeError(new ResponseWithdrawUserGoldMessage() { message = UITextKeys.UI_ERROR_INTERNAL_SERVER_ERROR, }); return; } playerCharacter.UserGold = changeGoldResp.Response.Gold; playerCharacter.Gold = playerCharacter.Gold.Increase(request.gold); result.InvokeSuccess(new ResponseWithdrawUserGoldMessage()); #endif }