Huge AR and hp/maxhp on armor

Here you can post threads requesting help on the official POL Ultima Online Emulator Core 098.

Moderator: POL Developer

Post Reply
Basara
Novice Poster
Posts: 47
Joined: Fri Oct 13, 2006 6:37 am
Location: UK

Huge AR and hp/maxhp on armor

Post by Basara »

One of my testers has pointed out that crafted armor (and maybe weapons, cant test right now) has got huge AR values, looking at them they also have massive hp/maxhp values as well.
I'm assuming that something has changed between pol97 and 98 regarding .quality or .maxhp, but I could onyl see one entry about .quality in the changelog and it didnt seem to be related.

Has anyone got any ideas? Other than upgrading the core the crafting system in use hasn't been altered at all (any items created by a GM are all fine)
User avatar
*Edwards
Forum Regular
Posts: 303
Joined: Fri Dec 28, 2007 11:19 pm
Location: Montreal, Canada

Re: Huge AR and hp/maxhp on armor

Post by *Edwards »

Can you please tell us which distro you are using

Distro097 -- answer is in includes from distro/pkg/systems/crafting/include
Distro095 -- Take a look in blacksmith.src ( dont know the root but might be in pkg blacksmith )

Zulu -- pkg/std/blacksmith ( I assume you are using any kind of zulu scriptbase due to a kind of bonus given when crafting armor, weapons.. )

Post here the lines of the scripts that may be the problem and we will be able to answer correctly the question and fix it.
Basara
Novice Poster
Posts: 47
Joined: Fri Oct 13, 2006 6:37 am
Location: UK

Re: Huge AR and hp/maxhp on armor

Post by Basara »

Hi, i'm not using a distro but a heavily customised 98.2 (upgraded from 094 a while back, problerm is its been custom since 07x or so) - not based on Zulu scripts but Mytharria and not originally written by me which is making the bug finding that bit harder.

Script is split up by all the functiuons so I'm gonna include the whole thing and highlight what I think is relevent (sorry about the length, if i use the CODE tags it doesnt highlight)
use basicio;
use npc;
use math;
use basic;
use os;
use util;
use polsys;
use uo;
use cfgfile;
include "include/damage";

include "class";
include "include/convert";
include "include/skillcheck";
include "include/yesno";
var cfg := readconfigfile("crafting");
var menus := readconfigfile("crafting");
var areatools := readconfigfile("areatools");
var targetted_material;
var materialcfg ;
var qualmod ;
var hpmod ;
var clrmod ;
var diffmod ;
var pointmod ;
var maxgainpoints;
var weightmod ;
var hitscript ;
var makestack ;
var neededamount;
var hecan_make ;
var who2;
var materials := {};
var itemcfg := readconfigfile("::itemdesc");

program use_item(who, item)
//if (getobjproperty(who, "#crafting") > readgameclock())
// SendSysMessage(who, "You must wait to craft again.");
//return;

// endif
// setobjproperty(who, "#crafting", readgameclock()+1);
if (!item)
item := who[2];
who := who[1];
endif
if(getequipmentbylayer(who, 25))
SendSysMessage(who, "You can not craft whilst mounted");
return;
endif
var uses := getobjproperty(item, "uses");
if (!uses)
setobjproperty(item, "uses", randomint(50) + 1);
uses := uses := getobjproperty(item, "uses");
endif

if (!uses)
sendsysmessage(who, "The well-worn tool breaks!");
destroyitem(item);
return;
endif
setobjproperty(item, "uses", uses - 1);
who2 := who;

sendsysmessage(who, "What do you want to use that on?");
var what := target(who, TGTOPT_CHECK_LOS);

if (!what )
sendsysmessage(who, "Targetting Cancelled");
////output(who, "Didn't select anything");
return;
endif
if (!what.movable)
sendsysmessage(who, "You cannot use locked-down items");
return;
endif
reserveitem(what);

targetted_material := what;
////output(who, "Selected " + what.objtype);

