Esempio n. 1
0
        /// <summary>
        /// Disconnects the client
        /// </summary>
        /// <param name="disconnecting">if <c>true</c>, the function won't call Socket.Disconnect</param>
        public void Disconnect(bool disconnecting = false)
        {
            lock (this)
            {
                if (!disconnecting)
                {
                    m_SocketContext.Disconnect();
                }

                if (!m_blDisconnected)
                {
                    Globals.GlobalDB.ExecuteCommandAsync("DELETE FROM _ActiveSessions WHERE UserSID = {0}", m_AccountInfo.SID);

                    if (m_PingTimer.IsRunning)
                    {
                        m_PingTimer.Stop();
                    }

                    if (m_Character != null && m_Character.m_isIngame)
                    {
                        lock (m_Character.m_lock)
                        {
                            if (m_Character.m_movementTimer.IsRunning)
                            {
                                m_Character.m_movementTimer.Stop();
                            }
                        }
                        m_Character.Disappear(false);
                        Globals.ShardDB.ExecuteCommandAsync(String.Format("UPDATE _Char SET LatestRegion = {0}, PosX = {1}, PosY = {2}, PosZ = {3} WHERE CharID = {4}", m_Character.m_region, m_Character.m_position.X, m_Character.m_position.Y, m_Character.m_position.Z, m_Character.m_charId));
                    }

                    m_Character = null;
                    m_AccountInfo.Characters = null;
                    m_AccountInfo            = default(AccountInfo);

                    m_blDisconnected = true;
                }
            }
        }
