Its not about the dragon gems or what ever, its about the damage calculation. The ninja skills are sent as thunder or like other 'normal' skills, so you have to modify the calculation process. Like:
if (SkillID <= 6011 && SkillID >= 6000)
Damage = Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
Anyway i kinda fixed it, how ever its not fixed, i`m still working on it.
Code:
/*
* Created by SharpDevelop.
* User: sams
* Date: 3/20/2009
* Time: 12:35 PM
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using CoEmu_v2_GameServer.Connections;
using CoEmu_v2_GameServer.Entities;
using CoEmu_v2_GameServer.Structs;
using CoEmu_v2_GameServer.Packets;
namespace CoEmu_v2_GameServer.Calculations
{
/// <summary>
/// Calculates damage to a character or monster.
/// </summary>
public partial class Calculation
{
public static int Damage(Character Attacker, Character Attacked, int AType, int SkillID, int SkillLevel)
{
if(Attacker.MinAttack > Attacker.MaxAttack)
{
return 0;
}
if(AType == 2)
{
int Damage = Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
Damage -= Attacked.Defense;
if(Attacked.Reborn == 1)
{
Damage = (int)Math.Floor(Damage*.7);
}
else if(Attacked.Reborn == 2)
{
Damage = (int)Math.Floor(Damage*.7);
if(Attacker.Reborn < 2)
Damage = (int)Math.Floor(Damage*.5);
}
double Tort = 0;
Tort += Attacked.NTG*0.02;
Tort += Attacked.RTG*0.04;
Tort += Attacked.STG*0.06;
Damage = (int)Math.Floor(Damage*(1-Tort));
if(Attacked.Bless > 0)
{
Damage = (int)Math.Floor(Damage * (1 - (Attacked.Bless*0.01)));
}
//TODO: Superman
if(Damage < 0)
Damage = 1;
if((Attacked.isGM || Attacked.isPM) && Attacked.Invincible)
Damage = 0;
Damage += (int)Attacker.PlusDamage;
Damage -= (int)Attacked.MinusDamage;
if (Damage < 2) Damage = 1;
return Damage;
}
else if(AType == 21)
{
int Damage = AddedMagicDamage(SkillID, SkillLevel);
if (SkillID <= 6011 && SkillID >= 6000)
Damage += Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
else
Damage += Attacker.MagicAttack;
if(Attacked.MagicDefense > 0)
{
double MDef = 1;
if(Attacked.MagicDefense < 90)
{
MDef = (Attacked.MagicDefense * 0.01);
}
else
{
MDef = (90 * 0.01);
}
Damage = (int)Math.Floor(Damage - (Damage*MDef));
}
Damage = Convert.ToInt32(Damage*0.75);
if(Attacked.Reborn == 1)
{
Damage = (int)Math.Floor(Damage*.7);
}
else if(Attacked.Reborn == 2)
{
Damage = (int)Math.Floor(Damage*.7);
if(Attacker.Reborn < 2)
Damage = (int)Math.Floor(Damage*.5);
}
Damage += Attacker.BonusMagicAttack;
Damage -= Attacked.BonusMagicDefense;
double Tort = 0;
Tort += Attacked.NTG*0.02;
Tort += Attacked.RTG*0.04;
Tort += Attacked.STG*0.06;
Damage = (int)Math.Floor(Damage*(1-Tort));
if(Attacked.Bless > 0)
{
Damage = (int)Math.Floor(Damage * (1 - (Attacked.Bless*0.01)));
}
if(Damage < 0)
Damage = 1;
if((Attacked.isGM || Attacked.isPM) && Attacked.Invincible)
Damage = 0;
Damage += (int)Attacker.PlusMagicDamage;
Damage -= (int)Attacked.MinusMagicDamage;
if (Damage < 2) Damage = 1;
return Damage;
}
else if(AType == 25)
{
int Damage = Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
if(Attacked.Dodge > 0)
{
double Dodge = 0;
if(Attacked.Dodge <= 94)
Dodge = Attacked.Dodge*0.01;
else
Dodge = 94*0.01;
Damage = (int)Math.Floor(Damage - (Damage*Dodge));
}
if(Attacked.Reborn == 1)
{
Damage = (int)Math.Floor(Damage*.7);
}
else if(Attacked.Reborn == 2)
{
Damage = (int)Math.Floor(Damage*.7);
if(Attacker.Reborn < 2)
Damage = (int)Math.Floor(Damage*.5);
}
Damage += Attacker.BonusMagicAttack;
Damage -= Attacked.BonusMagicDefense;
double Tort = 0;
Tort += Attacked.NTG*0.02;
Tort += Attacked.RTG*0.04;
Tort += Attacked.STG*0.06;
Damage = (int)Math.Floor(Damage*(1-Tort));
if(Attacked.Bless > 0)
{
Damage = (int)Math.Floor(Damage * (1 - (Attacked.Bless*0.01)));
}
if(Damage < 0)
Damage = 1;
if((Attacked.isGM || Attacked.isPM) && Attacked.Invincible)
Damage = 0;
Damage += (int)Attacker.PlusDamage;
Damage -= (int)Attacked.MinusDamage;
if (Damage < 2) Damage = 1;
return Damage;
}
return 0;
}
public static int Damage(Character Attacker, Monster Attacked, int AType, int MagicID, int MagicLevel)
{
if(Attacker.MinAttack > Attacker.MaxAttack)
{
return 0;
}
//TODO: Magic, Archer
if(AType == 2)
{
int Damage = Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
if(Attacked.Info.Name != "CoEmuGuard" && Attacked.Info.Name != "CoEmuPatrol" && Attacked.Info.Name != "GuildPatrol" && Attacked.Info.Name != "GuardReviver")
{
int Leveldiff = (Attacker.Level+2) - Attacked.Level;
int Damageadd = (int)Math.Floor(1 + (Leveldiff/5)*0.8);
if(Damageadd > 1)
Damage = Damageadd * Damage;
}
Damage -= Attacked.Info.Defense;
if(Damage < 0)
Damage = 1;
Damage += (int)Attacker.PlusDamage;
//TODO: Superman
return Damage;
}
else if (AType == 21)
{
int Damage = AddedMagicDamage(MagicID, MagicLevel); ;
if (MagicID <= 6011 && MagicID >= 6000)
Damage += Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
else
Damage += Attacker.MagicAttack;
if (Attacked.Info.MDefense > 0)
{
double MDef = (Attacked.Info.MDefense * 0.01);
Damage = (int)Math.Floor(Damage - (Damage * MDef));
}
if (Attacked.Info.Name != "CoEmuGuard" && Attacked.Info.Name != "CoEmuPatrol" && Attacked.Info.Name != "GuildPatrol" && Attacked.Info.Name != "GuardReviver")
{
int Leveldiff = (Attacker.Level + 2) - Attacked.Level;
int Damageadd = (int)Math.Floor(1 + (Leveldiff / 5) * 0.8);
if (Damageadd > 1)
Damage = Damageadd * Damage;
}
if (Damage < 0)
Damage = 1;
Damage += (int)Attacker.PlusDamage;
return Damage;
}
else if (AType == 25)
{
int Damage = Nano.Rand.Next(Attacker.MinAttack, Attacker.MaxAttack);
if (Attacked.Info.Dodge > 0)
{
double Dodge = Attacked.Info.Dodge * 0.01;
Damage = (int)Math.Floor(Damage - (Damage * Dodge));
}
if (Attacked.Info.Name != "CoEmuGuard" && Attacked.Info.Name != "CoEmuPatrol" && Attacked.Info.Name != "GuildPatrol" && Attacked.Info.Name != "GuardReviver")
{
int Leveldiff = (Attacker.Level + 2) - Attacked.Level;
int Damageadd = (int)Math.Floor(1 + (Leveldiff / 5) * 0.8);
if (Damageadd > 1)
Damage = Damageadd * Damage;
}
if (Damage < 0)
Damage = 1;
Damage += (int)Attacker.PlusDamage;
return Damage;
}
return 0;
}
}
}