diff --git a/Src/World Server/extrafunctions.cpp b/Src/World Server/extrafunctions.cpp index f7ea349..057ef90 100644 --- a/Src/World Server/extrafunctions.cpp +++ b/Src/World Server/extrafunctions.cpp @@ -1048,15 +1048,19 @@ UINT CWorldServer::RandNumber( UINT init, UINT range, UINT seed ) if(range>RAND_MAX) { UINT max = (UINT)GServer->round(sqrt((double)range)); - UINT num1 = init+int(max*rand()/(RAND_MAX + 1.0)); - UINT num2 = init+int(max*rand()/(RAND_MAX + 1.0)); - UINT num3 = init+int(max*rand()/(RAND_MAX + 1.0)); + // NOTE: multiply in double first -- on Linux RAND_MAX is 2^31-1 (vs. + // Windows' 15-bit 32767), so "max*rand()" done in integer arithmetic + // before dividing overflows UINT for nearly every rand() result, + // collapsing the output to ~0-1 regardless of range/max. + UINT num1 = init+int((double)max*rand()/(RAND_MAX + 1.0)); + UINT num2 = init+int((double)max*rand()/(RAND_MAX + 1.0)); + UINT num3 = init+int((double)max*rand()/(RAND_MAX + 1.0)); UINT res = (num1 * num2)+num3; return res>range?range:res; } else { - UINT ranum = init+int(range*rand()/(RAND_MAX + 1.0)); + UINT ranum = init+int((double)range*rand()/(RAND_MAX + 1.0)); return ranum; } diff --git a/Src/World Server/worldpackets.cpp b/Src/World Server/worldpackets.cpp index a4d37aa..db0cdd6 100644 --- a/Src/World Server/worldpackets.cpp +++ b/Src/World Server/worldpackets.cpp @@ -3162,18 +3162,18 @@ bool CWorldServer::pakCraft( CPlayer* thisclient, CPacket* P ) int lowest = thisclient->Attr->Con/ 10 + 17; int highest = thisclient->Attr->Con / 10 + 70; int range = (highest - lowest) + 1; - item.durability = lowest+int(range*rand()/(RAND_MAX + 1.0)); + item.durability = lowest+int((double)range*rand()/(RAND_MAX + 1.0)); // stats randomizer int changeofstatslow = thisclient->Attr->Sen / 13 + 10; int changeofstatshigh = thisclient->Attr->Sen / 13 + 50; int changeofstatsrange = (changeofstatshigh-changeofstatslow)+1; - if (changeofstatslow+int(changeofstatsrange*rand()/(RAND_MAX + 1.0)) > 50) + if (changeofstatslow+int((double)changeofstatsrange*rand()/(RAND_MAX + 1.0)) > 50) { int statslowget = 1; int statshighget = 256; int setstatrange=(statshighget-statslowget)+1; - item.stats = statslowget + int(setstatrange*rand()/(RAND_MAX + 1.0)); + item.stats = statslowget + int((double)setstatrange*rand()/(RAND_MAX + 1.0)); item.appraised = 1; } else