Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ private CharacterData loadCharacterData(Row row) {
final SkillManager sm = new SkillManager();
final Map<Integer, Instant> skillCooltimes = row.getMap(CharacterTable.SKILL_COOLTIMES, Integer.class, Instant.class);
if (skillCooltimes != null) {
sm.getSkillCooltimes().putAll(skillCooltimes);
// Figure out stream
//TODO sm.getSkillCooltimes().putAll(skillCooltimes);
}
final List<SkillRecord> skillRecords = row.getList(CharacterTable.SKILL_RECORDS, SkillRecord.class);
if (skillRecords != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.datastax.oss.driver.api.core.type.codec.TypeCodec;
import com.datastax.oss.driver.api.core.type.reflect.GenericType;
import kinoko.database.cassandra.type.SkillRecordUDT;
import kinoko.meta.SkillId;
import kinoko.world.skill.SkillRecord;

public final class SkillRecordCodec extends MappingCodec<UdtValue, SkillRecord> {
Expand All @@ -23,7 +24,7 @@ protected SkillRecord innerToOuter(UdtValue value) {
if (value == null) {
return null;
}
final int skillId = value.getInt(SkillRecordUDT.SKILL_ID);
final SkillId skillId = SkillId.fromValue(value.getInt(SkillRecordUDT.SKILL_ID));
final SkillRecord sr = new SkillRecord(skillId);
sr.setSkillLevel(value.getInt(SkillRecordUDT.SKILL_LEVEL));
sr.setMasterLevel(value.getInt(SkillRecordUDT.MASTER_LEVEL));
Expand All @@ -36,7 +37,7 @@ protected UdtValue outerToInner(SkillRecord sr) {
return null;
}
return getCqlType().newValue()
.setInt(SkillRecordUDT.SKILL_ID, sr.getSkillId())
.setInt(SkillRecordUDT.SKILL_ID, sr.getSkillId().getId())
.setInt(SkillRecordUDT.SKILL_LEVEL, sr.getSkillLevel())
.setInt(SkillRecordUDT.MASTER_LEVEL, sr.getMasterLevel());
}
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/kinoko/handler/field/MobHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package kinoko.handler.field;

import kinoko.handler.Handler;
import kinoko.meta.SkillId;
import kinoko.packet.field.MobPacket;
import kinoko.packet.user.UserLocal;
import kinoko.packet.world.BroadcastPacket;
Expand Down Expand Up @@ -238,9 +239,9 @@ public static void handleMobTimeBombEnd(User user, InPacket inPacket) {
if (mob.getRelativeRect(SkillConstants.MONSTER_BOMB_RANGE).isInsideRect(x, y)) {
final int damage = (int) Math.min(CalcDamage.calcDamageMax(user), user.getHp() - 100);
user.addHp(-damage);
user.write(UserLocal.timeBombAttack(Thief.MONSTER_BOMB, mob.getX(), mob.getY(), 120, damage));
user.write(UserLocal.timeBombAttack(SkillId.DB5_MONSTER_BOMB, mob.getX(), mob.getY(), 120, damage));
} else {
user.write(UserLocal.timeBombAttack(Thief.MONSTER_BOMB, mob.getX(), mob.getY(), 0, 0));
user.write(UserLocal.timeBombAttack(SkillId.DB5_MONSTER_BOMB, mob.getX(), mob.getY(), 0, 0));
}
}

Expand Down
124 changes: 63 additions & 61 deletions src/main/java/kinoko/handler/user/AttackHandler.java

Large diffs are not rendered by default.

47 changes: 24 additions & 23 deletions src/main/java/kinoko/handler/user/HitHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package kinoko.handler.user;

import kinoko.handler.Handler;
import kinoko.meta.SkillId;
import kinoko.packet.user.SummonedPacket;
import kinoko.packet.user.UserLocal;
import kinoko.packet.user.UserRemote;
Expand Down Expand Up @@ -215,7 +216,7 @@ private static int handleReflect(User user, HitInfo hitInfo) {
} else if (user.getSecondaryStat().hasOption(CharacterTemporaryStat.ManaReflection)) {
// Mana Reflection - reflect si.getValue(SkillStat.x, nManaReflection) %
final TemporaryStatOption option = user.getSecondaryStat().getOption(CharacterTemporaryStat.ManaReflection);
final Optional<SkillInfo> skillInfoResult = SkillProvider.getSkillInfoById(option.rOption);
final Optional<SkillInfo> skillInfoResult = SkillProvider.getSkillInfoById(option.getSkillId());
if (skillInfoResult.isPresent()) {
final int percentage = skillInfoResult.get().getValue(SkillStat.x, option.nOption);
final Mob mob = mobResult.get();
Expand All @@ -238,8 +239,8 @@ private static int handleMesoGuard(User user, HitInfo hitInfo) {
return 0;
}
// Calculate reduction rate
final int mesoGuardRate = Math.clamp(50 + user.getSkillStatValue(Thief.MESO_MASTERY, SkillStat.v), 50, 100); // hard coded 50
final int mesoRequiredRate = Math.max(0, user.getSkillStatValue(Thief.MESO_GUARD, SkillStat.x) - user.getSkillStatValue(Thief.MESO_MASTERY, SkillStat.w));
final int mesoGuardRate = Math.clamp(50 + user.getSkillStatValue(SkillId.SHADOWER_MESO_MASTERY, SkillStat.v), 50, 100); // hard coded 50
final int mesoRequiredRate = Math.max(0, user.getSkillStatValue(SkillId.CHIEFBANDIT_MESO_GUARD, SkillStat.x) - user.getSkillStatValue(SkillId.SHADOWER_MESO_MASTERY, SkillStat.w));
// Calculate damage reduction
final int realDamage = Math.clamp(hitInfo.damage, 1, GameConstants.DAMAGE_MAX);
final int mesoGuardReduce = realDamage * mesoGuardRate / 100;
Expand All @@ -264,14 +265,14 @@ private static int handleMesoGuard(User user, HitInfo hitInfo) {

private static int getAchillesReduce(User user, int damage) {
// CUserLocal::GetAchillesReduce
final int skillId = switch (user.getJob()) {
case 112 -> Warrior.ACHILLES_HERO;
case 122 -> Warrior.ACHILLES_PALADIN;
case 132 -> Warrior.ACHILLES_DRK;
case 2112 -> Aran.HIGH_DEFENSE;
default -> 0;
final SkillId skillId = switch (user.getJob()) {
case 112 -> SkillId.HERO_ACHILLES;
case 122 -> SkillId.PALADIN_ACHILLES;
case 132 -> SkillId.DRK_ACHILLES;
case 2112 -> SkillId.ARAN4_HIGH_DEFENSE;
default -> SkillId.NONE;
};
if (skillId == 0) {
if (skillId.isNone()) {
return 0;
}
final int x = user.getSkillStatValue(skillId, SkillStat.x);
Expand Down Expand Up @@ -314,7 +315,7 @@ private static int getBlueAuraReduce(User user, int damage) {
return 0;
}
final TemporaryStatOption option = user.getSecondaryStat().getOption(CharacterTemporaryStat.BlueAura);
final int skillId = option.rOption;
final SkillId skillId = option.getSkillId();
final int slv = option.nOption;
final Optional<SkillInfo> skillInfoResult = SkillProvider.getSkillInfoById(skillId);
if (skillInfoResult.isEmpty()) {
Expand All @@ -330,20 +331,20 @@ private static void handleGuardian(User user, HitInfo hitInfo) {
if (hitInfo.knockback <= 1) {
return;
}
final int stunDuration = user.getSkillStatValue(Warrior.GUARDIAN, SkillStat.time);
final int stunDuration = user.getSkillStatValue(SkillId.PALADIN_GUARDIAN, SkillStat.time);
if (stunDuration == 0) {
return;
}
final Optional<Mob> knockbackMobResult = user.getField().getMobPool().getById(hitInfo.reflectMobId);
knockbackMobResult.ifPresent(mob -> mob.setTemporaryStat(MobTemporaryStat.Stun, MobStatOption.of(1, Warrior.GUARDIAN, stunDuration * 1000), 0));
knockbackMobResult.ifPresent(mob -> mob.setTemporaryStat(MobTemporaryStat.Stun, MobStatOption.of(1, SkillId.PALADIN_GUARDIAN.getId(), stunDuration * 1000), 0));
}

private static void handleDivineShield(User user, HitInfo hitInfo) {
if (hitInfo.attackIndex <= AttackIndex.Counter.getValue()) {
return;
}
// Resolve skill
final int skillId = Warrior.DIVINE_SHIELD;
final SkillId skillId = SkillId.PALADIN_DIVINE_SHIELD;
final Optional<SkillInfo> skillInfoResult = SkillProvider.getSkillInfoById(skillId);
if (skillInfoResult.isEmpty()) {
log.error("Could not resolve skill info for divine shield skill ID : {}", skillId);
Expand All @@ -363,7 +364,7 @@ private static void handleDivineShield(User user, HitInfo hitInfo) {
CharacterTemporaryStat.BlessingArmorIncPAD, ss.getOption(CharacterTemporaryStat.BlessingArmorIncPAD) // required for TemporaryStatSet
));
} else {
user.resetTemporaryStat(skillId);
user.resetTemporaryStat(skillId.getId());
user.setSkillCooltime(skillId, si.getValue(SkillStat.cooltime, slv));
}
} else {
Expand All @@ -383,13 +384,13 @@ private static void handleBeholderCounter(User user, HitInfo hitInfo) {
return;
}
// Resolve summoned
final Optional<Summoned> summonedResult = user.getSummonedBySkillId(Warrior.BEHOLDER);
final Optional<Summoned> summonedResult = user.getSummonedBySkillId(SkillId.DRK_BEHOLDER);
if (summonedResult.isEmpty()) {
return;
}
final Summoned summoned = summonedResult.get();
// Resolve skill info
final int skillId = Warrior.HEX_OF_THE_BEHOLDER_COUNTER;
final SkillId skillId = SkillId.DRK_HEX_OF_THE_BEHOLDER;
final int slv = user.getSkillLevel(skillId);
if (slv == 0) {
return;
Expand Down Expand Up @@ -441,7 +442,7 @@ private static void handleEvasionBoost(User user, HitInfo hitInfo) {
if (hitInfo.damage > 0) {
return;
}
if (user.getSkillLevel(Bowman.EVASION_BOOST_BM) > 0 || user.getSkillLevel(Bowman.EVASION_BOOST_MM) > 0) {
if (user.getSkillLevel(SkillId.SNIPER_EVASION_BOOST) > 0 || user.getSkillLevel(SkillId.RANGER_EVASION_BOOST) > 0) {
user.getCalcDamage().setNextAttackCritical(true);
}
}
Expand All @@ -450,7 +451,7 @@ private static void handleVengeance(User user, HitInfo hitInfo) {
if (hitInfo.attackIndex <= AttackIndex.Counter.getValue()) {
return;
}
final int prop = user.getSkillStatValue(Bowman.VENGEANCE, SkillStat.prop);
final int prop = user.getSkillStatValue(SkillId.BOWMASTER_VENGEANCE, SkillStat.prop);
if (prop != 0 && Util.succeedProp(prop)) {
user.write(UserLocal.requestVengeance());
}
Expand All @@ -468,7 +469,7 @@ private static void handleDarkFlare(User user, HitInfo hitInfo) {
return;
}
// Resolve skill info
final Optional<SkillInfo> skillInfoResult = SkillProvider.getSkillInfoById(summoned.getSkillId());
final Optional<SkillInfo> skillInfoResult = SkillProvider.getSkillInfoById(SkillId.fromValue(summoned.getSkillId()));
if (skillInfoResult.isEmpty()) {
log.error("Could not resolve skill info for dark flare skill ID : {}", summoned.getSkillId());
return;
Expand Down Expand Up @@ -502,7 +503,7 @@ private static void handlePiratesRevenge(User user, HitInfo hitInfo) {
if (hitInfo.attackIndex <= AttackIndex.Counter.getValue()) {
return;
}
final int skillId = SkillConstants.getPiratesRevengeSkill(user.getJob());
final SkillId skillId = SkillConstants.getPiratesRevengeSkill(user.getJob());
if (user.getSkillManager().hasSkillCooltime(skillId)) {
return;
}
Expand Down Expand Up @@ -534,9 +535,9 @@ private static void handleBattleship(User user, HitInfo hitInfo) {
if (newDurability > 0) {
Pirate.setBattleshipDurability(user, newDurability);
} else {
user.getSkillManager().getSkillCooltimes().remove(SkillConstants.BATTLESHIP_DURABILITY);
user.getSkillManager().getSkillCooltimes().remove(SkillId.CORSAIR_BATTLESHIP_DURABILITY);
user.resetTemporaryStat(option.rOption);
user.setSkillCooltime(option.rOption, user.getSkillStatValue(option.rOption, SkillStat.cooltime));
user.setSkillCooltime(option.getSkillId(), user.getSkillStatValue(option.getSkillId(), SkillStat.cooltime));
}
}
}
3 changes: 2 additions & 1 deletion src/main/java/kinoko/handler/user/PetHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package kinoko.handler.user;

import kinoko.handler.Handler;
import kinoko.meta.SkillId;
import kinoko.packet.user.PetPacket;
import kinoko.packet.user.UserLocal;
import kinoko.packet.user.UserRemote;
Expand Down Expand Up @@ -69,7 +70,7 @@ public static void handleUserActivatePetRequest(User user, InPacket inPacket) {
final long petSn = item.getItemSn();
final Optional<Integer> petIndexResult = user.getPetIndex(petSn);
if (petIndexResult.isEmpty()) {
final boolean hasFollowTheLead = user.getSkillLevel(SkillConstants.getNoviceSkillAsRace(Beginner.FOLLOW_THE_LEAD, user.getJob())) > 0;
final boolean hasFollowTheLead = user.getSkillLevel(SkillConstants.getNoviceSkillAsRace(SkillId.BEGINNER_FOLLOW_THE_LEAD, user.getJob())) > 0;
if (hasFollowTheLead && !bossPet) {
// Check if max number of pets active
if (user.getPets().size() >= GameConstants.PET_COUNT_MAX) {
Expand Down
Loading