/* * IDK Game Server by Steve Winfield * https://github.com/WinfieldSteve */ package org.stevewinfield.suja.idk.game.achievements; import org.apache.log4j.Logger; import org.magicwerk.brownies.collections.GapList; import org.stevewinfield.suja.idk.Bootloader; import org.stevewinfield.suja.idk.communication.achievement.writers.AchievementProgressWriter; import org.stevewinfield.suja.idk.communication.achievement.writers.AchievementUnlockedWriter; import org.stevewinfield.suja.idk.communication.player.writers.ActivityPointsWriter; import org.stevewinfield.suja.idk.game.friendstream.FriendStreamEventType; import org.stevewinfield.suja.idk.game.players.PlayerAchievement; import org.stevewinfield.suja.idk.network.sessions.Session; import java.sql.ResultSet; import java.sql.SQLException; import java.util.concurrent.ConcurrentHashMap; public class AchievementManager { private static final Logger logger = Logger.getLogger(AchievementManager.class); public ConcurrentHashMap<String, Achievement> getAchievements() { return achievements; } public AchievementManager() { this.achievements = new ConcurrentHashMap<>(); try { int achievementsLoaded = 0; int achievemntLevelsLoaded = 0; ResultSet row = Bootloader.getStorage().queryParams("SELECT * FROM achievements").executeQuery(); while (row.next()) { if (!this.achievements.containsKey(row.getString("group_name"))) { final Achievement achievement = new Achievement(); achievement.set(row); this.achievements.put(row.getString("group_name"), achievement); achievementsLoaded++; } } row = Bootloader.getStorage().queryParams("SELECT * FROM achievement_levels ORDER BY id").executeQuery(); while (row.next()) { Achievement ach = null; for (final Achievement entry : this.achievements.values()) { if (entry.getId() == row.getInt("achievement_id")) { ach = entry; break; } } if (ach == null) { continue; } ach.addLevel(row.getInt("level_reward"), row.getInt("level_score"), row.getInt("progress_needed")); achievemntLevelsLoaded++; } row.close(); final GapList<String> toRemove = new GapList<>(); for (final Achievement achievement : this.achievements.values()) { if (achievement.getLevelCount() < 1) { toRemove.add(achievement.getGroupName()); } } for (final String x : toRemove) { this.achievements.remove(x); } logger.info(achievementsLoaded + " Achievement(s) loaded."); logger.info(achievemntLevelsLoaded + " Achievement Level(s) loaded."); } catch (final SQLException e) { logger.error("SQL Exception", e); } } public boolean progressAchievement(final Session session, final String achievementName, final int progressAmount) { if (!this.achievements.containsKey(achievementName)) { return false; } final Achievement achievement = this.achievements.get(achievementName); if (achievement == null) { return false; } PlayerAchievement playerAchievement = null; if (session.getPlayerInstance().getAchievements().containsKey(achievement.getId())) { playerAchievement = session.getPlayerInstance().getAchievements().get(achievement.getId()); } if (playerAchievement != null && playerAchievement.getLevel() == achievement.getLevelCount()) { return false; } int targetLevel = playerAchievement != null ? playerAchievement.getLevel() + 1 : 1; if (targetLevel > achievement.getLevelCount()) { targetLevel = achievement.getLevelCount(); } int newProgress = playerAchievement != null ? playerAchievement.getProgress() + progressAmount : progressAmount; final AchievementLevel level = achievement.getLevels().get(targetLevel); int newLevel = playerAchievement != null ? playerAchievement.getLevel() : 0; int newTarget = newLevel + 1; if (newTarget > achievement.getLevelCount()) { newTarget = achievement.getLevelCount(); } if (newProgress >= level.getRequirement()) { newLevel++; newTarget++; if (newTarget > achievement.getLevelCount()) { newTarget = achievement.getLevelCount(); } if (level.getPixelsReward() > 0) { session.getPlayerInstance().getInformation().setPixels(level.getPixelsReward()); session.writeMessage(new ActivityPointsWriter(session.getPlayerInstance().getInformation().getPixelsBalance(), session.getPlayerInstance().getInformation().getShellsBalance())); session.getPlayerInstance().getInformation().updateCurrencies(); } session.writeMessage(new AchievementUnlockedWriter(achievement, targetLevel, level.getPointsReward(), level.getPixelsReward())); playerAchievement = session.getPlayerInstance().setAchievement(achievement.getId(), newLevel, progressAmount); session.writeMessage(new AchievementProgressWriter(achievement, newTarget, achievement.getLevels().get(newTarget), achievement.getLevelCount(), playerAchievement)); session.getFriendStream().broadcastEvent(session, FriendStreamEventType.GET_ACHIEVEMENT_BADGE, 0, new String[]{achievement.getGroupName() + newLevel}); return true; } playerAchievement = session.getPlayerInstance().setAchievement(achievement.getId(), newLevel, progressAmount); session.writeMessage(new AchievementProgressWriter(achievement, targetLevel, level, achievement.getLevelCount(), playerAchievement)); return false; } private final ConcurrentHashMap<String, Achievement> achievements; }