app_map.dart 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import 'dart:convert';
  2. import 'dart:ui';
  3. import 'package:dio/dio.dart';
  4. import 'package:f_cache/f_cache.dart';
  5. import 'package:trackoffical_app/appcore/map_package.dart';
  6. import 'package:trackoffical_app/model/game_map.dart';
  7. import '../logger.dart';
  8. import '../model/m_net_image.dart';
  9. import 'api.dart' as api;
  10. import '../appcore/ffi.dart' as ffi;
  11. extension GameMapExtension on GameMap{
  12. Future<void> loadMemory({
  13. required ProgressCallback onReceiveProgress
  14. }) async{
  15. if (isLoaded){
  16. return;
  17. }
  18. final image = MNetImage()
  19. ..md5=md5
  20. ;
  21. // data = await image.loadMemory(onReceiveProgress: onReceiveProgress);
  22. // debug('[加载地图](${image.md5Hex}) \n文件类型:${image.ext}\n 文件大小${data?.length}');
  23. final r = await CacheManager().getCached( id: image.md5Hex!, onProcess: onReceiveProgress, readerBuilder: () async{
  24. final bin = await api.ApiService.to.getBinReaderByMd5(md5);
  25. final reader = bin.reader;
  26. reader.meta['nonce']=bin.nonce;
  27. reader.ext=bin.ext;
  28. return bin.reader;
  29. });
  30. data = r.data;
  31. image.ext = r.ext??'';
  32. final nonceStr = r.meta['nonce']??'';
  33. final nonce = base64Decode(nonceStr);
  34. debug('解密地图');
  35. data=await ffi.Crypto(bridge: ffi.api).decrypt(nonce: nonce, data: data!);
  36. info('解密成功');
  37. debug('[加载地图](${image.md5Hex}) \n文件类型:${image.ext}\n 文件大小${data?.length}');
  38. if(image.ext != 'zip'){
  39. throw const FormatException('不是zip');
  40. }
  41. final mp = MapPackage();
  42. await mp.loadMemory(data!);
  43. final size = await mp.dstSize;
  44. pic = await mp.mapImageData;
  45. debug('[加载地图]解压完成');
  46. data = null;
  47. height = size.height;
  48. width = size.width;
  49. mapPackage = mp;
  50. const p0Src = Offset(0, 0);
  51. final p1Src = Offset(width, 0);
  52. final mapTopLeftLocation = await pixelToWorld(p0Src);
  53. final mapTopRightLocation = await pixelToWorld(p1Src);
  54. mapWidth = mapTopLeftLocation.distance(mapTopRightLocation);
  55. isLoaded = true;
  56. debug('[加载地图] 加载完成\n尺寸: ($width, $height)\n宽度:$mapWidth');
  57. return;
  58. }
  59. }