materialcfg := readconfigfile("materials");
if (!materialcfg)
sendsysmessage(who, "Crafting error: " + materialcfg.errortext);
syslog("Crafting error: " + materialcfg.errortext);
endif
qualmod := materialcfg[what.objtype].quality;
hpmod := materialcfg[what.objtype].hp;
clrmod := cint(materialcfg[what.objtype].Color);
diffmod := materialcfg[what.objtype].difficulty;
pointmod := materialcfg[what.objtype].points;
maxgainpoints := materialcfg[what.objtype].maxgainpoints;
weightmod := materialcfg[what.objtype].weight;
hitscript := materialcfg[what.objtype].hitscript;

var hisclass := getobjproperty(who, "Class");

var tc := lower(hisclass);

if (tc in getconfigstringarray(materialcfg[what.objtype],"Class") )

else
var e := materialcfg[what.objtype];
sendsysmessage(who, "You do not have the training to work with this material!");
return;
endif
if (!qualmod)
qualmod := 1.0;
endif

if (!hpmod)
hpmod := 1.0;
endif

if (!diffmod)
diffmod := 1.0;
endif

if(!pointmod)
pointmod := 1.0;
endif

if(!weightmod)
weightmod := 1.0;
endif

//if(maxgainpoints >= )
//CheckSkillNoAdvance();
//sendsysmessage(who, "Debug: Too easy for you");
//endif

var menuname := format_hex(item.objtype) + "+" + format_hex(what.graphic);
////output(who, "Menu name is " + menuname);

var tmenu := cfg[menuname];
if (!tmenu)
sendsysmessage(who, "You don't know how to make anything out of this");
return;
endif

var ret;
var exitit := 0;
////output(who,"Showmenu is " + tmenu.showmenu);
var mname := menus[tmenu.showmenu];

while (!exitit)
////output(who, "mname is " + mname);
ret := getsubmenuselection(who, mname, what);
////output(who, "RET == " + ret);
if (!ret)
sendsysmessage(who, "Cancelled");
return;
endif
if (ret.type == 2)
mname := menus[ret.objtype];
else
exitit := 1;
endif
endwhile

var telem:= cfg[hex(ret.objtype)];
//output(who, "Looking for objtype " +hex(ret.objtype));
if (!telem)

//syslog("Unable to find craft.cfg entry for " + ret.objtype);
telem := cfg[format_hex(ret.objtype)];
if (!telem)
//output(who, "Didn't find it");
return;
endif
endif



var makestack := telem.makestack;
if( makestack == error or what.amount == 1)
makestack := 0;
elseif( makestack == 1 )
SendSysmessage(who, "This item will create in a stack using up all the targetted material", 3, 90);
if (YesNo(who, "Are you sure you wish to create a stack?"))
else
SendSysMessage(who, "Cancelled");
return;
endif
endif


var materiallist := {};
var materials := getconfigstringarray(telem, "material");

var temp1 := materials[1];
temp1["/"] := " ";
var temp := splitwords(temp1);

if( targetted_material.amount < cint(temp[2]) ) //hack, i know :(
SendSysmessage(who, "You don't have enough material!");
return;
endif

materials.erase(1);

foreach material in materials
var d := grabmaterial(who, material, materiallist, makestack);
if (!d )
sendsysmessage(who, "You do not have enough material!");
//material["/"] := " ";
//material:= splitwords(material);
//sendsysmessage(who, "You need " + itemcfg[cint(material[1])].desc);
return;
else
materiallist.append(d[1]);
endif
endforeach

//output(who,"Materiallist == " + materiallist);

var areaitem;
var leaveit;
leaveit := 0;

foreach areaitem in getconfigstringarray(telem, "area")
leaveit := findareaitem(who, areaitem);
if (leaveit)
sendsysmessage(who, "Targetting cancelled");
return;
endif
endforeach

// foreach tool in getconfigstringarray(telem, "tool")
// tool["/"] := " ";
// var stuf := splitwords(tool);
// sendsysmessage(who, getprompt(tool));
// var this := target(who, TGTOPT_CHECK_LOS);
// if (this.objtype <> cint(stuf[1]))
// sendsysmessage(who, "Targetting cancelled");
// return;
// endif

