Voxpire

Vita-Nex: Core
Administrator
I went through all the new Buff Icons and mapped them to their appropriate names with thanks to this page on Stratics; http://uo2.stratics.com/miscellaneous/buff-and-debuff-icons/ and a little help with some code to make the process easier (code is provided at end of this post).

Now all we need to do is figure out where they all get used! Some are pretty obvious while others are fairly obscure... there are even one or two doubles in there that both use the same icons.

C#:
	public enum BuffIcon : short
	{
		DismountPrevention = 1001,
		NoRearm = 1002,
		//NULL = 1003,
		//NULL = 1004,
		NightSight = 1005,
		DeathStrike = 1006,
		EvilOmen = 1007,
		Honored = 1008, // Renamed
		AchievePerfection = 1009, // Renamed
		DivineFury = 1010,
		EnemyOfOne = 1011,
		HidingAndOrStealth = 1012,
		ActiveMeditation = 1013,
		BloodOathCaster = 1014,
		BloodOathCurse = 1015,
		CorpseSkin = 1016,
		Mindrot = 1017,
		PainSpike = 1018,
		Strangle = 1019,
		GiftOfRenewal = 1020,
		AttuneWeapon = 1021,
		Thunderstorm = 1022,
		EssenceOfWind = 1023,
		EtherealVoyage = 1024,
		GiftOfLife = 1025,
		ArcaneEmpowerment = 1026,
		MortalStrike = 1027,
		ReactiveArmor = 1028,
		Protection = 1029,
		ArchProtection = 1030,
		MagicReflection = 1031,
		Incognito = 1032,
		Disguised = 1033,
		AnimalForm = 1034,
		Polymorph = 1035,
		Invisibility = 1036,
		Paralyze = 1037,
		Poison = 1038,
		Bleed = 1039,
		Clumsy = 1040,
		FeebleMinded = 1041, // Renamed
		Weaken = 1042,
		Curse = 1043,
		MassCurse = 1044,
		Agility = 1045,
		Cunning = 1046,
		Strength = 1047,
		Bless = 1048,
		Sleep = 1049,
		StoneForm = 1050,
		SpellPlague = 1051,
		GargoyleBerserk = 1052, // Renamed
		//NULL = 1053, // Removed
		Fly = 1054,

// Additional icons below

		Inspire = 1055,
		Invigorate = 1056,
		Resilience = 1057,
		Perseverance = 1058,
		Tribulation = 1059,
		Despair = 1060,
		ArcaneEmpowerment2 = 1061,
		MagicFishBuff = 1062,
		HitLowerAttack = 1063,
		HitLowerDefense = 1064,
		HitDualWield = 1065,
		Block = 1066,
		DefenseMastery = 1067,
		DespairBard = 1068,
		HealingSkill = 1069,
		SpellFocusing = 1070,
		SpellFocusingDebuff = 1071,
		RageFocusingDebuff = 1072,
		RageFocusing = 1073,
		Warding = 1074,
		TribulationBard = 1075,
		ForceArrow = 1076,
		Disarm = 1077,
		Surge = 1078,
		Feint = 1079,
		TalonStrike = 1080,
		PsychicAttack = 1081,
		Consecrate = 1082,
		GrapesOfWrath = 1083,
		EnemyOfOneDebuff = 1084,
		HorrificBeast = 1085,
		LichForm = 1086,
		VampiricEmbrace = 1087,
		CurseWeapon = 1088,
		ReaperForm = 1089,
		ImmolatingWeapon = 1090,
		Enchant = 1091,
		HonorableExecution = 1092,
		Confidence = 1093,
		Evasion = 1094,
		CounterAttack = 1095,
		LightningStrike = 1096,
		MomentumStrike = 1097,
		OrangePetals = 1098,
		RoseOfTrinsicPetals = 1099,
		PoisonResistance = 1100,
		Veterinary = 1101,
		Perfection = 1102,
		Honored2 = 1103,
		ManaPhase = 1104,
		FandancerFanFire = 1105,
		Rage = 1106,
		Webbing = 1107,
		MedusaStone = 1108,
		DragonSlasherFear = 1109,
		AuraOfNausea = 1110,
		HowlOfCacophony = 1111,
		GazeDespair = 1112,
		HiryuPhysicalResistance = 1113,
		RuneBeetleCorruption = 1114,
		BloodwormAnemia = 1115,
		RotwormBloodDisease = 1116,
		SkillUseDelay = 1117,
		FactionStatLoss = 1118,
		HeatOfBattle = 1119,
		Criminal = 1120,
		ArmorPierce = 1121,
		Splintering = 1122,
		SwingSpeedDebuff = 1123,
		WraithForm = 1124,
		HonorableExecution2 = 1125,
		CityTradeDeal = 1126
	}