Esempio n. 2
0
        public async Task ProcessIngameRequest(int charid)
        {
            if (m_Character == null)
            {
                m_Character = new GObjChar(this);
            }

            m_Character.m_charId      = charid;
            m_Character.m_accountInfo = m_AccountInfo;
            m_Character.m_uniqueId    = Services.UniqueID.GenerateGObjID();

            using (var reader = await Globals.ShardDB.ExecuteReaderAsync("SELECT * FROM _Char WHERE CharID = {0}", charid))
            {
                while (await reader.ReadAsync())
                {
                    m_Character.m_name = await reader.GetFieldValueAsync <string>((int)_Char.CharName16);

                    m_Character.m_model = await reader.GetFieldValueAsync <int>((int)_Char.RefObjID);

                    m_Character.m_scale = await reader.GetFieldValueAsync <byte>((int)_Char.Scale);

                    m_Character.m_level = await reader.GetFieldValueAsync <byte>((int)_Char.CurLevel);

                    m_Character.m_maxLevel = await reader.GetFieldValueAsync <byte>((int)_Char.MaxLevel);

                    m_Character.m_experience = await reader.GetFieldValueAsync <long>((int)_Char.ExpOffset);

                    m_Character.m_skillPoint = await reader.GetFieldValueAsync <int>((int)_Char.RemainSkillPoint);

                    m_Character.m_skillExperience = await reader.GetFieldValueAsync <int>((int)_Char.SExpOffset);

                    m_Character.m_hwanCount = await reader.GetFieldValueAsync <byte>((int)_Char.RemainHwanCount);

                    m_Character.m_gold = await reader.GetFieldValueAsync <long>((int)_Char.RemainGold);

                    m_Character.m_appointedTeleport = await reader.GetFieldValueAsync <int>((int)_Char.AppointedTeleport);

                    m_Character.m_gameGuideData = await reader.GetFieldValueAsync <int>((int)_Char.GGData);

                    m_Character.m_baseWalkSpeed       = 16f;
                    m_Character.m_baseRunSpeed        = 100f;//75
                    m_Character.m_baseHwanSpeed       = 100f;
                    m_Character.m_currentHealthPoints = await reader.GetFieldValueAsync <int>((int)_Char.CurHP);

                    m_Character.m_currentManaPoints = await reader.GetFieldValueAsync <int>((int)_Char.CurMP);

                    m_Character.m_baseStrenght = await reader.GetFieldValueAsync <short>((int)_Char.Strength);

                    m_Character.m_baseIntellect = await reader.GetFieldValueAsync <short>((int)_Char.Intellect);

                    m_Character.m_attributePoints = await reader.GetFieldValueAsync <short>((int)_Char.RemainStatPoint);

                    m_Character.m_baseMaxHealth            = Formula.BaseMaxHealthManaByStats(m_Character.m_level, m_Character.m_baseStrenght);
                    m_Character.m_baseMaxMana              = Formula.BaseMaxHealthManaByStats(m_Character.m_level, m_Character.m_baseIntellect);
                    m_Character.m_basePhyDef               = 6 + Formula.BaseDefByStats(m_Character.m_baseStrenght);
                    m_Character.m_basePhyDef               = 3 + Formula.BaseDefByStats(m_Character.m_baseIntellect);
                    m_Character.m_baseParryRate            = 11;
                    m_Character.m_baseHitRate              = 11;
                    m_Character.m_baseMinPhyAtk            = 6 + Formula.BaseMinAtkByStats(m_Character.m_baseStrenght);
                    m_Character.m_baseMaxPhyAtk            = 9 + Formula.BaseMaxAtkByStats(m_Character.m_baseStrenght);
                    m_Character.m_baseMinMagAtk            = 6 + Formula.BaseMinAtkByStats(m_Character.m_baseIntellect);
                    m_Character.m_baseMaxMagAtk            = 10 + Formula.BaseMinAtkByStats(m_Character.m_baseIntellect);
                    m_Character.m_phyBalancePercent        = Formula.PhyBalance(m_Character.m_level, m_Character.m_baseStrenght);
                    m_Character.m_magBalancePercent        = Formula.MagBalance(m_Character.m_level, m_Character.m_baseIntellect);
                    m_Character.m_phyAbsorbPercent         = 0;
                    m_Character.m_magAbsorbPercent         = 0;
                    m_Character.m_bonusStrenght            = 0;
                    m_Character.m_bonusIntellect           = 0;
                    m_Character.m_bonusPhyDefPercent       = 0;
                    m_Character.m_bonusMagDefPercent       = 0;
                    m_Character.m_bonusPhyAtkPercent       = 0;
                    m_Character.m_bonusMagAtkPercent       = 0;
                    m_Character.m_bonusParryPercent        = 0;
                    m_Character.m_bonusHitPercent          = 0;
                    m_Character.m_bonusMaxHealthPercent    = 0;
                    m_Character.m_bonusMaxManaPercent      = 0;
                    m_Character.m_bonusBlockRatioPercent   = 0;
                    m_Character.m_bonusCritialRatioPercent = 0;
                    m_Character.m_bonusPhyDef              = 0;
                    m_Character.m_bonusMagDef              = 0;
                    m_Character.m_bonusMinPhyAtk           = 0;
                    m_Character.m_bonusMinMagAtk           = 0;
                    m_Character.m_bonusMaxPhyAtk           = 0;
                    m_Character.m_bonusMaxMagAtk           = 0;
                    m_Character.m_bonusParryRate           = 0;
                    m_Character.m_bonusHitRate             = 0;
                    m_Character.m_bonusMaxHealth           = 0;
                    m_Character.m_bonusMaxMana             = 0;
                    m_Character.m_bonusBlockRatio          = 0;
                    m_Character.m_bonusCriticalRatio       = 0;
                    m_Character.m_region = await reader.GetFieldValueAsync <short>((int)_Char.LatestRegion);

                    m_Character.m_position.X       = Convert.ToSingle(await reader.GetFieldValueAsync <short>((int)_Char.PosX));
                    m_Character.m_position.Y       = Convert.ToSingle(await reader.GetFieldValueAsync <short>((int)_Char.PosY));
                    m_Character.m_position.Z       = Convert.ToSingle(await reader.GetFieldValueAsync <short>((int)_Char.PosZ));
                    m_Character.m_angle            = Convert.ToSingle(await reader.GetFieldValueAsync <int>((int)_Char.Angle));
                    m_Character.m_triJob.TraderLvl = await reader.GetFieldValueAsync <byte>((int)_Char.TraderLvl);

                    m_Character.m_triJob.ThiefLvl = await reader.GetFieldValueAsync <byte>((int)_Char.ThiefLvl);

                    m_Character.m_triJob.HunterLvl = await reader.GetFieldValueAsync <byte>((int)_Char.HunterLvl);

                    m_Character.m_triJob.TraderExp = await reader.GetFieldValueAsync <int>((int)_Char.TraderExp);

                    m_Character.m_triJob.ThiefExp = await reader.GetFieldValueAsync <int>((int)_Char.ThiefExp);

                    m_Character.m_triJob.HunterExp = await reader.GetFieldValueAsync <int>((int)_Char.HunterExp);

                    m_Character.m_walkState    = WalkState.Running;
                    m_Character.m_lifeState    = LifeState.Alive;
                    m_Character.m_movementType = MovementType.NotMoving;

                    if (m_Character.m_currentHealthPoints > m_Character.MaxHP)
                    {
                        m_Character.m_currentHealthPoints = (int)m_Character.MaxHP;
                    }

                    if (m_Character.m_currentManaPoints > m_Character.MaxMP)
                    {
                        m_Character.m_currentManaPoints = (int)m_Character.MaxMP;
                    }

                    m_Character.UpdatePosition();
                }
            }

            //Mastery
            using (var reader = await Globals.ShardDB.ExecuteReaderAsync("SELECT * FROM _CharSkillMastery WHERE CharID = {0}", charid))
            {
                while (await reader.ReadAsync())
                {
                    _skill_mastery m = new _skill_mastery();
                    m.ID = await reader.GetFieldValueAsync <int>((int)_CharSkillMastery.MasteryID);

                    m.Level = await reader.GetFieldValueAsync <byte>((int)_CharSkillMastery.Level);

                    m_Character.m_masteryTree[m.ID] = m;
                }
            }

            //Skills
            using (var reader = await Globals.ShardDB.ExecuteReaderAsync("SELECT * FROM _CharSkill WHERE CharID = {0} AND Enabled = 1", charid))
            {
                while (await reader.ReadAsync())
                {
                    m_Character.m_skills.Add(await reader.GetFieldValueAsync <int>((int)_CharSkill.SkillID));
                }
            }

            Packet resp = new Packet(SCommon.Opcode.Agent.Response.CHARACTER_SELECT);

            resp.WriteByte(1);
            m_SocketContext.Send(resp);

            Packet start_load = new Packet(SCommon.Opcode.Agent.CHARACTER_LOAD_START);

            m_SocketContext.Send(start_load);

            Packet load = new Packet(SCommon.Opcode.Agent.CHARACTER_LOAD_DATA);

            load.WriteInt32(m_Character.m_model);
            load.WriteAscii(m_Character.m_name);
            load.WriteByte(m_Character.m_scale);
            load.WriteByte(m_Character.m_level);
            load.WriteByte(m_Character.m_maxLevel);
            load.WriteInt64(m_Character.m_experience);
            load.WriteInt32(m_Character.m_skillExperience);
            load.WriteInt64(m_Character.m_gold);
            load.WriteInt32(m_Character.m_skillPoint);
            load.WriteInt16(m_Character.m_attributePoints);
            load.WriteByte(m_Character.m_hwanCount);
            load.WriteInt32(0); //gathered exp point ? wtf is that
            load.WriteInt32(m_Character.m_currentHealthPoints);
            load.WriteInt32(m_Character.m_currentManaPoints);
            load.WriteByte(m_Character.m_begginerIcon ? 1 : 0);
            load.WriteByte(m_Character.m_playerKillInfo.Dailiy);
            load.WriteInt16(m_Character.m_playerKillInfo.Total);
            load.WriteInt32(m_Character.m_playerKillInfo.MurdererLevel * 60); //in minutes
            load.WriteInt16(0);
            load.WriteInt16(m_Character.m_triJob.ArrangeLevel);
            load.WriteInt32(m_Character.m_triJob.ArrangePoint1);
            load.WriteInt32(m_Character.m_triJob.ArrangePoint2);
            load.WriteByte(m_Character.m_triJob.TraderLvl);
            load.WriteInt32(m_Character.m_triJob.TraderExp);
            load.WriteByte(m_Character.m_triJob.ThiefLvl);
            load.WriteInt32(m_Character.m_triJob.ThiefExp);
            load.WriteByte(m_Character.m_triJob.HunterLvl);
            load.WriteInt32(m_Character.m_triJob.HunterExp);

            using (var reader = await Globals.ShardDB.ExecuteReaderAsync("select * from _Items as A inner join _Inventory as B on A.ID64 = B.ItemID and B.CharID = {0} and A.RefItemID <> 0 AND A.ItemSerial > 0", m_Character.m_charId))
            {
                int item_count = 0;
                int skip_bytes = 1;

                m_Character.m_equipItems.Clear();

                load.WriteByte(0); //reserved for item count
                while (await reader.ReadAsync())
                {
                    _item item = new _item();
                    await item.ReadAsync(reader);

                    if (item.Slot < 13)
                    {
                        m_Character.EquipItemEffect(true, item, item.Slot);
                    }

                    skip_bytes += item.Write(load);
                    item_count++;
                }
                if (item_count > 0)
                {
                    load.GoBackAndWrite(skip_bytes, (byte)item_count);
                }
            }

            load.WriteByte(0);

            foreach (var mastery in m_Character.m_masteryTree)
            {
                if (mastery.ID != 0)
                {
                    load.WriteByte(1);
                    load.WriteInt32(mastery.ID);
                    load.WriteByte(mastery.Level);
                }
            }
            load.WriteByte(2); //masteries end

            load.WriteByte(0);

            foreach (int skill in m_Character.m_skills)
            {
                if (skill != 0 && Globals.Ref.Skill[skill].UI_SkillTab != 255)
                {
                    load.WriteByte(1);
                    load.WriteInt32(skill);
                    load.WriteByte(1); //enabled
                }
            }
            load.WriteByte(2); //skills end

            load.WriteByte(0); //completed quest count
            load.WriteByte(0); //active quest count

            load.WriteInt32(m_Character.m_uniqueId);

            load.WriteUInt16(m_Character.m_region);
            load.WriteSingle(m_Character.Position.X);
            load.WriteSingle(m_Character.Position.Y);
            load.WriteSingle(m_Character.Position.Z);
            load.WriteUInt16(m_Character.m_angle);

            load.WriteByte(m_Character.m_hasDestination); //has destination
            load.WriteByte(m_Character.m_walkState);      //walking, running etc..

            if (m_Character.m_hasDestination)
            {
                load.WriteUInt16(m_Character.m_destinationRegion);
                load.WriteUInt16(m_Character.m_destination.X);
                load.WriteUInt16(m_Character.m_destination.Y);
                load.WriteUInt16(m_Character.m_destination.Z);
            }
            else
            {
                load.WriteByte(m_Character.m_hasAngleMovement);
                load.WriteUInt16(m_Character.m_angle);
            }

            load.WriteByte(m_Character.m_lifeState);
            load.WriteByte(m_Character.m_movementType);
            load.WriteByte(m_Character.m_status);


            load.WriteSingle(m_Character.m_baseWalkSpeed);
            load.WriteSingle(m_Character.m_baseRunSpeed);
            load.WriteSingle(m_Character.m_baseHwanSpeed);

            load.WriteByte(0); //reserved for buff count

            byte buff_count = 0;

            for (byte b = 0; b < 10; b++)
            {
                if (!m_Character.m_buffs[b].IsFree)
                {
                    load.WriteInt32(m_Character.m_buffs[b].SkillID);
                    load.WriteInt32(m_Character.m_buffs[b].CastingID);
                    buff_count++;
                }
            }
            load.GoBackAndWrite((buff_count * 8) + 1, buff_count);

            load.WriteByte(m_Character.m_playerKillInfo.Type);

            load.WriteByte(0);

            load.WriteInt32(m_Character.m_gameGuideData);
            load.WriteInt32(m_Character.m_accountInfo.SID);
            load.WriteInt16(0);
            load.WriteByte(m_Character.m_accountInfo.Auth.HasFlag(AuthType.GM));

            m_SocketContext.Send(load);

            Packet resp3 = new Packet(SCommon.Opcode.Agent.CHARACTER_LOAD_END);

            m_SocketContext.Send(resp3);

            Packet resp4 = new Packet(SCommon.Opcode.Agent.CHARACTER_CELESTICAL_POS);

            resp4.WriteUInt32(m_Character.m_uniqueId);
            resp4.WriteUInt16(0);//moon position
            resp4.WriteByte(DateTime.Now.Hour);
            resp4.WriteByte(DateTime.Now.Minute);
            m_SocketContext.Send(resp4);
        }
