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

参考文档