AppendWord() public method

public AppendWord ( ushort item ) : void
item ushort
return void
Beispiel #1
0
        public static void CreateSpawnPacket(ref PacketWriter writer, uint monsterid, uint uniqueid, _Position pos, byte monstertype)
        {
            writer.AppendDword(monsterid);
            writer.AppendDword(uniqueid);

            writer.AppendByte(pos.XSector);
            writer.AppendByte(pos.YSector);
            writer.AppendFloat(pos.X);
            writer.AppendFloat(pos.Z);
            writer.AppendFloat(pos.Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendWord(1);
            writer.AppendByte(0);

            writer.AppendFloat(16f);
            writer.AppendFloat(16f);
            writer.AppendFloat(16f);

            writer.AppendByte(0);
            writer.AppendByte(0);

            writer.AppendByte(monstertype);
            writer.AppendByte(1);
        }
Beispiel #2
0
        public static void CreateSpawnPacket(ref PacketWriter writer, uint monsterid, uint uniqueid, _Position pos, byte monstertype)
        {
            writer.AppendDword(monsterid);
            writer.AppendDword(uniqueid);

            writer.AppendByte(pos.XSector);
            writer.AppendByte(pos.YSector);
            writer.AppendFloat(pos.X);
            writer.AppendFloat(pos.Z);
            writer.AppendFloat(pos.Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendWord(1);
            writer.AppendByte(0);

            writer.AppendFloat(16f);
            writer.AppendFloat(16f);
            writer.AppendFloat(16f);

            writer.AppendByte(0);
            writer.AppendByte(0);

            writer.AppendByte(monstertype);
            writer.AppendByte(1);
        }
Beispiel #3
0
        public static byte[] CreateSpawnPacket(uint monsterid, uint uniqueid, _Position pos, byte monstertype)
        {
            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
            writer.AppendDword(monsterid);
            writer.AppendDword(uniqueid);

            writer.AppendByte(pos.XSector);
            writer.AppendByte(pos.YSector);
            writer.AppendFloat(pos.X);
            writer.AppendFloat(pos.Z);
            writer.AppendFloat(pos.Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendWord(1);
            writer.AppendByte(0);

            writer.AppendFloat(16f);
            writer.AppendFloat(16f);
            writer.AppendFloat(16f);

            writer.AppendByte(0);
            writer.AppendByte(0);

            writer.AppendByte(monstertype);
            writer.AppendByte(1);
            return writer.getWorkspace();
        }
Beispiel #4
0
        public static void MonsterMovement(int Index_)
        {
            int X = random.Next(-20, 20);
            int Z = random.Next(-5, 10);
            int Y = random.Next(-20, 20);

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_MOVEMENT);
            writer.AppendDword(Monsters.General[Index_].UniqueID);
            writer.AppendByte(1);
            writer.AppendByte(Monsters.Position[Index_].XSector);
            writer.AppendByte(Monsters.Position[Index_].YSector);
            writer.AppendWord((ushort)(Monsters.Position[Index_].X + X));
            writer.AppendWord((ushort)(Monsters.Position[Index_].Z + Z));
            writer.AppendWord((ushort)(Monsters.Position[Index_].Y + Y));
            writer.AppendByte(0);

            byte[] tmpBuffer = writer.getWorkspace();

            for (int i = 0; i < Player.PlayersOnline; i++)
            {
                if (Player.General[i].CharacterID != 0 && Player.Objects[i].SpawnedMonsterIndex.Contains(Index_))
                {
                    if (Formula.CalculateDistance(Monsters.Position[Index_], Player.Position[i]) <= 800)
                        ServerSocket.Send(tmpBuffer, i);
                }
            }
        }
Beispiel #5
0
        private static void OnChatWhisper(PacketReader reader_, int Index_)
        {
            ushort charlen = reader_.ReadWord();
            string name    = reader.ReadString(false, charlen);

            if (name.ToCharArray(0, 1)[0] == '[')
            {
                name = name.Substring(3);
            }

            ushort msglen = reader_.ReadWord();

            byte[] bmsg = reader_.ReadByteArray(msglen * 2);


            if (DatabaseCore.Character.GetIndexByName(name) != -1)
            {
                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
                writer.AppendByte(2);
                writer.AppendWord((ushort)Player.General[Index_].CharacterName.Length);
                writer.AppendString(false, Player.General[Index_].CharacterName);
                writer.AppendWord((ushort)(msglen / 2));
                writer.AppendByteArray(bmsg, bmsg.Length);
                for (int i = 0; i <= Player.PlayersOnline; i++)
                {
                    if (Player.General[i].CharacterName == name)
                    {
                        ServerSocket.Send(writer.getWorkspace(), i);
                        break;
                    }
                }
            }
        }
Beispiel #6
0
        public static byte[] CreateSpawnPacket(uint monsterid, uint uniqueid, _Position pos, byte monstertype)
        {
            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
            writer.AppendDword(monsterid);
            writer.AppendDword(uniqueid);

            writer.AppendByte(pos.XSector);
            writer.AppendByte(pos.YSector);
            writer.AppendFloat(pos.X);
            writer.AppendFloat(pos.Z);
            writer.AppendFloat(pos.Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendWord(1);
            writer.AppendByte(0);

            writer.AppendFloat(16f);
            writer.AppendFloat(16f);
            writer.AppendFloat(16f);

            writer.AppendByte(0);
            writer.AppendByte(0);

            writer.AppendByte(monstertype);
            writer.AppendByte(1);
            return(writer.getWorkspace());
        }
Beispiel #7
0
        public static void MonsterMovement(int Index_)
        {
            int X = random.Next(-20, 20);
            int Z = random.Next(-5, 10);
            int Y = random.Next(-20, 20);

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_MOVEMENT);
            writer.AppendDword(Monsters.General[Index_].UniqueID);
            writer.AppendByte(1);
            writer.AppendByte(Monsters.Position[Index_].XSector);
            writer.AppendByte(Monsters.Position[Index_].YSector);
            writer.AppendWord((ushort)(Monsters.Position[Index_].X + X));
            writer.AppendWord((ushort)(Monsters.Position[Index_].Z + Z));
            writer.AppendWord((ushort)(Monsters.Position[Index_].Y + Y));
            writer.AppendByte(0);

            byte[] tmpBuffer = writer.getWorkspace();

            for (int i = 0; i < Player.PlayersOnline; i++)
            {
                if (Player.General[i].CharacterID != 0 && Player.Objects[i].SpawnedMonsterIndex.Contains(Index_))
                {
                    if (Formula.CalculateDistance(Monsters.Position[Index_], Player.Position[i]) <= 800)
                    {
                        ServerSocket.Send(tmpBuffer, i);
                    }
                }
            }
        }
Beispiel #8
0
        public static void SendServerInfo(int Index_)
        {
            string name    = "AgentServer";
            ushort namelen = (ushort)name.Length;

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_INFO);
            writer.AppendWord(namelen);
            writer.AppendString(false, name);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);
        }
Beispiel #9
0
        private static void OnChatPublic(PacketReader reader_, int Index_)
        {
            ushort msglen = reader_.ReadWord();

            byte[] bmsg = reader_.ReadByteArray(msglen * 2);

            if (Player.Flags[Index_].GM == 1)
            {
                string msg = Encoding.Unicode.GetString(bmsg);
                if (msg.ToCharArray()[0] == '.' && msg.Contains("level"))
                {
                    string[] tmpString = msg.Split(' ');
                    Stats.GetXP(Index_, Convert.ToUInt64(tmpString[1]), Convert.ToUInt64(tmpString[2]));
                }
            }

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
            writer.AppendByte(1);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendWord(msglen);
            writer.AppendByteArray(bmsg, bmsg.Length);
            ServerSocket.SendPacketInRange(writer.getWorkspace(), Index_);
        }
Beispiel #10
0
        public static void CreateItem(PacketReader reader_, int Index_)
        {
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);

            byte freeslot = FreeSlot(CharacterItemIndex);

            uint itemid   = reader_.ReadDword();
            byte itemplus = reader_.ReadByte();

            Silkroad.Item_ DestinationItem_ = Silkroad.GetItemById(itemid);

            if (DestinationItem_.ITEM_TYPE_NAME.Contains("ITEM_ETC_GOLD_"))
            {
                freeslot = 254;
            }

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
            writer.AppendWord(0x601);
            writer.AppendByte(freeslot);
            if (freeslot != 254)
            {
                writer.AppendDword(itemid);
            }
            if (DestinationItem_.ITEM_TYPE_NAME.Contains("CH") || DestinationItem_.ITEM_TYPE_NAME.Contains("EU"))
            {
                writer.AppendByte(itemplus);
                writer.AppendLword(0);
                writer.AppendDword((uint)DestinationItem_.MIN_DURA);
                writer.AppendByte(0);

                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='{1}',type='0',durability='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", itemid, itemplus, DestinationItem_.MIN_DURA, freeslot, Player.General[Index_].CharacterName);
                AddItemToDatabase(CharacterItemIndex[freeslot], itemid, 0, 0, (byte)DestinationItem_.MIN_DURA, itemplus, 0);
            }
            else if (DestinationItem_.ITEM_TYPE_NAME.Contains("ETC"))
            {
                if (freeslot != 254)
                {
                    writer.AppendWord(itemplus);
                    DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0',type='1',durability='{1}',quantity='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", itemid, DestinationItem_.MIN_DURA, itemplus, freeslot, Player.General[Index_].CharacterName);
                    AddItemToDatabase(CharacterItemIndex[freeslot], itemid, 1, itemplus, (byte)DestinationItem_.MIN_DURA, 0, 0);
                }
            }

            ServerSocket.Send(writer.getWorkspace(), Index_);
        }
Beispiel #11
0
        public static byte[] CreateSpawnPacket(Item._General general, _Position pos)
        {
            PacketWriter writer = new PacketWriter();

            Silkroad.Item_ tmpItem = Silkroad.GetItemById(general.Pk2ID);
            if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                writer.AppendDword(general.Pk2ID);
                writer.AppendByte(general.Plus);
                writer.AppendDword(general.UniqueID);
                writer.AppendByte(pos.XSector);
                writer.AppendByte(pos.YSector);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.Y);
                writer.AppendWord(0xAAA6);
                writer.AppendByte(0);
                writer.AppendByte(0);
                writer.AppendByte(6);
                writer.AppendDword(general.DroppedByUniqueId);
            }
            else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                writer.AppendDword(general.Pk2ID);
                if (general.Pk2ID == 1 || general.Pk2ID == 2 || general.Pk2ID == 3)
                {
                    writer.AppendDword(general.Quantity);
                }
                writer.AppendDword(general.UniqueID);
                writer.AppendByte(pos.XSector);
                writer.AppendByte(pos.YSector);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.Y);
                writer.AppendWord(0xAAA6);
                writer.AppendByte(0);
                writer.AppendByte(0);
                writer.AppendByte(6);
                writer.AppendDword(general.DroppedByUniqueId);
            }
            return(writer.getWorkspace());
        }
Beispiel #12
0
        public static void CreateItem(PacketReader reader_, int Index_)
        {
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);

            byte freeslot = FreeSlot(CharacterItemIndex);

            uint itemid = reader_.ReadDword();
            byte itemplus = reader_.ReadByte();

            Silkroad.Item_ DestinationItem_ = Silkroad.GetItemById(itemid);

            if (DestinationItem_.ITEM_TYPE_NAME.Contains("ITEM_ETC_GOLD_"))
                freeslot = 254;

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
            writer.AppendWord(0x601);
            writer.AppendByte(freeslot);
            if (freeslot != 254)
                writer.AppendDword(itemid);
            if (DestinationItem_.ITEM_TYPE_NAME.Contains("CH") || DestinationItem_.ITEM_TYPE_NAME.Contains("EU"))
            {
                writer.AppendByte(itemplus);
                writer.AppendLword(0);
                writer.AppendDword((uint)DestinationItem_.MIN_DURA);
                writer.AppendByte(0);

                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='{1}',type='0',durability='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", itemid, itemplus, DestinationItem_.MIN_DURA, freeslot, Player.General[Index_].CharacterName);
                AddItemToDatabase(CharacterItemIndex[freeslot], itemid, 0, 0, (byte)DestinationItem_.MIN_DURA, itemplus, 0);

            }
            else if (DestinationItem_.ITEM_TYPE_NAME.Contains("ETC"))
            {
                if (freeslot != 254)
                {
                    writer.AppendWord(itemplus);
                    DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0',type='1',durability='{1}',quantity='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", itemid, DestinationItem_.MIN_DURA, itemplus, freeslot, Player.General[Index_].CharacterName);
                    AddItemToDatabase(CharacterItemIndex[freeslot], itemid, 1, itemplus, (byte)DestinationItem_.MIN_DURA, 0, 0);
                }
            }

            ServerSocket.Send(writer.getWorkspace(), Index_);
        }
Beispiel #13
0
        public static void SendExternNotice(string msg)
        {
            byte[] bmsg = Encoding.Unicode.GetBytes(msg);

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
            writer.AppendByte(7);
            writer.AppendWord((ushort)(bmsg.Length / 2));
            writer.AppendByteArray(bmsg, bmsg.Length);
            ServerSocket.SendToAllIngame(writer.getWorkspace());
        }
Beispiel #14
0
        private static void OnChatNotice(PacketReader reader_)
        {
            ushort msglen = reader_.ReadWord();

            byte[] bmsg = reader_.ReadByteArray(msglen * 2);

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
            writer.AppendByte(7);
            writer.AppendWord(msglen);
            writer.AppendByteArray(bmsg, bmsg.Length);
            ServerSocket.SendToAllIngame(writer.getWorkspace());
        }
Beispiel #15
0
        public static void OnStatPacket(int Index_)
        {
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_STATS);
            writer.AppendDword(Player.Stats[Index_].MinPhy);
            writer.AppendDword(Player.Stats[Index_].MaxPhy);
            writer.AppendDword(Player.Stats[Index_].MinMag);
            writer.AppendDword(Player.Stats[Index_].MaxMag);
            writer.AppendWord(Player.Stats[Index_].PhyDef);
            writer.AppendWord(Player.Stats[Index_].MagDef);
            writer.AppendWord(Player.Stats[Index_].Hit);
            writer.AppendWord(Player.Stats[Index_].Parry);
            writer.AppendDword(Player.Stats[Index_].HP);
            writer.AppendDword(Player.Stats[Index_].MP);
            writer.AppendWord(Player.Stats[Index_].Strength);
            writer.AppendWord(Player.Stats[Index_].Intelligence);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            DatabaseCore.WriteQuery(
                "UPDATE characters SET min_phyatk='{0}', max_phyatk='{1}', min_magatk='{2}', max_magatk='{3}', phydef='{4}', magdef='{5}', hit='{6}', parry='{7}', hp='{8}', mp='{9}', strength='{10}', intelligence='{11}', attribute='{12}' WHERE id='{13}'", Player.Stats[Index_].MinPhy, Player.Stats[Index_].MaxPhy, Player.Stats[Index_].MinMag, Player.Stats[Index_].MaxMag, Player.Stats[Index_].PhyDef, Player.Stats[Index_].MagDef, Player.Stats[Index_].Hit, Player.Stats[Index_].Parry, Player.Stats[Index_].HP, Player.Stats[Index_].MP, Player.Stats[Index_].Strength, Player.Stats[Index_].Intelligence, Player.Stats[Index_].Attributes, Player.General[Index_].CharacterID);
        }
Beispiel #16
0
        public static void EquipCape(int Index_)
        {
            PacketWriter writer = new PacketWriter();

            if (!Player.Flags[Index_].WearingCape)
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_EQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].SourceItemIndex]);
                writer.AppendDword(DatabaseCore.Item.ItemId[Player.Objects[Index_].SourceItemIndex]);
                writer.AppendByte(0);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
                Player.Flags[Index_].WearingCape = true;
            }
            else
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_UNEQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].SourceItemIndex]);
                writer.AppendDword(DatabaseCore.Item.ItemId[Player.Objects[Index_].SourceItemIndex]);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
                Player.Flags[Index_].WearingCape = false;
            }

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
            writer.AppendWord(1);
            writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].SourceItemIndex]);
            writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].DestinationItemIndex]);
            writer.AppendWord(0);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            MoveItemToDatabase(Player.Objects[Index_].SourceItemIndex, Player.Objects[Index_].DestinationItemIndex, Player.General[Index_].CharacterName);
        }
Beispiel #17
0
        private static byte UnEnquipShield(int Index_, int[] CharacterItemIndex, int CharacterShieldIndex)
        {
            Silkroad.Item_ SourceItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterShieldIndex]);

            if (SourceItem.CLASS_C != 2 && SourceItem.CLASS_C != 3)
            {
                if (Player.Stats[Index_].PhyDef < SourceItem.MAX_PHYSDEF)
                {
                    Player.Stats[Index_].PhyDef = 1;
                }
                else if (Player.Stats[Index_].MagDef < SourceItem.MAGDEF_MAX)
                {
                    Player.Stats[Index_].MagDef = 1;
                }
                else
                {
                    Player.Stats[Index_].PhyDef -= (ushort)SourceItem.MAX_PHYSDEF;
                    Player.Stats[Index_].MagDef -= (ushort)SourceItem.MAGDEF_MAX;
                }

                byte freeslot = FreeSlot(CharacterItemIndex);

                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_UNEQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(7);
                writer.AppendDword(DatabaseCore.Item.ItemId[CharacterShieldIndex]);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                writer.AppendByte(1);
                writer.AppendByte(0);
                writer.AppendByte(7);
                writer.AppendByte(freeslot);
                writer.AppendWord(1);
                writer.AppendByte(0);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                return(freeslot);
            }
            return(255);
        }
Beispiel #18
0
        public static void OnTarget(PacketReader reader_, int Index_)
        {
            PacketWriter writer   = new PacketWriter();
            uint         ObjectId = reader_.ReadDword();

            int ObjectIndex = GetObjectIndexAndType(Index_, ObjectId);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_TARGET);
            if (ObjectId == Player.General[Index_].UniqueID)
            {
                writer.AppendWord(0x602);
                ServerSocket.Send(writer.getWorkspace(), Index_);
            }
            else
            {
                writer.AppendByte(1);
                writer.AppendDword(ObjectId);
                switch (Player.Objects[Index_].SelectedObjectType)
                {
                case 1:
                    writer.AppendDword(0x10);
                    writer.AppendByte(4);
                    break;

                case 2:
                    writer.AppendByte(1);
                    writer.AppendDword((uint)Monsters.General[ObjectIndex].HP);
                    if (Player.Flags[ObjectIndex].Dead)
                    {
                        writer.AppendByte(4);
                    }
                    else
                    {
                        writer.AppendDword(1);
                    }
                    break;
                }

                ServerSocket.Send(writer.getWorkspace(), Index_);
            }

            Player.Objects[Index_].SelectedObjectId = ObjectId;
        }
