jw3gparser

Java解析《魔兽争霸3》游戏录像工具,可解析w3g、nwg(网易对战平台录像)格式录像。

使用方法

public class Test {

public static void main(String[] args) throws IOException, W3GException, DataFormatException {

Replay replay = new Replay(new File("d:/wucao/Desktop/151020_[UD]LuciferLNMS_VS_[NE]checkuncle_Amazonia_RN.w3g"));

Header header = replay.getHeader();

System.out.println("版本:1." + header.getVersionNumber() + "." + header.getBuildNumber());

long duration = header.getDuration();

System.out.println("时长:" + convertMillisecondToString(duration));

UncompressedData uncompressedData = replay.getUncompressedData();

System.out.println("游戏名称:" + uncompressedData.getGameName());

System.out.println("游戏创建者:" + uncompressedData.getCreaterName());

System.out.println("游戏地图:" + uncompressedData.getMap());

List list = uncompressedData.getPlayerList();

for(Player player : list) {

System.out.println("---玩家" + player.getPlayerId() + "---");

System.out.println("玩家名称:" + player.getPlayerName());

if(player.isHost()) {

System.out.println("是否主机:主机");

} else {

System.out.println("是否主机:否");

}

System.out.println("游戏时间:" + convertMillisecondToString(player.getPlayTime()));

System.out.println("操作次数:" + player.getAction());

System.out.println("APM:" + player.getAction() * 60000 / player.getPlayTime());

if(!player.isObserverOrReferee()) {

System.out.println("玩家队伍:" + (player.getTeamNumber() + 1));

switch(player.getRace()) {

case HUMAN:

System.out.println("玩家种族:人族");

break;

case ORC:

System.out.println("玩家种族:兽族");

break;

case NIGHT_ELF:

System.out.println("玩家种族:暗夜精灵");

break;

case UNDEAD:

System.out.println("玩家种族:不死族");

break;

case RANDOM:

System.out.println("玩家种族:随机");

break;

}

switch(player.getColor()) {

case RED:

System.out.println("玩家颜色:红");

break;

case BLUE:

System.out.println("玩家颜色:蓝");

break;

case CYAN:

System.out.println("玩家颜色:青");

break;

case PURPLE:

System.out.println("玩家颜色:紫");

break;

case YELLOW:

System.out.println("玩家颜色:黄");

break;

case ORANGE:

System.out.println("玩家颜色:橘");

break;

case GREEN:

System.out.println("玩家颜色:绿");

break;

case PINK:

System.out.println("玩家颜色:粉");

break;

case GRAY:

System.out.println("玩家颜色:灰");

break;

case LIGHT_BLUE:

System.out.println("玩家颜色:浅蓝");

break;

case DARK_GREEN:

System.out.println("玩家颜色:深绿");

break;

case BROWN:

System.out.println("玩家颜色:棕");

break;

}

System.out.println("障碍(血量):" + player.getHandicap() + "%");

if(player.isComputer()) {

System.out.println("是否电脑玩家:电脑玩家");

switch (player.getAiStrength())

{

case EASY:

System.out.println("电脑难度:简单的");

break;

case NORMAL:

System.out.println("电脑难度:中等难度的");

break;

case INSANE:

System.out.println("电脑难度:令人发狂的");

break;

}

} else {

System.out.println("是否电脑玩家:否");

}

} else {

System.out.println("玩家队伍:裁判或观看者");

}

}

List chatList = uncompressedData.getReplayData().getChatList();

for(ChatMessage chatMessage : chatList) {

String chatString = "[" + convertMillisecondToString(chatMessage.getTime()) + "]";

chatString += chatMessage.getFrom().getPlayerName() + " 对 ";

switch ((int)chatMessage.getMode()) {

case 0:

chatString += "所有人";

break;

case 1:

chatString += "队伍";

break;

case 2:

chatString += "裁判或观看者";

break;

default:

chatString += chatMessage.getTo().getPlayerName();

}

chatString += " 说:" + chatMessage.getMessage();

System.out.println(chatString);

}

}

private static String convertMillisecondToString(long millisecond) {

long second = (millisecond / 1000) % 60;

long minite = (millisecond / 1000) / 60;

if (second < 10) {

return minite + ":0" + second;

} else {

return minite + ":" + second;

}

}

}

输出DEMO:

版本:1.26.6059

时长:24:53

游戏名称:WCA01

游戏创建者:A.1st_LawLiet

游戏地图:Maps\Download\(2)Amazonia.w3x

---玩家1---

玩家名称:A.1st_LawLiet

是否主机:主机

游戏时间:24:32

操作次数:0

APM:0

玩家队伍:裁判或观看者

---玩家2---

玩家名称:checkuncle

是否主机:否

游戏时间:24:31

操作次数:5831

APM:237

玩家队伍:2

玩家种族:暗夜精灵

玩家颜色:红

障碍(血量):100%

是否电脑玩家:否

---玩家3---

玩家名称:LuciferLNMS

是否主机:否

游戏时间:24:31

操作次数:7816

APM:318

玩家队伍:1

