Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

The Information Thread

Custom Title Activated
Loyal Member
Joined
May 18, 2006
Messages
2,065
Reaction score
14
The Information Thread
Topic Created By Nuklear and Content Pooped By KingIzu

LinksMyths and Facts
Myth: Dungeons are placed in very high/low places where we can't see them.
Fact: They're really on a separate map. Somewhat. It's very hard to explain.

Myth: Nuklear is homosexual.
Fact: Nuklear may have sometimes gone too far on his gay jokes. But, Nuklear is not, and will never be homosexual nor bisexual.
Packets
[Server] Init
Header: 18 00 2a
Body:
PHP:
(byte)0x47
(byte)0xa7
(byte)0xf6
(byte)0x16
(byte)first Key // for packet encryption
(byte)0xd4
(byte)0x4c
(byte)0x7e
(byte)0x44
(byte)0x4c
(byte)0x0d
(byte)0x2d
(byte)0x45
(byte)0x61
(byte)0x1e
(byte)0x00
(byte)0x00
(byte)0x?? //I really don't know what it is.
(byte)0x00
(byte)0x00
(byte)0x00
(byte)0x01
(byte)0x12
(byte)0xfc
[Client] Init
Header: 07 00 a3
Body:
PHP:
(byte)??
(byte)??
(byte)??
(byte)??
[Client] Login
Header: ?? ?? 02
Body:
PHP:
(Char Array)Username
(byte)0x00
(Char Array) Password
(byte)0x00
[Server] Login Error
Header: 04 00 2b
Body:
PHP:
(byte) Error
Errors:
PHP:
        UNDEFINED     = 0x01,
        WRONGID       = 0x02,
        WRONG_PASS    = 0x03,
        CONNECT_LATER = 0x04,
        BLOCKED       = 0x05,
        ID_EXPIRED    = 0x06,
        TOO_YOUNG     = 0x07,
        NOT_ALLOWED   = 0x08,
[Server] Character List
Header: ?? ?? 11
Body:
PHP:
(int) 0x00
(byte)0x00
(byte) Number of players

[Player Data]

(int)0x03
For each player:
Player Data:
PHP:
(int)Player ID
(Char Array) Player Name
(byte)0x00
(byte)Class
(byte)Level
(byte)0x00 // Don't know, could be meant like that.
(byte)Strength
(byte)Health
(byte)Intelligence
(byte)Wisdom
(byte)Agility
(byte)Face
(byte)Hair
(byte)Equipment count.

[Equipment]
For each equipment:
Player Data:
PHP:
(short)Index
[Server] Deleted Character List
Header: ?? ?? 19
Body:
PHP:
(byte)Number of deleted characters

[Deleted Character Data]
For each deleted character:
Deleted Character Data:
PHP:
(int)Player ID
(Char Array)Name
(byte)0x00
(byte)Level? //Could be class..
(byte)Class? //Could be level..
(byte)Days remaining
I'll add more, but right now I'm hungry.

If you actually know something:

Note: I made this months ago, so all of these below may not be correct.
PHP:
namespace KalServer.Connections.Packets
{
    internal enum LoginError
    {
        Undefined = 0x01,
        WrongID = 0x02,
        WrongPassword = 0x03,
        TryAgain = 0x04,
        Blocked = 0x05,
        Expired = 0x06,
        Young = 0x07,
        NotAllowed = 0x08,
        NoError = 0x09,
    }

    internal enum Effects
    {
        TakeMedicine = 0x01,
        LevelUp = 0x03,
        Rebirth = 0x04,
        PowerImpr = 0x05,
        DamageRed = 0x06,
        EBImpr = 0x07,
        AccuImpr = 0x08,
        EvaImpr = 0x09,
        PerfectDefense = 0x0A,
        HPAbsorb = 0x0B,
        TigerClaws = 0x0C,
        BearSkin = 0x0D,
        Wisdom = 0x0E,
        Foresight = 0x0F,
        EagleWings = 0x10,
        FishingStone = 0x12,
        EXPStone = 0x13,
        WealthStone = 0x14,
        LuckyKey = 0x15,
        LuckyStone = 0x16,
        LightningBlow = 0x21
    }

    internal enum Animation
    {

    }

    internal enum HitType
    {
        Normal = 0x01,
        Critical = 0x02,
        Miss = 0x00,
    }