Esempio n. 3
0
        private static bool Chat(ClientContext Me, Packet pkt)
        {
            if (Me.Character != null)
            {
                if (Me.Character.m_isIngame)
                {
                    byte type = pkt.ReadByte();
                    byte idx  = pkt.ReadByte();

                    if ((type == 3 || type == 7) && !Me.Character.m_accountInfo.Auth.HasFlag(Data.AuthType.GM))
                    {
                        return(false);
                    }

                    Packet resp = new Packet(Opcode.Agent.SEND_MESSAGE);
                    resp.WriteByte(type);

                    string   msg      = String.Empty;
                    GObjChar sendTo   = Me.Character;
                    bool     succeded = true;

                    switch (type)
                    {
                    case 1:     //normal all chat
                    case 3:     //gm all chat
                    {
                        msg = pkt.ReadAscii();

                        resp.WriteInt32(Me.Character.m_uniqueId);
                    }
                    break;

                    case 2:     //pm
                    {
                        string to = pkt.ReadAscii();
                        msg    = pkt.ReadAscii();
                        sendTo = GameWorld.GObjUtils.FindGObjCharByName(to);
                        if (sendTo == null)
                        {
                            succeded = false;
                        }

                        resp.WriteAscii(Me.Character.m_name);
                    }
                    break;

                    case 7:     //notice
                    {
                        msg    = pkt.ReadAscii();
                        sendTo = null;
                    }
                    break;

                    case 4:
                    case 5:
                    case 6:
                    case 9:
                    case 11:
                    {
                        msg = pkt.ReadAscii();

                        resp.WriteAscii(Me.Character.m_name);
                    }
                    break;

                    default:
                        return(false);
                    }

                    //check msg content ?
                    resp.WriteAscii(msg);

                    if (sendTo == null)
                    {
                        if (type == 3)
                        {
                            //send cannot find
                        }
                        else if (type == 7)
                        {
                            GameWorld.GObjUtils.BroadcastPacket(resp);
                        }
                    }
                    else
                    {
                        sendTo.SendPacket(resp);
                    }

                    Packet resp2 = new Packet(Opcode.Agent.Response.CHAT);
                    resp2.WriteByte(succeded);
                    if (succeded)
                    {
                        resp2.WriteByte(type);
                        resp2.WriteByte(idx);
                    }
                    Me.SocketContext.Send(resp2);
                }
                return(true);
            }
            return(false);
        }
