calculating item % (white stats)

10/03/2012 18:48 DaxterSoul#46
As i promised but a bit late.

[Only registered and activated users can see links. Click Here To Register...]
Code:
   public class WhiteStat
    {
        /*
         * Created by Daxter (2012) 
         * Credits to Stratti for his awesome code example
         */

        private ulong _value;
        public ulong Value
        {
            get
            {
                return _value;
            }
            set
            {
                _value = value;
                UpdateStats();
            }
        }

        private Types _type;
        public Types Type
        {
            get { return _type; }
            //set { _type = value; }
        }

        #region WhiteStat Fields

        //Weapon: Slot 0
        //Armor: Slot 0
        //Shield: Slot 0
        private byte _Durability;
        public byte Durability
        {
            get { return _Durability; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _Durability = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte DurabilityPercentage
        {
            get
            {
                return (byte)(_Durability * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _Durability = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Weapon: Slot 3
        private byte _HitRatio;
        public byte HitRatio
        {
            get { return _HitRatio; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _HitRatio = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte HitRatioPercentage
        {
            get
            {
                return (byte)(_HitRatio * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _HitRatio = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Armor: Slot 5
        private byte _ParryRatio;
        public byte ParryRatio
        {
            get { return _ParryRatio; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _ParryRatio = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte ParryRatioPercentage
        {
            get
            {
                return (byte)(_ParryRatio * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _ParryRatio = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Shield: Slot 3
        private byte _BlockRatio;
        public byte BlockRatio
        {
            get { return _BlockRatio; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _BlockRatio = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte BlockRatioPercentage
        {
            get
            {
                return (byte)(_BlockRatio * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _BlockRatio = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Weapon: Slot 6
        private byte _CriticalRatio;
        public byte CriticalRatio
        {
            get { return _CriticalRatio; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _CriticalRatio = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte CriticalRatioPercentage
        {
            get
            {
                return (byte)(_CriticalRatio * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _CriticalRatio = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Weapon: Slot 1
        //Armor: Slot 1
        //Shield: Slot 1
        private byte _PhyReinforce;
        public byte PhyReinforce
        {
            get { return _PhyReinforce; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _PhyReinforce = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte PhyReinforcePercentage
        {
            get
            {
                return (byte)(_PhyReinforce * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _PhyReinforce = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Weapon: Slot 2
        //Armor: Slot 2
        //Shield: Slot 2
        private byte _MagReinforce;
        public byte MagReinforce
        {
            get { return _MagReinforce; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _MagReinforce = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte MagReinforcePercentage
        {
            get
            {
                return (byte)(_MagReinforce * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _MagReinforce = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Weapon: Slot 4
        private byte _PhyAttack;
        public byte PhyAttack
        {
            get { return _PhyAttack; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _PhyAttack = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte PhyAttackPercentage
        {
            get
            {
                return (byte)(_PhyAttack * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _PhyAttack = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }


        //Weapon: Slot 5
        private byte _MagAttack;
        public byte MagAttack
        {
            get { return _MagAttack; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _MagAttack = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte MagAttackPercentage
        {
            get
            {
                return (byte)(_MagAttack * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _MagAttack = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Armor: Slot 3
        //Shield: Slot 4
        private byte _PhyDefense;
        public byte PhyDefense
        {
            get { return _PhyDefense; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _PhyDefense = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte PhyDefensePercentage
        {
            get
            {
                return (byte)(_PhyDefense * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _PhyDefense = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Armor: Slot 4
        //Shield: Slot 5
        private byte _MagDefense;
        public byte MagDefense
        {
            get { return _MagDefense; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _MagDefense = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte MagDefensePercentage
        {
            get
            {
                return (byte)(_MagDefense * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _MagDefense = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Accessory: Slot 0
        private byte _PhyAbsorb;
        public byte PhyAbsorb
        {
            get { return _PhyAbsorb; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _PhyAbsorb = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte PhyAbsorbPercentage
        {
            get
            {
                return (byte)(_PhyAbsorb * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _PhyAbsorb = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        //Accessory: Slot 1
        private byte _MagAbsorb;
        public byte MagAbsorb
        {
            get { return _MagAbsorb; }
            set
            {
                if (value <= 31) //less or equal 31
                {
                    _MagAbsorb = value;
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 31");
                }
            }
        }
        public byte MagAbsorbPercentage
        {
            get
            {
                return (byte)(_MagAbsorb * 100 / 31);
            }
            set
            {
                if (value <= 100)
                {
                    _MagAbsorb = (byte)(31f / 100f * (float)value);
                    UpdateValue();
                }
                else
                {
                    throw new System.ArgumentOutOfRangeException("value", "value must be less or equal to 100");
                }
            }
        }

        #endregion

        public WhiteStat(Types type)
        {
            this._type = type;
            this._value = 0;
            UpdateStats();
        }

        public WhiteStat(Types type, ulong input)
        {
            this._type = type;
            this._value = input;
            UpdateStats();
        }

        public WhiteStat(Types type, params byte[] stats)
        {
            this._type = type;
            switch (_type)
            {
                case Types.Weapon:
                    _Durability = stats[0];
                    _PhyReinforce = stats[1];
                    _MagReinforce = stats[2];
                    _HitRatio = stats[3];
                    _PhyAttack = stats[4];
                    _MagAttack = stats[5];
                    _CriticalRatio = stats[6];
                    break;
                case Types.Equipment:
                    _Durability = stats[0];
                    _PhyReinforce = stats[1];
                    _MagReinforce = stats[2];
                    _PhyDefense = stats[3];
                    _MagDefense = stats[4];
                    _ParryRatio = stats[5];
                    break;
                case Types.Shield:
                    _Durability = stats[0];
                    _PhyReinforce = stats[1];
                    _MagReinforce = stats[2];
                    _BlockRatio = stats[3];
                    _PhyDefense = stats[4];
                    _MagDefense = stats[5];
                    break;
                case Types.Accessory:
                    _PhyAbsorb = stats[0];
                    _MagAbsorb = stats[1];
                    break;       
            }
            UpdateValue();
        }

        private void UpdateStats()
        {
            ulong variance = this._value;
            byte counter = 0;
            switch (_type)
            {
                case Types.Weapon: //7 Slots           
                    #region Weapon
                    while (variance > 0)
                    {
                        byte stat = (byte)(variance & 0x1F);
                        switch (counter)
                        {
                            case 0: //Durability
                                _Durability = stat;
                                break;
                            case 1: //Physical Reinforce
                                _PhyReinforce = stat;
                                break;
                            case 2: //Magical Reinforce
                                _MagReinforce = stat;
                                break;
                            case 3: //Hit Ratio (Attack Ratio)
                                _HitRatio = stat;
                                break;
                            case 4: //Physical Attack
                                _PhyAttack = stat;
                                break;
                            case 5: //Magical Attack
                                _MagAttack = stat;
                                break;
                            case 6: //Critical Ratio
                                _CriticalRatio = stat;
                                break;
                        }

                        //left shit by 5
                        variance >>= 5;
                        counter++;
                    }
                    #endregion
                    break;
                case Types.Equipment: //6 Slots
                    #region Eqipment
                    while (variance > 0)
                    {
                        byte stat = (byte)(variance & 0x1F);
                        switch (counter)
                        {
                            case 0: //Durability
                                _Durability = stat;
                                break;
                            case 1: //Physical Reinforce
                                _PhyReinforce = stat;
                                break;
                            case 2: //Magical Reinforce
                                _MagReinforce = stat;
                                break;
                            case 3: //Physical Defense
                                _PhyDefense = stat;
                                break;
                            case 4: //Magical Defense
                                _MagDefense = stat;
                                break;
                            case 5: //Evasion Rate(Parry Rate)
                                _ParryRatio = stat;
                                break;
                        }

                        //left shit by 5
                        variance >>= 5;
                        counter++;
                    }
                    #endregion
                    break;
                case Types.Shield: //6 Slots
                    #region Shield
                    while (variance > 0)
                    {
                        byte stat = (byte)(variance & 0x1F);
                        switch (counter)
                        {
                            case 0: //Durability
                                _Durability = stat;
                                break;
                            case 1: //Physical Reinforce
                                _PhyReinforce = stat;
                                break;
                            case 2: //Magical Reinforce
                                _MagReinforce = stat;
                                break;
                            case 3: //Block Ratio
                                _BlockRatio = stat;
                                break;
                            case 4: //Physical Defense
                                _PhyDefense = stat;
                                break;
                            case 5://Magical Defense
                                _MagDefense = stat;
                                break;
                        }

                        //left shit by 5
                        variance >>= 5;
                        counter++;
                    }
                    #endregion
                    break;
                case Types.Accessory: //2 Slots
                    #region Shield
                    while (variance > 0)
                    {
                        byte stat = (byte)(variance & 0x1F);
                        switch (counter)
                        {
                            case 0: //Durability
                                _PhyAbsorb = stat;
                                break;
                            case 1: //Physical Reinforce
                                _MagAbsorb = stat;
                                break;
                        }

                        //left shit by 5
                        variance >>= 5;
                        counter++;
                    }
                    #endregion
                    break;
            }
        }

        private void UpdateValue()
        {
            ulong variance = 0;
            switch (_type)
            {
                case Types.Weapon:
                    variance |= _Durability;
                    variance <<= 5;
                    variance |= _PhyReinforce;
                    variance <<= 5;
                    variance |= _MagReinforce;
                    variance <<= 5;
                    variance |= _HitRatio;
                    variance <<= 5;
                    variance |= _PhyAttack;
                    variance <<= 5;
                    variance |= _MagAttack;
                    variance <<= 5;
                    variance |= _CriticalRatio;
                    break;
                case Types.Equipment:
                    variance |= _Durability;
                    variance <<= 5;
                    variance |= _PhyReinforce;
                    variance <<= 5;
                    variance |= _MagReinforce;
                    variance <<= 5;
                    variance |= _PhyDefense;
                    variance <<= 5;
                    variance |= _MagDefense;
                    variance <<= 5;
                    variance |= _ParryRatio;
                    break;
                case Types.Shield:
                    variance |= _Durability;
                    variance <<= 5;
                    variance |= _PhyReinforce;
                    variance <<= 5;
                    variance |= _MagReinforce;
                    variance <<= 5;
                    variance |= _BlockRatio;
                    variance <<= 5;
                    variance |= _PhyDefense;
                    variance <<= 5;
                    variance |= _MagDefense;
                    break;
                case Types.Accessory:
                    variance |= _PhyAbsorb;
                    variance <<= 5;
                    variance |= _MagAbsorb;
                    break;
            }
            _value = variance;
        }

        public override string ToString()
        {
            switch (_type)
            {
                case Types.Weapon:
                    return string.Format("Dura:{0}%, PhySpec:{1}%, MagSpec:{2}%, Hit:{3}%, PhyAtk:{4}%, MagAtk:{5}%, Crit:{6}%",
                        DurabilityPercentage, PhyReinforcePercentage, MagReinforcePercentage, HitRatioPercentage,
                        PhyAttackPercentage, MagAttackPercentage, CriticalRatioPercentage);
                case Types.Shield:
                    return string.Format("Dura:{0}%, PhySpec:{1}%, MagSpec:{2}%, Block:{3}%, PhyDef:{4}%, MagDef:{5}%",
                        DurabilityPercentage, PhyReinforcePercentage, MagReinforcePercentage, BlockRatioPercentage,
                        PhyDefensePercentage, MagDefensePercentage);
                case Types.Equipment:
                    return string.Format("Dura:{0}%, PhySpec:{1}%, MagSpec:{2}%, PhyDef:{3}%, MagDef:{4}%, ParryRate:{5}%",
                        DurabilityPercentage, PhyReinforcePercentage, MagReinforcePercentage, PhyDefensePercentage,
                        MagDefensePercentage, ParryRatioPercentage);
                case Types.Accessory:
                    return string.Format("PhyAbsorb:{0}%, MagAbsorb:{1}%", PhyAbsorbPercentage, MagAbsorbPercentage);
                default:
                    return string.Empty;
            }

        }

        //Replace this with your item class type
        public enum Types
        {
            Weapon,
            Equipment,
            Shield,
            Accessory
        }
    }
[Only registered and activated users can see links. Click Here To Register...]
Code:
Public Class WhiteStat
    ' Created by Daxter (2012) 
    ' Credits to Stratti for his awesome code example

    Private _value As ULong
    Public Property Value() As ULong
        Get
            Return _value
        End Get
        Set(value As ULong)
            _value = value
            UpdateStats()
        End Set
    End Property

    Private _type As Types
    Public ReadOnly Property Type() As Types
        Get
            Return _type
        End Get
    End Property

#Region "WhiteStat Fields"

    'Weapon: Slot 0
    'Armor: Slot 0
    'Shield: Slot 0
    Private _Durability As Byte
    Public Property Durability() As Byte
        Get
            Return _Durability
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _Durability = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property DurabilityPercentage() As Byte
        Get
            Return CByte(_Durability * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _Durability = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Weapon: Slot 3
    Private _HitRatio As Byte
    Public Property HitRatio() As Byte
        Get
            Return _HitRatio
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _HitRatio = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property HitRatioPercentage() As Byte
        Get
            Return CByte(_HitRatio * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _HitRatio = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Armor: Slot 5
    Private _ParryRatio As Byte
    Public Property ParryRatio() As Byte
        Get
            Return _ParryRatio
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _ParryRatio = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property ParryRatioPercentage() As Byte
        Get
            Return CByte(_ParryRatio * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _ParryRatio = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Shield: Slot 3
    Private _BlockRatio As Byte
    Public Property BlockRatio() As Byte
        Get
            Return _BlockRatio
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _BlockRatio = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property BlockRatioPercentage() As Byte
        Get
            Return CByte(_BlockRatio * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _BlockRatio = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Weapon: Slot 6
    Private _CriticalRatio As Byte
    Public Property CriticalRatio() As Byte
        Get
            Return _CriticalRatio
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _CriticalRatio = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property CriticalRatioPercentage() As Byte
        Get
            Return CByte(_CriticalRatio * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _CriticalRatio = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Weapon: Slot 1
    'Armor: Slot 1
    'Shield: Slot 1
    Private _PhyReinforce As Byte
    Public Property PhyReinforce() As Byte
        Get
            Return _PhyReinforce
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _PhyReinforce = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property PhyReinforcePercentage() As Byte
        Get
            Return CByte(_PhyReinforce * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _PhyReinforce = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Weapon: Slot 2
    'Armor: Slot 2
    'Shield: Slot 2
    Private _MagReinforce As Byte
    Public Property MagReinforce() As Byte
        Get
            Return _MagReinforce
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _MagReinforce = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property MagReinforcePercentage() As Byte
        Get
            Return CByte(_MagReinforce * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _MagReinforce = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Weapon: Slot 4
    Private _PhyAttack As Byte
    Public Property PhyAttack() As Byte
        Get
            Return _PhyAttack
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _PhyAttack = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property PhyAttackPercentage() As Byte
        Get
            Return CByte(_PhyAttack * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _PhyAttack = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property


    'Weapon: Slot 5
    Private _MagAttack As Byte
    Public Property MagAttack() As Byte
        Get
            Return _MagAttack
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _MagAttack = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property MagAttackPercentage() As Byte
        Get
            Return CByte(_MagAttack * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _MagAttack = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Armor: Slot 3
    'Shield: Slot 4
    Private _PhyDefense As Byte
    Public Property PhyDefense() As Byte
        Get
            Return _PhyDefense
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _PhyDefense = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property PhyDefensePercentage() As Byte
        Get
            Return CByte(_PhyDefense * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _PhyDefense = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Armor: Slot 4
    'Shield: Slot 5
    Private _MagDefense As Byte
    Public Property MagDefense() As Byte
        Get
            Return _MagDefense
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _MagDefense = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property MagDefensePercentage() As Byte
        Get
            Return CByte(_MagDefense * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _MagDefense = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Accessory: Slot 0
    Private _PhyAbsorb As Byte
    Public Property PhyAbsorb() As Byte
        Get
            Return _PhyAbsorb
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _PhyAbsorb = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property PhyAbsorbPercentage() As Byte
        Get
            Return CByte(_PhyAbsorb * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _PhyAbsorb = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

    'Accessory: Slot 1
    Private _MagAbsorb As Byte
    Public Property MagAbsorb() As Byte
        Get
            Return _MagAbsorb
        End Get
        Set(value As Byte)
            If value <= 31 Then
                'less or equal 31
                _MagAbsorb = value
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 31")
            End If
        End Set
    End Property
    Public Property MagAbsorbPercentage() As Byte
        Get
            Return CByte(_MagAbsorb * 100 \ 31)
        End Get
        Set(value As Byte)
            If value <= 100 Then
                _MagAbsorb = CByte(Math.Truncate(31.0F / 100.0F * CSng(value)))
                UpdateValue()
            Else
                Throw New System.ArgumentOutOfRangeException("value", "value must be less or equal to 100")
            End If
        End Set
    End Property

#End Region

    Public Sub New(type As Types)
        Me._type = type
        Me._value = 0
        UpdateStats()
    End Sub

    Public Sub New(type As Types, input As ULong)
        Me._type = type
        Me._value = input
        UpdateStats()
    End Sub

    Public Sub New(type As Types, ParamArray stats As Byte())
        Me._type = type
        Select Case _type
            Case Types.Weapon
                _Durability = stats(0)
                _PhyReinforce = stats(1)
                _MagReinforce = stats(2)
                _HitRatio = stats(3)
                _PhyAttack = stats(4)
                _MagAttack = stats(5)
                _CriticalRatio = stats(6)
                Exit Select
            Case Types.Equipment
                _Durability = stats(0)
                _PhyReinforce = stats(1)
                _MagReinforce = stats(2)
                _PhyDefense = stats(3)
                _MagDefense = stats(4)
                _ParryRatio = stats(5)
                Exit Select
            Case Types.Shield
                _Durability = stats(0)
                _PhyReinforce = stats(1)
                _MagReinforce = stats(2)
                _BlockRatio = stats(3)
                _PhyDefense = stats(4)
                _MagDefense = stats(5)
                Exit Select
            Case Types.Accessory
                _PhyAbsorb = stats(0)
                _MagAbsorb = stats(1)
                Exit Select
        End Select
        UpdateValue()
    End Sub

    Private Sub UpdateStats()
        Dim variance As ULong = Me._value
        Dim counter As Byte = 0
        Select Case _type
            Case Types.Weapon
                '7 Slots           
                '#Region "Weapon"
                While variance > 0
                    Dim stat As Byte = CByte(variance And &H1F)
                    Select Case counter
                        Case 0 'Durability
                            _Durability = stat
                            Exit Select
                        Case 1 'Physical Reinforce
                            _PhyReinforce = stat
                            Exit Select
                        Case 2 'Magical Reinforce
                            _MagReinforce = stat
                            Exit Select
                        Case 3 'Hit Ratio (Attack Ratio)
                            _HitRatio = stat
                            Exit Select
                        Case 4 'Physical Attack
                            _PhyAttack = stat
                            Exit Select
                        Case 5 'Magical Attack
                            _MagAttack = stat
                            Exit Select
                        Case 6 'Critical Ratio
                            _CriticalRatio = stat
                            Exit Select
                    End Select

                    'left shit by 5
                    variance >>= 5
                    counter += 1
                End While
                '#End Region
                Exit Select
            Case Types.Equipment
                '6 Slots
                '#Region "Eqipment"
                While variance > 0
                    Dim stat As Byte = CByte(variance And &H1F)
                    Select Case counter
                        Case 0 'Durability
                            _Durability = stat
                            Exit Select
                        Case 1 'Physical Reinforce
                            _PhyReinforce = stat
                            Exit Select
                        Case 2 'Magical Reinforce
                            _MagReinforce = stat
                            Exit Select
                        Case 3 'Physical Defense
                            _PhyDefense = stat
                            Exit Select
                        Case 4 'Magical Defense
                            _MagDefense = stat
                            Exit Select
                        Case 5 'Evasion Rate(Parry Rate)
                            _ParryRatio = stat
                            Exit Select
                    End Select

                    'left shit by 5
                    variance >>= 5
                    counter += 1
                End While
                '#End Region
                Exit Select
            Case Types.Shield
                '6 Slots
                '#Region "Shield"
                While variance > 0
                    Dim stat As Byte = CByte(variance And &H1F)
                    Select Case counter
                        Case 0 'Durability
                            _Durability = stat
                            Exit Select
                        Case 1 'Physical Reinforce
                            _PhyReinforce = stat
                            Exit Select
                        Case 2 'Magical Reinforce
                            _MagReinforce = stat
                            Exit Select
                        Case 3 'Block Ratio
                            _BlockRatio = stat
                            Exit Select
                        Case 4 'Physical Defense
                            _PhyDefense = stat
                            Exit Select
                        Case 5 'Magical Defense
                            _MagDefense = stat
                            Exit Select
                    End Select

                    'left shit by 5
                    variance >>= 5
                    counter += 1
                End While
                '#End Region
                Exit Select
            Case Types.Accessory
                '2 Slots
                '#Region "Shield"
                While variance > 0
                    Dim stat As Byte = CByte(variance And &H1F)
                    Select Case counter
                        Case 0 'Durability
                            _PhyAbsorb = stat
                            Exit Select
                        Case 1 'Physical Reinforce
                            _MagAbsorb = stat
                            Exit Select
                    End Select

                    'left shit by 5
                    variance >>= 5
                    counter += 1
                End While
                '#End Region
                Exit Select
        End Select
    End Sub

    Private Sub UpdateValue()
        Dim variance As ULong = 0
        Select Case _type
            Case Types.Weapon
                variance = variance Or _Durability
                variance <<= 5
                variance = variance Or _PhyReinforce
                variance <<= 5
                variance = variance Or _MagReinforce
                variance <<= 5
                variance = variance Or _HitRatio
                variance <<= 5
                variance = variance Or _PhyAttack
                variance <<= 5
                variance = variance Or _MagAttack
                variance <<= 5
                variance = variance Or _CriticalRatio
                Exit Select
            Case Types.Equipment
                variance = variance Or _Durability
                variance <<= 5
                variance = variance Or _PhyReinforce
                variance <<= 5
                variance = variance Or _MagReinforce
                variance <<= 5
                variance = variance Or _PhyDefense
                variance <<= 5
                variance = variance Or _MagDefense
                variance <<= 5
                variance = variance Or _ParryRatio
                Exit Select
            Case Types.Shield
                variance = variance Or _Durability
                variance <<= 5
                variance = variance Or _PhyReinforce
                variance <<= 5
                variance = variance Or _MagReinforce
                variance <<= 5
                variance = variance Or _BlockRatio
                variance <<= 5
                variance = variance Or _PhyDefense
                variance <<= 5
                variance = variance Or _MagDefense
                Exit Select
            Case Types.Accessory
                variance = variance Or _PhyAbsorb
                variance <<= 5
                variance = variance Or _MagAbsorb
                Exit Select
        End Select
        _value = variance
    End Sub

    Public Overrides Function ToString() As String
        Select Case _type
            Case Types.Weapon
                Return String.Format("Dura:{0}%, PhySpec:{1}%, MagSpec:{2}%, Hit:{3}%, PhyAtk:{4}%, MagAtk:{5}%, Crit:{6}%", DurabilityPercentage, PhyReinforcePercentage, MagReinforcePercentage, HitRatioPercentage, PhyAttackPercentage, _
                    MagAttackPercentage, CriticalRatioPercentage)
            Case Types.Shield
                Return String.Format("Dura:{0}%, PhySpec:{1}%, MagSpec:{2}%, Block:{3}%, PhyDef:{4}%, MagDef:{5}%", DurabilityPercentage, PhyReinforcePercentage, MagReinforcePercentage, BlockRatioPercentage, PhyDefensePercentage, _
                    MagDefensePercentage)
            Case Types.Equipment
                Return String.Format("Dura:{0}%, PhySpec:{1}%, MagSpec:{2}%, PhyDef:{3}%, MagDef:{4}%, ParryRate:{5}%", DurabilityPercentage, PhyReinforcePercentage, MagReinforcePercentage, PhyDefensePercentage, MagDefensePercentage, _
                    ParryRatioPercentage)
            Case Types.Accessory
                Return String.Format("PhyAbsorb:{0}%, MagAbsorb:{1}%", PhyAbsorbPercentage, MagAbsorbPercentage)
            Case Else
                Return String.Empty
        End Select

    End Function

    'Replace this with your item class type
    Public Enum Types
        Weapon
        Equipment
        Shield
        Accessory
    End Enum
End Class
Greetings, Daxter
03/16/2013 20:14 HardGroove#47
Quote:
Originally Posted by supermando View Post
@Stratti thanks but im still having some trouble

This is the stats of a weapon
Code:
73 06 50 D2 03 00 00 00
This is the actual stats from client
Code:
41% [Critical] 
28% [Mag Dmg]
15% [Phy Dmg]
0%  [Hit Rate]
3%  [Mag Rein]
61% [Phy Rein]
61% [Dura]
That's my tool's output
Code:
96% [Critical] 
58% [Mag Dmg]
32% [Phy Dmg]
0%  [Hit Rate]
9%  [Mag Rein]
22% [Phy Rein]
9%  [Dura]
If I used the stats in this [Only registered and activated users can see links. Click Here To Register...] my tool outputs exactly the same stats as pergian did.
pergian didn't show it fully! I manage to work it out.

here is how you can do it.

First you should take qword in full value (one number missing mess up the all stats)

your code:
00 00 70 C0 04 00 00 00

sro reads it reversed:
00 00 00 04 C0 70 00 00 (00000004C0700000)

now the first 6 zeros in this case is nothing, but in some cases few zeros might be important to get right values!

so as pergian did, showed it reversed and only part that is important:

04 C0 70 00 00, now its is converted to Binary:
00000100 11000000 01110000 00000000 00000000

reading this value from the right side and splinting it in 5:

00000 10011 00000 00111 00000 00000 00000 00000

first 00000 is not important so pergian removed it, result:

10011 00000 00111 00000 00000 00000 00000

now converting these 5bits binary in to dec, each 5 bits separated, you will get this:

19 0 7 0 0 0 0

and now using this formula as it was posted here:

(dec number) * (100/31) = (result in item)%

you will get correct result from your item! It worked for me perfectly! :)

[Only registered and activated users can see links. Click Here To Register...] is binary translator, that you can check it out. It helped me a lot.

Hope that helps.
03/16/2013 22:44 pergian#48
yes i know my first post isnt correct lol. thats why i posted here to get help and if you read all other posts from those other people you have the correct way.
03/16/2013 23:22 HardGroove#49
Anyway, only your post gave me question how you manage it, and your answer to the private message gave me what I wanted! Thanks for that! :)
02/12/2014 09:03 KingDollar#50
umm it would be better if some one share it via sql query
02/14/2014 17:29 Stratti#51
Quote:
Originally Posted by Alexiuns* View Post
umm it would be better if some one share it via sql query
Shouldn't be a problem to build your own query, based on our information.
03/19/2014 22:23 DanySahne#52
[Only registered and activated users can see links. Click Here To Register...]

--> Weapon
--> Armor