Beispiel #19
0
        public static void OnUnique(uint monsterid, bool kill, string name)
        {
            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_UNIQUE);
            if (kill)
            {
                writer.AppendByte(6);
                writer.AppendDword(monsterid);
                writer.AppendWord((ushort)name.Length);
                writer.AppendString(false, name);
            }
            else
            {
                writer.AppendByte(5);
                writer.AppendDword(monsterid);
            }

            int ObjectIndex = Players.GetObjectIndex(monsterid);
            ServerSocket.SendPacketIfMonsterIsSpawned(writer.getWorkspace(), ObjectIndex);
        }
Beispiel #20
0
        public static void BeginSkill(int Index_)
        {
            Player.Objects[Index_].UsingSkill = true;

            Silkroad.Skill_ tmpSkill = Silkroad.GetSkillById(Player.Objects[Index_].AttackingSkillID);

            Player.Stats[Index_].CMP -= tmpSkill.RequiredMp;
            Stats.MPUpdate(Index_, true);

            Player.Objects[Index_].AttackingCastingID = (uint)random.Next(500, 50000);

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
            writer.AppendByte(1);
            writer.AppendByte(1);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
            writer.AppendWord(0x201);
            writer.AppendDword(Player.Objects[Index_].AttackingSkillID);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendDword(Player.Objects[Index_].AttackingCastingID);
            writer.AppendDword(Player.Objects[Index_].AttackingObjectId);
            writer.AppendByte(0);

            ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

            if (tmpSkill.CastTime <= 0)
            {
                EndSkill(Index_);
            }

            else
            {
                Timers.CastAttackTimer[Index_].Interval = tmpSkill.CastTime * 1000;
                Timers.CastAttackTimer[Index_].Start();
            }
        }
Beispiel #21
0
        public static void OnUnique(uint monsterid, bool kill, string name)
        {
            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_UNIQUE);
            if (kill)
            {
                writer.AppendByte(6);
                writer.AppendDword(monsterid);
                writer.AppendWord((ushort)name.Length);
                writer.AppendString(false, name);
            }
            else
            {
                writer.AppendByte(5);
                writer.AppendDword(monsterid);
            }

            int ObjectIndex = Players.GetObjectIndex(monsterid);

            ServerSocket.SendPacketIfMonsterIsSpawned(writer.getWorkspace(), ObjectIndex);
        }
Beispiel #22
0
        public static void BeginSkill(int Index_)
        {
            Player.Objects[Index_].UsingSkill = true;

            Silkroad.Skill_ tmpSkill = Silkroad.GetSkillById(Player.Objects[Index_].AttackingSkillID);

            Player.Stats[Index_].CMP -= tmpSkill.RequiredMp;
            Stats.MPUpdate(Index_, true);

            Player.Objects[Index_].AttackingCastingID = (uint)random.Next(500, 50000);

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
            writer.AppendByte(1);
            writer.AppendByte(1);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
            writer.AppendWord(0x201);
            writer.AppendDword(Player.Objects[Index_].AttackingSkillID);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendDword(Player.Objects[Index_].AttackingCastingID);
            writer.AppendDword(Player.Objects[Index_].AttackingObjectId);
            writer.AppendByte(0);

            ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

            if (tmpSkill.CastTime <= 0)
                EndSkill(Index_);

            else
            {
                Timers.CastAttackTimer[Index_].Interval = tmpSkill.CastTime * 1000;
                Timers.CastAttackTimer[Index_].Start();
            }
        }
Beispiel #23
0
        private static byte UnEnquipWeapon(int Index_, int[] CharacterItemIndex, int CharacterItemSourceIndex)
        {
            Silkroad.Item_ SourceItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemSourceIndex]);

            if (DatabaseCore.Item.ItemId[CharacterItemSourceIndex] != 0 && SourceItem.CLASS_C != 2 && SourceItem.CLASS_C != 3)
            {
                Player.Stats[Index_].MinPhy      -= (ushort)SourceItem.MIN_LPHYATK;
                Player.Stats[Index_].MaxPhy      -= (ushort)SourceItem.MIN_HPHYATK;
                Player.Stats[Index_].MinMag      -= (ushort)SourceItem.MIN_LMAGATK;
                Player.Stats[Index_].MaxMag      -= (ushort)SourceItem.MIN_HMAGATK;
                Player.General[Index_].WeaponType = 0;

                byte freeslot = FreeSlot(CharacterItemIndex);

                PacketWriter writer = new PacketWriter();

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_UNEQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(6);
                writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemSourceIndex]);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                writer.AppendByte(1);
                writer.AppendByte(0);
                writer.AppendByte(6);
                writer.AppendByte(freeslot);
                writer.AppendWord(1);
                writer.AppendByte(0);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                return(freeslot);
            }
            return(255);
        }
Beispiel #24
0
        public static void SendCharacterList(int Index_)
        {
            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHARACTER);
            writer.AppendWord(0x0102);

            int UserIndex = DatabaseCore.User.GetIndexByName(Player.General[Index_].User);

            writer.AppendByte(DatabaseCore.User.CharacterCount[UserIndex]);

            for (int i = 0; i < DatabaseCore.User.CharacterCount[UserIndex]; i++)
            {
                int tmpCharacterIndex = DatabaseCore.Character.GetIndexByName(DatabaseCore.User.Characters[UserIndex].CharacterName[i]);
                int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(DatabaseCore.User.Characters[UserIndex].CharacterName[i]);

                writer.AppendDword(DatabaseCore.Character.Model[tmpCharacterIndex]);
                writer.AppendWord((ushort)DatabaseCore.Character.CharacterName[tmpCharacterIndex].Length);
                writer.AppendString(false, DatabaseCore.Character.CharacterName[tmpCharacterIndex]);
                writer.AppendByte(DatabaseCore.Character.Volume[tmpCharacterIndex]);
                writer.AppendByte(DatabaseCore.Character.Level[tmpCharacterIndex]);
                writer.AppendLword(DatabaseCore.Character.Experience[tmpCharacterIndex]);
                writer.AppendWord(DatabaseCore.Character.Strength[tmpCharacterIndex]);
                writer.AppendWord(DatabaseCore.Character.Intelligence[tmpCharacterIndex]);
                writer.AppendWord(DatabaseCore.Character.Attributes[tmpCharacterIndex]);
                writer.AppendInt(DatabaseCore.Character.CHP[tmpCharacterIndex]);
                writer.AppendInt(DatabaseCore.Character.CMP[tmpCharacterIndex]);
                //writer.AppendDword(0x00);
                writer.AppendByte(0x00);
                writer.AppendByte(0x00);
                writer.AppendByte(0x00);
                writer.AppendByte(0x01);

                byte PlayerItemCount = 0;
                for (byte j = 0; j < 10; j++)
                {
                    if (DatabaseCore.Item.ItemId[CharacterItemIndex[j]] != 0)
                        PlayerItemCount++;
                }
                writer.AppendByte(PlayerItemCount);

                for (int j = 0; j < 10; j++)
                {
                    if (DatabaseCore.Item.ItemId[CharacterItemIndex[j]] != 0)
                    {
                        writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[j]]);
                        writer.AppendByte(DatabaseCore.Item.PlusValue[CharacterItemIndex[j]]);
                    }
                }

                writer.AppendByte(0x00);
                writer.AppendByte(0x00);
            }

            ServerSocket.Send(writer.getWorkspace(), Index_);
        }
Beispiel #25
0
        public static byte[] CreateSpawnPacket(Player._General general, Player._Flags flags, _Position position, Player._Stats stats, Player._Speeds speeds)
        {
            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
            writer.AppendDword(stats.Model);
            writer.AppendByte(stats.Volume);
            if (flags.GM == 1)
                writer.AppendByte(1);

            else
                writer.AppendByte((byte)(stats.Level < 20 ? 1 : 0));

            writer.AppendByte(1);
            writer.AppendByte(general.MaxSlots);

            int tmpCharacterIndex = DatabaseCore.Character.GetIndexByName(general.CharacterName);
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(general.CharacterName);

            byte PlayerItemCount = 0;
            for (byte j = 0; j < 10; j++)
            {
                if (DatabaseCore.Item.ItemId[CharacterItemIndex[j]] != 0)
                    PlayerItemCount++;
            }
            writer.AppendByte(PlayerItemCount);

            for (int j = 0; j < 10; j++)
            {
                if (DatabaseCore.Item.ItemId[CharacterItemIndex[j]] != 0)
                {
                    writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[j]]);
                    writer.AppendByte(DatabaseCore.Item.PlusValue[CharacterItemIndex[j]]);
                }
            }

            writer.AppendByte(4);
            writer.AppendByte(0);
            writer.AppendByte(0);
            writer.AppendDword((uint)general.UniqueID);

            writer.AppendByte(position.XSector);
            writer.AppendByte(position.YSector);
            writer.AppendFloat(position.X);
            writer.AppendFloat(position.Z);
            writer.AppendFloat(position.Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);

            writer.AppendWord(1);

            writer.AppendByte(flags.Berserk);
            writer.AppendFloat(speeds.WalkSpeed);
            writer.AppendFloat(speeds.RunSpeed);
            writer.AppendFloat(speeds.BerserkSpeed);

            writer.AppendByte(0);

            if (flags.GM == 1)
            {
                string gmname = string.Format("[GM]{0}", general.CharacterName);
                writer.AppendWord((ushort)gmname.Length);
                writer.AppendString(false, gmname);
            }
            else
            {
                writer.AppendWord((ushort)general.CharacterName.Length);
                writer.AppendString(false, general.CharacterName);
            }

            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendDword(0);
            writer.AppendDword(0);
            writer.AppendDword(0);
            writer.AppendDword(0);
            writer.AppendDword(0);
            writer.AppendDword(0);
            writer.AppendDword(0);
            writer.AppendByte(1);
            writer.AppendByte((byte)flags.PvP);
            return writer.getWorkspace();
        }
Beispiel #26
0
        private static void OnChatPublic(PacketReader reader_, int Index_)
        {
            ushort msglen = reader_.ReadWord();
            byte[] bmsg = reader_.ReadByteArray(msglen * 2);

            if (Player.Flags[Index_].GM == 1)
            {
                string msg = Encoding.Unicode.GetString(bmsg);
                if (msg.ToCharArray()[0] == '.' && msg.Contains("level"))
                {
                    string[] tmpString = msg.Split(' ');
                    Stats.GetXP(Index_, Convert.ToUInt64(tmpString[1]), Convert.ToUInt64(tmpString[2]));
                }
            }

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
            writer.AppendByte(1);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendWord(msglen);
            writer.AppendByteArray(bmsg, bmsg.Length);
            ServerSocket.SendPacketInRange(writer.getWorkspace(), Index_);
        }
Beispiel #27
0
        public static void OnUseItem(PacketReader reader, int Index_)
        {
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);
            byte slot = reader.ReadByte();
            Silkroad.Item_ item = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[slot]]);

            if (DatabaseCore.Item.ItemId[CharacterItemIndex[slot]] >= 4 && DatabaseCore.Item.ItemId[CharacterItemIndex[slot]] <= 23)
            {
                if ((DatabaseCore.Item.Quantity[CharacterItemIndex[slot]] - 1) > 0)
                    DatabaseCore.Item.Quantity[CharacterItemIndex[slot]]--;
                else
                {
                    DeleteFromDatabase(CharacterItemIndex[slot]);
                    DatabaseCore.WriteQuery("DELETE FROM items WHERE itemnumber='item{0}' AND owner='{1}'", slot, Player.General[Index_].CharacterName);
                }

                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_USE);
                writer.AppendByte(1);
                writer.AppendByte(slot);
                writer.AppendWord(DatabaseCore.Item.Quantity[CharacterItemIndex[slot]]);
                writer.AppendWord(reader.ReadWord());
                ServerSocket.Send(writer.getWorkspace(), Index_);

                writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_POTION);
                writer.AppendDword(Player.General[Index_].UniqueID);
                if (item.ITEM_TYPE_NAME.Contains("HP") && !item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x04);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += item.USE_TIME;
                    Stats.HPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("HP") && item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x04);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += ((int)Player.Stats[Index_].HP * item.USE_TIME2 / 100);
                    Stats.HPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("MP") && !item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x0E);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CMP += item.USE_TIME3;
                    Stats.MPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("MP") && item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x0E);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CMP += ((int)Player.Stats[Index_].MP * item.USE_TIME4 / 100);
                    Stats.MPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("ALL") && !item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x17);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += item.USE_TIME;
                    Player.Stats[Index_].CMP += item.USE_TIME3;
                    Stats.HPMPUpdate(Index_);
                }
                else if (item.ITEM_TYPE_NAME.Contains("ALL") && item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x17);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += ((int)Player.Stats[Index_].HP * item.USE_TIME2 / 100);
                    Player.Stats[Index_].CMP += ((int)Player.Stats[Index_].MP * item.USE_TIME4 / 100);
                    Stats.HPMPUpdate(Index_);
                }
            }
        }
Beispiel #28
0
        private static byte UnEnquipWeapon(int Index_, int[] CharacterItemIndex, int CharacterItemSourceIndex)
        {
            Silkroad.Item_ SourceItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemSourceIndex]);

            if (DatabaseCore.Item.ItemId[CharacterItemSourceIndex] != 0 && SourceItem.CLASS_C != 2 && SourceItem.CLASS_C != 3)
            {
                Player.Stats[Index_].MinPhy -= (ushort)SourceItem.MIN_LPHYATK;
                Player.Stats[Index_].MaxPhy -= (ushort)SourceItem.MIN_HPHYATK;
                Player.Stats[Index_].MinMag -= (ushort)SourceItem.MIN_LMAGATK;
                Player.Stats[Index_].MaxMag -= (ushort)SourceItem.MIN_HMAGATK;
                Player.General[Index_].WeaponType = 0;

                byte freeslot = FreeSlot(CharacterItemIndex);

                PacketWriter writer = new PacketWriter();

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_UNEQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(6);
                writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemSourceIndex]);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                writer.AppendByte(1);
                writer.AppendByte(0);
                writer.AppendByte(6);
                writer.AppendByte(freeslot);
                writer.AppendWord(1);
                writer.AppendByte(0);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                return freeslot;
            }
            return 255;
        }
Beispiel #29
0
        private static void PickUpItem(int Index_, int ObjectIndex)
        {
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);

            PacketWriter writer = new PacketWriter();

            for (int i = 0; i < Player.PlayersOnline; i++)
            {
                if (Player.General[i].UniqueID != 0)
                {
                    double Distance = Formula.CalculateDistance(Item.Position[ObjectIndex], Player.Position[i]);
                    if (Distance <= 800)
                    {
                        if (Player.Objects[i].SpawnedItemsIndex.Contains(ObjectIndex))
                        {
                            ServerSocket.Send(Players.CreateDeSpawnPacket(Item.General[ObjectIndex].UniqueID), i);
                            Player.Objects[i].SpawnedItemsIndex.Remove(ObjectIndex);
                        }
                    }
                }
            }

            Silkroad.Item_ tmpItem = Silkroad.GetItemById(Item.General[ObjectIndex].Pk2ID);

            byte freeslot = 0;

            if (Item.General[ObjectIndex].Pk2ID == 1 || Item.General[ObjectIndex].Pk2ID == 2 || Item.General[ObjectIndex].Pk2ID == 3)
            {
                freeslot = 254;
            }
            else
            {
                freeslot = Items.FreeSlot(CharacterItemIndex);
            }

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
            writer.AppendWord(0x601);
            writer.AppendByte(freeslot);
            if (freeslot != 254)
            {
                writer.AppendDword(Item.General[ObjectIndex].Pk2ID);
            }
            if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
            {
                writer.AppendByte(Item.General[ObjectIndex].Plus);
                writer.AppendLword(0);
                writer.AppendDword((uint)tmpItem.MIN_DURA);
                writer.AppendByte(0);

                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='{1}',type='0',durability='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", Item.General[ObjectIndex].Pk2ID, Item.General[ObjectIndex].Plus, Item.General[ObjectIndex].Durability, freeslot, Player.General[Index_].CharacterName);
                Items.AddItemToDatabase(CharacterItemIndex[freeslot], Item.General[ObjectIndex].Pk2ID, 0, 0, (byte)Item.General[ObjectIndex].Durability, Item.General[ObjectIndex].Plus, 0);
            }
            else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
            {
                if (freeslot == 254)
                {
                    writer.AppendDword(Item.General[ObjectIndex].Quantity);
                    Player.Stats[Index_].Gold += Item.General[ObjectIndex].Quantity;
                    DatabaseCore.WriteQuery("UPDATE characters SET gold='{0}' WHERE name='{1}'", Player.Stats[Index_].Gold, Player.General[Index_].CharacterName);
                }
                else
                {
                    writer.AppendWord((ushort)Item.General[ObjectIndex].Quantity);
                    DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0',type='1',durability='{1}',quantity='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", Item.General[ObjectIndex].Pk2ID, Item.General[ObjectIndex].Durability, Item.General[ObjectIndex].Quantity, freeslot, Player.General[Index_].CharacterName);
                    Items.AddItemToDatabase(CharacterItemIndex[freeslot], Item.General[ObjectIndex].Pk2ID, 1, (byte)Item.General[ObjectIndex].Quantity, (byte)Item.General[ObjectIndex].Durability, 0, 0);
                }
            }

            ServerSocket.Send(writer.getWorkspace(), Index_);

            Item.General[ObjectIndex]  = new Item._General();
            Item.Position[ObjectIndex] = new _Position();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_NEW_GOLD_AMOUNT);
            writer.AppendByte(1);
            writer.AppendLword(Player.Stats[Index_].Gold);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_ITEM_PICKUP);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendByte(141);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
            writer.AppendByte(2);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);
        }