Esempio n. 4
0
 protected override void DisappearTimer_Callback(object sender, object state)
 {
     base.DisappearTimer_Callback(sender, state);
     m_owner = null;
 }
Esempio n. 5
0
        public static void WriteGObj(this Packet packet, GObj gobj, bool single = false)
        {
            packet.WriteUInt32(gobj.m_model);

            if (gobj.m_model == -1) //event zones
            {
                packet.WriteUInt16(0);

                packet.WriteInt32(gobj.m_refSkillId);

                packet.WriteInt32(gobj.m_uniqueId);

                packet.WriteUInt16(gobj.m_region);
                packet.WriteSingle(gobj.Position.X);
                packet.WriteSingle(gobj.Position.Y);
                packet.WriteSingle(gobj.Position.Z);
                packet.WriteUInt16(gobj.m_angle);
            }
            else
            {
                if (Data.Globals.Ref.ObjCommon[gobj.m_model].TypeID1 == 1) //bionics
                {
                    if (gobj.IsCharacter)
                    {
                        GObjChar character = (GObjChar)gobj;
                        packet.WriteAscii(character.m_name);
                        packet.WriteByte(character.m_scale);
                        packet.WriteByte(character.m_equipItems.Count);
                        for (int i = 0; i < character.m_equipItems.Count; i++)
                        {
                            packet.WriteByte(character.m_equipItems[i].Slot);
                            packet.WriteInt32(character.m_equipItems[i].RefItemID);
                        }
                    }

                    packet.WriteInt32(gobj.m_uniqueId);

                    packet.WriteUInt16(gobj.m_region);
                    packet.WriteSingle(gobj.Position.X);
                    packet.WriteSingle(gobj.Position.Y);
                    packet.WriteSingle(gobj.Position.Z);
                    packet.WriteUInt16(gobj.m_angle);
                    packet.WriteByte(gobj.m_hasDestination);
                    packet.WriteByte(gobj.m_walkState);
                    if (gobj.m_hasDestination)
                    {
                        packet.WriteUInt16(gobj.m_destinationRegion);
                        packet.WriteUInt16(gobj.m_destination.X);
                        packet.WriteUInt16(gobj.m_destination.Y);
                        packet.WriteUInt16(gobj.m_destination.Z);
                    }
                    else
                    {
                        packet.WriteByte(gobj.m_hasAngleMovement);
                        packet.WriteUInt16(gobj.m_angle);
                    }

                    packet.WriteByte(gobj.m_lifeState);
                    packet.WriteByte(gobj.m_movementType);
                    packet.WriteByte(gobj.m_status);
                    packet.WriteSingle(gobj.m_baseWalkSpeed);
                    packet.WriteSingle(gobj.m_baseRunSpeed);
                    packet.WriteSingle(gobj.m_baseHwanSpeed);
                    packet.WriteByte(0); //reserved for buff count
                    byte buff_count = 0;
                    for (byte b = 0; b < 10; b++)
                    {
                        if (!gobj.m_buffs[b].IsFree)
                        {
                            packet.WriteInt32(gobj.m_buffs[b].SkillID);
                            packet.WriteInt32(gobj.m_buffs[b].CastingID);
                            buff_count++;
                        }
                    }
                    packet.GoBackAndWrite((buff_count * 8) + 1, buff_count);

                    if (gobj.IsCharacter)
                    {
                        GObjChar character = (GObjChar)gobj;
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0); // Stall Flag = 4
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        if (single)
                        {
                            packet.WriteByte(4);
                        }
                    }
                    else if (gobj.IsMonster)
                    {
                        GObjMob mob = (GObjMob)gobj;
                        packet.WriteByte(0); //nametype
                        packet.WriteByte(mob.m_rarity);
                        if (single)
                        {
                            packet.WriteByte(2);
                        }
                    }
                    else if (gobj.IsNPC)
                    {
                        GObjNPC npc = (GObjNPC)gobj;
                        packet.WriteByte(npc.m_talkFlag);
                        packet.WriteByte(0x0B);
                        packet.WriteByte(0x00);
                        packet.WriteByte(0x00);
                        packet.WriteByte(0x80);

                        if (single)
                        {
                            packet.WriteByte(2);
                        }
                    }
                }
                else if (Data.Globals.Ref.ObjCommon[gobj.m_model].TypeID1 == 3) //non bionics
                {
                    if (gobj.IsItem)
                    {
                        GObjItem item = (GObjItem)gobj;
                        if (item.IsGold)
                        {
                            packet.WriteInt32(item.m_data);
                        }

                        if (item.IsQuest || item.IsGoods)
                        {
                            packet.WriteAscii(item.m_owner.m_name);
                        }

                        packet.WriteInt32(gobj.m_uniqueId);

                        packet.WriteUInt16(gobj.m_region);
                        packet.WriteSingle(gobj.Position.X);
                        packet.WriteSingle(gobj.Position.Y);
                        packet.WriteSingle(gobj.Position.Z);
                        packet.WriteUInt16(gobj.m_angle);
                        packet.WriteByte(0);
                        packet.WriteByte(0);
                        packet.WriteByte(5);
                        packet.WriteUInt32(item.m_owner == null ? -1 : item.m_owner.m_accountInfo.SID);
                    }
                }
                else if (Data.Globals.Ref.ObjCommon[gobj.m_model].TypeID1 == 4) //portals
                {
                    packet.WriteInt32(gobj.m_uniqueId);

                    packet.WriteUInt16(gobj.m_region);
                    packet.WriteSingle(gobj.Position.X);
                    packet.WriteSingle(gobj.Position.Y);
                    packet.WriteSingle(gobj.Position.Z);
                    packet.WriteUInt16(gobj.m_angle);
                    if (single)
                    {
                        packet.WriteByte(2);
                    }
                }
            }
        }