↑ ↓

Списывание ОС(Gp)

Тема в разделе "Помощь", создана пользователем nokiafan1111, 19 июн 2018.

  1. TopicStarter Overlay
    Offline

    nokiafan1111 Ефрейтор

    331
    21
    51
    Кредиты:
    $329,63
    Репутация:
    2
    Доброе время суток.
    Можете подсказать, как можно реализовать ежедневное списывание ОС?
    Сборка 4,9, есть в статс вот такая фигня dailyReduceGp
    Как можно реализовать это в сервисе? ну чтобы списывалось или этим параметром или же по базе в минус n-ое ос каждому рангу, каждый день в 9 утра например.
    Ну типо время 9 утра и идет списывание ос у каждого ранга. Например у STAR1_OFFICER с id 10 списывается 15ос

    И второй вопрос, как можно это переделать так, чтобы вылазило у персонажа 1 раз в день?
     
  2. TopicStarter Overlay
    Offline

    nokiafan1111 Ефрейтор

    331
    21
    51
    Кредиты:
    $329,63
    Репутация:
    2
    Код ко второму вопросу. (что-то скрытый контент не сробил на форуме)
    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));
    }
    }
     
  3. Offline

    Systems Ефрейтор

    209
    21
    51
    Кредиты:
    $15.430,38
    Репутация:
    0

    Накидал на скорую руку, дальше у тебя есть пример выше.
     
  4. Offline

    Systems Ефрейтор

    209
    21
    51
    Кредиты:
    $15.430,38
    Репутация:
    0
    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. Offline

    WeRn Ефрейтор

    496
    59
    59
    Кредиты:
    $16.147,43
    Репутация:
    8
    Ну вот выше метода кусок. Осталось только делать запрос в дб с условием ранга и снимать в зависимости от ранга то или иное кол-во ОС.
     
    yayaya нравится это.
  6. Offline

    romanz Ефрейтор Модератор

    743
    165
    76
    Кредиты:
    $26.070,43
    Репутация:
    23
    зачем колесо придумывать , возьми сборки 5+ от немцев например там давно все реализовано , должно быть )))
     
  7. Offline

    romanz Ефрейтор Модератор

    743
    165
    76
    Кредиты:
    $26.070,43
    Репутация:
    23
    ну если хочешь "сам" на тебе кусок кода готового

    Код:
    	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);
    			}
    		}
    	}
     
  8. Offline

    romanz Ефрейтор Модератор

    743
    165
    76
    Кредиты:
    $26.070,43
    Репутация:
    23
    пихать сюда если что AbyssRankUpdateService.java
     
  9. Offline

    WeRn Ефрейтор

    496
    59
    59
    Кредиты:
    $16.147,43
    Репутация:
    8
    Можно ж и отдельным сервисом как у лайтов например) AbyssPoints сервисы есть и GloryPoints сервисы
     
  10. Offline

    romanz Ефрейтор Модератор

    743
    165
    76
    Кредиты:
    $26.070,43
    Репутация:
    23
    с дуру можно и х.й сломать )) , если он не знает где что исправить думаешь он сервис писать будет )
     
  11. Offline

    SG Shaiy Ефрейтор

    402
    95
    61
    Кредиты:
    $15.767,72
    Репутация:
    9
  12. TopicStarter Overlay
    Offline

    nokiafan1111 Ефрейтор

    331
    21
    51
    Кредиты:
    $329,63
    Репутация:
    2
    слепил вот это, исходя из ваших ответов, сам код оказывается был (как и сказал рома)
    Код:
    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);
    	}
    Скомпилировалось, но вот все равно не снимает ос.
    Может кто помочь с этим? Где надо подправить или изменить. Без стеба и "камней"
     
  13. Offline

    romanz Ефрейтор Модератор

    743
    165
    76
    Кредиты:
    $26.070,43
    Репутация:
    23
    ну все рабочее , для того чтобы проверить сервер должен работать или время обновления меняй
     
  14. TopicStarter Overlay
    Offline

    nokiafan1111 Ефрейтор

    331
    21
    51
    Кредиты:
    $329,63
    Репутация:
    2
    менял время обновления, проверял у себя на локалхосте. Или же нужен удаленный сервер?
     
  15. Offline

    yayaya Ефрейтор Команда форума

    587
    183
    76
    Кредиты:
    $20.524,68
    Репутация:
    38
    Код:
    	@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

    психанул
     
    nokiafan1111 нравится это.
  16. Offline

    romanz Ефрейтор Модератор

    743
    165
    76
    Кредиты:
    $26.070,43
    Репутация:
    23
    :D
     
  17. Offline

    WeRn Ефрейтор

    496
    59
    59
    Кредиты:
    $16.147,43
    Репутация:
    8
    :D:D
     
  18. TopicStarter Overlay
    Offline

    nokiafan1111 Ефрейтор

    331
    21
    51
    Кредиты:
    $329,63
    Репутация:
    2
    Андрей спасибо) это уже есть внутри сборки, но не работает.:minion_curious:
     
  19. Offline

    Dision Ефрейтор Команда форума VIP

    274
    62
    61
    Кредиты:
    $15.415,48
    Репутация:
    7
    Держи. Закинешь в сервис 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);
    		}
    	}
     
    Последние данные очков репутации:
    nokiafan1111: 1 Очко 21 июн 2018
    nokiafan1111 нравится это.
  20. Offline

    Dision Ефрейтор Команда форума VIP

    274
    62
    61
    Кредиты:
    $15.415,48
    Репутация:
    7
    Добавь геттер и сеттер в AbyssRank

    Код:
    	public int getGp() {
    		return this.currentGP;
    	}
    	
    	public void setGP(int currentGP) {
    		this.currentGP = currentGP;
    	}
     
    nokiafan1111 нравится это.