XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

AutoMiningScript

【SpaceEngineer】全自动挖矿脚本

公开
关注 0 Fork 0 Star 0
UTF-8
using System;
using System.Collections.Generic;
using Sandbox.ModAPI.Ingame;
using VRage.Game.ModAPI.Ingame.Utilities;

namespace AutoMiningScript
{
    public partial class Program
    {
        public sealed class WatchdogController : RoleLogic
        {
            bool armed,tripped;
            string businessSession="",businessId="";
            long businessAddress;
            double heartbeat=-100,nextReply;
            public WatchdogController(Program p):base(p) { }
            public override void Tick(double dt)
            {
                if(armed && P.Now-heartbeat>P.Config.Number("Watchdog","Timeout",3,1,30))
                {tripped=true;armed=false;P.SafeClear();P.Log(L.FleetWatchdogTripped);}
                if(businessId.Length>0 && P.Now>=nextReply)
                {
                    nextReply=P.Now+0.5;var body=new MyIni();body.Set("watchdog","Grid",P.Me.CubeGrid.EntityId);
                    P.Bus.Send(armed&&!tripped?"WATCH_READY":"WATCH_TRIPPED",businessId,body,false,businessAddress);
                }
            }
            public override void Receive(Packet packet)
            {
                if(packet.Kind!="WATCH_HEARTBEAT" || Data.ReadLong(packet.Body,"watchdog","Grid")!=P.Me.CubeGrid.EntityId)return;
                string expected=P.Config.Text("Watchdog","BusinessId","");
                if(expected.Length>0 && packet.From!=expected)return;
                long address=Data.ReadLong(packet.Body,"watchdog","Business");
                var block=P.GridTerminalSystem.GetBlockWithId(address) as IMyProgrammableBlock;
                if(block==null || block.CubeGrid!=P.Me.CubeGrid || packet.Source!=block.EntityId)return;
                if(businessId.Length>0 && (businessId!=packet.From || businessAddress!=packet.Source))return;
                if(armed && businessSession.Length>0 && businessSession!=packet.Session)
                {P.SafeClear();tripped=true;armed=false;P.Log(L.FleetWatchdogBusinessRestarted);}
                businessSession=packet.Session;businessId=packet.From;businessAddress=packet.Source;heartbeat=P.Now;
            }
            public override void Command(string command)
            {
                if(command=="arm")
                {
                    if(P.Now-heartbeat>1) {P.Log(L.FleetWatchdogHeartbeatMissing);return;}
                    tripped=false;armed=true;P.Log(L.FleetWatchdogArmedMessage);
                }
                else if(command=="trip" || command=="release") {tripped=true;armed=false;P.SafeClear();P.Log(L.FleetWatchdogManualTrip);}
                else if(command=="diagnose")P.Log(Diagnostics);
                else P.Log(L.FleetWatchdogCommands);
            }
            public override void Emergency(string reason) {armed=false;tripped=true;P.SafeClear();P.Log(reason);}
            public override string Diagnostics {get {return L.F(L.FleetWatchdogDiagnostics,armed?L.FleetWatchdogArmed:tripped?L.FleetWatchdogFault:L.FleetWatchdogDisarmed,P.Now-heartbeat);}}
            public override void Save(MyIni i) {i.Set("watchdog","Tripped",tripped);}
            public override void Load(MyIni i) {tripped=i.Get("watchdog","Tripped").ToBoolean();armed=false;}
        }
    }
}