Файл 1:
Player.java
1. Добавлено поле для хранения времени последнего каста
private long _shotDischargeTimeStamp = 0;
private long _lastCastBeginTime = 0; // <-- НОВОЕ
------------------------------------------------
2. Изменена логика canChargeShot()
// СТАЛО:
public boolean canChargeShot() {
// Если _lastCastBeginTime = 0, значит это первый каст после входа/shotsReady() - всегда разрешаем
if (_lastCastBeginTime == 0) {
return true;
}
final long currentTime = System.currentTimeMillis();
final long timeSinceLastCast = currentTime - _lastCastBeginTime; // <-- От начала каста, а не от расхода
final boolean canCharge = timeSinceLastCast >= AllSettingsConfig.ALT_SHOT_CORRECTION;
if (AllSettingsConfig.CAST_SPEED_DEBUG_ENABLED) {
System.out.println("[CAST_SPEED_SS_COOLDOWN] Player: " + getName() + " | ObjectId: " + getObjectId() + " | TimeSinceLastCastBegin: " + timeSinceLastCast + "ms | Required: " + AllSettingsConfig.ALT_SHOT_CORRECTION + "ms | CanCharge: " + canCharge);
}
return canCharge;
}
--------------------------------------------------
3. Добавлен метод setLastCastBeginTime()
public void setLastCastBeginTime(long time) {
_lastCastBeginTime = time;
}
---------------------------------------------------
4. Обновлён shotsReady() для сброса обоих таймеров
public void shotsReady() {
_shotDischargeTimeStamp = 0;
_lastCastBeginTime = 0; // <-- НОВОЕ
}
------------------------------------------------
Файл 2:
Creature.java
1. Удалено обновление _lastCastBeginTime до проверки
(Сначала проверка, потом применение, потом обновление для следующего каста)
2. Упрощена логика применения SpiritShot
// СТАЛО (без ограничения по regular):
final int chargedSpiritShot = getChargedSpiritShot();
final boolean canCharge = !isPlayer() || getPlayer().canChargeShot();
final boolean isMagicSkill = skill.isMagic();
final boolean isSkillPermanent = skill.isSkillTimePermanent();
final boolean spiritShotApplied = isMagicSkill && !isSkillPermanent
&& canCharge
&& chargedSpiritShot > 0;
if (AllSettingsConfig.CAST_SPEED_DEBUG_ENABLED || skill.getId() == 1239) {
System.out.println("[CAST_SPEED_SS_CHECK] Skill: " + skill.getName() + " (ID: " + skill.getId() + ") | ObjectId: " + getObjectId() + " | isMagic: " + isMagicSkill + " | IsPermanent: " + isSkillPermanent + " | ChargedSpiritShot: " + chargedSpiritShot + " | CanCharge: " + canCharge + " | Applied: " + spiritShotApplied);
}
if (spiritShotApplied) {
int beforeSs = skillTime;
skillTime = (int) (0.70 * skillTime);
System.out.println("[CAST_SPEED_SPIRITSHOT] Skill: " + skill.getName() + " (ID: " + skill.getId() + ") | BeforeSS: " + beforeSs + "ms | AfterSS: " + skillTime + "ms | SpiritShotLevel: " + chargedSpiritShot);
}
// Обновляем время последнего каста ДЛЯ СЛЕДУЮЩИХ проверок
if (isPlayer()) {
getPlayer().setLastCastBeginTime(System.currentTimeMillis());
}