Пример #1
0
        private bool ProcessPlayerInfo(StreamWriter s, PacketTypes p, PlayerInfo pi)
        {
            switch (p)
            {
            case PacketTypes.REQUEST:
            {
                Player playa = WorldInterface.GetPlayer(pi.id, pi.key);
                if (playa != null)
                {
                    PlayerID = pi.id;
                    var coord = playa.GetPosition();
                    var vel   = playa.GetVelocity();
                    pi = new PlayerInfo(PacketTypes.REQUESTED)
                    {
                        id = playa.Id,
                        x  = coord.x,
                        y  = coord.y,
                        vx = vel.x,
                        vy = vel.y
                    };
                    s(NetHelpers.ConvertStructToBytes(pi));


                    //Send over object positions in the region surrounding our player
                    //DON'T DO THIS YET... Still thinking about it, Client needs to support it
                    foreach (var obj in WorldInterface.GetRegionObjects(coord.x - 10, coord.x + 10, coord.y - 10, coord.y + 10))
                    {
                        if (obj == null)
                        {
                            continue;
                        }
                        var oc = obj.GetPosition();
                        var oi = new ObjectInfo(PacketTypes.REQUESTED)
                        {
                            id         = obj.Id,
                            objecttype = (int)obj.ObjectType,
                            x          = oc.x,
                            y          = oc.y,
                            vx         = 0,
                            vy         = 0,
                        };
                        s(NetHelpers.ConvertStructToBytes(oi));
                    }
                }
                return(true);
            }
            }
            return(false);
        }
Пример #2
0
        private bool ProcessRegionInfo(StreamWriter s, PacketTypes p, RegionInfo ri)
        {
            switch (p)
            {
            case PacketTypes.REQUEST:
            {
                //Get Cell Type Info
                if ((ri.regionDataTypes & WorldConstants.REGION_INFO_CELL) != 0)
                {
                    CellInfo         c      = new CellInfo(PacketTypes.REQUESTED);
                    List <WorldCell> region = new List <WorldCell>(WorldInterface.GetRegionCells(ri.x1, ri.x2, ri.y1, ri.y2));
                    int count = region.Count;
                    foreach (WorldCell wc in region)
                    {
                        c.cellType       = (byte)wc.WorldCellType;
                        c.remainingCells = --count;         // I don't even know if this is necessary anymore...
                        c.x = wc.X;
                        c.y = wc.Y;

                        s(NetHelpers.ConvertStructToBytes(c));
                    }
                }
                //Get Object Info
                if ((ri.regionDataTypes & WorldConstants.REGION_INFO_OBJECT) != 0 || (ri.regionDataTypes & WorldConstants.REGION_INFO_PLAYER) != 0)
                {
                    bool       obj = (ri.regionDataTypes & WorldConstants.REGION_INFO_OBJECT) != 0;
                    bool       ply = (ri.regionDataTypes & WorldConstants.REGION_INFO_PLAYER) != 0;
                    ObjectInfo o   = new ObjectInfo(PacketTypes.REQUESTED);
                    foreach (var wobject in WorldInterface.GetRegionObjects(ri.x1, ri.x2, ri.y1, ri.y2))
                    {
                        if (wobject == null)
                        {
                            continue;
                        }
                        var pos = wobject.GetPosition();
                        if (wobject.ObjectType == WorldObjectTypes.PLAYER && ply)
                        {
                            var vel = ((Player)wobject).GetVelocity();
                            o.id         = wobject.Id;
                            o.x          = pos.x;
                            o.y          = pos.y;
                            o.vx         = vel.x;
                            o.vy         = vel.y;
                            o.objecttype = WorldConstants.TYPE_PLAYER;
                            s(NetHelpers.ConvertStructToBytes(o));
                        }
                        else if (obj)
                        {
                            o.id = wobject.Id;
                            o.x  = pos.x;
                            o.y  = pos.y;
                            if (wobject.ObjectType == WorldObjectTypes.MARKER)
                            {
                                o.objecttype = WorldConstants.TYPE_MARKER;
                            }
                            else if (wobject.ObjectType == WorldObjectTypes.MOVEABLE)
                            {
                                var vel = ((Moveable)wobject).GetVelocity();
                                o.objecttype = WorldConstants.TYPE_MOVEABLE;
                                o.vx         = vel.x;
                                o.vy         = vel.y;
                            }
                            else
                            {
                                o.objecttype = WorldConstants.TYPE_GENERIC;
                            }
                            s(NetHelpers.ConvertStructToBytes(o));
                        }
                    }
                }
                return(true);
            }
            }
            return(false);
        }