private void Handle() { if (To != null) { ushort seed = (ushort)Program.Randomizer.Next(0, 100); //we use one seed & base damage on it ushort Damage = (ushort)Program.Randomizer.Next(0, seed); bool Crit = seed >= 80; stance = (byte)(Program.Randomizer.Next(0, 3)); To.Damage(From, Damage); Handler9.SendAttackAnimation(From, _ToID, attackSpeed, stance); Handler9.SendAttackDamage(From, _ToID, Damage, Crit, GetHPLeft(), To.UpdateCounter); if (To.IsDead) { if (To is Mob && From is ZoneCharacter) { uint exp = (To as Mob).InfoServer.MonEXP; (From as ZoneCharacter).GiveEXP(exp, _ToID); } Handler9.SendDieAnimation(From, _ToID); State = AnimationState.Ended; To = null; } else { SetNewSequenceTime(attackSpeed); } } }
public void Update(DateTime now) { if (this.State == AnimationState.Ended) { return; } if (this.attacker == null || this.attacker.IsDead) { this.State = AnimationState.Ended; return; } if (!IsAoE && (this.victim == null || this.victim.IsDead)) { this.State = AnimationState.Ended; return; } if (this._nextAction > now) { return; } if (IsSkill) { if (IsAoE) { if (this.State == AnimationState.AoEShow) { Handler9.SendSkillPosition(attacker, AnimationID, skillid, X, Y); Handler9.SendSkillAnimationForPlayer(attacker, skillid, AnimationID); this._nextAction = Program.CurrentTime.AddMilliseconds(skillInfo.SkillAniTime); this.State = AnimationState.AoEDo; } else if (this.State == AnimationState.AoEDo) { // Lets create an AoE skill @ X Y List <SkillVictim> victims = new List <SkillVictim>(); var pos = new Vector2((int)X, (int)Y); // Find victims foreach (var v in attacker.Map.GetObjectsBySectors(attacker.MapSector.SurroundingSectors)) { if (attacker == v) { continue; } if (v is ZoneCharacter) { continue; } if (Vector2.Distance(v.Position, pos) > skillInfo.Range) { continue; } // Calculate dmg uint dmg = (uint)Program.Randomizer.Next((int)MinDamage, (int)MaxDamage); if (dmg > v.HP) { v.HP = 0; } if (!v.IsDead) { v.Attack(attacker); } else { if (v is Mob && attacker is ZoneCharacter) { uint exp = (v as Mob).InfoServer.MonEXP; (attacker as ZoneCharacter).GiveEXP(exp, v.MapObjectID); } } victims.Add(new SkillVictim(v.MapObjectID, dmg, v.HP, 0x01, 0x01, v.UpdateCounter)); if (victims.Count == skillInfo.MaxTargets) { break; } } Handler9.SendSkill(attacker, AnimationID, victims); foreach (var v in victims) { if (v.HPLeft == 0) { Handler9.SendDieAnimation(attacker, v.MapObjectID); } } victims.Clear(); State = AnimationState.Ended; } } else { // Normal skill parsing State = AnimationState.Ended; } } else { // Just attacking... if (victim == null || victim.IsDead) { victim = null; attacker = null; State = AnimationState.Ended; } else { // Calculate some damage to do ushort dmg = (ushort)Program.Randomizer.Next((int)MinDamage, (int)MaxDamage); if (dmg > victim.HP) { victim.HP = 0; } bool Crit = Program.Randomizer.Next() % 100 >= 80; byte stance = (byte)(Program.Randomizer.Next(0, 3)); victim.Damage(attacker, dmg); Handler9.SendAttackAnimation(attacker, victim.MapObjectID, attackspeed, stance); Handler9.SendAttackDamage(attacker, victim.MapObjectID, dmg, Crit, victim.HP, victim.UpdateCounter); if (victim.IsDead) { if (victim is Mob && attacker is ZoneCharacter) { uint exp = (victim as Mob).InfoServer.MonEXP; (attacker as ZoneCharacter).GiveEXP(exp, victim.MapObjectID); } Handler9.SendDieAnimation(attacker, victim.MapObjectID); victim = null; State = AnimationState.Ended; } else { _nextAction = now.AddMilliseconds(attackspeed); } } } }