DNF下载提取提取游戏客户端资源源文件的时候突...

6299人阅读
IOS游戏开发(43)
& & & Dnf资源包格式分析,参考的是这篇文章:http://blog.csdn.net/leexuany/article/details/3849051
& & & 提取工具的代码我放到github上了:/langresser/dnfextrator
& & & 虽然上文已经有比较详尽的分析了,但是真正实现好一个资源提取工具还是花了我两天的时间。这里把需要注意的地方记录下来。
1、npk包的格式:
struct NPK_Header
char flag[16]; // 文件标识 &NeoplePack_Bill&
// 包内文件的数目
struct NPK_Index
// 文件的包内偏移量
// 文件的大小
char name[256];// 文件名
char decord_flag[256] = &puchikon@neople dungeon and fighter DNF&;
解npk包非常好处理,读取完NPK_Header紧接着根据里面的count数目循环读取NPK_Index,读取完毕后,就可以根据里面的offset定位到指定位置读取img文件。现在的dnf包npk包内的文件名是加密过的,要用decord_flag异或NPK_Index中的name才能获取实际文件名。decord_flag总共有256个字节,剩余部分用&DNF&三个字母填满,最后一个字节置0。读取文件名时可以像这样解密:
char temp[256] = {0};
fread(temp, 256, 1, fp);
for (int i = 0; i & 256; ++i) {
index.name[i] = temp[i] ^ decord_flag[i];
2、img文件格式:
struct NImgF_Header
char flag[16]; // 文件标石&Neople Img File&
int index_ // 索引表大小,以字节为单位
int unknown1;
int unknown2;
int index_// 索引表数目
struct NImgF_Index
unsigned int dwT //目前已知的类型有 0x0E(1555格式) 0x0F(4444格式) 0x10(8888格式) 0x11(不包含任何数据,可能是指内容同上一帧)
unsigned int dwC // 目前已知的类型有 0x06(zlib压缩) 0x05(未压缩)
// 压缩时size为压缩后大小,未压缩时size为转换成8888格式时占用的内存大小
int key_x;
// X关键点,当前图片在整图中的X坐标
int key_y;
// Y关键点,当前图片在整图中的Y坐标
// 整图的宽度
// 整图的高度,有此数据是为了对齐精灵
img文件也是一系列图片的合集,它里面还包含很多有用的信息,比如图片的坐标(用于对齐),这个数据是我们想正常使用这个图片所必须的。也正是由于现有的工具都没有提供方便的批量导出和该数据的处理功能,我才想自己写个提取工具的。
img文件是由一个header+多个连续的索引表+实际图片数据组成的。读取图片数据需要跳过header(固定大小)和索引表(header.index_size标识)。
我们读取的文件大小是由NImgF_Index.size决定的,如果dwCompress为6则表示图片有经过zlib压缩,这时size表示压缩后大小。如果为5表示没有压缩,这时size表示转换成;式所占内存大小(也就是说,如果dwType为0x0e或是0x0f,size要除2)
如果有压缩,需要zlib解压:
int ret = uncompress(temp_zlib_data, &zlib_len, temp_file_data, size);注意,temp_zlib_data是一个足够大的缓存区,zlib_len传入的是缓存区的大小。
读取完的数据是图片像素数据,接下来要写入到png图片中(看个人需要bmp什么的也可以)
libpng的使用(包含颜色格式之间的转换代码):
FILE *fp = fopen(file_name, &wb&);
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr);
if (setjmp(png_jmpbuf(png_ptr)))
printf(&[write_png_file] Error during init_io&);
png_init_io(png_ptr, fp);
/* write header */
if (setjmp(png_jmpbuf(png_ptr)))
printf(&[write_png_file] Error during writing header&);
png_set_IHDR(png_ptr, info_ptr, width, height,
8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_write_info(png_ptr, info_ptr);
/* write bytes */
if (setjmp(png_jmpbuf(png_ptr)))
printf(&[write_png_file] Error during writing bytes&);
row_pointers = (png_bytep*)malloc(height*sizeof(png_bytep));
for(int i = 0; i & i++)
row_pointers[i] = (png_bytep)malloc(sizeof(unsigned char)* 4 * width);
for(int j = 0; j & ++j)
// png is rgba
switch (type)
case ARGB_1555://1555
row_pointers[i][j * 4 + 0] = ((data[i * width * 2 + j * 2 + 1] & 127) && 2) && 3;
row_pointers[i][j * 4 + 1] = (((data[i * width * 2 + j * 2 + 1] & 0x0003) && 3) | ((data[i * width * 2 + j * 2] && 5) & 0x0007)) && 3; // green
row_pointers[i][j * 4 + 2] = (data[i * width * 2 + j * 2] & 0x003f) && 3; // blue
row_pointers[i][j * 4 + 3] = (data[i * width * 2 + j * 2 + 1] && 7) == 0 ? 0 : 255; // alpha
case ARGB_4444://4444
row_pointers[i][j * 4 + 0] = (data[i * width * 2 + j * 2 + 1] & 0x0f) && 4;
row_pointers[i][j * 4 + 1] = ((data[i * width * 2 + j * 2 + 0] & 0xf0) && 4) && 4; // green
row_pointers[i][j * 4 + 2] = (data[i * width * 2 + j * 2 + 0] & 0x0f) && 4;; // blue
row_pointers[i][j * 4 + 3] = ((data[i * width * 2 + j * 2 + 1] & 0xf0) && 4) && 4; // alpha
case ARGB_8888://8888
row_pointers[i][j * 4 + 0] = data[i * width * 4 + j * 4 + 2]; // red
row_pointers[i][j * 4 + 1] = data[i * width * 4 + j * 4 + 1]; // green
row_pointers[i][j * 4 + 2] = data[i * width * 4 + j * 4 + 0]; // blue
row_pointers[i][j * 4 + 3] = data[i * width * 4 + j * 4 + 3]; // alpha
case ARGB_NONE:// 占位,无图片资源
printf(&error known type:%d\n&, type);
png_write_image(png_ptr, row_pointers);
/* end write */
if (setjmp(png_jmpbuf(png_ptr))) {
printf(&[write_png_file] Error during end of write&);
png_write_end(png_ptr, NULL);
// 别忘记释放内存
png_destroy_write_struct(&png_ptr, &info_ptr);
/* cleanup heap allocation */
for (int j=0; j & j++)
free(row_pointers[j]);
free(row_pointers);
fclose(fp);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:811592次
积分:10455
积分:10455
排名:第1112名
原创:193篇
转载:72篇
评论:491条
(5)(1)(2)(1)(2)(3)(2)(1)(1)(2)(4)(2)(2)(1)(9)(2)(3)(7)(8)(6)(10)(5)(8)(3)(7)(5)(3)(2)(1)(3)(7)(3)(7)(10)(1)(1)(11)(26)(25)(14)(2)(2)(1)(10)(4)(1)(1)(1)(2)(1)(11)(3)(2)(1)(2)(3)(2)(2)(1)刚下载的DNF***不了。刚下载玩。双击。然后出现了正在提取客户端 - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
刚下载的DNF***不了。
玩。双击。然后出现了正在提取客户端资源文件什么什么的,。到100% 就不见了。也不显示东西出来。到底是怎么回事?
您的举报已经提交成功,我们将尽快处理,谢谢!
虽然是正常退出游戏了,但是实际上在进程里仍然存在原来打开游戏的进程.解决方法很简单,如果出现你这种情况,打开“任务管理器”(Ctrl+Alt+Del)选择“进程...
建议重新下载客户端
一般游戏出现数据错误时,因为其本身游戏自身数据包错误或者跟你电脑的配置不符。
你家是什么网(电信或网通)就去什么区玩 电信(网通)用户在网通(电信)区玩很卡,还有,杀毒软件关掉试试,DNF对CPU要求也很高(虽然是2D游戏)
还有,用...
那就等它修复完啊,你都***补丁了肯定要修复的啊。
大家还关注欢迎访问往前方博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入往前方百度口碑求点赞啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊新版往前方影院 原藏藏影院重新开启欢迎围观分享IT江湖那些趣事,那些牛人传说,那些稀奇古怪的网站,那些爱不释手的应用软件!如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏往前方吧往前方的推荐:每日更新.帮助广大网友各位小伙伴买到更有性价比商品欢迎买买买
您的浏览器不支持HTML5的 video 标签,无法为您播放!&/player.php/sid/XMTQ3NjMzNzE4NA==/v.swf↑↑↑复制链接观看版本演示视频↑↑↑只支持win7 64系统,xp、win8和win10版本介绍:日更新真正95级商业服务端。DNF地下城与勇士单机版,最高95级,虚拟机镜像一键启动,带视频***教程,一键完成任务。好评赠送配套GM工具、辅助,可修改点券金钱金币、发送物品、装备等,DNF单机版95级版,时空之门、镇魂、单人异界、发电厂全都有
开放鬼剑士全职业二觉技能。完美商城,完美金币点券购买。后续更新不断!!经常没有频道?掉线?D币D点修改无效?部分任务BUG闪退?竞技场、拍卖寄售都打不开?BUG一大推。。。。&&&真正的好端来了!&&——-7月31更新内容(迟到的更新)——-添加三国套装,三国BOSS有几率掉落 高级地图门票代码更新为 9158123
需要自己用GM工具刷出来高级地图移动至格兰之森山脉更新《女鬼剑士》(修改黑暗武士)&添加女鬼皮肤(赛利亚出售)添加安图恩《黑色火山》地图添加安图恩《擎天之柱》地图添加发电站《赫拉斯研究所》地图添加三国《突围长坂坡》地图添加三国《襄阳攻城战》地图修复《黑雾之源》修复内容:地图调整、怪物调整、吞噬者技能修复、BOSS技能修复、开启深渊模式修复《巨龙盘踞之地》修复内容:地图更完美、怪物调整、开启深渊模式添加《光明圣麒麟》宠物添加《青冥圣麒麟》宠物添加《猛将张飞》宠物添加《武圣关羽》宠物添加《贤君刘备》宠物修复***手VIP武器无减CD问题爆率调整修改龙女属性问题添加安图恩《黑雾之源》地图添加黑雾之源BOSS爆星级武器添加《黑雾之源-鬼剑星级武器》(可升星提升属性)、其他职业后期陆续开放添加歌兰蒂斯出售升星图纸添加VIP《腾讯总部》地图修复巨龙副本BOSS不爆VIP装备问题修复巨龙副本图片添加《吞噬魔战袍》SS套添加黑雾之源吞噬魔爆 吞噬魔战袍添加鬼剑士《火影忍者-鸣人》皮肤其他安图恩后续开放&&&还有大量更新内容请您进入游戏体验!& ——-3月15更新内容——-由于95会导致异界不爆装备、等级上限调回86级增加四个噩梦特色副本(在洛兰、爆增幅券)更新赛利亚的幸运礼盒(体验国服开盒子感觉、商城出售)更新幸运魔锤(开盒子专用)更新VIP超级礼盒(高级怪物爆、可开出VIP装备、VIP称号、特色防具套、矛盾)更新幸运大礼包(高级怪物爆、可开出ss罐子兑换物品、属性石头罐子、矛盾)更新升级券可直接升到86级(之前只能到70级)更新异界3件有9件效果(1件有3件效果、2件有6件修改、3件有9件效果)修复发电站声音蛋糕店添加出售各角色VIP武器爆率下调&下次更新添加武器、皮肤|
:密码: fcqa往前方 , 版权所有丨如未注明 , 均为原创丨本网站采用协议进行授权 , 转载请注明!
专注网络资源,分享最具价值内容!热爱互联网,痴迷于和计算机网络有关的一切事物。职业介绍 |
新手必读 |
您当前的位置:
DNF游戏突然消失解决方案_客户端消失解决方法
DNF游戏突然消失解决方案_客户端消失解决方法
DNF客户端经常无故消失这个情况让玩家很头疼,在这里放出一个小攻略,让大家可以调整到最佳模式,杜绝客户端消失
  这几天发现很多玩家说啊,登录DNF账号后,进入选择频道前的那个loading女鬼剑画面的时候,右下角的本地连接会消失,或者是中断,查毒什么的都没办法解决。
  下面这是解决办法。。
  是CrossProxy.exe这个程序在干扰,禁止后就不会自动打开了,也不会让本地连接自动关闭了!
  首先找到dnf文件夹 搜索CrossProxy 第一个
  启动游戏自动启动CrossProxy.exe,如果删除或者换名,游戏会在登陆界面自动更新回来,如果是开着游戏关闭它,你会发现打不了字,,解决办法如下:
  右键CrossProxy.exe属性-安全-编辑,把里面所有的用户名或用户组都改为下面这样,你会发现登陆DNF不会再出现CrossProxy.exe 。)
  这样就可以了,个别玩家现象,我也是看别人知道的~~
看完这篇新闻有何感觉?已经有 - 人表态。
10-1510-1510-1510-1410-1210-12

参考资料

 

随机推荐