玩家种族:不死族

玩家颜色:灰

障碍(血量):100%

是否电脑玩家:否

---玩家4---

玩家名称:WCA_SEA_OB2

是否主机:否

游戏时间:24:53

操作次数:0

APM:0

玩家队伍:裁判或观看者

---玩家5---

玩家名称:wca_sea_ob1

是否主机:否

游戏时间:24:32

操作次数:0

APM:0

玩家队伍:裁判或观看者

[0:09]checkuncle 对 所有人 说:All rights reserved by Blizzard

[0:10]checkuncle 对 所有人 说:w3g files released by www.Replays.Net.

[0:36]LuciferLNMS 对 所有人 说:gl

[0:38]checkuncle 对 所有人 说:gl

[24:30]checkuncle 对 所有人 说:gg

[24:43]checkuncle 对 所有人 说:For more replays, plz visit www.Replays.Net

参考文档

Change Log

V1.1.0

支持网易对战平台录像格式nwg解析;

V1.1.1

修复部分录像没有玩家离开游戏标记的导致玩家游戏时间是0的BUG;

V1.2.0

去除FileType, 程序自动识别录像类型, 修复网易对战平台部分新录像报"录像格式不正确"错误的BUG;

java读取war3模型_GitHub - wucao/jw3gparser: Java Warcraft Ⅲ Replay Parser(Java解析《魔兽争霸3》游戏录像工具)...相关推荐

  1. Java读取Obj模型

    Java写OpenGL项目时总要去加载一个Obj模型,或者导出导入操作,没必要用一大堆第三方包,一个类完事,兼容Window和Android 测试可以打开3DMax导出的Obj格式 导出的Obj也可以 ...

  2. java的jmm模型_【深入理解JVM】:Java内存模型JMM

    多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...

  3. java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?

    将Matlab代码转换为Java代码有几个一般的缺陷.我将Matlab转换成C代码,所以我的建议来自于这些经验. >如果你在Matlab中使用for循环,一般来说,你做错了.添加矩阵(图像等)是 ...

  4. java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度

    一.前言 在java多线程编程中,volatile可以用来定义轻量级的共享变量,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度.所谓知己知彼.百战不殆.本文从JVM内 ...

  5. java日历记事本界面_GitHub - wusongxue/DuangCalender: 简易日历记事本(java+android端)...

    在设计日历记事本时,需要编写4个Java类:CalendarPad.class.Year.class.NotePad.class.month.class. 日历记事本除了需要编写的上述3个Java所给 ...

  6. java读取微信消息_微信公众平台开发中使用Java如何实现获取用户的信息

    微信公众平台开发中使用Java如何实现获取用户的信息 发布时间:2020-11-18 15:09:28 来源:亿速云 阅读:93 作者:Leah 本篇文章为大家展示了微信公众平台开发中使用Java如何 ...

  7. JAVA读取jtl文件不完整,Jmeter压测之jtl文件解析

    一.背景 最近在做性能压测方面的工作,用的压测工具是Jmeter.Jmeter中有一个插件叫 jp@gc Throughput Shaping Timer.翻译过来就是吞吐量整形定时器.如下图: Th ...

  8. java读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  9. java 读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

最新文章

  1. Ubuntu下安装配置Open×××
  2. 检查一棵二叉树是否为二叉查找树
  3. 树莓派安装python模块_树莓派引脚编号、pypi说明和安装
  4. 基础理论:集合的Hausdorff距离
  5. c malloc 头文件_干货笔记 | C/C++笔试面试详细总结(二)
  6. Linux学习之01_基础命令介绍
  7. html 生成唯一码,生成唯一32位ID编码代码,以满足对ID编号的唯一性加资源性解决问题...
  8. widow下svn上传项目时的文件可执行权限问题
  9. Java 性能测试的四项原则
  10. java 中使用_java中运算符的使用方法
  11. 【Python56--爬取妹子图】
  12. 系统安装 使用VMware14安装XP系统
  13. 计算机二级vb基础教程,2017计算机二级考试内容VB
  14. 2023软件测试最难求职季,哪些测试技能更容易拿到offer?
  15. 云祺与南非最大移动支付公司iVeri携手合作
  16. VueUse 中文文档:Components 组件
  17. JVM 直接内存的使用与回收
  18. MySQL高可用安装
  19. 微信公众平台如何配置业务域名
  20. 让命令不尽然history历史纪录的一种方法

热门文章

  1. SQL优化很难怎么办?给你一个简单暴力的办法
  2. matlab 单边频率谱,频谱图如何把双边谱改成单边谱?
  3. Spring boot(web 组件,ORM 操作 MySQL,接口架构风格—RESTful,集成 Redis,集成 Dubbo,打包)
  4. 基于STM32F103芯片实现LED灯闪烁
  5. Unity 利用像素点在图片上画线(RawImage)
  6. Windows下安装与配置Docker
  7. Unity 使用贝塞尔曲线实现抛物线运动
  8. Python实现计算机的自动化控制!
  9. 批量将多个文件夹整理合并到一个文件夹中
  10. python_给视频打马赛克