/////////////////////////// // The following section // // optimizes the use of // // health items on the // // survivors to maximize // // their health bonus. // /////////////////////////// new Float:fTemp[4]; // Sort by ascending health bonus after healing for (new i = 0; i < 4; i++) { for (new j = 0; j < 4; j++) { if (fHealth[iKitPriority[j]] + fTempHealth[iKitPriority[j]] > 100) fTemp[j] = fHealth[iKitPriority[j]] + (100 - fHealth[iKitPriority[j]]) / 2; else fTemp[j] = fTempHealth[j]; } if ((fHealth[i] + (100 - fHealth[i]) * g_fSM_HealPercent) < (fTemp[0])) { iKitPriority[3] = iKitPriority[2]; iKitPriority[2] = iKitPriority[1]; iKitPriority[1] = iKitPriority[0]; iKitPriority[0] = i; } else if ((fHealth[i] + (100 - fHealth[i]) * g_fSM_HealPercent) < (fTemp[1])) { iKitPriority[3] = iKitPriority[2]; iKitPriority[2] = iKitPriority[1]; iKitPriority[1] = i; } else if ((fHealth[i] + (100 - fHealth[i]) * g_fSM_HealPercent) < (fTemp[2])) { iKitPriority[3] = iKitPriority[2]; iKitPriority[2] = i; } else { iKitPriority[3] = i; } } // Repeat optimization for each medkit for (new k = 0; k < iTotalKits; k++) { // Move any dead or incapped survivors to the end for (new i = 0; i < 4; i++) { if (FloatCompare(fHealth[i], 0.0) < 1 && FloatCompare(fTempHealth[i], 0.0)) { iKitPriority[3] = i; iKitPriority[2] = iKitPriority[3]; iKitPriority[1] = iKitPriority[2]; iKitPriority[0] = iKitPriority[1]; } } // Apply a health kit fHealth[iKitPriority[0]] = fHealth[iKitPriority[0]] + (100 - fHealth[iKitPriority[0]]) * g_fSM_HealPercent; fTempHealth[iKitPriority[0]] = 0.0; for (new j = 0; j < 4; j++) { if (fHealth[iKitPriority[j]] + fTempHealth[iKitPriority[j]] > 100) fTemp[j] = fHealth[iKitPriority[j]] + (100 - fHealth[iKitPriority[j]]) / 2; else fTemp[j] = fTempHealth[j]; } // Sort the healed survivor back into the priority if ((fHealth[iKitPriority[0]] + (100 - fHealth[iKitPriority[0]]) * g_fSM_HealPercent) < (fTemp[1])) { iKitPriority[3] = iKitPriority[2]; iKitPriority[2] = iKitPriority[1]; iKitPriority[1] = iKitPriority[0]; } else if ((fHealth[iKitPriority[0]] + (100 - fHealth[iKitPriority[0]]) * g_fSM_HealPercent) < (fTemp[2])) { iKitPriority[3] = iKitPriority[2]; iKitPriority[2] = iKitPriority[0]; } else { iKitPriority[3] = iKitPriority[0]; } } // Calculate total health after medkits are applied for (new i = 0; i < 4; i++) fTotalHealth[i] = fHealth[i] + fTempHealth[i]; // Sort by ascending temp health for (new i = 0; i < 4; i++) { if (fTotalHealth[i] < fTotalHealth[0]) { iTempPriority[3] = iTempPriority[2]; iTempPriority[2] = iTempPriority[1]; iTempPriority[1] = iTempPriority[0]; iTempPriority[0] = i; } else if (fTotalHealth[i] < fTotalHealth[1]) { iTempPriority[3] = iTempPriority[2]; iTempPriority[2] = iTempPriority[1]; iTempPriority[1] = i; } else if (fTotalHealth[i] < fTotalHealth[2]) { iTempPriority[3] = iTempPriority[2]; iTempPriority[2] = i; } else { iTempPriority[3] = i; } } // Move anyone with less than one set of pills worth of free health to the end for (new i = 0; i < 4; i++) { if (fTotalHealth[iTempPriority[i]] > (g_iSM_PillPercent*100)) { iTempPriority[3] = iTempPriority[0]; iTempPriority[2] = iTempPriority[3]; iTempPriority[1] = iTempPriority[2]; iTempPriority[0] = iTempPriority[1]; } } // Move any dead or incapped survivors to the end for (new i = 0; i < 4; i++) { if (FloatCompare(fHealth[i], 0.0) < 1 && FloatCompare(fTempHealth[i], 0.0) < 1) { iTempPriority[3] = i; iTempPriority[2] = iTempPriority[3]; iTempPriority[1] = iTempPriority[2]; iTempPriority[0] = iTempPriority[1]; } } // Apply pain pills in order of priority for (new i = 0; i < iTotalPills; i++) if (iTotalPills > 0) fTempHealth[iTempPriority[i]] += g_iSM_PillPercent; // Calculate total health after pills are applied accounting for max health 100 for (new i = 0; i < 4; i++) { fTotalHealth[i] = fHealth[i] + fTempHealth[i]; if (fTotalHealth[i] > 100) { fTotalHealth[i] = 100.0; fTempHealth[i] = 100 - fHealth[i]; } } // Move anyone with less than one adrenaline worth of free health to the end for (new i = 0; i < 4; i++) { if (fTotalHealth[iTempPriority[i]] > (g_iSM_AdrenPercent*100)) { iTempPriority[3] = iTempPriority[0]; iTempPriority[2] = iTempPriority[3]; iTempPriority[1] = iTempPriority[2]; iTempPriority[0] = iTempPriority[1]; } } // Move any dead or incapped survivors to the end for (new i = 0; i < 4; i++) { if (FloatCompare(fHealth[i], 0.0) < 1 && FloatCompare(fTempHealth[i], 0.0) < 1) { iTempPriority[3] = i; iTempPriority[2] = iTempPriority[3]; iTempPriority[1] = iTempPriority[2]; iTempPriority[0] = iTempPriority[1]; } } // Apply adrenaline in order of priority for (new i = 0; i < iTotalAdren; i++) if (iTotalAdren > 0) fTempHealth[iTempPriority[i]] += g_iSM_AdrenPercent; // Calculate total health after adrenaline is applied accounting for max health 100 for (new i = 0; i < 4; i++) { fTotalHealth[i] = fHealth[i] + fTempHealth[i]; if (fTotalHealth[i] > 100) { fTotalHealth[i] = 100.0; fTempHealth[i] = 100 - fHealth[i]; } } ///////////////////////// // End of optimization // /////////////////////////