// endforeach

//added by Nick
foreach tool in getconfigstringarray(telem, "tool")
var ok;
while(tool[" "])
tool[" "] := "-";
endwhile

tool["/"] := " ";
var stuf := splitwords(tool);
//sendsysmessage(who, getprompt(tool));

foreach thingie in enumerateitemsInContainer( who.backpack )
if(thingie.objtype == cint(stuf[1]))
ok :=1;
endif
endforeach

if(!ok)
var trash := stuf[2];
while(trash["-"])
trash["-"] := " ";
endwhile

sendsysmessage(who, " " + trash);
var this := target(who, TGTOPT_CHECK_LOS);
if (this.objtype <> cint(stuf[1]))
sendsysmessage(who, "Targetting cancelled");
return;
endif
endif
endforeach
//////////////



var success := 0;

//output(who, "about to check skill");
//sendsysmessage(who, "About to check skill");
foreach skill in getconfigstringarray(telem, "skill")
while (skill["/"])
skill["/"]:= " ";
endwhile

var skillstuff := splitwords(skill);

var tskillid := cint(skillstuff[1]);
//sendsysmessage(who, "Skill is "+tskillid+"");
var tdiff := cint(cint(skillstuff[2]) * diffmod);
//sendsysmessage(who, "Difficulty is "+tdiff+"");
if (tdiff > 100)
tdiff := 100;
endif

var tpoints := modify_points( who, tskillid , cint( cint( skillstuff[3] ) * cdbl( pointmod ) ) );
//Sendsysmessage(who, "Checking skill " + tskillid + " for " + tdiff + " difficulty");
if (newcheckskill(who, tskillid, tdiff, tpoints))
success := 1;
//sendsysmessage(who, "Success");
//output(who, "You made the skillcheck!");
else
success := 0;
//sendsysmessage(who, "Fail");
endif
endforeach

//output(who, "Checked skill");
//ok, if they succeeded in making the item, then the success variable will be 1. Either way, I need to subtract material

getmaterial(who, telem, materiallist, success);

foreach sound in getconfigstringarray(telem, "sound")
sound["/"] := " ";
var st := splitwords(sound);
var cntr;
for (cntr := 1; cntr <= cint(st[2]); cntr := cntr + 1)
playsoundeffect(who, cint(st[1]));
sleep(1);
endfor
endforeach

if (!success)
Sendsysmessage(who, "You fail, and ruin some material");
return;
endif

if (!hecan_make)
hecan_make := 1;
endif

/*if(who.cmdlevel)
sendsysmessage(who, "objtype: "+cint(ret.objtype));
sendsysmessage(who, "hecan_make: "+hecan_make);
endif*/
var it := createiteminbackpack(who, cint(ret.objtype), hecan_make);
var info := struct;
info.+ name;
info.+ acctname;

info.acctname := who.acctname;
info.name := who.name;
setobjproperty(it, "PC-MADE", info);
it.movable := 1; // So nothing gets locked down in a person's pack
if (!it)
return;
endif

var excep := 0;

if (telem.exceptional)
foreach skill in getconfigstringarray(telem, "skill")
while (skill["/"])
skill["/"]:= " ";
endwhile

var skillstuff := splitwords(skill);
if (newgetskill(who, cint(skillstuff[1])) > 90)
if (getobjproperty(who, "debug"))
sendsysmessage(who, "Exceptional item chance...");
endif
var roll := randomint(20);
if (roll == 1)
if (getobjproperty(who, "debug"))
sendsysmessage(who, "Success (rolled a 1)");
endif
excep := 1;
addFame(who);
else
if (getobjproperty(who, "debug"))
sendsysmessage(who, "Failed the roll (rolled a "+roll+")");
endif
excep := 0;
endif
else
excep := 0;
endif

endforeach
endif