Code used to process buff icons, requiring user input verification;
C#:
#region Header
//   Vorspire    _,-'/-'/  BuffIconTest.cs
//   .      __,-; ,'( '/
//    \.    `-.__`-._`:_,-._       _ , . ``
//     `:-._,------' ` _,`--` -: `_ , ` ,' :
//        `---..__,,--'  (C) 2015  ` -'. -'
//        #  Vita-Nex [http://core.vita-nex.com]  #
//  {o)xxx|===============-   #   -===============|xxx(o}
//        #        The MIT License (MIT)          #
#endregion

#region References
using System;
using System.IO;

using Server.Mobiles;
using Server.Network;

using VitaNex;
using VitaNex.IO;
using VitaNex.SuperGumps.UI;
#endregion

namespace Server
{
	public static class BuffIconTest
	{
		private static readonly short[] _Icons = ((BuffIcon)0).GetValues<short>();

		public static void Initialize()
		{
			CommandUtility.Register(
				"TestBuffs",
				AccessLevel.Administrator,
				e => NextIcon((PlayerMobile)e.Mobile, 1, IOUtility.EnsureFile(VitaNexCore.DataDirectory + "/BuffIcons.txt", true)));
		}

		private static void NextIcon(PlayerMobile m, int index, FileInfo file)
		{
			var uid = (short)(1000 + index);

			if (index > 1)
			{
				m.Send(new TestRemoveBuffPacket(m, (short)(uid - 1)));
			}

			m.Send(new TestAddBuffPacket(m, uid));

			var input = _Icons.Contains(uid) ? ((BuffIcon)uid).ToString() : String.Empty;

			new InputDialogGump(m)
			{
				Modal = false,
				CanMove = false,
				InputText = input,
				Title = "Buff #" + index + " (" + uid + ")",
				Html =
					"Enter a description for the currently displayed Buff Icon and click OK to continue, or Cancel to stop testing.\n\n" +
					"Data will be appended to '" + file + "'",
				AcceptHandler = b => NextIcon(m, index + 1, file),
				CancelHandler = b => m.Send(new TestRemoveBuffPacket(m, uid)),
				Callback = (b, val) => file.AppendText(false, val + " = " + uid + ",")
			}.Send();
		}

		private sealed class TestAddBuffPacket : Packet
		{
			public TestAddBuffPacket(Mobile mob, short iconID)
				: base(0xDF)
			{
				EnsureCapacity(44);
				m_Stream.Write(mob.Serial);

				m_Stream.Write(iconID); //ID
				m_Stream.Write((short)0x1); //Type 0 for removal. 1 for add 2 for Data

				m_Stream.Fill(4);

				m_Stream.Write(iconID); //ID
				m_Stream.Write((short)0x01); //Type 0 for removal. 1 for add 2 for Data

				m_Stream.Fill(4);

				m_Stream.Write((short)0); //Time in seconds

				m_Stream.Fill(3);
				m_Stream.Write(-1);
				m_Stream.Write(-1);

				m_Stream.Fill(10);
			}
		}

		private sealed class TestRemoveBuffPacket : Packet
		{
			public TestRemoveBuffPacket(Mobile mob, short iconID)
				: base(0xDF)
			{
				EnsureCapacity(13);
				m_Stream.Write(mob.Serial);

				m_Stream.Write(iconID); //ID
				m_Stream.Write((short)0x0); //Type 0 for removal. 1 for add 2 for Data

				m_Stream.Fill(4);
			}
		}
	}
}
 
Last edited:

Milva

Moderator
Great information thanks for sharing! Maybe some can join in to help with more information on the buffs, I always liked the Orange Petals :) Ha!
 
Cast resurrection...
I'm attempting to run this, but getting an error on the server (not showing up in the client). Any ideas?

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeInitializationException: The type initializer for 'Ultima.Gumps' threw an exception. ---> System.IO.IOException: The process cannot access the file 'X:\files\gumpart.mul' because it is being used by another process.
 

Voxpire

Vita-Nex: Core
Administrator
Cast resurrection...
I'm attempting to run this, but getting an error on the server (not showing up in the client). Any ideas?
This usually happens if you're using the same install of UO for both the shard data, and playing the game.
It's necessary to make a clone of UO, one for the shard to use, one for you to play with.
 
I got my file issues sorted out and this now works.
Can anyone explain where the art for these debuffs is actually stored? I seem to be missing quite a few.
 

Voxpire

Vita-Nex: Core
Administrator
I got my file issues sorted out and this now works.
Can anyone explain where the art for these debuffs is actually stored? I seem to be missing quite a few.
The icons are hard-coded into the client.exe which is why we have to brute-force find the correct info for the new ones - but the images themselves are stored as simple gumps.