    sealed class InitPacket : Packet
    {
        public InitPacket(byte FirstKey, byte Unknown)
            : base(0x2A, 0x00, 24)
        {
            WriteData((byte)0x47);
            WriteData((byte)0xa7);
            WriteData((byte)0xf6);
            WriteData((byte)0x16);
            WriteData(FirstKey);
            WriteData((byte)0xd4);
            WriteData((byte)0x4c);
            WriteData((byte)0x7e);
            WriteData((byte)0x44);
            WriteData((byte)0x4c);
            WriteData((byte)0x0d);
            WriteData((byte)0x2d);
            WriteData((byte)0x45);
            WriteData((byte)0x61);
            WriteData((byte)0x1e);
            WriteData((byte)0x00);
            WriteData((byte)0x00);
            WriteData(Unknown);
            WriteData((byte)0x00);
            WriteData((byte)0x00);
            WriteData((byte)0x00);
            WriteData((byte)0x01);
            WriteData((byte)0x12);
            WriteData((byte)0xfc);
        }
    }

    sealed class ConfirmSelectPacket : Packet
    {
        public ConfirmSelectPacket()
            : base(0x04, 1)
        {
            WriteData((byte)0x00);
        }
    }

    sealed class ELoginPacket : Packet
    {
        public ELoginPacket(LoginError Error)
            : base(0x2B,  1)
        {
            WriteData((byte)Error);
        }
    }

    sealed class CharacterDeletedListPacket : Packet
    {
        public CharacterDeletedListPacket(List<Character> Chars)
            : base(0x19)
        {
            short PacketSize = 1;

            foreach ( Character Char in Chars )
            {
                PacketSize += 8;
                PacketSize += Char.Name.Length;
            }

            WriteData( (byte) Chars.Count );

            foreach ( Character Char in Chars )
            {
                WriteData( (int)Char.ID );
                WriteData( Char.Name.ToCharArray( ) );
                WriteData( (byte) 0x00 );
                WriteData( (byte)Char.Level );
                WriteData( (byte)Char.Class );
                WriteData( (byte)Char.DaysRemaining );
            }
        }
    }

    sealed class ECreateCharacterPacket : Packet
    {
        public ECreateCharacterPacket()
            : base(0x2C,  1)
        {
            WriteData((byte)0x04);
        }
    }

    sealed class Check : Packet
    {
        public Check()
            : base(0x1E,  0)
        {

        }
    }

    sealed class UnknownPacket : Packet
    {
        public UnknownPacket( )
            : base( 0x16,  1 )
        {
            WriteData( 0x00 );
        }
    }

    sealed class UnknownPacket2 : Packet
    {
        public UnknownPacket2( )
            : base( 0x1C,  1 )
        {
            WriteData( (byte) 0x0b );
        }
    }

    sealed class CharacterListPacket : Packet
    {
        public CharacterListPacket(List<Character> Characters)
            : base(0x11)
        {
            short PacketSize = 10;
            for (byte i = 0; i < Characters.Count; i++)
            {
                //Saftey Measure
                if (i > 2)
                    break;

                PacketSize += (short)Characters[i].Name.Length;
                PacketSize += 19;
                PacketSize += (short)(Characters[i].Equipment.Count * 2);

            }

            Reset(PacketSize);

            WriteData((int)0x00);
            WriteData((byte)0x00);
            WriteData((byte)Characters.Count);

            for (byte i = 0; i < Characters.Count; i++)
            {
                WriteData(Characters[i].ID);
                WriteData(Characters[i].Name.ToCharArray());
                WriteData((byte)0x00);
                WriteData((byte)Characters[i].Class);
                WriteData(Characters[i].Level);
                WriteData((byte)0x00);
                WriteData(Characters[i].Strength);
                WriteData(Characters[i].Health);
                WriteData(Characters[i].Intelligence);
                WriteData(Characters[i].Wisdom);
                WriteData(Characters[i].Agility);
                WriteData((byte)Characters[i].Face);
                WriteData((byte)Characters[i].Hair);

                WriteData((byte)Characters[i].Equipment.Count);
                for (byte j = 0; j < Characters[i].Equipment.Count; j++)
                {
                    //Safety Measure
                    if (j > 4)
                        break;

                    WriteData(Characters[i].Equipment[j]);
                }
            }

            WriteData((int)0x03);
            Characters.Clear();
        }
    }