Beispiel #30
0
        private static void SkillAttackType(int Index_)
        {
            PacketWriter writer = new PacketWriter();

            Silkroad.Skill_ tmpSkill = Silkroad.GetSkillById(Player.Objects[Index_].AttackingSkillID);

            byte weapontype = 0;
            if (Player.General[Index_].WeaponType == 6)
                weapontype = Silkroad.TypeTable.Bow;
            if ((Player.General[Index_].WeaponType == 2) || (Player.General[Index_].WeaponType == 3))
                weapontype = Silkroad.TypeTable.Bicheon;
            if ((Player.General[Index_].WeaponType == 4) || (Player.General[Index_].WeaponType == 5))
                weapontype = Silkroad.TypeTable.Heuksal;

            byte skilltype = tmpSkill.Type2;

            if (!(weapontype == skilltype) && !(skilltype == Silkroad.TypeTable.All))
            {
                Player.Objects[Index_].UsingSkill = false;
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
                writer.AppendWord(0xD02);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
                writer.AppendWord(3);
                writer.AppendByte(4);
                ServerSocket.Send(writer.getWorkspace(), Index_);
            }
            else
            {
                int ObjectIndex = Players.GetObjectIndexAndType(Index_, Player.Objects[Index_].AttackingObjectId);
                if (Player.Objects[Index_].SelectedObjectType == 2)
                    Timers.MonsterMovement[ObjectIndex].Stop();

                bool attack = false;

                if (Player.Objects[Index_].SelectedObjectType == 2)
                    attack = Movement.MoveToObject(Index_,ref Player.Position[Index_], Monsters.Position[ObjectIndex], Player.General[Index_].UniqueID, Player.General[Index_].CharacterID, tmpSkill.Distance * 10, weapontype,false);

                else
                    attack = Movement.MoveToObject(Index_, ref Player.Position[Index_], Player.Position[ObjectIndex], Player.General[Index_].UniqueID, Player.General[Index_].CharacterID, tmpSkill.Distance * 10, weapontype, false);

                if (attack)
                    Attack.BeginSkill(Index_);

            }
        }
Beispiel #31
0
        public static void OnMonsterAttack(int Index_)
        {
            uint SkillId = 161;

            if (Monsters.General[Index_].Skills.Count != 0)
            {
                int rnd = random.Next(0, Monsters.General[Index_].Skills.Count);
                SkillId = (uint)Monsters.General[Index_].Skills[rnd];
            }

            if (Player.General[Monsters.General[Index_].AttackingObjectIndex].UniqueID != 0)
            {
             /*   Silkroad.Skill_ tmpAttackSkill = Silkroad.GetSkillById(SkillId);
                Silkroad.Object_ tmpMonster = Silkroad.GetObjectById(Monsters.General[Index_].ID);

                uint BasicAttackPower = (uint)(tmpMonster.ParryRatio * 10);//parry ratio == att ratio?

                double SkillAttackPower = 1;
                double SkillIncreaseRate = 0;

                double EnemyAbsorbation = Player.Stats[Monsters.General[Index_].AttackingObjectIndex].TotalAccessoriesAbsorption / (double)100;
                double EnemyDefence =( Player.Stats[Monsters.General[Index_].AttackingObjectIndex].PhyDef + Player.Stats[Monsters.General[Index_].AttackingObjectIndex].MagDef) / 2;
                double TotalDamageIncreaseRate = 0;

                double Damage = Formula.CalculateDmg(
                    BasicAttackPower,
                    SkillAttackPower,
                    SkillIncreaseRate,
                    EnemyAbsorbation,
                    EnemyDefence,
                    tmpMonster.Level,
                    0,
                   0,
                    TotalDamageIncreaseRate,
                    tmpAttackSkill.PwrPercent / (double)100);

                Console.WriteLine(Damage);*/
                double Damage = (double)random.Next(1, 100);

                if (Monsters.General[Index_].Type == 3 || Monsters.General[Index_].Type == 0x10 || Monsters.General[Index_].Type == 20)
                    Damage *= 2;

                Player.Stats[Monsters.General[Index_].AttackingObjectIndex].CHP -= (int)Damage;
                byte AfterState = 0;

                if (Player.Stats[Monsters.General[Index_].AttackingObjectIndex].CHP <= 0)
                {
                    AfterState = 0x80;
                    Player.Stats[Monsters.General[Index_].AttackingObjectIndex].CHP = 0;
                }
                Stats.HPUpdate(Monsters.General[Index_].AttackingObjectIndex, true);

                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
                writer.AppendByte(1);
                writer.AppendByte(2);
                writer.AppendDword(SkillId);
                writer.AppendDword(Monsters.General[Index_].UniqueID);
                writer.AppendDword((uint)random.Next(65536, 1048575));
                writer.AppendDword(Player.General[Monsters.General[Index_].AttackingObjectIndex].UniqueID);
                writer.AppendByte(1);
                writer.AppendByte(1);
                writer.AppendByte(1);
                writer.AppendDword(Player.General[Monsters.General[Index_].AttackingObjectIndex].UniqueID);
                writer.AppendByte(AfterState);
                writer.AppendByte(1);
                writer.AppendDword((uint)Damage);
                writer.AppendByte(0);
                writer.AppendWord(0);

                ServerSocket.SendPacketIfMonsterIsSpawned(writer.getWorkspace(), Index_);

                if (AfterState == 0x80)
                {
                    Timers.MonsterAttack[Index_].Stop();
                    Player.General[Index_].State = 1;
                    Character.Die(Monsters.General[Index_].AttackingObjectIndex);
                    Character.Die2(Monsters.General[Index_].AttackingObjectIndex);
                    Player.Flags[Monsters.General[Index_].AttackingObjectIndex].Dead = true;
                }
            }
        }
