use of com.ixale.starparse.domain.stats.CombatEventStats in project StarParse by Ixale.
the class Context method addCombatEvent.
public void addCombatEvent(final int combatId, final Actor player, final Event.Type type, final long timestamp) {
if (!combatEvents.containsKey(combatId)) {
combatEvents.put(combatId, new HashMap<>());
}
final String playerName = player.getName();
if (!combatEvents.get(combatId).containsKey(playerName)) {
combatEvents.get(combatId).put(playerName, new ArrayList<>());
}
combatEvents.get(combatId).get(playerName).add(new CombatEventStats(type, timestamp));
}
use of com.ixale.starparse.domain.stats.CombatEventStats in project StarParse by Ixale.
the class RaidPresenter method finalizeTable.
private void finalizeTable() {
final CombatTotals totals = new CombatTotals();
// cross-fill absorptions
final Iterator<RaidItem> it = raidTable.getItems().iterator();
while (it.hasNext()) {
final RaidItem item = it.next();
if (TOTALS_LABEL.equals(item.getName())) {
continue;
}
if (isFakePlayerHidden(item.getFullName(), raidTable.getItems())) {
it.remove();
continue;
}
fillAbsorption(item);
fillRank(item);
final CombatStats cs = item.getMessage().getCombatStats();
if (cs.getTick() > totals.tick) {
totals.tick = cs.getTick();
}
totals.actions += cs.getActions();
totals.damage += cs.getDamage();
totals.heal += cs.getHeal();
totals.effectiveHeal += cs.getEffectiveHeal();
totals.damageTaken += cs.getDamageTaken();
totals.damageTakenTotal += cs.getDamageTakenTotal();
totals.absorbed += cs.getAbsorbed();
totals.absorbedTotal += cs.getAbsorbedTotal();
totals.healTaken += cs.getHealTaken();
totals.effectiveHealTaken += cs.getEffectiveHealTaken();
totals.effectiveHealTakenTotal += cs.getEffectiveHealTakenTotal();
totals.threat += cs.getThreat();
totals.threatPositive += cs.getThreatPositive();
totals.shielding += item.getShielding();
totals.sps += item.getSps();
}
this.resortTable(raidTable);
if (!rankCol.isVisible() && canRank(currentCombat)) {
rankCol.setVisible(true);
}
if (currentCombat.isRunning() && currentCombat.getTimeTo() == null) {
int exits = 0;
for (final RaidItem item : raidTable.getItems()) {
if (item.getMessage().getExitEvent() != null) {
exits++;
}
}
if (exits < raidTable.getItems().size() - 1) {
// wait until the combat is finished
return;
}
}
// combat deaths
final List<Node> items = new ArrayList<>();
items.add(raidDeathsTitle);
for (final RaidItem item : raidTable.getItems()) {
if (item.getMessage() == null) {
continue;
}
if (item.getMessage().getCombatEventStats() != null && !item.getMessage().getCombatEventStats().isEmpty()) {
for (final CombatEventStats ce : item.getMessage().getCombatEventStats()) {
fillCombatEvents(item, ce.getType(), ce.getTimestamp(), items);
}
}
// expand last event
if (item.getMessage().getExitEvent() != null && Event.Type.DEATH.equals(item.getMessage().getExitEvent())) {
fillCombatEvents(item, item.getMessage().getExitEvent(), item.getMessage().getTimestamp(), items);
}
}
int j = items.size();
if (j > 1) {
items.sort(deathComparator);
// ignore "wipe" deaths (if almost everyone dies, cut in half and include only if the gap is above X seconds)
if (j > raidTable.getItems().size()) {
// i.e. wipe: j >= 2
j = items.size() - 1;
long last = ((long) items.get(j).getUserData());
for (int i = j - 1; i >= 1; i--) {
// 1 = label
if (((long) items.get(i).getUserData()) > (last - 5000)) {
last = ((long) items.get(i).getUserData());
j = i;
}
}
}
if (j > 1) {
raidDeaths.getChildren().setAll(items.subList(0, j));
if (!raidDeaths.isVisible()) {
raidDeaths.setVisible(true);
raidDeaths.setPrefHeight(25);
}
}
}
if (raidTable.getItems().size() > 1) {
// totals
if (totalsItem == null) {
totalsItem = new RaidItem();
raidTable.getItems().add(totalsItem);
}
fillItem(totalsItem, new RaidCombatMessage(TOTALS_LABEL, 0, null, null, null, null, new CombatStats(totals.tick, totals.actions, totals.damage, totals.heal, totals.effectiveHeal, totals.damageTaken, totals.damageTakenTotal, totals.absorbed, totals.absorbedTotal, totals.healTaken, totals.effectiveHealTaken, totals.effectiveHealTakenTotal, totals.threat, totals.threatPositive, null), null, null, null, totals.tick, null, null));
totalsItem.shielding.set(totals.shielding);
totalsItem.sps.set(totals.sps);
totalsItem.rank.set(RankClass.Reason.RANK_DISABLED.getCode());
}
}
use of com.ixale.starparse.domain.stats.CombatEventStats in project StarParse by Ixale.
the class RaidManager method updateCombat.
private RaidCombatMessage updateCombat(final Combat combat, final String characterName, final CombatStats combatStats, final List<AbsorptionStats> absorptionStats, final List<ChallengeStats> challengeStats, final List<CombatEventStats> combatEventStats, final boolean isFakeRaider) {
if (challengeStats != null && !challengeStats.isEmpty()) {
// discard challenges with no value
challengeStats.removeIf(stats -> (stats.getDamage() == null || stats.getDamage() == 0) && (stats.getEffectiveHeal() == null || stats.getEffectiveHeal() == 0) && (stats.getHeal() == null || stats.getHeal() == 0));
}
// transform the very last event
Event.Type exitEvent = null;
List<CombatEventStats> combatEventStats2 = null;
final long timestamp = combat.getTimeFrom() + combatStats.getTick();
if (combatEventStats != null && !combatEventStats.isEmpty()) {
final CombatEventStats last = combatEventStats.get(combatEventStats.size() - 1);
if (last.getTimestamp() == timestamp) {
exitEvent = last.getType();
if (combatEventStats.size() > 1) {
combatEventStats2 = new ArrayList<>(combatEventStats.subList(0, combatEventStats.size() - 1));
}
} else {
combatEventStats2 = new ArrayList<>(combatEventStats);
}
}
// fire and forget
final RaidCombatMessage message = new RaidCombatMessage(characterName, combat.getTimeFrom(), combat.getTimeTo(), combat.getBoss() != null ? combat.getBoss().getRaidBossName() : null, combat.getBoss() != null ? combat.getBoss().getSize() : null, combat.getBoss() != null ? combat.getBoss().getMode() : null, combatStats, absorptionStats, challengeStats, combatEventStats2, // last event timestamp
timestamp, combatStats.getDiscipline(), exitEvent);
if (!isFakeRaider && isRunning()) {
raidClient.updateCombat(message);
}
return message;
}
use of com.ixale.starparse.domain.stats.CombatEventStats in project StarParse by Ixale.
the class FileLoader method fillParselyCombatsInfo.
private static void fillParselyCombatsInfo(final List<Combat> combats, final List<ParselyCombatInfo> combatsInfo, final Context context) {
combatsInfo.clear();
if (combats == null) {
return;
}
try {
for (final Combat c : combats) {
if (c == null) {
continue;
}
final ParselyCombatInfo info = new ParselyCombatInfo();
info.from = c.getTimeFrom();
info.to = c.getTimeTo();
info.raidBoss = c.getBoss();
if (info.raidBoss != null && Raid.Mode.NiM.equals(info.raidBoss.getMode())) {
for (final CombatEventStats e : context.getCombatEvents(c.getCombatId(), context.getSelectedPlayer())) {
if (Event.Type.NIM_CRYSTAL.equals(e.getType())) {
info.isNiMCrystal = true;
break;
}
}
}
final CombatInfo combatInfo = context.getCombatInfo().get(c.getCombatId());
if (combatInfo != null && combatInfo.getLocationInfo() != null) {
info.instanceName = combatInfo.getLocationInfo().getInstanceName();
info.instanceGuid = combatInfo.getLocationInfo().getInstanceGuid();
}
combatsInfo.add(info);
}
} catch (Exception e) {
logger.error("Unable to assemble combats info for Parsely: " + e.getMessage(), e);
}
}
Aggregations