    sealed class PlayerInfoPacket : Packet
    {
        public PlayerInfoPacket(Character Player )
            : base( 0x42,  54 )
        {
            WriteData( Player.Job );
            WriteData( (short) 0x00 );
            WriteData( Player.Contribution );
            WriteData( Player.Strength );
            WriteData( Player.Health );
            WriteData( Player.Intelligence );
            WriteData( Player.Wisdom );
            WriteData( Player.Agility );
            WriteData( (short) Player.HP[0] );
            WriteData( (short) Player.HP[1] );
            WriteData( (short) Player.MP[0] );
            WriteData( (short) Player.MP[1] );
            WriteData( Player.OTP );
            WriteData( Player.Evasion );
            WriteData( Player.Defense );
            WriteData( Player.Absorption );
            WriteData( (int) Player.Exp );
            WriteData( (int) 0x00 );
            WriteData( (short) Player.PhysicalDamage[0] );
            WriteData( (short) Player.PhysicalDamage[1] );
            WriteData( (short) Player.MagicalDamage[0] );
            WriteData( (short) Player.MagicalDamage[1] );
            WriteData( Player.StatPoints );
            WriteData( Player.SkillPoints );
            WriteData( Player.FireResist );
            WriteData( Player.IceResist );
            WriteData( Player.LightningResist );
            WriteData( Player.CurseResist );
            WriteData( Player.NonElementResist );
            WriteData( Player.Rage );

        }
    }

    sealed class SendSkillsPacket : Packet
    {
        public SendSkillsPacket( Skills Skills )
            : base( 0x10)
        {
            Reset( 3 );

            WriteData( (byte) 1 ); // Skill Count

            WriteData( (byte) 0 ); // Skill ID
            WriteData( (byte) 1 ); // Skill Level
        }

    }

    sealed class PlayerSpawnPacket : Packet
    {
        public PlayerSpawnPacket( Character Char, bool IsPlayerChar )
            : base(0x32)
        {
            Reset((short) (59 + Char.Name.Length));

            WriteData( Char.ID );
            WriteData( Char.Name.ToCharArray( ) );
            WriteData( (byte) 0x00 );

            if ( IsPlayerChar )
                WriteData( (byte) 0x80 | (byte) Char.Class );
            else
                WriteData( (byte) Char.Class );

            WriteData( Char.Position.PositionX );
            WriteData( Char.Position.PositionY );
            WriteData( Char.Position.PositionZ );
            WriteData( (short) 0x02 );

            if ( Char.IsAlive )
                WriteData( (byte) 0x00 );
            else
                WriteData( (byte) 0x02 );

            WriteData( (byte) 0x00 );
            WriteData( (short) 0x00 );

            if ( Char.Inventory.Weapon != null )
                WriteData( Char.Inventory.Weapon.Index );
            else
                WriteData( (ushort) 0 );

            if ( Char.Inventory.Shield != null )
                WriteData( Char.Inventory.Shield.Index );
            else
                WriteData( (ushort) 0 );

            if ( Char.Inventory.Helmet != null )
                WriteData( Char.Inventory.Helmet.Index );
            else
                WriteData( (ushort) 0 );

            if ( Char.Inventory.Armor != null )
                WriteData( Char.Inventory.Armor.Index );
            else
                WriteData( (ushort) 0 );

            if ( Char.Inventory.Shorts != null )
                WriteData( Char.Inventory.Shorts.Index );
            else
                WriteData( (ushort) 0 );

            if ( Char.Inventory.Gloves != null )
                WriteData( Char.Inventory.Gloves.Index );
            else
                WriteData( (ushort) 0 );

            if ( Char.Inventory.Boots != null )
                WriteData( Char.Inventory.Boots.Index );
            else
                WriteData( (ushort) 0 );

            WriteData( (byte) Char.Face );
            WriteData( (byte) Char.Hair );

            for ( int i = 0; i < 19; i++ )
                WriteData( (byte) 0x00 );
        }
    }

    sealed class DespawnObjectPacket : Packet
    {
        public DespawnObjectPacket( int ID )
            : base( 0x38,  4 )
        {
            WriteData( ID );
        }

