Ejemplo n.º 1
0
 /////////////////////////////////////////////////////////////////////////////////
 // Save position
 /////////////////////////////////////////////////////////////////////////////////
 #region Save position
 protected void SavePlayerPosition()
 {
     //Wrap our function inside a catcher
     try
     {
         //Update database
         if (!File.FileLoad.CheckCave(Character.Position.xSec, Character.Position.ySec))
         {
             MsSQL.UpdateData("update character set xsect='" + Character.Position.xSec +
                              "', ysect='" + Character.Position.ySec +
                              "', xpos='" + Math.Round(Formule.packetx(Character.Position.x, Character.Position.xSec)) +
                              "', ypos='" + Math.Round(Formule.packety(Character.Position.y, Character.Position.ySec)) +
                              "', zpos='" + Math.Round(Character.Position.z) +
                              "' where id='" + Character.Information.CharacterID + "'");
         }
         else
         {
             MsSQL.UpdateData("update character set xsect='" + Character.Position.xSec +
                              "', ysect='" + Character.Position.ySec +
                              "', xpos='" + Math.Round(Formule.cavepacketx(Character.Position.x)) +
                              "', ypos='" + Math.Round(Formule.cavepackety(Character.Position.y)) +
                              "', zpos='" + Math.Round(Character.Position.z) +
                              "' where id='" + Character.Information.CharacterID + "'");
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine("Save position error {0}", ex);
         Systems.Debugger.Write(ex);
     }
 }
Ejemplo n.º 2
0
 /////////////////////////////////////////////////////////////////////////////////
 // Cave movement teleport
 /////////////////////////////////////////////////////////////////////////////////
 public void Movement_CaveTeleport()// This was changed due to going in and out of caves to change the movment patten
 {
     try
     {
         // if our destination is caveteleport
         foreach (Global.CaveTeleports r in Data.CaveTeleports)
         {
             if (!File.FileLoad.CheckCave(Character.Position.xSec, Character.Position.ySec))
             {
                 if (Formule.gamedistance(Formule.packetx(Character.Position.x, Character.Position.xSec), Formule.packety(Character.Position.y, Character.Position.ySec), (float)r.x, (float)r.y) <= 10)
                 {
                     foreach (Global.cavepoint p in Data.cavePointBase)
                     {
                         if (p != null)
                         {
                             if (p.Name == r.name)
                             {
                                 TeleportCave(p.Number);
                                 break;
                             }
                         }
                     }
                     break;
                 }
             }
             else
             {
                 if (Formule.gamedistance(Formule.cavepacketx(Character.Position.x), Formule.cavepackety(Character.Position.y), (float)r.x, (float)r.y) <= 10)
                 {
                     foreach (Global.cavepoint p in Data.cavePointBase)
                     {
                         if (p != null)
                         {
                             if (p.Name == r.name)
                             {
                                 TeleportCave(p.Number);
                                 break;
                             }
                         }
                     }
                     break;
                 }
             }
         }
     }
     catch (Exception ex)
     {
         Systems.Debugger.Write(ex);
     }
 }
Ejemplo n.º 3
0
 /////////////////////////////////////////////////////////////////////////////////
 // Update set stats
 /////////////////////////////////////////////////////////////////////////////////
 #region Set Stats
 public void SetStat()
 {
     //Wrap our function inside a catcher
     try
     {
         //Update stats hp / mp
         Character.Stat.Hp = Formule.gamePhp(Character.Information.Level, Character.Stat.Strength);
         Character.Stat.Mp = Formule.gamePmp(Character.Information.Level, Character.Stat.Intelligence);
         //Send visual update packet
         client.Send(Packet.PlayerStat(Character));
     }
     catch (Exception ex)
     {
         Console.WriteLine("Set stats error {0}", ex);
         Systems.Debugger.Write(ex);
     }
 }
Ejemplo n.º 4
0
        /////////////////////////////////////////////////////////////////////////////////
        // Movement checks before picking
        /////////////////////////////////////////////////////////////////////////////////
        void Player_PickUp()
        {
            try
            {
                if (Character.State.Sitting)
                {
                    return;
                }
                if (Character.State.Exchanging)
                {
                    return;
                }

                if (Character.Action.Target != 0)
                {
                    world_item item = GetWorldItem(Character.Action.Target);

                    if (item == null)
                    {
                        return;
                    }

                    double distance = Formule.gamedistance(Character.Position.x, Character.Position.y, (float)item.x, (float)item.y);

                    if (distance >= 1)
                    {
                        Character.Position.wX = (float)item.x - Character.Position.x;
                        Character.Position.wY = (float)item.y - Character.Position.y;

                        Send(Packet.Movement(new DarkEmu_GameServer.Global.vektor(Character.Information.UniqueID, (float)Formule.packetx((float)item.x, item.xSec), (float)Character.Position.z, (float)Formule.packety((float)(float)item.y, item.ySec), Character.Position.xSec, Character.Position.ySec)));

                        Character.Position.Time         = (distance / (Character.Speed.RunSpeed * 0.0768)) * 1000.0;
                        Character.Position.RecordedTime = Character.Position.Time;

                        StartMovementTimer((int)(Character.Position.Time * 0.1));
                        return;
                    }

                    Player_PickUpItem();
                }
            }
            catch (Exception ex)
            {
                Systems.Debugger.Write(ex);
            }
        }
Ejemplo n.º 5
0
 /////////////////////////////////////////////////////////////////////////////////
 // Save return / last place of death etc
 /////////////////////////////////////////////////////////////////////////////////
 #region Save last point of death or return scroll usage
 protected void SavePlayerReturn()
 {
     //Wrap our function inside a catcher
     try
     {
         //Update database
         MsSQL.UpdateData("update character_rev set revxsec='" + Character.Position.xSec +
                          "', revysec='" + Character.Position.ySec +
                          "', revx='" + Math.Round(Formule.packetx(Character.Position.x, Character.Position.xSec)) +
                          "', revy='" + Math.Round(Formule.packety(Character.Position.y, Character.Position.ySec)) +
                          "', revz='" + Math.Round(Character.Position.z) +
                          "' where charname='" + Character.Information.Name + "'");
     }
     catch (Exception ex)
     {
         Console.WriteLine("Save return position error {0}", ex);
         Systems.Debugger.Write(ex);
     }
 }
Ejemplo n.º 6
0
 /////////////////////////////////////////////////////////////////////////////////
 // Update gamex / y
 /////////////////////////////////////////////////////////////////////////////////
 #region UpdateXY
 void UpdateXY()
 {
     //Wrap our function inside a catcher
     try
     {
         //Update x and y of character
         if (!File.FileLoad.CheckCave(Character.Position.xSec, Character.Position.ySec))
         {
             Character.Position.x = Formule.gamex(Character.Position.x, Character.Position.xSec);
             Character.Position.y = Formule.gamey(Character.Position.y, Character.Position.ySec);
         }
         else
         {
             //New cave update x y
             Character.Position.x = Formule.cavegamex(Character.Position.x);
             Character.Position.y = Formule.cavegamey(Character.Position.y);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine("Update xy error {0}", ex);
         Systems.Debugger.Write(ex);
     }
 }
Ejemplo n.º 7
0
        public static byte[] Party_DataMember(party p)
        {
            //Create new packet writer
            PacketWriter Writer = new PacketWriter();

            //Add opcode
            Writer.Create(Systems.SERVER_PARTYMEMBER_DATA);
            //Write static byte
            Writer.Byte(0xFF);
            //Write party id
            Writer.DWord(p.ptid);
            //Write leader id
            Writer.DWord(p.LeaderID);
            //Write byte party type
            Writer.Byte(p.Type);
            //Write total amount of members in party
            Writer.Byte(p.Members.Count);
            //Repeat for each member in party -1
            for (byte b = 0; b <= p.Members.Count - 1; b++)
            {
                //Get player detail information
                Systems PartyMemberInfo = Systems.GetPlayer(p.Members[b]);
                //Calculate hp and mp
                int partyPercentMP = (int)Math.Round((decimal)(PartyMemberInfo.Character.Stat.SecondMP * 10) / PartyMemberInfo.Character.Stat.Mp) << 4;
                int partyPercentHP = (int)Math.Round((decimal)(PartyMemberInfo.Character.Stat.SecondHp * 10) / PartyMemberInfo.Character.Stat.Hp);
                //Set percent
                int partyPercent = partyPercentHP | partyPercentMP;
                //Write static byte
                Writer.Byte(0xff);
                //Write unique member id
                Writer.DWord(PartyMemberInfo.Character.Information.UniqueID);
                //Write character name
                Writer.Text(PartyMemberInfo.Character.Information.Name);
                //Write character model
                Writer.DWord(PartyMemberInfo.Character.Information.Model);
                //Write character level
                Writer.Byte(PartyMemberInfo.Character.Information.Level);
                //Write stat hp mp information
                Writer.Byte((byte)partyPercent);
                //Write x and y sector
                Writer.Byte(PartyMemberInfo.Character.Position.xSec);
                Writer.Byte(PartyMemberInfo.Character.Position.ySec);
                //Write x z y
                Writer.Word(Formule.packetx(PartyMemberInfo.Character.Position.x, PartyMemberInfo.Character.Position.xSec));
                Writer.Word(PartyMemberInfo.Character.Position.z);
                Writer.Word(Formule.packety(PartyMemberInfo.Character.Position.y, PartyMemberInfo.Character.Position.ySec));
                //Write double word 1
                Writer.Word(1);
                Writer.Word(1);
                //If player has a guild
                if (PartyMemberInfo.Character.Network.Guild.Name != null)
                {
                    //Write guild name
                    Writer.Text(PartyMemberInfo.Character.Network.Guild.Name);
                }
                //If player has no guild
                else
                {
                    //Write word 0 value
                    Writer.Word(0);
                }
                //Write static byte
                Writer.Byte(0);
                //Write dword
                Writer.DWord(0);
                Writer.DWord(0);
            }
            //Return all bytes for sending
            return(Writer.GetBytes());
        }
Ejemplo n.º 8
0
        public static byte[] Party_Data(byte type, int id)
        {
            //Create new packet writer
            PacketWriter Writer = new PacketWriter();

            //Add opcode
            Writer.Create(Systems.SERVER_PARTY_DATA);
            //Write type byte
            Writer.Byte(type);
            //Create switch for type given
            switch (type)
            {
            case 1:
                //Remove party state
                Writer.Byte(0x0b);
                Writer.Byte(0);
                //Return all bytes for sending
                return(Writer.GetBytes());

            case 2:
                //Formed party new member update
                Systems CharacterInformation = Systems.GetPlayer(id);
                //Write static byte
                Writer.Byte(0xFF);
                //Write unique character id
                Writer.DWord(CharacterInformation.Character.Information.UniqueID);
                //Write character name
                Writer.Text(CharacterInformation.Character.Information.Name);
                //Write character model
                Writer.DWord(CharacterInformation.Character.Information.Model);
                //Write character level
                Writer.Byte(CharacterInformation.Character.Information.Level);
                //Write static byte
                Writer.Byte(0xAA);
                //Write x and y sector
                Writer.Byte(CharacterInformation.Character.Position.xSec);
                Writer.Byte(CharacterInformation.Character.Position.ySec);
                //Write x z y
                Writer.Word(Formule.packetx(CharacterInformation.Character.Position.x, CharacterInformation.Character.Position.xSec));
                Writer.Word(CharacterInformation.Character.Position.z);
                Writer.Word(Formule.packety(CharacterInformation.Character.Position.y, CharacterInformation.Character.Position.ySec));
                //Write double word 1
                Writer.Word(1);
                Writer.Word(1);
                //If character is in a guild
                if (CharacterInformation.Character.Network.Guild.Name != null)
                {
                    //Write guild name
                    Writer.Text(CharacterInformation.Character.Network.Guild.Name);
                }
                //If character has no guild
                else
                {
                    //Write 0 word value
                    Writer.Word(0);
                }
                //Static byte
                Writer.Byte(0);
                //Permissions
                Writer.DWord(0);
                Writer.DWord(0);
                //Return all bytes for sending
                return(Writer.GetBytes());

            case 3:
                //Write character id
                Writer.DWord(id);
                //Write static byte 4
                Writer.Byte(4);
                //Return all bytes for sending
                return(Writer.GetBytes());

            case 6:
                //Update player location and stat
                CharacterInformation = Systems.GetPlayer(id);
                //Calculate hp and mp
                int partyPercentMP = (int)Math.Round((decimal)(CharacterInformation.Character.Stat.SecondMP * 10) / CharacterInformation.Character.Stat.Mp) << 4;
                int partyPercentHP = (int)Math.Round((decimal)(CharacterInformation.Character.Stat.SecondHp * 10) / CharacterInformation.Character.Stat.Hp);
                //Set percent information
                int partyPercent = partyPercentHP | partyPercentMP;
                //Write character id
                Writer.DWord(id);
                //If character is moving
                if (CharacterInformation.Character.Position.Walking)
                {
                    //Write byte 20
                    Writer.Byte(0x20);
                    //Write location information
                    Writer.Byte(CharacterInformation.Character.Position.packetxSec);
                    Writer.Byte(CharacterInformation.Character.Position.packetySec);
                    Writer.Word(CharacterInformation.Character.Position.packetX);
                    Writer.Word(CharacterInformation.Character.Position.packetZ);
                    Writer.Word(CharacterInformation.Character.Position.packetY);
                    //Write double word 1
                    Writer.Word(1);
                    Writer.Word(1);
                }
                //If not walking
                else
                {
                    //Write static byte 4
                    Writer.Byte(4);
                    //Write hp mp information
                    Writer.Byte((byte)partyPercent);
                }
                //Return all bytes for sending
                return(Writer.GetBytes());

            case 9:
                //New leader id
                Writer.DWord(id);
                //Return all bytes for sending
                return(Writer.GetBytes());
            }
            //Return all bytes for sending
            return(Writer.GetBytes());
        }
Ejemplo n.º 9
0
        void ActionNormalAttack()
        {
            try
            {
                float x = 0, y = 0;

                bool[] aRound = null;

                if (Character.Action.Object != null)
                {
                    //Set target object as object
                    obj TargetInformation = Character.Action.Object as obj;
                    //If our target object is a monster
                    #region Attacking a monster
                    if (Data.ObjectBase[TargetInformation.ID].Object_type == Global.objectdata.NamdedType.MONSTER)
                    {
                        //If state is dead
                        if (TargetInformation.State == 4)
                        {
                            //Set normal attack bool to false
                            Character.Action.nAttack = false;
                            //Stop attack timer
                            StopAttackTimer();
                        }

                        if (TargetInformation.Agro == null)
                        {
                            TargetInformation.Agro = new List <_agro>();
                        }
                        x = (float)TargetInformation.x;
                        y = (float)TargetInformation.y;

                        if (!TargetInformation.Attacking)
                        {
                            TargetInformation.AddAgroDmg(Character.Information.UniqueID, 1);
                        }
                        if (TargetInformation.Die || TargetInformation.GetDie)
                        {
                            StopAttackTimer();
                            return;
                        }
                    }
                    #endregion
                    //If attacking a player
                    #region Attacking a player
                    if (Data.ObjectBase[TargetInformation.ID].Object_type == Global.objectdata.NamdedType.PLAYER)
                    {
                        if (!Character.Information.PvP)
                        {
                            Character.Action.nAttack = false;
                            StopAttackTimer();
                            return;
                        }

                        Systems sys = Character.Action.Object as Systems;
                        if (sys.Character.State.LastState == 4)
                        {
                            StopAttackTimer();
                            return;
                        }

                        if (!(Character.Information.PvP && sys.Character.Information.PvP))
                        {
                            StopAttackTimer();
                            return;
                        }
                        if (!Character.InGame)
                        {
                            StopAttackTimer();
                            return;
                        }
                        x      = sys.Character.Position.x;
                        y      = sys.Character.Position.y;
                        aRound = sys.Character.aRound;
                    }
                    #endregion

                    double distance = Formule.gamedistance(Character.Position.x,
                                                           Character.Position.y,
                                                           x,
                                                           y);

                    if (Character.Information.Item.wID == 0)
                    {
                        distance -= 0.5;
                    }
                    else
                    {
                        distance -= Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                    }

                    if (distance > 0)
                    {
                        float farkx = x;
                        float farky = y;

                        if (Character.Information.Item.wID == 0)
                        {
                            Character.Position.wX = farkx - Character.Position.x - 0;
                            Character.Position.wY = farky - Character.Position.y - 0;
                            Character.Position.kX = Character.Position.wX;
                            Character.Position.kY = Character.Position.wY;
                        }
                        else
                        {
                            Character.Position.wX = farkx - Character.Position.x - (float)Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                            Character.Position.wY = farky - Character.Position.y - (float)Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                            Character.Position.kX = Character.Position.wX;
                            Character.Position.kY = Character.Position.wY;
                        }

                        Send(Packet.Movement(new DarkEmu_GameServer.Global.vektor(Character.Information.UniqueID,
                                                                                  (float)Formule.packetx((float)farkx, Character.Position.xSec),
                                                                                  (float)Character.Position.z,
                                                                                  (float)Formule.packety((float)farky, Character.Position.ySec),
                                                                                  Character.Position.xSec,
                                                                                  Character.Position.ySec)));

                        Character.Position.Time         = (distance / (Character.Speed.RunSpeed * 0.0768)) * 1000.0;
                        Character.Position.RecordedTime = Character.Position.Time;

                        Character.Position.packetxSec = Character.Position.xSec;
                        Character.Position.packetySec = Character.Position.ySec;

                        Character.Position.packetX = (ushort)Formule.packetx((float)farkx, Character.Position.xSec);
                        Character.Position.packetY = (ushort)Formule.packety((float)farky, Character.Position.ySec);

                        Character.Position.Walking = true;

                        StartMovementTimer((int)(Character.Position.Time * 0.1));

                        return;
                    }
                }
                ActionAttack();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Normal Attack Error : {0}", ex);
                Systems.Debugger.Write(ex);
            }
        }
Ejemplo n.º 10
0
        public static float GetHeightAt(byte xSec, byte ySec, float x, float y)
        {
            short region = Formule.makeRegion(xSec, ySec);

            return(Data.MapObject[region].GetHeightAt(packetx(x, xSec) / 20.0f, packety(y, ySec) / 20.0f));
        }
Ejemplo n.º 11
0
        /////////////////////////////////////////////////////////////////////////////////
        // Pet movement
        /////////////////////////////////////////////////////////////////////////////////
        void MovementPet()
        {
            try
            {
                //Open our packet reader
                PacketReader Reader = new PacketReader(PacketInformation.buffer);
                //This one happens to all pets.
                int petid = Reader.Int32();
                //We switch on type (2 = attack pet, 1 = horse).
                byte type = Reader.Byte();

                switch (type)
                {
                //Horse pet movement
                case 1:
                    byte movetype = Reader.Byte();

                    //Normal movement type
                    if (movetype == 1)
                    {
                        //Read xsector information
                        byte xsec = Reader.Byte();
                        //Read ysector information
                        byte ysec = Reader.Byte();
                        //Read x
                        float x = Reader.Int16();
                        //Read z
                        float z = Reader.Int16();
                        //Read y
                        float y = Reader.Int16();
                        Reader.Close();
                        //Make sure attack timer is gone
                        StopAttackTimer();
                        //Set pickup to false
                        Character.Action.PickUping = false;
                        //Set movement active
                        Character.Position.Walking = true;
                        //Calculate distance
                        double distance = Formule.gamedistance(Character.Position.x,
                                                               Character.Position.y,
                                                               Formule.gamex(x, xsec),
                                                               Formule.gamey(y, ysec));
                        //Set character position
                        Character.Position.xSec = xsec;
                        Character.Position.ySec = ysec;
                        Character.Position.wX   = Formule.gamex(x, xsec) - Character.Position.x;
                        Character.Position.wZ   = z;
                        Character.Position.wY   = Formule.gamey(y, ysec) - Character.Position.y;

                        Character.Position.packetxSec = xsec;
                        Character.Position.packetySec = ysec;
                        Character.Position.packetX    = (ushort)x;
                        Character.Position.packetZ    = (ushort)z;
                        Character.Position.packetY    = (ushort)y;

                        Send(Packet.Movement(new Global.vektor(petid, x, z, y, xsec, ysec)));
                        Character.Position.Time         = (distance / (95.0 * 0.0768)) * 1000.0;
                        Character.Position.RecordedTime = Character.Position.Time;

                        StartMovementTimer((int)(Character.Position.Time * 0.1));
                    }
                    break;

                //Attack pet movement
                case 2:
                    //Set pet info
                    Character.Attackpet.Details.x    = Character.Position.x;
                    Character.Attackpet.Details.y    = Character.Position.y;
                    Character.Attackpet.Details.z    = Character.Position.z;
                    Character.Attackpet.Details.xSec = Character.Position.xSec;
                    Character.Attackpet.Details.ySec = Character.Position.ySec;
                    //Target id information
                    int targetid = Reader.Int32();
                    Reader.Close();
                    //Set pet speed information
                    Send(Packet.SetSpeed(petid, 50, 100));    //Need to make correct speed info later
                    //Check distances / target detailed.

                    //Send attack packet (new void pet attack to be created).
                    break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("movement pet error {0}", ex);
                Systems.Debugger.Write(ex);
            }
        }
Ejemplo n.º 12
0
        /////////////////////////////////////////////////////////////////////////////////
        // Movement
        /////////////////////////////////////////////////////////////////////////////////
        public void Movement()
        {
            try
            {
                PacketReader Reader = new PacketReader(PacketInformation.buffer);
                Character.Action.PickUping = false;
                byte Type = Reader.Byte();

                ////////////////////////////////////////////////////////////////////////////// Sky drome movement
                if (Type == 0)
                {
                    if (!Character.Stall.Stallactive && !Character.Action.PickUping && !Character.State.Die && !Character.Action.sCasting && !Character.Action.sAttack && !Character.Action.nAttack && !Character.Information.Scroll && !Character.State.Sitting && !Character.Information.SkyDroming)
                    {
                        /*
                         * if (File.FileLoad.CheckCave(Character.Position.xSec, Character.Position.ySec))
                         * {
                         *  return;
                         * }
                         * else
                         * {
                         *
                         *  Character.Information.SkyDroming = true;
                         *  byte info = Reader.Byte();
                         *  ushort angle = Reader.UInt16();
                         *
                         *  Character.Information.Angle = angle / (65535.0 / 360.0);
                         *
                         *  Character.Position.packetxSec = Character.Position.xSec;
                         *  Character.Position.packetySec = Character.Position.ySec;
                         *  Character.Position.packetX = (ushort)Game.Formule.packetx(Character.Position.x, Character.Position.xSec);
                         *  Character.Position.packetY = (ushort)Game.Formule.packetx(Character.Position.x, Character.Position.xSec);
                         *
                         *  double distance = Formule.gamedistance(
                         *      Character.Position.x,
                         *      Character.Position.y,
                         *      Formule.gamex(Character.Position.x, Character.Position.xSec),
                         *      Formule.gamey(Character.Position.y, Character.Position.ySec));
                         *
                         *  Character.Position.Time = (distance / (Character.Speed.RunSpeed * 0.0768)) * 1000.0;
                         *  Character.Position.RecordedTime = Character.Position.Time;
                         *
                         *
                         *  PacketWriter Writer = new PacketWriter();
                         *  Writer.Create(Systems.SERVER_MOVEMENT);
                         *  Writer.DWord(Character.Information.UniqueID);
                         *  Writer.Byte(0);
                         *  Writer.Byte(info);
                         *  Writer.Word(angle);
                         *  Writer.Byte(1);
                         *  Writer.Byte(Character.Position.xSec);
                         *  Writer.Byte(Character.Position.ySec);
                         *  Writer.Word(Character.Position.packetX);
                         *  Writer.DWord(Character.Position.z);
                         *  Writer.Word(Character.Position.packetY);
                         *  Send(Writer.GetBytes());
                         *
                         *  StartSkyDromeTimer(1000);
                         * }*/
                    }
                }

                //------------------------- Normal movement -------------------------//
                if (Type == 1)
                {
                    //If character is in a guild
                    if (Character.Network.Guild.Guildid != 0)
                    {
                        //Repeat for each client in the guild
                        foreach (Client memberclient in Character.Network.Guild.MembersClient)
                        {
                            //Make sure the client is not null
                            if (memberclient != null)
                            {
                                //Send update packet for location of player
                                memberclient.Send(Packet.GuildUpdate(Character, 10, Character.Information.UniqueID, 0, 0));
                            }
                        }
                    }

                    if (Character.Stall.Stallactive)
                    {
                        return;
                    }
                    if (Character.Action.PickUping)
                    {
                        return;
                    }
                    StopPickUpTimer();
                    if (Character.State.Die)
                    {
                        return;
                    }
                    if (Character.Information.Scroll)
                    {
                        return;
                    }
                    if (Character.State.Sitting)
                    {
                        return;
                    }
                    if (Character.Information.SkyDroming)
                    {
                        StopSkyDromeTimer();
                    }
                    if (Character.Action.nAttack)
                    {
                        StopAttackTimer();
                        Character.Action.nAttack = false;
                    }
                    if (Character.Action.sAttack)
                    {
                        StopAttackTimer();
                        Character.Action.sAttack = false;
                    }
                    if (Character.Action.sCasting)
                    {
                        StopAttackTimer();
                        Character.Action.sCasting = false;
                    }
                    if (Character.Information.PvpWait)
                    {
                        Send(Packet.PvpInterupt(Character.Information.UniqueID));
                        Character.Information.PvpWait = false;
                        Character.Information.Pvptype = 0;
                        StopPvpTimer();
                    }
                    Character.Position.Walking = true;
                    byte  xsec = Reader.Byte();
                    byte  ysec = Reader.Byte();
                    float x, y, z;

                    if (!File.FileLoad.CheckCave(xsec, ysec))
                    {
                        x = Reader.Int16();
                        z = Reader.Int16();
                        y = Reader.Int16();
                        double distance = Formule.gamedistance(
                            Character.Position.x,
                            Character.Position.y,
                            Formule.gamex(x, xsec),
                            Formule.gamey(y, ysec));

                        Character.Position.xSec = xsec;
                        Character.Position.ySec = ysec;
                        Character.Position.wX   = Formule.gamex(x, xsec) - Character.Position.x;
                        Character.Position.wZ   = z;
                        Character.Position.wY   = Formule.gamey(y, ysec) - Character.Position.y;

                        Character.Position.packetxSec = xsec;
                        Character.Position.packetySec = ysec;
                        Character.Position.packetX    = (ushort)x;
                        Character.Position.packetZ    = (ushort)z;
                        Character.Position.packetY    = (ushort)y;

                        if (xsec != 0 && ysec != 0)
                        {
                            Send(Packet.Movement(new Global.vektor(Character.Information.UniqueID, x, z, y, xsec, ysec)));
                        }
                        if (Character.Information.Berserking)
                        {
                            Character.Position.Time = (distance / (Character.Speed.RunSpeed * 0.109)) * 1000.0;
                        }
                        else
                        {
                            Character.Position.Time = (distance / (Character.Speed.RunSpeed * 0.109)) * 1000.0;
                        }
                    }
                    else  // Added for cave telepad locations
                    {
                        x = Formule.cavegamex(Reader.Int16(), Reader.Int16()); //Reads the location and retunrs the coords for the cave postion x
                        z = Formule.cavegamez(Reader.Int16(), Reader.Int16()); //Reads the location and retunrs the coords for the cave postion z
                        y = Formule.cavegamey(Reader.Int16(), Reader.Int16()); //Reads the location and retunrs the coords for the cave postion y

                        double distance = Formule.gamedistance(Character.Position.x, Character.Position.y, Formule.cavegamex(x), Formule.cavegamey(y));

                        Character.Position.xSec = xsec;
                        Character.Position.ySec = ysec;
                        Character.Position.wX   = Formule.cavegamex(x) - Character.Position.x;
                        Character.Position.wZ   = z;
                        Character.Position.wY   = Formule.cavegamey(y) - Character.Position.y;

                        Character.Position.packetxSec = xsec;
                        Character.Position.packetySec = ysec;
                        Character.Position.packetX    = (ushort)x;
                        Character.Position.packetZ    = (ushort)z;
                        Character.Position.packetY    = (ushort)y;

                        if (xsec != 0 && ysec != 0)
                        {
                            Send(Packet.Movement(new Global.vektor(Character.Information.UniqueID, x, z, y, xsec, ysec)));
                        }
                        if (Character.Information.Berserking)
                        {
                            Character.Position.Time = (distance / (Character.Speed.BerserkSpeed * 0.0768)) * 1000.0;
                        }
                        else
                        {
                            Character.Position.Time = (distance / (Character.Speed.RunSpeed * 0.0768)) * 1000.0;
                        }
                    }

                    Reader.Close();

                    if (xsec != 0 && ysec != 0)
                    {
                        Send(Packet.Movement(new Global.vektor(Character.Information.UniqueID, x, z, y, xsec, ysec)));
                    }

                    if (Character.Grabpet.Active)
                    {
                        Send(Packet.Movement(new Global.vektor(Character.Grabpet.Details.UniqueID, x + rnd.Next(10, 25), z, y + rnd.Next(10, 25), xsec, ysec)));
                    }
                    if (Character.Attackpet.Active)
                    {
                        Send(Packet.Movement(new Global.vektor(Character.Attackpet.Details.UniqueID, x + rnd.Next(10, 25), z, y + rnd.Next(10, 25), xsec, ysec)));
                    }

                    Character.Position.RecordedTime = Character.Position.Time;
                    StartMovementTimer((int)(Character.Position.Time * 0.1));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Movement error: {0}", ex);
            }
        }
Ejemplo n.º 13
0
 /////////////////////////////////////////////////////////////////////////////////
 // Pickup item
 /////////////////////////////////////////////////////////////////////////////////
 void Player_PickUpItem()
 {
     try
     {
         //First check if player allready is picking up an item
         if (Character.Action.PickUping)
         {
             //Get item information that the player has selected.
             world_item item = GetWorldItem(Character.Action.Target);
             //Checks
             if (item == null)
             {
                 Character.Action.PickUping = false; return;
             }
             //If the amount is lower then one
             if (item.amount < 1)
             {
                 item.amount = 1;
             }
             //If not gold model
             if (item.Model > 3)
             {
                 //Get our free slots
                 byte slot = GetFreeSlot();
                 //If to low
                 if (slot <= 12)
                 {
                     Character.Action.PickUping = false;
                     client.Send(Packet.MoveItemError());
                     return;
                 }
                 //Else continue stop delete timer because its allready beeing removed.
                 item.StopDeleteTimer();
                 //Remove the world item spawn
                 Systems.WorldItem.Remove(item);
                 //Delete the global id
                 Global.ID.Delete(item.UniqueID);
                 //Move towards the item
                 Send(Packet.MovementOnPickup(new DarkEmu_GameServer.Global.vektor(Character.Information.UniqueID,
                                                                                   (float)Formule.packetx((float)item.x, item.xSec),
                                                                                   (float)Character.Position.z,
                                                                                   (float)Formule.packety((float)(float)item.y, item.ySec),
                                                                                   Character.Position.xSec,
                                                                                   Character.Position.ySec)));
                 //Send animation packet pickup
                 Send(Packet.Pickup_Animation(Character.Information.UniqueID, 0));
                 //Check what item type we have (Etc, or armor / weapon).
                 int amount = 0;
                 //Set amount or plusvalue
                 #region Amount definition
                 if (Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.BLADE ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.CH_SHIELD ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_SHIELD ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.BOW ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_AXE ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_CROSSBOW ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_DAGGER ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_DARKSTAFF ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_HARP ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_STAFF ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_SWORD ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_TSTAFF ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EU_TSWORD ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.GLAVIE ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.SPEAR ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.SWORD ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.EARRING ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.RING ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.NECKLACE ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.ARMOR ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.GARMENT ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.GM ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.HEAVY ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.LIGHT ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.PROTECTOR ||
                     Data.ItemBase[item.Model].Itemtype == Global.item_database.ItemType.AVATAR ||
                     Data.ItemBase[item.Model].Type == Global.item_database.ArmorType.ROBE)
                 {
                     amount = item.PlusValue;
                 }
                 else
                 {
                     amount = item.amount;
                 }
                 #endregion
                 //Send item creation packet
                 client.Send(Packet.GM_MAKEITEM(0, slot, item.Model, (short)amount, (int)Data.ItemBase[item.Model].Defans.Durability, Data.ItemBase[item.Model].ID, item.UniqueID));
                 //Save to database
                 AddItem(item.Model, (short)amount, slot, Character.Information.CharacterID, item.Model);
             }
             //If the item is gold
             else
             {
                 //Remove the spawned item
                 Systems.WorldItem.Remove(item);
                 //Remove global id
                 Global.ID.Delete(item.UniqueID);
                 //Movement packet
                 Send(Packet.MovementOnPickup(new DarkEmu_GameServer.Global.vektor(Character.Information.UniqueID,
                                                                                   (float)Formule.packetx((float)item.x, item.xSec),
                                                                                   (float)Character.Position.z,
                                                                                   (float)Formule.packety((float)(float)item.y, item.ySec),
                                                                                   Character.Position.xSec,
                                                                                   Character.Position.ySec)));
                 //Send animation packet
                 Send(Packet.Pickup_Animation(Character.Information.UniqueID, 0));
                 //Add gold to player information
                 Character.Information.Gold += item.amount;
                 //Send visual packet for gold
                 client.Send(Packet.UpdateGold(Character.Information.Gold));
                 //Send message packet gold gained
                 client.Send(Packet.GoldMessagePick(item.amount));
                 //Save player gold
                 SaveGold();
             }
             //Despawn item for us
             item.DeSpawnMe();
             //Dispose of the item
             item.Dispose();
             //Set picking to false
             Character.Action.PickUping = false;
             if (Timer.Pickup != null)
             {
                 Timer.Pickup.Dispose();
             }
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine("Pickup Error {0}", ex);
         Systems.Debugger.Write(ex);
     }
 }
Ejemplo n.º 14
0
        public static byte[] Load(character c)
        {

            PacketWriter Writer = new PacketWriter();
            Writer.Create(Systems.SERVER_PLAYERDATA);
            /////////////////////////////////////////////////////// Character basic info
            #region Basic info   
            Writer.DWord(c.Ids.GetLoginID);
            Writer.DWord(c.Information.Model);
            Writer.Byte(c.Information.Volume);
            Writer.Byte(c.Information.Level);
            Writer.Byte(c.Information.Level);
            Writer.LWord(c.Information.XP);
            Writer.DWord(c.Information.SpBar);
            Writer.LWord(c.Information.Gold);
            Writer.DWord(c.Information.SkillPoint);
            Writer.Word(c.Information.Attributes);
            Writer.Byte(c.Information.BerserkBar);
            Writer.DWord(0);
            Writer.DWord(c.Stat.SecondHp);
            Writer.DWord(c.Stat.SecondMP);
            Writer.Bool(c.Information.Level < 20 ? true : false);
            #endregion
            /////////////////////////////////////////////////////// Character Player Kill Info
            #region Pk information
            //Mssql perfection reading with multiple data adapters... while this one is open i can still read anything else from the database
            //With no speed reduction...
            Systems.MsSQL checkpk = new Systems.MsSQL("SELECT * FROM character WHERE name ='" + c.Information.Name + "'");
            using (System.Data.SqlClient.SqlDataReader getinfo = checkpk.Read())
            {
                while (getinfo.Read())
                {
                    byte dailypk = getinfo.GetByte(48);
                    byte pklevel = getinfo.GetByte(49);
                    byte murderlevel = getinfo.GetByte(50);

                    Writer.Byte(dailypk);
                    Writer.Word(pklevel);
                    Writer.DWord(murderlevel);
                    if (murderlevel != 0) c.Information.Murderer = true;
                }
            }
            #endregion
            /////////////////////////////////////////////////////// Character Title
            #region Title
            Writer.Byte(c.Information.Title);
            #endregion
            /////////////////////////////////////////////////////// Character Pvpstate
            #region Pvp
            Writer.Byte(c.Information.Pvpstate);
            if (c.Information.Pvpstate > 0) 
                c.Information.PvP = true;
            #endregion
            /////////////////////////////////////////////////////// Character Items
            #region Item
            
            Writer.Byte(c.Information.Slots);

            Systems.MsSQL ms = new Systems.MsSQL("SELECT * FROM char_items WHERE owner='" + c.Information.CharacterID + "' AND slot >= '0' AND slot <= '" + c.Information.Slots + "' AND inavatar='0' AND storagetype='0'");
            Writer.Byte(ms.Count());
            using (System.Data.SqlClient.SqlDataReader msreader = ms.Read())
            {

                while (msreader.Read())
                {

                    short amount = msreader.GetInt16(6);

                    if (amount < 1) amount = 1;
                    Systems.MsSQL.InsertData("UPDATE char_items SET quantity='" + amount + "' WHERE owner='" + c.Information.CharacterID + "' AND itemid='" + msreader.GetInt32(2) + "' AND id='" + msreader.GetInt32(0) + "' AND storagetype='0'");

                    if (msreader.GetByte(5) == 6)
                        c.Information.Item.wID = Convert.ToInt32(msreader.GetInt32(2));
                    if (msreader.GetByte(5) == 7)
                    {
                        c.Information.Item.sID = msreader.GetInt32(2);
                        c.Information.Item.sAmount = msreader.GetInt16(6);
                    }
                    
                    Item.AddItemPacket(Writer, msreader.GetByte(5), msreader.GetInt32(2), msreader.GetByte(4), amount, msreader.GetInt32(7),msreader.GetInt32(0), msreader.GetInt32(9), msreader.GetInt32(30));
                }
            }
            ms.Close();

            //Avatar
            Writer.Byte(5);

            ms = new Systems.MsSQL("SELECT * FROM char_items WHERE owner='" + c.Information.CharacterID + "' AND slot >= '0' AND slot <= '" + c.Information.Slots + "' AND inavatar='1' AND storagetype='0'");

            Writer.Byte(ms.Count());
            using (System.Data.SqlClient.SqlDataReader msreader = ms.Read())
            {
                while (msreader.Read())
                {
                    Item.AddItemPacket(Writer, msreader.GetByte(5), msreader.GetInt32(2), msreader.GetByte(4), msreader.GetInt16(6), msreader.GetInt32(7), msreader.GetInt32(0), msreader.GetInt32(9),msreader.GetInt32(30));
                }
            }
            ms.Close();

            Writer.Byte(0);

            // job mastery 
            Writer.Byte(0x0B);
            Writer.Byte(0);
            Writer.Byte(0);

            #endregion
            ///////////////////////////////////////////////////////  Mastery
            #region Mastery
            if (c.Information.Model <= 12000)
            {
                for (byte i = 1; i <= 8; i++)
                {
                    Writer.Byte(1);
                    Writer.DWord(c.Stat.Skill.Mastery[i]);
                    Writer.Byte(c.Stat.Skill.Mastery_Level[i]);
                }
            }
            else
            {
                if (c.Information.Model >= 14000)
                {
                    for (byte i = 1; i < 8; i++)
                    {
                        Writer.Byte(1);
                        Writer.DWord(c.Stat.Skill.Mastery[i]);
                        Writer.Byte(c.Stat.Skill.Mastery_Level[i]);
                    }
                }
            }
            #endregion
            /////////////////////////////////////////////////////// Skills
            #region Skill
            Writer.Byte(2);
            Writer.Byte(0);
                for (int i = 1; i <= c.Stat.Skill.AmountSkill; i++)
                {
                    Writer.Byte(1);
                    Writer.DWord(c.Stat.Skill.Skill[i]);
                    Writer.Byte(1);
                }
            Writer.Byte(2);
            #endregion
            /////////////////////////////////////////////////////// Quests
            #region Quest
            Writer.Word(1); // how many Quest ids completed/aborted
            Writer.DWord(1);// Quest id
            Writer.Byte(0);//number of Quests that are live
            #endregion
            Writer.Byte(0);//? for now
            /////////////////////////////////////////////////////// Talisman
            #region Talisman
            Writer.DWord(1);//new
            Writer.DWord(1);//new
            Writer.DWord(0);//? for now
            Writer.DWord(0x0C);//new
            #endregion
            /////////////////////////////////////////////////////// Position + id + speed
            #region Character id / Position / Speed
            Writer.DWord(c.Information.UniqueID);
            Writer.Byte(c.Position.xSec);
            Writer.Byte(c.Position.ySec);
            if (!File.FileLoad.CheckCave(c.Position.xSec, c.Position.ySec))
            {
                Writer.Float(Formule.packetx(c.Position.x, c.Position.xSec));
                Writer.Float(c.Position.z);
                Writer.Float(Formule.packety(c.Position.y, c.Position.ySec));
            }
            else
            {
                Writer.Float(Formule.cavepacketx(c.Position.x));// Added for cave Coords
                Writer.Float(c.Position.z);
                Writer.Float(Formule.cavepackety(c.Position.y));// Added for cave Coords

            }
            Writer.Word(0);							// Angle
            Writer.Byte(0);
            Writer.Byte(1);
            Writer.Byte(0);
            Writer.Word(0);							// Angle
            Writer.Word(0);
            Writer.Byte(0);
            Writer.Bool(false); //berserk

            Writer.Byte(0);//new ?

            Writer.Float(c.Speed.WalkSpeed);
            Writer.Float(c.Speed.RunSpeed);
            Writer.Float(c.Speed.BerserkSpeed);
            #endregion
            /////////////////////////////////////////////////////// Premium Tickets
            #region Premium ticket
            Writer.Byte(0); //ITEM_MALL_GOLD_TIME_SERVICE_TICKET_4W
            #endregion
            /////////////////////////////////////////////////////// GM Check + Name
            #region GM Check + Name
            Writer.Text(c.Information.Name);
            #endregion
            /////////////////////////////////////////////////////// Character jobs
            #region Character Job / hunter thief trader ( old job things )
                //Writer info with job name when on job
                /*if (c.Job.state == 1 && c.Job.Jobname != "0")
                {
                    Writer.Text(c.Job.Jobname);
                    Writer.Byte(3);
                    Writer.Byte(1);
                    Writer.DWord(0);
                    Writer.DWord(0);
                    Writer.DWord(0);
                    Writer.Byte(0);
                    Writer.Byte(0);
                    Writer.Byte(0);
                }
                //Write basic info noname
                if (c.Job.Jobname == "0")
                {
                    Writer.Word(0);
                    Writer.Byte(3);
                    Writer.Byte(1);
                    Writer.DWord(0);
                    Writer.DWord(0);
                    Writer.DWord(0);
                    Writer.Byte(0);
                    Writer.Byte(0);
                    Writer.Byte(0);
                }
                //Write no info
                else
                {
                    Writer.Word(0);
                    Writer.Byte(0);
                    Writer.Byte(1);
                    Writer.DWord(0);
                    Writer.DWord(0);
                    Writer.DWord(0);
                    Writer.Byte(0);
                    Writer.Byte(0);
                    Writer.Byte(0);
                }*/
            #endregion
            #region New job system
            if (c.Job.state == 1)
            {
                Writer.Text(c.Job.Jobname);
                Writer.Byte(1);
                Writer.Byte(c.Job.level);//Level job
                Writer.Byte(c.Information.Level);//Level char
                Writer.Byte(1); // job level? myb
                Writer.LWord(0);// job exp probably y
                Writer.Byte(0);
                Writer.Byte(0);
                Writer.Byte(0);
                Writer.Byte(0);
            }
            else
            {

                Writer.Word(0);
                Writer.Byte(0);
                Writer.Byte(0);
                Writer.Byte(2); // job type
                Writer.Byte(1); // job level? myb
                Writer.LWord(0);// job exp probably y
                Writer.Byte(0);
                Writer.Byte(0);
                Writer.Byte(0);
                Writer.Byte(0);
            }

            #endregion
                /////////////////////////////////////////////////////// Pvp / Pk State
            #region Pvp / Pk State
            if (c.Information.Pvpstate == 1 || c.Information.Murderer)
            {
                Writer.Byte(0x22);
            }
            else if (c.Information.Pvpstate == 0 || !c.Information.Murderer)
            {
                Writer.Byte(0xFF);
            }
            #endregion
            /////////////////////////////////////////////////////// Guide Data 
            #region Guide Data this data stacks on itself so if guide id is 0400000000000000 and next guide is 0300000000000000 the data to send is 0700000000000000

            for (int i = 0; i < 8; ++i)//Main Guide Packet Info
            {
                Writer.Byte(c.Guideinfo.G1[i]);//Reads From Int Array
            }
            #endregion
            /////////////////////////////////////////////////////// Account / Gm Check
            #region Account ID + Gm Check
            Writer.DWord(c.Account.ID);
            Writer.Byte(0);//c.Information.GM
            #endregion
            /////////////////////////////////////////////////////// Quickbar + Autopotion
            #region Bar information
            Writer.Byte(7);
            PacketReader reader = new PacketReader(System.IO.File.ReadAllBytes(Environment.CurrentDirectory + @"\player\info\quickbar\" + c.Information.Name + ".dat"));
            PlayerQuickBar(reader, Writer);
            reader = new PacketReader(System.IO.File.ReadAllBytes(Environment.CurrentDirectory + @"\player\info\autopot\" + c.Information.Name + ".dat"));
            PlayerAutoPot(reader, Writer);
            #endregion
            /////////////////////////////////////////////////////// Academy
            #region Academy
            Writer.Byte(0); // number of player in academy
            /* // if we have players there 
             Writer.Byte(1);
             Writer.Text("asd"); 
             */
            Writer.Byte(0);//added byte today for 1.310
            Writer.Byte(0);
            Writer.Word(1); 
            Writer.Word(1);
            Writer.Byte(0);
            Writer.Byte(1);
            #endregion
            return Writer.GetBytes();
        }