public override void Use(Player p, string message, CommandData data) { PortalArgs pArgs = new PortalArgs(); pArgs.Multi = false; string[] args = message.SplitSpaces(); string block = message.Length == 0 ? "" : args[0].ToLower(); if (args.Length >= 2 && args[1].CaselessEq("multi")) { pArgs.Multi = true; } else if (args.Length >= 2) { Help(p); return; } pArgs.Block = GetBlock(p, block); if (pArgs.Block == Block.Invalid) { return; } if (!CommandParser.IsBlockAllowed(p, "place a portal of", pArgs.Block)) { return; } pArgs.Entries = new List <PortalPos>(); p.Message("Place an &aEntry block %Sfor the portal"); p.ClearBlockchange(); p.blockchangeObject = pArgs; p.Blockchange += EntryChange; }
void ExitChange(Player p, ushort x, ushort y, ushort z, BlockID block) { p.ClearBlockchange(); p.RevertBlock(x, y, z); PortalArgs args = (PortalArgs)p.blockchangeObject; string exitMap = p.level.name; foreach (PortalPos P in args.Entries) { string map = P.Map; if (map == p.level.name) { p.RevertBlock(P.x, P.y, P.z); } object locker = ThreadSafeCache.DBCache.GetLocker(map); lock (locker) { Portal.Set(map, P.x, P.y, P.z, x, y, z, exitMap); } } p.Message("&3Exit %Sblock placed"); if (!p.staticCommands) { return; } args.Entries.Clear(); p.blockchangeObject = args; p.Blockchange += EntryChange; }
void ExitChange(Player p, ushort x, ushort y, ushort z, ExtBlock block) { p.ClearBlockchange(); p.RevertBlock(x, y, z); PortalArgs args = (PortalArgs)p.blockchangeObject; string dstMap = p.level.name.UnicodeToCp437(); foreach (PortalPos P in args.Entries) { string lvlName = P.Map; object locker = ThreadSafeCache.DBCache.GetLocker(lvlName); lock (locker) { Database.Backend.CreateTable("Portals" + lvlName, LevelDB.createPortals); Level map = LevelInfo.FindExact(P.Map); if (map != null) { map.hasPortals = true; } int count = 0; using (DataTable portals = Database.Backend.GetRows("Portals" + lvlName, "*", "WHERE EntryX=@0 AND EntryY=@1 AND EntryZ=@2", P.x, P.y, P.z)) { count = portals.Rows.Count; } if (count == 0) { Database.Backend.AddRow("Portals" + lvlName, "EntryX, EntryY, EntryZ, ExitX, ExitY, ExitZ, ExitMap", P.x, P.y, P.z, x, y, z, dstMap); } else { Database.Backend.UpdateRows("Portals" + lvlName, "ExitMap=@6, ExitX=@3, ExitY=@4, ExitZ=@5", "WHERE EntryX=@0 AND EntryY=@1 AND EntryZ=@2", P.x, P.y, P.z, x, y, z, dstMap); } } if (P.Map == p.level.name) { p.SendBlockchange(P.x, P.y, P.z, args.Block); } } Player.Message(p, "&3Exit %Sblock placed"); if (!p.staticCommands) { return; } args.Entries.Clear(); p.blockchangeObject = args; p.Blockchange += EntryChange; }
void EntryChange(Player p, ushort x, ushort y, ushort z, BlockID block) { PortalArgs args = (PortalArgs)p.blockchangeObject; BlockID old = p.level.GetBlock(x, y, z); if (!p.level.CheckAffect(p, x, y, z, old, args.Block)) { p.RevertBlock(x, y, z); return; } p.ClearBlockchange(); if (args.Multi && block == Block.Red && args.Entries.Count > 0) { ExitChange(p, x, y, z, block); return; } p.level.UpdateBlock(p, x, y, z, args.Block); p.SendBlockchange(x, y, z, Block.Green); PortalPos Port; Port.Map = p.level.name; Port.x = x; Port.y = y; Port.z = z; args.Entries.Add(Port); p.blockchangeObject = args; if (!args.Multi) { p.Blockchange += ExitChange; p.Message("&aEntry block placed"); } else { p.Blockchange += EntryChange; p.Message("&aEntry block placed. &c{0} block for exit", Block.GetName(p, Block.Red)); } }