        internal sealed class DespawnPlayerPacket : Packet
        {
            public DespawnPlayerPacket( int ID )
                : base( 0x37,  4 )
            {
                WriteData( ID );
            }
        }

        internal sealed class RemoveDropPacket : Packet
        {
            public RemoveDropPacket( int ID )
                : base( 0x3b,  4 )
            {
                WriteData( ID );
            }
        }
        
    }

    sealed class Camera : Packet
    {
        public Camera( Character Player, ushort ID )
            : base( 0x1b,  10 )
        {
            WriteData( ID );
            WriteData( Player.Position.PositionX );
            WriteData( Player.Position.PositionY );
        }
    }

    sealed class SendInventoryPacket : Packet
    {
        public SendInventoryPacket( Inventory PlayerInventory )
            : base( 0x04)
        {
            List<Item> Inventory = PlayerInventory.GetAllItems();
            Reset( (short) ((Inventory.Count * 26) + 1) );
            WriteData((byte)Inventory.Count));

            foreach ( Item Slot in Inventory )
            {
                WriteData( Slot.ID );
                WriteData( Slot.Index );
                WriteData( Slot.Prefix );
                WriteData( Slot.Info );
                WriteData( Slot.Count );
                WriteData( Slot.MaxEndurance );
                WriteData( Slot.CurrentEndurance );
                WriteData( Slot.SetGem );
                WriteData( Slot.AttackUP );
                WriteData( Slot.MagicUP );
                WriteData( Slot.DefenseUP );
                WriteData( Slot.OTPUP );
                WriteData( Slot.EvasionUP );
                WriteData( Slot.Polished );
                WriteData( Slot.EBLevel );
                WriteData( Slot.EBRate );
            }
        }
    }

    abstract class EditValuePacket : Packet
    {
        private EditValuePacket( short Size, byte ValueID )
            : base( 0x45)
        {
            Reset((short)(Size + 1));
            WriteData( ValueID );
        }

        sealed internal class ChangeLevelPacket : EditValuePacket
        {
            public ChangeLevelPacket( byte NewLevel )
                : base( 1, 0x1a )
            {
                WriteData( NewLevel );
            }
        }

        sealed internal class ChangeRageExpPacket : EditValuePacket
        {
            public ChangeRageExpPacket( int RageIncrease, int ExpIncrease )
                : base( 16, 0x19 )
            {
                WriteData( RageIncrease );
                WriteData( (int) 0x00 );
                WriteData( ExpIncrease );
                WriteData( (int) 0x00 );
            }
        }

        sealed internal class ChangeHealthPacket : EditValuePacket
        {
            public ChangeHealthPacket( short CurrentHealth, short MaxHealth )
                : base( 4, 0x05 )
            {
                WriteData( CurrentHealth );
                WriteData( MaxHealth );
            }
        }

        sealed internal class ChangeManaPacket : EditValuePacket
        {
            public ChangeManaPacket( short CurrentMana, short MaxMana )
                : base( 4, 0x06 )
            {
                WriteData( CurrentMana );
                WriteData( MaxMana );
            }
        }

        sealed internal class ChangePhysicalAttackPacket : EditValuePacket
        {
            public ChangePhysicalAttackPacket( short Min, short Max )
                :base( 4, 0x1b )
            {
                WriteData( Min );
                WriteData( Max );
            }
        }

        sealed internal class ChangeStatPointsPacket : EditValuePacket
        {
            public ChangeStatPointsPacket( short StatPoints )
                : base( 2, 0x17 )
            {
                WriteData( StatPoints );
            }
        }

        sealed internal class ChangeSkillPointsPacket : EditValuePacket
        {
            public ChangeSkillPointsPacket( short SkillPoints )
                : base( 2, 0x18 )
            {
                WriteData( SkillPoints );
            }
        }

        abstract internal class ChangeStatsPacket : EditValuePacket
        {
            private ChangeStatsPacket( short Size, byte ValueID ) : base( Size, ValueID ) { }

            sealed internal class StrengthPacket : ChangeStatsPacket
            {

                public StrengthPacket( byte Strength, short OTP, short MinPhys, short MaxPhys )
                    : base( 7, 0x00 )
                {
                    WriteData( Strength );
                    WriteData( OTP );
                    WriteData( MinPhys );
                    WriteData( MaxPhys );
                }
            }

            sealed internal class HealthPacket : ChangeStatsPacket
            {
                public HealthPacket( byte Health, short CurrentHP, short MaxHP, short NonElementalResistance )
                    : base( 7, 0x01 )
                {
                    WriteData( Health );
                    WriteData( CurrentHP );
                    WriteData( MaxHP );
                    WriteData( NonElementalResistance );
                }
            }

            sealed internal class IntPacket : ChangeStatsPacket
            {
                public IntPacket( byte Int, short MinMagic, short MaxMagic, short FireResistance, short IceResistance, short LightningResistance )
                    : base( 11, 0x02 )
                {
                    WriteData( Int );
                    WriteData( MinMagic );
                    WriteData( MaxMagic );
                    WriteData( FireResistance );
                    WriteData( IceResistance );
                    WriteData( LightningResistance );
                }
            }

            sealed internal class WisdomPacket : ChangeStatsPacket
            {
                public WisdomPacket( byte Wisdom, short CurrentMP, short MaxMP, short CurseResistance )
                    : base( 7, 0x03 )
                {
                    WriteData( Wisdom );
                    WriteData( CurrentMP );
                    WriteData( MaxMP );
                    WriteData( CurseResistance );

                }
            }

            sealed internal class AgilityPacket : ChangeStatsPacket
            {
                public AgilityPacket( byte Agility, short OTP, short Evasion, short MinPhys, short MaxPhys )
                    : base( 7, 0x03 )
                {
                    WriteData( Agility );
                    WriteData( OTP );
                    WriteData( Evasion );
                    WriteData( MinPhys );
                    WriteData( MaxPhys );

                }
            }
        }

        sealed internal class ChangeCurrentHPPacket : EditValuePacket
        {
            public ChangeCurrentHPPacket( short CurrentHP )
                : base( 2, 0x07 )
            {
                WriteData( CurrentHP );
            }
        }

        sealed internal class ChangeCurrentMPPacket : EditValuePacket
        {
            public ChangeCurrentMPPacket( short CurrentMP )
                : base( 2, 0x08 )
            {
                WriteData( CurrentMP );
            }
        }

        sealed internal class ChangeOTPPacket : EditValuePacket
        {
            public ChangeOTPPacket( short OTP )
                : base( 2, 0x09 )
            {
                WriteData( OTP );
            }
        }

        sealed internal class ChangeMinPhysAttackPacket : EditValuePacket
        {
            public ChangeMinPhysAttackPacket( short MinAttack )
                : base( 2, 0x0b )
            {
                WriteData( MinAttack );
            }
        }

        sealed internal class ChangeMaxPhysAttackPacket : EditValuePacket
        {
            public ChangeMaxPhysAttackPacket( short MaxAttack )
                : base( 2, 0x0c )
            {
                WriteData( MaxAttack );
            }
        }

    }

    sealed class ShowEffectPacket : Packet
    {
        public ShowEffectPacket( int PlayerID, Effects Effect )
            : base( 0x49,  5 )
        {
            WriteData( PlayerID );
            WriteData( (byte) Effect );
        }
    }

    abstract class ShowAnimationPacket : Packet
    {
        private ShowAnimationPacket( short Size ) : base( 0x3d) { Reset(Size); }

        sealed internal class ShowMonsterAnimationPacket : ShowAnimationPacket
        {
            public ShowMonsterAnimationPacket( int MonsterID, Animation Anim )
                : base(5)
            {
                WriteData( MonsterID );
                WriteData( (byte) Anim );
            }
        }

        sealed internal class ShowPlayerSitAnimationPacket : ShowAnimationPacket
        {
            public ShowPlayerSitAnimationPacket( int PlayerID, bool Sitting )
                : base( 5 )
            {
                WriteData( PlayerID );
                WriteData( (byte) 0x03 );
                WriteData( Sitting );
            }
        }


    }

    sealed class DressPacket : Packet
    {
        public DressPacket( int PlayerID, uint ItemID, ushort ItemIndex )
            : base( 0x05,  10 )
        {
            WriteData( PlayerID );
            WriteData( ItemID );
            WriteData( ItemIndex );
        }
    }

    sealed class UndressPacket : Packet
    {
        public UndressPacket( int PlayerID, uint ItemID, ushort ItemIndex )
            : base( 0x06,  10 )
        {
            WriteData( PlayerID );
            WriteData( ItemID );
            WriteData( ItemIndex );
        }
    }

    sealed class ChatPacket : Packet
    {
        public ChatPacket( string Name, string Message )
            : base( 0x3c)
        {
            Reset( (short) (Name.Length + Message.Length + 2) );
            WriteData( Name.ToCharArray( ) );
            WriteData( (byte) 0x00 );
            WriteData( Message.ToCharArray( ) );
            WriteData( (byte) 0x00 );
        }
    }

    sealed class UnavailablePlayerPacket : Packet
    {
        public UnavailablePlayerPacket( )
            : base( 0x43,  1 )
        {
            WriteData( (byte) 0x19 );
        }
    }

    sealed class NoticePacket : Packet
    {
        public NoticePacket( string Notice )
            :base(0x0f)
        {
            WriteData( Notice.ToCharArray( ) );
            WriteData( (byte) 0x00 );
        }
    }

    sealed class PlayerMovePacket : Packet
    {
        public PlayerMovePacket( int PlayerID, sbyte X, sbyte Y, sbyte Z )
            : base( 0x23,  7 )
        {
            WriteData( (uint) PlayerID );
            WriteData( X );
            WriteData( Y );
            WriteData( Z );
        }
    }

    sealed class MonsterSpawnPacket : Packet
    {
        public MonsterSpawnPacket( Monster Monster )
            : base(0x33,  41)
        {
           
            WriteData( Monster.Index );
            WriteData( Monster.ID );
            WriteData( Monster.Position.PositionX );
            WriteData( Monster.Position.PositionY );

            WriteData((short) 0x02);

            WriteData( Monster.HP[0] );
            WriteData( Monster.HP[1] );

            WriteData( (int) 0x00 );
            WriteData( (int) 0x00 );
            WriteData( (int) 0x00 );
            WriteData( (int) 0x00 );
            WriteData( (byte) 0x00 );

        }
    }

    sealed class DeleteItemPacket : Packet
    {
        public DeleteItemPacket( uint ItemID )
            : base( 0x08,  5 )
        {
            WriteData( ItemID );
            WriteData( (byte) 0x04 );
        }
    }

    sealed class EnchantItemPacket : Packet
    {
        public EnchantItemPacket( uint ItemID, ushort ItemIndex, byte Prefix, byte CurrentEndruance, byte MaximumEndurance )
            : base( 0x5c,  26 )
        {
            WriteData( ItemID );
            WriteData( ItemIndex );
            WriteData( Prefix );
            WriteData( (int) 0x00 );
            WriteData( (int) 0x01 );
            WriteData( CurrentEndruance );
            WriteData( MaximumEndurance );
            WriteData( (long) 0x00 );
            WriteData( (byte) 0x00 );

        }
    }

    sealed class FailEnchantItemPacket : Packet
    {
        public FailEnchantItemPacket( )
            : base( 0x43,  1 )
        {
            WriteData( (byte) 0x36 );
        }       
    }

    abstract internal class ItemAlterPacket : Packet
    {
        private ItemAlterPacket( ) : base( 0x09,  9 ) { }

        internal sealed class EnchanterItemAlterPacket : ItemAlterPacket
        {
            public EnchanterItemAlterPacket( uint ItemID, int Amount )
            {
                WriteData( ItemID );
                WriteData( Amount );
                WriteData( (byte) 0x15 );
            }
        }

        internal sealed class GeonAlterPacket : ItemAlterPacket
        {
            public GeonAlterPacket( uint ItemID, int Amount )
            {
                WriteData( ItemID );
                WriteData( Amount );
                WriteData( (byte) 0x0b );
            }
        }
    }

    sealed class EditSkillPacket : Packet
    {
        public EditSkillPacket( byte SkillID, byte Level )
            : base( 0x51,  2 )
        {
            WriteData( SkillID );
            WriteData( Level );
        }

    }

    sealed class SpawnDropPacket : Packet
    {
        public SpawnDropPacket( ushort Index, int DropID, int PositionX, int PositionY, int Amount )
            : base( 0x36,  18 )
        {
            WriteData( Index );
            WriteData( DropID );
            WriteData( PositionX );
            WriteData( PositionY );
            WriteData( Amount );
        }
    }

}
 
Last edited by a moderator:
Back
Top