For years growth rate issues have plagued spiggot.
Where the modifiers seemingly did not effect the server if increased and required significant decrease to reduce.
Today I have discovered why.
Within "BlockCrops.randomTick", there is an if statement as follows:
if (randomsource.nextInt((int)(100.0F/ (float)modifier * (25.0F / f)) + 1 ==0)
This is catastrophically wrong.
The vanilla probability of crop growth is 1/(25 / f +1)
A modifier to this chance would be 100/Modifier[1/(25 / f +1)]{*}with 100 being normal growth.
This is NOT what occurs in the if statement above.
(int)(100.0F/ (float)modifier * (25.0F / f)) is where the problem lies.
This value will always come out as an integer rounded down. I hope it is clear to see that, say for a case of modifier = 100 and f = 10
that (int) 100.0F / (float)100 * (25.0F/10) < 1 and hence = 0.
Hence, most cases (until modifier is equal to or less than 40) the growth chance will always be based on:
if (randomsource.nextInt(0 + 1 ==0)
Hence a 50% chance as a random int between 0 and 1 are chosen. If 0 , then true.
This is a bug that, considering forum posts about the issue, has been persistent for years.
As such I will offer my personal recommendation at a fix below:
int chancevanilla = (int)(100/(floor(25.0F/f)+1))-1; //%chance in vanilla MC
int ModMult = (int)(modifier/100.0F);
int chancemod = (int)(chancevanilla*ModMult;
if((randomsource.nextInt(99) <= chancemod) // rolls a random integer between 0 and 99 (100 numbers).// If chancevanilla or lower is rolled, then true.
I.e. if chance vanilla == 33 and then the modifier was 200, then chancemod would be 65 and hence have a 66% chance of success (66 choices lead to a true if statement out of the potential 100 ints between 0 and 99)