/*
* 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.pve;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.lang3.StringUtils;
import org.skfiy.typhon.AbstractComponent;
import org.skfiy.typhon.Typhons;
import org.skfiy.typhon.dobj.HeroItemDobj;
import org.skfiy.typhon.domain.Bag;
import org.skfiy.typhon.domain.FightGroup;
import org.skfiy.typhon.domain.Incident;
import org.skfiy.typhon.domain.Lootable.Record;
import org.skfiy.typhon.domain.Normal;
import org.skfiy.typhon.domain.Player;
import org.skfiy.typhon.domain.PveProgress;
import org.skfiy.typhon.domain.VacantData;
import org.skfiy.typhon.domain.item.HeroItem;
import org.skfiy.typhon.domain.item.RecordObject;
import org.skfiy.typhon.domain.item.SuccorObject;
import org.skfiy.typhon.packet.Packet;
import org.skfiy.typhon.packet.PacketError;
import org.skfiy.typhon.packet.PossibleAtlasloot;
import org.skfiy.typhon.packet.PveCleanPacket;
import org.skfiy.typhon.packet.PvePacket;
import org.skfiy.typhon.packet.SingleValue;
import org.skfiy.typhon.repository.IncidentRepository;
import org.skfiy.typhon.session.BagUtils;
import org.skfiy.typhon.session.Session;
import org.skfiy.typhon.session.SessionContext;
import org.skfiy.typhon.session.SessionManager;
import org.skfiy.typhon.session.SessionUtils;
import org.skfiy.typhon.spi.IncidentConstants;
import org.skfiy.typhon.spi.ItemProvider;
import org.skfiy.typhon.spi.RoleProvider;
import org.skfiy.typhon.spi.Vip;
import org.skfiy.typhon.spi.Week;
import org.skfiy.typhon.spi.atlasloot.AtlaslootBean;
import org.skfiy.typhon.spi.atlasloot.AtlaslootProvider;
import org.skfiy.typhon.spi.hero.HeroProvider;
import org.skfiy.typhon.spi.ranking.UpdateRankingList;
import org.skfiy.typhon.spi.store.MarketStoreProvider;
import org.skfiy.typhon.spi.store.WesternStoreProvider;
import org.skfiy.typhon.spi.task.TaskPveProgressProvider;
import org.skfiy.typhon.spi.war.WarProvider;
import org.skfiy.typhon.util.ComponentUtils;
import org.skfiy.typhon.util.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.TypeUtils;
/**
*
* @author Kevin Zou <kevinz@skfiy.org>
*/
@Singleton
public class PveProvider extends AbstractComponent {
private static final Logger LOG = LoggerFactory.getLogger(PveProvider.class);
public static final String WAR_INFO_KEY = "typhon.warInfo";
// 史实篇
private static final int PVE_SUBJECT_HISTORY = 1;
// 列传篇
private static final int PVE_SUBJECT_STORY = 0;
// 活动篇
private static final int PVE_SUBJECT_ACTIVITY = 2;
// 精英模式
private static final int PVE_MODE_DIFFICULT = 1;
private final List<Chapter> historyChapters = new ArrayList<>();
private final List<Chapter> historyDifficultChapters = new ArrayList<>();
private final List<Chapter> storyChapters = new ArrayList<>();
private final List<ActivityChapter> activityChapters = new ArrayList<>();
private JSONArray refreshCost;
private JSONArray expReturn;
@Inject
private ItemProvider itemProvider;
@Inject
private RoleProvider roleProvider;
@Inject
private HeroProvider heroProvider;
@Inject
private UpdateRankingList updateRankingList;
@Inject
private AtlaslootProvider atlaslootProvider;
@Inject
private WarProvider warProvider;
@Inject
private MarketStoreProvider marketStoreProvider;
@Inject
private WesternStoreProvider westernStoreProvider;
@Inject
private TaskPveProgressProvider taskPveProgressProvider;
@Inject
private SessionManager sessionManager;
@Inject
private IncidentRepository incidentReposy;
@Override
protected void doInit() {
historyChapters.addAll(loadChapterList("chapter_history.json"));
historyDifficultChapters.addAll(loadChapterList("chapter_difficult_history.json"));
storyChapters.addAll(loadChapterList("chapter_story.json"));
activityChapters.addAll(loadActivityChapterList("chapter_activity.json"));
expReturn = JSON.parseArray(ComponentUtils.readDataFile("exp_return.json"));
refreshCost = JSON.parseArray(ComponentUtils.readDataFile("chapter_resetcount_cost.json"));
}
@Override
protected void doReload() {
}
@Override
protected void doDestroy() {
}
/**
*
* @param packet
*/
public void searchSuccor(Packet packet) {
warProvider.searchSuccor(packet);
}
/**
*
* @param packet
*/
public void loadSuccorData(SingleValue packet) {
warProvider.loadSuccorData(packet);
}
/**
* 重置副本次数.
*
* @param packet
*/
public void resetPveCounts(PvePacket packet) {
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
Vip vip = roleProvider.getVip(normal.getVipLevel());
PveProgress pveProgress;
int count = 0;
// s史诗 精英 列传
if (packet.getSubject() == PVE_SUBJECT_HISTORY) {
if (packet.getMode() == PVE_MODE_DIFFICULT) {
pveProgress = normal.findHdpveProgress(packet.getCidx(), packet.getPidx());
count = pveProgress.getResetCount();
} else {
pveProgress = normal.findHpveProgress(packet.getCidx(), packet.getPidx());
count = pveProgress.getResetCount();
}
} else {
pveProgress = normal.findSpveProgress(packet.getCidx(), packet.getPidx());
count = pveProgress.getResetCount();
}
if (count < vip.privileged.max_pve_buy_count) {
pveProgress.setCount(0);
JSONObject object = new JSONObject();
object.put("place", "ResetPveCounts");
object.put("resetCounts", count);
pveProgress.setResetCount(count + 1);
SessionUtils.decrementDiamond(refreshCost.getIntValue(count), object.toString());
} else {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("VIP level is not enough");
player.getSession().write(error);
return;
}
player.getSession().write(Packet.createResult(packet));
}
/**
*
* @param packet
*/
public void enter(PvePacket packet) {
Session session = SessionContext.getSession();
Player player = SessionUtils.getPlayer(session);
Normal normal = player.getNormal();
Part part
= getPart0(packet.getSubject(), packet.getMode(), packet.getCidx(), packet.getPidx());
PveProgress pveProgress
= findPveProgress(packet.getSubject(), packet.getMode(), packet.getCidx(),
packet.getPidx());
if (!check(packet, session, normal, pveProgress, part, 1)) {
return;
}
PveWarInfo pveWarInfo = newPveWarInfo(packet, part);
pveWarInfo.setWarId(packet.getId());
SessionUtils.decrementVigor(part.getPrevigor());
player.getInvisible().setSingleAtlasloots(null);
player.getInvisible().setPveWarInfo(pveWarInfo);
// 初始化掉落物品
List<AtlaslootBean> atlasloots = new ArrayList<>();
PossibleAtlasloot tmp;
atlaslootProvider
.calculateAtlasloot(session, pveProgress, atlasloots, part.getAtlasloots());
for (AtlaslootBean bean : atlasloots) {
tmp = new PossibleAtlasloot(bean.getItem().getId(), bean.getCount());
if (bean.getItem() instanceof HeroItemDobj) {
Bag heroBag = player.getHeroBag();
if (heroBag.findNode(tmp.getItemId()) != null) {
tmp.setIsSoul(1);
}
}
pveWarInfo.addAtlasloot(tmp);
}
// 扣除体力
session.setAttribute(WAR_INFO_KEY, pveWarInfo);
// 设置攻击组索引
normal.setLastFidx(packet.getFgidx());
// result
PvePacket result = new PvePacket();
Packet.assignResult(packet, result);
result.setAtlasloots(pveWarInfo.getAtlasloots());
session.write(result);
}
private boolean check(PvePacket packet, Session session, Normal normal,
PveProgress pveProgress, Part part, int count) {
// 已经存在战斗
if (session.getAttribute(WAR_INFO_KEY) != null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.bat_request);
error.setText("exists attack");
session.write(error);
return false;
}
// PVE进度不足
boolean noPveEnough = isPveEnough(packet);
if (!noPveEnough) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.bat_request);
error.setText("pve not enough");
session.write(error);
return false;
}
// 等级不满足
if (normal.getLevel() < part.getMinLevel()) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.level_limit);
error.setText("level limit");
session.write(error);
return false;
}
// 体力不足
boolean noVigorEnough
= normal.getVigor() >= (part.getPrevigor() + part.getPostvigor()) * count;
if (!noVigorEnough) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.vigor_not_enough);
error.setText("vigor not enough");
session.write(error);
return false;
}
if (packet.getSubject() == PVE_SUBJECT_ACTIVITY) {
ActivityChapter chapter = (ActivityChapter) part.getParent();
if (!chapter.containtsWeek(Week.currentDayOfWeek())) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("No activity");
session.write(error);
return false;
}
if (chapter.getCount() != -1 && pveProgress != null
&& pveProgress.getCount() >= chapter.getCount()) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("[Activity]-Not enough count");
session.write(error);
return false;
}
} else {
// 次数不足
if (part.getCount() != -1 && pveProgress != null
&& pveProgress.getCount() * count >= part.getCount()) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Not enough count");
session.write(error);
return false;
}
}
return true;
}
/**
*
* @param packet
*/
public void exit(PvePacket packet) {
Session session = SessionContext.getSession();
Player player = SessionUtils.getPlayer();
PveWarInfo pveWarInfo = (PveWarInfo) session.getAttribute(WAR_INFO_KEY);
if (pveWarInfo == null) {
pveWarInfo = player.getInvisible().getPveWarInfo();
}
Normal normal = player.getNormal();
// 不存在战斗
if (pveWarInfo == null || !pveWarInfo.getWarId().equals(packet.getId())) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.bat_request);
error.setText("No attack");
session.write(error);
return;
}
// 战斗结算
if (packet.getSidx() >= pveWarInfo.getPart().getStepSize() - 1) {
int aid = packet.getAid();
int index = 0;
// Friend f = null;
int counts = Typhons.getInteger("typhon.spi.DailyVigorFromFriend.TotalTimes");
// for (Friend friend : normal.getFriends()) {
// if (friend.getRid() == aid) {
// f = friend;
// break;
// }
// }
if (aid > 0 ) {
Session bession = sessionManager.getSession(aid);
if (bession == null) {
VacantData vacantData = roleProvider.loadVacantData(aid);
for (RecordObject object : vacantData.getAidReceiveCounts()) {
if (object.getState() == 0) {
index++;
}
}
if (index < counts) {
Incident incident = new Incident();
incident.setUid(aid);
incident.setEventName(IncidentConstants.ADI_RECEIVE_VIGOR);
incidentReposy.save(incident);
}
} else {
Player bePlayer = SessionUtils.getPlayer(bession);
for (RecordObject object : bePlayer.getNormal().getAidReceiveCounts()) {
if (object.getState() == 0) {
index++;
}
}
if (index < counts) {
bePlayer.getNormal().AddAidReceiveCounts(
new RecordObject(
bePlayer.getNormal().getAidReceiveCounts().size() + 1, 0));
}
}
normal.addSuccors(new SuccorObject(aid, System.currentTimeMillis()));
}
taskPveProgressProvider.update(normal, pveWarInfo);
SessionUtils.decrementVigor(pveWarInfo.getPart().getPostvigor());
PveProgress pveProgress = finalEstimate(session, pveWarInfo);
FightGroup fightGroup = normal.getFightGroup(pveWarInfo.getFgidx());
for (HeroItem hero : fightGroup.getHeroItems()) {
heroProvider.pushExp(normal.getLevel(), hero, pveWarInfo.getPart().getHeroExp());
}
if (pveWarInfo.getSubject() != PVE_SUBJECT_ACTIVITY) {
int oldStar = normal.getPveStarCounts();
// 成就结算
if (pveProgress.getFru1() != 1) {
pveProgress.setFru1(packet.getFru1());
}
if (pveProgress.getFru2() != 1) {
pveProgress.setFru2(packet.getFru2());
}
if (pveProgress.getFru3() != 1) {
pveProgress.setFru3(packet.getFru3());
}
int newStar = returnHeroStar(player);
if (oldStar != newStar) {
normal.setPveStarCounts(newStar);
updateRankingList.updateHeroStarRanking();
}
}
}
player.getInvisible().setPveWarInfo(null);
player.getInvisible().setSingleAtlasloots(null);
session.removeAttribute(WAR_INFO_KEY);
// result
SingleValue result = new SingleValue();
result.setVal(SingleValue.SUCCESS);
Packet.assignResult(packet, result);
session.write(result);
}
/**
*
* @param packet
*/
public void cleanOut(PveCleanPacket packet) {
Session session = SessionContext.getSession();
Player player = SessionUtils.getPlayer(session);
Normal normal = player.getNormal();
int count = packet.getCount();
Vip vip = roleProvider.getVip(normal.getVipLevel());
if (count > vip.privileged.pve_sweep_counts) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.bat_request);
error.setText("vip is not through");
session.write(error);
return;
}
PveProgress pveProgress
= findPveProgress(packet.getSubject(), packet.getMode(), packet.getCidx(),
packet.getPidx());
if (pveProgress == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.bat_request);
error.setText("pve is not through");
session.write(error);
return;
}
Part part = getPart0(packet.getSubject(), packet.getMode(), packet.getCidx(), packet.getPidx());
int expSum;
if (!check(packet, session, normal, pveProgress, part, count)) {
return;
}
PveWarInfo pveWarInfo = newPveWarInfo(packet, part);
player.getInvisible().setSingleAtlasloots(null);
List<List<PossibleAtlasloot>> allAtlasloots = new ArrayList<>();
for (int i = 0; i < count; i++) {
List<AtlaslootBean> atlasloots = new ArrayList<>();
atlaslootProvider.calculateAtlasloot(session, pveProgress, atlasloots,
part.getAtlasloots());
PossibleAtlasloot tmp;
for (AtlaslootBean bean : atlasloots) {
tmp = new PossibleAtlasloot(bean.getItem().getId(), bean.getCount());
if (bean.getItem() instanceof HeroItemDobj) {
Bag heroBag = player.getHeroBag();
if (heroBag.findNode(tmp.getItemId()) != null) {
tmp.setIsSoul(1);
}
}
BagUtils.intoItem(itemProvider.getItem(tmp.getItemId()), tmp.getCount());
pveWarInfo.addAtlasloot(tmp);
}
// 增加副本的挑战次数
pveProgress.setTotal(pveProgress.getTotal() + 1);
pveProgress.setCount(pveProgress.getCount() + 1);
// 记录需要掉落统计的信息
List<String> singleLoots
= (List<String>) SessionUtils.getPlayer(session).getInvisible().getSingleAtlasloots();
if (singleLoots != null) {
Record record;
for (String sid : singleLoots) {
record = pveProgress.findRecord(sid);
if (record == null) {
record = new Record(sid);
pveProgress.addRecord(record);
}
record.setLastTime(pveProgress.getTotal());
}
}
// 刷新特殊商店
if (RandomUtils.nextDouble() < 0.005) {
marketStoreProvider.autoRefreshCommodity(normal.player());
}
if (RandomUtils.nextDouble() < 0.003) {
westernStoreProvider.autoRefreshCommodity(normal.player());
}
allAtlasloots.add(new ArrayList<>(pveWarInfo.getAtlasloots()));
pveWarInfo.getAtlasloots().clear();
SessionUtils.getPlayer(session).getInvisible().setSingleAtlasloots(null);
session.removeAttribute(WAR_INFO_KEY);
}
int counts;
if (pveWarInfo.getSubject() == PVE_SUBJECT_HISTORY) {
if (pveWarInfo.getMode() == PVE_MODE_DIFFICULT) {
counts = normal.getDailyTask().getTaskHdpveCounts();
if (counts >= 0) {
normal.getDailyTask().setTaskHdpveCounts(counts + count);
}
} else {
counts = normal.getDailyTask().getTaskHpveCounts();
if (counts >= 0) {
normal.getDailyTask().setTaskHpveCounts(counts + count);
}
}
} else if (pveWarInfo.getSubject() == PVE_SUBJECT_ACTIVITY) {
counts = normal.getDailyTask().getTaskActivities();
if (counts >= 0) {
normal.getDailyTask().setTaskActivities(counts + count);
}
} else {
counts = normal.getDailyTask().getTaskSpveCounts();
if (counts >= 0) {
normal.getDailyTask().setTaskSpveCounts(counts + count);
}
}
// FIXME
SessionUtils.incrementCopper(pveWarInfo.getPart().getCopper() * count);
roleProvider.pushExp(normal, pveWarInfo.getPart().getExp() * count);
expSum = pveWarInfo.getPart().getHeroExp() * 5;
// 扣去体力
SessionUtils.decrementVigor((part.getPrevigor() + part.getPostvigor()) * count);
List<PossibleAtlasloot> atlasloots = new ArrayList<>();
// 卡牌经验结算
// 单次不足最低档次的经验药水,算一个经验药水
if (expSum < expReturn.getJSONObject(expReturn.size() - 1).getIntValue("exp")) {
posible(atlasloots, expReturn.getJSONObject(expReturn.size() - 1), 1, count);
} else {
for (int i = 0; i < expReturn.size(); i++) {
JSONObject cur = expReturn.getJSONObject(i);
int b = expSum / cur.getIntValue("exp");
if (b <= 0) {
continue;
}
posible(atlasloots, cur, b, count);
int a = expSum % cur.getIntValue("exp");
JSONObject prev = expReturn.getJSONObject(expReturn.size() - 1);
if (a > prev.getIntValue("exp")) {
expSum = a;
continue;
} else if (a <= prev.getIntValue("exp") && a > 0) {
posible(atlasloots, prev, 1, count);
break;
}
if (a == 0) {
break;
}
}
}
taskPveProgressProvider.update(normal, pveWarInfo);
PveCleanPacket result = new PveCleanPacket();
Packet.assignResult(packet, result);
result.setAtlasloots(atlasloots);
result.setAllAtlasloots(allAtlasloots);
session.write(result);
}
// 卡牌经验对黄经验药水
private void posible(List<PossibleAtlasloot> atlasloots, JSONObject object, int b, int count) {
PossibleAtlasloot possibleAtlasloot = new PossibleAtlasloot();
boolean bool = true;
BagUtils.intoItem(itemProvider.getItem(object.getString("#item.id")), b * count);
for (PossibleAtlasloot p : atlasloots) {
if (p.getItemId().equals(object.getString("#item.id"))) {
p.setCount(p.getCount() + b * count);
bool = false;
break;
}
}
if (bool) {
possibleAtlasloot.setItemId(object.getString("#item.id"));
possibleAtlasloot.setCount(b * count);
atlasloots.add(possibleAtlasloot);
}
}
/**
*
* @param packet
*/
public void receiveFruitionAward(PvePacket packet) {
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
PveProgress pveProgress;
Part part;
if (packet.getSubject() == PVE_SUBJECT_HISTORY) {
if (packet.getMode() == PVE_MODE_DIFFICULT) {
pveProgress = normal.findHdpveProgress(packet.getCidx(), packet.getPidx());
part = historyDifficultChapters.get(packet.getCidx()).getPart(packet.getPidx());
} else {
pveProgress = normal.findHpveProgress(packet.getCidx(), packet.getPidx());
part = historyChapters.get(packet.getCidx()).getPart(packet.getPidx());
}
} else {
pveProgress = normal.findSpveProgress(packet.getCidx(), packet.getPidx());
part = storyChapters.get(packet.getCidx()).getPart(packet.getPidx());
}
if (pveProgress == null) {
PacketError error = PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("No PveProgress");
player.getSession().write(error);
return;
}
if (packet.getFru1() != 0) {
if (pveProgress.getHrecd1() != 0) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Fru1: have received");
player.getSession().write(error);
return;
}
if (pveProgress.getFru1() != 1) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Fru1: no finished");
player.getSession().write(error);
return;
}
BagUtils.intoItem(part.getFruItem1());
pveProgress.setHrecd1(1);
}
if (packet.getFru2() != 0) {
if (pveProgress.getHrecd2() != 0) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Fru2: have received");
player.getSession().write(error);
return;
}
if (pveProgress.getFru2() != 1) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Fru2: no finished");
player.getSession().write(error);
return;
}
BagUtils.intoItem(part.getFruItem2());
pveProgress.setHrecd2(1);
}
if (packet.getFru3() != 0) {
if (pveProgress.getHrecd3() != 0) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Fru3: have received");
player.getSession().write(error);
return;
}
if (pveProgress.getFru3() != 1) {
PacketError error
= PacketError.createResult(packet, PacketError.Condition.conflict);
error.setText("Fru3: no finished");
player.getSession().write(error);
return;
}
BagUtils.intoItem(part.getFruItem3());
pveProgress.setHrecd3(1);
}
player.getSession().write(Packet.createResult(packet));
}
public void cleanFruitionAward(PvePacket packet) {
Player player = SessionUtils.getPlayer();
Normal normal = player.getNormal();
PveProgress pveProgress;
int cid = packet.getCidx();
Chapter chapter = null;
List<PveProgress> list = new ArrayList<>();
Part part;
if (packet.getSubject() == PVE_SUBJECT_HISTORY) {
if (packet.getMode() == PVE_MODE_DIFFICULT) {
chapter = historyDifficultChapters.get(cid);
for (int j = 0; j < chapter.getParts().length; j++) {
list.add(normal.findHdpveProgress(cid, j));
}
} else {
chapter = historyChapters.get(cid);
for (int j = 0; j < chapter.getParts().length; j++) {
list.add(normal.findHpveProgress(cid, j));
}
}
} else {
chapter = storyChapters.get(cid);
for (int j = 0; j < chapter.getParts().length; j++) {
list.add(normal.findSpveProgress(cid, j));
}
}
for (int i = 0; i < chapter.getParts().length; i++) {
part = chapter.getPart(i);
pveProgress = list.get(i);
if (pveProgress == null) {
break;
}
if (pveProgress.getHrecd1() == 0 && pveProgress.getFru1() == 1) {
pveProgress.setHrecd1(1);
BagUtils.intoItem(part.getFruItem1());
}
if (pveProgress.getHrecd2() == 0 && pveProgress.getFru2() == 1) {
pveProgress.setHrecd2(1);
BagUtils.intoItem(part.getFruItem2());
}
if (pveProgress.getHrecd3() == 0 && pveProgress.getFru3() == 1) {
pveProgress.setHrecd3(1);
BagUtils.intoItem(part.getFruItem3());
}
}
player.getSession().write(Packet.createResult(packet));
}
private PveProgress finalEstimate(Session session, PveWarInfo pveWarInfo) {
SessionUtils.incrementCopper(pveWarInfo.getPart().getCopper());
// 结算经验
Normal normal = SessionUtils.getPlayer(session).getNormal();
int counts;
PveProgress pveProgress;
if (pveWarInfo.getSubject() == PVE_SUBJECT_HISTORY) {
if (pveWarInfo.getMode() == PVE_MODE_DIFFICULT) {
pveProgress = normal.findHdpveProgress(pveWarInfo.getCidx(), pveWarInfo.getPidx());
if (pveProgress == null) {
pveProgress = newPveProgress(pveWarInfo);
normal.addHdpveProgress(pveProgress);
updateRankingList.updatePveDifficultRanking();
}
counts = normal.getDailyTask().getTaskHdpveCounts();
if (counts >= 0) {
normal.getDailyTask().setTaskHdpveCounts(counts + 1);
}
} else {
pveProgress = normal.findHpveProgress(pveWarInfo.getCidx(), pveWarInfo.getPidx());
if (pveProgress == null) {
pveProgress = newPveProgress(pveWarInfo);
normal.addHpveProgress(pveProgress);
updateRankingList.updatePveRanking();
}
counts = normal.getDailyTask().getTaskHpveCounts();
if (counts >= 0) {
normal.getDailyTask().setTaskHpveCounts(counts + 1);
}
}
} else if (pveWarInfo.getSubject() == PVE_SUBJECT_ACTIVITY) {
pveProgress = normal.findApveProgress(pveWarInfo.getCidx());
if (pveProgress == null) {
pveProgress = newPveProgress(pveWarInfo);
normal.addApveProgress(pveProgress);
}
counts = normal.getDailyTask().getTaskActivities();
if (counts >= 0) {
normal.getDailyTask().setTaskActivities(counts + 1);
}
} else {
pveProgress = normal.findSpveProgress(pveWarInfo.getCidx(), pveWarInfo.getPidx());
if (pveProgress == null) {
pveProgress = newPveProgress(pveWarInfo);
normal.addSpveProgress(pveProgress);
}
counts = normal.getDailyTask().getTaskSpveCounts();
if (counts >= 0) {
normal.getDailyTask().setTaskSpveCounts(counts + 1);
}
}
roleProvider.pushExp(normal, pveWarInfo.getPart().getExp());
// 增加副本的挑战次数
pveProgress.setTotal(pveProgress.getTotal() + 1);
pveProgress.setCount(pveProgress.getCount() + 1);
// 掉落结算
if (pveWarInfo.getAtlasloots() != null) {
for (PossibleAtlasloot atlasloot : pveWarInfo.getAtlasloots()) {
BagUtils.intoItem(itemProvider.getItem(atlasloot.getItemId()), atlasloot.getCount());
}
}
// 记录需要掉落统计的信息
List<String> singleLoots
= (List<String>) SessionUtils.getPlayer(session).getInvisible().getSingleAtlasloots();
if (singleLoots != null) {
Record record;
for (String sid : singleLoots) {
record = pveProgress.findRecord(sid);
if (record == null) {
record = new Record(sid);
pveProgress.addRecord(record);
}
record.setLastTime(pveProgress.getTotal());
}
}
// 刷新特殊商店
if (RandomUtils.nextDouble() < 0.005) {
marketStoreProvider.autoRefreshCommodity(normal.player());
}
if (RandomUtils.nextDouble() < 0.003) {
westernStoreProvider.autoRefreshCommodity(normal.player());
}
return pveProgress;
}
private PveWarInfo newPveWarInfo(PvePacket packet, Part part) {
PveWarInfo pveWarInfo = new PveWarInfo();
pveWarInfo.setSubject(packet.getSubject());
pveWarInfo.setMode(packet.getMode());
pveWarInfo.setCidx(packet.getCidx());
pveWarInfo.setPidx(packet.getPidx());
pveWarInfo.setFgidx(packet.getFgidx());
pveWarInfo.setPart(part);
return pveWarInfo;
}
private Part getPart0(int subject, int mode, int cidx, int pidx) {
if (subject == PVE_SUBJECT_HISTORY) {
if (mode == PVE_MODE_DIFFICULT) {
return historyDifficultChapters.get(cidx).getPart(pidx);
} else {
return historyChapters.get(cidx).getPart(pidx);
}
} else if (subject == PVE_SUBJECT_ACTIVITY) {
return activityChapters.get(cidx).getPart(pidx);
} else {
return storyChapters.get(cidx).getPart(pidx);
}
}
private boolean isPveEnough(PvePacket packet) {
// 如果是活动篇则不检查PVE进度
if (packet.getSubject() == PVE_SUBJECT_ACTIVITY) {
return true;
}
// 如果是列传篇则需要检查对应的普通本是否通关
if (packet.getSubject() == PVE_SUBJECT_STORY) {
Part part = storyChapters.get(packet.getCidx()).getPart(packet.getPidx());
Normal normal = SessionUtils.getPlayer().getNormal();
return (normal.findHpveProgress(part.getHcidx(), part.getHpidx()) != null);
}
// 如果是精英本则需要检查对应的普通本是否通关
if (packet.getMode() == PVE_MODE_DIFFICULT) {
Normal normal = SessionUtils.getPlayer().getNormal();
if (packet.getSubject() == PVE_SUBJECT_HISTORY) { // 史实篇
Chapter chapter = historyChapters.get(packet.getCidx());
if (normal.findHpveProgress(packet.getCidx(), chapter.getParts().length - 1) == null) {
return false;
}
}
}
if (packet.getCidx() == 0 && packet.getPidx() == 0) {
return true;
}
return (findPrevPveProgress(packet.getSubject(), packet.getMode(), packet.getCidx(),
packet.getPidx()) != null);
}
private PveProgress findPrevPveProgress(int subject, int mode, int cidx, int pidx) {
if (pidx <= 0) {
cidx--;
pidx = getPart0(subject, mode, cidx, pidx).getParent().getParts().length - 1;
} else {
pidx--;
}
return findPveProgress(subject, mode, cidx, pidx);
}
private PveProgress findPveProgress(int subject, int mode, int cidx, int pidx) {
Normal normal = SessionUtils.getPlayer().getNormal();
if (subject == PVE_SUBJECT_HISTORY) {
if (mode == PVE_MODE_DIFFICULT) {
return normal.findHdpveProgress(cidx, pidx);
} else {
return normal.findHpveProgress(cidx, pidx);
}
} else if (subject == PVE_SUBJECT_ACTIVITY) {
return normal.findApveProgress(cidx);
} else {
return normal.findSpveProgress(cidx, pidx);
}
}
private List<Chapter> loadChapterList(String fileName) {
String text = ComponentUtils.readDataFile(fileName);
JSONArray datas = JSON.parseArray(text);
List<Chapter> list = new ArrayList<>();
for (Iterator<Object> it = datas.iterator(); it.hasNext();) {
JSONObject obj = (JSONObject) it.next();
Chapter chapter = TypeUtils.castToJavaBean(obj, Chapter.class);
for (int i = 0; i < chapter.getParts().length; i++) {
Part part = chapter.getPart(i);
JSONObject partJson = obj.getJSONArray("parts").getJSONObject(i);
// 成就奖励 -------------------++++++++++++++++++++++++++++++++++++++++++++
if (partJson.containsKey("#fru1.item.id")) {
String itemId = partJson.getString("#fru1.item.id");
if (StringUtils.isNotEmpty(itemId)) {
part.setFruItem1(itemProvider.getItem(itemId));
}
}
if (partJson.containsKey("#fru2.item.id")) {
String itemId = partJson.getString("#fru2.item.id");
if (StringUtils.isNotEmpty(itemId)) {
part.setFruItem2(itemProvider.getItem(itemId));
}
}
if (partJson.containsKey("#fru3.item.id")) {
String itemId = partJson.getString("#fru3.item.id");
if (StringUtils.isNotEmpty(itemId)) {
part.setFruItem3(itemProvider.getItem(itemId));
}
}
// 成就奖励 -------------------++++++++++++++++++++++++++++++++++++++++++++
part.setHcidx(partJson.getIntValue("hcidx"));
part.setHpidx(partJson.getIntValue("hpidx"));
}
list.add(chapter);
}
return list;
}
private List<ActivityChapter> loadActivityChapterList(String fileName) {
String text = ComponentUtils.readDataFile(fileName);
JSONArray datas = JSON.parseArray(text);
List<ActivityChapter> list = new ArrayList<>();
for (Iterator<Object> it = datas.iterator(); it.hasNext();) {
JSONObject obj = (JSONObject) it.next();
ActivityChapter chapter = TypeUtils.castToJavaBean(obj, ActivityChapter.class);
list.add(chapter);
}
return list;
}
private PveProgress newPveProgress(PveWarInfo pveWarInfo) {
return new PveProgress(pveWarInfo.getCidx(), pveWarInfo.getPidx());
}
public int returnHeroStar(Player player) {
Normal normal = player.getNormal();
return StarSum(normal.getSpveProgresses()) + StarSum(normal.getHdpveProgresses())
+ StarSum(normal.getHpveProgresses());
}
private int StarSum(List<PveProgress> list) {
int count = 0;
for (PveProgress object : list) {
if (object.getFru1() == 1) {
count++;
}
if (object.getFru2() == 1) {
count++;
}
if (object.getFru3() == 1) {
count++;
}
}
return count;
}
}