Beispiel #32
0
        unsafe public static void OnMovement(byte *ptr, int Index_)
        {
            Silkroad.C_S.MOVEMENT_GROUND *tmpPtr = (Silkroad.C_S.MOVEMENT_GROUND *)ptr;

            if (tmpPtr->Type == 0)
            {
                Silkroad.C_S.MOVEMENT_SKY *MovingSky = (Silkroad.C_S.MOVEMENT_SKY *)ptr;
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_MOVEMENT);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(MovingSky->Type);
                writer.AppendByte(MovingSky->Flag);
                writer.AppendWord((ushort)((MovingSky->Angle * 360) / 65536));
                writer.AppendByte(1);
                writer.AppendByte(Player.Position[Index_].XSector);
                writer.AppendByte(Player.Position[Index_].YSector);
                writer.AppendWord((ushort)Player.Position[Index_].X);
                writer.AppendFloat(Player.Position[Index_].Z);
                writer.AppendWord((ushort)Player.Position[Index_].Y);
            }
            else if (tmpPtr->Type == 1)
            {
                if (Player.General[Index_].State != 4 || Player.General[Index_].State != 10 || Player.General[Index_].State != 1)
                {
                    Player.Objects[Index_].AttackingSkillID = 0;
                    Player.Objects[Index_].NormalAttack     = false;
                    Player.Objects[Index_].UsingSkill       = false;
                    Player.General[Index_].Busy             = false;
                    Timers.PlayerAttack[Index_].Stop();

                    Player.Position[Index_].XSector = tmpPtr->XSector;
                    Player.Position[Index_].YSector = tmpPtr->YSector;
                    Player.Position[Index_].X       = tmpPtr->X;
                    Player.Position[Index_].Z       = tmpPtr->Z;
                    Player.Position[Index_].Y       = tmpPtr->Y;

                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_MOVEMENT);
                    writer.AppendDword(Player.General[Index_].UniqueID);
                    writer.AppendByte(tmpPtr->Type);
                    writer.AppendByte(Player.Position[Index_].XSector);
                    writer.AppendByte(Player.Position[Index_].YSector);
                    writer.AppendWord((ushort)Player.Position[Index_].X);
                    writer.AppendWord((ushort)Player.Position[Index_].Z);
                    writer.AppendWord((ushort)Player.Position[Index_].Y);
                    writer.AppendByte(0);

                    byte[] tmpBuffer = writer.getWorkspace();

                    for (int i = 0; i < Player.PlayersOnline; i++)
                    {
                        if (Player.General[i].CharacterID != 0)
                        {
                            if (i == Index_)
                            {
                                ServerSocket.Send(tmpBuffer, i);
                            }
                            else
                            {
                                if (Formula.CalculateDistance(Player.Position[Index_], Player.Position[i]) <= 800 && Player.Objects[i].SpawnedIndex.Contains(Index_))
                                {
                                    ServerSocket.Send(tmpBuffer, i);
                                }
                            }
                        }
                    }

                    DatabaseCore.WriteQuery("UPDATE characters SET xsect='{0}', ysect='{1}', xpos='{2}', zpos='{3}', ypos='{4}' where id='{5}'", Player.Position[Index_].XSector, Player.Position[Index_].YSector, Player.Position[Index_].X, Player.Position[Index_].Z, Player.Position[Index_].Y, Player.General[Index_].CharacterID);

                    for (int i = 0; i < Player.PlayersOnline; i++)
                    {
                        if (Player.General[i].CharacterID != 0 && Index_ != i)
                        {
                            double Distance = Formula.CalculateDistance(Player.Position[Index_], Player.Position[i]);
                            if (Distance <= 800)
                            {
                                if (!Player.Objects[Index_].SpawnedIndex.Contains(i))
                                {
                                    ServerSocket.Send(Character.CreateSpawnPacket(Player.General[i], Player.Flags[i], Player.Position[i], Player.Stats[i], Player.Speeds[i]), Index_);
                                    Player.Objects[Index_].SpawnedIndex.Add(i);

                                    ServerSocket.Send(Character.CreateSpawnPacket(Player.General[Index_], Player.Flags[Index_], Player.Position[Index_], Player.Stats[Index_], Player.Speeds[Index_]), i);
                                    Player.Objects[i].SpawnedIndex.Add(Index_);
                                }
                            }
                            else if (Distance > 800)
                            {
                                if (Player.Objects[Index_].SpawnedIndex.Contains(i))
                                {
                                    ServerSocket.Send(Players.CreateDeSpawnPacket(Player.General[i].UniqueID), Index_);
                                    Player.Objects[Index_].SpawnedIndex.Remove(i);

                                    ServerSocket.Send(Players.CreateDeSpawnPacket(Player.General[Index_].UniqueID), i);
                                    Player.Objects[i].SpawnedIndex.Remove(Index_);
                                }
                            }
                        }
                    }

                    for (int i = 0; i < Monsters.MonsterAmount; i++)
                    {
                        if (Monsters.General[i].UniqueID != 0 && !Monsters.General[i].Dead)
                        {
                            double Distance = Formula.CalculateDistance(Player.Position[Index_], Monsters.Position[i]);
                            if (Distance <= 800)
                            {
                                if (!Player.Objects[Index_].SpawnedMonsterIndex.Contains(i))
                                {
                                    ServerSocket.Send(MonsterSpawn.CreateSpawnPacket(Monsters.General[i].ID, Monsters.General[i].UniqueID, Monsters.Position[i], Monsters.General[i].Type), Index_);
                                    Player.Objects[Index_].SpawnedMonsterIndex.Add(i);
                                }
                            }
                            else if (Distance > 800)
                            {
                                if (Player.Objects[Index_].SpawnedMonsterIndex.Contains(i))
                                {
                                    ServerSocket.Send(Players.CreateDeSpawnPacket(Monsters.General[i].UniqueID), Index_);
                                    Player.Objects[Index_].SpawnedMonsterIndex.Remove(i);
                                }
                            }
                        }
                    }

                    for (int i = 0; i < Item.ItemAmount; i++)
                    {
                        if (Item.General[i].UniqueID != 0)
                        {
                            double Distance = Formula.CalculateDistance(Player.Position[Index_], Item.Position[i]);
                            if (Distance <= 800)
                            {
                                if (!Player.Objects[Index_].SpawnedItemsIndex.Contains(i))
                                {
                                    ServerSocket.Send(Items.CreateSpawnPacket(Item.General[i], Item.Position[i]), Index_);
                                    Player.Objects[Index_].SpawnedItemsIndex.Add(i);
                                }
                            }
                            else if (Distance > 800)
                            {
                                if (Player.Objects[Index_].SpawnedItemsIndex.Contains(i))
                                {
                                    ServerSocket.Send(Players.CreateDeSpawnPacket(Item.General[i].UniqueID), Index_);
                                    Player.Objects[Index_].SpawnedItemsIndex.Remove(i);
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #33
0
        public static void EndSkill(int Index_)
        {
            Silkroad.Skill_ tmpSkill = Silkroad.GetSkillById(Player.Objects[Index_].AttackingSkillID);

            bool AttackingPlayer = false;
            for (int i = 0; i <= Player.PlayersOnline; i++)
            {
                if (Player.Objects[Index_].AttackingObjectId == Player.General[i].UniqueID)
                    AttackingPlayer = true;
            }

            int ObjectIndex = Players.GetObjectIndexAndType(Index_, Player.Objects[Index_].AttackingObjectId);

            Silkroad.Skill_ tmpAttackSkill = Silkroad.GetSkillById(Player.Objects[Index_].AttackingSkillID);

            uint BasicAttackPower = 0;
            if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                BasicAttackPower = (uint)random.Next(Player.Stats[Index_].MinPhy, Player.Stats[Index_].MaxPhy);
            else if (tmpAttackSkill.Type == Silkroad.TypeTable.Mag)
                BasicAttackPower = (uint)random.Next(Player.Stats[Index_].MinMag, Player.Stats[Index_].MaxMag);

            double SkillAttackPower = random.Next(tmpSkill.PwrMin, tmpSkill.PwrMax);

            double SkillIncreaseRate =  0;// needs to be calculated from passive skills/active buffs

            double EnemyAbsorbation = 0;
            if (AttackingPlayer)
                EnemyAbsorbation = Player.Stats[ObjectIndex].TotalAccessoriesAbsorption / (double)100;

            double EnemyDefence = 0;

            if (AttackingPlayer)
            {
                if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                    EnemyDefence = Player.Stats[ObjectIndex].PhyDef;
                else if (tmpAttackSkill.Type == Silkroad.TypeTable.Mag)
                    EnemyDefence = Player.Stats[ObjectIndex].MagDef;
            }
            else
            {
                if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                    EnemyDefence = Silkroad.GetObjectById(Monsters.General[ObjectIndex].ID).PhyDef;
                else if (tmpAttackSkill.Type == Silkroad.TypeTable.Mag)
                    EnemyDefence = Silkroad.GetObjectById(Monsters.General[ObjectIndex].ID).MagDef;
            }

            double TotalDamageIncreaseRate = 0;//needs to be calculated from the players equipment

            double Damage = Formula.CalculateDmg(
                BasicAttackPower,
                SkillAttackPower,
                SkillIncreaseRate,
                EnemyAbsorbation,
                EnemyDefence,
                Player.Stats[Index_].Level,
                Player.Stats[Index_].Strength,
                Player.Stats[Index_].Intelligence,
                TotalDamageIncreaseRate,
                tmpAttackSkill.PwrPercent / (double)100);

            byte Critical = 1;
            byte AfterState = 0;

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_END_SKILL);
            writer.AppendByte(1);
            writer.AppendDword(Player.Objects[Index_].AttackingCastingID);
            writer.AppendDword(Player.Objects[Index_].AttackingObjectId);
            writer.AppendByte(1);
            writer.AppendByte(tmpSkill.NumberOfAttacks);
            writer.AppendByte(1);
            writer.AppendDword(Player.Objects[Index_].AttackingObjectId);

            for (int i = 0; i < tmpSkill.NumberOfAttacks; i++)
            {
                if (i > 0)
                {
                    Player.Objects[Index_].AttackingSkillID = tmpSkill.NextId;
                    Silkroad.Skill_ tmp = Silkroad.GetSkillById(tmpSkill.NextId);
                    SkillAttackPower = random.Next(tmp.PwrMin, tmp.PwrMax);
                    Damage = Formula.CalculateDmg(
                        BasicAttackPower,
                        SkillAttackPower,
                        SkillIncreaseRate,
                        EnemyAbsorbation,
                        EnemyDefence,
                        Player.Stats[Index_].Level,
                        Player.Stats[Index_].Strength,
                        Player.Stats[Index_].Intelligence,
                        TotalDamageIncreaseRate,
                        tmp.PwrPercent / (double)100);
                }

                if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                {
                    if (random.Next(1, 10) >= 7)
                    {
                        Critical = 2;
                        Damage *= 2;
                    }
                }

                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    Monsters.General[ObjectIndex].HP -= (int)Damage;
                    if (Monsters.General[ObjectIndex].HP <= 0)
                    {
                        AfterState = 0x80;
                        Monsters.General[ObjectIndex].HP = 0;
                    }
                }
                else if (Player.Objects[Index_].SelectedObjectType == 1)
                {
                    int tmpHp = (int)(Player.Stats[ObjectIndex].CHP - Damage);
                    if (tmpHp < 0)
                    {
                        AfterState = 0x80;
                        Player.Stats[ObjectIndex].CHP = 0;
                    }
                    else
                        Player.Stats[ObjectIndex].CHP -= (int)Damage;
                }

                writer.AppendByte(AfterState);
                writer.AppendByte(Critical);
                writer.AppendDword((uint)Damage);
                writer.AppendByte(0);
                writer.AppendWord(0);
            }

            ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
            writer.AppendByte(2);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            Player.Objects[Index_].NormalAttack = false;
            Player.General[Index_].Busy = true;
            Timers.PlayerAttack[Index_].Interval = tmpSkill.NumberOfAttacks * 1000;
            Timers.PlayerAttack[Index_].Start();

            if (AfterState == 0x80)
            {
                Player.General[Index_].Busy = false;
                Timers.PlayerAttack[Index_].Stop();
                Player.Objects[Index_].NormalAttack = false;
                Player.Objects[Index_].UsingSkill = false;
                Player.Objects[Index_].AttackingObjectDeadID = Player.Objects[Index_].AttackingObjectId;

                if (Player.Objects[Index_].SelectedObjectType == 1)
                {
                    Player.General[Index_].State = 10;
                    Player.Objects[Index_].NormalAttack = false;
                    Player.General[Index_].Busy = false;
                    Timers.PlayerAttack[ObjectIndex].Stop();

                    Character.Die(ObjectIndex);
                    Character.Die2(ObjectIndex);

                    Player.Flags[ObjectIndex].Dead = true;
                }
                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    Stats.GetBerserk(Index_, ObjectIndex);
                    Stats.GetXP(Index_, ObjectIndex);

                    if (Monsters.General[ObjectIndex].Type == 3)
                        Unique.OnUnique((uint)Monsters.General[ObjectIndex].ID, true, Player.General[Index_].CharacterName);

                    Monsters.General[ObjectIndex].Dead = true;

                    Timers.MonsterDeath[Index_].Interval = 3000.0;
                    Timers.MonsterDeath[Index_].Start();
                }
                Timers.MonsterAttack[ObjectIndex].Stop();
            }
            else
            {
                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    if (!Timers.MonsterAttack[ObjectIndex].Enabled)
                    {
                        Monsters.General[ObjectIndex].AttackingObjectIndex = Index_;
                        Timers.MonsterAttack[ObjectIndex].Interval = 2350;
                        Timers.MonsterAttack[ObjectIndex].Start();
                    }
                }
            }
        }
Beispiel #34
0
        unsafe public static void MoveItem(byte *ptr, int Index_)
        {
            Silkroad.C_S.MOVE_ITEM *tmpPtr = (Silkroad.C_S.MOVE_ITEM *)ptr;

            PacketWriter writer = new PacketWriter();

            switch (tmpPtr->Type)
            {
            case 0:

                int[]          CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);
                Silkroad.Item_ SourceItem_        = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
                Silkroad.Item_ DestinationItem_   = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Destination]]);

                if (SourceItem_.ITEM_TYPE_NAME.Contains("FRPVP_VOUCHER"))
                {
                    if (Player.Stats[Index_].Level >= 10 && CheckItemGender(SourceItem_, Index_))
                    {
                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_CAPE);
                        writer.AppendDword(Player.General[Index_].UniqueID);
                        writer.AppendWord(0x102);
                        writer.AppendByte(0xA);

                        ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
                        Timers.UsingItemTimer[Index_].Interval      = 10000;
                        Player.Objects[Index_].SourceItemIndex      = CharacterItemIndex[tmpPtr->Source];
                        Player.Objects[Index_].DestinationItemIndex = CharacterItemIndex[tmpPtr->Destination];
                        Timers.UsingItemTimer[Index_].Start();
                    }
                    else
                    {
                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                        writer.AppendWord(0x1002);
                        ServerSocket.Send(writer.getWorkspace(), Index_);
                    }
                }
                else
                {
                    if (tmpPtr->Destination < 13)
                    {
                        if (!SourceItem_.ITEM_TYPE_NAME.Contains("ETC"))
                        {
                            if (!CheckItemGender(SourceItem_, Index_))
                            {
                                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                                writer.AppendWord(0x1602);
                                ServerSocket.Send(writer.getWorkspace(), Index_);
                                return;
                            }
                            else if (!CheckItemLevel(SourceItem_, Index_))
                            {
                                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                                writer.AppendWord(0x1002);
                                ServerSocket.Send(writer.getWorkspace(), Index_);
                                return;
                            }

                            if (tmpPtr->Destination == 6)
                            {
                                Player.General[Index_].WeaponType = SourceItem_.CLASS_C;
                            }

                            Silkroad.Item_ WeaponItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[6]]);

                            Console.WriteLine(WeaponItem.CLASS_C);
                            if (tmpPtr->Destination == 6 && DatabaseCore.Item.ItemId[CharacterItemIndex[7]] != 0 && (Player.General[Index_].WeaponType != 2 && Player.General[Index_].WeaponType != 3 && Player.General[Index_].WeaponType != 7 && Player.General[Index_].WeaponType != 10 && Player.General[Index_].WeaponType != 15))
                            {
                                byte unequipped = UnEnquipShield(Index_, CharacterItemIndex, CharacterItemIndex[7]);
                                if (unequipped != 255)
                                {
                                    MoveItemToDatabase(CharacterItemIndex[7], unequipped, Player.General[Index_].CharacterName);
                                }
                            }

                            if (tmpPtr->Destination == 7 && DatabaseCore.Item.ItemId[CharacterItemIndex[6]] != 0 && (WeaponItem.CLASS_C != 2 && WeaponItem.CLASS_C != 3 && WeaponItem.CLASS_C != 7 && WeaponItem.CLASS_C != 10 && WeaponItem.CLASS_C != 15))
                            {
                                byte unequipped = UnEnquipWeapon(Index_, CharacterItemIndex, CharacterItemIndex[6]);
                                if (unequipped != 255)
                                {
                                    MoveItemToDatabase(CharacterItemIndex[6], unequipped, Player.General[Index_].CharacterName);
                                }
                            }

                            EquipItem(Index_, CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination]);
                        }
                        else
                        {
                            if (!(tmpPtr->Destination == 7 && (Player.General[Index_].WeaponType == 6 || Player.General[Index_].WeaponType == 12) && DatabaseCore.Item.ItemId[CharacterItemIndex[7]] != 0))
                            {
                                return;
                            }
                        }
                    }
                    if (tmpPtr->Source < 13)
                    {
                        UnEquipItem(Index_, CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination]);
                    }

                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                    writer.AppendByte(1);
                    writer.AppendByte(tmpPtr->Type);
                    writer.AppendByte(tmpPtr->Source);
                    writer.AppendByte(tmpPtr->Destination);
                    writer.AppendWord(tmpPtr->Amount);
                    writer.AppendByte(0);
                    ServerSocket.Send(writer.getWorkspace(), Index_);

                    MoveItemToDatabase(CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination], Player.General[Index_].CharacterName);
                }
                Stats.OnStatPacket(Index_);
                break;

            case 7:
                CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);

                int ItemIndex = Item.ItemAmount;
                Item.General[ItemIndex].Pk2ID      = DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]];
                Item.General[ItemIndex].UniqueID   = (uint)random.Next(76000000, 79999999);
                Item.General[ItemIndex].Plus       = DatabaseCore.Item.PlusValue[CharacterItemIndex[tmpPtr->Source]];
                Item.General[ItemIndex].Durability = DatabaseCore.Item.Durability[CharacterItemIndex[tmpPtr->Source]];
                Item.General[ItemIndex].Pickable   = true;
                Item.General[ItemIndex].Quantity   = DatabaseCore.Item.Quantity[CharacterItemIndex[tmpPtr->Source]];
                Item.Position[ItemIndex].XSector   = Player.Position[Index_].XSector;
                Item.Position[ItemIndex].YSector   = Player.Position[Index_].YSector;
                byte randomplace = (byte)random.Next(1, 7);
                Item.Position[ItemIndex].X = Player.Position[Index_].X + randomplace;
                Item.Position[ItemIndex].Z = Player.Position[Index_].Z;
                Item.Position[ItemIndex].Y = Player.Position[Index_].Y + randomplace;
                Item.General[ItemIndex].DroppedByUniqueId = Player.General[Index_].UniqueID;
                Item.ItemAmount++;

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                writer.AppendByte(1);
                writer.AppendByte(tmpPtr->Type);
                writer.AppendByte(tmpPtr->Source);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                Silkroad.Item_ tmpItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);

                byte[] tmpBuffer = new byte[0];
                if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
                {
                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                    writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
                    writer.AppendByte(DatabaseCore.Item.PlusValue[CharacterItemIndex[tmpPtr->Source]]);
                    writer.AppendDword(Item.General[ItemIndex].UniqueID);
                    writer.AppendByte(Item.Position[ItemIndex].XSector);
                    writer.AppendByte(Item.Position[ItemIndex].YSector);
                    writer.AppendFloat(Item.Position[ItemIndex].X);
                    writer.AppendFloat(Item.Position[ItemIndex].X);
                    writer.AppendFloat(Item.Position[ItemIndex].Y);
                    writer.AppendWord(0xAAA6);
                    writer.AppendByte(0);
                    writer.AppendByte(0);
                    writer.AppendByte(6);
                    writer.AppendDword(Item.General[ItemIndex].DroppedByUniqueId);
                    tmpBuffer = writer.getWorkspace();
                }
                else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
                {
                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                    writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
                    writer.AppendDword(Item.General[ItemIndex].UniqueID);
                    writer.AppendByte(Item.Position[ItemIndex].XSector);
                    writer.AppendByte(Item.Position[ItemIndex].YSector);
                    writer.AppendFloat(Item.Position[ItemIndex].X);
                    writer.AppendFloat(Item.Position[ItemIndex].X);
                    writer.AppendFloat(Item.Position[ItemIndex].Y);
                    writer.AppendWord(0xAAA6);
                    writer.AppendByte(0);
                    writer.AppendByte(0);
                    writer.AppendByte(6);
                    writer.AppendDword(Item.General[ItemIndex].DroppedByUniqueId);
                    tmpBuffer = writer.getWorkspace();
                }

                for (int i = 0; i < Player.PlayersOnline; i++)
                {
                    if (Player.General[i].CharacterID != 0)
                    {
                        if (Formula.CalculateDistance(Item.Position[ItemIndex], Player.Position[i]) <= 800)
                        {
                            ServerSocket.Send(tmpBuffer, i);
                            Player.Objects[i].SpawnedItemsIndex.Add(ItemIndex);
                        }
                    }
                }

                DatabaseCore.WriteQuery("UPDATE items SET itemid='0',plusvalue='0' ,durability='30' WHERE itemnumber='item{0}' AND owner='{1}'", tmpPtr->Source, Player.General[Index_].CharacterName);
                Stats.OnStatPacket(Index_);

                DeleteFromDatabase(CharacterItemIndex[tmpPtr->Source]);

                break;

            case 10:
                if (Player.Stats[Index_].Gold != 0)
                {
                    PacketReader reader = new PacketReader(ptr, 5);
                    reader.ModifyIndex(1);
                    uint goldamount = reader.ReadDword();


                    ItemIndex = Item.ItemAmount;
                    if (goldamount < 10000)
                    {
                        Item.General[ItemIndex].Pk2ID = 1;
                    }
                    else if (goldamount >= 10000 && goldamount <= 500000)
                    {
                        Item.General[ItemIndex].Pk2ID = 2;
                    }
                    else if (goldamount >= 500001)
                    {
                        Item.General[ItemIndex].Pk2ID = 3;
                    }

                    Item.General[ItemIndex].UniqueID   = (uint)random.Next(76000000, 79999999);
                    Item.General[ItemIndex].Plus       = 0;
                    Item.General[ItemIndex].Durability = 0;
                    Item.General[ItemIndex].Pickable   = true;
                    Item.General[ItemIndex].Quantity   = goldamount;
                    Item.Position[ItemIndex].XSector   = Player.Position[Index_].XSector;
                    Item.Position[ItemIndex].YSector   = Player.Position[Index_].YSector;
                    randomplace = (byte)random.Next(1, 7);
                    Item.Position[ItemIndex].X = Player.Position[Index_].X + randomplace;
                    Item.Position[ItemIndex].Z = Player.Position[Index_].Z;
                    Item.Position[ItemIndex].Y = Player.Position[Index_].Y + randomplace;
                    Item.General[ItemIndex].DroppedByUniqueId = Player.General[Index_].UniqueID;
                    Item.ItemAmount++;

                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                    if (goldamount < 10000)
                    {
                        writer.AppendDword(1);
                    }
                    else if (goldamount >= 10000 && goldamount <= 500000)
                    {
                        writer.AppendDword(2);
                    }
                    else if (goldamount >= 500001)
                    {
                        writer.AppendDword(3);
                    }
                    writer.AppendDword(goldamount);
                    writer.AppendDword(Item.General[ItemIndex].UniqueID);
                    writer.AppendByte(Item.Position[ItemIndex].XSector);
                    writer.AppendByte(Item.Position[ItemIndex].YSector);
                    writer.AppendFloat(Item.Position[ItemIndex].X);
                    writer.AppendFloat(Item.Position[ItemIndex].X);
                    writer.AppendFloat(Item.Position[ItemIndex].Y);
                    writer.AppendWord(0xDC72);
                    writer.AppendByte(0);
                    writer.AppendByte(0);
                    writer.AppendByte(6);
                    writer.AppendDword(0);

                    tmpBuffer = writer.getWorkspace();

                    for (int i = 0; i < Player.PlayersOnline; i++)
                    {
                        if (Player.General[i].CharacterID != 0)
                        {
                            if (Formula.CalculateDistance(Item.Position[ItemIndex], Player.Position[i]) <= 800)
                            {
                                ServerSocket.Send(tmpBuffer, i);
                                Player.Objects[i].SpawnedItemsIndex.Add(ItemIndex);
                            }
                        }
                    }

                    Player.Stats[Index_].Gold -= goldamount;
                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_NEW_GOLD_AMOUNT);
                    writer.AppendByte(1);
                    writer.AppendLword(Player.Stats[Index_].Gold);
                    writer.AppendByte(0);
                    ServerSocket.Send(writer.getWorkspace(), Index_);


                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                    writer.AppendByte(1);
                    writer.AppendByte(10);
                    writer.AppendDword(goldamount);
                    ServerSocket.Send(writer.getWorkspace(), Index_);

                    DatabaseCore.WriteQuery("UPDATE characters SET gold='{0}' WHERE name='{1}'", Player.Stats[Index_].Gold, Player.General[Index_].CharacterName);
                }
                break;
            }
        }
Beispiel #35
0
        public static void OnMonsterAttack(int Index_)
        {
            uint SkillId = 161;

            if (Monsters.General[Index_].Skills.Count != 0)
            {
                int rnd = random.Next(0, Monsters.General[Index_].Skills.Count);
                SkillId = (uint)Monsters.General[Index_].Skills[rnd];
            }

            if (Player.General[Monsters.General[Index_].AttackingObjectIndex].UniqueID != 0)
            {
                /*   Silkroad.Skill_ tmpAttackSkill = Silkroad.GetSkillById(SkillId);
                 * Silkroad.Object_ tmpMonster = Silkroad.GetObjectById(Monsters.General[Index_].ID);
                 *
                 * uint BasicAttackPower = (uint)(tmpMonster.ParryRatio * 10);//parry ratio == att ratio?
                 *
                 * double SkillAttackPower = 1;
                 * double SkillIncreaseRate = 0;
                 *
                 * double EnemyAbsorbation = Player.Stats[Monsters.General[Index_].AttackingObjectIndex].TotalAccessoriesAbsorption / (double)100;
                 * double EnemyDefence =( Player.Stats[Monsters.General[Index_].AttackingObjectIndex].PhyDef + Player.Stats[Monsters.General[Index_].AttackingObjectIndex].MagDef) / 2;
                 * double TotalDamageIncreaseRate = 0;
                 *
                 * double Damage = Formula.CalculateDmg(
                 *     BasicAttackPower,
                 *     SkillAttackPower,
                 *     SkillIncreaseRate,
                 *     EnemyAbsorbation,
                 *     EnemyDefence,
                 *     tmpMonster.Level,
                 *     0,
                 *    0,
                 *     TotalDamageIncreaseRate,
                 *     tmpAttackSkill.PwrPercent / (double)100);
                 *
                 * Console.WriteLine(Damage);*/
                double Damage = (double)random.Next(1, 100);

                if (Monsters.General[Index_].Type == 3 || Monsters.General[Index_].Type == 0x10 || Monsters.General[Index_].Type == 20)
                {
                    Damage *= 2;
                }

                Player.Stats[Monsters.General[Index_].AttackingObjectIndex].CHP -= (int)Damage;
                byte AfterState = 0;

                if (Player.Stats[Monsters.General[Index_].AttackingObjectIndex].CHP <= 0)
                {
                    AfterState = 0x80;
                    Player.Stats[Monsters.General[Index_].AttackingObjectIndex].CHP = 0;
                }
                Stats.HPUpdate(Monsters.General[Index_].AttackingObjectIndex, true);

                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
                writer.AppendByte(1);
                writer.AppendByte(2);
                writer.AppendDword(SkillId);
                writer.AppendDword(Monsters.General[Index_].UniqueID);
                writer.AppendDword((uint)random.Next(65536, 1048575));
                writer.AppendDword(Player.General[Monsters.General[Index_].AttackingObjectIndex].UniqueID);
                writer.AppendByte(1);
                writer.AppendByte(1);
                writer.AppendByte(1);
                writer.AppendDword(Player.General[Monsters.General[Index_].AttackingObjectIndex].UniqueID);
                writer.AppendByte(AfterState);
                writer.AppendByte(1);
                writer.AppendDword((uint)Damage);
                writer.AppendByte(0);
                writer.AppendWord(0);

                ServerSocket.SendPacketIfMonsterIsSpawned(writer.getWorkspace(), Index_);

                if (AfterState == 0x80)
                {
                    Timers.MonsterAttack[Index_].Stop();
                    Player.General[Index_].State = 1;
                    Character.Die(Monsters.General[Index_].AttackingObjectIndex);
                    Character.Die2(Monsters.General[Index_].AttackingObjectIndex);
                    Player.Flags[Monsters.General[Index_].AttackingObjectIndex].Dead = true;
                }
            }
        }