it.quality := qualmod;
if(it.objtype == 0xd4e8)
it.color := 1209;
else
it.color := clrmod;
endif
it.weight := it.weight * weightmod;
it.maxhp := cint(it.maxhp * hpmod);
if (hitscript)
var a := {};
a[1] := hitscript;
setobjproperty(it, "OnHit", a);
endif

if (excep || who.cmdlevel && getobjproperty(who, "crafttest"))
setobjproperty(it, "exceptional", 1); // Austin - So spells dont remove would be "magic" from named items
it.quality := 1.25;
var tname := SendTextEntryGump( who,
"You have made an exceptional item!",
TE_CANCEL_ENABLE,
TE_STYLE_NORMAL,
40, // normal: chars, num: value
"What would you like to name this item?" );
if (tname)
it.name := tname;
endif
it.hp := it.maxhp;

else
sendsysmessage(who, "You place the item in your pack");
it.quality := getquality(who, telem);
it.hp := it.maxhp;

endif

endprogram

function getquality(who, elem)

//var skill;
var skillstuff;
var totalskillpoints := 0;
var tcount := 0;
foreach skill in getconfigstringarray(elem, "skill")
while (skill["/"])
skill["/"]:= " ";
endwhile

skillstuff := splitwords(skill);
totalskillpoints := totalskillpoints + newgetskill(who, cint(skillstuff[1]));
tcount := tcount + 1;
endforeach
var avg := cint((totalskillpoints / tcount) * 1.2);
//broadcast("avg: "+avg, 3, 80);
var retval := randomint(avg) + 1;
//broadcast("retval: "+retval, 3, 80);
return retval;

endfunction


function getmaterial(who, telem, materiallist, success )

var ttt := telem.material;
ttt["/"] := " ";
var tt := splitwords(ttt);

neededamount := cint(tt[2]);
//print ("tt is " + tt);
if (!neededamount)
neededamount := 1;
endif

if(!hecan_make)
if( telem.makestack )
hecan_make := targetted_material.amount / neededamount;
else
hecan_make := 1;
endif
endif

//print("Hecan_make: " + hecan_make);
if(success)
subtractamount(targetted_material, neededamount * hecan_make);
else
subtractamount(targetted_material, (neededamount * hecan_make)/3);
endif
foreach elem in getconfigstringarray(telem, "material")
var subamount := 0;
elem["/"] := " ";
var stf := splitwords(elem);
if (!success)
stf[2] := stf[2] / (randomint(3) + 1); //FIXME: this is a little arbitrary, how about a lost amount
// according to the needed material amount and skill?
endif
foreach item in materiallist
if (item.objtype == cint(stf[1]))
output(who, "Found " + item.amount);
if ((item.amount >= (cint(stf[2]) * hecan_make)) and cint(stf[2]) > 0)
subtractamount(item.item, cint(stf[2]) * hecan_make);
stf[2] := 0;
else
stf[2] := cint(stf[2]) - item.amount;
destroyitem(item.item);
endif
endif
endforeach

endforeach

endfunction

/*function getmaterial(who, telem, materiallist, success )

var ttt := telem.material;
ttt["/"] := " ";
var tt := splitwords(ttt);

neededamount := cint(tt[2]);

//////print ("tt is " + tt);
if (!neededamount)
neededamount := 1;
endif
sendsysmessage(who, "Amount Needed: "+neededamount);

if(!hecan_make)
//if( telem.makestack )
hecan_make := targetted_material.amount / neededamount;
//else
//hecan_make := 1;
//endif
endif

//////print("Hecan_make: " + hecan_make);
if(success)
var a := subtractamount(targetted_material, neededamount * hecan_make);
sendsysmessage(who, "a: "+a);
else
var howmuch := cint((neededamount * hecan_make)/ 3);
if (howmuch <= 1)
howmuch := 1;
endif
var b:= subtractamount(targetted_material, howmuch);
sendsysmessage(who, "b: "+b);
endif
foreach elem in getconfigstringarray(telem, "material")
var subamount := 0;
elem["/"] := " ";
var stf := splitwords(elem);
if (!success)
stf[2] := cint(cint(stf[2]) / (randomint(3) + 1)); //FIXME: this is a little arbitrary, how about a lost amount
// according to the needed material amount and skill?
if (stf[2] <= 1)
stf[2] := 1;
endif
endif
foreach item in materiallist
if (item.objtype == cint(stf[1]))
//sendsysmessage(who, "Found " + item.amount);
if ((item.amount >= (cint(stf[2]) * hecan_make)) and cint(stf[2]) > 0)
var c := subtractamount(item.item, cint(stf[2]) * hecan_make);
sendsysmessage(who, "c: "+c);
stf[2] := 0;
else
stf[2] := cint(stf[2]) - item.amount;
var d := subtractamount(item.item, cint(stf[2]) * hecan_make);
sendsysmessage(who, "d: "+d);
endif
endif
endforeach
endforeach

endfunction*/



