Minecraft-Console-Client/MinecraftClient/ChatBots/ReplayCapture.cs

103 lines
3.4 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using MinecraftClient.Protocol;
2022-10-05 15:02:30 +08:00
using Tomlet.Attributes;
namespace MinecraftClient.ChatBots
{
/// <summary>
/// Record and save replay file that can be used by the Replay mod (https://www.replaymod.com/)
/// </summary>
public class ReplayCapture : ChatBot
{
2022-10-05 15:02:30 +08:00
public static Configs Config = new();
2022-10-05 15:02:30 +08:00
[TomlDoNotInlineObject]
public class Configs
{
2022-10-05 15:02:30 +08:00
[NonSerialized]
private const string BotName = "ReplayCapture";
public bool Enabled = false;
[TomlInlineComment("$ChatBot.ReplayCapture.Backup_Interval$")]
2022-10-12 13:03:57 +08:00
public double Backup_Interval = 300.0;
2022-10-05 15:02:30 +08:00
public void OnSettingUpdate()
{
if (Backup_Interval < -1)
Backup_Interval = -1;
}
}
2022-10-05 15:02:30 +08:00
private ReplayHandler? replay;
private int backupCounter = -1;
public override void Initialize()
{
SetNetworkPacketEventEnabled(true);
replay = new ReplayHandler(GetProtocolVersion());
replay.MetaData.serverName = GetServerHost() + GetServerPort();
2022-10-12 13:03:57 +08:00
backupCounter = Settings.DoubleToTick(Config.Backup_Interval);
RegisterChatBotCommand("replay", Translations.bot_replayCapture_cmd, "replay <save|stop>", Command);
}
public override void OnNetworkPacket(int packetID, List<byte> packetData, bool isLogin, bool isInbound)
{
replay!.AddPacket(packetID, packetData, isLogin, isInbound);
}
public override void Update()
{
2022-10-05 15:02:30 +08:00
if (Config.Backup_Interval > 0 && replay!.RecordRunning)
{
if (backupCounter <= 0)
{
replay.CreateBackupReplay(@"recording_cache\REPLAY_BACKUP.mcpr");
2022-10-12 13:03:57 +08:00
backupCounter = Settings.DoubleToTick(Config.Backup_Interval);
}
else backupCounter--;
}
}
public override bool OnDisconnect(DisconnectReason reason, string message)
{
replay!.OnShutDown();
return base.OnDisconnect(reason, message);
}
public string Command(string cmd, string[] args)
{
try
{
if (replay!.RecordRunning)
{
if (args.Length > 0)
{
switch (args[0].ToLower())
{
case "save":
{
replay.CreateBackupReplay(@"replay_recordings\" + replay.GetReplayDefaultName());
return Translations.bot_replayCapture_created;
}
case "stop":
{
replay.OnShutDown();
return Translations.bot_replayCapture_stopped;
}
}
}
return string.Format(Translations.general_available_cmd, "save, stop");
}
else return Translations.bot_replayCapture_restart;
}
catch (Exception e)
{
return e.Message;
}
}
}
}