void ActionSkill()
{
try
{
Global.s_data.TargetTypes TargetType = Data.SkillBase[Character.Action.Skill.MainSkill].TargetType;
/*foreach (KeyValuePair<string, int> p in Data.SkillBase[Character.Action.Skill.MainSkill].Properties1)
{
Console.WriteLine("{0}", p.Key);
}*/
bool gotoTarget = false;
float x = 0, y = 0;
bool[] aRound = null;
if (!Character.Action.sAttack) return;
obj o = null;
Systems sys = null;
if (Character.Action.Object != null && Character.Action.Object.GetType().ToString() == "DarkEmu_GameServer.obj")
//&& (TargetType == Global.s_data.TargetTypes.MOB
// || TargetType == (Global.s_data.TargetTypes.MOB | Global.s_data.TargetTypes.PLAYER)
// || TargetType == (Global.s_data.TargetTypes.MOB | Global.s_data.TargetTypes.NOTHING)
// || TargetType == (Global.s_data.TargetTypes.MOB | Global.s_data.TargetTypes.PLAYER | Global.s_data.TargetTypes.NOTHING)))
{
o = Character.Action.Object as obj;
if (o.Die || o.GetDie || o.LocalType != 1) { Character.Action.sAttack = false; StopSkillTimer(); return; }
if (o.Agro == null) o.Agro = new List<_agro>();
x = (float)o.x;
y = (float)o.y;
aRound = o.aRound;
if (!o.Attacking)
o.AddAgroDmg(Character.Information.UniqueID, 1);
gotoTarget = true;
}
else if (o == null && Character.Action.Object != null && Character.Action.Object.GetType().ToString() == "DarkEmu_GameServer.Systems")
// && (TargetType == Global.s_data.TargetTypes.PLAYER
// || TargetType == Global.s_data.TargetTypes.PLAYER | TargetType == Global.s_data.TargetTypes.MOB
// || TargetType == Global.s_data.TargetTypes.PLAYER | TargetType == Global.s_data.TargetTypes.NOTHING
// || TargetType == Global.s_data.TargetTypes.PLAYER | TargetType == Global.s_data.TargetTypes.MOB | TargetType == Global.s_data.TargetTypes.NOTHING))
{
if (Data.SkillBase[Character.Action.Skill.MainSkill].canSelfTargeted && (Character.Action.Target == this.Character.Information.UniqueID))
{
if (Data.SkillBase[Character.Action.Skill.MainSkill].needPVPstate && Character.Information.PvP)
{ }
else
{
/* have to seek for error msg
client.Send(Packet.IngameMessages2(SERVER_ACTIONSTATE, IngameMessages.UIIT_STT_ERR_COMMON_INVALID_TARGET));*/
Character.Action.sAttack = false;
StopSkillTimer();
return;
}
sys = Character.Action.Object as Systems;
x = sys.Character.Position.x;
y = sys.Character.Position.y;
aRound = sys.Character.aRound;
gotoTarget = true;
}
else
{
/* have to seek for error msg
client.Send(Packet.IngameMessages2(SERVER_ACTIONSTATE, IngameMessages.UIIT_STT_ERR_COMMON_INVALID_TARGET));*/
Character.Action.sAttack = false;
StopSkillTimer();
return;
}
}
// no target TargetType = 3;
else if (Character.Action.Object == null
&& (TargetType == Global.s_data.TargetTypes.NOTHING
|| TargetType == Global.s_data.TargetTypes.NOTHING | TargetType == Global.s_data.TargetTypes.MOB
|| TargetType == Global.s_data.TargetTypes.NOTHING | TargetType == Global.s_data.TargetTypes.PLAYER
|| TargetType == Global.s_data.TargetTypes.NOTHING | TargetType == Global.s_data.TargetTypes.MOB | TargetType == Global.s_data.TargetTypes.PLAYER))
{
gotoTarget = false;
}
else
{
Character.Action.sAttack = false;
StopSkillTimer();
return;
}
// go to target
if (gotoTarget)
{
double distance = Formule.gamedistance(Character.Position.x,
Character.Position.y,
x,
y);
if (Character.Action.Skill.Distance == 0)
distance -= Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
else distance -= Character.Action.Skill.Distance;
if (distance >= 0)
{
float farkx = x;
float farky = y;
if (Character.Action.Skill.Distance == 0)
{
if (Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE <= 10)
if (Systems.aRound(ref aRound, ref farkx, ref farky))
{ Systems.aRound(ref farkx, ref farky, 1); }
}
Character.Position.wX = farkx - Character.Position.x; //- Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
Character.Position.wY = farky - Character.Position.y; //- Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
Character.Position.kX = Character.Position.wX;
Character.Position.kY = Character.Position.wY;
if (!Character.InGame) return;
Send(Packet.Movement(new DarkEmu_GameServer.Global.vektor(Character.Information.UniqueID,
(float)Formule.packetx((float)farkx, Character.Position.xSec),
(float)Character.Position.z,
(float)Formule.packety((float)farky, Character.Position.ySec),
Character.Position.xSec,
Character.Position.ySec)));
distance += Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
Character.Position.Time = (distance / (Character.Speed.RunSpeed * 0.0768)) * 1000.0;
Character.Position.RecordedTime = Character.Position.Time;
Character.Position.packetxSec = Character.Position.xSec;
Character.Position.packetySec = Character.Position.ySec;
Character.Position.packetX = (ushort)Formule.packetx((float)farkx, Character.Position.xSec);
Character.Position.packetY = (ushort)Formule.packety((float)farky, Character.Position.ySec);
Character.Position.Walking = true;
StartMovementTimer((int)(Character.Position.Time * 0.1));
return;
}
}
StartSkill();
}
catch (Exception ex)
{
Console.WriteLine("ActionSkill error {0}", ex);
Systems.Debugger.Write(ex);
}
}