function getprompt(theprompt)
theprompt[ 1, Find(theprompt, 1," ") ] := "";
return theprompt;
endfunction

function grabmaterial(who, material, materiallist, makestack )

// this function finds the materials they'll need to make an item.
// If it's a regular item (that is, you only make one at a time)
// it looks through their backpack for the necessary materials. If
// they're making a stack, it instead prompts them to target the material

//output (who, who.name + " is trying to get " + material + "for " + materiallist + " makestack == " + makestack);
var materialentry := {};
materialentry.+ objtype;
materialentry.+ amount;
materialentry.+ item;
material["/"] := " ";
//output (who,"material == " + material);

var stuff := splitwords(material);
//////print("makestack: " + makestack);

if (!makestack)
var totalamount := 0;

foreach item in enumerateitemsInContainer( who.backpack )
if (item.objtype == cint(stuff[1]))
//sendsysmessage(who, "Adding " + item.objtype + " to the list");
totalamount := totalamount + item.amount;
materialentry.objtype := item.objtype;
//sendsysmessage(who,"Adding materialentry objtype " + materialentry.objtype);
materialentry.amount := item.amount;
//sendsysmessage(who, "Adding amount " + materialentry.amount);
materialentry.item := item;
//sendsysmessage(who, "Adding item " + item);
//reserveitem(item);
materiallist.append(materialentry);
endif
endforeach

//////print("Materiallist: " + materiallist );
//////print("totalamount: " + totalamount );

if (totalamount >= cint(stuff[2]))
return materiallist;
else
return;
endif

// elseif (cstr(makestack) == "1") //What is this? what's all the code under the "else" for then?
// //materiallist should be empty
// return 1;
else
sendsysmessage(who, "Target the feathers you wish to use");
var whatt := target(who, TGTOPT_CHECK_LOS);
while (whatt.graphic != cint(stuff[1]) && whatt)
sendsysmessage(who, "That's the wrong material!");
//sendsysmessage(who, makestack);
whatt := target(who, TGTOPT_CHECK_LOS);
endwhile

////output(who, " You need " + stuff[2]);
if (!whatt)
sendsysmessage(who, "Targetting cancelled");
return;
endif

reserveitem(whatt);

if (whatt.amount < cint(stuff[2]))
Sendsysmessage(who, "You don't have enough material to make that! " );
return;
endif

materialentry.objtype := whatt.objtype;
materialentry.amount := whatt.amount;
materialentry.item := whatt;
materiallist.append(materialentry);
// //output(who, "Materiallist == " + materiallist);

if( whatt.amount < targetted_material.amount )
hecan_make := cint(whatt.amount / cint(stuff[2]));
else
hecan_make := cint(targetted_material.amount / cint(stuff[2]));
endif
return materiallist;
endif

endfunction

function getsubmenu(thestring)

////output(who2, "I'm in getmenu, damnit!");
//////print ("In getsubmenu, thestring == " + thestring);
var retval := {};

while (thestring[" "])
thestring[" "] := " ";
endwhile

retval := splitwords(thestring);
if (itemcfg[cint(retval[1])].graphic)
retval[1] := itemcfg[cint(retval[1])].graphic;
//////print ("resetting graphic to " + retval[1]);
endif

//////print ("returning " + retval);
return retval;
endfunction

