Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 37 additions & 28 deletions Razor/Core/Targeting.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#region license
// Razor: An Ultima Online Assistant
// Copyright (c) 2022 Razor Development Community on GitHub <https://github.com/markdwags/Razor>
// Copyright (c) 2025 Razor Development Community on GitHub <https://github.com/markdwags/Razor>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -638,54 +638,63 @@ private static void LastHarmfulTargetChanged()
}
}

public static bool LastTargetWasSet => _lastTargetWasSet;

public static bool LastTargetWasSet
public static void SetLastTargetTo(Mobile m, byte flagType = 0)
{
get { return _lastTargetWasSet; }
}


public static void SetLastTargetTo(Mobile m)
{
SetLastTargetTo(m, 0);
}

public static void SetLastTargetTo(Mobile m, byte flagType)
{
TargetInfo targ = new TargetInfo();
_lastGroundTarget = _lastTarget = targ;
TargetInfo target = new TargetInfo();
_lastGroundTarget = _lastTarget = target;

if ((_hasTarget && _curFlags == 1) || flagType == 1)
_lastHarmTarget = targ;
{
_lastHarmTarget = target;
}
else if ((_hasTarget && _curFlags == 2) || flagType == 2)
_lastBeneTarget = targ;
{
_lastBeneTarget = target;
}
else if (flagType == 0)
_lastHarmTarget = _lastBeneTarget = targ;
{
_lastHarmTarget = _lastBeneTarget = target;
}

targ.Type = 0;
target.Type = 0;

if (_hasTarget)
targ.Flags = _curFlags;
{
target.Flags = _curFlags;
}
else
targ.Flags = flagType;
{
target.Flags = flagType;
}

targ.Gfx = m.Body;
targ.Serial = m.Serial;
targ.X = m.Position.X;
targ.Y = m.Position.Y;
targ.Z = m.Position.Z;
target.Gfx = m.Body;
target.Serial = m.Serial;
target.X = m.Position.X;
target.Y = m.Position.Y;
target.Z = m.Position.Z;

Client.Instance.SendToClient(new ChangeCombatant(m));
_lastCombatant = m.Serial;
World.Player.SendMessage(MsgLevel.Force, LocString.NewTargSet);

OverheadTargetMessage(targ);
OverheadTargetMessage(target);

bool wasSmart = Config.GetBool("SmartLastTarget");
bool wasSmart = IsSmartTargetingEnabled();

if (wasSmart)
{
Config.SetProperty("SmartLastTarget", false);
}

LastTarget();

if (wasSmart)
{
Config.SetProperty("SmartLastTarget", true);
}

LastTargetChanged();
}

Expand Down
202 changes: 1 addition & 201 deletions Razor/Core/TargetingClosest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#region license
// Razor: An Ultima Online Assistant
// Copyright (c) 2022 Razor Development Community on GitHub <https://github.com/markdwags/Razor>
// Copyright (c) 2025 Razor Development Community on GitHub <https://github.com/markdwags/Razor>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
Expand All @@ -16,11 +16,6 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#endregion

using System.Collections.Generic;
using Assistant.Core;
using Assistant.Filters;
using Assistant.Scripts;

