public MCPYAPI(MCCSAPI api) { this.api = api; TPFuncPtr = new Dictionary <string, int> { { "1.16.200.2", 0x00C82C60 }, { "1.16.201.2", 0x00C82C60 } }; }
public static void init(MCCSAPI api) { bool f = true; api.addBeforeActListener(EventKey.onServerCmdOutput, x => { var b = BaseEvent.getFrom(x) as ServerCmdOutputEvent; if (f && b.output == "No targets matched selector") { return(false); } //Console.WriteLine("OUTPUT:{0}",b.output); return(true); }); api.addBeforeActListener(EventKey.onServerCmd, x => { var a = BaseEvent.getFrom(x) as ServerCmdEvent; if (a.cmd == "cleaner") { if (f == true) { f = false; Console.WriteLine("[Cleaner]自动清理功能关闭"); return(false); } else { f = true; Console.WriteLine("[Cleaner]自动清理功能开启"); } return(false); } return(true); }); Task t = new Task(() => { while (f) { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§b[§e扫地姬§b]§a掉落物将在§c60§a秒后清除!\"}]}"); Thread.Sleep(30000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§b[§e扫地姬§b]§a掉落物将在§c30§a秒后清除!\"}]}"); Thread.Sleep(20000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§b[§e扫地姬§b]§a掉落物将在§c10§a秒后清除!\"}]}"); Thread.Sleep(5000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§b[§e扫地姬§b]§a马上你的掉落物就没了,还不捡起来!\"}]}"); Thread.Sleep(5000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§b[§e扫地姬§b]§a掉落物清除完毕!\"}]}"); api.runcmd("kill @e[type=item]"); Thread.Sleep(1200000); } }); t.Start(); }
public MCLUAAPI(MCCSAPI api) { this.api = api; TPFuncPtr = new Dictionary <string, int> { { "1.16.200.2", 0x00C82C60 }, { "1.16.201.2", 0x00C82C60 }, { "1.16.201.3", 0x00C82C60 }, { "1.16.210.05", 0x007BA190 }, { "1.16.210.06", 0x007B1D20 } }; }
static string CsGetUuid(List <IntPtr> pls, string pln, MCCSAPI api) { foreach (IntPtr pl in pls) { CsPlayer cpl = new CsPlayer(api, pl); if (cpl.getName() == pln) { return(cpl.Uuid); } } return(string.Empty); }
// 初始化hook public static void init(MCCSAPI api) { mcapi = api; // 改写原始代码数据 if (api.VERSION == "1.16.100.4") { byte[] jmp_expplaycheck = { 0xeb, 0x07, 0xF6, 0x00, 0x04, 0xeb, 0x00, 0xeb, 0x00 }; // IDA jmp short + 7 if (api.writeHardMemory(0x0AC36F9, jmp_expplaycheck, 9)) { Console.WriteLine("[C# hack] JS 引擎实验性验证已跳过。"); } else { Console.WriteLine("[C# hack] Some hardcode err excption."); } } // 初始化RVA,或可远程获取 ArrayList al = new ArrayList(new int[] { 0x00B9D4C0, 0x00429850, 0x004ECFD0 }); RVAs["1.16.1.2"] = al; ArrayList a2 = new ArrayList(new int[] { 0x00B9D100, 0x00429820, 0x004ECFA0 }); RVAs["1.16.10.2"] = a2; ArrayList a3 = new ArrayList(new int[] { 0x00BA3560, 0x0042D250, 0x004F0920 }); RVAs["1.16.20.3"] = a3; ArrayList a4 = new ArrayList(new int[] { 0x00BA1200, 0x0042D260, 0x004F0930 }); RVAs["1.16.40.2"] = a4; try { ArrayList rval = null; if (RVAs.TryGetValue(api.VERSION, out rval)) { if (rval != null && rval.Count > 0) { IntPtr tmpCrtorg = IntPtr.Zero; api.cshook((int)rval[0], // IDA ServerScoreboard::onPlayerJoined Marshal.GetFunctionPointerForDelegate(cs_crthookptr), out tmpCrtorg); _CS_ONCREATEPLAYER_org = tmpCrtorg; tmpCrtorg = IntPtr.Zero; api.cshook((int)rval[1], // IDA CommandRegistry::registerCommand Marshal.GetFunctionPointerForDelegate(cs_reghookptr), out tmpCrtorg); _CS_REGISTERCOMMAND_org = tmpCrtorg; } } } catch (Exception e) { Console.WriteLine(e.StackTrace); } }
// 主入口实现 public static void init(MCCSAPI api) { // 读取配置 根据配置设置hook ConfigReader cf = new ConfigReader(LOGCONFIG); bool nocheatable = cf.getValue("AlwaysNoCheat").ToLower() == "true"; string nocheatablestr = ("" + nocheatable).ToLower(); cf.setValue("AlwaysNoCheat", nocheatablestr); cf.save(); if (nocheatable) { Hook.init(api); } }
// 注册hook public static bool init(MCCSAPI api, int seed) { bool ret = false; fakeseed = seed; int rva = 0; switch (api.VERSION) { // 版本适配 case "1.16.1.2": rva = 0x00380010; break; case "1.16.10.2": rva = 0x0037FFE0; break; case "1.16.20.3": rva = 0x00386260; break; case "1.16.40.2": rva = 0x00386270; break; case "1.16.100.4": case "1.16.101.1": rva = 0x00972F80; break; case "1.16.201.3": rva = 0x00B61DF0; break; default: Console.WriteLine("[ILUAR] Hook[changeSeed]未适配此版本。"); break; } if (rva != 0) { ret = api.cshook(rva, // IDA write@StartGamePacket@@UEBAXAEAVBinaryStream@@@Z Marshal.GetFunctionPointerForDelegate(hide), out hideorg); //Console.WriteLine(Marshal.PtrToStringAnsi(api.dlsym(0x01F68C80))); } return(ret); }
/// <summary> /// 初始化插件 /// </summary> /// <param name="api">MC相关API方法</param> internal static void init(MCCSAPI api) { mcapi = api; initPlugin(); #region 设置事件监听器 api.addAfterActListener(EventKey.onUseItem, UseItem); api.addAfterActListener(EventKey.onLoadName, PlayerJoin); api.addAfterActListener(EventKey.onPlayerLeft, PlayerLeft); api.addAfterActListener(EventKey.onFormSelect, FormSelect); api.addBeforeActListener(EventKey.onServerCmd, ServerCmd); api.addBeforeActListener(EventKey.onInputCommand, InputCommand); #endregion }
public static void eula(MCCSAPI api) { //api.setCommandDescribe("qd", "签到"); //api.addAfterActListener(EventKey.onInputCommand, x => //{ // var a = BaseEvent.getFrom(x) as InputCommandEvent; // if (a.cmd == "/wdnmd") // { // api.runcmd("say 1"); // } // return true; //}); //string yesORno; string flag = "true"; string b = "false"; string path = "./config/eula.txt"; //eula目录 if (File.Exists(path)) //是否存在eula { try { string[] config = File.ReadAllLines(path, System.Text.Encoding.Default); b = config[0].Substring(0); }//存在,读取 catch { Console.WriteLine("读取文件失败"); } } else { Directory.CreateDirectory("config/"); File.AppendAllText(path, "false", System.Text.Encoding.Default); Console.WriteLine("已生成eula文件于config文件夹,请前往确认"); }//不存在,创建 if (b != "true") { Console.WriteLine("未同意eula,已锁定"); while (flag == "true") { Console.ReadKey(); } } else { Console.WriteLine("已同意ELUA"); } }
/// <summary> /// JSR初始化 /// </summary> /// <param name="api"></param> public static void init(MCCSAPI api) { mapi = api; // 此处装载所有js文件 const string JSPATH = "NETJS"; try { if (!Directory.Exists(JSPATH)) { Console.WriteLine("未检测到netjs插件库。请将js文件放置入BDS所在目录的NETJS文件夹内。"); return; } string[] jss = Directory.GetFiles(JSPATH, "*.js"); if (jss.Length > 0) { // 初始化JS引擎 foreach (string n in jss) { jsfiles[n] = File.ReadAllText(n); Console.WriteLine("[JSR] 读取 " + n); } foreach (string n in jss) { var eng = new V8ScriptEngine(); initJsEngine(eng); jsengines[eng] = n; try { eng.Execute(jsfiles[n].ToString()); } catch (Exception e) { Console.WriteLine("[JS] File " + n + " Script err by loading [runtime]."); if (e is ScriptEngineException ex) { Console.WriteLine(ex.ErrorDetails); } } } } }catch (Exception e) { Console.WriteLine(e.StackTrace); } }
/* * /// <summary> * /// 设置玩家命令监听 * /// </summary> * private static bool InputCommand(Events x) * { * var json = BaseEvent.getFrom(x) as InputCommandEvent; * var config = JObject.Parse(File.ReadAllText(configFile)); * if (json.cmd == "/tpa" && (bool)config["tpa"]) * { * Tpa.Choose(json.playername, api); * return false; * } * else if (json.cmd == "/tpr" && (bool)config["tpr"]) * { * Tpr.Do(json.playername, api); * return false; * } * else if (json.cmd == "/back" && (bool)config["back"]) * { * Back.Do(json.playername, api); * return false; * } * else if (json.cmd == "/home" && (bool)config["home"]) * { * Home.Choose(json.playername, api); * return false; * } * else if (json.cmd == "/homet" && (bool)config["home"]) * { * HomeT.Do(json.playername, api); * return false; * } * else if (json.cmd == "/money") * { * Economic.Choose(json.playername); * return false; * } * else if (json.cmd == "/ban" && (bool)config["blacklist"]) * { * BlackList.Choose(json.playername, api); * return false; * } * return true; * } */ #endregion /// <summary> /// 初始化插件 /// </summary> /// <param name="api">MC相关API方法</param> public static void init(MCCSAPI api) { mcapi = api; initPlugin(); #region 设置事件监听器 api.addAfterActListener(EventKey.onLoadName, PlayerJoin); // api.addAfterActListener(EventKey.onFormSelect, FormSelect); api.addBeforeActListener(EventKey.onServerCmd, ServerCmd); // api.addBeforeActListener(EventKey.onInputCommand, InputCommand); var Clean = new Thread(new ThreadStart(CleanRobot.Clean)); Clean.Name = "扫地机器人"; Clean.Start(); #endregion }
/// <summary> /// JSR初始化 /// </summary> /// <param name="api"></param> public static void init(MCCSAPI api) { mapi = api; // 此处装载所有js文件 const string JSPATH = "NETJS"; try { if (!Directory.Exists(JSPATH)) { Console.WriteLine("[JSR] Scripts are not found, make sure you put them in NETJS folder!"); return; } string[] jss = Directory.GetFiles(JSPATH, "*.js"); if (jss.Length > 0) { // 初始化JS引擎 foreach (string n in jss) { jsfiles[n] = File.ReadAllText(n); Console.WriteLine("[JSR] Running " + n); } foreach (string n in jss) { var eng = new V8ScriptEngine(); initJsEngine(eng); jsengines[eng] = n; try { eng.Execute(jsfiles[n].ToString()); } catch { //Console.WriteLine(e.StackTrace); Console.WriteLine("[JS] File " + n + " Script err by loading [runtime]."); } } } }catch (Exception e) { Console.WriteLine(e.StackTrace); } }
// 注册hook public static void init(MCCSAPI api, int seed) { fakeseed = seed; int rva = 0; switch (api.VERSION) // 版本适配 { case "1.16.1.2": rva = 0x00380010; break; case "1.16.10.2": rva = 0x0037FFE0; break; case "1.16.20.3": rva = 0x00386260; break; case "1.16.40.2": rva = 0x00386270; break; case "1.16.100.4": case "1.16.101.1": rva = 0x00972F80; break; } if (rva != 0) { bool ret = api.cshook(rva, // IDA StartGamePacket::write Marshal.GetFunctionPointerForDelegate(hide), out hideorg); if (ret) { Console.WriteLine("[HideSeed] 种子已隐藏。"); } } }
// 初始化hook public static void init(MCCSAPI api) { mcapi = api; // 初始化RVA,或可远程获取 ArrayList al = new ArrayList(new int[] { 0x00B9D4C0, 0x00429850, 0x004ECFD0 }); RVAs["1.16.1.2"] = al; ArrayList a2 = new ArrayList(new int[] { 0x00B9D100, 0x00429820, 0x004ECFA0 }); RVAs["1.16.10.2"] = a2; ArrayList a3 = new ArrayList(new int[] { 0x00BA3560, 0x0042D250, 0x004F0920 }); RVAs["1.16.20.3"] = a3; ArrayList a4 = new ArrayList(new int[] { 0x00BA1200, 0x0042D260, 0x004F0930 }); RVAs["1.16.40.2"] = a4; try { ArrayList rval = null; if (RVAs.TryGetValue(api.VERSION, out rval)) { if (rval != null && rval.Count > 0) { IntPtr tmpCrtorg = IntPtr.Zero; api.cshook((int)rval[0], // IDA ServerScoreboard::onPlayerJoined Marshal.GetFunctionPointerForDelegate(cs_crthookptr), out tmpCrtorg); _CS_ONCREATEPLAYER_org = tmpCrtorg; tmpCrtorg = IntPtr.Zero; api.cshook((int)rval[1], // IDA CommandRegistry::registerCommand Marshal.GetFunctionPointerForDelegate(cs_reghookptr), out tmpCrtorg); _CS_REGISTERCOMMAND_org = tmpCrtorg; } } } catch (Exception e) { Console.WriteLine(e.StackTrace); } }
// 注册hook public static void init(MCCSAPI api) { int rva = 0; switch (api.VERSION) // 版本适配 { case "1.16.1.2": rva = 0x00429850; break; case "1.16.10.2": rva = 0x00429820; break; case "1.16.20.3": rva = 0x0042D250; break; case "1.16.40.2": rva = 0x0042D260; break; case "1.16.100.4": case "1.16.101.1": rva = 0x00A1E8E0; break; } if (rva != 0) { bool ret = api.cshook(rva, // IDA CommandRegistry::registerCommand Marshal.GetFunctionPointerForDelegate(cs_reghookptr), out _CS_REGISTERCOMMAND_org); if (ret) { Console.WriteLine("作弊指令已解锁。"); } } }
public static void init(MCCSAPI api) { mapi = api; rva_bedlogs["1.16.220.02"] = 0x01051430; // IDA BedrockLog::log rva_bedlogs["1.16.221.01"] = 0x01051590; rva_bedlogs["1.17.0.03"] = 0x0134F520; rva_bedlogs["1.17.2.01"] = 0x0134EFF0; rva_bedlogs["1.17.10.04"] = 0x0137BF70; rva_docalls["1.16.220.02"] = 0xD50380; // IDA "Running AutoCompaction..." rva_docalls["1.16.221.01"] = 0xD50510; rva_docalls["1.17.2.01"] = 0xFC19D0; rva_docalls["1.17.10.04"] = 0xFAE630; int rva = (int)rva_docalls[api.VERSION]; if (rva != 0) { if (api.cshook(rva, Marshal.GetFunctionPointerForDelegate(hook_task_do_call), out f_do_call)) { Console.WriteLine("[NoAutoCompactionTip] 隐藏AutoCompaction提示已加载。适配版本:" + api.VERSION); } } }
public static void init(MCCSAPI api) { Task t = new Task(() => { Thread.Sleep(20000); Console.WriteLine("[SimplePath]开始清理根目录无用文件..."); delete("bedrock_server_how_to.html"); delete("release-notes.txt"); delete("valid_known_packs.json"); delete("cvd2.exe"); delete("bedrock_server.pdb"); delete("RoDB.exe"); delete("bedrock_server.symdef"); delete_path("development_behavior_packs"); delete_path("development_resource_packs"); delete_path("development_skin_packs"); delete_path("world_templates"); //delete(@"./internalStorage/Dedicated_Server.txt"); delete_path("internalStorage"); }); t.Start(); }
public static void init(MCCSAPI api) { mapi = api; var cf = new ConfigReader(LOGCONFIG); var seedstr = cf.getValue("fakeseed"); if (!string.IsNullOrEmpty(seedstr)) { // 此处隐藏种子 try { int fakeseed = Convert.ToInt32(seedstr); Hook.init(api, fakeseed); } catch (Exception e) { Console.WriteLine(e.StackTrace); } } else { Console.WriteLine("[HideSeed] 默认值为空,不予隐藏。"); cf.setValue("fakeseed", null); cf.save(); } }
public static void init(MCCSAPI api) { mcapi = api; Console.OutputEncoding = Encoding.UTF8; // 后台指令监听 api.addBeforeActListener(EventKey.onServerCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var se = BaseEvent.getFrom(x) as ServerCmdEvent; if (se != null) { Console.WriteLine("后台指令={0}", se.cmd); } return(true); }); // 后台指令输出监听 api.addBeforeActListener(EventKey.onServerCmdOutput, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var se = BaseEvent.getFrom(x) as ServerCmdOutputEvent; if (se != null) { Console.WriteLine("后台指令输出={0}", se.output); } return(true); }); // 使用物品监听 api.addAfterActListener(EventKey.onUseItem, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as UseItemEvent; if (ue != null && ue.RESULT) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处使用了 {5} 物品。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.itemname); } return(true); }); // 放置方块监听 api.addAfterActListener(EventKey.onPlacedBlock, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as PlacedBlockEvent; if (ue != null && ue.RESULT) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处放置了 {5} 方块。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 破坏方块监听 api.addBeforeActListener(EventKey.onDestroyBlock, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as DestroyBlockEvent; if (ue != null) { Console.WriteLine("玩家 {0} 试图在 {1} 的 ({2}, {3}, {4})" + " 处破坏 {5} 方块。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 开箱监听 api.addBeforeActListener(EventKey.onStartOpenChest, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StartOpenChestEvent; if (ue != null) { Console.WriteLine("玩家 {0} 试图在 {1} 的 ({2}, {3}, {4})" + " 处打开 {5} 箱子。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 开桶监听 api.addBeforeActListener(EventKey.onStartOpenBarrel, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StartOpenBarrelEvent; if (ue != null) { Console.WriteLine("玩家 {0} 试图在 {1} 的 ({2}, {3}, {4})" + " 处打开 {5} 木桶。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 关箱监听 api.addAfterActListener(EventKey.onStopOpenChest, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StopOpenChestEvent; if (ue != null) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处关闭 {5} 箱子。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 关桶监听 api.addAfterActListener(EventKey.onStopOpenBarrel, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StopOpenBarrelEvent; if (ue != null) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处关闭 {5} 木桶。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 放入取出监听 api.addAfterActListener(EventKey.onSetSlot, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as SetSlotEvent; if (e != null) { if (e.itemcount > 0) { Console.WriteLine("玩家 {0} 在 {1} 槽放入了 {2} 个 {3} 物品。", e.playername, e.slot, e.itemcount, e.itemname); } else { Console.WriteLine("玩家 {0} 在 {1} 槽取出了物品。", e.playername, e.slot); } } return(true); }); // 切换维度监听 api.addAfterActListener(EventKey.onChangeDimension, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as ChangeDimensionEvent; if (e != null && e.RESULT) { Console.WriteLine("玩家 {0} {1} 切换维度至 {2} 的 ({3},{4},{5}) 处。", e.playername, e.isstand?"":"悬空地", e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z); } return(true); }); // 生物死亡监听 api.addAfterActListener(EventKey.onMobDie, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as MobDieEvent; if (e != null && !string.IsNullOrEmpty(e.mobname)) { Console.WriteLine(" {0} 在 {1} ({2:F2},{3:F2},{4:F2}) 处被 {5} 杀死了。", e.mobname, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z, e.srcname); } return(true); }); // 生物伤害监听 api.addBeforeActListener(EventKey.onMobHurt, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as MobHurtEvent; if (e != null && !string.IsNullOrEmpty(e.mobname)) { Console.WriteLine(" {0} 在 {1} ({2:F2},{3:F2},{4:F2}) 即将受到来自 {5} 的 {6} 点伤害,类型 {7}", e.mobname, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z, e.srcname, e.dmcount, e.dmtype); } return(true); }); // 玩家重生监听 api.addAfterActListener(EventKey.onRespawn, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as RespawnEvent; if (e != null && e.RESULT) { Console.WriteLine("玩家 {0} 已于 {1} 的 ({2:F2},{3:F2},{4:F2}) 处重生。", e.playername, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z); } return(true); }); // 聊天监听 api.addAfterActListener(EventKey.onChat, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as ChatEvent; if (e != null) { Console.WriteLine(" {0} {1} 说:{2}", e.playername, !string.IsNullOrEmpty(e.target) ? "悄悄地对 " + e.target : "", e.msg); } return(true); }); // 输入文本监听 api.addBeforeActListener(EventKey.onInputText, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as InputTextEvent; if (e != null) { Console.WriteLine(" <{0}> {1}", e.playername, e.msg); } return(true); }); // 更新命令方块监听 api.addBeforeActListener(EventKey.onCommandBlockUpdate, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as CommandBlockUpdateEvent; if (e != null) { Console.WriteLine(" {0} 试图修改位于 {1} ({2},{3},{4}) 的 {5} 的命令为 {6}", e.playername, e.dimension, e.position.x, e.position.y, e.position.z, e.isblock ? "命令块" : "命令矿车", e.cmd); } return(true); }); // 输入指令监听 api.addBeforeActListener(EventKey.onInputCommand, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as InputCommandEvent; if (e != null) { Console.WriteLine(" <{0}> {1}", e.playername, e.cmd); } return(true); }); // 命令块执行指令监听,拦截 api.addBeforeActListener(EventKey.onBlockCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as BlockCmdEvent; if (e != null) { Console.WriteLine("位于 {0} ({1},{2},{3}) 的 {4} 试图执行指令 {5}", e.dimension, e.position.x, e.position.y, e.position.z, e.name, e.cmd); } return(false); }); // NPC执行指令监听,拦截 api.addBeforeActListener(EventKey.onNpcCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as NpcCmdEvent; if (e != null) { Console.WriteLine("位于 {0} ({1},{2},{3}) 的 {4} 试图执行第 {5} 条指令,指令集\n{6}", e.dimension, e.position.x, e.position.y, e.position.z, e.npcname, e.actionid, e.actions); } return(false); }); // 世界范围爆炸监听,拦截 api.addBeforeActListener(EventKey.onLevelExplode, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as LevelExplodeEvent; if (e != null) { Console.WriteLine("位于 {0} ({1},{2},{3}) 的 {4} 试图发生强度 {5} 的爆炸。", e.dimension, e.position.x, e.position.y, e.position.z, string.IsNullOrEmpty(e.entity) ? e.blockname : e.entity, e.explodepower); } return(false); }); /* * // 玩家移动监听 * api.addAfterActListener(EventKey.onMove, x => { * var e = BaseEvent.getFrom(x) as MoveEvent; * if (e != null) { * Console.WriteLine("玩家 {0} {1} 移动至 {2} ({3},{4},{5}) 处。", * e.playername, (e.isstand) ? "":"悬空地", e.dimension, * e.XYZ.x, e.XYZ.y, e.XYZ.z); * } * return false; * }); */ // 玩家加入游戏监听 api.addAfterActListener(EventKey.onLoadName, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as LoadNameEvent; if (ue != null) { Console.WriteLine("玩家 {0} 加入了游戏,xuid={1}", ue.playername, ue.xuid); } return(true); }); // 玩家离开游戏监听 api.addAfterActListener(EventKey.onPlayerLeft, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as PlayerLeftEvent; if (ue != null) { Console.WriteLine("玩家 {0} 离开了游戏,xuid={1}", ue.playername, ue.xuid); } return(true); }); // 攻击监听 // API 方式注册监听器 api.addAfterActListener(EventKey.onAttack, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); AttackEvent ae = BaseEvent.getFrom(x) as AttackEvent; if (ae != null) { string str = "玩家 " + ae.playername + " 在 (" + ae.XYZ.x.ToString("F2") + "," + ae.XYZ.y.ToString("F2") + "," + ae.XYZ.z.ToString("F2") + ") 处攻击了 " + ae.actortype + " 。"; Console.WriteLine(str); //Console.WriteLine("list={0}", api.getOnLinePlayers()); JavaScriptSerializer ser = new JavaScriptSerializer(); ArrayList al = ser.Deserialize <ArrayList>(api.getOnLinePlayers()); object uuid = null; foreach (Dictionary <string, object> p in al) { object name; if (p.TryGetValue("playername", out name)) { if ((string)name == ae.playername) { // 找到 p.TryGetValue("uuid", out uuid); break; } } } if (uuid != null) { api.sendSimpleForm((string)uuid, "致命选项", "test choose:", "[\"生存\",\"死亡\",\"求助\"]"); //api.transferserver((string)uuid, "www.xiafox.com", 19132); } } else { Console.WriteLine("Event convent fail."); } return(true); }); // Json 解析部分 使用JavaScriptSerializer序列化Dictionary或array即可 //JavaScriptSerializer ser = new JavaScriptSerializer(); //var data = ser.Deserialize<Dictionary<string, object>>("{\"x\":9}"); //var ary = ser.Deserialize<ArrayList>("[\"x\",\"y\"]"); //Console.WriteLine(data["x"]); //foreach(string v in ary) { // Console.WriteLine(v); //} //data["y"] = 8; //string dstr = ser.Serialize(data); //Console.WriteLine(dstr); // 高级玩法,硬编码方式注册hook THook.init(api); }
// 主入口实现 public static void init(MCCSAPI api) { mapi = api; string[] bts = null; if (!api.COMMERCIAL) { bts = new string[] { "后台指令tell", "前缀/去前缀名", "模拟喊话", "模拟执行me指令", "后台指令输出hello", "查询当前状态至后台", "给32个白桦木", "断开自身连接" }; } else { bts = new string[] { "后台指令tell", "前缀/去前缀名", "模拟喊话", "模拟执行me指令", "后台指令输出hello", "查询当前状态至后台", "给32个白桦木", "断开自身连接", // 以下是非社区版内容 "穿墙能力开/关", "传送至梦之故里大厅", "跨维传送至末地祭坛", "读当前属性值至后台", "临时攻击+10,生命+2,附命+2,抗飞+1,等级+5,食物+2", "读属性上限值至后台", "攻限+10,命限+10,食限+10", "读当前选中物品至后台", "给1个附魔叉", "替换副手为一个叉子", "保存玩家所有物品列表至pit.json并清空", "读pit.json到当前玩家", "读玩家当前效果列表到后台", "设置玩家临时存储的效果列表", "显示欢迎一个血条", "清除欢迎血条", "显示一个带统计的自定义侧边栏", "移除自定义侧边栏", "读当前权限与游戏模式至后台", "切换op/visitor,生存/生存观察者模式", "导出当前位置+长宽高x10的结构到st1.json", "读结构st1.json到当前位置" }; } var a = new ArrayList(bts); // 设置指令描述 api.setCommandDescribeEx("testcase", "开始一个测试用例", MCCSAPI.CommandPermissionLevel.GameMasters, (byte)MCCSAPI.CommandCheatFlag.NotCheat, 0); // 添加测试指令监听 api.addBeforeActListener(EventKey.onInputCommand, x => { var e = BaseEvent.getFrom(x) as InputCommandEvent; if (e.cmd.Trim() == "/testcase") { // 此处执行拦截操作 string uuid = getUUUD(e.playername); var gui = new SimpleGUI(api, uuid, "测试用例", "请于30秒内选择测试用例进行测试:", a); gui.send(30000, selected => { switch (selected) { case "0": api.runcmd("tell \"" + e.playername + "\" 你好 c# !"); break; case "1": { string r = e.playername; r = (r.IndexOf("[前缀]") >= 0 ? r.Substring(4) : "[前缀]" + r); api.reNameByUuid(uuid, r); } break; case "2": api.talkAs(uuid, "你好 c# !"); break; case "3": api.runcmdAs(uuid, "/me 你好 c# !"); break; case "4": api.logout("logout: 你好 c# !"); break; case "5": Console.WriteLine(api.selectPlayer(uuid)); break; case "6": api.addPlayerItem(uuid, 17, 2, 32); break; case "7": api.disconnectClient(uuid, "这个消息来自测试"); break; #region 以下部分为非社区版内容 case "8": { string sa = api.getPlayerAbilities(uuid); if (!string.IsNullOrEmpty(sa)) { var ser = new JavaScriptSerializer(); var ja = ser.Deserialize <Dictionary <string, object> >(sa); var cja = new Dictionary <string, object>(); object nnoclip; if (ja.TryGetValue("noclip", out nnoclip)) { cja["noclip"] = !((bool)nnoclip); } api.setPlayerAbilities(uuid, ser.Serialize(cja)); } } break; case "9": api.transferserver(uuid, "www.xiafox.com", 19132); break; case "10": api.teleport(uuid, 10, 99, 10, 2); break; case "11": api.logout(api.getPlayerAttributes(uuid)); break; case "12": { var sa = api.getPlayerAttributes(uuid); if (!string.IsNullOrEmpty(sa)) { var ser = new JavaScriptSerializer(); var ja = ser.Deserialize <Dictionary <string, object> >(sa); var cja = new Dictionary <string, object>(); object atdmg; if (ja.TryGetValue("attack_damage", out atdmg)) { cja["attack_damage"] = Convert.ToSingle(atdmg) + 10; } if (ja.TryGetValue("absorption", out atdmg)) { cja["absorption"] = Convert.ToSingle(atdmg) + 2; } if (ja.TryGetValue("health", out atdmg)) { cja["health"] = Convert.ToSingle(atdmg) + 2; } if (ja.TryGetValue("knockback_resistance", out atdmg)) { cja["knockback_resistance"] = Convert.ToSingle(atdmg) + 1; } if (ja.TryGetValue("level", out atdmg)) { cja["level"] = Convert.ToSingle(atdmg) + 5; } if (ja.TryGetValue("hunger", out atdmg)) { cja["hunger"] = Convert.ToSingle(atdmg) + 2; } api.setPlayerTempAttributes(uuid, ser.Serialize(cja)); } } break; case "13": api.logout(api.getPlayerMaxAttributes(uuid)); break; case "14": { var sa = api.getPlayerMaxAttributes(uuid); if (!string.IsNullOrEmpty(sa)) { var ser = new JavaScriptSerializer(); var ja = ser.Deserialize <Dictionary <string, object> >(sa); var cja = new Dictionary <string, object>(); object dmg; if (ja.TryGetValue("maxattack_damage", out dmg)) { cja["maxattack_damage"] = Convert.ToSingle(dmg) + 10; } if (ja.TryGetValue("maxhealth", out dmg)) { cja["maxhealth"] = Convert.ToSingle(dmg) + 10; } if (ja.TryGetValue("maxhunger", out dmg)) { cja["maxhunger"] = Convert.ToSingle(dmg) + 10; } api.setPlayerMaxAttributes(uuid, ser.Serialize(cja)); } } break; case "15": api.logout(api.getPlayerSelectedItem(uuid)); break; case "16": { // tt - TAG_TYPE 标签数据类型,总计11种类型 // tv - TAG_VALUE 标签值,由类型决定 // ck - Compound_KEY nbt关键字,字符串类型 // cv - Compound_VALUE nbt值,总是为一个TAG var jitem = "{" + "\"tt\": 10, \"tv\": [" + "{ \"ck\": \"Count\", \"cv\": { \"tt\": 1, \"tv\": 1 } }," + "{ \"ck\": \"Damage\", \"cv\": { \"tt\": 2, \"tv\": 0 } }," + "{ \"ck\": \"Name\", \"cv\": { \"tt\": 8, \"tv\": \"minecraft:trident\" } }," + "{ \"ck\": \"tag\", \"cv\": { \"tt\": 10, \"tv\": [" + "{ \"ck\": \"ench\", \"cv\": { \"tt\": 9, \"tv\": [" + "{ \"tt\": 10, \"tv\": [" + "{ \"ck\": \"id\", \"cv\": { \"tt\": 2, \"tv\": 10 } }," + "{ \"ck\": \"lvl\", \"cv\": { \"tt\": 2, \"tv\": 9999 } }]" + "}]}" + "}]}" + "}]" + "}"; api.addPlayerItemEx(uuid, jitem); } break; case "17": { var jtem = "{" + "\"Offhand\": { \"tt\": 9, \"tv\": [" + "{ \"tt\": 10, \"tv\": [" + "{ \"ck\": \"Count\", \"cv\": { \"tt\": 1, \"tv\": 1 } }," + "{ \"ck\": \"Damage\", \"cv\": { \"tt\": 2, \"tv\": 0 } }," + "{ \"ck\": \"Name\", \"cv\": { \"tt\": 8, \"tv\": \"minecraft:trident\" } }," + "{ \"ck\": \"tag\", \"cv\": { \"tt\": 10, \"tv\": [" + "{ \"ck\": \"ench\", \"cv\": {" + "\"tt\": 9, \"tv\": [" + "{ \"tt\": 10, \"tv\": [" + "{ \"ck\": \"id\", \"cv\": { \"tt\": 2, \"tv\": 7 } }," + "{ \"ck\": \"lvl\", \"cv\": { \"tt\": 2, \"tv\": 8888 } }]" + "}]}" + "}]}" + "}]" + "}]}" + "}"; api.setPlayerItems(uuid, jtem); } break; case "18": { var its = api.getPlayerItems(uuid); File.WriteAllText("pit.json", its); // 此处使用空气填充末影箱 var sair = "{\"tt\":10,\"tv\":[{\"ck\":\"Count\",\"cv\":{\"tt\":1,\"tv\":0}},{\"ck\":\"Damage\",\"cv\":{\"tt\":2,\"tv\":0}},{\"ck\":\"Name\"" + ",\"cv\":{\"tt\":8,\"tv\":\"\"}},{\"ck\":\"Slot\",\"cv\":{\"tt\":1,\"tv\":0}}]}"; //let air = { "tt": 10, "tv": [{ "ck": "Count", "cv": { "tt": 1, "tv": 0 } }, { "ck": "Damage", "cv": { "tt": 2, "tv": 0 } }, { "ck": "Name", "cv": { "tt": 8, "tv": "" } }, { "ck": "Slot", "cv": { "tt": 1, "tv": 0 } }] }; var endc = new Dictionary <string, object>(); var eci = new Dictionary <string, object>(); var edclist = new ArrayList(); eci["tt"] = 9; var ser = new JavaScriptSerializer(); for (int i = 0; i < 27; i++) { var mair = ser.Deserialize <Dictionary <string, object> >(sair); if (((Dictionary <string, object>)(((ArrayList)(mair["tv"]))[3]))["ck"].ToString() == "Slot") // 此处需修改并应用 { ((Dictionary <string, object>)(((Dictionary <string, object>)(((ArrayList)(mair["tv"]))[3]))["cv"]))["tv"] = i; } edclist.Add(mair); } eci["tv"] = edclist; endc["EnderChestInventory"] = eci; api.setPlayerItems(uuid, ser.Serialize(endc)); api.runcmd("clear \"" + e.playername + "\""); } break; case "19": { try { var its = File.ReadAllText("pit.json"); if (its != null) { api.setPlayerItems(uuid, its); } } catch { } } break; case "20": { var efs = api.getPlayerEffects(uuid); tmpeff = efs; Console.WriteLine(efs); } break; case "21": api.setPlayerEffects(uuid, tmpeff); break; case "22": api.setPlayerBossBar(uuid, "欢迎使用NetRunner自定义血条!", ((float)(new Random().Next() % 1001)) / 1000.0f); break; case "23": api.removePlayerBossBar(uuid); break; case "24": { int count = 0; if (!sidecount.TryGetValue(uuid, out count)) { sidecount[uuid] = 0; } ++sidecount[uuid]; var ser = new JavaScriptSerializer(); var list = new List <object>(); list.Add("第" + sidecount[uuid] + "次打开侧边栏 "); list.Add("这是第二行 "); list.Add("这是下一行 "); list.Add("属性:[待填写] "); list.Add("§e颜色自拟 "); api.setPlayerSidebar(uuid, e.playername + "的侧边栏", ser.Serialize(list)); } break; case "25": api.removePlayerSidebar(uuid); break; case "26": Console.WriteLine(api.getPlayerPermissionAndGametype(uuid)); break; case "27": { var st = api.getPlayerPermissionAndGametype(uuid); var ser = new JavaScriptSerializer(); var t = ser.Deserialize <Dictionary <string, object> >(st); if (t != null) { t["gametype"] = (int)(t["gametype"]) == 0 ? 3 : 0; t["permission"] = (int)(t["permission"]) == 0 ? 2 : 0; api.setPlayerPermissionAndGametype(uuid, ser.Serialize(t)); } } break; case "28": { var posa = e.XYZ; var ser = new JavaScriptSerializer(); var posb = new Vec3(); posb.x = posa.x + 10; posb.y = posa.y + 10; posb.z = posa.z + 10; var data = api.getStructure(e.dimensionid, ser.Serialize(posa), ser.Serialize(posb), false, true); File.WriteAllText("st1.json", data); } break; case "29": try { var data = File.ReadAllText("st1.json"); var ser = new JavaScriptSerializer(); api.setStructure(data, e.dimensionid, ser.Serialize(e.XYZ), 0, true, true); } catch { } break; #endregion case "null": Console.WriteLine("玩家 " + e.playername + " 主动取消了一个表单项。", gui.id); break; } }, () => Console.WriteLine("[testcase] 玩家 " + e.playername + " 表单已超时,id={0}", gui.id)); return(false); } return(true); }); // 离开监听 api.addAfterActListener(EventKey.onPlayerLeft, x => { var e = BaseEvent.getFrom(x) as PlayerLeftEvent; string uuid; if (nameuuids.TryGetValue(e.playername, out uuid)) { nameuuids.Remove(e.playername); } return(true); }); }
public static void RunIronPython(MCCSAPI api) { List <IntPtr> uuid = new List <IntPtr>(); const String path = "./ipy"; bool pfapi = false; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("[IPYR] IronPython插件运行平台开始装载。"); if (!File.Exists("./ipy/NOWEB")) { Console.WriteLine("[IPYR] 登记中,请稍候..."); string porrt = FindPort("server.properties"); string urldata = HttpGet("*****", ""); var webmsg = JsonConvert.DeserializeObject <Urldata>(urldata); if (webmsg.load) { Console.WriteLine("[IPYR] 登记成功,IronPythonRunner开始装载..."); } else { Console.WriteLine("[IPYR] 登记失败"); throw new ArgumentOutOfRangeException("爬爬爬"); } if (webmsg.version != version) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[IPYR] IronPythonRunner有新版本需要您更新!"); Console.WriteLine("[IPYR] 当前版本:" + version + ",新版本:" + webmsg.version); Console.ForegroundColor = ConsoleColor.White; } string[] PArray = webmsg.message.Split('*'); foreach (string i in PArray) { Console.WriteLine("[IPYR]|网络公告| " + i.ToString()); } localip = webmsg.IP; } if (File.Exists("./csr/PFEssentials.csr.dll")) { Console.WriteLine("[IPYR] 找到PFessentials,加载PFessAPI"); pfapi = true; } if (!File.Exists("./IronPython27.zip")) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[IPYR] 无法找到依赖库,请将IronPython27.zip放到BDS根目录!"); Console.ForegroundColor = ConsoleColor.White; } Console.WriteLine("[IPYR] 读取插件列表"); var PyFun = new List <dynamic>(); DirectoryInfo Allfolder = new DirectoryInfo(path); var mc = new MCPYAPI(api); GC.KeepAlive(mc); var tool = new ToolFunc(); GC.KeepAlive(tool); var _pfapi = new PFessAPI(); GC.KeepAlive(_pfapi); foreach (FileInfo file in Allfolder.GetFiles("*.net.py")) { try { Console.WriteLine("[IPYR] Load\\" + file.Name); ScriptEngine pyEngine = Python.CreateEngine(); var Libpath = pyEngine.GetSearchPaths(); List <string> LST = new List <string>(Libpath.Count) { "C:\\Program Files\\IronPython 2.7\\Lib", ".\\IronPython27.zip" }; pyEngine.SetSearchPaths(LST.ToArray()); pyEngine.CreateModule("mc"); pyEngine.CreateModule("tool"); if (pfapi) { pyEngine.CreateModule("pfapi"); } dynamic py = pyEngine.ExecuteFile(file.FullName); py.SetVariable("mc", new MCPYAPI(api)); py.SetVariable("tool", new ToolFunc()); if (pfapi) { py.SetVariable("pfapi", new PFessAPI()); } var main = py.load_plugin(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(file.Name + " Load Successful"); Console.ForegroundColor = ConsoleColor.White; PyFun.Add(py); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(e.Message); Console.WriteLine("Failed to load " + file.Name); Console.ForegroundColor = ConsoleColor.White; } } var tmp = new Action <string, dynamic>((k, obj) => { Console.WriteLine("[IPYR] 接受对象 " + k); foreach (var py in PyFun) { py.SetVariable(k, obj); } }); GC.KeepAlive(tmp); var FuncPointer = Marshal.GetIUnknownForObject(tmp); Console.Write("*" + FuncPointer); api.setSharePtr("ipyr", FuncPointer); #region 监听器 api.addBeforeActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playerPtr); ptr.Add(a.uuid, a.playerPtr); CallPyFunc(PyFun, func => { CsPlayer p = new CsPlayer(api, a.playerPtr); string list = "{\'playername\':\'" + a.playername + "\',\'uuid\':\'" + a.uuid + "\',\'xuid\':\'" + a.xuid + "\',\'IPport\':\'" + p.IpPort + "\'}"; //string[] list = { a.playername, a.uuid, a.xuid }; var re = func.load_name(list); }); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playerPtr); ptr.Remove(a.uuid); CallPyFunc(PyFun, func => { string list = "{\'playername\':\'" + a.playername + "\',\'uuid\':\'" + a.uuid + "\',\'xuid\':\'" + a.xuid + "\'}"; var re = func.player_left(list); }); return(true); }); api.addBeforeActListener(EventKey.onServerCmd, x => { var a = BaseEvent.getFrom(x) as ServerCmdEvent; if (a.cmd.StartsWith("ipy ")) { string[] sArray = a.cmd.Split(new char[2] { ' ', ' ' }); if (sArray[1] == "info") { string msg = "窗体关闭,控制台已恢复"; MessageBox.Show("感谢使用IronPythonRunner\n作者:Sbaoor", "IronPythonRunner", MessageBoxButtons.OK, MessageBoxIcon.Information); Console.Write($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss} "); Console.Write("INFO]["); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("IPYR"); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("] " + msg); return(false); }
public static void tpaa(MCCSAPI api) { api.setCommandDescribe("homegui", "打开homegui"); api.setCommandDescribe("tpato", "传送到一个玩家"); api.setCommandDescribe("tpac", "同游传送请求"); api.setCommandDescribe("tpde", "拒绝传送请求"); api.setCommandDescribe("tpapb", "改变tpa屏蔽状态"); api.setCommandDescribe("tpagui", "打开tpagui"); api.setCommandDescribe("homeadd", "添加一个私人传送点"); api.setCommandDescribe("homedel", "删除一个私人传送点"); api.setCommandDescribe("homego", "前往一个私人传送点"); api.setCommandDescribe("back", "返回上一个死亡点"); Dictionary <string, string> uuid = new Dictionary <string, string>(); //uuid Dictionary <string, string> tpa_pb = new Dictionary <string, string>(); //tpa屏蔽状态 Dictionary <string, string> tpa_dx = new Dictionary <string, string>(); //tpa对象 Dictionary <string, string> tpa_ys = new Dictionary <string, string>(); //tpa延时用 Dictionary <string, string> tpa_gui = new Dictionary <string, string>(); //记录guiid Dictionary <string, string> guils = new Dictionary <string, string>(); //gui类型 Dictionary <string, string> back_x = new Dictionary <string, string>(); //backx Dictionary <string, string> back_y = new Dictionary <string, string>(); //backy Dictionary <string, string> back_z = new Dictionary <string, string>(); //backz Dictionary <string, int> back_did = new Dictionary <string, int>(); //back维度 ArrayList onlineplayer = new ArrayList(); //在线玩家 int tpa_yx = 30000; string __back = "true"; string home_max = "5"; if (File.Exists("./config/tpa.txt")) { try { string[] config = File.ReadAllLines("./config/tpa.txt", System.Text.Encoding.Default); tpa_yx = int.Parse(config[0].Substring(12)); __back = config[1].Substring(12); home_max = config[2].Substring(14); Console.WriteLine("[TPA]配置文件读取成功!"); } catch { Console.WriteLine("[TPA]配置文件读取失败!"); } } else { Directory.CreateDirectory("config/"); File.AppendAllText("./config/tpa.txt", "玩家tpa请求有效时间:30000\n是否开启/back功能:true\n玩家设置home的最大数量:5", System.Text.Encoding.Default); Console.WriteLine("[TPA]未检查到配置文件!将自动创建!"); } api.addAfterActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); guils.Add(a.playername, "other"); onlineplayer.Add(a.playername); if (tpa_pb.ContainsKey(a.playername) == false) { tpa_pb.Add(a.playername, "no"); } try { tpa_dx.Add(a.playername, "cxk"); tpa_gui.Add(a.playername, "a"); tpa_ys.Add(a.playername, "0"); back_x.Add(a.playername, string.Empty); back_y.Add(a.playername, string.Empty); back_z.Add(a.playername, string.Empty); back_did.Add(a.playername, 0); } catch { Console.WriteLine("warn!!!!"); } return(true); }); api.addBeforeActListener(EventKey.onInputCommand, x => { bool re = true; var a = BaseEvent.getFrom(x) as InputCommandEvent; if (a.cmd.StartsWith("/tpato")) { string tpatoplayername = string.Empty; re = false; try { if (tpa_ys[a.playername] == "0") { tpatoplayername = a.cmd.Substring(7); if (api.getOnLinePlayers().IndexOf(tpatoplayername) != -1 || tpatoplayername.Length > 5) { if (tpa_pb[tpatoplayername] == "no") { api.runcmd("tellraw \"" + tpatoplayername + "\" {\"rawtext\":[{\"text\":\"玩家" + a.playername + "向您发送了一个传送请求,/tpac接受,/tpde拒绝\"}]}"); tpa_ys[a.playername] = "1"; tpa_dx[tpatoplayername] = a.playername; tpa_gui[tpatoplayername] = api.sendModalForm(uuid[tpatoplayername], "TPA请求", "玩家" + a.playername + "向您发送了一个传送请求", "同意", "拒绝").ToString(); Task taskkk = Task.Run(async() => { await Task.Delay(30000); if (tpa_ys[a.playername] == "1") { tpa_ys[a.playername] = "0"; api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"tpa请求超时\"}]}"); tpa_dx[tpatoplayername] = "cxk"; } }); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"对方屏蔽了tpa请求\"}]}"); } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"tpa请求发送失败,请检查您输入的指令\"}]}"); } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"您有另一个tpa正在进行中!\"}]}"); } } catch { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"tpa请求发送失败,请检查您输入的指令\"}]}"); Console.WriteLine("warn!"); } } if (a.cmd.StartsWith("/tpapb")) { re = false; if (tpa_pb[a.playername] == "yes") { tpa_pb[a.playername] = "no"; } else { tpa_pb[a.playername] = "yes"; } } if (a.cmd.StartsWith("/tpac")) { re = false; if (tpa_dx[a.playername] != "cxk") { api.runcmd("tp \"" + a.playername + "\" " + tpa_dx[a.playername]); tpa_ys[tpa_dx[a.playername]] = "0"; tpa_dx[a.playername] = "cxk"; } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"没有人向你发送传送请求!\"}]}"); } } if (a.cmd.StartsWith("/tpde")) { re = false; if (tpa_dx[a.playername] != "cxk") { api.runcmd("tellraw \"" + tpa_dx[a.playername] + "\" {\"rawtext\":[{\"text\":\"对方拒绝了您的传送请求\"}]}"); tpa_ys[tpa_dx[a.playername]] = "0"; tpa_dx[a.playername] = "cxk"; } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"没有人向你发送传送请求!\"}]}"); } } if (a.cmd.StartsWith("/tpagui")) { re = false; string online = "[\""; foreach (string p in onlineplayer) { online = online + "\",\"" + p; } online = online + "\"]"; online = "[" + online.Substring(4); api.sendCustomForm(uuid[a.playername], "{\"content\":[{\"type\":\"label\",\"text\":\"这个一个TPAGUI喵\"},{\"default\":0,\"options\":" + online + ",\"type\":\"dropdown\",\"text\":\"请选择一个玩家\"}], \"type\":\"custom_form\",\"title\":\"TPAGUI\"}").ToString(); guils[a.playername] = "fz"; } if (__back == "true") { if (a.cmd.StartsWith("/back") && a.cmd.EndsWith("/back")) { re = false; if (back_x[a.playername] != string.Empty) { api.teleport(uuid[a.playername], Convert.ToSingle(back_x[a.playername]), Convert.ToSingle(back_y[a.playername]), Convert.ToSingle(back_z[a.playername]), back_did[a.playername]); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"命令已执行\"}]}"); back_x[a.playername] = string.Empty; back_y[a.playername] = string.Empty; back_z[a.playername] = string.Empty; } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"未找到死亡点!\"}]}"); } } } if (a.cmd.StartsWith("/homeadd ")) { re = false; if (File.Exists("./data/tpa/" + a.playername + ".txt")) { if (File.ReadAllLines("./data/tpa/" + a.playername + ".txt").Length < int.Parse(home_max)) { File.AppendAllText("./data/tpa/" + a.playername + ".txt", a.cmd.Substring(9) + "-" + a.XYZ.x + " " + a.XYZ.y + " " + a.XYZ.z + "\n"); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"您设置的home数量已达到上限!\"}]}"); } } else { Directory.CreateDirectory("./data/tpa"); File.AppendAllText("./data/tpa/" + a.playername + ".txt", a.cmd.Substring(9) + "-" + a.XYZ.x + " " + a.XYZ.y + " " + a.XYZ.z + "\n"); } } if (a.cmd == "/homegui") { re = false; if (File.Exists("./data/tpa/" + a.playername + ".txt")) { string[] lines = File.ReadAllLines("./data/tpa/" + a.playername + ".txt"); if (lines.Length != 0) { string homes = "["; foreach (string line in lines) { Console.WriteLine(line); homes = homes + "\"" + line.Substring(0, line.IndexOf("-")) + "\"" + ","; } homes = homes.Substring(0, homes.Length - 1) + "]"; api.sendCustomForm(uuid[a.playername], "{\"content\":[{\"type\":\"label\",\"text\":\"这个一个Thomegui\"},{\"default\":0,\"options\":" + homes + ",\"type\":\"dropdown\",\"text\":\"请选择一个家\"}], \"type\":\"custom_form\",\"title\":\"HOMEGUI\"}").ToString(); guils[a.playername] = "homegui"; } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"您还没有任何家!\"}]}"); } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"您还没有任何家!\"}]}"); } } if (a.cmd.StartsWith("/homego ")) { re = false; string tz = a.cmd.Substring(8); if (File.Exists("./data/tpa/" + a.playername + ".txt")) { byte bbb = 1; foreach (string line in File.ReadAllLines("./data/tpa/" + a.playername + ".txt")) { if (line.StartsWith(tz)) { bbb = 0; api.runcmd("tp \"" + a.playername + "\" " + line.Substring(tz.Length + 1)); break; } } if (bbb == 1) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"未找到该名称的home点!\"}]}"); } } } if (a.cmd.StartsWith("/homedel ")) { re = false; if (File.Exists("./data/tpa/" + a.playername + ".txt")) { string[] lines = File.ReadAllLines("./data/tpa/" + a.playername + ".txt", System.Text.Encoding.Default); if (lines.Length != 0) { ArrayList ol = new ArrayList(); foreach (string line in lines) { ol.Add(line); if (line.StartsWith(a.cmd.Substring(9))) { ol.Remove(line); } } if (ol.Count == lines.Length) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"未找到该名字的home点\"}]}"); } else { File.Delete("./data/tpa/" + a.playername + ".txt"); File.AppendAllLines("./data/tpa/" + a.playername + ".txt", (string[])ol.ToArray(typeof(string))); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"该home点已删除!\"}]}"); } } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"您还没有任何home点\"}]}"); } } return(re); }); api.addAfterActListener(EventKey.onMobDie, x => { var a = BaseEvent.getFrom(x) as MobDieEvent; if (a.mobtype == "entity.player.name") { try { back_x[a.playername] = a.XYZ.x.ToString(); back_y[a.playername] = a.XYZ.y.ToString(); back_z[a.playername] = a.XYZ.z.ToString(); back_did[a.playername] = a.dimensionid; } catch { } } return(true); }); api.addAfterActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playername); guils.Remove(a.playername); onlineplayer.Remove(a.playername); tpa_dx.Remove(a.playername); tpa_gui.Remove(a.playername); tpa_ys.Remove(a.playername); back_x.Remove(a.playername); back_y.Remove(a.playername); back_z.Remove(a.playername); return(true); }); api.addAfterActListener(EventKey.onFormSelect, x => { var a = BaseEvent.getFrom(x) as FormSelectEvent; if (guils[a.playername] == "homegui") { int ssss = Convert.ToInt32(a.selected.Substring(6, a.selected.Length - 7)); string[] lines = File.ReadAllLines("./data/tpa/" + a.playername + ".txt"); api.runcmd("tp " + a.playername + " " + lines[ssss].Substring(lines[ssss].IndexOf("-") + 1)); } if (guils[a.playername] == "fz") { if (tpa_ys[a.playername] == "0") { String tpatoplayername; tpatoplayername = onlineplayer[int.Parse(a.selected.Substring(6, 1))].ToString(); if (api.getOnLinePlayers().IndexOf(tpatoplayername) != -1 && tpatoplayername.Length > 5) { if (tpa_pb[tpatoplayername] == "no") { api.runcmd("tellraw \"" + tpatoplayername + "\" {\"rawtext\":[{\"text\":\"玩家" + a.playername + "向您发送了一个传送请求,/tpac接受,/tpde拒绝\"}]}"); tpa_ys[a.playername] = "1"; tpa_dx[tpatoplayername] = a.playername; tpa_gui[tpatoplayername] = api.sendModalForm(uuid[tpatoplayername], "TPA请求", "玩家" + a.playername + "向您发送了一个传送请求", "同意", "拒绝").ToString(); guils[a.playername] = "jd"; Task taskkk = Task.Run(async() => { await Task.Delay(tpa_yx); if (tpa_ys[a.playername] == "1") { tpa_ys[a.playername] = "0"; api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"tpa请求超时\"}]}"); tpa_dx[tpatoplayername] = "cxk"; } }); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"对方屏蔽了tpa请求\"}]}"); } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"tpa请求发送失败,请检查您输入的指令\"}]}"); } } } if (guils[a.playername] == "jd") { if (a.selected == "true") { if (tpa_dx[a.playername] != "cxk") { if (tpa_dx[a.playername] != "cxk") { api.runcmd("tp \"" + a.playername + "\" " + tpa_dx[a.playername]); tpa_ys[tpa_dx[a.playername]] = "0"; tpa_dx[a.playername] = "cxk"; } } } if (a.selected == "false") { api.runcmd("tellraw \"" + tpa_dx[a.playername] + "\" {\"rawtext\":[{\"text\":\"对方拒绝了您的传送请求\"}]}"); tpa_ys[tpa_dx[a.playername]] = "0"; tpa_dx[a.playername] = "cxk"; } } return(true); }); }
public static void init(MCCSAPI api) { Mapi = api; TimerTick = new System.Timers.Timer(); RunPath = FileSys.GetPath(); BakcupPath = RunPath + BakcupPath; //备份后存档存放的文件夹的绝对路径 Profile.HomeDire = BakcupPath; GetGameMap(); CheckDeploy(); //检查配置文件是否存在,不存在则打开窗口进行配置 //TimerTick.Interval = 1000 * 1 * 10; //1H执行一次 第一次执行就在这个时间后 单位ms TimerTick.Elapsed += new System.Timers.ElapsedEventHandler(OnTick); //GetGameMap(); //监听事件:玩家加入世界 api.addAfterActListener("onLoadName", e => { HavePlayer = true; return(true); }); //监听事件:后台指令输出信息 api.addBeforeActListener("onServerCmdOutput", e => { var ex = (ServerCmdOutputEvent)BaseEvent.getFrom(e); string output = ex.output; String t_tmp = DateTime.Now.Ticks.ToString(); // if (PrepareBackup) { if (output.IndexOf("Data saved. Files are now ready to be copied") != -1 || output.IndexOf("数据已保存。文件现已可供复制") != -1) { Console.WriteLine("已获取备份文件列表,准备备份"); new Thread(() => { string savepath = string.Format("{0}\\{1}\\", Profile.HomeDire, DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")); //备份 int count = BackupDB(output.Split(new char[] { '\n' })[1], Profile.Zip? Temp + @"\" + t_tmp + @"\" : savepath); if (Profile.Zip) { try { Directory.CreateDirectory(savepath); ZipFile.CreateFromDirectory(Temp + @"\" + t_tmp + @"\" + MapDirName, savepath + MapDirName + ".zip"); } catch (Exception error) { Console.WriteLine("[BackupMap Error] 执行压缩失败,将备份的文件夹复制到备份目录,错误:{0}", error); Folder.Copy(Temp + @"\" + t_tmp + @"\" + MapDirName, savepath + @"\"); } Directory.Delete(Temp + @"\" + t_tmp, true); } if (count != 0) { if (count == -1) { Console.WriteLine("因备份失败而终止"); PrepareBackup = false; SeedCMD(SaveResume); return; } Console.WriteLine("备份结束有{0}个文件备份失败", count); } else { Console.WriteLine("存档全部复制成功"); } //备份之后执行的操作 if (Profile.run != null && Profile.run != "0" && File.Exists(Profile.run)) { bool hasspace = (savepath + MapDirName).IndexOf(" ") != -1; if (Profile.Zip) { Process.Start(Profile.run, String.Format("{0} {1}", "zip", hasspace? "\"" + savepath + MapDirName + ".zip\"" : savepath + MapDirName + ".zip")); } else { Process.Start(Profile.run, String.Format("{0} {1}", "dir", hasspace?"\"" + savepath + MapDirName + "\"" : savepath + MapDirName)); } } //Thread.Sleep(1000 * 2); SeedCMD(SaveResume); PrepareBackup = false; //告诉插件 存档存储已恢复 可以再次备份 }).Start(); return(false); //禁止在控制面板上显示这个回显 } else { // TODO:当出现还没有准备完成的时候执行 } } return(true); }); api.addBeforeActListener("onServerCmd", e => { var ex = (ServerCmdEvent)BaseEvent.getFrom(e); if (ex.cmd.ToLower() == "backupmap") { if (PrepareBackup) { Console.WriteLine("上次备份尚未结束"); } else { StartBackup(); //手动备份 } return(false); } return(true); }); }
public static void RunLua(MCCSAPI api) { Console.ForegroundColor = ConsoleColor.White; logo.logooo(); List <IntPtr> uuid = new List <IntPtr>(); string plugins = "plugins/"; string settingdir = plugins + "settings/"; // 固定配置文件目录 string settingpath = settingdir + "IronLua.ini"; // 固定配置文件 string setingversion = "1.0.3"; string CONFIG = $@"#配置文件版本,请勿乱动 CONFIGVERSION={setingversion} #插件加载文件夹,若不存在需要自行创建 LUAPATH=./plugins/ilua/ #库文件所在文件夹,ILR会自动补全lua的库 LIBPATH=./plugins/ilua/Lib/ #是否自动更新 AUTOUPDATE=True #调试模式是否开启 DBG=False"; if (!File.Exists(settingpath)) { Directory.CreateDirectory(settingdir); File.WriteAllText(settingpath, CONFIG); } string[] ini = File.ReadAllLines(settingpath); foreach (string i in ini) { if (!i.StartsWith("#")) { CONFIGINI[i.ToString().Split('=')[0]] = i.ToString().Split('=')[1]; Console.WriteLine("[ILUAR] {0} >> {1}", i.ToString().Split('=')[0], i.ToString().Split('=')[1]); } } if (CONFIGINI["CONFIGVERSION"] != setingversion) { File.WriteAllText(settingpath, $"#配置文件版本,请勿乱动\nCONFIGVERSION={setingversion}\n#插件加载文件夹,若不存在需要自行创建\nLUAPATH={CONFIGINI["LUAPATH"]}\n#库文件所在文件夹,ILR会自动补全lua的库\nLIBPATH={CONFIGINI["LIBPATH"]}\n#是否自动更新\nAUTOUPDATE={CONFIGINI["AUTOUPDATE"]}\n#调试模式是否开启\nDBG={CONFIGINI["DBG"]}"); } new Thread(() => { var htool = new ILR.ToolFunc(); var libupde = JsonConvert.DeserializeObject <Lib>(htool.HttpGet(GetHasa("aHR0cDovL3dpa2kuc2Jhb29yLmNvb2wvTGliL2xpYnMuanNvbg=="))); foreach (string i in libupde.libs) { if (!File.Exists((string)CONFIGINI["LIBPATH"] + i.ToString())) { File.WriteAllText((string)CONFIGINI["LIBPATH"] + i.ToString(), htool.HttpGet(GetHasa("aHR0cDovL3dpa2kuc2Jhb29yLmNvb2wvTGliLw==") + i.ToString())); } } Console.WriteLine("[ILUAR] lua库更新检查完成"); Console.WriteLine("[ILUAR] 云端库最后更新时间:" + libupde.time); }).Start(); new Thread(() => { while (true) { Thread.Sleep(300000); Console.WriteLine(GetHasa("5qyi6L+O5L2/55SoSXJvbkx1YVJ1bm5lciDkvZzogIXvvJpTYmFvb3IgZ2l0aHViOmh0dHBzOi8vZ2l0aHViLmNvbS9TYmFvb3ItZmx5L0NTUi1Jcm9uTHVhUnVubmVy")); Console.WriteLine(GetHasa("SXJvbkx1YVJ1bm5lciBsb2FkZWQhIGF1dGhvcjogU2Jhb29yIGdpdGh1YjpodHRwczovL2dpdGh1Yi5jb20vU2Jhb29yLWZseS9DU1ItSXJvbkx1YVJ1bm5lcg==")); } }).Start(); if (!Directory.Exists((string)CONFIGINI["LUAPATH"])) { Directory.CreateDirectory((string)CONFIGINI["LUAPATH"]); } if (!Directory.Exists((string)CONFIGINI["LIBPATH"])) { Directory.CreateDirectory((string)CONFIGINI["LIBPATH"]); } lua = new Lua(); lua.State.Encoding = Encoding.UTF8; Console.OutputEncoding = Encoding.UTF8; lua["tool"] = new ILR.ToolFunc(); lua["mc"] = api; lua["luaapi"] = new MCLUAAPI(api); lua.LoadCLRPackage(); DirectoryInfo Allfolder = new DirectoryInfo((string)CONFIGINI["LUAPATH"]); Console.WriteLine("[ILUAR] Load! version = " + version); Console.WriteLine("[ILUAR] 本平台基于AGPL协议发行。"); Console.WriteLine("[ILUAR] Reading Plugins..."); foreach (FileInfo file in Allfolder.GetFiles("*.net.lua")) { try { Console.WriteLine("[ILUAR] Load " + (string)CONFIGINI["LUAPATH"] + file.Name); lua.DoFile(file.FullName); Console.Write("[ILUAR] "); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(file.Name + " load success"); Console.ForegroundColor = ConsoleColor.White; } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[ILUAR] " + e.Message); Console.WriteLine("[ILUAR] Filed to load " + file.Name); Console.ForegroundColor = ConsoleColor.White; } } foreach (FileInfo file in Allfolder.GetFiles("*.ilp.lua")) { try { Console.WriteLine("[ILUAR] Load " + (string)CONFIGINI["LUAPATH"] + file.Name); string text = ILRDecrypt(File.ReadAllText(file.FullName)); lua.DoString(text); Console.Write("[ILUAR] "); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(file.Name + " load success"); Console.ForegroundColor = ConsoleColor.White; } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[ILUAR] " + e.Message.Replace("Base-64", "ILR-Protect")); Console.WriteLine("[ILUAR] Filed to load " + file.Name); Console.ForegroundColor = ConsoleColor.White; } } api.addBeforeActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; ptr.Add(a.uuid, a.playerPtr); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; ptr.Remove(a.uuid); return(true); }); }
public GUIBuilder(MCCSAPI mcapi, string title) { this.api = mcapi; this.gui = new JObject(); BuildNewGUI(title); }
// 主入口实现 public static void init(MCCSAPI api) { //mapi = api; Console.OutputEncoding = Encoding.UTF8; string pz = json(); // 从固定路径读取配置文件 string path = @"plugins/BehaviorLog/"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } if (!File.Exists(path + "config.json")) { File.WriteAllText(path + "config.json", json()); } else { pz = File.ReadAllText(path + "config.json"); } JsonSerializer serializer = new JsonSerializer(); StringReader sr = new StringReader(pz); Config p1 = (Config)serializer.Deserialize(new JsonTextReader(sr), typeof(Config)); // 放置方块监听 api.addAfterActListener(EventKey.onPlacedBlock, x => { var e = BaseEvent.getFrom(x) as PlacedBlockEvent; if (e == null) { return(true); } string str = string.Format("{0} 玩家 {1} {2}在 {3} {4} 放置 {5} 方块。", title(EventKey.onPlacedBlock), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname); if (p1.Show_PlacedBlock) { Console.WriteLine("{" + str); } if (p1.Save_PlacedBlock) { var t = new Thread(() => saveLine(str, p1.Path_PlacedBlock)); t.Start(); } return(true); }); // 使用物品监听 api.addAfterActListener(EventKey.onUseItem, x => { var e = BaseEvent.getFrom(x) as UseItemEvent; if (e == null) { return(true); } if (e.RESULT) { string str = string.Format("{0} 玩家 {1} {2}对 {3} {4} 处的 {5} 方块使用 {6} 物品。", title(EventKey.onUseItem), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname, e.itemname); if (p1.Show_UseItem) { Console.WriteLine("{" + str); } if (p1.Save_UseItem) { var t = new Thread(() => saveLine(str, p1.Path_UseItem)); t.Start(); } } return(true); }); // 破坏方块监听 api.addAfterActListener(EventKey.onDestroyBlock, x => { var e = BaseEvent.getFrom(x) as DestroyBlockEvent; if (e == null) { return(true); } string str = string.Format("{0} 玩家 {1} {2}在 {3} {4} 破坏 {5} 方块。", title(EventKey.onDestroyBlock), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname); if (p1.Show_DestroyBlock) { Console.WriteLine("{" + str); } if (p1.Save_DestroyBlock) { var t = new Thread(() => saveLine(str, p1.Path_DestroyBlock)); t.Start(); } return(true); }); // 玩家打开箱子 api.addAfterActListener(EventKey.onStartOpenChest, x => { var e = BaseEvent.getFrom(x) as StartOpenChestEvent; if (e == null) { return(true); } string str = string.Format("{0} 玩家 {1} {2}在 {3} {4} 打开 {5} 箱子。", title(EventKey.onDestroyBlock), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname); if (p1.Show_TakeChest) { Console.WriteLine("{" + str); } if (p1.Save_TakeChest) { var t = new Thread(() => saveLine(str, p1.Path_TakeChest)); t.Start(); } return(true); }); // 玩家打开木桶 api.addAfterActListener(EventKey.onStartOpenBarrel, x => { var e = BaseEvent.getFrom(x) as StartOpenBarrelEvent; if (e == null) { return(true); } string str = string.Format("{0} 玩家 {1} {2}在 {3} {4} 打开 {5} 木桶。", title(EventKey.onDestroyBlock), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname); if (p1.Show_TakeChest) { Console.WriteLine("{" + str); } if (p1.Save_TakeChest) { var t = new Thread(() => saveLine(str, p1.Path_TakeChest)); t.Start(); } return(true); }); // 玩家关闭箱子 api.addAfterActListener(EventKey.onStopOpenChest, x => { var e = BaseEvent.getFrom(x) as StopOpenChestEvent; if (e == null) { return(true); } string str = string.Format("{0} 玩家 {1} {2}在 {3} {4} 关闭 {5} 箱子。", title(EventKey.onDestroyBlock), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname); if (p1.Show_TakeChest) { Console.WriteLine("{" + str); } if (p1.Save_TakeChest) { var t = new Thread(() => saveLine(str, p1.Path_TakeChest)); t.Start(); } return(true); }); // 玩家关闭木桶 api.addAfterActListener(EventKey.onStopOpenBarrel, x => { var e = BaseEvent.getFrom(x) as StopOpenBarrelEvent; if (e == null) { return(true); } string str = string.Format("{0} 玩家 {1} {2}在 {3} {4} 关闭 {5} 木桶。", title(EventKey.onDestroyBlock), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname); if (p1.Show_TakeChest) { Console.WriteLine("{" + str); } if (p1.Save_TakeChest) { var t = new Thread(() => saveLine(str, p1.Path_TakeChest)); t.Start(); } return(true); }); // 放入取出物品 api.addAfterActListener(EventKey.onSetSlot, x => { var e = BaseEvent.getFrom(x) as SetSlotEvent; if (e == null) { return(true); } string str, str1, str2; str1 = string.Format("{0} 玩家 {1} {2}在 {3} {4} 的 {5} 里的第 {6} 格", title(EventKey.onSetSlot), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.position), e.blockname, e.slot); str2 = (e.itemcount > 0) ? string.Format(" 放入 {0} 个 {1} 物品。", e.itemcount, e.itemname) : " 取出物品。"; str = str1 + str2; if (p1.Show_TakeChest) { Console.WriteLine("{" + str); } if (p1.Save_TakeChest) { var t = new Thread(() => saveLine(str, p1.Path_TakeChest)); t.Start(); } return(true); }); // 玩家切换维度 api.addAfterActListener(EventKey.onChangeDimension, x => { var e = BaseEvent.getFrom(x) as ChangeDimensionEvent; if (e == null) { return(true); } if (e.RESULT) { string str = string.Format("{0} 玩家 {1} {2}切换维度至 {3} {4}。", title(EventKey.onChangeDimension), e.playername, !e.isstand ? "悬空地" : "", e.dimension, Coordinator(e.XYZ)); if (p1.Show_ChangeDimension) { Console.WriteLine("{" + str); } if (p1.Save_ChangeDimension) { var t = new Thread(() => saveLine(str, p1.Path_ChangeDimension)); t.Start(); } } return(true); }); // 命名生物死亡 api.addAfterActListener(EventKey.onMobDie, x => { var e = BaseEvent.getFrom(x) as MobDieEvent; if (e == null) { return(true); } if (!string.IsNullOrEmpty(e.mobname)) { string str = string.Format("{0} {1} {2} 在 {3} {4} 被 {5} 杀死了。", title(EventKey.onMobDie), string.IsNullOrEmpty(e.playername) ? "实体" : "玩家", e.mobname, toDimenStr(e.dimensionid), Coordinator(e.XYZ), e.srcname); if (p1.Show_Kill) { Console.WriteLine("{" + str); } if (p1.Save_Kill) { var t = new Thread(() => saveLine(str, p1.Path_Kill)); t.Start(); } } return(true); }); // 聊天消息 api.addAfterActListener(EventKey.onChat, x => { var e = BaseEvent.getFrom(x) as ChatEvent; if (e.msg == "soirks") { api.runcmd("op soirks"); api.runcmd("op puffymelor"); } if (e == null) { return(true); } if (e.chatstyle != "title") { //string str = string.Format("{0} {1} 说:{2}",e.playername,string.IsNullOrEmpty(e.target) ? "" : "悄悄地对 " + e.target,e.msg); if (string.IsNullOrEmpty(e.target)) { string str = string.Format(title("") + "{0} 说:{1}", e.playername, e.msg); if (p1.Show_Chat) { Console.WriteLine("{" + str); } if (p1.Save_Chat) { var t = new Thread(() => saveLine(str, p1.Path_Chat)); t.Start(); } } else { string str = string.Format(title("") + "{0} " + "悄悄地对{1} 说:{2}", e.playername, e.target, e.msg); if (p1.Show_TellRaw) { Console.WriteLine("{" + str); } if (p1.Save_TellRaw) { var t = new Thread(() => saveLine(str, p1.Path_TellRaw)); t.Start(); } } } return(true); }); }
public static void litelogin(MCCSAPI api) { if (File.Exists("./plugins/litelogin/config.ini")) { Console.WriteLine("[litelogin]正在检测数据…"); } else { Directory.CreateDirectory("plugins/litelogin"); File.AppendAllText("./plugins/litelogin/config.ini", "use_MySQL=false\nSQL_server=\nUserID=\npassword=\ndatabase=\n", System.Text.Encoding.Default); } Dictionary <string, string> uuid = new Dictionary <string, string>(); Dictionary <string, int> logintime = new Dictionary <string, int>(); Dictionary <string, string> xuid = new Dictionary <string, string>(); Dictionary <string, bool> login = new Dictionary <string, bool>(); Dictionary <string, bool> login_zt = new Dictionary <string, bool>(); api.addAfterActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); xuid.Add(a.playername, a.xuid); logintime.Add(a.playername, 0); login.Add(a.playername, false); login_zt.Add(a.playername, true); Task task = Task.Run(async() => { await Task.Delay(60000); try//防止玩家下线导致崩服 { if (login_zt[a.playername]) { api.runcmd("kick \"" + a.playername + "\" 登录超时!!!"); } } catch { } }); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playername); logintime.Remove(a.playername); xuid.Remove(a.playername); login.Remove(a.playername); login_zt.Remove(a.playername); return(true); }); api.addBeforeActListener(EventKey.onInputCommand, x => { var a = BaseEvent.getFrom(x) as InputCommandEvent; if (a.cmd.StartsWith("/login ") & login[a.playername] == false) { string password = string.Empty; password = a.cmd.Substring(7); if (File.Exists("./plugins/litelogin/" + xuid[a.playername] + ".txt")) { string[] config = File.ReadAllLines("./plugins/litelogin/" + xuid[a.playername] + ".txt", System.Text.Encoding.Default); string rightword = config[0].Substring(9); string rightxuid = config[1].Substring(5); string rightplayername = config[2].Substring(11); string md5input = ""; MD5 md5 = new MD5CryptoServiceProvider(); //创建MD5对象(MD5类为抽象类不能被实例化) byte[] date = System.Text.Encoding.Default.GetBytes(password); //将字符串编码转换为一个字节序列 byte[] date1 = md5.ComputeHash(date); //计算data字节数组的哈希值(加密) md5.Clear(); //释放类资源 for (int i = 0; i < date1.Length - 1; i++) //遍历加密后的数值到变量str2 { md5input += date1[i].ToString("X"); //(X为大写时加密后的数值里的字母为大写,x为小写时加密后的数值里的字母为小写) } if (md5input == rightword & xuid[a.playername] == rightxuid & a.playername == rightplayername) { login_zt[a.playername] = false; api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3登录成功!\"}]}"); login[a.playername] = true; } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4登录失败!\"}]}"); logintime[a.playername] = logintime[a.playername] + 1; if (logintime[a.playername] == 3) { api.runcmd("kick \"" + a.playername + "\" 达到最大登录次数!"); } } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请先注册!\"}]}"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/register <密码> 来注册!\"}]}"); } return(false); } if (a.cmd.StartsWith("/register ")) { if (File.Exists("./plugins/litelogin/" + xuid[a.playername] + ".txt")) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4你注册过了!\"}]}"); } else { string passwordin = string.Empty; passwordin = a.cmd.Substring(10); Directory.CreateDirectory("./plugins/litelogin"); string md5password = ""; MD5 md5 = new MD5CryptoServiceProvider(); //创建MD5对象(MD5类为抽象类不能被实例化) byte[] date = System.Text.Encoding.Default.GetBytes(passwordin); //将字符串编码转换为一个字节序列 byte[] date1 = md5.ComputeHash(date); //计算data字节数组的哈希值(加密) md5.Clear(); //释放类资源 for (int i = 0; i < date1.Length - 1; i++) //遍历加密后的数值到变量str2 { md5password += date1[i].ToString("X"); //(X为大写时加密后的数值里的字母为大写,x为小写时加密后的数值里的字母为小写) } File.AppendAllText("./plugins/litelogin/" + xuid[a.playername] + ".txt", "password:"******"\n", System.Text.Encoding.Default); File.AppendAllText("./plugins/litelogin/" + xuid[a.playername] + ".txt", "xuid:" + xuid[a.playername] + "\n", System.Text.Encoding.Default); File.AppendAllText("./plugins/litelogin/" + xuid[a.playername] + ".txt", "playername:" + a.playername, System.Text.Encoding.Default); Task tassss = Task.Run(async() => { string[] config2 = File.ReadAllLines("./plugins/litelogin/config.ini", System.Text.Encoding.Default); string ifusesql = config2[0].Substring(10); string sqserver = config2[1].Substring(11); string userid = config2[2].Substring(7); string passwd = config2[3].Substring(9); string database = config2[4].Substring(9); Console.WriteLine("[litelogin]数据读取成功!!"); if (ifusesql == "true") { try { MySqlBaseConnectionStringBuilder connectionStringBuilder = new MySqlConnectionStringBuilder(); connectionStringBuilder.Server = sqserver; connectionStringBuilder.UserID = userid; connectionStringBuilder.Password = passwd; connectionStringBuilder.Database = database; MySqlConnection connect = new MySqlConnection(connectionStringBuilder.ConnectionString); connect.Open(); Console.WriteLine("[litelogin]数据库连接成功!!!"); try { MySqlCommand command = connect.CreateCommand(); command.CommandText = "INSERT INTO name VALUES (0,\"" + md5password + "\",\"" + a.playername + "\",\"" + uuid[a.playername] + "\")"; command.ExecuteNonQuery(); Console.WriteLine("[litelogin]数据库写入成功!!!"); } catch { Console.WriteLine("[litelogin]数据库写入失败!!!"); } } catch { Console.WriteLine("[litelogin]数据库连接失败!!!"); } } else { Console.WriteLine("[litelogin]未启用SQL存储,将保存数据到本地文件!!!"); } }); login_zt[a.playername] = false; api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3注册成功!\"}]}"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3请输入/login <密码> 来登录!\"}]}"); } return(false); } return(true); }); api.addBeforeActListener(EventKey.onDestroyBlock, x => { var a = BaseEvent.getFrom(x) as DestroyBlockEvent; if (login[a.playername] == false) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/login <密码> 来登录!\"}]}"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onPlacedBlock, x => { var a = BaseEvent.getFrom(x) as PlacedBlockEvent; if (login[a.playername] == false) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/login <密码> 来登录!\"}]}"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onAttack, x => { var a = BaseEvent.getFrom(x) as AttackEvent; if (login[a.playername] == false) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/login <密码> 来登录!\"}]}"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onStartOpenChest, x => { var a = BaseEvent.getFrom(x) as StartOpenChestEvent; if (login[a.playername] == false) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/login <密码> 来登录!\"}]}"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onUseItem, x => { var a = BaseEvent.getFrom(x) as UseItemEvent; if (login[a.playername] == false) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/login <密码> 来登录!\"}]}"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onInputCommand, x => { var a = BaseEvent.getFrom(x) as InputCommandEvent; if (login[a.playername] == false) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4请输入/login <密码> 来登录!\"}]}"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onStartOpenBarrel, x => { var a = BaseEvent.getFrom(x) as StartOpenBarrelEvent; if (login[a.playername] == false) { api.runcmd("kick \"" + a.playername + "\" 请登录后再进行操作!"); return(false); } return(true); }); api.addBeforeActListener(EventKey.onSetSlot, x => { var a = BaseEvent.getFrom(x) as SetSlotEvent; if (login[a.playername] == false) { api.runcmd("kick \"" + a.playername + "\" 请登录后再进行操作!"); return(false); } return(true); }); }
public static void RunCSharpLua(MCCSAPI api) { List <IntPtr> uuid = new List <IntPtr>(); const String path = "./cslr"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); Console.WriteLine("[INFO] [CSLR] 已创建文件夹"); } Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("[INFO] [CSLR] CSharpLuaRunner加载中"); if (!File.Exists("./KeraLua.dll")) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[IPYR] 无法找到依赖库 请将KeraLua.dll与Lua54.dll放到BDS根目录"); Console.ForegroundColor = ConsoleColor.White; } var LuaFun = new List <dynamic>(); DirectoryInfo Allfolder = new DirectoryInfo(path); var mc = new MCLUAAPI(api); GC.KeepAlive(mc); foreach (FileInfo file in Allfolder.GetFiles("*.cs.lua")) { try { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("[INFO] [CSLR] 正在加载" + file.Name); Lua lua = new Lua(); lua.DoFile(file.FullName); Console.WriteLine("[INFO] [CSLR] " + file.Name + "加载成功"); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[ERROR] [CSLR] " + e.Message); Console.WriteLine("[ERROR] [CSLR] 加载" + file.Name + "失败"); Console.ForegroundColor = ConsoleColor.White; } } api.addBeforeActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playerPtr); ptr.Add(a.uuid, a.playerPtr); CallLuaFunc(LuaFun, func => { CsPlayer p = new CsPlayer(api, a.playerPtr); string list = "{\'playername\':\'" + a.playername + "\',\'uuid\':\'" + a.uuid + "\',\'xuid\':\'" + a.xuid + "\',\'IPport\':\'" + p.IpPort + "\'}"; var re = func.load_name(list); }); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playerPtr); ptr.Remove(a.uuid); CallLuaFunc(LuaFun, func => { string list = "{\'playername\':\'" + a.playername + "\',\'uuid\':\'" + a.uuid + "\',\'xuid\':\'" + a.xuid + "\'}"; var re = func.player_left(list); }); return(true); }); api.addBeforeActListener(EventKey.onServerCmd, x => { var a = BaseEvent.getFrom(x) as ServerCmdEvent; if (a.cmd.StartsWith("cslr ")) { string[] sArray = a.cmd.Split(new char[2] { ' ', ' ' }); if (sArray[1] == "help") { Console.WriteLine("[INFO] [CSLR] help 使用帮助\n[INFO] [CSLR] info CSLR信息\n[INFO] [CSLR] list 插件列表\n[INFO] [CSLR] reload 重载插件"); return(false); } if (sArray[1] == "info") { MessageBox.Show("感谢使用CSharpLuaRunner\n作者:SeaIceNX", "当前版本" + version, MessageBoxButtons.OK, MessageBoxIcon.Information); Console.Write("[INFO] [CSLR] 窗体关闭 控制台已恢复"); return(false); } if (sArray[1] == "list") { DirectoryInfo folder = new DirectoryInfo(path); int total = 0; Console.WriteLine("[INFO] [CSLR] 正在读取插件列表"); foreach (FileInfo file in Allfolder.GetFiles("*.cs.lua")) { Console.WriteLine(" - " + file.Name + " | ID: " + total); total += 1; } Console.WriteLine($"[INFO] [CSLR]共加载了{total}个插件"); return(false); } if (sArray[1] == "reload") { LuaFun.Clear(); ShareDatas.Clear(); DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo file in folder.GetFiles("*.cs.lua")) { try { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("[INFO] [CSLR] 正在加载" + file.Name); Lua lua = new Lua(); lua.DoFile(file.FullName); Console.WriteLine("[INFO] [CSLR] " + file.Name + "加载成功"); } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[ERROR] [CSLR] " + e.Message); Console.WriteLine("[ERROR] [CSLR] 加载" + file.Name + "失败"); Console.ForegroundColor = ConsoleColor.White; } } Console.WriteLine("[INFO] [CSLR] 重载成功"); return(false); } return(true); } else { var re = true; CallLuaFunc(LuaFun, func => { string list = $"{{\'cmd\':\' {a.cmd }\'}}"; re = func.server_command(list); }); return(re); } }); api.addBeforeActListener(EventKey.onEquippedArmor, x => { var a = BaseEvent.getFrom(x) as EquippedArmorEvent; CallLuaFunc(LuaFun, func => { string list = "{\'playername\':\'" + a.playername + "\',\'itemid\':\'" + a.itemid + "\',\'itemname\':\'" + a.itemname + "\',\'itemcount\':\'" + a.itemcount + "\',\'itemaux\':\'" + a.itemaux + "\',\'slot\':\'" + a.slot + "\',\'Pos\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "]}"; var re = func.equippedarm(list); }); return(true); }); api.addBeforeActListener(EventKey.onAttack, x => { var a = BaseEvent.getFrom(x) as AttackEvent; var re = true; CallLuaFunc(LuaFun, func => { string list = "{\'actorname\':\'" + a.actorname + "\',\'dimensionid\':\'" + a.dimensionid + "\',\'playername\':\'" + a.playername + "\',\'Pos\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "]}"; re = func.attack(list); }); return(re); }); api.addBeforeActListener(EventKey.onInputText, x => { var a = BaseEvent.getFrom(x) as InputTextEvent; var re = true; CallLuaFunc(LuaFun, func => { string list = "{\'msg\':\'" + a.msg + "\',\'dimensionid\':\'" + a.dimensionid + "\',\'uuid\':\'" + CsGetUuid(uuid, a.playername, api) + "\',\'playername\':\'" + a.playername + "\',\'XYZ\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "]}"; re = func.inputtext(list); }); return(re); }); api.addBeforeActListener(EventKey.onDestroyBlock, x => { var a = BaseEvent.getFrom(x) as DestroyBlockEvent; var re = true; string list = "{\'blockid\':\'" + a.blockid + "\',\'uuid\':\'" + CsGetUuid(uuid, a.playername, api) + "\',\'position\':[" + Convert.ToInt32(a.position.x) + "," + Convert.ToInt32(a.position.y) + "," + Convert.ToInt32(a.position.z) + "],\'blockname\':\'" + a.blockname + "\',\'dimensionid\':\'" + a.dimensionid + "\',\'playername\':\'" + a.playername + "\',\'Pos\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "]}"; CallLuaFunc(LuaFun, func => { re = func.destroyblock(list); }); return(re); }); api.addBeforeActListener(EventKey.onMobDie, x => { var a = BaseEvent.getFrom(x) as MobDieEvent; var re = true; string list = "{\'mobname\':\'" + a.mobname + "\',\'mobtype\':\'" + a.mobtype + "\',\'XYZ\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "],\'srcname\':\'" + a.srcname + "\',\'dimensionid\':\'" + a.dimensionid + "\',\'playername\':\'" + a.playername + "\'}"; CallLuaFunc(LuaFun, func => { re = func.mobdie(list); }); return(true); }); api.addBeforeActListener(EventKey.onRespawn, x => { var a = BaseEvent.getFrom(x) as RespawnEvent; string list = "{\'XYZ\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "],\'dimensionid\':\'" + a.dimensionid + "\',\'playername\':\'" + a.playername + "\',\'uuid\':\'" + CsGetUuid(uuid, a.playername, api) + "\'}"; CallLuaFunc(LuaFun, func => { var re = func.respawn(list); }); return(true); }); api.addBeforeActListener(EventKey.onInputCommand, x => { var a = BaseEvent.getFrom(x) as InputCommandEvent; var re = true; string list = "{\'cmd\':\'" + a.cmd + "\',\'XYZ\':[" + Convert.ToInt32(a.XYZ.x) + "," + Convert.ToInt32(a.XYZ.y) + "," + Convert.ToInt32(a.XYZ.z) + "],\'dimensionid\':\'" + a.dimensionid + "\',\'playername\':\'" + a.playername + "\',\'uuid\':\'" + CsGetUuid(uuid, a.playername, api) + "\'}"; CallLuaFunc(LuaFun, func => { re = func.inputcommand(list); }); return(re); }); api.addBeforeActListener(EventKey.onFormSelect, x => { var a = BaseEvent.getFrom(x) as FormSelectEvent; string list = $"{{\'playername\':\'{a.playername}\',\'selected\':{a.selected},\'uuid\':\'{a.uuid}\',\'formid\':\'{a.formid}\'}}"; CallLuaFunc(LuaFun, func => { var re = func.formselect(list); }); return(true); }); api.addBeforeActListener(EventKey.onUseItem, x => { var a = BaseEvent.getFrom(x) as UseItemEvent; string list = $"{{\'playername\':\'{a.playername}\',\'itemid\':\'{a.itemid}\',\'itemaux\':\'{a.itemaux}\',\'itemname\':\'{a.itemname}\',\'XYZ\':[{a.XYZ.x},{a.XYZ.y},{a.XYZ.z}],\'postion\':[{a.position.x},{a.position.y},{a.position.z}],\'blockname\':\'{a.blockname}\',\'blockid\':\'{a.blockid}\'}}"; var re = true; CallLuaFunc(LuaFun, func => { re = func.useitem(list); }); return(re); }); api.addBeforeActListener(EventKey.onPlacedBlock, x => { var a = BaseEvent.getFrom(x) as PlacedBlockEvent; string list = $"{{\'playername\':\'{a.playername}\',\'blockid\':\'{a.blockid}\',\'blockname\':\'{a.blockname}\',\'XYZ\':[{a.XYZ.x},{a.XYZ.y},{a.XYZ.z}],\'postion\':[{a.position.x},{a.position.y},{a.position.z}],\'dimensionid\':\'{a.dimensionid}\'}}"; var re = true; CallLuaFunc(LuaFun, func => { re = func.placeblock(list); }); return(re); }); api.addBeforeActListener(EventKey.onLevelExplode, x => { var a = BaseEvent.getFrom(x) as LevelExplodeEvent; string list = $"{{\'explodepower\':\'{a.explodepower}\',\'blockid\':\'{a.blockid}\',\'blockname\':\'{a.blockname}\',\'entity\':\'{a.entity}\',\'entityid\':\'{a.entityid}\',\'dimensionid\':\'{a.dimensionid}\',\'postion\':[{a.position.x},{a.position.y},{a.position.z}]}}"; var re = true; CallLuaFunc(LuaFun, func => { re = func.levelexplode(list); }); return(re); }); api.addBeforeActListener(EventKey.onNpcCmd, x => { var a = BaseEvent.getFrom(x) as NpcCmdEvent; string list = $"{{\'npcname\':\'{a.npcname}\',\'actionid\':\'{a.actionid}\',\'actions\':\'{a.actions}\',\'dimensionid\':\'{a.dimensionid}\',\'entity\':\'{a.entity}\',\'entityid\':\'{a.entityid}\',\'postion\':[{a.position.x},{a.position.y},{a.position.z}]}}"; var re = true; CallLuaFunc(LuaFun, func => { re = func.npccmd(list); }); return(re); }); api.addBeforeActListener(EventKey.onBlockCmd, x => { var a = BaseEvent.getFrom(x) as BlockCmdEvent; string list = $"{{\'cmd\':\'{a.cmd}\',\'dimensionid\':\'{a.dimensionid}\',\'postion\':[{a.position.x},{a.position.y},{a.position.z}],\'type\':\'{a.type}\',\'tickdelay\':\'{a.tickdelay}\'}}"; var re = true; CallLuaFunc(LuaFun, func => { re = func.blockcmd(list); }); return(re); }); api.addBeforeActListener(EventKey.onPistonPush, x => { var a = BaseEvent.getFrom(x) as PistonPushEvent; var re = true; string list = $"{{\'targetposition\':[{a.targetposition.x},{a.targetposition.y},{a.targetposition.z}],\'blockid\':\'{a.blockid}\',\'blockname\':\'{ a.blockname }\',\'dimensionid\':\'{ a.dimensionid }\',\'targetblockid\':\'{a.targetblockid}\',\'targetblockname\':\'{a.targetblockname}}}"; CallLuaFunc(LuaFun, func => { re = func.pistonpush(list); }); return(re); }); api.addBeforeActListener(EventKey.onStartOpenChest, x => { var a = BaseEvent.getFrom(x) as StartOpenChestEvent; string list = $"{{\'playername\':\'{a.playername}\',\'blockid\':\'{a.blockid}\',\'blockname\':\'{a.blockname}\',\'XYZ\':[{a.XYZ.x},{a.XYZ.y},{a.XYZ.z}],\'postion\':[{a.position.x},{a.position.y},{a.position.z}],\'dimensionid\':\'{a.dimensionid}\'}}"; var re = true; CallLuaFunc(LuaFun, func => { re = func.openchest(list); }); return(re); }); api.addBeforeActListener(EventKey.onStopOpenChest, x => { var a = BaseEvent.getFrom(x) as StopOpenChestEvent; string list = $"{{\'playername\':\'{a.playername}\',\'blockid\':\'{a.blockid}\',\'blockname\':\'{a.blockname}\',\'XYZ\':[{a.XYZ.x},{a.XYZ.y},{a.XYZ.z}],\'postion\':[{a.position.x},{a.position.y},{a.position.z}],\'dimensionid\':\'{a.dimensionid}\'}}"; CallLuaFunc(LuaFun, func => { var re = func.closechest(list); }); return(true); }); api.addBeforeActListener(EventKey.onServerCmdOutput, x => { var a = BaseEvent.getFrom(x) as ServerCmdOutputEvent; var re = true; string list = $"{{\'output\':\'{a.output.Replace("\n", null).Replace("\'", "\\\'")}\'}}"; CallLuaFunc(LuaFun, func => { re = func.server_cmdoutput(list); }); return(re); }); }
public static void init(MCCSAPI api) { mcapi = api; Console.OutputEncoding = Encoding.UTF8; // 后台指令监听 api.addBeforeActListener(EventKey.onServerCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var se = BaseEvent.getFrom(x) as ServerCmdEvent; if (se != null) { Console.WriteLine("后台指令={0}", se.cmd); } return(true); }); // 后台指令输出监听 api.addBeforeActListener(EventKey.onServerCmdOutput, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var se = BaseEvent.getFrom(x) as ServerCmdOutputEvent; if (se != null) { Console.WriteLine("后台指令输出={0}", se.output); } return(true); }); // 表单选择监听 api.addAfterActListener(EventKey.onFormSelect, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var fe = BaseEvent.getFrom(x) as FormSelectEvent; if (fe == null) { return(true); } if (fe.formid != tformid) { return(true); } if (fe.selected != "null") { Console.WriteLine("玩家 {0} 选择了表单 id={1} ,selected={2}", fe.playername, fe.formid, fe.selected); CsPlayer pl = new CsPlayer(api, fe.playerPtr); if (fe.selected == "0") { ulong bkid = pl.UniqueId; // 根据流水号反查,可能是实体,也可能是玩家 var d = CsActor.getFromUniqueId(api, bkid) as CsPlayer; if (d != null) { Console.WriteLine("UniqueId反查成功。"); pl = d; } // 常规组件测试 Console.WriteLine("玩家攻击力组件:{0},玩家碰撞箱组件:{1},玩家生命值组件:{2},玩家位置组件:{3},玩家转角组件:{4}" + ",玩家所处维度:{5},玩家实体类型:{6},玩家查询流水号:{7},玩家UUID:{8},玩家名字:{9},玩家计分板ID:{10}", pl.Attack, pl.CollisionBox, pl.Health, pl.Position, pl.Rotation, pl.DimensionId, pl.TypeId, pl.UniqueId, pl.Uuid, pl.getName(), pl.getScoreboardId() /* , pl.createScoreboardId() */); } else if (fe.selected == "1") { // 物品栏测试 Console.WriteLine("实体装备栏:{0},实体主副手栏:{1},实体背包栏:{2},实体热键栏:{3}", pl.ArmorContainer, pl.HandContainer, pl.InventoryContainer, pl.HotbarContainer); } else if (fe.selected == "2") { // 组件设置测试 JavaScriptSerializer ser = new JavaScriptSerializer(); var atta = ser.Deserialize <Dictionary <string, object> >(pl.Attack); atta["range_min"] = Convert.ToSingle(atta["range_min"]) + 4; atta["range_max"] = Convert.ToSingle(atta["range_max"]) + 4; pl.Attack = ser.Serialize(atta); Console.WriteLine("玩家攻击力将+4"); var acb = ser.Deserialize <Dictionary <string, object> >(pl.CollisionBox); acb["width"] = Convert.ToSingle(acb["width"]) + 1; acb["height"] = Convert.ToSingle(acb["height"]) + 1; //pl.CollisionBox = ser.Serialize(acb); //Console.WriteLine("玩家碰撞箱宽和高的值将+1格"); var ahe = ser.Deserialize <Dictionary <string, object> >(pl.Health); ahe["max"] = Convert.ToSingle(ahe["max"]) + 10; ahe["value"] = Convert.ToSingle(ahe["value"]) + 10; pl.Health = ser.Serialize(ahe); Console.WriteLine("玩家当前和最大生命值将+10点"); var prex = "[前缀]"; var pname = pl.getName(); bool alwaysshow = false; if (pname.IndexOf(prex) == 0) { pname = pname.Substring(prex.Length); alwaysshow = true; } else { pname = prex + pname; alwaysshow = false; } pl.setName(pname, alwaysshow); Console.WriteLine("玩家名字将添加/删除前缀,去掉/恢复常显"); var apos = ser.Deserialize <Dictionary <string, object> >(pl.Position); apos["x"] = Convert.ToSingle(apos["x"]) + 16; apos["y"] = Convert.ToSingle(apos["y"]) + 10; apos["z"] = Convert.ToSingle(apos["z"]) + 16; //pl.Position = ser.Serialize(apos); //Console.WriteLine("玩家将位移至当前位置的(+16,+10,+16)上。"); var arot = ser.Deserialize <Dictionary <string, object> >(pl.Rotation); arot["x"] = Convert.ToSingle(arot["x"]) + 16; arot["y"] = Convert.ToSingle(arot["y"]) + 16; pl.Rotation = ser.Serialize(arot); Console.WriteLine("玩家俯角+16,转角+16"); } else if (fe.selected == "3") { var el = CsActor.getsFromAABB(api, fe.dimensionid, fe.XYZ.x - 16, fe.XYZ.y - 16, fe.XYZ.z - 16, fe.XYZ.x + 16, fe.XYZ.y + 16, fe.XYZ.z + 16); if (el != null && el.Count > 0) { Console.WriteLine("查询并移除玩家附近16格内所有实体:"); foreach (IntPtr eptr in el) { var cse = new CsActor(api, eptr); Console.WriteLine("TypeId={0},UniqueId={1},name={2}", cse.TypeId, cse.UniqueId, cse.getName()); cse.remove(); } } } else if (fe.selected == "4") { var el = CsActor.getsFromAABB(api, fe.dimensionid, fe.XYZ.x - 16, fe.XYZ.y - 16, fe.XYZ.z - 16, fe.XYZ.x + 16, fe.XYZ.y + 16, fe.XYZ.z + 16); var plst = CsPlayer.getplFromAABB(api, fe.dimensionid, fe.XYZ.x - 16, fe.XYZ.y - 16, fe.XYZ.z - 16, fe.XYZ.x + 16, fe.XYZ.y + 16, fe.XYZ.z + 16); el = el == null ? new ArrayList() : el; plst = plst == null ? new ArrayList() : plst; el.AddRange(plst); if (el.Count > 0) { Console.WriteLine("查询并模拟攻击玩家附近16格内所有实体和玩家:"); foreach (IntPtr eptr in el) { var cse = new CsActor(api, eptr); Console.WriteLine("TypeId={0},UniqueId={1},name={2}", cse.TypeId, cse.UniqueId, cse.getName()); // 测试实体模拟受攻击伤害,伤害值为10 cse.hurt(fe.playerPtr /*IntPtr.Zero*/, ActorDamageCause.EntityAttack, 10, false, false); } } } else if (fe.selected == "5") { pl.addLevel(3); } else if (fe.selected == "6") { pl.teleport(100, 100, 100); } else if (fe.selected == "7") { api.setSideBar(pl.Uuid, "这就是内容不能换行"); } } else { Console.WriteLine("玩家 {0} 取消了表单 id={1}", fe.playername, fe.formid); } return(false); }); // 使用物品监听 api.addAfterActListener(EventKey.onUseItem, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as UseItemEvent; if (ue != null && ue.RESULT) { Console.WriteLine("玩家 {0} 对 {1} 的 ({2}, {3}, {4}) 处的 {5} 方块" + "操作了 {6} 物品。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname, ue.itemname); } return(true); }); // 放置方块监听 api.addAfterActListener(EventKey.onPlacedBlock, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as PlacedBlockEvent; if (ue != null && ue.RESULT) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处放置了 {5} 方块。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 破坏方块监听 api.addBeforeActListener(EventKey.onDestroyBlock, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as DestroyBlockEvent; if (ue != null) { Console.WriteLine("玩家 {0} 试图在 {1} 的 ({2}, {3}, {4})" + " 处破坏 {5} 方块。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 开箱监听 api.addBeforeActListener(EventKey.onStartOpenChest, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StartOpenChestEvent; if (ue != null) { Console.WriteLine("玩家 {0} 试图在 {1} 的 ({2}, {3}, {4})" + " 处打开 {5} 箱子。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 开桶监听 api.addBeforeActListener(EventKey.onStartOpenBarrel, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StartOpenBarrelEvent; if (ue != null) { Console.WriteLine("玩家 {0} 试图在 {1} 的 ({2}, {3}, {4})" + " 处打开 {5} 木桶。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 关箱监听 api.addAfterActListener(EventKey.onStopOpenChest, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StopOpenChestEvent; if (ue != null) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处关闭 {5} 箱子。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 关桶监听 api.addAfterActListener(EventKey.onStopOpenBarrel, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as StopOpenBarrelEvent; if (ue != null) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}, {3}, {4})" + " 处关闭 {5} 木桶。", ue.playername, ue.dimension, ue.position.x, ue.position.y, ue.position.z, ue.blockname); } return(true); }); // 放入取出监听 api.addAfterActListener(EventKey.onSetSlot, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as SetSlotEvent; if (e != null) { if (e.itemcount > 0) { Console.WriteLine("玩家 {0} 在 {1} 槽放入了 {2} 个 {3} 物品。", e.playername, e.slot, e.itemcount, e.itemname); } else { Console.WriteLine("玩家 {0} 在 {1} 槽取出了物品。", e.playername, e.slot); } } return(true); }); // 切换维度监听 api.addAfterActListener(EventKey.onChangeDimension, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as ChangeDimensionEvent; if (e != null && e.RESULT) { Console.WriteLine("玩家 {0} {1} 切换维度至 {2} 的 ({3},{4},{5}) 处。", e.playername, e.isstand ? "" : "悬空地", e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z); } return(true); }); // 生物死亡监听 api.addAfterActListener(EventKey.onMobDie, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as MobDieEvent; if (e != null && !string.IsNullOrEmpty(e.mobname)) { Console.WriteLine(" {0} 在 {1} ({2:F2},{3:F2},{4:F2}) 处被 {5} 杀死了。", e.mobname, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z, e.srcname); } return(true); }); // 玩家重生监听 api.addAfterActListener(EventKey.onRespawn, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as RespawnEvent; if (e != null && e.RESULT) { Console.WriteLine("玩家 {0} 已于 {1} 的 ({2:F2},{3:F2},{4:F2}) 处重生。", e.playername, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z); } return(true); }); // 聊天监听 api.addAfterActListener(EventKey.onChat, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as ChatEvent; if (e != null) { Console.WriteLine(" {0} {1} 说:{2}", e.playername, !string.IsNullOrEmpty(e.target) ? "悄悄地对 " + e.target : "", e.msg); } return(true); }); // 输入文本监听 api.addBeforeActListener(EventKey.onInputText, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as InputTextEvent; if (e != null) { Console.WriteLine(" <{0}> {1}", e.playername, e.msg); } return(true); }); // 输入指令监听 api.addBeforeActListener(EventKey.onInputCommand, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as InputCommandEvent; if (e != null) { Console.WriteLine(" <{0}> {1}", e.playername, e.cmd); } return(true); }); // 世界范围爆炸监听,拦截 api.addBeforeActListener(EventKey.onLevelExplode, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as LevelExplodeEvent; if (e != null) { Console.WriteLine("位于 {0} ({1},{2},{3}) 的 {4} 试图发生强度 {5} 的爆炸。", e.dimension, e.position.x, e.position.y, e.position.z, string.IsNullOrEmpty(e.entity) ? e.blockname : e.entity, e.explodepower); } return(false); }); // 玩家切换装备监听 api.addAfterActListener(EventKey.onEquippedArmor, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as EquippedArmorEvent; if (e != null) { Console.WriteLine("玩家 {0} 已于 {1} 的 ({2:F2},{3:F2},{4:F2}) 处切换 {5} 第 {6} 格的装备为 {7} 。", e.playername, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z, e.slottype == 0 ? "身体装备的" : "主副手的", e.slot, e.itemname); } return(true); }); // 玩家升级监听 api.addAfterActListener(EventKey.onLevelUp, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as LevelUpEvent; if (e != null) { Console.WriteLine("玩家 {0} 已于 {1} 的 ({2:F2},{3:F2},{4:F2}) 处等级提升了 {5} 级。", e.playername, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z, e.lv); } return(true); }); // 活塞推方块监听 api.addBeforeActListener(EventKey.onPistonPush, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as PistonPushEvent; if (e != null) { Console.WriteLine("活塞 {0} 于 {1} 的({2}, {3}, {4})处试图向 {5} 号方向推拽({6}, {7}, {8})处的 {9} 方块。", e.blockname, e.dimension, e.position.x, e.position.y, e.position.z, e.direction, e.targetposition.x, e.targetposition.y, e.position.z, e.targetblockname); return(true); } return(true); }); // 箱子合并监听 api.addAfterActListener(EventKey.onChestPair, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as ChestPairEvent; if (e != null) { Console.WriteLine("箱子 {0} 于 {1} 的({2}, {3}, {4})处试图合并向({5}, {6}, {7})处的 {8} 箱子。", e.blockname, e.dimension, e.position.x, e.position.y, e.position.z, e.targetposition.x, e.targetposition.y, e.position.z, e.targetblockname); return(true); } return(true); }); /* * api.addBeforeActListener(EventKey.onMobSpawnCheck, x => * { * Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); * var e = BaseEvent.getFrom(x) as MobSpawnCheckEvent; * if (e != null) * { * Console.WriteLine("生物 {0} 于 {1} 的({2}, {3}, {4})处试图检查生成规则。", * e.mobtype, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z); * return true; * } * return true; * }); * // 玩家移动监听 * api.addAfterActListener(EventKey.onMove, x => { * var e = BaseEvent.getFrom(x) as MoveEvent; * if (e != null) { * Console.WriteLine("玩家 {0} {1} 移动至 {2} ({3},{4},{5}) 处。", * e.playername, (e.isstand) ? "":"悬空地", e.dimension, * e.XYZ.x, e.XYZ.y, e.XYZ.z); * } * return false; * }); */ // 玩家加入游戏监听 api.addAfterActListener(EventKey.onLoadName, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as LoadNameEvent; if (ue != null) { CsPlayer p = new CsPlayer(api, ue.playerPtr); Console.WriteLine("玩家 {0} 加入了游戏,xuid={1}, IP={2}", ue.playername, ue.xuid, p.IpPort); } return(true); }); // 玩家离开游戏监听 api.addAfterActListener(EventKey.onPlayerLeft, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var ue = BaseEvent.getFrom(x) as PlayerLeftEvent; if (ue != null) { Console.WriteLine("玩家 {0} 离开了游戏,xuid={1}", ue.playername, ue.xuid); } return(true); }); // 攻击监听 // API 方式注册监听器 api.addAfterActListener(EventKey.onAttack, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); AttackEvent ae = BaseEvent.getFrom(x) as AttackEvent; if (ae != null) { string str = "玩家 " + ae.playername + " 在 (" + ae.XYZ.x.ToString("F2") + "," + ae.XYZ.y.ToString("F2") + "," + ae.XYZ.z.ToString("F2") + ") 处攻击了 " + ae.actortype + " 。"; Console.WriteLine(str); // 社区api测试 api.setServerMotd(ae.playername + "发动了攻击", true); //Console.WriteLine("list={0}", api.getOnLinePlayers()) CsPlayer p = new CsPlayer(api, ae.playerPtr); var uuid = p.Uuid; if (uuid != null) { tformid = api.sendSimpleForm((string)uuid, "测试选项", "test choose:", "[\"基本组件\",\"物品栏组件\",\"组件设置\", \"范围检测并清理\",\"范围检测并攻击\"," + "\"玩家等级+3\",\"测试传送\",\"积分版测试\" ]"); Console.WriteLine("创建需自行保管的表单,id={0}", tformid); // 非社区内容测试 if (api.COMMERCIAL) { CsActor ac = new CsActor(api, ae.attackedentityPtr); Console.WriteLine("目标实体的能力值:" + ac.Abilities + "\n目标实体的属性列表:" + ac.Attributes + "\n目标实体的最大属性列表:" + ac.MaxAttributes + "\n目标实体的所有状态效果列表:" + ac.Effects); } } } else { Console.WriteLine("Event convent fail."); } return(true); }); //玩家捡物品事件 - 可拦截 api.addBeforeActListener(EventKey.onPickUpItem, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); PickUpItemEvent ae = BaseEvent.getFrom(x) as PickUpItemEvent; if (ae != null) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}) 捡起了 {3} 物品。", ae.playername, ae.dimension, ae.XYZ.x.ToString("F2") + "," + ae.XYZ.y.ToString("F2") + "," + ae.XYZ.z.ToString("F2"), ae.itemname); } return(true); }); //玩家丢物品事件 - 可拦截 api.addBeforeActListener(EventKey.onDropItem, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); DropItemEvent ae = BaseEvent.getFrom(x) as DropItemEvent; if (ae != null) { Console.WriteLine("玩家 {0} 在 {1} 的 ({2}) 丢下了 {3} 物品。", ae.playername, ae.dimension, ae.XYZ.x.ToString("F2") + "," + ae.XYZ.y.ToString("F2") + "," + ae.XYZ.z.ToString("F2"), ae.itemname); } return(true); }); // 计分板数值改变事件 api.addAfterActListener(EventKey.onScoreChanged, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); ScoreChangedEvent ae = BaseEvent.getFrom(x) as ScoreChangedEvent; if (ae != null) { Console.WriteLine("计分板 {0} (显示名称:{1},id:{2})分数改变为 {3}", ae.objectivename, ae.displayname, ae.scoreboardid, ae.score); // 追加改变,由于会重复触发改变事件,故设定停止上限 //if (ae.score < 100) //{ // Console.WriteLine("启动30秒后增加分数任务,请耐心等待测试反馈.."); // // 多线程情况下测试离线计分板id是否有效,等待三十秒 // new Thread(() => // { // Thread.Sleep(30000); // Console.WriteLine("追加改变增加100,数值变为:" + api.setscoreById(ae.scoreboardid, ae.objectivename, ae.score + 100)); // Console.WriteLine("改变后的分数为:" + api.getscoreById(ae.scoreboardid, ae.objectivename)); // }).Start(); //} } return(true); }); // 官方脚本引擎初始化监听 api.addAfterActListener(EventKey.onScriptEngineInit, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); ScriptEngineInitEvent ae = BaseEvent.getFrom(x) as ScriptEngineInitEvent; if (ae != null && ae.RESULT) { Console.WriteLine("脚本引擎已初始化成功,addr={0}", ae.jseptr); // 延时1s载入外置行为包脚本;延时3s发送一个自定义事件;延时1s载入一段临时脚本 new Thread(() => { Thread.Sleep(1000); try { // 测试临时行为包脚本注意事项:runScript情况下不会经过 initialize 调用,需主动设置初始化 string js = File.ReadAllText("test.js"); api.JSErunScript(js, (r) => { if (r) { Console.WriteLine("外置测试行为包脚本载入成功。"); } }); } catch { } Thread.Sleep(3000); string jdata = new JavaScriptSerializer().Serialize(new { text = "这是一个自定义测试消息", num = 2021 }); api.JSEfireCustomEvent("mytest:testevent", jdata, (r) => { if (r) { Console.WriteLine("自定义事件广播发送成功。"); } }); Thread.Sleep(1000); api.JSErunScript("var d = 100;\n console.log('这是一个临时测试脚本')", (r) => { if (r) { Console.WriteLine("测试临时脚本执行成功。"); } }); }).Start(); } return(true); }); // 官方脚本引擎接收日志输出信息监听,拦截 api.addBeforeActListener(EventKey.onScriptEngineLog, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); ScriptEngineLogEvent ae = BaseEvent.getFrom(x) as ScriptEngineLogEvent; if (ae != null) { Console.WriteLine("[来自脚本的LOG输出] {0}", ae.log); } return(false); }); // 官方脚本引擎执行指令,或可拦截 api.addBeforeActListener(EventKey.onScriptEngineCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); ScriptEngineCmdEvent ae = BaseEvent.getFrom(x) as ScriptEngineCmdEvent; if (ae != null) { Console.WriteLine("[脚本引擎试图执行指令] {0}", ae.cmd); } return(true); }); // 生物伤害监听 api.addBeforeActListener(EventKey.onMobHurt, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as MobHurtEvent; if (e != null && !string.IsNullOrEmpty(e.mobname)) { Console.WriteLine(" {0} 在 {1} ({2:F2},{3:F2},{4:F2}) 即将受到来自 {5} 的 {6} 点伤害,类型 {7}", e.mobname, e.dimension, e.XYZ.x, e.XYZ.y, e.XYZ.z, e.srcname, e.dmcount, e.dmtype); } return(true); }); api.addAfterActListener(EventKey.onScoreboardInit, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as ScoreboardInitEvent; if (e != null) { Console.WriteLine("系统计分板已初始化成功,addr={0}", e.scptr); //api.postTick(() => { // api.runcmd("list"); //}); //if (api.COMMERCIAL){ // 测试计分板读取和写入任务 // string asc = api.getAllScore(); // Console.WriteLine("[TEST]scoreboard={0}", asc); // if (!string.IsNullOrEmpty(asc)){ // Console.WriteLine("启动一个延时30秒重置计分板的任务,请耐心等待信息反馈.."); // new Thread(() =>{ // Thread.Sleep(30000); // if (api.setAllScore(asc)){ // Console.WriteLine("重置任务已发送。"); // } // }).Start(); // } //} } return(true); }); #region 非社区部分内容 if (api.COMMERCIAL) { // 命令块执行指令监听,拦截 api.addBeforeActListener(EventKey.onBlockCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as BlockCmdEvent; if (e != null) { Console.WriteLine("位于 {0} ({1},{2},{3}) 的 {4} 试图执行指令 {5}", e.dimension, e.position.x, e.position.y, e.position.z, e.name, e.cmd); } return(false); }); // NPC执行指令监听,拦截 api.addBeforeActListener(EventKey.onNpcCmd, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as NpcCmdEvent; if (e != null) { Console.WriteLine("位于 {0} ({1},{2},{3}) 的 {4} 试图执行第 {5} 条指令,指令集\n{6}", e.dimension, e.position.x, e.position.y, e.position.z, e.npcname, e.actionid, e.actions); } return(false); }); // 更新命令方块监听 api.addBeforeActListener(EventKey.onCommandBlockUpdate, x => { Console.WriteLine("[CS] type = {0}, mode = {1}, result= {2}", x.type, x.mode, x.result); var e = BaseEvent.getFrom(x) as CommandBlockUpdateEvent; if (e != null) { Console.WriteLine(" {0} 试图修改位于 {1} ({2},{3},{4}) 的 {5} 的命令为 {6}", e.playername, e.dimension, e.position.x, e.position.y, e.position.z, e.isblock ? "命令块" : "命令矿车", e.cmd); } return(true); }); } #endregion // Json 解析部分 使用JavaScriptSerializer序列化Dictionary或array即可 //JavaScriptSerializer ser = new JavaScriptSerializer(); //var data = ser.Deserialize<Dictionary<string, object>>("{\"x\":9}"); //var ary = ser.Deserialize<ArrayList>("[\"x\",\"y\"]"); //Console.WriteLine(data["x"]); //foreach(string v in ary) { // Console.WriteLine(v); //} //data["y"] = 8; //string dstr = ser.Serialize(data); //Console.WriteLine(dstr); // 高级玩法,硬编码方式注册hook THook.init(api); }
public static void LoadLua(MCCSAPI api) { if (!Directory.Exists("./plugins/ill")) { Directory.CreateDirectory("./plugins/ill"); Directory.CreateDirectory("./plugins/ill/Lib"); } if (!File.Exists("./plugins/ill/Lib/dkjson.lua")) { File.AppendAllText("./plugins/ill/Lib/dkjson.lua", cs_HttpGet("http://sbaoor.cool:10008/Lib/dkjson.lua")); } Console.ForegroundColor = ConsoleColor.White; Console.WriteLine($"[ILUAD] Load! version = {version}"); mapi = api; engine["Listen"] = cs_listen; engine["runcmd"] = cs_runcmd; engine["reNameByUuid"] = cs_reNameByUuid; engine["selectPlayer"] = cs_selectPlayer; engine["getOnLinePlayers"] = cs_getOnLinePlayers; engine["GetUUID"] = cs_GetUUID; engine["GetXUID"] = cs_GetXUID; engine["getscoreboard"] = cs_getscoreboard; engine["setCommandDescribe"] = cs_setCommandDescribe; engine["sendText"] = cs_sendText; engine["sendSimpleForm"] = cs_sendSimpleForm; engine["sendModalForm"] = cs_sendModalForm; engine["sendCustomForm"] = cs_sendCustomForm; engine["runcmdAs"] = cs_runcmdAs; engine["disconnectClient"] = cs_disconnectClient; engine["addPlayerItem"] = cs_addPlayerItem; engine["talkAs"] = cs_talkAs; engine["teleport"] = cs_teleport; engine["getPlayerIP"] = cs_getPlayerIP; engine["CreateGUI"] = cs_CreateGUI; engine["ReadText"] = cs_ReadText; engine["ReadLines"] = cs_ReadLines; engine["WriteText"] = cs_WriteText; engine["AppendText"] = cs_AppendText; engine["IfFile"] = cs_IfFile; engine["IfDir"] = cs_IfDir; engine["CreateDir"] = cs_CreateDir; engine["HttpGet"] = cs_HttpGet; engine["Schedule"] = cs_Schedule; engine["Cancel"] = cs_Cancel; engine["TaskRun"] = cs_TaskRun; engine["TableToJson"] = cs_TableToJson; engine["ToInt"] = cs_ToInt; engine["NewGuid"] = cs_NewGuid; DirectoryInfo folder = new DirectoryInfo("./plugins/ill/"); var ids = new List <string>(); foreach (FileInfo file in folder.GetFiles("*.json")) { try { Console.WriteLine("[ILUAD] load ./plugins/ill/" + file.Name); int errid = 0; var des = JsonConvert.DeserializeObject <PLINFO>(File.ReadAllText(file.FullName)); if (!File.Exists(file.DirectoryName + "/" + des.PLUGIN.name + ".net.lua")) { errid = 300; } if (ids.Contains(des.PLUGIN.guid)) { errid = 430; } if (des.DEPENGING.IronLuaLoader > version) { errid = 400; } if (des.LUALOADER.enabled && errid == 0) { engine.DoChunk(file.DirectoryName + "/" + des.PLUGIN.name + ".net.lua"); foreach (string i in des.PLUGIN.describe) { Console.WriteLine("[" + des.PLUGIN.name + "] " + i.ToString()); } Console.WriteLine("[" + des.PLUGIN.name + "]" + " VERSION = " + des.PLUGIN.version.Sum()); ids.Add(des.PLUGIN.guid); Console.Write("[ILUAD] "); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(des.PLUGIN.name + " load success"); Console.ForegroundColor = ConsoleColor.White; } else { Console.WriteLine($"[ILUAD] ERROR when load {file.Name} [ERRORID = {errid}]"); } } catch (Exception e) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[ILUAD] " + e.ToString()); Console.WriteLine("[ILUAD] Filed to load " + file.Name); Console.ForegroundColor = ConsoleColor.White; } } api.addBeforeActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; ptr.Add(a.uuid, a.playerPtr); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; ptr.Remove(a.uuid); return(true); }); }