/* * Copyright 2014 The Skfiy Open Association. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.skfiy.typhon.spi.ranking; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import javax.inject.Inject; import org.skfiy.typhon.AbstractComponent; import org.skfiy.typhon.Typhons; import org.skfiy.typhon.domain.FightGroup; import org.skfiy.typhon.domain.GlobalData; import org.skfiy.typhon.domain.HeroProperty; import org.skfiy.typhon.domain.HeroPropertyKeys; import org.skfiy.typhon.domain.IHeroEntity; import org.skfiy.typhon.domain.Normal; import org.skfiy.typhon.domain.Player; import org.skfiy.typhon.domain.PveProgress; import org.skfiy.typhon.domain.Role; import org.skfiy.typhon.domain.VacantData; import org.skfiy.typhon.domain.item.HeroItem; import org.skfiy.typhon.packet.SingleValue; import org.skfiy.typhon.repository.GlobalDataRepository; import org.skfiy.typhon.session.Session; import org.skfiy.typhon.session.SessionManager; import org.skfiy.typhon.session.SessionUtils; import org.skfiy.typhon.spi.RoleProvider; import org.skfiy.typhon.spi.pve.RankingListRival; import org.skfiy.typhon.spi.society.SocietyProvider; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; /** * * @author Kevin Zou <kevinz@skfiy.org> */ public abstract class AbstractRankingProvider extends AbstractComponent { private static final Timer TIMER = new Timer("Ranking-Timer", true); private final List<RankingObject> rankingObjects = new ArrayList<>(50); @Inject protected GlobalDataRepository globalDataReposy; @Inject protected SessionManager sessionManager; @Inject protected RoleProvider roleProvider; @Inject protected SocietyProvider societyProvider; @Override protected void doInit() { rankingObjects.addAll(JSON.parseArray(loadRankingData(), RankingObject.class)); // 定时保存PVE数据 TIMER.scheduleAtFixedRate(new TimerTask() { @Override public void run() { saveRankingData(); } }, Typhons.getLong("typhon.spi.ranking.saveDataFixedRateMs"), Typhons.getLong("typhon.spi.ranking.saveDataFixedRateMs")); // FIXME 统一的参数设计 } @Override protected void doReload() {} @Override protected void doDestroy() { saveRankingData(); } /** * * @param player */ public synchronized boolean updateRanking(Player player) { boolean bool = false; if (player.getNormal().getLevel() < 10) { return bool; } if (rankingObjects.isEmpty()) { rankingObjects.add(newRankingObject(player)); bool=true; } else { RankingObject rankingObject; for (int i = rankingObjects.size() - 1; i >= 0; i--) { rankingObject = rankingObjects.get(i); if (compare(player, rankingObject)) { rankingObject = newRankingObject(player); removeSpilthRanking(rankingObject.getRid()); rankingObjects.add(i, rankingObject); } else if (!bool) { if (rankingObjects.size() < 50) { rankingObject = newRankingObject(player); removeSpilthRanking(rankingObject.getRid()); rankingObjects.add(rankingObject); } break; } bool = true; } } return bool; } public List<RankingListRival> loadLevelRankingList(SingleValue packet) { List<RankingListRival> list = new ArrayList<>(); for (int i = 0; i < rankingObjects.size(); i++) { RankingObject pveO = rankingObjects.get(i); list.add(loadRankingObject(pveO)); } return list; } protected RankingListRival loadRankingObject(RankingObject pve0) { // FIXME 实现 List<Object> heros = new ArrayList<>(); RankingListRival pveRival = new RankingListRival(); Session session = sessionManager.getSession(pve0.getRid()); if (session == null) { VacantData vacantData = roleProvider.loadVacantData(pve0.getRid()); pveRival.setName(vacantData.getName()); pveRival.setSocietyName(vacantData.getSocietyName()); String[] fightGroup = vacantData.getFightGroups()[vacantData.getLastFidx()]; for (String id : fightGroup) { HeroProperty hero = vacantData.findHeroProperty(id); heros.add(newHeroJSONObject(hero)); } pveRival.setHero(heros); } else { Player player = SessionUtils.getPlayer(session); Role role = player.getRole(); pveRival.setName(role.getName()); pveRival.setLevel(role.getLevel()); Normal normal = player.getNormal(); pveRival.setSocietyName(normal.getSocietyName()); FightGroup fightGroup = normal.getFightGroup(normal.getLastFidx()); for (HeroItem heroItem : fightGroup.getHeroItems()) { heros.add(newHeroJSONObject(heroItem)); } pveRival.setHero(heros); } pveRival.setPveProgresses(pve0.getPveProgresses()); pveRival.setAvatar(pve0.getAvatar()); pveRival.setAvatarBorder(pve0.getAvatarBorder()); pveRival.setLevel(pve0.getLevel()); pveRival.setPowerGuess(pve0.getPowerGuess()); pveRival.setStar(pve0.getStar()); pveRival.setHdPveProgresses(pve0.getHdPveProgresses()); return pveRival; } private Object newHeroJSONObject(IHeroEntity hero) { JSONObject json = new JSONObject(); json.put(HeroPropertyKeys.ID, hero.getId()); json.put(HeroPropertyKeys.LEVEL, hero.getLevel()); json.put(HeroPropertyKeys.STAR, hero.getStar()); json.put(HeroPropertyKeys.LADDER, hero.getLadder()); return json; } /** * * @param player * @return */ protected RankingObject newRankingObject(Player player) { // FIXME RankingObject rankingObject = new RankingObject(); Normal normal = player.getNormal(); rankingObject.setPveProgresses(normal.getHpveProgresses().size()); rankingObject.setRid(player.getRole().getRid()); rankingObject.setAvatar(normal.getAvatar()); rankingObject.setAvatarBorder(player.getNormal().getAvatarBorder()); rankingObject.setLevel(normal.getLevel()); rankingObject.setPowerGuess(returnPowerGuess(player)); rankingObject.setHdPveProgresses(normal.getHdpveProgresses().size()); rankingObject.setStar(normal.getPveStarCounts()); return rankingObject; } protected void removeSpilthRanking(int rid) { RankingObject pveObject; for (int i = 0; i < rankingObjects.size(); i++) { pveObject = rankingObjects.get(i); if (pveObject.getRid() == rid) { rankingObjects.remove(i); break; } } if (rankingObjects.size() > 49) { rankingObjects.remove(rankingObjects.size() - 1); } } private String loadRankingData() { GlobalData globalData = globalDataReposy.getGlobalData(getGlobalDataType()); return globalData.getData(); } private void saveRankingData() { GlobalData globalData = new GlobalData(); globalData.setType(getGlobalDataType()); globalData.setData(JSON.toJSONString(rankingObjects)); globalDataReposy.updateGlobalData(globalData); } public void updateOtherRanking(Player player) { Normal normal = player.getNormal(); int id = player.getRole().getRid(); for (int i = 0; i < rankingObjects.size(); i++) { RankingObject rankingObject = rankingObjects.get(i); if (rankingObject.getRid() == id) { rankingObject.setAvatar(normal.getAvatar()); rankingObject.setAvatarBorder(normal.getAvatarBorder()); rankingObject.setLevel(normal.getLevel()); rankingObject.setPveProgresses(normal.getHpveProgresses().size()); rankingObject.setPowerGuess(returnPowerGuess(player)); rankingObject.setHdPveProgresses(normal.getHdpveProgresses().size()); rankingObject.setStar(normal.getPveStarCounts()); break; } } } public void levleUpdateOtherRanking(Player player) { Normal normal = player.getNormal(); int id = player.getRole().getRid(); if (rankingObjects.size() == 0) { updateRanking(player); } else { for (int i = 0; i < rankingObjects.size(); i++) { RankingObject rankingObject = rankingObjects.get(i); if (rankingObject.getRid() == id) { rankingObject.setAvatar(normal.getAvatar()); rankingObject.setAvatarBorder(normal.getAvatarBorder()); rankingObject.setLevel(normal.getLevel()); rankingObject.setPveProgresses(normal.getHpveProgresses().size()); rankingObject.setPowerGuess(returnPowerGuess(player)); rankingObject.setHdPveProgresses(normal.getHdpveProgresses().size()); rankingObject.setStar(normal.getPveStarCounts()); break; } else if (i == rankingObjects.size() - 1) { updateRanking(player); } } } } /** * * @return */ protected abstract GlobalData.Type getGlobalDataType(); /** * * @param player * @param rankingObject * @return */ protected abstract boolean compare(Player player, RankingObject rankingObject); protected int returnPowerGuess(Player player) { int powerGuess = 0; Normal normal = player.getNormal(); FightGroup fightGroup = normal.getFightGroup(normal.getLastFidx()); for (HeroItem heroItem : fightGroup.getHeroItems()) { powerGuess += heroItem.getPowerGuess(); } return powerGuess; } protected List<RankingObject> returnRankings() { return rankingObjects; } }