/* * Copyright 2013 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; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.Set; import javax.annotation.Resource; import javax.cache.Cache; import javax.cache.Caching; import javax.inject.Inject; import javax.inject.Singleton; import org.skfiy.typhon.AbstractComponent; import org.skfiy.typhon.ComponentException; import org.skfiy.typhon.Typhons; import org.skfiy.typhon.dobj.LargessVigor; import org.skfiy.typhon.dobj.VipRechargingDobj; import org.skfiy.typhon.domain.FightGroup; import org.skfiy.typhon.domain.Friend; import org.skfiy.typhon.domain.HeroProperty; import org.skfiy.typhon.domain.IHeroEntity; import org.skfiy.typhon.domain.Incident; import org.skfiy.typhon.domain.Invisible; import org.skfiy.typhon.domain.Mail; import org.skfiy.typhon.domain.Normal; import org.skfiy.typhon.domain.Player; import org.skfiy.typhon.domain.Role; import org.skfiy.typhon.domain.User; import org.skfiy.typhon.domain.VacantData; import org.skfiy.typhon.domain.item.HeroItem; import org.skfiy.typhon.domain.item.MonthCardObject; import org.skfiy.typhon.domain.item.RecordObject; import org.skfiy.typhon.packet.Namespaces; import org.skfiy.typhon.packet.Packet; import org.skfiy.typhon.packet.PacketError; import org.skfiy.typhon.packet.PacketFriend; import org.skfiy.typhon.packet.SingleValue; import org.skfiy.typhon.repository.IncidentRepository; import org.skfiy.typhon.repository.RoleRepository; import org.skfiy.typhon.session.Session; import org.skfiy.typhon.session.SessionConstants; import org.skfiy.typhon.session.SessionContext; import org.skfiy.typhon.session.SessionManager; import org.skfiy.typhon.session.SessionUtils; import org.skfiy.typhon.spi.activity.ActivityProvider; import org.skfiy.typhon.spi.ranking.UpdateRankingList; import org.skfiy.typhon.spi.role.ExpLevel; import org.skfiy.typhon.spi.role.RoleListener; import org.skfiy.typhon.spi.society.Member; import org.skfiy.typhon.spi.society.Society; import org.skfiy.typhon.spi.society.SocietyProvider; import org.skfiy.typhon.spi.store.MarketStoreProvider; import org.skfiy.typhon.spi.store.SocietyStoreProvider; import org.skfiy.typhon.spi.store.WesternStoreProvider; import org.skfiy.typhon.util.ComponentUtils; import org.skfiy.typhon.util.FastRandom; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * * @author Kevin Zou <kevinz@skfiy.org> */ @Singleton public class RoleProvider extends AbstractComponent { private static final Logger LOG = LoggerFactory.getLogger(RoleProvider.class); private final List<ExpLevel> expLevels = new ArrayList<>(); private final List<Vip> vips = new ArrayList<>(); private final List<VipRechargingDobj> vipRechargingDobjs = new ArrayList<>(); private final List<Integer> buyVigors = new ArrayList<>(); private final List<LargessVigor> largessVigors = new ArrayList<>(); private final Random ROLE_NAME_RANDOM = new FastRandom(); @Resource private Set<RoleListener> roleListeners; @Inject private SessionManager sessionManager; @Inject private RoleRepository roleReposy; @Inject private IncidentRepository incidentReposy; @Inject private UpdateRankingList updateRankingLists; @Inject private MarketStoreProvider marketStorePvodier; @Inject private WesternStoreProvider westernStoreProvider; @Inject private SocietyProvider societyProvider; @Inject private ActivityProvider activityProvider; @Inject private IncidentRepository incidentRepository; @Inject private SocietyStoreProvider societyStoreProvider; @Inject private TaskManager taskManager; @Resource(name = "iPlayerNameValidated") private Set<IPlayerNameValidated> playerNameValidates; private Cache<Integer, VacantData> roleVacantDataCache; private final List<String> prefixes = new ArrayList<>(); private final List<String> suffixes = new ArrayList<>(); // 好友模糊查询返回数量 private int friendsNumber; // 充值抽奖 private int luckeyDrawNumber; @Override protected void doInit() { loadDatas(); roleVacantDataCache = Caching.getCacheManager().getCache(CacheKeys.ROLE_VACANT_DATA_CACHE_KEY); JSONArray array = JSONArray.parseArray(ComponentUtils.readDataFile("random_name.json")); for (int i = 0; i < array.size(); i++) { if (array.getJSONObject(i).containsKey("prefix")) { prefixes.add(array.getJSONObject(i).getString("prefix")); } if (array.getJSONObject(i).containsKey("suffix")) { suffixes.add(array.getJSONObject(i).getString("suffix")); } } friendsNumber = Typhons.getInteger("typhon.spi.roleProvider.friendsNumber"); luckeyDrawNumber = Typhons.getInteger("typhon.spi.activity.luckeyDraw"); } @Override protected void doReload() { } @Override protected void doDestroy() { } /** * 获取{@code ExpLevel }实例. * * @param level 等级 * @return */ public ExpLevel getExpLevel(int level) { if (level < 0 || level > expLevels.size()) { throw new ComponentException("Not found level[" + level + "]"); } return expLevels.get(level - 1); } /** * * @return */ public ExpLevel getLastExpLevel() { return expLevels.get(expLevels.size() - 1); } /** * * @param level * @return */ public boolean isMaxLevel(int level) { return (level == expLevels.size()); } /** * * @param normal * @param exp */ public void pushExp(Normal normal, int exp) { if (isMaxLevel(normal.getLevel()) || exp <= 0) { return; } ExpLevel expLevel; int oldExp = normal.getExp(); int newExp = oldExp + exp; int newLevel = normal.getLevel(); while (true) { expLevel = getExpLevel(newLevel); if (newExp < expLevel.getExp()) { break; } newLevel++; normal.setVigor(normal.getVigor() + getExpLevel(newLevel).getPresentVigor()); if (isMaxLevel(newLevel)) { newExp = 0; break; } newExp -= expLevel.getExp(); } if (newLevel > normal.getLevel()) { normal.setLevel(newLevel); updateRankingLists.updateLevelRanking(); updateInformation(); // FIXME 刷新商店 int minLevel = Typhons.getInteger("typhon.spi.store.marketMinLevel", 30); if (newLevel == minLevel || (newLevel > minLevel && (newLevel - minLevel) % 20 == 0)) { marketStorePvodier.autoRefreshCommodity(normal.player()); } if (newLevel == 50 || (newLevel > 30 && (newLevel - 50) % 20 == 0)) { westernStoreProvider.autoRefreshCommodity(normal.player()); } if (newLevel == 30 || newLevel == 35 || newLevel == 40) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(normal.player().getRole().getCreationTime()); clearCalendar(cal); cal.add(Calendar.DATE, 3); if (cal.getTimeInMillis() >= System.currentTimeMillis()) { normal.addUpgradeGifts(new RecordObject(newLevel, 0)); } } } Player player = SessionUtils.getPlayer(); if (newLevel >= activityProvider.inviteLevelLimit() && !player.getInvisible().isInviteBool()) { int uid = player.getInvisible().getInviteUid(); Session otherSession = sessionManager.getSession(uid); if (uid > 0) { if (otherSession != null) { Player otherPlayer = SessionUtils.getPlayer(otherSession); Invisible invisible = otherPlayer.getInvisible(); invisible.getInvite().add(player.getRole().getRid()); } else { Incident inc = new Incident(); inc.setUid(uid); inc.setEventName(IncidentConstants.INVITE_MANAGER); inc.setData(JSONObject.toJSONString(player.getRole().getRid())); incidentRepository.save(inc); } player.getInvisible().setInviteBool(true); } } if (normal.getSocietyCommodities().size() <= 0 && newLevel == 32) { societyStoreProvider.refreshCommodity(player); } normal.setExp(newExp); } /** * * @param recharging */ public synchronized void recharge(Recharging recharging) { // 冲值 Session otherSession = sessionManager.getSession(recharging.getRid()); if (otherSession != null) { recharge(SessionUtils.getPlayer(otherSession), recharging); } else { Incident incident = new Incident(); incident.setEventName(IncidentConstants.EVENT_VIP_RECHARGING); incident.setUid(recharging.getRid()); incident.setData(JSON.toJSONString(recharging)); incidentReposy.save(incident); } } /** * * @param player * @param recharging */ public void recharge(Player player, Recharging recharging) { Normal normal = player.getNormal(); for (VipRechargingDobj vipRechargingDobj : vipRechargingDobjs) { if (vipRechargingDobj.getCash() == recharging.getCash()) { int val = vipRechargingDobj.getDiamond() + vipRechargingDobj.getPresent(); if (!normal.containsVigRechargingFlag(recharging.getCash())) { val += vipRechargingDobj.getFirstExtraPresent(); normal.addVipRecharginFlag(recharging.getCash()); } if (vipRechargingDobj.getCash() == 25) { rechargeMonthCard(normal); } // if (System.currentTimeMillis() >= activityProvider.getVipActivityStar() // && System.currentTimeMillis() < activityProvider.getVipActivityEnd()) { // normal.setVipSavingsActivity(normal.getVipSavingsActivity() // + vipRechargingDobj.getCash()); // // player.getInvisible().setVipActivityStarTime( // activityProvider.getVipActivityStar()); // } if (System.currentTimeMillis() >= activityProvider.getVipDayStar() && System.currentTimeMillis() < activityProvider.getVipDayEnd()) { Calendar calendar = Calendar.getInstance(); if (player.getInvisible().getVipDate() == calendar.get(Calendar.DAY_OF_YEAR)) { normal.setVipSavingsDay(normal.getVipSavingsDay() + vipRechargingDobj.getCash()); } else { normal.setVipSavingsDay(vipRechargingDobj.getCash()); player.getInvisible().setVipDate(calendar.get(Calendar.DAY_OF_YEAR)); } } JSONObject object = new JSONObject(); object.put("place", "Recharge"); normal.setDiamond(normal.getDiamond() + val);; inviteReturnDiamond(player, val); normal.setVipSavings(normal.getVipSavings() + vipRechargingDobj.getDiamond()); // 充值抽奖次数 normal.setLuckeyDrawCounts(normal.getLuckeyDrawCounts() + (recharging.getCash() / luckeyDrawNumber)); // 升级VIP int newVipLevel = 0; for (int i = normal.getVipLevel(); i < vips.size(); i++) { Vip vip = vips.get(i); if (vip.storedMoney <= normal.getVipSavings()) { newVipLevel = i; } else { break; } } if (normal.getVipLevel() != newVipLevel) { normal.setVipLevel(newVipLevel); Vip vip = getVip(newVipLevel); if (vip.privileged.market_store_enabled) { marketStorePvodier.autoRefreshCommodity(player); } if (vip.privileged.western_store_enabled) { westernStoreProvider.autoRefreshCommodity(player); } } return; } } throw new ComponentException("No [" + recharging.getCash() + "] cash"); } private void rechargeMonthCard(Normal normal) { long expiredTime = normal.getMonthCardObject().getExpiredTime(); Calendar cal = Calendar.getInstance(); MonthCardObject monthCard; if (expiredTime != 0 && expiredTime > System.currentTimeMillis()) { cal.setTimeInMillis(expiredTime); monthCard = normal.getMonthCardObject(); } else { monthCard = new MonthCardObject(); } cal.add(Calendar.DATE, 30); clearCalendar(cal); monthCard.setExpiredTime(cal.getTimeInMillis()); normal.setMonthCardObject(monthCard); } public void clearCalendar(Calendar c) { c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); } private void inviteReturnDiamond(Player player, int val) { int uid = player.getInvisible().getInviteUid(); if (uid > 0) { Mail mail = new Mail(); mail.setTitle("邀请者钻石返还"); mail.setContent("您所邀请的玩家已充值成功,返还给您钻石"); mail.setAppendix(Typhons.getProperty("typhon.spi.singleDiamondItemId")); mail.setCount((int) (val * 0.2)); mail.setType(Mail.REPARATION_NOTICE_TYPE); sendMail(uid, mail); } } /** * * @param vip * @return */ public Vip getVip(int vip) { if (vip >= vips.size()) { throw new NotFoundVipException("Not found [" + vip + "] vip."); } return vips.get(vip); } /** * * @param uid * @return */ public boolean existsRole(int uid) { if (roleVacantDataCache.containsKey(uid)) { return true; } return roleReposy.get(uid) != null; } /** * * @param rid * @return */ public VacantData loadVacantData(int rid) { VacantData data = roleVacantDataCache.get(rid); if (data == null) { data = roleReposy.loadVacantData(rid); roleVacantDataCache.put(rid, data); } return data; } /** * * @param name */ public void create(String name) { // save role Role role = new Role(); role.setRid(SessionUtils.getUser().getUid()); role.setName(name); role.setEnabled(true); roleReposy.save(role); LOG.debug("create role [rid={}, name={}] successful", role.getRid(), role.getName()); create0(role); load0(role); } /** * */ public void preload() { Session session = SessionContext.getSession(); User user = SessionUtils.getUser(); Role role; Player player = (Player) session.getAttribute(SessionUtils.ATTR_PLAYER); if (player != null) { role = player.getRole(); } else { // 从数据库查询角色信息 role = roleReposy.get(user.getUid()); if (role == null) { session.write(Namespaces.ROLE, "{}"); return; } } load0(role); } /** * 购买体力. * * @param packet 包 */ public void buyVigor(Packet packet) { Player player = SessionUtils.getPlayer(); Normal normal = player.getNormal(); Vip vip = getVip(normal.getVipLevel()); if (normal.getBuyVigorCount() >= vip.privileged.buy_vigor_count) { // 没有足够的次数继续购买体力 PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Not enough buy vigor count"); player.getSession().write(error); return; } int dep; if (normal.getBuyVigorCount() >= buyVigors.size()) { dep = buyVigors.get(buyVigors.size() - 1); } else { dep = buyVigors.get(normal.getBuyVigorCount()); } JSONObject object = new JSONObject(); object.put("place", "BuyVigor"); object.put("buyCounts", normal.getBuyVigorCount()); SessionUtils.decrementDiamond(dep, object.toString()); normal.setVigor(normal.getVigor() + Typhons.getInteger("typhon.spi.role.buyVigorVal")); normal.setBuyVigorCount(normal.getBuyVigorCount() + 1); player.getSession().write(Packet.createResult(packet)); } /** * * @param rid * @param mail */ public void sendMail(int rid, Mail mail) { Session session = sessionManager.getSession(rid); if (session != null) { Player player = SessionUtils.getPlayer(session); Normal normal = player.getNormal(); normal.addMail(mail); } else { // 通过事件机制发送邮件 Incident inc = new Incident(); inc.setUid(rid); inc.setEventName(IncidentConstants.EVENT_MAIL_NEW); inc.setData(JSONObject.toJSONString(mail)); incidentReposy.save(inc); } } // public List<Role> findFriend(String uname, int number) { List<Role> roles = roleReposy.findRoles(uname, number); return roles; } /** * * @param uid */ public void addFriend(int uid) { Player player = SessionUtils.getPlayer(); List<Object> addFriends = new ArrayList<>(); Session othernSession = sessionManager.getSession(uid); int rid = player.getRole().getRid(); int levelLimit = 0; int index = 0; if (othernSession != null) { Normal normal = SessionUtils.getPlayer(othernSession).getNormal(); Vip vip = getVip(normal.getVipLevel()); Collection<Incident> validateIncidents = getFriendMsgSessionMap(othernSession).values(); levelLimit = vip.privileged.max_friend_limit; for (Incident vinc : validateIncidents) { Friend friend = JSON.parseObject(vinc.getData(), Friend.class); if (friend.getRid() == rid) { addFriends.add(0, vinc.getPid()); continue; } if (validateIncidents.size() - addFriends.size() >= levelLimit + 10) { addFriends.add(vinc.getPid()); } } if (validateIncidents.size() >= levelLimit + 10) { index = validateIncidents.size() - (levelLimit + 10) + 1; } else { index = addFriends.size(); } // 删除Session中的消息,通知客户端删除请求. JSONObject result = new JSONObject(); List<Integer> pids = new ArrayList<>(); for (int i = 0; i < index; i++) { getFriendMsgSessionMap(othernSession).remove((int) addFriends.get(i)); pids.add((int) addFriends.get(i)); } result.put("pid", pids); othernSession.write(Namespaces.FRIEND_DELETE_REQUEST, result); } else { Map<Integer, String> maps = incidentReposy.findPidData(uid, IncidentConstants.EVENT_FRIEND_REQUEST); int vipLevel = loadVacantData(uid).getVipLevel(); Vip vip = getVip(vipLevel); levelLimit = vip.privileged.max_friend_limit; for (Entry<Integer, String> entry : maps.entrySet()) { Friend friend = JSON.parseObject(entry.getValue(), Friend.class); if (friend.getRid() == rid) { addFriends.add(0, entry.getKey()); continue; } if (maps.size() - addFriends.size() >= levelLimit + 10) { addFriends.add(entry.getKey()); } } if (maps.size() >= levelLimit + 10) { index = maps.size() - (levelLimit + 10) + 1; } else { index = addFriends.size(); } } Incident incident = new Incident(); incident.setUid(uid); incident.setEventName(IncidentConstants.EVENT_FRIEND_REQUEST); incident.setData(JSONObject.toJSONString(integrationFriend(player))); incidentReposy.save(incident); if (othernSession != null) { Map<Integer, Incident> othernFriendMsgMap = getFriendMsgSessionMap(othernSession); othernFriendMsgMap.put(incident.getPid(), incident); JSONObject result = new JSONObject(); result.put("data", incident.getJSONData()); result.put("pid", incident.getPid()); othernSession.write(Namespaces.FRIEND_ADD, result); } // 删除数据库. for (int i = 0; i < index; i++) { incidentReposy.delete((int) addFriends.get(i)); } } /** * * @param packet */ public void acceptFriend(PacketFriend packet) { int pid = packet.getPid(); Player player = SessionUtils.getPlayer(); Session session = player.getSession(); Normal normal = player.getNormal(); Map<Integer, Incident> friendMsgMap = getFriendMsgSessionMap(session); Incident incident = friendMsgMap.get(pid); if (incident == null) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("Not found friend request[" + pid + "]"); session.write(error); return; } Friend friend = JSON.parseObject(incident.getData(), Friend.class); if (!(checkFriendLimit(player) && checkFriendLimit(friend.getRid()))) { PacketError error = PacketError.createResult(packet, PacketError.Condition.size_limit); error.setText("friend size limit"); session.write(error); return; } normal.addFriend(friend); // 清理数据 friendMsgMap.remove(pid); incidentReposy.delete(pid); Session otherSession = sessionManager.getSession(friend.getRid()); if (otherSession != null) { Normal otherNormal = SessionUtils.getPlayer(otherSession).getNormal(); otherNormal.addFriend(integrationFriend(player)); } else { Incident otherIncident = new Incident(); otherIncident.setUid(friend.getRid()); otherIncident.setEventName(IncidentConstants.EVENT_FRIEND_ACCEPTED); otherIncident.setData(JSONObject.toJSONString(integrationFriend(player))); incidentReposy.save(otherIncident); } session.write(Packet.createResult(packet)); } /** * * @param pid */ public void rejectFriend(int pid) { Player player = SessionUtils.getPlayer(); Map<Integer, Incident> friendMsgMap = getFriendMsgSessionMap(player.getSession()); Incident incident = friendMsgMap.get(pid); if (incident == null) { LOG.debug("Not found friend message[{}].", pid); return; } friendMsgMap.remove(pid); incidentReposy.delete(pid); } /** * * @param uid */ public void deleteFriend(int uid) { Player player = SessionUtils.getPlayer(); Role role = player.getRole(); // 删除已方的好友 Normal normal = player.getNormal(); normal.deleteFriend(uid); // 删除对方的好友 Session otherSession = sessionManager.getSession(uid); if (otherSession != null) { Normal otherNormal = SessionUtils.getPlayer(otherSession).getNormal(); otherNormal.deleteFriend(role.getRid()); } else { Incident incident = new Incident(); incident.setUid(uid); incident.setEventName(IncidentConstants.EVENT_FRIEND_DELETEED); incident.setData(JSONObject.toJSONString(integrationFriend(player))); incidentReposy.save(incident); } } /** * * @param uid * @return */ public String primaryHeroId(int uid) { Session beSession = sessionManager.getSession(uid); String id; if (beSession != null) { Normal normal = SessionUtils.getPlayer(beSession).getNormal(); FightGroup fightGroup = normal.getFightGroup(normal.getLastFidx()); HeroItem heroItem = fightGroup.getHeroItem(fightGroup.getCaptain()); id = heroItem.getId(); } else { VacantData vacantData = loadVacantData(uid); int lastFidx = vacantData.getLastFidx(); id = loadVacantData(uid).getFightGroups()[lastFidx][vacantData.getCaptain()]; } return id; } public int findHeroFighting(int uid) { Session session = sessionManager.getSession(uid); int powerGuessSum = 0; if (session != null) { Normal normal = SessionUtils.getPlayer(session).getNormal(); FightGroup fightGroup = normal.getFightGroup(normal.getLastFidx()); for (HeroItem heroItem : fightGroup.getHeroItems()) { powerGuessSum += heroItem.getPowerGuess(); } } else { VacantData vacantData = loadVacantData(uid); HeroProperty heroProperty; for (String itemId : vacantData.getFightGroups()[vacantData.getLastFidx()]) { heroProperty = vacantData.findHeroProperty(itemId); powerGuessSum += heroProperty.getPowerGuess(); } } return powerGuessSum; } public void showFightGroups(SingleValue packet) { Player player = SessionUtils.getPlayer(); int uid = (int) packet.getVal(); // 玩家在线则拿即时数据 Session beSession = sessionManager.getSession(uid); IHeroEntity heroEntity; if (beSession != null) { Normal beNormal = SessionUtils.getPlayer(beSession).getNormal(); FightGroup fightGoup = beNormal.getFightGroup(beNormal.getLastFidx()); heroEntity = fightGoup.getHeroItem(fightGoup.getCaptain()); } else { VacantData vacantData = loadVacantData(uid); heroEntity = vacantData .findHeroProperty(vacantData.getFightGroup(vacantData.getLastFidx())[vacantData .getCaptain()]); } JSONObject beresult = new JSONObject(); beresult.put("id", packet.getId()); beresult.put("extraInfo", heroEntity); beresult.put("type", Packet.Type.rs); player.getSession().write(Namespaces.SHOW_HEROLIST, beresult); } /** * * @return */ public String randomName() { int prefix = ROLE_NAME_RANDOM.nextInt(prefixes.size()); int suffix = ROLE_NAME_RANDOM.nextInt(suffixes.size()); StringBuilder name = new StringBuilder(); name.append(prefixes.get(prefix)); name.append(suffixes.get(suffix)); return name.toString(); } /** * * @param packet */ public void createName(SingleValue packet) { Player player = SessionUtils.getPlayer(); int sum = suffixes.size() * prefixes.size(); int size = playerNameValidates.size(); int i = 0; for (;;) { String name = randomName(); for (IPlayerNameValidated pnv : playerNameValidates) { i++; if (pnv.validate(name)) { SingleValue result = new SingleValue(); Packet.assignResult(packet, result); packet.setVal(name); player.getSession().write(result); break; } if ((i - sum * size) == 0) { PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict); error.setText("More than random upper limit"); player.getSession().write(error); break; } } } } /** * * @return */ public String randomUniqueName() { int sum = suffixes.size() * prefixes.size(); int size = playerNameValidates.size(); int i = 0; for (;;) { String name = randomName(); for (IPlayerNameValidated pnv : playerNameValidates) { i++; if (pnv.validate(name)) { return name; } if ((i - sum * size) == 0) { throw new IllegalStateException("More than random upper limit"); } } } } /** * * @param uid * @return */ public boolean checkFriendLimit(int uid) { Session session = sessionManager.getSession(uid); if (session != null) { return checkFriendLimit(SessionUtils.getPlayer(session)); } else { VacantData data = loadVacantData(uid); return (data.getFriendSize() < getVip(data.getVipLevel()).privileged.max_friend_limit); } } /** * * @param player * @return */ public boolean checkFriendLimit(Player player) { Vip vip = getVip(player.getNormal().getVipLevel()); int limit = vip.privileged.max_friend_limit; return (player.getNormal().getFriends().size() < limit); } public Friend integrationFriend(Player player) { Role role = player.getRole(); Normal normal = player.getNormal(); Friend friend = new Friend(role.getRid(), role.getName(), role.getLevel(), findHeroFighting(role.getRid()), primaryHeroId(role.getRid()), normal.getAvatar(), normal.getAvatarBorder(), normal.getSocietyName()); return friend; } /** * * @param session * @return */ public Map<Integer, Incident> getFriendMsgSessionMap(Session session) { Map map = (LinkedHashMap) session.getAttribute("__FriendMsg"); if (map == null) { map = new LinkedHashMap<>(); session.setAttribute("__FriendMsg", map); } return map; } /** * @param role */ protected void create0(Role role) { // fire RoleListener for (RoleListener roleListener : roleListeners) { roleListener.roleCreated(role); } } /** * */ public void updateInformation() { taskManager.execute(new TaskManager.Task() { @Override public void run() { Player player = SessionUtils.getPlayer(); int rid = player.getRole().getRid(); for (Friend friend : player.getNormal().getFriends()) { Session besession = sessionManager.getSession(friend.getRid()); if (besession == null) { List<String> datas = incidentReposy.findData(friend.getRid(), IncidentConstants.EVENT_UPDATE_FRIENDS); for (String data : datas) { Friend fr = JSON.parseObject(data, Friend.class); if (fr.getRid() == rid) { int pid = incidentReposy.findByData(data); incidentReposy.delete(pid); } } Incident incident = new Incident(); incident.setUid(friend.getRid()); incident.setData(JSONObject.toJSONString(integrationFriend(player))); incident.setEventName(IncidentConstants.EVENT_UPDATE_FRIENDS); incidentReposy.save(incident); } else { Player beplayer = SessionUtils.getPlayer(besession); for (Friend befriend : beplayer.getNormal().getFriends()) { if (befriend.getRid() == rid) { updateFriends(befriend, player); } } } } // 公会 int sid = player.getNormal().getSocietyId(); if (sid != 0) { Society society = societyProvider.findBySid(sid); for (Member member : society.getMembers()) { if (member.getRid() == rid) { updateSocietyMember(member, player); } } } } }); } public void updateSocietyMember(Member member, Player player) { Normal normal = player.getNormal(); Role role = player.getRole(); member.setRid(role.getRid()); member.setName(role.getName()); member.setAvatar(normal.getAvatar()); member.setAvatarBorder(normal.getAvatarBorder()); member.setLevel(normal.getLevel()); } public void updateFriends(Friend befriend, Player player) { Normal normal = player.getNormal(); Role role = player.getRole(); if (befriend.getAvatar() != normal.getAvatar()) { befriend.setAvatar(normal.getAvatar()); } if (befriend.getAvatarBorder() != normal.getAvatarBorder()) { befriend.setAvatarBorder(normal.getAvatarBorder()); } if (befriend.getLevel() != role.getLevel()) { befriend.setLevel(role.getLevel()); } if (!befriend.getName().equals(role.getName())) { befriend.setName(role.getName()); } if (befriend.getPowerGuessSum() != findHeroFighting(role.getRid())) { befriend.setPowerGuessSum(findHeroFighting(role.getRid())); } if (befriend.getSocietyName() != normal.getSocietyName()) { befriend.setSocietyName(normal.getSocietyName()); } } /** * 玩家基础信息 */ public void roleBase(SingleValue packet) { Player player = SessionUtils.getPlayer(); int rid = (int) packet.getVal(); JSONObject object = new JSONObject(); Session session = sessionManager.getSession(rid); if (session == null) { VacantData vacantData = loadVacantData(rid); object.put("name", vacantData.getName()); object.put("avatar", vacantData.getAvatar()); object.put("avatarBorder", vacantData.getAvatarBorder()); object.put("level", vacantData.getLevel()); object.put("societyName", vacantData.getSocietyName()); } else { Player bePlayer = SessionUtils.getPlayer(session); Normal normal = bePlayer.getNormal(); object.put("name", bePlayer.getRole().getName()); object.put("avatar", normal.getAvatar()); object.put("avatarBorder", normal.getAvatarBorder()); object.put("level", normal.getLevel()); object.put("societyName", normal.getSocietyName()); } SingleValue result = new SingleValue(); Packet.assignResult(packet, result); result.setVal(object); player.getSession().write(result); } /** * * @param role */ protected void load0(Role role) { // 角色已经被禁用无法进入游戏 if (!role.isEnabled()) { Session session = SessionContext.getSession(); Packet contextPacket = (Packet) session.getAttribute(SessionConstants.ATTR_CONTEXT_PACKET); PacketError error = PacketError.createResult(contextPacket, PacketError.Condition.not_enabled_role); error.setText("Not enabled role"); session.write(error); return; } for (RoleListener roleListener : roleListeners) { roleListener.roleLoaded(role); } // 更新最后登录时间 roleReposy.updateLastLoginedTime(role.getRid()); role.setLastLoginedTime(System.currentTimeMillis()); } private void loadDatas() { List<ExpLevel> expLevelConfig = JSON.parseArray(ComponentUtils.readDataFile("exp_level.json"), ExpLevel.class); this.expLevels.addAll(expLevelConfig); // load vip config JSONArray jsonArray = JSON.parseArray(ComponentUtils.readDataFile("vip.json")); for (int i = 0; i < jsonArray.size(); i++) { JSONObject json = jsonArray.getJSONObject(i); vips.add(new Vip(json)); } // load "vip_recharging.json" config vipRechargingDobjs.addAll(JSON.parseArray( ComponentUtils.readDataFile("vip_recharging.json"), VipRechargingDobj.class)); // load buy vigor config List<Integer> buyVigorConfig = JSON.parseArray(ComponentUtils.readDataFile("buy_vigor.json"), Integer.class); this.buyVigors.addAll(buyVigorConfig); // load largess_vigor List<LargessVigor> largessVigorConfig = JSON.parseArray(ComponentUtils.readDataFile("largess_vigor.json"), LargessVigor.class); this.largessVigors.addAll(largessVigorConfig); } /** * */ public void removeSuccor(Normal normal) { long time = System.currentTimeMillis(); int CD = Typhons.getInteger("typhon.spi.Warprovider.CD") * 1000 * 60; for (int i = normal.getSuccors().size() - 1; i >= 0; i--) { if (time - normal.getSuccors().get(i).getTime() >= CD) { normal.getSuccors().remove(i); } } } public int returnFriendsNumber() { return friendsNumber; } }