function getgraphic (theval)
var retval;

if (itemcfg[theval].graphic)
retval := itemcfg[theval].graphic;
//////print ("resetting graphic to " + retval[1]);
else
retval := cint(theval);
endif
return retval;

endfunction

function can_make(who, entry, what)

//sendsysmessage(who, "Seeing if you can make " + what + " with entry " + entry);
var dtstuff := splitwords(entry);
var tentry := cfg[dtstuff[1]];
var skill;
foreach skill in getconfigstringarray(cfg[dtstuff[1]], "skill")
//sendsysmessage(who, "Checking for skill " + skill);
while (find(skill, "/", 1))
skill["/"] := " ";
endwhile

var stuff := splitwords(skill);

if (newgetskill(who, cint(stuff[1])) < cint(cint(stuff[2]) * diffmod) )
//output(who, "With skill " + stuff[1] + " You need " + cint(cint(stuff[2]) * diffmod) + " but you have " + newgetskill(who, cint(stuff[1])));
return 0;
endif

return 1;
endforeach
endfunction

function findareaitem(who, areaitem)

//////print ("Lookign for area " + areaitem);
var retval;
var items := getconfigstringarray(areatools[areaitem], "item");
//////print ("item list is " + items);
var i;

foreach item in listitemsnearlocation(who.x, who.y, who.z, 4)
//////print ("there's an " + item.graphic + "nearby");
//////print ("items.length() is " + len(items));

for (i := 1; i <= len(items); i := i + 1)
////////print ("Is " + cint(items) + " equal to " + cint(item.objtype) + " ?");
if (cint(items) == cint(item.graphic))
//printtextabove(item, "It's me!!");
return 0;
endif
endfor
endforeach

//if it's near them, then return. Otherwise, you have to look for it

sendsysmessage(who, "Select the "+ areaitem+" you want to use this on, or escape to cancel");
var what := targetcoordinates(who);

if (!what.objtype)
return 1;
endif

while (!(what.objtype in items))
sendsysmessage(who, "Select the "+ areaitem+" you want to use this on, or escape to cancel");
what := targetcoordinates(who);
if (!what.objtype)
return 1;
endif
endwhile

return;

endfunction

function getsubmenuselection(who, submenuname, what)

/*
// //output(who2,, "in getsubmenuselection, got " + submenuname);
//
// this function takes the name of a submenu and loads it. It returns an array with
// the objtype of the selection, as well as the submenu name (if any)
*/

var retval := {};
retval.+type;
retval.+objtype;
var entry;
var menuentries2 := {};
var menuentry2 := {};
menuentry2.+objtype;
menuentry2.+type;
menuentry2.+submenu;
var themenu2 := createmenu("What would you like to make?");
////output(who, "About to check for entries ");

foreach entry in getconfigstringarray(submenuname, "Entry")
////output(who, "Got an entry : "+ entry);
var rtvl := can_make(who, entry, what);
if (!rtvl)
////output(who,"can't make " + entry);
endif
if (rtvl)
////output(who, "adding entry" + entry);//
var stuff := splitwords(entry);
////output(who, "Calling AddMenuItem(themenu," + getgraphic(stuff[1]) + "," + stuff[2] + ")");
AddMenuItem(themenu2, getgraphic(cint(stuff[1])), stuff[2]);
menuentry2.objtype := cint(stuff[1]);
menuentry2.submenu := "";
menuentry2.type := 1;
menuentries2.append(menuentry2);
endif
////output(who, menuentries2);
endforeach


//sendsysmessage(who, "Checked!!!!!!!!!!");
foreach entry in getconfigstringarray(submenuname, "submenu")
////////print ("checking submenu " + entry);
var stuff := getsubmenu(entry);
addmenuitem(themenu2, getgraphic(cint(stuff[2])), stuff[3]);
menuentry2.objtype := cint(stuff[2]);
menuentry2.type := 2;
menuentry2.submenu := stuff[1];
menuentries2.append(menuentry2);
endforeach

