I think the problem is that it is dying the slot by the color of any item worn the first time logging in after the new code was put in for dyes, even if you didn't use dyes to get it that color. The color of the slot can be changed with dyes, but it shouldn't be setting the slot dye color until a dye is actually used.
EDIT: After looking at the diff, I think this is what is causing the problem:
zonedb.cpp
Code:
// Fix use_tint, previously it was set to 1 for a dyed slot, client wants it set to 0xFF
for(int i = 0; i<9; i++)
if(pp->item_tint[i].rgb.use_tint == 1)
pp->item_tint[i].rgb.use_tint = 0xFF;
If I was to guess, I think 1 might mean that it should use the color of the worn item and 0xFF means that the slot is dyed, so use that color. So, by just converting everything to 0xFF, it is overwriting the check to use any worn item's set color and just using the color of the items that were set when the slots were changed to 0xFF as a permanent new dyed color for that slot. I think the solution for this would be to change it so that only dying items will set it to 0xFF. And, by using the reset button in the dye window, it should change it back to 1 again so item color is used again until another dye is used. At least the code is very close to having this fixed perfectly I think. Just need to remove that section posted above and do the conversion when a dye is applied instead. And then figure out how to use the reset button.