diff --git a/Projects/UOContent/Engines/Character Creation/CharacterCreation.cs b/Projects/UOContent/Engines/Character Creation/CharacterCreation.cs
index 673ece973..d69eee4b3 100644
--- a/Projects/UOContent/Engines/Character Creation/CharacterCreation.cs
+++ b/Projects/UOContent/Engines/Character Creation/CharacterCreation.cs
@@ -100,8 +100,8 @@ public static partial class CharacterCreation
public static readonly CityInfo[] NewHavenStartingCities =
[
- new("Fairwinds", "The Bountiful Harvest Inn", 1150168, 2272, 2812, 0, Map.Trammel),
new("Bastion", "The Wayfarer's Inn", 1075074, 1839, 2004, 0, Map.Trammel),
+ new("Fairwinds", "The Bountiful Harvest Inn", 1150168, 2272, 2812, 0, Map.Trammel),
];
public static readonly CityInfo[] StartingCitiesSA =
diff --git a/Projects/UOContent/Gumps/StatusBar.cs b/Projects/UOContent/Gumps/StatusBar.cs
index 9048acc15..2a409f63a 100644
--- a/Projects/UOContent/Gumps/StatusBar.cs
+++ b/Projects/UOContent/Gumps/StatusBar.cs
@@ -68,29 +68,27 @@ namespace Server.Custom.UI
if (m_IsVertical)
{
- AddBackground(0, 0, 150, 200, 9270);
+ AddBackground(0, 0, 150, 175, 9270);
AddHtml(15, 15, 120, 20, $"Fame: {pm.Fame}", false, false);
AddHtml(15, 40, 120, 20, $"Karma: {pm.Karma}", false, false);
AddHtml(15, 65, 120, 20, $"Hunger: {pm.Hunger}/20", false, false);
AddHtml(15, 90, 120, 20, $"Thirst: {pm.Thirst}/20", false, false);
AddHtml(15, 115, 120, 20, $"Tithing: {pm.TithingPoints}", false, false);
- AddHtml(15, 140, 120, 20, $"Kills: {pm.MonsterKillPoints}", false, false);
- AddButton(115, 167, 9720, 9722, 2, GumpButtonType.Reply, 0);
+ AddButton(115, 142, 9720, 9722, 2, GumpButtonType.Reply, 0);
}
else
{
- AddBackground(0, 0, 650, 45, 9270);
+ AddBackground(0, 0, 550, 45, 9270);
AddHtml(15, 12, 110, 20, $"Fame: {pm.Fame}", false, false);
AddHtml(110, 12, 110, 20, $"Karma: {pm.Karma}", false, false);
AddHtml(215, 12, 110, 20, $"Hunger: {pm.Hunger}/20", false, false);
AddHtml(315, 12, 110, 20, $"Thirst: {pm.Thirst}/20", false, false);
AddHtml(410, 12, 110, 20, $"Tithing: {pm.TithingPoints}", false, false);
- AddHtml(510, 12, 110, 20, $"Kills: {pm.MonsterKillPoints}", false, false);
- AddButton(625, 15, 9720, 9722, 2, GumpButtonType.Reply, 0);
+ AddButton(525, 15, 9720, 9722, 2, GumpButtonType.Reply, 0);
}
}
diff --git a/Projects/UOContent/Mobiles/BaseCreature.cs b/Projects/UOContent/Mobiles/BaseCreature.cs
index 7d0174ef8..467b3a8ef 100644
--- a/Projects/UOContent/Mobiles/BaseCreature.cs
+++ b/Projects/UOContent/Mobiles/BaseCreature.cs
@@ -3453,17 +3453,6 @@ namespace Server.Mobiles
Paragon.GiveArtifactTo(mob);
}
}
- if (mob is PlayerMobile player)
- {
- int points = this.Fame / 200;
-
- if (points > 0)
- {
- player.MonsterKillPoints += points;
-
- player.SendMessage(0x43, $"You earned {points} kill points. (Total: {player.MonsterKillPoints})");
- }
- }
}
public override void OnDeath(Container c)
@@ -3655,6 +3644,32 @@ namespace Server.Mobiles
base.OnDeath(c);
+ if (c != null)
+ {
+ // Identify the killer (this naturally routes credit from tamed pets to their owner)
+ Mobile killer = this.LastKiller;
+ if (killer is BaseCreature pet && pet.ControlMaster != null)
+ {
+ killer = pet.ControlMaster;
+ }
+
+ if (killer is PlayerMobile pm)
+ {
+ // Scan the newly generated corpse for the exact amount of gold created
+ int goldFound = c.GetAmount(typeof(Gold));
+
+ if (goldFound > 0)
+ {
+ pm.TotalGoldLooted += goldFound;
+ pm.TotalMonstersKilled += 1;
+ int points = this.Fame /200;
+ if (points > 0)
+ {
+ pm.MonsterKillPoints += points;
+ }
+ }
+ }
+ }
if (DeleteCorpseOnDeath)
{
c.Delete();
diff --git a/Projects/UOContent/Mobiles/PlayerMobile.cs b/Projects/UOContent/Mobiles/PlayerMobile.cs
index 62646b111..f140a068d 100644
--- a/Projects/UOContent/Mobiles/PlayerMobile.cs
+++ b/Projects/UOContent/Mobiles/PlayerMobile.cs
@@ -732,17 +732,34 @@ namespace Server.Mobiles
private int m_MonsterKillPoints;
[CommandProperty(AccessLevel.GameMaster)]
- public int MonsterKillPoints {
+ public int MonsterKillPoints
+ {
get => m_MonsterKillPoints;
- set
- {
- int oldValue = m_MonsterKillPoints;
- if (oldValue != value)
- {
- m_MonsterKillPoints = value;
- OnMonsterKillPointsChanged(oldValue);
- }
- }
+ set => m_MonsterKillPoints = value;
+ }
+
+ private int m_TotalGoldLooted;
+ [CommandProperty(AccessLevel.GameMaster)]
+ public int TotalGoldLooted
+ {
+ get => m_TotalGoldLooted;
+ set => m_TotalGoldLooted = value;
+ }
+
+ private int m_TotalMonstersKilled;
+ [CommandProperty(AccessLevel.GameMaster)]
+ public int TotalMonstersKilled
+ {
+ get => m_TotalMonstersKilled;
+ set => m_TotalMonstersKilled = value;
+ }
+
+ private int m_TotalPlayerDeaths;
+ [CommandProperty(AccessLevel.GameMaster)]
+ public int TotalPlayerDeaths
+ {
+ get => m_TotalPlayerDeaths;
+ set => m_TotalPlayerDeaths = value;
}
public HonorContext ReceivedHonorContext { get; set; }
@@ -2497,6 +2514,8 @@ namespace Server.Mobiles
{
base.OnDeath(c);
+ m_TotalPlayerDeaths += 1;
+
EquipSnapshot = null;
HueMod = -1;
@@ -2789,6 +2808,9 @@ namespace Server.Mobiles
{
case 35:
{
+ m_TotalPlayerDeaths = reader.ReadInt();
+ m_TotalMonstersKilled = reader.ReadInt();
+ m_TotalGoldLooted = reader.ReadInt();
m_MonsterKillPoints = reader.ReadInt();
goto case 34;
}
@@ -3141,7 +3163,10 @@ namespace Server.Mobiles
writer.Write(35); // version
- writer.Write(MonsterKillPoints);
+ writer.Write(m_TotalPlayerDeaths);
+ writer.Write(m_TotalMonstersKilled);
+ writer.Write(m_TotalGoldLooted);
+ writer.Write(m_MonsterKillPoints);
if (Stabled == null)
{
@@ -3839,11 +3864,6 @@ namespace Server.Mobiles
StatusBar.Refresh(this);
}
- public virtual void OnMonsterKillPointsChanged(int oldValue)
- {
- StatusBar.Refresh(this);
- }
-
public override void OnSkillChange(SkillName skill, double oldBase)
{
if (Young && SkillsTotal >= 4500)