var retl2 := selectmenuitem2(who, themenu2);
////////print (retl2.errortext);
if (!retl2.index)
////output(who2,, "He didn't select anything!");
return 0;
else
////////print ("Index is " + retl2.index + " objtype == " + retl2.objtype);
if (menuentries2[retl2.index].type == 2)
retval.objtype := menuentries2[retl2.index].submenu;
retval.type := 2;
////output(who2,, "type is 2######################");
else
retval.objtype := menuentries2[retl2.index].objtype;

retval.type := 1;
////////print ("type is 1#$$$$$$$$$$$$$$$$$$$$$$");
endif
endif
//output(who, "returning " + retval);
return retval;

endfunction

function output(who, message)
if (who2.cmdlevel)
sendsysmessage(who, message);
//////print(message);
endif
endfunction

function format_hex(theobjtype)
var thex := hex(theobjtype);
if (len(thex) == 5)
thex["0x"] := "0x0";
elseif (len(thex) == 4)
thex["0x"] := "0x00";
elseif (len(thex) == 3)
thex["0x"] := "0x000";
endif
return thex;

endfunction

function addfame(who)

var hisfame := cint(getobjproperty(who, "Fame"));
if (!hisfame)
hisfame := 1;
endif
hisfame := cint(hisfame * 1.05);

setobjproperty(who, "Fame", hisfame);

sendsysmessage(who, "You have gained fame for crafting this item");
var hisfaith := getobjproperty(who, "Devotion");
if (hisfaith == "Olor")
var hiskarma := getobjproperty(who, "Karma");
if (!hiskarma)
hiskarma := 1;
endif
if (hiskarma < 0)
return;
endif
hiskarma := cint(hiskarma * 1.3);
setobjproperty(who, "Karma", hiskarma);
Sendsysmessage(who, "Olor smiles upon your creation");
endif
endfunction
Basara
Novice Poster
Posts: 47
Joined: Fri Oct 13, 2006 6:37 am
Location: UK

Re: Huge AR and hp/maxhp on armor

Post by Basara »

Any idea guys?
Basara
Novice Poster
Posts: 47
Joined: Fri Oct 13, 2006 6:37 am
Location: UK

Re: Huge AR and hp/maxhp on armor

Post by Basara »

Ok, I downgraded to 097.4 and everything works fine, does anyone know of the core changes to Equipment.quality in 098 would affect this:

Fixed: Equipment.quality will now convert plain integers to Double/Float for it when using
item.quality:=2; instead of item.quality:=2.0;

Example of dire wolf hides in my crafting system:

//Dire Wolf hides
Material 0x7020
{
Color 0x455
Hp 0.8
Difficulty 0.8
Quality 0.8 <--- should this be changed somehow?
exceptional 1
echantability 0
points 0.8
weight 1.2
class tinker
class artisan
hitscript
}
User avatar
CWO
POL Expert
Posts: 1158
Joined: Sat Feb 04, 2006 5:49 pm
Location: Chicago, IL USA

Re: Huge AR and hp/maxhp on armor

Post by CWO »

That's not it... When you actually try to access item.quality on one of the bugged items, does it say its an insanely high quality?
Basara
Novice Poster
Posts: 47
Joined: Fri Oct 13, 2006 6:37 am
Location: UK

Re: Huge AR and hp/maxhp on armor

Post by Basara »

Sorry, didn't mean to say just quality but AR/HP, the quality line in the change log sent me off on the wrong thing, lol

The top shield is created using .create and is as it should be in both 097 and 098.
The bottom one was crafted in 098

As you can see the Quality, HP and AR are hugely multiplied on the bottom one.

Image
User avatar
CWO
POL Expert
Posts: 1158
Joined: Sat Feb 04, 2006 5:49 pm
Location: Chicago, IL USA

Re: Huge AR and hp/maxhp on armor

Post by CWO »

Well quality is the main problem here because quality directly affects maxhp and AR. So we need to narrow down the quality mods only. If you can reproduce this exactly, try using SendSysMessage() or print() on every quality calculation to see where it goes haywire.
Post Reply