namespace Assistant
{
public partial class Targeting
Expand Down Expand Up @@ -199,200 +194,5 @@ public static void TargetClosest()
{
ClosestTarget();
}

public static void ClosestTarget(params int[] noto)
{
if (!Client.Instance.AllowBit(FeatureBit.ClosestTargets))
return;

var list = new List<Mobile>();
foreach (var m in World.MobilesInRange(12))
if ((!FriendsManager.IsFriend(m.Serial) || noto.Length > 0 && noto[0] == 0) &&
!m.Blessed && !m.IsGhost && m.Serial != World.Player.Serial &&
!TargetFilterManager.IsFilteredTarget(m.Serial) &&
Utility.InRange(World.Player.Position, m.Position, Config.GetInt("LTRange")))
{
for (var i = 0; i < noto.Length; i++)
if (noto[i] == m.Notoriety)
{
list.Add(m);
break;
}

if (noto.Length == 0)
list.Add(m);
}

Mobile closest = null;
var closestDist = double.MaxValue;

foreach (var m in list)
{
var dist = Utility.DistanceSqrt(m.Position, World.Player.Position);

if (dist < closestDist || closest == null)
{
closestDist = dist;
closest = m;
}
}

if (closest != null)
{
SetLastTargetTo(closest);
ScriptManager.TargetFound = true;
}
else
{
World.Player.SendMessage(MsgLevel.Warning, LocString.TargNoOne);
}
}

public static void ClosestHumanoidTarget(params int[] noto)
{
if (!Client.Instance.AllowBit(FeatureBit.ClosestTargets))
return;

var list = new List<Mobile>();
foreach (var m in World.MobilesInRange(12))
{
if (m.Body != 0x0190 && m.Body != 0x0191 && m.Body != 0x025D && m.Body != 0x025E)
continue;

if ((!FriendsManager.IsFriend(m.Serial) || noto.Length > 0 && noto[0] == 0) &&
!m.Blessed && !m.IsGhost && m.Serial != World.Player.Serial &&
!TargetFilterManager.IsFilteredTarget(m.Serial) &&
Utility.InRange(World.Player.Position, m.Position, Config.GetInt("LTRange")))
{
for (var i = 0; i < noto.Length; i++)
if (noto[i] == m.Notoriety)
{
list.Add(m);
break;
}

if (noto.Length == 0)
list.Add(m);
}
}

Mobile closest = null;
var closestDist = double.MaxValue;

foreach (var m in list)
{
var dist = Utility.DistanceSqrt(m.Position, World.Player.Position);

if (dist < closestDist || closest == null)
{
closestDist = dist;
closest = m;
}
}

if (closest != null)
{
SetLastTargetTo(closest);
ScriptManager.TargetFound = true;
}
else
{
World.Player.SendMessage(MsgLevel.Warning, LocString.TargNoOne);
}
}

public static void ClosestMonsterTarget(params int[] noto)
{
if (!Client.Instance.AllowBit(FeatureBit.ClosestTargets))
return;

var list = new List<Mobile>();
foreach (var m in World.MobilesInRange(12))
{
if (!m.IsMonster)
continue;

if ((!FriendsManager.IsFriend(m.Serial) || noto.Length > 0 && noto[0] == 0) &&
!m.Blessed && !m.IsGhost && m.Serial != World.Player.Serial &&
!TargetFilterManager.IsFilteredTarget(m.Serial) &&
Utility.InRange(World.Player.Position, m.Position, Config.GetInt("LTRange")))
{
for (var i = 0; i < noto.Length; i++)
if (noto[i] == m.Notoriety)
{
list.Add(m);
break;
}

if (noto.Length == 0)
list.Add(m);
}
}

Mobile closest = null;
var closestDist = double.MaxValue;

foreach (var m in list)
{
var dist = Utility.DistanceSqrt(m.Position, World.Player.Position);

if (dist < closestDist || closest == null)
{
closestDist = dist;
closest = m;
}
}

if (closest != null)
{
SetLastTargetTo(closest);
ScriptManager.TargetFound = true;
}
else
{
World.Player.SendMessage(MsgLevel.Warning, LocString.TargNoOne);
}
}

public static void ClosestFriendTarget()
{
if (!Client.Instance.AllowBit(FeatureBit.ClosestTargets))
return;

var list = new List<Mobile>();
foreach (var m in World.MobilesInRange(12))
{
if (FriendsManager.IsFriend(m.Serial) && !m.Blessed && !m.IsGhost && m.Serial != World.Player.Serial &&
!TargetFilterManager.IsFilteredTarget(m.Serial) &&
Utility.InRange(World.Player.Position, m.Position, Config.GetInt("LTRange")))
{
list.Add(m);
}
}

Mobile closest = null;
var closestDist = double.MaxValue;

foreach (var m in list)
{
var dist = Utility.DistanceSqrt(m.Position, World.Player.Position);

if (dist < closestDist || closest == null)
{
closestDist = dist;
closest = m;
}
}

if (closest != null)
{
SetLastTargetTo(closest);
ScriptManager.TargetFound = true;
}
else
{
World.Player.SendMessage(MsgLevel.Warning, LocString.TargNoOne);
}
}
}
}
Loading
Loading