Beispiel #36
0
        private static void OnCharCreation(PacketReader Reader_, int Index_)
        {
            PacketWriter writer = new PacketWriter();

            ushort charlen = Reader_.ReadWord();
            string name = Reader_.ReadString(false, charlen);

            uint model = Reader_.ReadDword();
            byte volume = Reader_.ReadByte();

            uint[] _item = new uint[5];

            _item[1] = Reader_.ReadDword();
            _item[2] = Reader_.ReadDword();
            _item[3] = Reader_.ReadDword();
            _item[4] = Reader_.ReadDword();

            int UserIndex = DatabaseCore.User.GetIndexByName(Player.General[Index_].User);

            if (DatabaseCore.Character.GetIndexByName(name) != -1)
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHARACTER);
                writer.AppendWord(0x204);
                writer.AppendByte(0x10);
                ServerSocket.Send(writer.getWorkspace(), Index_);
            }
            else
            {
                double magdefmin = 3.0;
                double phydefmin = 6.0;
                ushort parrymin = 11;
                ushort phyatkmin = 6;
                ushort phyatkmax = 9;
                ushort magatkmin = 6;
                ushort magatkmax = 10;

                Silkroad.Item_ _item_1 = Silkroad.GetItemById(_item[1]);
                Silkroad.Item_ _item_2 = Silkroad.GetItemById(_item[2]);
                Silkroad.Item_ _item_3 = Silkroad.GetItemById(_item[3]);
                Silkroad.Item_ _item_4 = Silkroad.GetItemById(_item[4]);

                DatabaseCore.User.CharacterCount[UserIndex]++;
                Array.Resize<string>(ref DatabaseCore.User.Characters[UserIndex].CharacterName, DatabaseCore.User.CharacterCount[UserIndex]);
                DatabaseCore.User.Characters[UserIndex].CharacterName[DatabaseCore.User.CharacterCount[UserIndex] - 1] = name;

                DatabaseCore.Character.NumberOfCharacters++;
                Array.Resize<string>(ref DatabaseCore.Character.CharacterName, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<string>(ref DatabaseCore.Character.CharacterName, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<uint>(ref DatabaseCore.Character.CharacterId, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<uint>(ref DatabaseCore.Character.UniqueId, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<uint>(ref DatabaseCore.Character.HP, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<uint>(ref DatabaseCore.Character.MP, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<int>(ref DatabaseCore.Character.CHP, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<int>(ref DatabaseCore.Character.CMP, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<uint>(ref DatabaseCore.Character.Model, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.Volume, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.Level, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ulong>(ref DatabaseCore.Character.Experience, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ulong>(ref DatabaseCore.Character.Gold, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<uint>(ref DatabaseCore.Character.SkillPoints, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.Attributes, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.BerserkBar, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.Berserk, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<float>(ref DatabaseCore.Character.WalkSpeed, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<float>(ref DatabaseCore.Character.RunSpeed, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<float>(ref DatabaseCore.Character.BerserkSpeed, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.MinPhy, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.MaxPhy, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.MinMag, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.MaxMag, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.PhyDef, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.MagDef, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.Hit, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.Parry, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.Strength, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.Intelligence, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<ushort>(ref DatabaseCore.Character.SkillPointBar, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.GM, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<sbyte>(ref DatabaseCore.Character.PVP, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.XSector, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.YSector, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<float>(ref DatabaseCore.Character.X, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<float>(ref DatabaseCore.Character.Z, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<float>(ref DatabaseCore.Character.Y, DatabaseCore.Character.NumberOfCharacters);
                Array.Resize<byte>(ref DatabaseCore.Character.MaxSlots, DatabaseCore.Character.NumberOfCharacters);

                int NewCharacterIndex = DatabaseCore.Character.NumberOfCharacters - 1;
                DatabaseCore.Character.CharacterName[NewCharacterIndex] = name;
                DatabaseCore.Character.CharacterId[NewCharacterIndex] = DatabaseCore.Character.CharacterId[NewCharacterIndex] + 1;
                DatabaseCore.Character.UniqueId[NewCharacterIndex] = DatabaseCore.Character.UniqueId[NewCharacterIndex] + 300000;
                DatabaseCore.Character.HP[NewCharacterIndex] = 200;
                DatabaseCore.Character.MP[NewCharacterIndex] = 200;
                DatabaseCore.Character.CHP[NewCharacterIndex] = 200;
                DatabaseCore.Character.CMP[NewCharacterIndex] = 200;
                DatabaseCore.Character.Model[NewCharacterIndex] = model;
                DatabaseCore.Character.Volume[NewCharacterIndex] = volume;
                DatabaseCore.Character.Level[NewCharacterIndex] = 1;

                DatabaseCore.Character.WalkSpeed[NewCharacterIndex] = 16;
                DatabaseCore.Character.RunSpeed[NewCharacterIndex] = 50;
                DatabaseCore.Character.BerserkSpeed[NewCharacterIndex] = 100;
                DatabaseCore.Character.Strength[NewCharacterIndex] = 20;
                DatabaseCore.Character.Intelligence[NewCharacterIndex] = 20;
                DatabaseCore.Character.PVP[NewCharacterIndex] = -1;
                DatabaseCore.Character.XSector[NewCharacterIndex] = 168;
                DatabaseCore.Character.YSector[NewCharacterIndex] = 98;
                DatabaseCore.Character.X[NewCharacterIndex] = 978;
                DatabaseCore.Character.Z[NewCharacterIndex] = 1097;
                DatabaseCore.Character.Y[NewCharacterIndex] = 40;
                DatabaseCore.Character.MaxSlots[NewCharacterIndex] = 45;

                DatabaseCore.Item.NumberOfItems += 46;
                Array.Resize<string>(ref DatabaseCore.Item.CharacterName, DatabaseCore.Item.NumberOfItems);
                Array.Resize<uint>(ref DatabaseCore.Item.ItemId, DatabaseCore.Item.NumberOfItems);
                Array.Resize<byte>(ref DatabaseCore.Item.PlusValue, DatabaseCore.Item.NumberOfItems);
                Array.Resize<byte>(ref DatabaseCore.Item.Quantity, DatabaseCore.Item.NumberOfItems);
                Array.Resize<byte>(ref DatabaseCore.Item.Type, DatabaseCore.Item.NumberOfItems);
                Array.Resize<byte>(ref DatabaseCore.Item.Slot, DatabaseCore.Item.NumberOfItems);
                Array.Resize<byte>(ref DatabaseCore.Item.Durability, DatabaseCore.Item.NumberOfItems);
                Array.Resize<byte>(ref DatabaseCore.Item.BlueAmount, DatabaseCore.Item.NumberOfItems);
                Array.Resize<DatabaseCore.Item_.Blue_>(ref DatabaseCore.Item.Blue, DatabaseCore.Item.NumberOfItems);

                for (byte i = 0; i < 46; i++)
                {
                    int tmpItemIndex = DatabaseCore.Item.NumberOfItems - 46 + i;
                    DatabaseCore.Item.Slot[tmpItemIndex] = i;
                    DatabaseCore.Item.Durability[tmpItemIndex] = 30;
                    DatabaseCore.Item.CharacterName[tmpItemIndex] = name;
                    DatabaseCore.Item.Blue[tmpItemIndex] = new DatabaseCore.Item_.Blue_();
                    DatabaseCore.Item.Blue[tmpItemIndex].Blue = new uint[9];
                    DatabaseCore.Item.Blue[tmpItemIndex].BlueAmount = new byte[9];
                }

                DatabaseCore.WriteQuery("UPDATE user SET char_{0}='{1}' WHERE name='{2}'", DatabaseCore.User.CharacterCount[UserIndex], name, Player.General[Index_].User);
                DatabaseCore.WriteQuery("UPDATE user SET char_count='{0}' WHERE name='{1}'", DatabaseCore.User.CharacterCount[UserIndex], Player.General[Index_].User);
                DatabaseCore.WriteQuery("INSERT INTO characters (account, name, chartype, volume) VALUE ('{0}','{1}', '{2}', '{3}')", Player.General[Index_].User, name, model, volume);

                for (int i = 0; i <= 45; i++)
                    DatabaseCore.WriteQuery("INSERT INTO items (itemnumber, owner, slot) VALUE ('item{0}','{1}', '{0}')", i, name);

                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0' ,durability='{1}' WHERE itemnumber='item1' AND owner ='{2}'", _item[1], _item_1.MIN_DURA, name);
                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0' ,durability='{1}' WHERE itemnumber='item4' AND owner ='{2}'", _item[2], _item_2.MIN_DURA, name);
                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0' ,durability='{1}' WHERE itemnumber='item5' AND owner ='{2}'", _item[3], _item_3.MIN_DURA, name);
                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0' ,durability='{1}' WHERE itemnumber='item6' AND owner ='{2}'", _item[4], _item_4.MIN_DURA, name);

                DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 45] = _item[1];
                DatabaseCore.Item.Durability[DatabaseCore.Item.NumberOfItems - 45] = (byte)_item_1.MIN_DURA;
                DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 42] = _item[2];
                DatabaseCore.Item.Durability[DatabaseCore.Item.NumberOfItems - 42] = (byte)_item_2.MIN_DURA;
                DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 41] = _item[3];
                DatabaseCore.Item.Durability[DatabaseCore.Item.NumberOfItems - 41] = (byte)_item_3.MIN_DURA;
                DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 40] = _item[4];
                DatabaseCore.Item.Durability[DatabaseCore.Item.NumberOfItems - 40] = (byte)_item_4.MIN_DURA;

                phydefmin += _item_1.MIN_PHYSDEF + _item_2.MIN_PHYSDEF + _item_3.MIN_PHYSDEF;
                magdefmin += _item_1.MAGDEF_MIN + _item_2.MAGDEF_MIN + _item_3.MAGDEF_MIN;
                parrymin += (ushort)(_item_1.MIN_PARRY + _item_2.MIN_PARRY + _item_3.MIN_PARRY);
                phyatkmin += (ushort)_item_4.MIN_LPHYATK;
                phyatkmax += (ushort)_item_4.MIN_HPHYATK;
                magatkmin += (ushort)_item_4.MIN_LMAGATK;
                magatkmax += (ushort)_item_4.MIN_HMAGATK;

                if (model >= 1907 && model <= 1932)
                {
                    DatabaseCore.Mastery.NumberOfMasteries += 7;
                    Array.Resize<string>(ref DatabaseCore.Mastery.CharacterName, DatabaseCore.Mastery.NumberOfMasteries);
                    Array.Resize<ushort>(ref DatabaseCore.Mastery.MasteryId, DatabaseCore.Mastery.NumberOfMasteries);
                    Array.Resize<byte>(ref DatabaseCore.Mastery.MasteryLevel, DatabaseCore.Mastery.NumberOfMasteries);
                    Array.Resize<uint>(ref DatabaseCore.Character.CharacterId, DatabaseCore.Character.NumberOfCharacters);
                    for (byte i = 0; i < 7; i++)
                        DatabaseCore.Mastery.CharacterName[DatabaseCore.Mastery.NumberOfMasteries - 1 - i] = name;

                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 7] = 257;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 6] = 258;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 5] = 259;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 4] = 273;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 3] = 274;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 2] = 275;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 1] = 276;

                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_1')", name, 257);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_2')", name, 258);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_3')", name, 259);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_4')", name, 273);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_5')", name, 274);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_6')", name, 275);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_7')", name, 276);

                }

                else if (model >= 14717 && model <= 14742)
                {
                    DatabaseCore.Mastery.NumberOfMasteries += 6;
                    Array.Resize<string>(ref DatabaseCore.Mastery.CharacterName, DatabaseCore.Mastery.NumberOfMasteries);
                    Array.Resize<ushort>(ref DatabaseCore.Mastery.MasteryId, DatabaseCore.Mastery.NumberOfMasteries);
                    Array.Resize<byte>(ref DatabaseCore.Mastery.MasteryLevel, DatabaseCore.Mastery.NumberOfMasteries);
                    Array.Resize<uint>(ref DatabaseCore.Character.CharacterId, DatabaseCore.Character.NumberOfCharacters);
                    for (byte i = 0; i < 6; i++)
                        DatabaseCore.Mastery.CharacterName[DatabaseCore.Mastery.NumberOfMasteries - 1 - i] = name;

                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 6] = 513;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 5] = 514;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 4] = 515;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 3] = 516;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 2] = 517;
                    DatabaseCore.Mastery.MasteryId[DatabaseCore.Mastery.NumberOfMasteries - 1] = 518;

                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_1')", name, 513);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_2')", name, 514);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_3')", name, 515);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_4')", name, 516);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_5')", name, 517);
                    DatabaseCore.WriteQuery("INSERT INTO mastery (owner, mastery, level, mastery_row) VALUE ('{0}','{1}', '0', 'mastery_6')", name, 518);
                }

                DatabaseCore.WriteQuery("INSERT INTO skills (owner, AmountSkill) VALUE ('{0}','0')", name);
                DatabaseCore.Skill.NumberOfSkills++;
                Array.Resize<string>(ref DatabaseCore.Skill.CharacterName, DatabaseCore.Skill.NumberOfSkills);
                Array.Resize<int>(ref DatabaseCore.Skill.SkillAmount, DatabaseCore.Skill.NumberOfSkills);
                Array.Resize<DatabaseCore.Skill_.Skills_>(ref DatabaseCore.Skill.Skills, DatabaseCore.Skill.NumberOfSkills);
                DatabaseCore.Skill.CharacterName[DatabaseCore.Skill.NumberOfSkills - 1] = name;

                if (_item[4] == 3632 || _item[4] == 3633)
                {
                    Silkroad.Item_ tmpItem = Silkroad.GetItemById(251);
                    phydefmin += tmpItem.MIN_PHYSDEF;
                    magdefmin += tmpItem.MAGDEF_MIN;
                    parrymin += (ushort)tmpItem.MIN_PARRY;

                    DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 39] = 251;
                    DatabaseCore.Item.Durability[DatabaseCore.Item.NumberOfItems - 39] = (byte)tmpItem.MIN_DURA;

                    DatabaseCore.WriteQuery("UPDATE items SET itemid='251',plusvalue='0' ,durability='{0}' WHERE itemnumber='item7' AND owner ='{1}'", tmpItem.MIN_DURA, name);
                    DatabaseCore.WriteQuery("update characters set min_phyatk='{0}', max_phyatk='{1}', min_magatk='{2}', max_magatk='{3}', phydef='{4}', magdef='{5}', parry='{6}' where name='{7}'", phyatkmin, phyatkmax, magatkmin, magatkmax, (int)phydefmin, (int)magatkmin, parrymin, name);

                }
                else if (_item[4] == 10730 || _item[4] == 10734 || _item[4] == 10737)
                {
                    Silkroad.Item_ tmpItem = Silkroad.GetItemById(11387);
                    phydefmin += tmpItem.MIN_PHYSDEF;
                    magdefmin += tmpItem.MAGDEF_MIN;
                    parrymin += (ushort)tmpItem.MIN_PARRY;

                    DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 39] = 11387;
                    DatabaseCore.Item.Durability[DatabaseCore.Item.NumberOfItems - 39] = (byte)tmpItem.MIN_DURA;

                    DatabaseCore.WriteQuery("UPDATE items SET itemid='11387',plusvalue='0' ,durability='{0}' WHERE itemnumber='item7' AND owner ='{1}'", tmpItem.MIN_DURA, name);
                    DatabaseCore.WriteQuery("update characters set min_phyatk='{0}', max_phyatk='{1}', min_magatk='{2}', max_magatk='{3}', phydef='{4}', magdef='{5}', parry='{6}' where name='{7}'", phyatkmin, phyatkmax, magatkmin, magatkmax, (int)phydefmin, (int)magatkmin, parrymin, name);
                }
                else if (_item[4] == 3636)
                {
                    DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 39] = 62;
                    DatabaseCore.Item.Quantity[DatabaseCore.Item.NumberOfItems - 39] = 250;
                    DatabaseCore.Item.Type[DatabaseCore.Item.NumberOfItems - 39] = 1;

                    DatabaseCore.WriteQuery("UPDATE items SET itemid='62',quantity='250',type='1'  WHERE itemnumber='item7' AND owner ='{0}'", name);
                }

                else if (_item[4] == 10733)
                {
                    DatabaseCore.Item.ItemId[DatabaseCore.Item.NumberOfItems - 39] = 10727;
                    DatabaseCore.Item.Quantity[DatabaseCore.Item.NumberOfItems - 39] = 250;
                    DatabaseCore.Item.Type[DatabaseCore.Item.NumberOfItems - 39] = 1;
                    DatabaseCore.WriteQuery("UPDATE items SET itemid='10727',quantity='250',type='1'  WHERE itemnumber='item7' AND owner ='{0}'", name);
                }

                DatabaseCore.Character.MinPhy[NewCharacterIndex] = phyatkmin;
                DatabaseCore.Character.MaxPhy[NewCharacterIndex] = phyatkmax;
                DatabaseCore.Character.MinMag[NewCharacterIndex] = magatkmin;
                DatabaseCore.Character.MaxMag[NewCharacterIndex] = magatkmax;
                DatabaseCore.Character.PhyDef[NewCharacterIndex] = (ushort)phydefmin;
                DatabaseCore.Character.MagDef[NewCharacterIndex] = (ushort)magdefmin;
                DatabaseCore.Character.Hit[NewCharacterIndex] = 11;
                DatabaseCore.Character.Parry[NewCharacterIndex] = parrymin;

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHARACTER);
                writer.AppendWord(0x101);
                ServerSocket.Send(writer.getWorkspace(), Index_);
            }
        }
