using Sandbox.ModAPI.Ingame;
using VRageMath;
using XFEExtension.SpaceEngineers.ScriptingHelper;
namespace AutoMiningScript
{
public class Program : MyGridProgram, IProgramBase
{
//--------------------------------Version 1.32---------------------------------------------
Vector3D yjzb;
Vector3D ejzb;
Vector3D xf;
Vector3D zz;
Vector3D mb;
Vector3D mb2;
Vector3D mb3;
Vector3D pyl;
Vector3D pyl2;
Vector3D Up;
Vector3D Down;
Vector3D Right;
Vector3D Left;
MyDetectedEntityInfo aab;
IMyCameraBlock cmr;
int mod;
int times;
int bs;
double DistanceBetween;
double dst;
double gd;
double sd;
double timer;
double dqjl;
double dqsj;
float speedLmt;
string mz;
string lx;
string aabType;
string aabName;
string aabId;
string aabRelationship;
bool tp;
bool tp2;
bool ejd;
bool IsClosing;
bool wc = true;
bool fz;
bool st;
bool gy;
bool bt = true;
bool stt = true;
bool crun;
bool ks;
bool yxcs;
bool yjd;
bool cnnt = true;
bool oc;
bool sfxf;
bool fh;
bool csh;
List<IMyShipDrill> ztz = new List<IMyShipDrill>();
public Program()
{
Runtime.UpdateFrequency = UpdateFrequency.Update1;
}
public static Vector3D ZV(string[] dzh)
{
Vector3D x;
x.X = double.Parse(dzh[0]);
x.Y = double.Parse(dzh[1]);
x.Z = double.Parse(dzh[2]);
return x;
}
public static Vector3D ZVV(string dzh)
{
Vector3D x;
x.X = double.Parse(dzh.Split(',')[0]);
x.Y = double.Parse(dzh.Split(',')[1]);
x.Z = double.Parse(dzh.Split(',')[2]);
return x;
}
public static double DST(Vector3D qs, Vector3D zd)
{
double ddst = Math.Sqrt(Math.Pow(zd.X - qs.X, 2) + Math.Pow(zd.Y - qs.Y, 2) + Math.Pow(zd.Z - qs.Z, 2));
return ddst;
}
public void Main(string argument, UpdateType updateSource)
{
if (Me.CustomName.Length > 3)
{
lx = Me.CustomName.Substring(Me.CustomName.Length - 3, 3);
mz = Me.CustomName.Replace(lx, "");
//-----------------------------以下矿机------------------------------------
if (lx == "-矿机")
{
var txt = Me.GetSurface(0);
double xfdst;
if (Me.CustomData == "")
{
Me.CustomData = "--------已设置类型:矿机--------\n直接修改下列中括号里的内容\n矿机挖掘时候的速度(单位 米/秒)[0.5] 建议0.1-1之间\n开始挖掘距离(单位 米)[8] 即距离陨石表面多少米开始挖掘,\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
else if (Me.CustomData.Length > 25 && Me.CustomData.Substring(0, 24) != "--------已设置类型:矿机--------")
{
Me.CustomData = "--------已设置类型:矿机--------\n直接修改下列中括号里的内容\n矿机挖掘时候的速度(单位 米)[0.5]\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
if (GridTerminalSystem.GetBlockWithName("远程控制-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:远程控制-" + mz + "\n请检查是否安装方块 远程控制 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:远程控制-" + mz + "\n请检查是否安装方块 远程控制 或者名称是否有误并 重命名");
}
else if (GridTerminalSystem.GetBlockWithName("连接器-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:连接器-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:连接器-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
}
else if (GridTerminalSystem.GetBlockGroupWithName("钻头-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到编组:钻头-" + mz + "\n请检查是否有编组 钻头-" + mz + "或者编组的名称是否有误并 重新编组");
Echo("脚本运行状态:中断!\n原因:\n未找到编组:钻头-" + mz + "\n请检查是否有编组 钻头-" + mz + "或者编组的名称是否有误并 重新编组");
}
else
{
if (Me.CustomData.Split(new char[2] { '[', ']' }).Count() >= 5)
{
bool zh1 = float.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[1], out speedLmt);
bool zh2 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[3], out xfdst);
if (zh1 && zh2)
{
if (!bt)
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n挖掘速度限制:" + speedLmt + "m/s\n开始挖掘距离:" + xfdst + "m\n" + Storage + "\nMade by XFEstudio");
}
var rem = GridTerminalSystem.GetBlockWithName("远程控制-" + mz) as IMyRemoteControl;
var ljq = GridTerminalSystem.GetBlockWithName("连接器-" + mz) as IMyShipConnector;
GridTerminalSystem.GetBlockGroupWithName("钻头-" + mz).GetBlocksOfType(ztz);
timer += Runtime.TimeSinceLastRun.TotalSeconds;
//------------------------------------------------------------
IMyBroadcastListener a = IGC.RegisterBroadcastListener("zy" + mz);
bool xx = a.HasPendingMessage;
MyIGCMessage j = a.AcceptMessage();
string js = j.Data + "";
string[] fg = js.Split(',');
//------------------------------------------------------------
IMyBroadcastListener b = IGC.RegisterBroadcastListener("cs" + mz);
MyIGCMessage j2 = b.AcceptMessage();
string js2 = j2.Data + "";
string[] fg2 = js2.Split(',');
//------------------------------------------------------------
IMyBroadcastListener c = IGC.RegisterBroadcastListener("ccs" + mz);
MyIGCMessage j3 = c.AcceptMessage();
string js3 = j3.Data + "";
string[] fg3 = js3.Split(',');
//------------------------------------------------------------
IMyBroadcastListener d = IGC.RegisterBroadcastListener("cccs" + mz);
MyIGCMessage j4 = d.AcceptMessage();
string js4 = j4.Data + "";
string[] fg4 = js4.Split(',');
//------------------------------------------------------------
IMyBroadcastListener e = IGC.RegisterBroadcastListener("fz" + mz);
MyIGCMessage j5 = e.AcceptMessage();
string fz = j5.Data + "";
//------------------------------------------------------------
if (Storage != null && Storage != "")
{
string[] STGfg = Storage.Split('|');
if (STGfg.Length >= 13)
{
try
{
st = bool.Parse(STGfg[0]);
oc = bool.Parse(STGfg[1]);
sfxf = bool.Parse(STGfg[2]);
fh = bool.Parse(STGfg[3]);
IsClosing = bool.Parse(STGfg[4]);
ks = bool.Parse(STGfg[5]);
csh = bool.Parse(STGfg[6]);
cnnt = bool.Parse(STGfg[7]);
yjd = bool.Parse(STGfg[8]);
bt = bool.Parse(STGfg[9]);
mb = ZVV(STGfg[10]);
xf = ZVV(STGfg[11]);
mb3 = ZVV(STGfg[12]);
}
catch (Exception ex)
{
Echo($"出现异常:{ex.Message}");
}
Storage = "";
}
}
//------------------------------------------------------------
if (fg2.Count() == 4 && fg2[3] == "3" && !st && cnnt)
{
st = true;
oc = false;
sfxf = false;
fh = false;
IsClosing = false;
ks = false;
csh = false;
cnnt = false;
ljq.Disconnect();
mb = ZV(fg2);
xf = ZV(fg3);
mb3 = ZV(fg4);
txt.WriteText("矿物位置:" + mb);
rem.DampenersOverride = true;
rem.SetCollisionAvoidance(false);
}
//------------------------------------------------------------
double jl = DST(yjzb, rem.WorldAABB.Center);
rem.FlightMode = FlightMode.OneWay;
if (ljq.Status == MyShipConnectorStatus.Connectable && !st)
{
cnnt = true;
ljq.Connect();
rem.ClearWaypoints();
rem.SetAutoPilotEnabled(false);
IGC.SendBroadcastMessage("zfb" + mz, "2");
rem.DampenersOverride = false;
foreach (IMyShipDrill zt in ztz)
{
zt.Enabled = false;
}
}
if (ljq.Status == MyShipConnectorStatus.Connected && !st)
{
txt.WriteText("矿机:" + mz + "\n正在等待挖矿任务...");
}
if (bt)
{
txt.WriteText("等待与本体连接器连接");
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n等待与本体连接\nMade by XFEstudio");
rem.SpeedLimit = 100;
bt = false;
}
if (cnnt)
{
IGC.SendBroadcastMessage("zfb" + mz, "2");
}
//--------------------进入出发点--------------------------
if (st)
{
rem.DampenersOverride = true;
if (!ks && fg.Count() == 4 && fg[3] == "rd")
{
rem.Direction = Base6Directions.Direction.Forward;
if (fg2.Count() == 3)
{
st = false;
cnnt = false;
yjd = false;
rem.ClearWaypoints();
rem.SpeedLimit = 100;
}
else
{
yjzb = ZV(fg);
if (DST(yjzb, rem.WorldAABB.Center) <= 1)
{
if (fz == "fz") rem.SetCollisionAvoidance(true);
else rem.SetCollisionAvoidance(false);
ks = true;
IGC.SendBroadcastMessage("zfb" + mz, "rd");
}
if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(yjzb, "接近出发点...");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
txt.WriteText("正在接近出发点..." + timer);
}
}
else
{
//--------------------开始挖矿--------------------------
if (fg2.Count() == 3)
{
st = false;
cnnt = false;
yjd = false;
rem.ClearWaypoints();
rem.SpeedLimit = 100;
}
else
{
if (fh)
{
rem.Direction = Base6Directions.Direction.Backward;
if (DST(rem.WorldAABB.Center, xf) <= 1 && !sfxf)
{
foreach (IMyShipDrill zt in ztz)
{
zt.Enabled = false;
}
sfxf = true;
rem.SpeedLimit = 100;
st = false;
cnnt = false;
ks = false;
oc = false;
yjd = false;
fh = false;
if (fz == "fz") rem.SetCollisionAvoidance(true);
else rem.SetCollisionAvoidance(false);
IGC.SendBroadcastMessage("zfb" + mz, "0");
IGC.SendBroadcastMessage("times" + mz, "0");
Echo("ST:" + st + "\ntimer:" + timer + "\nCNNT:" + cnnt);
}
else if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(xf, "接近退出悬浮高度");
txt.WriteText("正在进入退出悬浮点:" + DST(rem.WorldAABB.Center, xf));
rem.SetAutoPilotEnabled(true);
timer = 0;
}
}
else
{
double kwjl = DST(rem.WorldAABB.Center, mb3);
rem.Direction = Base6Directions.Direction.Forward;
if (!csh)
{
rem.ClearWaypoints();
rem.AddWaypoint(xf, "靠近矿物目标");
rem.SetAutoPilotEnabled(true);
csh = true;
}
if (!oc && csh)
{
if (DST(rem.WorldAABB.Center, xf) <= 20)
{
oc = true;
rem.SpeedLimit = 5;
timer = 0;
txt.WriteText("已靠近" + kwjl);
rem.SetCollisionAvoidance(false);
}
else
{
rem.SpeedLimit = 100;
txt.WriteText("未靠近" + kwjl);
}
}
//-------------------------------开始执行---------------------
if (oc)
{
if (!sfxf)
{
//------------------准备悬停-------------
txt.WriteText("正在悬停:" + xf);
if (DST(rem.WorldAABB.Center, xf) <= 1)
{
sfxf = true;
rem.SetCollisionAvoidance(false);
}
else if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(xf, "进行悬浮");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
}
else
{
//---------------接近---------------------
if (DST(mb, rem.WorldAABB.Center) <= xfdst)
{
IsClosing = true;
}
//----------------进行挖掘----------------
if (IsClosing)
{
rem.SpeedLimit = speedLmt;
txt.WriteText("正在挖掘:" + kwjl);
foreach (IMyShipDrill zt in ztz)
{
zt.Enabled = true;
}
if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(mb3, "挖掘矿物目标");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
//-----------------------准备退出-------------------------
if (kwjl <= 2)
{
fh = true;
sfxf = false;
rem.SpeedLimit = 5;
}
}
else
{
rem.SpeedLimit = 100;
if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(mb, "挖掘矿物目标");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
}
}
}
}
}
}
}
//--------------------开始停靠--------------------------
else if (!cnnt)
{
rem.Direction = Base6Directions.Direction.Forward;
rem.SetAutoPilotEnabled(true);
if (!yjd)
{
if (j.Data + "" == "" || j.Data + "" == null)
{
txt.WriteText("无");
}
else
{
if (fz == "fz")
{
rem.SetCollisionAvoidance(true);
Echo("fz");
}
else
{
rem.SetCollisionAvoidance(false);
Echo("bfz");
}
if (fg.Count() == 4 && fg[3] == "0")
{
yjd = false;
}
else
{
yjd = true;
}
yjzb = ZV(fg);
txt.WriteText(yjzb + "\n" + jl);
}
if (jl < 2)
{
IGC.SendBroadcastMessage("zfb" + mz, "1");
}
else
{
IGC.SendBroadcastMessage("zfb" + mz, "0");
}
if (timer >= 1 && yjzb.X != 0)
{
rem.ClearWaypoints();
rem.AddWaypoint(yjzb, "zy");
timer = 0;
}
}
else
{
rem.Direction = Base6Directions.Direction.Backward;
rem.SetAutoPilotEnabled(true);
rem.SetCollisionAvoidance(false);
if (j2.Data + "" == "" || j2.Data + "" == null)
{
txt.WriteText("无");
}
else
{
if (fg.Count() == 4 && fg[3] == "0")
{
yjd = false;
}
else
{
yjd = true;
}
ejzb = ZV(fg2);
txt.WriteText(ejzb + "\n" + timer);
}
if (timer >= 1 && ejzb.X != 0)
{
rem.ClearWaypoints();
rem.AddWaypoint(ejzb, "cs");
timer = 0;
}
}
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:数据挖掘速度并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:数据挖掘速度并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
Echo("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
}
}
}
//-----------------------------以上矿机------------------------------------
else if (lx == "-本体")
{
var txt = Me.GetSurface(0);
if (Me.CustomData == "")
{
Me.CustomData = "--------已设置类型:本体--------\n直接修改下列中括号里的内容\n停靠点悬停距离(单位 米):[15]\n停靠点悬停时间(单位 秒):[10]\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
else if (Me.CustomData.Length > 25 && Me.CustomData.Substring(0, 24) != "--------已设置类型:本体--------")
{
Me.CustomData = "--------已设置类型:本体--------\n直接修改下列中括号里的内容\n停靠点悬停距离(单位 米):[15]\n停靠点悬停时间(单位 秒):[10]\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
if (Me.CustomData.Split(new char[2] { '[', ']' }).Count() >= 5)
{
if (GridTerminalSystem.GetBlockWithName("连接器本体-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:连接器本体-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:连接器本体-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
}
else if (GridTerminalSystem.GetBlockWithName("指引灯-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:指引灯-" + mz + "\n请检查是否安装方块 聚光灯 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:指引灯-" + mz + "\n请检查是否安装方块 聚光灯 或者名称是否有误并 重命名");
}
else
{
var yljq = GridTerminalSystem.GetBlockWithName("连接器本体-" + mz) as IMyFunctionalBlock;
var zyjgd = GridTerminalSystem.GetBlockWithName("指引灯-" + mz) as IMyLightingBlock;
bool zh1 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[1], out dqjl);
bool zh2 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[3], out dqsj);
if (!zh1)
{
txt.WriteText("脚本运行状态:中断!\n原因:数据停靠距离并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:数据停靠距离并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (!zh2)
{
txt.WriteText("脚本运行状态:中断!\n原因:数据停靠时间并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:数据停靠时间并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (zh1 && zh2)
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n停靠点距离连接器距离:" + dqjl + "\n停靠时间:" + dqsj + "\n\nMade by XFEstudio");
}
timer += Runtime.TimeSinceLastRun.TotalSeconds;
IMyBroadcastListener rcv = IGC.RegisterBroadcastListener("zfb" + mz);
bool xx = rcv.HasPendingMessage;
MyIGCMessage j = rcv.AcceptMessage();
zz = yljq.WorldAABB.Center + yljq.WorldMatrix.Forward * dqjl;
if (Storage != null && Storage != "")
{
string[] STGfg = Storage.Split('|');
if (STGfg.Length >= 5)
{
try
{
stt = bool.Parse(STGfg[0]);
wc = bool.Parse(STGfg[1]);
ejd = bool.Parse(STGfg[2]);
ks = bool.Parse(STGfg[3]);
fz = bool.Parse(STGfg[4]);
}
catch (Exception ex)
{
Echo($"发生异常:{ex.Message}");
}
Storage = "";
}
}
if (j.Data + "" == "0")
{
wc = false;
stt = false;
timer = 0;
}
if (j.Data + "" == "1")
{
ejd = true;
timer = 0;
}
if (j.Data + "" == "2" && !wc)
{
wc = true;
ejd = false;
timer = 0;
}
if (j.Data + "" == "rd")
{
ks = true;
}
if (ejd)
{
zyjgd.Color = Color.Red;
}
else
{
zyjgd.Color = Color.White;
}
if (stt)
{
wc = false;
IMyBroadcastListener bkrcv = IGC.RegisterBroadcastListener(mz);
MyIGCMessage bkj = bkrcv.AcceptMessage();
string bkjs = bkj.Data + "";
string[] bkfg = bkjs.Split(',');
if (bkj.Data + "" == "" || bkj.Data + "" == null)
{
txt.WriteText("无");
Echo("无");
}
else if (bkj.Data + "" == "Return")
{
stt = false;
ks = false;
fz = false;
wc = false;
}
else if (bkj.Data + "" == "Retreat")
{
stt = false;
ks = false;
fz = true;
wc = false;
}
else
{
Echo(bkjs);
if (bkfg[9] == "fz")
{
fz = true;
}
else if (bkfg[9] == "bfz")
{
fz = false;
}
string[] bkfg2 = new string[3];
string[] bkfg3 = new string[3];
bkfg2[0] = bkfg[3];
bkfg2[1] = bkfg[4];
bkfg2[2] = bkfg[5];
bkfg3[0] = bkfg[6];
bkfg3[1] = bkfg[7];
bkfg3[2] = bkfg[8];
mb = ZV(bkfg);
mb2 = ZV(bkfg2);
mb3 = ZV(bkfg3);
if (fz) IGC.SendBroadcastMessage("fz" + mz, "fz");
else IGC.SendBroadcastMessage("fz" + mz, "bfz");
if (ks)
{
zyjgd.Color = Color.White;
IGC.SendBroadcastMessage("cs" + mz, mb.X + "," + mb.Y + "," + mb.Z + ",3");
IGC.SendBroadcastMessage("ccs" + mz, mb2.X + "," + mb2.Y + "," + mb2.Z);
IGC.SendBroadcastMessage("cccs" + mz, mb3.X + "," + mb3.Y + "," + mb3.Z);
}
else
{
zyjgd.Color = Color.Red;
IGC.SendBroadcastMessage("cs" + mz, mb.X + "," + mb.Y + "," + mb.Z + ",3");
IGC.SendBroadcastMessage("ccs" + mz, mb2.X + "," + mb2.Y + "," + mb2.Z);
IGC.SendBroadcastMessage("cccs" + mz, mb3.X + "," + mb3.Y + "," + mb3.Z);
IGC.SendBroadcastMessage("zy" + mz, zz.X + "," + zz.Y + "," + zz.Z + ",rd");
}
}
}
else if (!wc)
{
IGC.SendBroadcastMessage("cs" + mz, yljq.WorldVolume.Center.X + "," + yljq.WorldVolume.Center.Y + "," + yljq.WorldVolume.Center.Z);
if (ejd)
{
IGC.SendBroadcastMessage("zy" + mz, zz.X + "," + zz.Y + "," + zz.Z + ",1");
}
else
{
if (fz) IGC.SendBroadcastMessage("fz" + mz, "fz");
else IGC.SendBroadcastMessage("fz" + mz, "bfz");
IGC.SendBroadcastMessage("zy" + mz, zz.X + "," + zz.Y + "," + zz.Z + ",0");
}
}
else if (wc && timer >= dqsj)
{
ks = false;
fz = false;
stt = true;
timer = 0;
}
txt.WriteText("名称:" + mz + "\n模式:本体\n坐标:\n\n方块:连接器本体-" + mz + "\n" + yljq.WorldAABB.Center + "\n方块:指引灯-" + mz + "\n" + zyjgd.WorldAABB.Center + "\n已连接时间" + timer);
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
Echo("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
}
}
//-----------------------------以上本体------------------------------------
else if (lx == "-委派")
{
var txt = Me.GetSurface(0);
if (Me.CustomData == "")
{
Me.CustomData = "--------已设置类型:委派--------\n直接修改下列中括号里的内容\n是否共用摄像机[否]\n共用摄像机名称[请输入名称](如果共用为否则可以忽略)\n挖掘范围(请输入直线,十字,或大范围)[大范围]\n挖掘范围间距(单位 米)[3]\n注意事项:委派模式下,需要在运行本编程块的时候输入参数,如果是给矿机下达挖掘指令则需要4个参数,中间用英文的逗号隔开*注意是英文的逗号,如果不运行或者报错说明您使用的是中文的逗号,请切换输入法\n而如果是给无人机下达返回的指令则只需要一个返回参数\n4个参数分别是:模式,最远标点距离(建议2000),悬浮高度,挖掘深度 且这4个参数都不需要您带上单位,只输入数字\n模式:1表示半自动防撞,2表示全自动防撞,3表示半自动不防撞,4表示全自动不防撞,开启防撞矿机可能会在一个地方一直ob,而防撞的作用则是适用于避障,例如从矿石的一面直线飞到另一面\n最远标点:即这个摄像机能投射到矿石表面的点最远有多远(最大标点距离),建议2000,超过5000扫描时间会很长\n悬浮高度:矿船从本体前往的点即为悬浮高度,适当运用可避障,建议大于2倍矿船的长度,但也不建议特别高,除非特殊情况\n挖掘深度:即每次往下挖多深,根据矿机的载荷即储物大小来定,小网格建议输入15\n1个返回参数是:stop或者stop2,这两返回参数只需选择输入一个,stop代表不以防撞模式返回而stop2则是以防撞模式返回\n没看懂不要紧,建议输入以下示例:\n示例1:4,2000,15,15 意思是以全自动不防撞,最大扫描距离2000,悬浮高度15,挖掘深度15来运行\n示例2:stop 意思是以不防撞模式返回\n示例3:stop2 意思是以防撞模式返回";
}
else if (Me.CustomData.Length > 25 && Me.CustomData.Substring(0, 24) != "--------已设置类型:委派--------")
{
Me.CustomData = "--------已设置类型:委派--------\n直接修改下列中括号里的内容\n是否共用摄像机[否]\n共用摄像机名称[请输入名称](如果共用为否则可以忽略)\n挖掘范围(请输入直线,十字,或大范围)[大范围]\n挖掘范围间距(单位 米)[3]\n注意事项:委派模式下,需要在运行本编程块的时候输入参数,如果是给矿机下达挖掘指令则需要4个参数,中间用英文的逗号隔开*注意是英文的逗号,如果不运行或者报错说明您使用的是中文的逗号,请切换输入法\n而如果是给无人机下达返回的指令则只需要一个返回参数\n4个参数分别是:模式,最远标点距离(建议2000),悬浮高度,挖掘深度 且这4个参数都不需要您带上单位,只输入数字\n模式:1表示半自动防撞,2表示全自动防撞,3表示半自动不防撞,4表示全自动不防撞,开启防撞矿机可能会在一个地方一直ob,而防撞的作用则是适用于避障,例如从矿石的一面直线飞到另一面\n最远标点:即这个摄像机能投射到矿石表面的点最远有多远(最大标点距离),建议2000,超过5000扫描时间会很长\n悬浮高度:矿船从本体前往的点即为悬浮高度,适当运用可避障,建议大于2倍矿船的长度,但也不建议特别高,除非特殊情况\n挖掘深度:即每次往下挖多深,根据矿机的载荷即储物大小来定,小网格建议输入15\n1个返回参数是:stop或者stop2,这两返回参数只需选择输入一个,stop代表不以防撞模式返回而stop2则是以防撞模式返回\n没看懂不要紧,建议输入以下示例:\n示例1:4,2000,15,15 意思是以全自动不防撞,最大扫描距离2000,悬浮高度15,挖掘深度15来运行\n示例2:stop 意思是以不防撞模式返回\n示例3:stop2 意思是以防撞模式返回";
}
if (Me.CustomData.Split(new char[2] { '[', ']' }).Count() >= 9)
{
string nam = Me.CustomData.Split(new char[2] { '[', ']' })[3];
if (Me.CustomData.Split(new char[2] { '[', ']' })[1] == "是")
{
gy = true;
if (GridTerminalSystem.GetBlockWithName(nam) != null)
{
cmr = GridTerminalSystem.GetBlockWithName(Me.CustomData.Split(new char[2] { '[', ']' })[3]) as IMyCameraBlock;
crun = true;
}
else
{
crun = false;
txt.WriteText("脚本运行状态:中断!\n原因:\n在共用模式下,未找到名称为:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + " 的摄像机\n请检查输入的名称或放置该摄像机");
Echo("脚本运行状态:中断!\n原因:未找到名称为:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + " 的摄像机\n请检查输入的名称或放置该摄像机");
}
}
else if (Me.CustomData.Split(new char[2] { '[', ']' })[1] == "否")
{
gy = false;
if (GridTerminalSystem.GetBlockWithName("摄像机-" + mz) != null)
{
cmr = GridTerminalSystem.GetBlockWithName("摄像机-" + mz) as IMyCameraBlock;
crun = true;
}
else
{
crun = false;
txt.WriteText("脚本运行状态:中断!\n原因:\n在不共用模式下未找到名称为:摄像机-" + mz + " 的摄像机\n请检查输入的名称或放置该摄像机");
Echo("脚本运行状态:中断!\n原因:\n在不共用模式下未找到名称为:摄像机-" + mz + " 的摄像机\n请检查输入的名称或放置该摄像机");
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n是否共用方块只能填入是或否\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:\n是否共用方块只能填入是或否\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (Me.CustomData.Split(new char[2] { '[', ']' })[5] == "直线")
{
bs = 1;
}
else if (Me.CustomData.Split(new char[2] { '[', ']' })[5] == "十字")
{
bs = 2;
}
else if (Me.CustomData.Split(new char[2] { '[', ']' })[5] == "大范围")
{
bs = 3;
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n挖掘范围只能填入直线,十字或大范围\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:\n挖掘范围只能填入直线,十字或大范围\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
bool zh1 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[7], out DistanceBetween);
if (!zh1)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n挖掘范围间距必须是一个数值\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[7] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (crun && zh1)
{
if (gy)
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n是否共用摄像机:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n共用摄像机名称:" + nam + "\n挖掘范围" + Me.CustomData.Split(new char[2] { '[', ']' })[5] + "\n挖掘范围间距:" + Me.CustomData.Split(new char[2] { '[', ']' })[7] + "\n\nMade by XFEstudio");
}
else
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n是否共用摄像机:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n挖掘范围" + Me.CustomData.Split(new char[2] { '[', ']' })[5] + "\n挖掘范围间距:" + Me.CustomData.Split(new char[2] { '[', ']' })[7] + "\n\nMade by XFEstudio");
}
if (Storage != null && Storage != "")
{
string[] STGfg = Storage.Split('|');
if (STGfg.Length >= 21)
{
try
{
tp = bool.Parse(STGfg[0]);
tp2 = bool.Parse(STGfg[1]);
yxcs = bool.Parse(STGfg[2]);
times = int.Parse(STGfg[3]);
pyl = ZVV(STGfg[4]);
pyl2 = ZVV(STGfg[5]);
Up = ZVV(STGfg[6]);
Down = ZVV(STGfg[7]);
Left = ZVV(STGfg[8]);
Right = ZVV(STGfg[9]);
mb = ZVV(STGfg[10]);
mb2 = ZVV(STGfg[11]);
mb3 = ZVV(STGfg[12]);
dst = double.Parse(STGfg[13]);
mod = int.Parse(STGfg[14]);
gd = double.Parse(STGfg[15]);
sd = double.Parse(STGfg[16]);
aabName = STGfg[17];
aabType = STGfg[18];
aabRelationship = STGfg[19];
aabId = STGfg[20];
}
catch (Exception ex)
{
Echo($"发生异常:{ex.Message}");
}
Storage = "";
}
}
Echo(mb + "\n\n" + mb2 + "\n\n" + mb3 + "\n\n" + times + "\n" + mod);
int ttm = times - 1;
if (argument != "")
{
if (argument == "stop")
{
tp = true;
}
else if (argument == "stop2")
{
tp2 = true;
}
else
{
string[] fg = argument.Split(',');
tp = false;
tp2 = false;
yxcs = true;
times = 1;
dst = double.Parse(fg[1]);
mod = int.Parse(fg[0]);
gd = double.Parse(fg[2]);
sd = double.Parse(fg[3]);
cmr.EnableRaycast = true;
aab = cmr.Raycast(dst, 0, 0);
}
if (!aab.IsEmpty())
{
if (mod == 1)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId);
}
else if (mod == 2)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId + "\n已执行次数:" + ttm);
}
else if (mod == 3)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 不避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId);
}
else if (mod == 4)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 不避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId + "\n已执行次数:" + ttm);
}
if (aab.Type == MyDetectedEntityType.Asteroid || aab.Type == MyDetectedEntityType.Planet)
{
mb = aab.HitPosition.Value;
pyl = cmr.WorldMatrix.Forward;
pyl2 = cmr.WorldMatrix.Backward;
Up = cmr.WorldMatrix.Up;
Down = cmr.WorldMatrix.Down;
Left = cmr.WorldMatrix.Left;
Right = cmr.WorldMatrix.Right;
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * times;
aabName = aab.Name;
aabType = aab.Type + "";
aabRelationship = aab.Relationship + "";
aabId = aab.EntityId + "";
}
}
}
else if (!yxcs)
{
txt.WriteText("等待运行参数");
cmr.EnableRaycast = true;
}
if (tp)
{
IGC.SendBroadcastMessage(mz, "Return");
txt.WriteText("终止挖掘任务,以不防撞模式返回...\n等待下一次任务");
tp2 = false;
}
else if (tp2)
{
IGC.SendBroadcastMessage(mz, "Retreat");
txt.WriteText("终止挖掘任务,以防撞模式返回...\n等待下一次任务");
tp = false;
}
else if (!mb.IsZero() && mod == 1)
{
mb3 = mb + pyl * sd;
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",fz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId);
}
else if (!mb.IsZero() && mod == 3)
{
mb3 = mb + pyl * sd;
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",bfz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 不避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId);
}
else if (!mb.IsZero() && mod == 2)
{
if (IGC.RegisterBroadcastListener("times" + mz).AcceptMessage().Data + "" == "0")
{
times++;
if (bs == 1)
{
mb3 = mb + pyl * sd * times;
}
else if (bs == 2)
{
int sdbs = (times / 5) + 1;
int fx = times % 5;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//上
else if (fx == 2)
{
mb += Up * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * sd * DistanceBetween;
}
//下
else if (fx == 3)
{
mb += Down * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * sd * DistanceBetween;
}
//左
else if (fx == 4)
{
mb += Left * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * sd * DistanceBetween;
}
//右
else if (fx == 0)
{
mb += Right * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * sd * DistanceBetween;
}
}
else if (bs == 3)
{
int sdbs = (times / 9) + 1;
int fx = times % 9;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//左上
else if (fx == 2)
{
mb += Left * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Up * DistanceBetween;
}
//上
else if (fx == 3)
{
mb += Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * DistanceBetween;
}
//右上
else if (fx == 4)
{
mb += Right * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Up * DistanceBetween;
}
//右
else if (fx == 5)
{
mb += Right * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween;
}
//右下
else if (fx == 6)
{
mb += Right * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Down * DistanceBetween;
}
//下
else if (fx == 7)
{
mb = mb + pyl2 * gd + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * DistanceBetween;
}
//左下
else if (fx == 8)
{
mb += Left * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Down * DistanceBetween;
}
//左
else if (fx == 0)
{
mb += Left * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween;
}
}
}
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",fz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId + "\n已执行次数:" + ttm);
}
else if (!mb.IsZero() && mod == 4)
{
if (IGC.RegisterBroadcastListener("times" + mz).AcceptMessage().Data + "" == "0")
{
times++;
if (bs == 1)
{
mb3 = mb + pyl * sd * times;
}
else if (bs == 2)
{
int sdbs = (times / 5) + 1;
int fx = times % 5;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//上
else if (fx == 2)
{
mb += Up * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * sd * DistanceBetween;
}
//下
else if (fx == 3)
{
mb += Down * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * sd * DistanceBetween;
}
//左
else if (fx == 4)
{
mb += Left * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * sd * DistanceBetween;
}
//右
else if (fx == 0)
{
mb += Right * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * sd * DistanceBetween;
}
}
else if (bs == 3)
{
int sdbs = (times / 9) + 1;
int fx = times % 9;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//左上
else if (fx == 2)
{
mb += Left * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Up * DistanceBetween;
}
//上
else if (fx == 3)
{
mb += Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * DistanceBetween;
}
//右上
else if (fx == 4)
{
mb += Right * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Up * DistanceBetween;
}
//右
else if (fx == 5)
{
mb += Right * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween;
}
//右下
else if (fx == 6)
{
mb += Right * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Down * DistanceBetween;
}
//下
else if (fx == 7)
{
mb = mb + pyl2 * gd + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * DistanceBetween;
}
//左下
else if (fx == 8)
{
mb += Left * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Down * DistanceBetween;
}
//左
else if (fx == 0)
{
mb += Left * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween;
}
}
}
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",bfz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 不避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId + "\n已执行次数:" + ttm);
}
if (mb.IsZero())
{
aab = cmr.Raycast(dst, 0, 0);
if (!aab.IsEmpty() && aab.Type == MyDetectedEntityType.Asteroid || aab.Type == MyDetectedEntityType.Planet)
{
mb = aab.HitPosition.Value;
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * times;
}
}
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
Echo("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
}
}
//-----------------------------以上委派------------------------------------
else
{
var txt = Me.GetSurface(0);
txt.WriteText("脚本运行状态:中断!\n原因:类型不合要求\n未知类型:" + lx + "\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
Echo("脚本运行状态:中断!\n原因:类型不合要求\n未知类型:" + lx + "\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
}
}
else
{
var txt = Me.GetSurface(0);
txt.WriteText("脚本运行状态:中断!\n原因:类型不合要求\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
Echo("脚本运行状态:中断!\n原因:类型不合要求\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
}
}
//---------------------以下保存-----------------------
public void Save()
{
if (lx == "-矿机")
{
Storage = st + "|" + oc + "|" + sfxf + "|" + fh + "|" + IsClosing + "|" + ks + "|" + csh + "|" + cnnt + "|" + yjd + "|" + bt + "|" + mb.X + "," + mb.Y + "," + mb.Z + "|" + xf.X + "," + xf.Y + "," + xf.Z + "|" + mb3.X + "," + mb3.Y + "," + mb3.Z;
}
else if (lx == "-本体")
{
Storage = stt + "|" + wc + "|" + ejd + "|" + ks + "|" + fz;
}
else
{
Storage = tp + "|" + tp2 + "|" + yxcs + "|" + times + "|" + pyl.X + "," + pyl.Y + "," + pyl.Z + "|" + pyl2.X + "," + pyl2.Y + "," + pyl2.Z + "|" + Up.X + "," + Up.Y + "," + Up.Z + "|" + Down.X + "," + Down.Y + "," + Down.Z + "," + "|" + Left.X + "," + Left.Y + "," + Left.Z + "|" + Right.X + "," + Right.Y + "," + Right.Z + "|" + mb.X + "," + mb.Y + "," + mb.Z + "|" + mb2.X + "," + mb2.Y + "," + mb2.Z + "|" + mb3.X + "," + mb3.Y + "," + mb3.Z + "|" + dst + "|" + mod + "|" + gd + "|" + sd + "|" + aabName + "|" + aabType + "|" + aabRelationship + "|" + aabId;
}
}
//----------------------------------------------------------------------------------------
}
}
using Sandbox.ModAPI.Ingame;
using VRageMath;
using XFEExtension.SpaceEngineers.ScriptingHelper;
namespace AutoMiningScript
{
public class Program : MyGridProgram, IProgramBase
{
//--------------------------------Version 1.32---------------------------------------------
Vector3D yjzb;
Vector3D ejzb;
Vector3D xf;
Vector3D zz;
Vector3D mb;
Vector3D mb2;
Vector3D mb3;
Vector3D pyl;
Vector3D pyl2;
Vector3D Up;
Vector3D Down;
Vector3D Right;
Vector3D Left;
MyDetectedEntityInfo aab;
IMyCameraBlock cmr;
int mod;
int times;
int bs;
double DistanceBetween;
double dst;
double gd;
double sd;
double timer;
double dqjl;
double dqsj;
float speedLmt;
string mz;
string lx;
string aabType;
string aabName;
string aabId;
string aabRelationship;
bool tp;
bool tp2;
bool ejd;
bool IsClosing;
bool wc = true;
bool fz;
bool st;
bool gy;
bool bt = true;
bool stt = true;
bool crun;
bool ks;
bool yxcs;
bool yjd;
bool cnnt = true;
bool oc;
bool sfxf;
bool fh;
bool csh;
List<IMyShipDrill> ztz = new List<IMyShipDrill>();
public Program()
{
Runtime.UpdateFrequency = UpdateFrequency.Update1;
}
public static Vector3D ZV(string[] dzh)
{
Vector3D x;
x.X = double.Parse(dzh[0]);
x.Y = double.Parse(dzh[1]);
x.Z = double.Parse(dzh[2]);
return x;
}
public static Vector3D ZVV(string dzh)
{
Vector3D x;
x.X = double.Parse(dzh.Split(',')[0]);
x.Y = double.Parse(dzh.Split(',')[1]);
x.Z = double.Parse(dzh.Split(',')[2]);
return x;
}
public static double DST(Vector3D qs, Vector3D zd)
{
double ddst = Math.Sqrt(Math.Pow(zd.X - qs.X, 2) + Math.Pow(zd.Y - qs.Y, 2) + Math.Pow(zd.Z - qs.Z, 2));
return ddst;
}
public void Main(string argument, UpdateType updateSource)
{
if (Me.CustomName.Length > 3)
{
lx = Me.CustomName.Substring(Me.CustomName.Length - 3, 3);
mz = Me.CustomName.Replace(lx, "");
//-----------------------------以下矿机------------------------------------
if (lx == "-矿机")
{
var txt = Me.GetSurface(0);
double xfdst;
if (Me.CustomData == "")
{
Me.CustomData = "--------已设置类型:矿机--------\n直接修改下列中括号里的内容\n矿机挖掘时候的速度(单位 米/秒)[0.5] 建议0.1-1之间\n开始挖掘距离(单位 米)[8] 即距离陨石表面多少米开始挖掘,\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
else if (Me.CustomData.Length > 25 && Me.CustomData.Substring(0, 24) != "--------已设置类型:矿机--------")
{
Me.CustomData = "--------已设置类型:矿机--------\n直接修改下列中括号里的内容\n矿机挖掘时候的速度(单位 米)[0.5]\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
if (GridTerminalSystem.GetBlockWithName("远程控制-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:远程控制-" + mz + "\n请检查是否安装方块 远程控制 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:远程控制-" + mz + "\n请检查是否安装方块 远程控制 或者名称是否有误并 重命名");
}
else if (GridTerminalSystem.GetBlockWithName("连接器-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:连接器-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:连接器-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
}
else if (GridTerminalSystem.GetBlockGroupWithName("钻头-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到编组:钻头-" + mz + "\n请检查是否有编组 钻头-" + mz + "或者编组的名称是否有误并 重新编组");
Echo("脚本运行状态:中断!\n原因:\n未找到编组:钻头-" + mz + "\n请检查是否有编组 钻头-" + mz + "或者编组的名称是否有误并 重新编组");
}
else
{
if (Me.CustomData.Split(new char[2] { '[', ']' }).Count() >= 5)
{
bool zh1 = float.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[1], out speedLmt);
bool zh2 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[3], out xfdst);
if (zh1 && zh2)
{
if (!bt)
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n挖掘速度限制:" + speedLmt + "m/s\n开始挖掘距离:" + xfdst + "m\n" + Storage + "\nMade by XFEstudio");
}
var rem = GridTerminalSystem.GetBlockWithName("远程控制-" + mz) as IMyRemoteControl;
var ljq = GridTerminalSystem.GetBlockWithName("连接器-" + mz) as IMyShipConnector;
GridTerminalSystem.GetBlockGroupWithName("钻头-" + mz).GetBlocksOfType(ztz);
timer += Runtime.TimeSinceLastRun.TotalSeconds;
//------------------------------------------------------------
IMyBroadcastListener a = IGC.RegisterBroadcastListener("zy" + mz);
bool xx = a.HasPendingMessage;
MyIGCMessage j = a.AcceptMessage();
string js = j.Data + "";
string[] fg = js.Split(',');
//------------------------------------------------------------
IMyBroadcastListener b = IGC.RegisterBroadcastListener("cs" + mz);
MyIGCMessage j2 = b.AcceptMessage();
string js2 = j2.Data + "";
string[] fg2 = js2.Split(',');
//------------------------------------------------------------
IMyBroadcastListener c = IGC.RegisterBroadcastListener("ccs" + mz);
MyIGCMessage j3 = c.AcceptMessage();
string js3 = j3.Data + "";
string[] fg3 = js3.Split(',');
//------------------------------------------------------------
IMyBroadcastListener d = IGC.RegisterBroadcastListener("cccs" + mz);
MyIGCMessage j4 = d.AcceptMessage();
string js4 = j4.Data + "";
string[] fg4 = js4.Split(',');
//------------------------------------------------------------
IMyBroadcastListener e = IGC.RegisterBroadcastListener("fz" + mz);
MyIGCMessage j5 = e.AcceptMessage();
string fz = j5.Data + "";
//------------------------------------------------------------
if (Storage != null && Storage != "")
{
string[] STGfg = Storage.Split('|');
if (STGfg.Length >= 13)
{
try
{
st = bool.Parse(STGfg[0]);
oc = bool.Parse(STGfg[1]);
sfxf = bool.Parse(STGfg[2]);
fh = bool.Parse(STGfg[3]);
IsClosing = bool.Parse(STGfg[4]);
ks = bool.Parse(STGfg[5]);
csh = bool.Parse(STGfg[6]);
cnnt = bool.Parse(STGfg[7]);
yjd = bool.Parse(STGfg[8]);
bt = bool.Parse(STGfg[9]);
mb = ZVV(STGfg[10]);
xf = ZVV(STGfg[11]);
mb3 = ZVV(STGfg[12]);
}
catch (Exception ex)
{
Echo($"出现异常:{ex.Message}");
}
Storage = "";
}
}
//------------------------------------------------------------
if (fg2.Count() == 4 && fg2[3] == "3" && !st && cnnt)
{
st = true;
oc = false;
sfxf = false;
fh = false;
IsClosing = false;
ks = false;
csh = false;
cnnt = false;
ljq.Disconnect();
mb = ZV(fg2);
xf = ZV(fg3);
mb3 = ZV(fg4);
txt.WriteText("矿物位置:" + mb);
rem.DampenersOverride = true;
rem.SetCollisionAvoidance(false);
}
//------------------------------------------------------------
double jl = DST(yjzb, rem.WorldAABB.Center);
rem.FlightMode = FlightMode.OneWay;
if (ljq.Status == MyShipConnectorStatus.Connectable && !st)
{
cnnt = true;
ljq.Connect();
rem.ClearWaypoints();
rem.SetAutoPilotEnabled(false);
IGC.SendBroadcastMessage("zfb" + mz, "2");
rem.DampenersOverride = false;
foreach (IMyShipDrill zt in ztz)
{
zt.Enabled = false;
}
}
if (ljq.Status == MyShipConnectorStatus.Connected && !st)
{
txt.WriteText("矿机:" + mz + "\n正在等待挖矿任务...");
}
if (bt)
{
txt.WriteText("等待与本体连接器连接");
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n等待与本体连接\nMade by XFEstudio");
rem.SpeedLimit = 100;
bt = false;
}
if (cnnt)
{
IGC.SendBroadcastMessage("zfb" + mz, "2");
}
//--------------------进入出发点--------------------------
if (st)
{
rem.DampenersOverride = true;
if (!ks && fg.Count() == 4 && fg[3] == "rd")
{
rem.Direction = Base6Directions.Direction.Forward;
if (fg2.Count() == 3)
{
st = false;
cnnt = false;
yjd = false;
rem.ClearWaypoints();
rem.SpeedLimit = 100;
}
else
{
yjzb = ZV(fg);
if (DST(yjzb, rem.WorldAABB.Center) <= 1)
{
if (fz == "fz") rem.SetCollisionAvoidance(true);
else rem.SetCollisionAvoidance(false);
ks = true;
IGC.SendBroadcastMessage("zfb" + mz, "rd");
}
if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(yjzb, "接近出发点...");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
txt.WriteText("正在接近出发点..." + timer);
}
}
else
{
//--------------------开始挖矿--------------------------
if (fg2.Count() == 3)
{
st = false;
cnnt = false;
yjd = false;
rem.ClearWaypoints();
rem.SpeedLimit = 100;
}
else
{
if (fh)
{
rem.Direction = Base6Directions.Direction.Backward;
if (DST(rem.WorldAABB.Center, xf) <= 1 && !sfxf)
{
foreach (IMyShipDrill zt in ztz)
{
zt.Enabled = false;
}
sfxf = true;
rem.SpeedLimit = 100;
st = false;
cnnt = false;
ks = false;
oc = false;
yjd = false;
fh = false;
if (fz == "fz") rem.SetCollisionAvoidance(true);
else rem.SetCollisionAvoidance(false);
IGC.SendBroadcastMessage("zfb" + mz, "0");
IGC.SendBroadcastMessage("times" + mz, "0");
Echo("ST:" + st + "\ntimer:" + timer + "\nCNNT:" + cnnt);
}
else if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(xf, "接近退出悬浮高度");
txt.WriteText("正在进入退出悬浮点:" + DST(rem.WorldAABB.Center, xf));
rem.SetAutoPilotEnabled(true);
timer = 0;
}
}
else
{
double kwjl = DST(rem.WorldAABB.Center, mb3);
rem.Direction = Base6Directions.Direction.Forward;
if (!csh)
{
rem.ClearWaypoints();
rem.AddWaypoint(xf, "靠近矿物目标");
rem.SetAutoPilotEnabled(true);
csh = true;
}
if (!oc && csh)
{
if (DST(rem.WorldAABB.Center, xf) <= 20)
{
oc = true;
rem.SpeedLimit = 5;
timer = 0;
txt.WriteText("已靠近" + kwjl);
rem.SetCollisionAvoidance(false);
}
else
{
rem.SpeedLimit = 100;
txt.WriteText("未靠近" + kwjl);
}
}
//-------------------------------开始执行---------------------
if (oc)
{
if (!sfxf)
{
//------------------准备悬停-------------
txt.WriteText("正在悬停:" + xf);
if (DST(rem.WorldAABB.Center, xf) <= 1)
{
sfxf = true;
rem.SetCollisionAvoidance(false);
}
else if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(xf, "进行悬浮");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
}
else
{
//---------------接近---------------------
if (DST(mb, rem.WorldAABB.Center) <= xfdst)
{
IsClosing = true;
}
//----------------进行挖掘----------------
if (IsClosing)
{
rem.SpeedLimit = speedLmt;
txt.WriteText("正在挖掘:" + kwjl);
foreach (IMyShipDrill zt in ztz)
{
zt.Enabled = true;
}
if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(mb3, "挖掘矿物目标");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
//-----------------------准备退出-------------------------
if (kwjl <= 2)
{
fh = true;
sfxf = false;
rem.SpeedLimit = 5;
}
}
else
{
rem.SpeedLimit = 100;
if (timer >= 1)
{
rem.ClearWaypoints();
rem.AddWaypoint(mb, "挖掘矿物目标");
rem.SetAutoPilotEnabled(true);
timer = 0;
}
}
}
}
}
}
}
}
//--------------------开始停靠--------------------------
else if (!cnnt)
{
rem.Direction = Base6Directions.Direction.Forward;
rem.SetAutoPilotEnabled(true);
if (!yjd)
{
if (j.Data + "" == "" || j.Data + "" == null)
{
txt.WriteText("无");
}
else
{
if (fz == "fz")
{
rem.SetCollisionAvoidance(true);
Echo("fz");
}
else
{
rem.SetCollisionAvoidance(false);
Echo("bfz");
}
if (fg.Count() == 4 && fg[3] == "0")
{
yjd = false;
}
else
{
yjd = true;
}
yjzb = ZV(fg);
txt.WriteText(yjzb + "\n" + jl);
}
if (jl < 2)
{
IGC.SendBroadcastMessage("zfb" + mz, "1");
}
else
{
IGC.SendBroadcastMessage("zfb" + mz, "0");
}
if (timer >= 1 && yjzb.X != 0)
{
rem.ClearWaypoints();
rem.AddWaypoint(yjzb, "zy");
timer = 0;
}
}
else
{
rem.Direction = Base6Directions.Direction.Backward;
rem.SetAutoPilotEnabled(true);
rem.SetCollisionAvoidance(false);
if (j2.Data + "" == "" || j2.Data + "" == null)
{
txt.WriteText("无");
}
else
{
if (fg.Count() == 4 && fg[3] == "0")
{
yjd = false;
}
else
{
yjd = true;
}
ejzb = ZV(fg2);
txt.WriteText(ejzb + "\n" + timer);
}
if (timer >= 1 && ejzb.X != 0)
{
rem.ClearWaypoints();
rem.AddWaypoint(ejzb, "cs");
timer = 0;
}
}
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:数据挖掘速度并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:数据挖掘速度并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
Echo("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
}
}
}
//-----------------------------以上矿机------------------------------------
else if (lx == "-本体")
{
var txt = Me.GetSurface(0);
if (Me.CustomData == "")
{
Me.CustomData = "--------已设置类型:本体--------\n直接修改下列中括号里的内容\n停靠点悬停距离(单位 米):[15]\n停靠点悬停时间(单位 秒):[10]\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
else if (Me.CustomData.Length > 25 && Me.CustomData.Substring(0, 24) != "--------已设置类型:本体--------")
{
Me.CustomData = "--------已设置类型:本体--------\n直接修改下列中括号里的内容\n停靠点悬停距离(单位 米):[15]\n停靠点悬停时间(单位 秒):[10]\n注意事项:矿船的连接器必须和远程控制在同一条直线上,不然会对不齐";
}
if (Me.CustomData.Split(new char[2] { '[', ']' }).Count() >= 5)
{
if (GridTerminalSystem.GetBlockWithName("连接器本体-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:连接器本体-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:连接器本体-" + mz + "\n请检查是否安装方块 连接器 或者名称是否有误并 重命名");
}
else if (GridTerminalSystem.GetBlockWithName("指引灯-" + mz) == null)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n未找到方块:指引灯-" + mz + "\n请检查是否安装方块 聚光灯 或者名称是否有误并 重命名");
Echo("脚本运行状态:中断!\n原因:\n未找到方块:指引灯-" + mz + "\n请检查是否安装方块 聚光灯 或者名称是否有误并 重命名");
}
else
{
var yljq = GridTerminalSystem.GetBlockWithName("连接器本体-" + mz) as IMyFunctionalBlock;
var zyjgd = GridTerminalSystem.GetBlockWithName("指引灯-" + mz) as IMyLightingBlock;
bool zh1 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[1], out dqjl);
bool zh2 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[3], out dqsj);
if (!zh1)
{
txt.WriteText("脚本运行状态:中断!\n原因:数据停靠距离并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:数据停靠距离并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (!zh2)
{
txt.WriteText("脚本运行状态:中断!\n原因:数据停靠时间并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:数据停靠时间并非一个数值:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (zh1 && zh2)
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n停靠点距离连接器距离:" + dqjl + "\n停靠时间:" + dqsj + "\n\nMade by XFEstudio");
}
timer += Runtime.TimeSinceLastRun.TotalSeconds;
IMyBroadcastListener rcv = IGC.RegisterBroadcastListener("zfb" + mz);
bool xx = rcv.HasPendingMessage;
MyIGCMessage j = rcv.AcceptMessage();
zz = yljq.WorldAABB.Center + yljq.WorldMatrix.Forward * dqjl;
if (Storage != null && Storage != "")
{
string[] STGfg = Storage.Split('|');
if (STGfg.Length >= 5)
{
try
{
stt = bool.Parse(STGfg[0]);
wc = bool.Parse(STGfg[1]);
ejd = bool.Parse(STGfg[2]);
ks = bool.Parse(STGfg[3]);
fz = bool.Parse(STGfg[4]);
}
catch (Exception ex)
{
Echo($"发生异常:{ex.Message}");
}
Storage = "";
}
}
if (j.Data + "" == "0")
{
wc = false;
stt = false;
timer = 0;
}
if (j.Data + "" == "1")
{
ejd = true;
timer = 0;
}
if (j.Data + "" == "2" && !wc)
{
wc = true;
ejd = false;
timer = 0;
}
if (j.Data + "" == "rd")
{
ks = true;
}
if (ejd)
{
zyjgd.Color = Color.Red;
}
else
{
zyjgd.Color = Color.White;
}
if (stt)
{
wc = false;
IMyBroadcastListener bkrcv = IGC.RegisterBroadcastListener(mz);
MyIGCMessage bkj = bkrcv.AcceptMessage();
string bkjs = bkj.Data + "";
string[] bkfg = bkjs.Split(',');
if (bkj.Data + "" == "" || bkj.Data + "" == null)
{
txt.WriteText("无");
Echo("无");
}
else if (bkj.Data + "" == "Return")
{
stt = false;
ks = false;
fz = false;
wc = false;
}
else if (bkj.Data + "" == "Retreat")
{
stt = false;
ks = false;
fz = true;
wc = false;
}
else
{
Echo(bkjs);
if (bkfg[9] == "fz")
{
fz = true;
}
else if (bkfg[9] == "bfz")
{
fz = false;
}
string[] bkfg2 = new string[3];
string[] bkfg3 = new string[3];
bkfg2[0] = bkfg[3];
bkfg2[1] = bkfg[4];
bkfg2[2] = bkfg[5];
bkfg3[0] = bkfg[6];
bkfg3[1] = bkfg[7];
bkfg3[2] = bkfg[8];
mb = ZV(bkfg);
mb2 = ZV(bkfg2);
mb3 = ZV(bkfg3);
if (fz) IGC.SendBroadcastMessage("fz" + mz, "fz");
else IGC.SendBroadcastMessage("fz" + mz, "bfz");
if (ks)
{
zyjgd.Color = Color.White;
IGC.SendBroadcastMessage("cs" + mz, mb.X + "," + mb.Y + "," + mb.Z + ",3");
IGC.SendBroadcastMessage("ccs" + mz, mb2.X + "," + mb2.Y + "," + mb2.Z);
IGC.SendBroadcastMessage("cccs" + mz, mb3.X + "," + mb3.Y + "," + mb3.Z);
}
else
{
zyjgd.Color = Color.Red;
IGC.SendBroadcastMessage("cs" + mz, mb.X + "," + mb.Y + "," + mb.Z + ",3");
IGC.SendBroadcastMessage("ccs" + mz, mb2.X + "," + mb2.Y + "," + mb2.Z);
IGC.SendBroadcastMessage("cccs" + mz, mb3.X + "," + mb3.Y + "," + mb3.Z);
IGC.SendBroadcastMessage("zy" + mz, zz.X + "," + zz.Y + "," + zz.Z + ",rd");
}
}
}
else if (!wc)
{
IGC.SendBroadcastMessage("cs" + mz, yljq.WorldVolume.Center.X + "," + yljq.WorldVolume.Center.Y + "," + yljq.WorldVolume.Center.Z);
if (ejd)
{
IGC.SendBroadcastMessage("zy" + mz, zz.X + "," + zz.Y + "," + zz.Z + ",1");
}
else
{
if (fz) IGC.SendBroadcastMessage("fz" + mz, "fz");
else IGC.SendBroadcastMessage("fz" + mz, "bfz");
IGC.SendBroadcastMessage("zy" + mz, zz.X + "," + zz.Y + "," + zz.Z + ",0");
}
}
else if (wc && timer >= dqsj)
{
ks = false;
fz = false;
stt = true;
timer = 0;
}
txt.WriteText("名称:" + mz + "\n模式:本体\n坐标:\n\n方块:连接器本体-" + mz + "\n" + yljq.WorldAABB.Center + "\n方块:指引灯-" + mz + "\n" + zyjgd.WorldAABB.Center + "\n已连接时间" + timer);
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
Echo("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
}
}
//-----------------------------以上本体------------------------------------
else if (lx == "-委派")
{
var txt = Me.GetSurface(0);
if (Me.CustomData == "")
{
Me.CustomData = "--------已设置类型:委派--------\n直接修改下列中括号里的内容\n是否共用摄像机[否]\n共用摄像机名称[请输入名称](如果共用为否则可以忽略)\n挖掘范围(请输入直线,十字,或大范围)[大范围]\n挖掘范围间距(单位 米)[3]\n注意事项:委派模式下,需要在运行本编程块的时候输入参数,如果是给矿机下达挖掘指令则需要4个参数,中间用英文的逗号隔开*注意是英文的逗号,如果不运行或者报错说明您使用的是中文的逗号,请切换输入法\n而如果是给无人机下达返回的指令则只需要一个返回参数\n4个参数分别是:模式,最远标点距离(建议2000),悬浮高度,挖掘深度 且这4个参数都不需要您带上单位,只输入数字\n模式:1表示半自动防撞,2表示全自动防撞,3表示半自动不防撞,4表示全自动不防撞,开启防撞矿机可能会在一个地方一直ob,而防撞的作用则是适用于避障,例如从矿石的一面直线飞到另一面\n最远标点:即这个摄像机能投射到矿石表面的点最远有多远(最大标点距离),建议2000,超过5000扫描时间会很长\n悬浮高度:矿船从本体前往的点即为悬浮高度,适当运用可避障,建议大于2倍矿船的长度,但也不建议特别高,除非特殊情况\n挖掘深度:即每次往下挖多深,根据矿机的载荷即储物大小来定,小网格建议输入15\n1个返回参数是:stop或者stop2,这两返回参数只需选择输入一个,stop代表不以防撞模式返回而stop2则是以防撞模式返回\n没看懂不要紧,建议输入以下示例:\n示例1:4,2000,15,15 意思是以全自动不防撞,最大扫描距离2000,悬浮高度15,挖掘深度15来运行\n示例2:stop 意思是以不防撞模式返回\n示例3:stop2 意思是以防撞模式返回";
}
else if (Me.CustomData.Length > 25 && Me.CustomData.Substring(0, 24) != "--------已设置类型:委派--------")
{
Me.CustomData = "--------已设置类型:委派--------\n直接修改下列中括号里的内容\n是否共用摄像机[否]\n共用摄像机名称[请输入名称](如果共用为否则可以忽略)\n挖掘范围(请输入直线,十字,或大范围)[大范围]\n挖掘范围间距(单位 米)[3]\n注意事项:委派模式下,需要在运行本编程块的时候输入参数,如果是给矿机下达挖掘指令则需要4个参数,中间用英文的逗号隔开*注意是英文的逗号,如果不运行或者报错说明您使用的是中文的逗号,请切换输入法\n而如果是给无人机下达返回的指令则只需要一个返回参数\n4个参数分别是:模式,最远标点距离(建议2000),悬浮高度,挖掘深度 且这4个参数都不需要您带上单位,只输入数字\n模式:1表示半自动防撞,2表示全自动防撞,3表示半自动不防撞,4表示全自动不防撞,开启防撞矿机可能会在一个地方一直ob,而防撞的作用则是适用于避障,例如从矿石的一面直线飞到另一面\n最远标点:即这个摄像机能投射到矿石表面的点最远有多远(最大标点距离),建议2000,超过5000扫描时间会很长\n悬浮高度:矿船从本体前往的点即为悬浮高度,适当运用可避障,建议大于2倍矿船的长度,但也不建议特别高,除非特殊情况\n挖掘深度:即每次往下挖多深,根据矿机的载荷即储物大小来定,小网格建议输入15\n1个返回参数是:stop或者stop2,这两返回参数只需选择输入一个,stop代表不以防撞模式返回而stop2则是以防撞模式返回\n没看懂不要紧,建议输入以下示例:\n示例1:4,2000,15,15 意思是以全自动不防撞,最大扫描距离2000,悬浮高度15,挖掘深度15来运行\n示例2:stop 意思是以不防撞模式返回\n示例3:stop2 意思是以防撞模式返回";
}
if (Me.CustomData.Split(new char[2] { '[', ']' }).Count() >= 9)
{
string nam = Me.CustomData.Split(new char[2] { '[', ']' })[3];
if (Me.CustomData.Split(new char[2] { '[', ']' })[1] == "是")
{
gy = true;
if (GridTerminalSystem.GetBlockWithName(nam) != null)
{
cmr = GridTerminalSystem.GetBlockWithName(Me.CustomData.Split(new char[2] { '[', ']' })[3]) as IMyCameraBlock;
crun = true;
}
else
{
crun = false;
txt.WriteText("脚本运行状态:中断!\n原因:\n在共用模式下,未找到名称为:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + " 的摄像机\n请检查输入的名称或放置该摄像机");
Echo("脚本运行状态:中断!\n原因:未找到名称为:" + Me.CustomData.Split(new char[2] { '[', ']' })[3] + " 的摄像机\n请检查输入的名称或放置该摄像机");
}
}
else if (Me.CustomData.Split(new char[2] { '[', ']' })[1] == "否")
{
gy = false;
if (GridTerminalSystem.GetBlockWithName("摄像机-" + mz) != null)
{
cmr = GridTerminalSystem.GetBlockWithName("摄像机-" + mz) as IMyCameraBlock;
crun = true;
}
else
{
crun = false;
txt.WriteText("脚本运行状态:中断!\n原因:\n在不共用模式下未找到名称为:摄像机-" + mz + " 的摄像机\n请检查输入的名称或放置该摄像机");
Echo("脚本运行状态:中断!\n原因:\n在不共用模式下未找到名称为:摄像机-" + mz + " 的摄像机\n请检查输入的名称或放置该摄像机");
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n是否共用方块只能填入是或否\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:\n是否共用方块只能填入是或否\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (Me.CustomData.Split(new char[2] { '[', ']' })[5] == "直线")
{
bs = 1;
}
else if (Me.CustomData.Split(new char[2] { '[', ']' })[5] == "十字")
{
bs = 2;
}
else if (Me.CustomData.Split(new char[2] { '[', ']' })[5] == "大范围")
{
bs = 3;
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n挖掘范围只能填入直线,十字或大范围\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
Echo("脚本运行状态:中断!\n原因:\n挖掘范围只能填入直线,十字或大范围\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
bool zh1 = double.TryParse(Me.CustomData.Split(new char[2] { '[', ']' })[7], out DistanceBetween);
if (!zh1)
{
txt.WriteText("脚本运行状态:中断!\n原因:\n挖掘范围间距必须是一个数值\n您的输入:" + Me.CustomData.Split(new char[2] { '[', ']' })[7] + "\n请检查输入,如若还报错,请*删除自定义数据里面的全部内容*(删除干净)并重置本程序");
}
if (crun && zh1)
{
if (gy)
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n是否共用摄像机:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n共用摄像机名称:" + nam + "\n挖掘范围" + Me.CustomData.Split(new char[2] { '[', ']' })[5] + "\n挖掘范围间距:" + Me.CustomData.Split(new char[2] { '[', ']' })[7] + "\n\nMade by XFEstudio");
}
else
{
Echo("脚本运行状态:正常" + "\n本编程块类型:" + lx + "\n终端矿机名称:" + mz + "\n\n是否共用摄像机:" + Me.CustomData.Split(new char[2] { '[', ']' })[1] + "\n挖掘范围" + Me.CustomData.Split(new char[2] { '[', ']' })[5] + "\n挖掘范围间距:" + Me.CustomData.Split(new char[2] { '[', ']' })[7] + "\n\nMade by XFEstudio");
}
if (Storage != null && Storage != "")
{
string[] STGfg = Storage.Split('|');
if (STGfg.Length >= 21)
{
try
{
tp = bool.Parse(STGfg[0]);
tp2 = bool.Parse(STGfg[1]);
yxcs = bool.Parse(STGfg[2]);
times = int.Parse(STGfg[3]);
pyl = ZVV(STGfg[4]);
pyl2 = ZVV(STGfg[5]);
Up = ZVV(STGfg[6]);
Down = ZVV(STGfg[7]);
Left = ZVV(STGfg[8]);
Right = ZVV(STGfg[9]);
mb = ZVV(STGfg[10]);
mb2 = ZVV(STGfg[11]);
mb3 = ZVV(STGfg[12]);
dst = double.Parse(STGfg[13]);
mod = int.Parse(STGfg[14]);
gd = double.Parse(STGfg[15]);
sd = double.Parse(STGfg[16]);
aabName = STGfg[17];
aabType = STGfg[18];
aabRelationship = STGfg[19];
aabId = STGfg[20];
}
catch (Exception ex)
{
Echo($"发生异常:{ex.Message}");
}
Storage = "";
}
}
Echo(mb + "\n\n" + mb2 + "\n\n" + mb3 + "\n\n" + times + "\n" + mod);
int ttm = times - 1;
if (argument != "")
{
if (argument == "stop")
{
tp = true;
}
else if (argument == "stop2")
{
tp2 = true;
}
else
{
string[] fg = argument.Split(',');
tp = false;
tp2 = false;
yxcs = true;
times = 1;
dst = double.Parse(fg[1]);
mod = int.Parse(fg[0]);
gd = double.Parse(fg[2]);
sd = double.Parse(fg[3]);
cmr.EnableRaycast = true;
aab = cmr.Raycast(dst, 0, 0);
}
if (!aab.IsEmpty())
{
if (mod == 1)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId);
}
else if (mod == 2)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId + "\n已执行次数:" + ttm);
}
else if (mod == 3)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 不避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId);
}
else if (mod == 4)
{
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 不避障" + "\n目标名字:" + aab.Name + "\n类型:" + aab.Type + "\n关系:" + aab.Relationship + "\n坐标:" + aab.HitPosition + "\n实体ID:" + aab.EntityId + "\n已执行次数:" + ttm);
}
if (aab.Type == MyDetectedEntityType.Asteroid || aab.Type == MyDetectedEntityType.Planet)
{
mb = aab.HitPosition.Value;
pyl = cmr.WorldMatrix.Forward;
pyl2 = cmr.WorldMatrix.Backward;
Up = cmr.WorldMatrix.Up;
Down = cmr.WorldMatrix.Down;
Left = cmr.WorldMatrix.Left;
Right = cmr.WorldMatrix.Right;
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * times;
aabName = aab.Name;
aabType = aab.Type + "";
aabRelationship = aab.Relationship + "";
aabId = aab.EntityId + "";
}
}
}
else if (!yxcs)
{
txt.WriteText("等待运行参数");
cmr.EnableRaycast = true;
}
if (tp)
{
IGC.SendBroadcastMessage(mz, "Return");
txt.WriteText("终止挖掘任务,以不防撞模式返回...\n等待下一次任务");
tp2 = false;
}
else if (tp2)
{
IGC.SendBroadcastMessage(mz, "Retreat");
txt.WriteText("终止挖掘任务,以防撞模式返回...\n等待下一次任务");
tp = false;
}
else if (!mb.IsZero() && mod == 1)
{
mb3 = mb + pyl * sd;
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",fz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId);
}
else if (!mb.IsZero() && mod == 3)
{
mb3 = mb + pyl * sd;
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",bfz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:半自动 - 不避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId);
}
else if (!mb.IsZero() && mod == 2)
{
if (IGC.RegisterBroadcastListener("times" + mz).AcceptMessage().Data + "" == "0")
{
times++;
if (bs == 1)
{
mb3 = mb + pyl * sd * times;
}
else if (bs == 2)
{
int sdbs = (times / 5) + 1;
int fx = times % 5;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//上
else if (fx == 2)
{
mb += Up * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * sd * DistanceBetween;
}
//下
else if (fx == 3)
{
mb += Down * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * sd * DistanceBetween;
}
//左
else if (fx == 4)
{
mb += Left * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * sd * DistanceBetween;
}
//右
else if (fx == 0)
{
mb += Right * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * sd * DistanceBetween;
}
}
else if (bs == 3)
{
int sdbs = (times / 9) + 1;
int fx = times % 9;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//左上
else if (fx == 2)
{
mb += Left * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Up * DistanceBetween;
}
//上
else if (fx == 3)
{
mb += Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * DistanceBetween;
}
//右上
else if (fx == 4)
{
mb += Right * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Up * DistanceBetween;
}
//右
else if (fx == 5)
{
mb += Right * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween;
}
//右下
else if (fx == 6)
{
mb += Right * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Down * DistanceBetween;
}
//下
else if (fx == 7)
{
mb = mb + pyl2 * gd + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * DistanceBetween;
}
//左下
else if (fx == 8)
{
mb += Left * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Down * DistanceBetween;
}
//左
else if (fx == 0)
{
mb += Left * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween;
}
}
}
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",fz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId + "\n已执行次数:" + ttm);
}
else if (!mb.IsZero() && mod == 4)
{
if (IGC.RegisterBroadcastListener("times" + mz).AcceptMessage().Data + "" == "0")
{
times++;
if (bs == 1)
{
mb3 = mb + pyl * sd * times;
}
else if (bs == 2)
{
int sdbs = (times / 5) + 1;
int fx = times % 5;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//上
else if (fx == 2)
{
mb += Up * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * sd * DistanceBetween;
}
//下
else if (fx == 3)
{
mb += Down * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * sd * DistanceBetween;
}
//左
else if (fx == 4)
{
mb += Left * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * sd * DistanceBetween;
}
//右
else if (fx == 0)
{
mb += Right * sd * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * sd * DistanceBetween;
}
}
else if (bs == 3)
{
int sdbs = (times / 9) + 1;
int fx = times % 9;
//前
if (fx == 1)
{
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * sdbs;
}
//左上
else if (fx == 2)
{
mb += Left * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Up * DistanceBetween;
}
//上
else if (fx == 3)
{
mb += Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Up * DistanceBetween;
}
//右上
else if (fx == 4)
{
mb += Right * DistanceBetween + Up * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Up * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Up * DistanceBetween;
}
//右
else if (fx == 5)
{
mb += Right * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween;
}
//右下
else if (fx == 6)
{
mb += Right * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Right * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Right * DistanceBetween + Down * DistanceBetween;
}
//下
else if (fx == 7)
{
mb = mb + pyl2 * gd + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Down * DistanceBetween;
}
//左下
else if (fx == 8)
{
mb += Left * DistanceBetween + Down * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween + Down * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween + Down * DistanceBetween;
}
//左
else if (fx == 0)
{
mb += Left * DistanceBetween;
mb2 = mb + pyl2 * gd + Left * DistanceBetween;
mb3 = mb + pyl * sd * sdbs + Left * DistanceBetween;
}
}
}
IGC.SendBroadcastMessage(mz, mb.X + "," + mb.Y + "," + mb.Z + "," + mb2.X + "," + mb2.Y + "," + mb2.Z + "," + mb3.X + "," + mb3.Y + "," + mb3.Z + ",bfz");
txt.WriteText("目标矿机终端名称:" + mz + "\n模式:全自动 - 不避障" + "\n目标名字:" + aabName + "\n类型:" + aabType + "\n关系:" + aabRelationship + "\n坐标:" + mb + "\n实体ID:" + aabId + "\n已执行次数:" + ttm);
}
if (mb.IsZero())
{
aab = cmr.Raycast(dst, 0, 0);
if (!aab.IsEmpty() && aab.Type == MyDetectedEntityType.Asteroid || aab.Type == MyDetectedEntityType.Planet)
{
mb = aab.HitPosition.Value;
mb2 = mb + pyl2 * gd;
mb3 = mb + pyl * sd * times;
}
}
}
}
else
{
txt.WriteText("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
Echo("脚本运行状态:中断!\n原因:\n自定义数据已被损毁,请删除全部自定义里的内容并重置本编程块");
}
}
//-----------------------------以上委派------------------------------------
else
{
var txt = Me.GetSurface(0);
txt.WriteText("脚本运行状态:中断!\n原因:类型不合要求\n未知类型:" + lx + "\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
Echo("脚本运行状态:中断!\n原因:类型不合要求\n未知类型:" + lx + "\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
}
}
else
{
var txt = Me.GetSurface(0);
txt.WriteText("脚本运行状态:中断!\n原因:类型不合要求\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
Echo("脚本运行状态:中断!\n原因:类型不合要求\n请更改编程块的名称\n(注意是中文的“ - ”)\n格式:矿机名字-类型\n类型有三种:矿机 本体 委派,分别放置于矿机 矿机的母舰 标点(标点可以是独立的探矿飞船也可以放在矿机的母舰上) 的编程块,每个矿机都需要这三要素\n例如:矿机1号-矿机\n矿机1号-本体\n矿机1号-委派\n以上三要素才能构成一个完整的无人矿机系统");
}
}
//---------------------以下保存-----------------------
public void Save()
{
if (lx == "-矿机")
{
Storage = st + "|" + oc + "|" + sfxf + "|" + fh + "|" + IsClosing + "|" + ks + "|" + csh + "|" + cnnt + "|" + yjd + "|" + bt + "|" + mb.X + "," + mb.Y + "," + mb.Z + "|" + xf.X + "," + xf.Y + "," + xf.Z + "|" + mb3.X + "," + mb3.Y + "," + mb3.Z;
}
else if (lx == "-本体")
{
Storage = stt + "|" + wc + "|" + ejd + "|" + ks + "|" + fz;
}
else
{
Storage = tp + "|" + tp2 + "|" + yxcs + "|" + times + "|" + pyl.X + "," + pyl.Y + "," + pyl.Z + "|" + pyl2.X + "," + pyl2.Y + "," + pyl2.Z + "|" + Up.X + "," + Up.Y + "," + Up.Z + "|" + Down.X + "," + Down.Y + "," + Down.Z + "," + "|" + Left.X + "," + Left.Y + "," + Left.Z + "|" + Right.X + "," + Right.Y + "," + Right.Z + "|" + mb.X + "," + mb.Y + "," + mb.Z + "|" + mb2.X + "," + mb2.Y + "," + mb2.Z + "|" + mb3.X + "," + mb3.Y + "," + mb3.Z + "|" + dst + "|" + mod + "|" + gd + "|" + sd + "|" + aabName + "|" + aabType + "|" + aabRelationship + "|" + aabId;
}
}
//----------------------------------------------------------------------------------------
}
}