jw3gparser

Java解析《魔兽争霸3》游戏录像工具

魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。此外,还有DOTA、真三、澄海3C等著名的地图。

魔兽争霸的录像大家都知道,是用来回放的,文件后缀名是.w3g,保存在魔兽争霸下的REPLAY目录下。现在很多软件可以分析魔兽争霸录像,直接可以查看录像的玩家、地图,以及玩家的APM等信息。

以前在对战平台打魔兽,经常能遇到Java程序员,说明Java程序员中有很多魔兽争霸3的玩家,这里将Java解析魔兽争霸3录像的方法分享给同是WAR3玩家的小伙伴们。

使用方法

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

参考文档

java魔兽争霸_GitHub - mzhg/jw3gparser: Java解析《魔兽争霸3》游戏录像工具相关推荐

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

    jw3gparser Java解析<魔兽争霸3>游戏录像工具,可解析w3g.nwg(网易对战平台录像)格式录像. 使用方法 public class Test { public stati ...

  2. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  3. zookeeper java版本号_GitHub - anlijie/java-lock: java版本的用Zookeeper实现的分布式锁

    java-lock java版本的用Zookeeper实现的分布式锁 代码已经测过,可以直接使用! #业务场景 在分布式情况,生成全局订单号ID 生成订单号方案 使用时间戳 使用UUID 推特 (Tw ...

  4. pact java 测试_GitHub - cshruby/pact-parent: java中使用pact做契约测试的事例

    spring cloud contract与传统pact对比 总体 spring cloud contract 优点: 1. groovy编写契约,使用简单,效率高. 2. 可以生成sub jar,当 ...

  5. Java解析魔兽争霸3录像W3G文件(五):Action和APM计算

    在游戏进行中,玩家会进行各种操作,例如编队.移动.技能.造建筑等,这些操作就是Action.APM(Actions Per Minute),表示每分钟的操作次数,APM可以很好的反映玩家的手速和实力, ...

  6. java 二维码生成和解析

    2019独角兽企业重金招聘Python工程师标准>>> <!-- 二维码 --><dependency><groupId>com.google.z ...

  7. atitit. java jsoup html table的读取解析 总结

    atitit. java jsoup html table的读取解析 总结 1. 两个大的parser ,,,jsoup 跟个   htmlparser 1 2. 资料比较 1 3. jsoup越佳. ...

  8. 工程是.java文件_1.8 工程相关解析(各种文件,资源访问)

    本节引言: 前面讲了一堆看似和我们Android开发无关的东西是吧,当然是现在看似而已,以后你回头看就知道了! 好吧,本节我们就来以前面创建的Hello World项目为入口,来了解工程结构, 以及A ...

  9. java二维码生成与解析代码实现

    TwoDimensionCode类:二维码操作核心类 package qrcode;import java.awt.Color; import java.awt.Graphics2D; import ...

  10. 【Java 注解】自定义注解 ( 注解解析 )

    文章目录 一.定义注解 二.使用注解 三.解析注解 四.通过注解对象获取注解属性的原理 在 [Java 注解]自定义注解 ( 注解属性定义与赋值 ) 博客中讲解了 注解属性 ; 在 [Java 注解] ...

最新文章

  1. 计算机丢失scecli,Server 2012 R2 SceCli 事件ID:1202( 0x534)解决方案
  2. 工具-eclipse-hibernate关于快速生成*.hbm.xml文件,与bean文件的操作,不使用hibernate tool解决办法之一,主要为了快速开发,写的小工具
  3. python中random中uniform怎么用_Python中的random.uniform()函数教程与实例解析
  4. 2018实用前端面试问题集锦
  5. 参数名称 java_java – 具有重要名称的WSDL中的参数名称
  6. JavaScript并非“按值传递”
  7. 微软推出 Project Freta:免费查找云虚拟机上的恶意软件
  8. windows 设置定时锁屏
  9. smarty 执行php,smarty模板执行原理
  10. 【selenium 模拟拼图】滑动拼图验证码10分钟教程
  11. mybatis开发神器mybatis plus
  12. 计算机编程ebcdic码,ASCII码和EBCDIC码
  13. C#:合并EXCEL文件工作表列
  14. Apche Kafka 的生与死 – failover 机制详解
  15. PPP和PDP激活区别
  16. 999宝藏网尼古拉斯电脑城装机版V6.0
  17. win系统cpu温度获取
  18. 千锋教育+计算机四级网络-计算机网络学习-04
  19. 颜值爆表!Redis 官方客户端工具,功能强大,且支持可视化监控!
  20. Bounding box regression RCNN系列网络中矩形框的计算

热门文章

  1. 京东线报-京东实时线报-高级京东线报接口
  2. 基于PSIM及其DLL模块的单相全桥并网逆变器仿真
  3. OpenDRIVE工具介绍及地址
  4. 智能驾驶浪潮催生车载通信新机遇 移远通信抢占5G+C-V2X+GNSS风口
  5. USB redirection
  6. vue弹出alert_vue.extend实现alert模态框弹窗步骤详解
  7. PS去除图片和PDF中的水印
  8. 点云配准(PCL+ICP)
  9. 如何在远程会议的时候静音吃薯片?微软团队用AI去除视频噪声
  10. Vscode中Latex语法无法出现高亮