Пример #1
0
        public void Teleport(ushort MapID, ushort X, ushort Y)
        {
            if (Kernel.IsWalkable(MapID, X, Y))
            {
                GeneralData *Packet = PacketHelper.AllocGeneral();

                if (Entity.Location.MapID == MapID && ConquerMath.CalculateDistance(X, Y, Entity.Location.X, Entity.Location.Y, true) < Kernel.ScreenView)
                {
                    // Teleporting within Kernel.ScreenView distance. Don't remove entity from other players. Send "Jump" packet instead
                    Packet->DataID      = GeneralDataID.Jump;
                    Packet->UID         = Entity.UID;
                    Packet->ValueA      = Entity.Location.X;
                    Packet->ValueB      = Entity.Location.Y;
                    Packet->ValueD_High = X;
                    Packet->ValueD_Low  = Y;

                    Entity.Location.MapID = MapID;
                    Entity.Location.X     = X;
                    Entity.Location.Y     = Y;
                    SendScreen(Packet, Packet->Size, true);
                }
                else
                {
                    Packet->UID    = Entity.UID;
                    Packet->DataID = GeneralDataID.RemoveEntity;
                    SendScreen(Packet, Packet->Size);
                }
                Packet         = PacketHelper.ReAllocGeneral(Packet);
                Packet->UID    = Entity.UID;
                Packet->DataID = GeneralDataID.ChangeMap;

                Packet->ValueA      = X;
                Packet->ValueB      = Y;
                Packet->ValueD_High = MapID;

                Entity.Location.MapID = MapID;
                Entity.Location.X     = X;
                Entity.Location.Y     = Y;

                Send(Packet, Packet->Size);
                Memory.Free(Packet);
            }
            else
            {
                Message(string.Format("Can't teleport to MapID: {0} X {1} Y {2}.", MapID, X, Y), ChatType.Center, Color.White);
                return;
            }
        }
Пример #2
0
        public void RemoveFromScreen()
        {
            GeneralData *Packet = PacketHelper.AllocGeneral();

            Packet->UID    = Entity.UID;
            Packet->DataID = GeneralDataID.RemoveEntity;
            SendScreen(Packet, Packet->Size);

            Entity[] Entities = Screen.Players;
            Parallel.ForEach(Entities, (entity) =>
            {
                entity.Owner.Screen.Remove(Entity);
            });

            Memory.Free(Packet);
        }