Beispiel #37
0
        public static unsafe void MoveItem(byte* ptr, int Index_)
        {
            Silkroad.C_S.MOVE_ITEM* tmpPtr = (Silkroad.C_S.MOVE_ITEM*)ptr;

            PacketWriter writer = new PacketWriter();
            switch (tmpPtr->Type)
            {
                case 0:

                    int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);
                    Silkroad.Item_ SourceItem_ = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
                    Silkroad.Item_ DestinationItem_ = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Destination]]);

                    if (SourceItem_.ITEM_TYPE_NAME.Contains("FRPVP_VOUCHER"))
                    {
                        if (Player.Stats[Index_].Level >= 10 && CheckItemGender(SourceItem_, Index_))
                        {
                            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_CAPE);
                            writer.AppendDword(Player.General[Index_].UniqueID);
                            writer.AppendWord(0x102);
                            writer.AppendByte(0xA);

                            ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
                            Timers.UsingItemTimer[Index_].Interval = 10000;
                            Player.Objects[Index_].SourceItemIndex = CharacterItemIndex[tmpPtr->Source];
                            Player.Objects[Index_].DestinationItemIndex = CharacterItemIndex[tmpPtr->Destination];
                            Timers.UsingItemTimer[Index_].Start();
                        }
                        else
                        {
                            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                            writer.AppendWord(0x1002);
                            ServerSocket.Send(writer.getWorkspace(), Index_);
                        }
                    }
                    else
                    {
                        if (tmpPtr->Destination < 13)
                        {
                            if (!SourceItem_.ITEM_TYPE_NAME.Contains("ETC"))
                            {
                                if (!CheckItemGender(SourceItem_, Index_))
                                {
                                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                                    writer.AppendWord(0x1602);
                                    ServerSocket.Send(writer.getWorkspace(), Index_);
                                    return;
                                }
                                else if (!CheckItemLevel(SourceItem_, Index_))
                                {
                                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                                    writer.AppendWord(0x1002);
                                    ServerSocket.Send(writer.getWorkspace(), Index_);
                                    return;
                                }

                                if (tmpPtr->Destination == 6)
                                    Player.General[Index_].WeaponType = SourceItem_.CLASS_C;

                                Silkroad.Item_ WeaponItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[6]]);

                                Console.WriteLine(WeaponItem.CLASS_C);
                                if (tmpPtr->Destination == 6 && DatabaseCore.Item.ItemId[CharacterItemIndex[7]] != 0 && (Player.General[Index_].WeaponType != 2 && Player.General[Index_].WeaponType != 3 && Player.General[Index_].WeaponType != 7 && Player.General[Index_].WeaponType != 10 && Player.General[Index_].WeaponType != 15))
                                {
                                    byte unequipped = UnEnquipShield(Index_, CharacterItemIndex, CharacterItemIndex[7]);
                                    if (unequipped != 255)
                                        MoveItemToDatabase(CharacterItemIndex[7], unequipped, Player.General[Index_].CharacterName);
                                }

                                if (tmpPtr->Destination == 7 && DatabaseCore.Item.ItemId[CharacterItemIndex[6]] != 0 && (WeaponItem.CLASS_C != 2 && WeaponItem.CLASS_C != 3 && WeaponItem.CLASS_C != 7 && WeaponItem.CLASS_C != 10 && WeaponItem.CLASS_C != 15))
                                {
                                    byte unequipped = UnEnquipWeapon(Index_, CharacterItemIndex, CharacterItemIndex[6]);
                                    if (unequipped != 255)
                                        MoveItemToDatabase(CharacterItemIndex[6], unequipped, Player.General[Index_].CharacterName);
                                }

                                EquipItem(Index_, CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination]);
                            }
                            else
                            {
                                if (!(tmpPtr->Destination == 7 && (Player.General[Index_].WeaponType == 6 || Player.General[Index_].WeaponType == 12) && DatabaseCore.Item.ItemId[CharacterItemIndex[7]] != 0))
                                    return;
                            }
                        }
                        if (tmpPtr->Source < 13)
                            UnEquipItem(Index_, CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination]);

                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                        writer.AppendByte(1);
                        writer.AppendByte(tmpPtr->Type);
                        writer.AppendByte(tmpPtr->Source);
                        writer.AppendByte(tmpPtr->Destination);
                        writer.AppendWord(tmpPtr->Amount);
                        writer.AppendByte(0);
                        ServerSocket.Send(writer.getWorkspace(), Index_);

                        MoveItemToDatabase(CharacterItemIndex[tmpPtr->Source], CharacterItemIndex[tmpPtr->Destination], Player.General[Index_].CharacterName);
                    }
                    Stats.OnStatPacket(Index_);
                    break;
                case 7:
                    CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);

                    int ItemIndex = Item.ItemAmount;
                    Item.General[ItemIndex].Pk2ID = DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]];
                    Item.General[ItemIndex].UniqueID = (uint)random.Next(76000000, 79999999);
                    Item.General[ItemIndex].Plus = DatabaseCore.Item.PlusValue[CharacterItemIndex[tmpPtr->Source]];
                    Item.General[ItemIndex].Durability = DatabaseCore.Item.Durability[CharacterItemIndex[tmpPtr->Source]];
                    Item.General[ItemIndex].Pickable = true;
                    Item.General[ItemIndex].Quantity = DatabaseCore.Item.Quantity[CharacterItemIndex[tmpPtr->Source]];
                    Item.Position[ItemIndex].XSector = Player.Position[Index_].XSector;
                    Item.Position[ItemIndex].YSector = Player.Position[Index_].YSector;
                    byte randomplace = (byte)random.Next(1, 7);
                    Item.Position[ItemIndex].X = Player.Position[Index_].X + randomplace;
                    Item.Position[ItemIndex].Z = Player.Position[Index_].Z;
                    Item.Position[ItemIndex].Y = Player.Position[Index_].Y + randomplace;
                    Item.General[ItemIndex].DroppedByUniqueId = Player.General[Index_].UniqueID;
                    Item.ItemAmount++;

                    writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                    writer.AppendByte(1);
                    writer.AppendByte(tmpPtr->Type);
                    writer.AppendByte(tmpPtr->Source);
                    ServerSocket.Send(writer.getWorkspace(), Index_);

                    Silkroad.Item_ tmpItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);

                    byte[] tmpBuffer = new byte[0];
                    if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
                    {
                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                        writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
                        writer.AppendByte(DatabaseCore.Item.PlusValue[CharacterItemIndex[tmpPtr->Source]]);
                        writer.AppendDword(Item.General[ItemIndex].UniqueID);
                        writer.AppendByte(Item.Position[ItemIndex].XSector);
                        writer.AppendByte(Item.Position[ItemIndex].YSector);
                        writer.AppendFloat(Item.Position[ItemIndex].X);
                        writer.AppendFloat(Item.Position[ItemIndex].X);
                        writer.AppendFloat(Item.Position[ItemIndex].Y);
                        writer.AppendWord(0xAAA6);
                        writer.AppendByte(0);
                        writer.AppendByte(0);
                        writer.AppendByte(6);
                        writer.AppendDword(Item.General[ItemIndex].DroppedByUniqueId);
                        tmpBuffer = writer.getWorkspace();
                    }
                    else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
                    {
                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                        writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[tmpPtr->Source]]);
                        writer.AppendDword(Item.General[ItemIndex].UniqueID);
                        writer.AppendByte(Item.Position[ItemIndex].XSector);
                        writer.AppendByte(Item.Position[ItemIndex].YSector);
                        writer.AppendFloat(Item.Position[ItemIndex].X);
                        writer.AppendFloat(Item.Position[ItemIndex].X);
                        writer.AppendFloat(Item.Position[ItemIndex].Y);
                        writer.AppendWord(0xAAA6);
                        writer.AppendByte(0);
                        writer.AppendByte(0);
                        writer.AppendByte(6);
                        writer.AppendDword(Item.General[ItemIndex].DroppedByUniqueId);
                        tmpBuffer = writer.getWorkspace();
                    }

                    for (int i = 0; i < Player.PlayersOnline; i++)
                    {
                        if (Player.General[i].CharacterID != 0)
                        {
                            if (Formula.CalculateDistance(Item.Position[ItemIndex], Player.Position[i]) <= 800)
                            {
                                ServerSocket.Send(tmpBuffer, i);
                                Player.Objects[i].SpawnedItemsIndex.Add(ItemIndex);
                            }
                        }
                    }

                    DatabaseCore.WriteQuery("UPDATE items SET itemid='0',plusvalue='0' ,durability='30' WHERE itemnumber='item{0}' AND owner='{1}'", tmpPtr->Source, Player.General[Index_].CharacterName);
                    Stats.OnStatPacket(Index_);

                    DeleteFromDatabase(CharacterItemIndex[tmpPtr->Source]);

                    break;
                case 10:
                    if (Player.Stats[Index_].Gold != 0)
                    {
                        PacketReader reader = new PacketReader(ptr, 5);
                        reader.ModifyIndex(1);
                        uint goldamount = reader.ReadDword();

                        ItemIndex = Item.ItemAmount;
                        if (goldamount < 10000)
                            Item.General[ItemIndex].Pk2ID = 1;
                        else if (goldamount >= 10000 && goldamount <= 500000)
                            Item.General[ItemIndex].Pk2ID = 2;
                        else if (goldamount >= 500001)
                            Item.General[ItemIndex].Pk2ID = 3;

                        Item.General[ItemIndex].UniqueID = (uint)random.Next(76000000, 79999999);
                        Item.General[ItemIndex].Plus = 0;
                        Item.General[ItemIndex].Durability = 0;
                        Item.General[ItemIndex].Pickable = true;
                        Item.General[ItemIndex].Quantity = goldamount;
                        Item.Position[ItemIndex].XSector = Player.Position[Index_].XSector;
                        Item.Position[ItemIndex].YSector = Player.Position[Index_].YSector;
                        randomplace = (byte)random.Next(1, 7);
                        Item.Position[ItemIndex].X = Player.Position[Index_].X + randomplace;
                        Item.Position[ItemIndex].Z = Player.Position[Index_].Z;
                        Item.Position[ItemIndex].Y = Player.Position[Index_].Y + randomplace;
                        Item.General[ItemIndex].DroppedByUniqueId = Player.General[Index_].UniqueID;
                        Item.ItemAmount++;

                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                        if (goldamount < 10000)
                            writer.AppendDword(1);
                        else if (goldamount >= 10000 && goldamount <= 500000)
                            writer.AppendDword(2);
                        else if (goldamount >= 500001)
                            writer.AppendDword(3);
                        writer.AppendDword(goldamount);
                        writer.AppendDword(Item.General[ItemIndex].UniqueID);
                        writer.AppendByte(Item.Position[ItemIndex].XSector);
                        writer.AppendByte(Item.Position[ItemIndex].YSector);
                        writer.AppendFloat(Item.Position[ItemIndex].X);
                        writer.AppendFloat(Item.Position[ItemIndex].X);
                        writer.AppendFloat(Item.Position[ItemIndex].Y);
                        writer.AppendWord(0xDC72);
                        writer.AppendByte(0);
                        writer.AppendByte(0);
                        writer.AppendByte(6);
                        writer.AppendDword(0);

                        tmpBuffer = writer.getWorkspace();

                        for (int i = 0; i < Player.PlayersOnline; i++)
                        {
                            if (Player.General[i].CharacterID != 0)
                            {
                                if (Formula.CalculateDistance(Item.Position[ItemIndex], Player.Position[i]) <= 800)
                                {
                                    ServerSocket.Send(tmpBuffer, i);
                                    Player.Objects[i].SpawnedItemsIndex.Add(ItemIndex);
                                }
                            }
                        }

                        Player.Stats[Index_].Gold -= goldamount;
                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_NEW_GOLD_AMOUNT);
                        writer.AppendByte(1);
                        writer.AppendLword(Player.Stats[Index_].Gold);
                        writer.AppendByte(0);
                        ServerSocket.Send(writer.getWorkspace(), Index_);

                        writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                        writer.AppendByte(1);
                        writer.AppendByte(10);
                        writer.AppendDword(goldamount);
                        ServerSocket.Send(writer.getWorkspace(), Index_);

                        DatabaseCore.WriteQuery("UPDATE characters SET gold='{0}' WHERE name='{1}'", Player.Stats[Index_].Gold, Player.General[Index_].CharacterName);

                    }
                    break;
            }
        }
Beispiel #38
0
        private static void SkillAttackType(int Index_)
        {
            PacketWriter writer = new PacketWriter();

            Silkroad.Skill_ tmpSkill = Silkroad.GetSkillById(Player.Objects[Index_].AttackingSkillID);

            byte weapontype = 0;

            if (Player.General[Index_].WeaponType == 6)
            {
                weapontype = Silkroad.TypeTable.Bow;
            }
            if ((Player.General[Index_].WeaponType == 2) || (Player.General[Index_].WeaponType == 3))
            {
                weapontype = Silkroad.TypeTable.Bicheon;
            }
            if ((Player.General[Index_].WeaponType == 4) || (Player.General[Index_].WeaponType == 5))
            {
                weapontype = Silkroad.TypeTable.Heuksal;
            }

            byte skilltype = tmpSkill.Type2;

            if (!(weapontype == skilltype) && !(skilltype == Silkroad.TypeTable.All))
            {
                Player.Objects[Index_].UsingSkill = false;
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
                writer.AppendWord(0xD02);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
                writer.AppendWord(3);
                writer.AppendByte(4);
                ServerSocket.Send(writer.getWorkspace(), Index_);
            }
            else
            {
                int ObjectIndex = Players.GetObjectIndexAndType(Index_, Player.Objects[Index_].AttackingObjectId);
                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    Timers.MonsterMovement[ObjectIndex].Stop();
                }

                bool attack = false;

                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    attack = Movement.MoveToObject(Index_, ref Player.Position[Index_], Monsters.Position[ObjectIndex], Player.General[Index_].UniqueID, Player.General[Index_].CharacterID, tmpSkill.Distance * 10, weapontype, false);
                }

                else
                {
                    attack = Movement.MoveToObject(Index_, ref Player.Position[Index_], Player.Position[ObjectIndex], Player.General[Index_].UniqueID, Player.General[Index_].CharacterID, tmpSkill.Distance * 10, weapontype, false);
                }

                if (attack)
                {
                    Attack.BeginSkill(Index_);
                }
            }
        }
Beispiel #39
0
        private static void PickUpItem(int Index_, int ObjectIndex)
        {
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);

            PacketWriter writer = new PacketWriter();

            for (int i = 0; i < Player.PlayersOnline; i++)
            {
                if (Player.General[i].UniqueID != 0)
                {
                    double Distance = Formula.CalculateDistance(Item.Position[ObjectIndex], Player.Position[i]);
                    if (Distance <= 800)
                    {
                        if (Player.Objects[i].SpawnedItemsIndex.Contains(ObjectIndex))
                        {
                            ServerSocket.Send(Players.CreateDeSpawnPacket(Item.General[ObjectIndex].UniqueID), i);
                            Player.Objects[i].SpawnedItemsIndex.Remove(ObjectIndex);
                        }
                    }
                }
            }

            Silkroad.Item_ tmpItem = Silkroad.GetItemById(Item.General[ObjectIndex].Pk2ID);

            byte freeslot = 0;
            if (Item.General[ObjectIndex].Pk2ID == 1 || Item.General[ObjectIndex].Pk2ID == 2 || Item.General[ObjectIndex].Pk2ID == 3)
                freeslot = 254;
            else
                freeslot = Items.FreeSlot(CharacterItemIndex);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
            writer.AppendWord(0x601);
            writer.AppendByte(freeslot);
            if (freeslot != 254)
                writer.AppendDword(Item.General[ObjectIndex].Pk2ID);
            if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
            {
                writer.AppendByte(Item.General[ObjectIndex].Plus);
                writer.AppendLword(0);
                writer.AppendDword((uint)tmpItem.MIN_DURA);
                writer.AppendByte(0);

                DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='{1}',type='0',durability='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", Item.General[ObjectIndex].Pk2ID, Item.General[ObjectIndex].Plus, Item.General[ObjectIndex].Durability, freeslot, Player.General[Index_].CharacterName);
                Items.AddItemToDatabase(CharacterItemIndex[freeslot], Item.General[ObjectIndex].Pk2ID, 0, 0, (byte)Item.General[ObjectIndex].Durability, Item.General[ObjectIndex].Plus, 0);
            }
            else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
            {
                if (freeslot == 254)
                {
                    writer.AppendDword(Item.General[ObjectIndex].Quantity);
                    Player.Stats[Index_].Gold += Item.General[ObjectIndex].Quantity;
                    DatabaseCore.WriteQuery("UPDATE characters SET gold='{0}' WHERE name='{1}'", Player.Stats[Index_].Gold, Player.General[Index_].CharacterName);
                }
                else
                {
                    writer.AppendWord((ushort)Item.General[ObjectIndex].Quantity);
                    DatabaseCore.WriteQuery("UPDATE items SET itemid='{0}',plusvalue='0',type='1',durability='{1}',quantity='{2}' WHERE itemnumber='item{3}' AND owner ='{4}'", Item.General[ObjectIndex].Pk2ID, Item.General[ObjectIndex].Durability, Item.General[ObjectIndex].Quantity, freeslot, Player.General[Index_].CharacterName);
                    Items.AddItemToDatabase(CharacterItemIndex[freeslot], Item.General[ObjectIndex].Pk2ID, 1, (byte)Item.General[ObjectIndex].Quantity, (byte)Item.General[ObjectIndex].Durability, 0, 0);
                }
            }

            ServerSocket.Send(writer.getWorkspace(), Index_);

            Item.General[ObjectIndex] = new Item._General();
            Item.Position[ObjectIndex] = new _Position();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_NEW_GOLD_AMOUNT);
            writer.AppendByte(1);
            writer.AppendLword(Player.Stats[Index_].Gold);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_ITEM_PICKUP);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendByte(141);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SKILL_ATTACK);
            writer.AppendByte(2);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);
        }
Beispiel #40
0
        public static void EquipCape(int Index_)
        {
            PacketWriter writer = new PacketWriter();
            if (!Player.Flags[Index_].WearingCape)
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_EQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].SourceItemIndex]);
                writer.AppendDword(DatabaseCore.Item.ItemId[Player.Objects[Index_].SourceItemIndex]);
                writer.AppendByte(0);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
                Player.Flags[Index_].WearingCape = true;
            }
            else
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_UNEQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].SourceItemIndex]);
                writer.AppendDword(DatabaseCore.Item.ItemId[Player.Objects[Index_].SourceItemIndex]);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);
                Player.Flags[Index_].WearingCape = false;
            }

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
            writer.AppendWord(1);
            writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].SourceItemIndex]);
            writer.AppendByte(DatabaseCore.Item.Slot[Player.Objects[Index_].DestinationItemIndex]);
            writer.AppendWord(0);
            writer.AppendByte(0);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            MoveItemToDatabase(Player.Objects[Index_].SourceItemIndex, Player.Objects[Index_].DestinationItemIndex, Player.General[Index_].CharacterName);
        }
