Code:
//preempt = PreEmpt = (int)MapDifficultyRange(Beatmap.DifficultyApproachRate, 1800, 1200, 450);
//please take reference on my ****** page: azukimpgh
//the ctb replay editor has code for this, check that out
public const float stackTrhesold = PreEmpt * Beatmap.StackLeniency;
UpdateStacking(int startIndex = 0, int endIndex = -1)
{
if (endIndex == -1)
endIndex = hitObjectsCount - 1;
int STACK_LENIENCE = 3;
Vector2 stackVector = new Vector2(StackOffset, StackOffset);
for (int i = startIndex; i <= endIndex; i++)
hitObjects[i].StackCount = 0;
int exEndIndex = endIndex;
int extendedStartIndex = startIndex;
for (int i = exEndIndex; i > startIndex; i--) {
int n = i;
HitObject objectI = hitObjects[i];
if (objectI.StackCount != 0 || objectI is Spinner) continue;
if (objectI is Circle) {
while (--n >= 0) {
HitObject objectN = hitObjects[n];
if (objectN is Spinner) continue;
if (objectI.StartTime - objectN.EndTime > stackThresold)
break;
if (n < extendedStartIndex) {
objectN.StackCount = 0;
extendedStartIndex = n;
}
if (objectN is Slider && Vector2.DistanceBetween(objectN.BaseEndPosition, objectI.BasePosition) < STACK_LENIENCE) {
int offset = objectI.StackCount - objectN.StackCount + 1;
for (int j = n + 1; j <= i; j++) {
if (Vector2.DistanceBetween(objectN.BaseEndPosition, hitObjects[j].BasePosition) < STACK_LENIENCE)
hitObjects[j].StackCount -= offset;
}
break;
}
if (Vector2.DistanceBetween(objectN.BasePosition, objectI.BasePosition) < STACK_LENIENCE) {
objectN.StackCount = objectI.StackCount + 1;
objectI = objectN;
}
}
} else if (objectI is Slider) {
while (--n >= startIndex) {
HitObject objectN = hitObjects[n];
if (objectN is Spinner) continue;
if (objectI.StartTime - objectN.StartTime > stackThresold)
break;
if (Vector2.DistanceBetween(objectN.BaseEndPosition, objectI.BasePosition) < STACK_LENIENCE) {
objectN.StackCount = objectI.StackCount + 1;
objectI = objectN;
}
}
}
}
for (int i = startIndex; i <= endIndex; i++) {
HitObject currHitObject = hitObjects[i];
currHitObject.position = currHitObject.BasePosition - currHitObject.StackCount * stackVector;
}
}