So as some of you will most likely notice when making your scripts to train characters, when you utilize GetSkillValue(SkillName); that any +/-skill items aren't taken into consideration. This is a problem for things like Magery training with -Magery items or Ninjitsu training to get into Death Strike training sooner. There is a solution however.
What you will need:
1. A CliLoc ID.
2. A Parameter within that CliLoc.
3. A Programmer Calculator (hint: Windows has one)
4. UOFiddler.
5. Common sense.
So, how do we get a CliLocID and Parameter? Easy. With this script.
Program New;
var
aa : TClilocRec;
bb : TClilocItemRec;
i,k : Integer;
begin
aa := GetToolTipRec($0);
AddToSystemJournal('Total lines in Toolptip: ' + IntToStr(aa.Count));
if aa.count > 0 then
for i := 0 to aa.Count - 1 do
begin
AddToSystemJournal('Line ' + IntToStr(i) + ': ');
bb := aa.Items[i];
AddToSystemJournal('Cliloc: $' + IntToHex(bb.ClilocID,8));
AddToSystemJournal('Cliloc text: ' + GetClilocByID(bb.ClilocID));
for k := 0 to Length(bb.Params) - 1 do
AddToSystemJournal('Param-' + IntToStr(k) + ': "' + bb.Params[k] + '"');
end;
end.
Where aa := GetToolTipRec($0); is you need to toss in the ItemID of the Item with +/-Skill on it. This is only if you don't have the CliLocID and Parameter of the skill you want to check.
Let's say Magery. When running this script on a Scrapper's Compendium we get this output:
15:43:59:905 [dxrom]: Compiling
15:43:59:918 [dxrom]: Compiled succesfully
15:43:59:919 [dxrom]: Total lines in Toolptip: 8
15:43:59:920 [dxrom]: Line 0:
15:43:59:920 [dxrom]: Cliloc: $00105F2C
15:43:59:921 [dxrom]: Cliloc text: Scrapper's Compendium
15:43:59:922 [dxrom]: Line 1:
15:43:59:923 [dxrom]: Cliloc: $000FD6C5
15:43:59:924 [dxrom]: Cliloc text: Blessed
15:43:59:925 [dxrom]: Line 2:
15:43:59:926 [dxrom]: Cliloc: $00102E63
15:43:59:927 [dxrom]: Cliloc text: ~1_skillname~ +~2_val~
15:43:59:928 [dxrom]: Param-0: "#1042372"
15:43:59:929 [dxrom]: Param-1: "10"
15:43:59:930 [dxrom]: Line 3:
15:43:59:931 [dxrom]: Cliloc: $00102E83
15:43:59:932 [dxrom]: Cliloc text: spell damage increase ~1_val~%
15:43:59:934 [dxrom]: Param-0: "25"
15:43:59:935 [dxrom]: Line 4:
15:43:59:936 [dxrom]: Cliloc: $00102E3C
15:43:59:937 [dxrom]: Cliloc text: faster cast recovery ~1_val~
15:43:59:938 [dxrom]: Param-0: "1"
15:43:59:939 [dxrom]: Line 5:
15:43:59:940 [dxrom]: Cliloc: $00102E3D
15:43:59:942 [dxrom]: Cliloc text: faster casting ~1_val~
15:43:59:944 [dxrom]: Param-0: "1"
15:43:59:945 [dxrom]: Line 6:
15:43:59:946 [dxrom]: Cliloc: $00102E51
15:43:59:948 [dxrom]: Cliloc text: lower mana cost ~1_val~%
15:43:59:949 [dxrom]: Param-0: "10"
15:43:59:950 [dxrom]: Line 7:
15:43:59:951 [dxrom]: Cliloc: $000FE9C6
15:43:59:952 [dxrom]: Cliloc text: ~1_NUMBERS_OF_SPELLS~ Spells
15:43:59:953 [dxrom]: Param-0: "3"
15:43:59:954 [dxrom]: Succesfully executed
15:43:59:955 [dxrom]: Script GumpSearch.sc stopped successfuly
The point of interest here is:
Cliloc: $00102E63
Cliloc text: ~1_skillname~ +~2_val~
Param-0: "#1042372"
Param-1: "10"
Opening calculator I see that $00102E63 HEX->DEC is 1060451. Opening UOFiddler and going to that address within the CliLoc tab I see that there are five similar CliLocs for +/-Skill.
Take note of those as we'll incorporate them all.
The second thing we want to take note of is Param-0: "#1042372". That is another CliLocID, except it's already in Decimal format. So let's check out what is at that ID shall we?
Okay, so we have now have the data that we need to start to write our function.
For simplicity sake we'll use jewelry. It should look something like this:
Function GetJewelrySkill(CliLocParam:String):Integer;
var
a:TClilocRec;
b:TClilocItemRec;
i:Integer;
R,BR:Integer;
begin
if( GetType(ObjAtLayer(BraceLayer))=0 ) then
begin
BR:=0;
end
else begin
a:=GetToolTipRec(ObjAtLayer(BraceLayer));
if( a.Count > 0 ) then
begin
for i:=0 to a.Count-1 do
begin
b:=a.Items[i];
if( (b.ClilocID >= 1060451) AND (b.ClilocID <= 1060455) ) then
begin
if( b.Params[0] = CliLocParam ) then
begin
BR:=StrToInt(b.Params[1]);
end;
end;
end;
end;
end;
if( GetType(ObjAtLayer(RingLayer))=0 ) then
begin
R:=0;
end
else begin
a:=GetToolTipRec(ObjAtLayer(RingLayer));
if( a.Count>0 ) then
begin
for i:=0 to a.Count-1 do
begin
b:=a.Items[i];
if( (b.ClilocID >= 1060451) AND (b.ClilocID <= 1060455) ) then
begin
if( b.Params[0] = CliLocParam ) then
begin
R:=StrToInt(b.Params[1]);
end;
end;
end;
end;
end;
Result:=R+BR;
end;
Those with a keen eye will have noticed, this function returns an Integer, but GetSkillValue returns a Double. That's not a problem since we can truncate the double.
Using this command will get the effective value of magery with jewelry and assign it as an Integer to variable SKILL
SKILL:=GetJewelrySkill('#1042372')+Trunc(GetSkillValue('Magery'));
I hope that this helps people out in their stealthy adventures, where you're only limitation is your imagination!
For more info on what layers there are to play with, check out
http://stealth.od.ua/Category:Layers