Beispiel #41
0
        public static void OnSpawn(PacketReader reader_, int Index_)
        {
            int MonsterIndex = Monsters.MonsterAmount;
            uint monsterid = reader_.ReadDword();
            byte monstertype = reader_.ReadByte();

            uint uniqueid = (uint)Monsters.MonsterAmount + 1000;
            if (monstertype == 1)
                monstertype = 0;

            Silkroad.Object_ tmpMonster = Silkroad.GetObjectById(monsterid);

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);

            writer.AppendDword(monsterid);
            writer.AppendDword(uniqueid);

            writer.AppendByte(Player.Position[Index_].XSector);
            writer.AppendByte(Player.Position[Index_].YSector);
            writer.AppendFloat(Player.Position[Index_].X);
            writer.AppendFloat(Player.Position[Index_].Z);
            writer.AppendFloat(Player.Position[Index_].Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendWord(1);
            writer.AppendByte(0);

            writer.AppendFloat(tmpMonster.Speed);
            writer.AppendFloat(tmpMonster.Speed);
            writer.AppendFloat(tmpMonster.Speed);

            writer.AppendByte(0);
            writer.AppendByte(0);

            writer.AppendByte(monstertype);
            writer.AppendByte(1);
            byte[] tmpBuffer = writer.getWorkspace();
            //   ServerSocket.SendPacketInRange(writer.getWorkspace(),Index_);

            int monsterhp = (int)tmpMonster.Hp;
            ulong exp = tmpMonster.Exp;
            switch (monstertype)
            {
                case 2:
                    monsterhp *= 2;
                    exp *= 2;
                    break;

                case 3:
                    exp *= 7;
                    break;

                case 4:
                    monsterhp *= 20;
                    exp *= 3;
                    break;

                case 6:
                    monsterhp *= 4;
                    exp *= 4;
                    break;

                case 16:
                    monsterhp *= 10;
                    exp *= 5;
                    break;

                case 17:
                    monsterhp *= 20;
                    exp *= 6;

                    break;

                case 20:
                    monsterhp *= 200;
                    exp *= 8;
                    break;
            }

            Monsters.General[MonsterIndex].ID = monsterid;
            Monsters.General[MonsterIndex].UniqueID = uniqueid;
            Monsters.General[MonsterIndex].Type = monstertype;
            Monsters.General[MonsterIndex].HP = monsterhp;
            Monsters.Position[MonsterIndex].XSector = Player.Position[Index_].XSector;
            Monsters.Position[MonsterIndex].YSector = Player.Position[Index_].YSector;
            Monsters.Position[MonsterIndex].X = Player.Position[Index_].X;
            Monsters.Position[MonsterIndex].Z = Player.Position[Index_].Z;
            Monsters.Position[MonsterIndex].Y = Player.Position[Index_].Y;
            Monsters.General[MonsterIndex].Exp = exp;
            Monsters.General[MonsterIndex].Level = tmpMonster.Level;
            Monsters.General[MonsterIndex].Skills = new ArrayList();
            Monsters.General[MonsterIndex].Dead = false;

            for (int i = 0; i < Player.PlayersOnline; i++)
            {
                if (Player.General[i].CharacterID != 0)
                {
                    if (Formula.CalculateDistance(Monsters.Position[MonsterIndex], Player.Position[i]) <= 800)
                    {
                        ServerSocket.Send(tmpBuffer, i);
                        Player.Objects[i].SpawnedMonsterIndex.Add(MonsterIndex);
                    }
                }
            }

            uint[] skill = new uint[9];
            skill[0] = tmpMonster.Skill1;
            skill[1] = tmpMonster.Skill2;
            skill[2] = tmpMonster.Skill3;
            skill[3] = tmpMonster.Skill4;
            skill[4] = tmpMonster.Skill5;
            skill[5] = tmpMonster.Skill6;
            skill[6] = tmpMonster.Skill7;
            skill[7] = tmpMonster.Skill8;
            skill[8] = tmpMonster.Skill9;

            for (int i = 0; i <= 8; i++)
            {
                if (skill[i] != 0 && skill[i] <= 3000)
                    Monsters.General[MonsterIndex].Skills.Add(skill[i]);
            }

            Monsters.MonsterAmount++;

            if (monstertype == 3)
                Unique.OnUnique(monsterid, false, null);

            Timers.MonsterMovement[MonsterIndex].Interval = 5000;
            Timers.MonsterMovement[MonsterIndex].Start();
        }
Beispiel #42
0
        private static void OnChatWhisper(PacketReader reader_, int Index_)
        {
            ushort charlen = reader_.ReadWord();
            string name = reader.ReadString(false, charlen);

            if (name.ToCharArray(0, 1)[0] == '[')
                name = name.Substring(3);

            ushort msglen = reader_.ReadWord();
            byte[] bmsg = reader_.ReadByteArray(msglen * 2);

            if (DatabaseCore.Character.GetIndexByName(name) != -1)
            {
                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
                writer.AppendByte(2);
                writer.AppendWord((ushort)Player.General[Index_].CharacterName.Length);
                writer.AppendString(false, Player.General[Index_].CharacterName);
                writer.AppendWord((ushort)(msglen / 2));
                writer.AppendByteArray(bmsg, bmsg.Length);
                for (int i = 0; i <= Player.PlayersOnline; i++)
                {
                    if (Player.General[i].CharacterName == name)
                    {
                        ServerSocket.Send(writer.getWorkspace(), i);
                        break;
                    }
                }
            }
        }
Beispiel #43
0
        private static void OnChatNotice(PacketReader reader_)
        {
            ushort msglen = reader_.ReadWord();

            byte[] bmsg = reader_.ReadByteArray(msglen * 2);

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
            writer.AppendByte(7);
            writer.AppendWord(msglen);
            writer.AppendByteArray(bmsg, bmsg.Length);
            ServerSocket.SendToAllIngame(writer.getWorkspace());
        }
Beispiel #44
0
        private static byte UnEnquipShield(int Index_, int[] CharacterItemIndex, int CharacterShieldIndex)
        {
            Silkroad.Item_ SourceItem = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterShieldIndex]);

            if (SourceItem.CLASS_C != 2 && SourceItem.CLASS_C != 3)
            {
                if (Player.Stats[Index_].PhyDef < SourceItem.MAX_PHYSDEF)
                    Player.Stats[Index_].PhyDef = 1;
                else if (Player.Stats[Index_].MagDef < SourceItem.MAGDEF_MAX)
                    Player.Stats[Index_].MagDef = 1;
                else
                {
                    Player.Stats[Index_].PhyDef -= (ushort)SourceItem.MAX_PHYSDEF;
                    Player.Stats[Index_].MagDef -= (ushort)SourceItem.MAGDEF_MAX;
                }

                byte freeslot = FreeSlot(CharacterItemIndex);

                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_UNEQUIP);
                writer.AppendDword(Player.General[Index_].UniqueID);
                writer.AppendByte(7);
                writer.AppendDword(DatabaseCore.Item.ItemId[CharacterShieldIndex]);

                ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_MOVEMENT);
                writer.AppendByte(1);
                writer.AppendByte(0);
                writer.AppendByte(7);
                writer.AppendByte(freeslot);
                writer.AppendWord(1);
                writer.AppendByte(0);
                ServerSocket.Send(writer.getWorkspace(), Index_);

                return freeslot;
            }
            return 255;
        }
Beispiel #45
0
        public static void SendExternNotice(string msg)
        {
            byte[] bmsg = Encoding.Unicode.GetBytes(msg);

            PacketWriter writer = new PacketWriter();
            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHAT);
            writer.AppendByte(7);
            writer.AppendWord((ushort)(bmsg.Length / 2));
            writer.AppendByteArray(bmsg, bmsg.Length);
            ServerSocket.SendToAllIngame(writer.getWorkspace());
        }
Beispiel #46
0
        public static byte[] CreateSpawnPacket(Item._General general,_Position pos)
        {
            PacketWriter writer = new PacketWriter();
            Silkroad.Item_ tmpItem = Silkroad.GetItemById(general.Pk2ID);
            if (tmpItem.ITEM_TYPE_NAME.Contains("CH") || tmpItem.ITEM_TYPE_NAME.Contains("EU"))
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                writer.AppendDword(general.Pk2ID);
                writer.AppendByte(general.Plus);
                writer.AppendDword(general.UniqueID);
                writer.AppendByte(pos.XSector);
                writer.AppendByte(pos.YSector);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.Y);
                writer.AppendWord(0xAAA6);
                writer.AppendByte(0);
                writer.AppendByte(0);
                writer.AppendByte(6);
                writer.AppendDword(general.DroppedByUniqueId);

            }
            else if (tmpItem.ITEM_TYPE_NAME.Contains("ETC"))
            {
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);
                writer.AppendDword(general.Pk2ID);
                if (general.Pk2ID == 1 || general.Pk2ID == 2 || general.Pk2ID == 3)
                    writer.AppendDword(general.Quantity);
                writer.AppendDword(general.UniqueID);
                writer.AppendByte(pos.XSector);
                writer.AppendByte(pos.YSector);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.X);
                writer.AppendFloat(pos.Y);
                writer.AppendWord(0xAAA6);
                writer.AppendByte(0);
                writer.AppendByte(0);
                writer.AppendByte(6);
                writer.AppendDword(general.DroppedByUniqueId);

            }
            return writer.getWorkspace();
        }
Beispiel #47
0
        public static void OnIngameRequest(PacketReader Reader_, int Index_)
        {
            PacketWriter writer = new PacketWriter();
            reader = Reader_;

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_INGAME_ACCEPT);
            writer.AppendByte(0x01);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_LOADING_START);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            ushort characternamelen = reader.ReadWord();
            string charactername = reader.ReadString(false, characternamelen);

            int CharacterIndex = DatabaseCore.Character.GetIndexByName(charactername);
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(charactername);
            int[] CharacterMasteryIndex = DatabaseCore.Mastery.GetIndexByName(charactername, DatabaseCore.Character.Model[CharacterIndex] >= 14717);
            int CharacterSkillIndex = DatabaseCore.Skill.GetIndexByName(charactername);

            Player.General[Index_].CharacterName = DatabaseCore.Character.CharacterName[CharacterIndex];
            Player.General[Index_].CharacterID = DatabaseCore.Character.CharacterId[CharacterIndex];
            Player.General[Index_].UniqueID = DatabaseCore.Character.UniqueId[CharacterIndex];
            Player.Stats[Index_].HP = DatabaseCore.Character.HP[CharacterIndex];
            Player.Stats[Index_].MP = DatabaseCore.Character.MP[CharacterIndex];
            Player.Stats[Index_].CHP = DatabaseCore.Character.CHP[CharacterIndex];
            Player.Stats[Index_].CMP = DatabaseCore.Character.CMP[CharacterIndex];
            Player.Stats[Index_].Model = DatabaseCore.Character.Model[CharacterIndex];
            Player.Stats[Index_].Volume = DatabaseCore.Character.Volume[CharacterIndex];
            Player.Stats[Index_].Level = DatabaseCore.Character.Level[CharacterIndex];
            Player.Stats[Index_].Experience = DatabaseCore.Character.Experience[CharacterIndex];
            Player.Stats[Index_].Gold = DatabaseCore.Character.Gold[CharacterIndex];
            Player.Stats[Index_].Skillpoints = DatabaseCore.Character.SkillPoints[CharacterIndex];
            Player.Stats[Index_].Attributes = DatabaseCore.Character.Attributes[CharacterIndex];
            Player.Stats[Index_].BerserkBar = DatabaseCore.Character.BerserkBar[CharacterIndex];
            Player.Flags[Index_].Berserk = DatabaseCore.Character.Berserk[CharacterIndex];
            Player.Speeds[Index_].WalkSpeed = DatabaseCore.Character.WalkSpeed[CharacterIndex];
            Player.Speeds[Index_].RunSpeed = DatabaseCore.Character.RunSpeed[CharacterIndex];
            Player.Speeds[Index_].BerserkSpeed = DatabaseCore.Character.BerserkSpeed[CharacterIndex];
            Player.Stats[Index_].MinPhy = DatabaseCore.Character.MinPhy[CharacterIndex];
            Player.Stats[Index_].MaxPhy = DatabaseCore.Character.MaxPhy[CharacterIndex];
            Player.Stats[Index_].MinMag = DatabaseCore.Character.MinMag[CharacterIndex];
            Player.Stats[Index_].MaxMag = DatabaseCore.Character.MaxMag[CharacterIndex];
            Player.Stats[Index_].PhyDef = DatabaseCore.Character.PhyDef[CharacterIndex];
            Player.Stats[Index_].MagDef = DatabaseCore.Character.MagDef[CharacterIndex];
            Player.Stats[Index_].Hit = DatabaseCore.Character.Hit[CharacterIndex];
            Player.Stats[Index_].Parry = DatabaseCore.Character.Parry[CharacterIndex];
            Player.Stats[Index_].Strength = DatabaseCore.Character.Strength[CharacterIndex];
            Player.Stats[Index_].Intelligence = DatabaseCore.Character.Intelligence[CharacterIndex];
            Player.Stats[Index_].SkillpointBar = DatabaseCore.Character.SkillPointBar[CharacterIndex];
            Player.Flags[Index_].GM = DatabaseCore.Character.GM[CharacterIndex];
            Player.Flags[Index_].PvP = DatabaseCore.Character.PVP[CharacterIndex];
            Player.Position[Index_].XSector = DatabaseCore.Character.XSector[CharacterIndex];
            Player.Position[Index_].YSector = DatabaseCore.Character.YSector[CharacterIndex];
            Player.Position[Index_].X = DatabaseCore.Character.X[CharacterIndex];
            Player.Position[Index_].Y = DatabaseCore.Character.Z[CharacterIndex];
            Player.Position[Index_].Z = DatabaseCore.Character.Y[CharacterIndex];
            Player.General[Index_].MaxSlots = DatabaseCore.Character.MaxSlots[CharacterIndex];

            Player.Objects[Index_].ActiveBuffs = new Player._Objects._Buffs[20];
            Player.General[Index_].Busy = false;
            Player.General[Index_].State = 0;
            Player.Objects[Index_].UsingSkill = false;
            Player.Objects[Index_].NormalAttack = false;
            Player.Objects[Index_].SpawnedIndex = new List<int>();
            Player.Objects[Index_].SpawnedMonsterIndex = new List<int>();
            Player.Objects[Index_].SpawnedItemsIndex = new List<int>();

            Player.General[Index_].WeaponType = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[6]]).CLASS_C;

            if (DatabaseCore.Item.ItemId[CharacterItemIndex[8]] != 0)
                Player.Flags[Index_].WearingCape = true;

            for (byte i = 9; i < 13; i++)
            {
                if (DatabaseCore.Item.ItemId[CharacterItemIndex[i]] != 0)
                    Player.Stats[0].TotalAccessoriesAbsorption += Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[i]]).ABSORB_INC;
            }

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_CHARDATA);

            //writer.AppendDword(Player.Stats[Index_].Model);
            //8B 16 C7 C0
            //74 07 00 00
            //44
            writer.AppendByte(0x8B);
            writer.AppendByte(0x16);
            writer.AppendByte(0xC7);
            writer.AppendByte(0xC0);

            writer.AppendByte(0x74);
            //writer.AppendByte(Player.Stats[Index_].Volume);

            writer.AppendByte(0x07);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);

            writer.AppendByte(0x44);

            writer.AppendByte(Player.Stats[Index_].Level);
            writer.AppendByte(Player.Stats[Index_].Level);
            writer.AppendLword(Player.Stats[Index_].Experience);
            writer.AppendDword(Player.Stats[Index_].SkillpointBar);
            //writer.AppendWord(0);
            writer.AppendLword(Player.Stats[Index_].Gold);
            writer.AppendDword(Player.Stats[Index_].Skillpoints);
            writer.AppendWord(Player.Stats[Index_].Attributes);
            writer.AppendByte(Player.Stats[Index_].BerserkBar);
            writer.AppendDword(0);
            writer.AppendDword(Player.Stats[Index_].HP);
            writer.AppendDword(Player.Stats[Index_].MP);
            if (Player.Flags[Index_].GM == 1)
                writer.AppendByte(1);
            else
                writer.AppendByte((byte)(Player.Stats[Index_].Level < 20 ? 1 : 0));

            //Pk
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendDword(0);

            //Title
            writer.AppendByte(0);

            //Pvp
            writer.AppendByte(0);

            //Items
            writer.AppendByte(Player.General[Index_].MaxSlots);

            byte PlayerItemCount = 0;
            for (byte i = 0; i <= Player.General[Index_].MaxSlots; i++)
            {
                if (DatabaseCore.Item.ItemId[CharacterItemIndex[i]] != 0)
                    PlayerItemCount++;
            }
            writer.AppendByte(PlayerItemCount);

            for (byte i = 1; i <= Player.General[Index_].MaxSlots; i++)
            {
                if (DatabaseCore.Item.ItemId[CharacterItemIndex[i]] != 0)
                {
                    writer.AppendByte(i);
                    writer.AppendDword(DatabaseCore.Item.ItemId[CharacterItemIndex[i]]);
                    switch (DatabaseCore.Item.Type[CharacterItemIndex[i]])
                    {
                        case 0:
                            writer.AppendByte(DatabaseCore.Item.PlusValue[CharacterItemIndex[i]]);
                            writer.AppendLword(0);
                            writer.AppendDword(DatabaseCore.Item.Durability[CharacterItemIndex[i]]);
                            writer.AppendByte(DatabaseCore.Item.BlueAmount[CharacterItemIndex[i]]);
                            for (byte j = 0; j <= 8; j++)
                            {
                                if (DatabaseCore.Item.Blue[CharacterItemIndex[i]].Blue[j] != 0)
                                {
                                    writer.AppendDword(DatabaseCore.Item.Blue[CharacterItemIndex[i]].Blue[j]);
                                    writer.AppendDword(DatabaseCore.Item.Blue[CharacterItemIndex[i]].BlueAmount[j]);
                                }
                            }
                            break;
                        case 1:
                            writer.AppendWord(DatabaseCore.Item.Quantity[CharacterItemIndex[i]]);
                            break;
                        case 2:
                            writer.AppendByte(0);
                            writer.AppendWord(1);
                            break;
                    }
                }
            }

            //Avatar
            writer.AppendByte(5);

            //Load Items
            writer.AppendByte(0);

            //unk
            writer.AppendByte(0);

            //Job Mastery
            writer.AppendByte(0x0B);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);

            // Mastery
            for (byte i = 0; i < CharacterMasteryIndex.Length; i++)
            {
                if (DatabaseCore.Mastery.MasteryId[CharacterMasteryIndex[i]] != 0)
                {
                    writer.AppendByte(1);
                    writer.AppendDword(DatabaseCore.Mastery.MasteryId[CharacterMasteryIndex[i]]);
                    writer.AppendByte(DatabaseCore.Mastery.MasteryLevel[CharacterMasteryIndex[i]]);
                }
            }

            //Skills
            //writer.AppendWord(2); //unk

            for (int i = 1; i < DatabaseCore.Skill.SkillAmount[CharacterSkillIndex]; i++)
            {
                writer.AppendByte(1);
                writer.AppendDword(DatabaseCore.Skill.Skills[CharacterSkillIndex].SkillId[i]);
                writer.AppendByte(0);
            }

            writer.AppendByte(2); //unk

            // Quest
            /*
            writer.AppendWord(0);  // how many Quest ids completed/aborted
            writer.AppendDword(2); // Quest id
            writer.AppendByte(0);  // number of Quests that are live*/

            //writer.AppendByte(2);  // unk

            // Talisman
            //writer.AppendWord(0x01); //unk
            //writer.AppendWord(0x01); //unk
            //writer.AppendDword(0x00); //unk
            //writer.AppendDword(0x00); //unk

            // unk
            writer.AppendByte(0x00);
            writer.AppendByte(0x02);
            writer.AppendWord(0x01);
            writer.AppendDword(0x01);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendDword(0x00);

            //Position
            writer.AppendDword(Player.General[Index_].UniqueID);

            writer.AppendByte(Player.Position[Index_].XSector);
            writer.AppendByte(Player.Position[Index_].YSector);
            writer.AppendFloat(Player.Position[Index_].X);
            writer.AppendFloat(Player.Position[Index_].Z);
            writer.AppendFloat(Player.Position[Index_].Y);

            writer.AppendWord(0);  //Angle
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);  //Angle
            writer.AppendWord(0);
            writer.AppendByte(0);

            writer.AppendByte(Player.Flags[Index_].Berserk);
            //writer.AppendByte(0);  //unk
            writer.AppendFloat(Player.Speeds[Index_].WalkSpeed);
            writer.AppendFloat(Player.Speeds[Index_].RunSpeed);
            writer.AppendFloat(Player.Speeds[Index_].BerserkSpeed);

            writer.AppendByte(0); //ITEM_MALL_GOLD_TIME_SERVICE_TICKET_4W

            //Gm Name
            if (Player.Flags[Index_].GM == 1)
            {
                string gmname = string.Format("[GM]{0}", charactername);
                writer.AppendWord((ushort)gmname.Length);
                writer.AppendString(false, gmname);
            }
            else
            {
                writer.AppendWord((ushort)charactername.Length);
                writer.AppendString(false, charactername);
            }

            //Job System
            //Need Implement
            //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);
            //}

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(0);
            writer.AppendByte(0); //job type
            writer.AppendByte(1); //job level?
            writer.AppendLword(0); //job exp
            writer.AppendByte(0);
            writer.AppendByte(0);
            writer.AppendByte(0);
            writer.AppendByte(0);

            // Pvp pk state
            writer.AppendByte((byte)Player.Flags[Index_].PvP);

            // Guild Data
            //D3 02 A0 00 00 00 00 00
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);

            // AccountId + Gm Info
            writer.AppendDword(Player.General[Index_].AccountID);
            writer.AppendByte(Player.Flags[Index_].GM);

            // Bar Information
            writer.AppendByte(0x00);
            writer.AppendByte(0x00);

            //unk
            writer.AppendLword(0x00);

            // Academy
            writer.AppendByte(0);
            writer.AppendByte(0);
            writer.AppendWord(1);
            writer.AppendWord(1);
            writer.AppendByte(0);
            writer.AppendByte(2);

            ServerSocket.Send(writer.getWorkspace(), Index_);

            //Stats.OnStatPacket(Index_);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_LOADING_END);
            ServerSocket.Send(writer.getWorkspace(), Index_);

            //PlayerUnk1(Index_);
        }
