|
You last visited: Today at 05:01
Advertisement
calculating item % (white stats)
Discussion on calculating item % (white stats) within the SRO Coding Corner forum part of the Silkroad Online category.
10/03/2012, 18:48
|
#46
|
elite*gold: 0
Join Date: Jan 2009
Posts: 314
Received Thanks: 686
|
As i promised but a bit late.
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
}
}
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
|
#47
|
elite*gold: 0
Join Date: Jul 2009
Posts: 44
Received Thanks: 19
|
Quote:
Originally Posted by supermando
@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  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!
 is binary translator, that you can check it out. It helped me a lot.
Hope that helps.
|
|
|
03/16/2013, 22:44
|
#48
|
elite*gold: 0
Join Date: Feb 2008
Posts: 73
Received Thanks: 18
|
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
|
#49
|
elite*gold: 0
Join Date: Jul 2009
Posts: 44
Received Thanks: 19
|
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
|
#50
|
elite*gold: 1117
Join Date: Dec 2013
Posts: 858
Received Thanks: 806
|
umm it would be better if some one share it via sql query
|
|
|
02/14/2014, 17:29
|
#51
|
elite*gold: 60
Join Date: Jan 2010
Posts: 48
Received Thanks: 253
|
Quote:
Originally Posted by Alexiuns*
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
|
#52
|
elite*gold: 0
Join Date: Nov 2008
Posts: 14
Received Thanks: 1
|
--> Weapon
--> Armor
|
|
|
 |
|
Similar Threads
|
[Help]Editing Item Stats
12/21/2011 - Cabal Online - 2 Replies
Someone know how to make something like this?:
Thor's Screenshots - Xfire
Thor's Screenshots - Xfire
If you know please share...dont matter if it works on private server or official server!
|
Changing item stats
01/06/2011 - CO2 Private Server - 3 Replies
Hi all,
I got Kimo's source version 5095.
I want to change my item stats, I first thought that if i go into the database search for the item and then change it attack,defense etc etc it will change it in game to. So i went to cq_item and then searched for shield changed added some more defense and then saved after that I restarted the server so i want to look for the changes and i see that there are no changes. So my question is what am i doing wrong?
|
char stats, and item stats
01/27/2010 - Lineage 2 - 6 Replies
hi all
today.. on a private server. i made a verry strange exp.....
some clannies called me to come to HS to help for pvp
as i came there i seen mass pvp arround 30 ppl
all hitted 1 person ................
a S dagger
items drago set and AS
i watched it....
he needed for everyone just 1 or 2 hits
beamed arround like hell..
|
1 to +12 item stats any one?
11/29/2007 - Conquer Online 2 - 3 Replies
:confused: 1 to +12 item stats any one?
|
Unequip item but still keep its stats
09/28/2006 - World of Warcraft - 7 Replies
1) Get the spider's kiss dagger.
2) Get 2 other weapons.
3) Equip the skd in your main hand.
4) Put one weapon in your off hand.
5) The thrid weapon in your inventory.
6) Switch the main weapon with your off hand (skd should be in your off hand now)
7) Switch your skd with your inventory weapon.
Cool You should have the bonus of your skd even though its in your inventory.
|
All times are GMT +1. The time now is 05:01.
|
|