示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#3
0
        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;
        }
示例#4
0
        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));
            }
        }