Beispiel #48
0
        public static void OnSpawn(PacketReader reader_, int Index_)
        {
            int  MonsterIndex = Monsters.MonsterAmount;
            uint monsterid    = reader_.ReadDword();
            byte monstertype  = reader_.ReadByte();


            uint uniqueid = (uint)Monsters.MonsterAmount + 1000;

            if (monstertype == 1)
            {
                monstertype = 0;
            }

            Silkroad.Object_ tmpMonster = Silkroad.GetObjectById(monsterid);

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_SPAWN);

            writer.AppendDword(monsterid);
            writer.AppendDword(uniqueid);

            writer.AppendByte(Player.Position[Index_].XSector);
            writer.AppendByte(Player.Position[Index_].YSector);
            writer.AppendFloat(Player.Position[Index_].X);
            writer.AppendFloat(Player.Position[Index_].Z);
            writer.AppendFloat(Player.Position[Index_].Y);

            writer.AppendWord(0);
            writer.AppendByte(0);
            writer.AppendByte(1);
            writer.AppendByte(0);
            writer.AppendWord(0);
            writer.AppendWord(1);
            writer.AppendByte(0);

            writer.AppendFloat(tmpMonster.Speed);
            writer.AppendFloat(tmpMonster.Speed);
            writer.AppendFloat(tmpMonster.Speed);

            writer.AppendByte(0);
            writer.AppendByte(0);

            writer.AppendByte(monstertype);
            writer.AppendByte(1);
            byte[] tmpBuffer = writer.getWorkspace();
            //   ServerSocket.SendPacketInRange(writer.getWorkspace(),Index_);


            int   monsterhp = (int)tmpMonster.Hp;
            ulong exp       = tmpMonster.Exp;

            switch (monstertype)
            {
            case 2:
                monsterhp *= 2;
                exp       *= 2;
                break;

            case 3:
                exp *= 7;
                break;

            case 4:
                monsterhp *= 20;
                exp       *= 3;
                break;

            case 6:
                monsterhp *= 4;
                exp       *= 4;
                break;

            case 16:
                monsterhp *= 10;
                exp       *= 5;
                break;

            case 17:
                monsterhp *= 20;
                exp       *= 6;

                break;

            case 20:
                monsterhp *= 200;
                exp       *= 8;
                break;
            }

            Monsters.General[MonsterIndex].ID       = monsterid;
            Monsters.General[MonsterIndex].UniqueID = uniqueid;
            Monsters.General[MonsterIndex].Type     = monstertype;
            Monsters.General[MonsterIndex].HP       = monsterhp;
            Monsters.Position[MonsterIndex].XSector = Player.Position[Index_].XSector;
            Monsters.Position[MonsterIndex].YSector = Player.Position[Index_].YSector;
            Monsters.Position[MonsterIndex].X       = Player.Position[Index_].X;
            Monsters.Position[MonsterIndex].Z       = Player.Position[Index_].Z;
            Monsters.Position[MonsterIndex].Y       = Player.Position[Index_].Y;
            Monsters.General[MonsterIndex].Exp      = exp;
            Monsters.General[MonsterIndex].Level    = tmpMonster.Level;
            Monsters.General[MonsterIndex].Skills   = new ArrayList();
            Monsters.General[MonsterIndex].Dead     = false;

            for (int i = 0; i < Player.PlayersOnline; i++)
            {
                if (Player.General[i].CharacterID != 0)
                {
                    if (Formula.CalculateDistance(Monsters.Position[MonsterIndex], Player.Position[i]) <= 800)
                    {
                        ServerSocket.Send(tmpBuffer, i);
                        Player.Objects[i].SpawnedMonsterIndex.Add(MonsterIndex);
                    }
                }
            }


            uint[] skill = new uint[9];
            skill[0] = tmpMonster.Skill1;
            skill[1] = tmpMonster.Skill2;
            skill[2] = tmpMonster.Skill3;
            skill[3] = tmpMonster.Skill4;
            skill[4] = tmpMonster.Skill5;
            skill[5] = tmpMonster.Skill6;
            skill[6] = tmpMonster.Skill7;
            skill[7] = tmpMonster.Skill8;
            skill[8] = tmpMonster.Skill9;

            for (int i = 0; i <= 8; i++)
            {
                if (skill[i] != 0 && skill[i] <= 3000)
                {
                    Monsters.General[MonsterIndex].Skills.Add(skill[i]);
                }
            }

            Monsters.MonsterAmount++;

            if (monstertype == 3)
            {
                Unique.OnUnique(monsterid, false, null);
            }


            Timers.MonsterMovement[MonsterIndex].Interval = 5000;
            Timers.MonsterMovement[MonsterIndex].Start();
        }
Beispiel #49
0
        public static void OnUseItem(PacketReader reader, int Index_)
        {
            int[] CharacterItemIndex = DatabaseCore.Item.GetIndexByName(Player.General[Index_].CharacterName);
            byte  slot = reader.ReadByte();

            Silkroad.Item_ item = Silkroad.GetItemById(DatabaseCore.Item.ItemId[CharacterItemIndex[slot]]);

            if (DatabaseCore.Item.ItemId[CharacterItemIndex[slot]] >= 4 && DatabaseCore.Item.ItemId[CharacterItemIndex[slot]] <= 23)
            {
                if ((DatabaseCore.Item.Quantity[CharacterItemIndex[slot]] - 1) > 0)
                {
                    DatabaseCore.Item.Quantity[CharacterItemIndex[slot]]--;
                }
                else
                {
                    DeleteFromDatabase(CharacterItemIndex[slot]);
                    DatabaseCore.WriteQuery("DELETE FROM items WHERE itemnumber='item{0}' AND owner='{1}'", slot, Player.General[Index_].CharacterName);
                }

                PacketWriter writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ITEM_USE);
                writer.AppendByte(1);
                writer.AppendByte(slot);
                writer.AppendWord(DatabaseCore.Item.Quantity[CharacterItemIndex[slot]]);
                writer.AppendWord(reader.ReadWord());
                ServerSocket.Send(writer.getWorkspace(), Index_);

                writer = new PacketWriter();
                writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ANIMATION_POTION);
                writer.AppendDword(Player.General[Index_].UniqueID);
                if (item.ITEM_TYPE_NAME.Contains("HP") && !item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x04);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += item.USE_TIME;
                    Stats.HPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("HP") && item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x04);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += ((int)Player.Stats[Index_].HP * item.USE_TIME2 / 100);
                    Stats.HPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("MP") && !item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x0E);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CMP += item.USE_TIME3;
                    Stats.MPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("MP") && item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x0E);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CMP += ((int)Player.Stats[Index_].MP * item.USE_TIME4 / 100);
                    Stats.MPUpdate(Index_, false);
                }
                else if (item.ITEM_TYPE_NAME.Contains("ALL") && !item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x17);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += item.USE_TIME;
                    Player.Stats[Index_].CMP += item.USE_TIME3;
                    Stats.HPMPUpdate(Index_);
                }
                else if (item.ITEM_TYPE_NAME.Contains("ALL") && item.ITEM_TYPE_NAME.Contains("SPOTION"))
                {
                    writer.AppendDword(0x17);
                    ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

                    Player.Stats[Index_].CHP += ((int)Player.Stats[Index_].HP * item.USE_TIME2 / 100);
                    Player.Stats[Index_].CMP += ((int)Player.Stats[Index_].MP * item.USE_TIME4 / 100);
                    Stats.HPMPUpdate(Index_);
                }
            }
        }
Beispiel #50
0
        public static void NormalAttack(int Index_)
        {
            uint SkillId      = 0;
            byte AttackAmount = GetAmountAndSkillIdByWeaponType(Index_, ref SkillId);

            bool AttackingPlayer = false;

            for (int i = 0; i <= Player.PlayersOnline; i++)
            {
                if (Player.Objects[Index_].AttackingObjectId == Player.General[i].UniqueID)
                {
                    AttackingPlayer = true;
                }
            }

            int ObjectIndex = Players.GetObjectIndexAndType(Index_, Player.Objects[Index_].AttackingObjectId);

            Silkroad.Skill_ tmpAttackSkill = Silkroad.GetSkillById(SkillId);

            uint BasicAttackPower = 0;

            if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
            {
                BasicAttackPower = (uint)random.Next(Player.Stats[Index_].MinPhy, Player.Stats[Index_].MaxPhy);
            }
            else if (tmpAttackSkill.Type == Silkroad.TypeTable.Mag)
            {
                BasicAttackPower = (uint)random.Next(Player.Stats[Index_].MinMag, Player.Stats[Index_].MaxMag);
            }

            double SkillAttackPower  = 1; //cause its normal attack
            double SkillIncreaseRate = 0; // needs to be calculated from passive skills/active buffs

            double EnemyAbsorbation = 0;

            if (AttackingPlayer)
            {
                EnemyAbsorbation = Player.Stats[ObjectIndex].TotalAccessoriesAbsorption / (double)100;
            }

            double EnemyDefence = 0;

            if (AttackingPlayer)
            {
                if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                {
                    EnemyDefence = Player.Stats[ObjectIndex].PhyDef;
                }
                else if (tmpAttackSkill.Type == Silkroad.TypeTable.Mag)
                {
                    EnemyDefence = Player.Stats[ObjectIndex].MagDef;
                }
            }
            else
            {
                if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                {
                    EnemyDefence = Silkroad.GetObjectById(Monsters.General[ObjectIndex].ID).PhyDef;
                }
                else if (tmpAttackSkill.Type == Silkroad.TypeTable.Mag)
                {
                    EnemyDefence = Silkroad.GetObjectById(Monsters.General[ObjectIndex].ID).MagDef;
                }
            }

            double TotalDamageIncreaseRate = 0;//needs to be calculated from the players equipment

            double Damage = Formula.CalculateDmg(
                BasicAttackPower,
                SkillAttackPower,
                SkillIncreaseRate,
                EnemyAbsorbation,
                EnemyDefence,
                Player.Stats[Index_].Level,
                Player.Stats[Index_].Strength,
                Player.Stats[Index_].Intelligence,
                TotalDamageIncreaseRate,
                tmpAttackSkill.PwrPercent / (double)100);

            byte Critical = 0;

            Player.Objects[Index_].NormalAttack = true;

            if (Player.Objects[Index_].SelectedObjectType == 2)
            {
                Timers.MonsterMovement[ObjectIndex].Stop();
            }

            PacketWriter writer = new PacketWriter();

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_ATTACK);
            writer.AppendByte(1);
            writer.AppendByte(2);
            writer.AppendDword(SkillId);
            writer.AppendDword(Player.General[Index_].UniqueID);
            writer.AppendDword((uint)(random.Next(1000, 10000) + Player.General[Index_].UniqueID));
            writer.AppendDword(Player.Objects[Index_].AttackingObjectId);
            writer.AppendByte(1);
            writer.AppendByte(AttackAmount);
            writer.AppendByte(1);
            writer.AppendDword(Player.Objects[Index_].AttackingObjectId);

            byte afterstate = 0;

            for (int i = 1; i <= AttackAmount; i++)
            {
                if (tmpAttackSkill.Type == Silkroad.TypeTable.Phy)
                {
                    if (random.Next(1, 10) >= 7)
                    {
                        Damage  *= 2;
                        Critical = 2;
                    }
                }
                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    Monsters.General[ObjectIndex].HP -= (int)Damage;
                    if (Monsters.General[ObjectIndex].HP < 0)
                    {
                        afterstate = 0x80;
                        Monsters.General[ObjectIndex].HP = 0;
                    }
                }
                else if (Player.Objects[Index_].SelectedObjectType == 1)
                {
                    int tmpHp = (int)(Player.Stats[ObjectIndex].CHP - Damage);
                    if (tmpHp < 0)
                    {
                        afterstate = 0x80;
                        Player.Stats[ObjectIndex].CHP = 0;
                    }
                    else
                    {
                        Player.Stats[ObjectIndex].CHP -= (int)Damage;
                    }
                }

                writer.AppendByte(afterstate);
                writer.AppendByte(Critical);
                writer.AppendDword((uint)Damage);
                writer.AppendByte(0);
                writer.AppendWord(0);
            }

            ServerSocket.SendPacketIfPlayerIsSpawned(writer.getWorkspace(), Index_);

            Player.General[Index_].Busy          = true;
            Player.Objects[Index_].NormalAttack  = true;
            Timers.PlayerAttack[Index_].Interval = 1350.0;
            Timers.PlayerAttack[Index_].Start();


            if (afterstate == 0x80)
            {
                Player.Objects[Index_].AttackingObjectDeadID = Player.Objects[Index_].AttackingObjectId;

                Player.General[Index_].Busy = false;
                Timers.PlayerAttack[Index_].Stop();
                Player.Objects[Index_].NormalAttack = false;
                if (Player.Objects[Index_].SelectedObjectType == 1)
                {
                    Player.General[ObjectIndex].State        = 10;
                    Player.Objects[ObjectIndex].NormalAttack = false;
                    Player.General[ObjectIndex].Busy         = false;
                    Timers.PlayerAttack[ObjectIndex].Stop();

                    Character.Die(ObjectIndex);
                    Character.Die2(ObjectIndex);
                    Player.Flags[ObjectIndex].Dead = true;
                }
                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    Stats.GetBerserk(Index_, ObjectIndex);
                    Stats.GetXP(Index_, ObjectIndex);

                    if (Monsters.General[ObjectIndex].Type == 3)
                    {
                        Unique.OnUnique((uint)Monsters.General[ObjectIndex].ID, true, Player.General[Index_].CharacterName);
                    }

                    Monsters.General[ObjectIndex].Dead = true;

                    Timers.MonsterAttack[ObjectIndex].Stop();
                    Timers.MonsterDeath[Index_].Interval = 3000.0;
                    Timers.MonsterDeath[Index_].Start();
                }
            }
            else
            {
                if (Player.Objects[Index_].SelectedObjectType == 2)
                {
                    if (!Timers.MonsterAttack[ObjectIndex].Enabled)
                    {
                        Monsters.General[ObjectIndex].AttackingObjectIndex = Index_;
                        Timers.MonsterAttack[ObjectIndex].Interval         = 2350;
                        Timers.MonsterAttack[ObjectIndex].Start();
                    }
                }
            }
        }
Beispiel #51
0
        public static void OnTarget(PacketReader reader_, int Index_)
        {
            PacketWriter writer = new PacketWriter();
            uint ObjectId = reader_.ReadDword();

            int ObjectIndex = GetObjectIndexAndType(Index_,ObjectId);

            writer.SetOpcode(SERVER_OPCODES.GAME_SERVER_TARGET);
            if (ObjectId == Player.General[Index_].UniqueID)
            {
                writer.AppendWord(0x602);
                ServerSocket.Send(writer.getWorkspace(), Index_);
            }
            else
            {
                writer.AppendByte(1);
                writer.AppendDword(ObjectId);
                switch (Player.Objects[Index_].SelectedObjectType)
                {
                    case 1:
                        writer.AppendDword(0x10);
                        writer.AppendByte(4);
                        break;
                    case 2:
                        writer.AppendByte(1);
                        writer.AppendDword((uint)Monsters.General[ObjectIndex].HP);
                        if (Player.Flags[ObjectIndex].Dead)
                            writer.AppendByte(4);
                        else
                            writer.AppendDword(1);
                        break;
                }

                ServerSocket.Send(writer.getWorkspace(), Index_);
            }

            Player.Objects[Index_].SelectedObjectId = ObjectId;
        }