Доброе время суток. Можете подсказать, как можно реализовать ежедневное списывание ОС? Сборка 4,9, есть в статс вот такая фигня dailyReduceGp Как можно реализовать это в сервисе? ну чтобы списывалось или этим параметром или же по базе в минус n-ое ос каждому рангу, каждый день в 9 утра например. Ну типо время 9 утра и идет списывание ос у каждого ранга. Например у STAR1_OFFICER с id 10 списывается 15ос И второй вопрос, как можно это переделать так, чтобы вылазило у персонажа 1 раз в день?
Код ко второму вопросу. (что-то скрытый контент не сробил на форуме) gpAnnounce(player); private static void gpAnnounce (Player player) { AbyssRank abyssRank = player.getAbyssRank(); if (abyssRank.getRank().getId() >= AbyssRankEnum.STAR1_OFFICER.getId()) { int gp = player.getAbyssRank().getRank().getDailyReduceGp(); PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_GLORY_POINT_LOSE_COMMON); PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_GLORY_POINT_LOSE_PERSONAL(player.getName(), gp)); } }
public class GpReduceUpdate{ private static final Logger _log = LoggerFactory.getLogger(GpReduceUpdate.class); private static final String UpdateTime = "0 0 9 ? * *"; //everyday at 9 am private static final GpReduceUpdate instance = new GpReduceUpdate(); public static GpReduceUpdate getInstance() { return instance; } public void update() { CronService.getInstance().schedule(new Runnable() { @Override public void run() { World.getInstance().doOnAllPlayers(new Visitor<Player>() { @Override public void visit(Player player) { //Код по снижению Гп } }); } }, UpdateTime); } }
Ну вот выше метода кусок. Осталось только делать запрос в дб с условием ранга и снимать в зависимости от ранга то или иное кол-во ОС.
зачем колесо придумывать , возьми сборки 5+ от немцев например там давно все реализовано , должно быть )))
ну если хочешь "сам" на тебе кусок кода готового Код: public void GpointUpdata() { CronService.getInstance().schedule(new Runnable() { public void run() { AbyssRankUpdateService.this.loadGpRank(); } }, GP_UPDATA_TIME); } private void loadGpRank() { List<Integer> rankPlayers = DAOManager.getDAO(AbyssRankDAO.class).RankPlayers(9); delGpoint(rankPlayers); } private void delGpoint(List<Integer> rankPlayers) { for (int playerId : rankPlayers) { AbyssRank rank = DAOManager.getDAO(AbyssRankDAO.class).loadAbyssRank(playerId); Player player = World.getInstance().findPlayer(playerId); int lostGp = rank.getRank().getDelGp(); // списываем только с офицеров и выше if (rank.getRank().getId() < AbyssRankEnum.STAR1_OFFICER.getId()) continue; if (player != null) { PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1402082, new Object[0])); PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_GLORY_POINT_LOSE_PERSONAL(AbyssRankEnum.getRankDescriptionId(player), rank.getRank().getDelGp())); AbyssPointsService.addAGp(player, 0, lostGp * -1); } else { int newGP = rank.getGp() - lostGp; if (newGP < 0) newGP = 0; debuglog.info("[GP REWARD LOG] Scheduled delete. Player: " + playerId + ". Last: " + rank.getGp() +". New: "+ newGP); DAOManager.getDAO(AbyssRankDAO.class).updataGloryPoint(playerId, newGP); } } }
слепил вот это, исходя из ваших ответов, сам код оказывается был (как и сказал рома) Код: public void GpointUpdata() { CronService.getInstance().schedule(new Runnable() { public void run() { List<Integer> rankPlayers = DAOManager.getDAO(AbyssRankDAO.class).RankPlayers(9); for (int playerId : rankPlayers) { AbyssRank rank = DAOManager.getDAO(AbyssRankDAO.class).loadAbyssRank(playerId); Player player = World.getInstance().findPlayer(playerId); int lostGp = rank.getRank().getDailyReduceGp(); // Only Rank Officer if (rank.getRank().getId() < AbyssRankEnum.STAR1_OFFICER.getId()) continue; if (player != null) { PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1402082, new Object[0])); PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1402209, player.getName(), rank.getRank().getDailyReduceGp())); AbyssPointsService.addGp(player, lostGp * -1); } else { int newGP = rank.getGp() - lostGp; if (newGP < 0) newGP = 0; debuglog.info("[GP REWARD LOG] Scheduled delete. Player: " + playerId + ". Last: " + rank.getGp() +". New: "+ newGP); DAOManager.getDAO(AbyssRankDAO.class).updateGloryPoints(playerId, newGP); } } } }, RankingConfig.GP_UPDATA_TIME); } Скомпилировалось, но вот все равно не снимает ос. Может кто помочь с этим? Где надо подправить или изменить. Без стеба и "камней"
Код: @Override public void updateGloryPoints(final int playerId, final int gp) { Connection con = null; try { con = DatabaseFactory.getConnection(); PreparedStatement stmt = con.prepareStatement(UPDATE_GLORY_POINTS); stmt.setInt(1, gp); stmt.setInt(2, playerId); stmt.execute(); stmt.close(); } catch (Exception e) { log.error(e.getMessage(), e); } finally { DatabaseFactory.close(con); } } MySQL5AbyssRankDAO.java Код: public void GpUpdateTask() { log.info("[GP SCHEDULED] Update gp start."); CronService.getInstance().schedule(new Runnable() { public void run() { AbyssRankUpdateService.this.loadGpRank(); } }, RankingConfig.GP_UPDATE_TASK); } private void loadGpRank() { List<Integer> rankPlayers = DAOManager.getDAO(AbyssRankDAO.class).RankPlayers(9); reduceGP(rankPlayers); } private void reduceGP(List<Integer> rankPlayers) { log.info("[GP SCHEDULED] Task Scheduled delete GP."); for (int playerId : rankPlayers) { AbyssRank rank = DAOManager.getDAO(AbyssRankDAO.class).loadAbyssRank(playerId); Player player = World.getInstance().findPlayer(playerId); int lostGp = rank.getRank().getDailyReduceGp(); if (rank.getRank().getId() < AbyssRankEnum.STAR1_OFFICER.getId()) continue; if (player != null) { PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1402082, new Object[0])); PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1402209, player.getName(), rank.getRank().getDailyReduceGp())); AbyssPointsService.addGp(player, lostGp * -1); } else { int newGP = rank.getGp() - lostGp; if (newGP < 0) newGP = 0; DAOManager.getDAO(AbyssRankDAO.class).updateGloryPoints(playerId, newGP); } } } AbyssRankUpdateService.java Код: public abstract void updateGloryPoints(final int playerId, final int gp); public abstract List<Integer> RankPlayers(final int rank); AbyssRankDAO.java психанул
Держи. Закинешь в сервис AbyssRankUpdateService loadOrUpdateWeeklyReward метод настрой под себя Код: public void rewardWeeklyUpdate() { CronService.getInstance().schedule(new Runnable() { public void run() { List<Integer> rankPlayers = DAOManager.getDAO(AbyssRankDAO.class).loadWeeklyRewardPlayers(9); loadOrUpdateWeeklyReward(rankPlayers); } }, RankingConfig.WEEKLY_REWARDS); } private void loadOrUpdateWeeklyReward(List<Integer> rankPlayers) { for (Integer playerId : rankPlayers) { AbyssRank rank = DAOManager.getDAO(AbyssRankDAO.class).loadAbyssRank(playerId); Player player = World.getInstance().findPlayer(playerId); int medalReward = rank.getRank().getMedalReward(); int apReward = rank.getRank().getAbyssPointReward(); String name = DAOManager.getDAO(PlayerDAO.class).getPlayerNameByObjId(playerId); // Lost Glory point's int rankId = rank.getRank().getId(); if ((rankId > 14) && (rank.getGp() > 0) && (rank.getWeeklyGP() < 12550)) { rank.setGP(rank.getGp() - 5210); DAOManager.getDAO(AbyssRankDAO.class).updateGp(playerId, rank); SystemMailService.getInstance().sendMail("Система", name, "Рейтинг бездны", "Требуемый еженедельный вклад не внесен. Списано 5210 очков славы.", 0, 0, 0, 0, LetterType.NORMAL); } else if ((rankId > 9 && rankId < 15) && (rank.getGp() > 0) && (rank.getWeeklyGP() < 1450)) { rank.setGP(0); DAOManager.getDAO(AbyssRankDAO.class).updateGp(playerId, rank); SystemMailService.getInstance().sendMail("Система", name, "Рейтинг бездны", "Требуемый еженедельный вклад не внесен. Очки славы обнулены.", 0, 0, 0, 0, LetterType.NORMAL); } } AbyssRankUpdateService.this.performUpdate(); ThreadPoolManager.getInstance().schedule(new Runnable() { @Override public void run() { rankPlayers.clear(); } }, 2000); } public void scheduleUpdate() { ThreadPoolManager.getInstance().schedule(new Runnable() { @Override public void run() { log.info("AbyssRankUpdateService: ranks update scheduled."); ServerVariablesDAO dao = DAOManager.getDAO(ServerVariablesDAO.class); int nextTime = dao.load("abyssRankUpdate"); if (nextTime < System.currentTimeMillis() / 1000L) performUpdate(); CronService.getInstance().schedule(new Runnable() { public void run() { AbyssRankUpdateService.this.performUpdate(); } }, RankingConfig.TOP_RANKING_UPDATE_RULE, true); } }, 1000); } public void performUpdate() { long startTime = System.currentTimeMillis(); updateLimitedRanks(); AbyssRankingCache.getInstance().reloadRankings(); Long.valueOf((System.currentTimeMillis() - startTime) / 1000L); } DAO Код: public abstract List<Integer> loadWeeklyRewardPlayers(int rank); public abstract void updateGp(int playerId, AbyssRank rank); Sql5 Код: public static final String SELECT_WEEKLY_REWARD = "SELECT player_id FROM abyss_rank WHERE rank > ?"; public static final String UPDATE_WEEKLY_REWARD = "UPDATE abyss_rank SET gp = ? WHERE player_id = ?"; @Override public List<Integer> loadWeeklyRewardPlayers(int rank) { List<Integer> players = new ArrayList<Integer>(); Connection con = null; PreparedStatement stmt = null; try { con = DatabaseFactory.getConnection(); stmt = con.prepareStatement(SELECT_WEEKLY_REWARD); stmt.setInt(1, rank); ResultSet resultSet = stmt.executeQuery(); while (resultSet.next()) { int playerId = resultSet.getInt("player_id"); if (!players.contains(playerId)) players.add(playerId); } } catch (Exception e) { log.error(e.getMessage(), e); } finally { DatabaseFactory.close(stmt, con); } return players; } @Override public void updateGp(int playerId, final AbyssRank rank) { Connection con = null; try { con = DatabaseFactory.getConnection(); PreparedStatement stmt = con.prepareStatement(UPDATE_WEEKLY_REWARD); stmt.setInt(1, rank.getGp()); stmt.setInt(2, playerId); // Default stmt.execute(); stmt.close(); } catch (SQLException e) { log.error("updateGp", e); } finally { DatabaseFactory.close(con); } }
Добавь геттер и сеттер в AbyssRank Код: public int getGp() { return this.currentGP; } public void setGP(int currentGP) { this.currentGP = currentGP; }