use of com.ixale.starparse.domain.stats.CombatStats in project StarParse by Ixale.
the class CombatDaoImpl method getCombatStats.
private CombatStats getCombatStats(final Combat combat, final CombatSelection combatSel, final String playerName, final boolean realDuration) throws Exception {
final Map<String, Object> args = new HashMap<>();
args.put("playerName", playerName == null ? getCharacterName(combat) : playerName);
final Long timeFrom;
final String sql;
if (combatSel == null) {
sql = SQL_GET_STATS_SUMS_CACHED;
args.put("combatId", combat.getCombatId());
timeFrom = null;
} else {
final Boundaries bounds = getBoundaries(combat, combatSel);
// time from
args.put("timeFrom", bounds.timeFrom);
args.put("timeTo", bounds.timeTo);
timeFrom = bounds.timeFrom.getTime();
// events
args.put("eventIdFrom", bounds.eventIdFrom);
args.put("eventIdTo", bounds.eventIdTo);
// support for custom conditions (for challenges)
if (combatSel.getSql() != null) {
sql = SQL_GET_STATS_SUMS.substring(0, SQL_GET_STATS_SUMS.length() - 1) + " AND " + combatSel.getSql() + ")";
if (combatSel.getArgs() != null) {
args.putAll(combatSel.getArgs());
}
} else {
sql = SQL_GET_STATS_SUMS;
}
}
try {
final CombatStats stats = getJdbcTemplate().query(sql, args, rs -> {
if (!rs.next()) {
return null;
}
int duration;
if (realDuration) {
if (getTimestamp(rs, "time_to") != null && timeFrom != null) {
duration = (int) Math.max(1000, getTimestamp(rs, "time_to").getTime() - timeFrom);
} else {
duration = 1000;
}
} else {
duration = rs.getInt("duration");
}
return new CombatStats(duration, getIntSafe(rs, "actions"), getIntSafe(rs, "damage"), getIntSafe(rs, "heal"), getIntSafe(rs, "effective_heal"), getIntSafe(rs, "damage_taken"), // total = sub-total
getIntSafe(rs, "damage_taken"), getIntSafe(rs, "absorbed"), // total = sub-total
getIntSafe(rs, "absorbed"), getIntSafe(rs, "heal_taken"), getIntSafe(rs, "effective_heal_taken"), // total = sub-total
getIntSafe(rs, "effective_heal_taken"), getIntSafe(rs, "threat"), // not used in total statistics
getIntSafe(rs, "threat_positive"), rs.getString("discipline") != null ? CharacterDiscipline.valueOf(rs.getString("discipline")) : null);
});
if (stats == null && combatSel == null) {
// NPC perspective = no cached sums
return getCombatStats(combat, new CombatSelection(combat.getEventIdFrom(), combat.getEventIdTo(), null, null), playerName, realDuration);
}
return stats;
} catch (Exception e) {
throw new Exception("Unable to get combat summary (" + args + "): " + e.getMessage(), e);
}
}
use of com.ixale.starparse.domain.stats.CombatStats in project StarParse by Ixale.
the class CombatDaoImpl method getCombatChallengeStats.
@Override
public List<ChallengeStats> getCombatChallengeStats(final Combat combat, final CombatSelection combatSel, final String playerName) throws Exception {
if ((combat.getBoss() == null) || ((availableChallenges = combat.getBoss().getRaid().getChallenges(combat.getBoss())) == null)) {
return null;
}
phasesToChallenges.clear();
for (final CombatChallenge ch : availableChallenges) {
phasesToChallenges.put(ch.getPhaseName(), ch);
}
final Map<String, Object> args = new HashMap<>();
args.put("combatId", combat.getCombatId());
args.put("tickFrom", combatSel != null && combatSel.getTickFrom() != null ? combatSel.getTickFrom() : 0);
args.put("tickTo", combatSel != null && combatSel.getTickTo() != null ? combatSel.getTickTo() : Integer.MAX_VALUE);
args.put("phaseNames", new ArrayList<>(phasesToChallenges.keySet()));
return getJdbcTemplate().query(SQL_GET_COMBAT_CHALLENGES, args, new RowMapper<ChallengeStats>() {
Long tickFrom, tickTo;
boolean noCache = false;
@Override
public ChallengeStats mapRow(ResultSet rs, int rowNum) {
try {
noCache = false;
if (combatSel != null) {
if (combatSel.getTickFrom() != null && (combatSel.getTickFrom() > rs.getLong("tick_from"))) {
tickFrom = combatSel.getTickFrom();
noCache = true;
} else {
tickFrom = rs.getLong("tick_from");
}
if (combatSel.getTickTo() != null && (getValueOrNull(rs, rs.getLong("tick_to")) == null || context.getTickTo() < rs.getLong("tick_to"))) {
tickTo = combatSel.getTickTo();
noCache = true;
} else {
tickTo = getValueOrNull(rs, rs.getLong("tick_to"));
noCache = noCache || tickTo == null;
}
} else {
tickFrom = rs.getLong("tick_from");
tickTo = getValueOrNull(rs, rs.getLong("tick_to"));
}
if (!noCache && cachedChallenges.containsKey(combat.getCombatId())) {
if (cachedChallenges.get(combat.getCombatId()).containsKey(playerName)) {
if (cachedChallenges.get(combat.getCombatId()).get(playerName).containsKey(rs.getLong("tick_from"))) {
return cachedChallenges.get(combat.getCombatId()).get(playerName).get(rs.getLong("tick_from"));
// NOTREACHED
}
}
}
final CombatSelection challengeCombatSel = new CombatSelection(rs.getInt("event_id_from"), getValueOrNull(rs, rs.getInt("event_id_to")), tickFrom, tickTo, phasesToChallenges.get(rs.getString("name")).getArgs(), phasesToChallenges.get(rs.getString("name")).getSql());
final CombatStats stats = getCombatStats(combat, challengeCombatSel, playerName, true);
final ChallengeStats challengeStats = new ChallengeStats(phasesToChallenges.get(rs.getString("name")).getChallengeName(), tickFrom, tickFrom + stats.getTick(), stats.getDamage(), stats.getHeal(), stats.getEffectiveHeal());
if (!noCache && (getValueOrNull(rs, rs.getLong("tick_to")) != null)) {
if (!cachedChallenges.containsKey(combat.getCombatId())) {
cachedChallenges.put(combat.getCombatId(), new HashMap<>());
}
if (!cachedChallenges.get(combat.getCombatId()).containsKey(playerName)) {
cachedChallenges.get(combat.getCombatId()).put(playerName, new HashMap<>());
}
cachedChallenges.get(combat.getCombatId()).get(playerName).put(rs.getLong("tick_from"), challengeStats);
}
return challengeStats;
} catch (Exception e) {
logger.error("Unable to get combat challenge: " + e.getMessage(), e);
return null;
}
}
});
}
use of com.ixale.starparse.domain.stats.CombatStats in project StarParse by Ixale.
the class EventServiceImpl method getCombatStats.
@Override
public CombatStats getCombatStats(final List<Combat> combats, final CombatSelection combatSel, final String playerName) throws Exception {
int tick = 0;
int actions = 0;
int damage = 0;
int heal = 0;
int effectiveHeal = 0;
int damageTaken = 0;
int damageTakenTotal = 0;
int absorbed = 0;
int absorbedTotal = 0;
int healTaken = 0;
int effectiveHealTaken = 0;
int effectiveHealTakenTotal = 0;
int threat = 0;
int threatPositive = 0;
for (final Combat combat : combats) {
if (combat == null) {
continue;
}
final CombatStats cs = combatDao.getCombatStats(combat, combatSel, playerName);
tick += cs.getTick();
actions += cs.getActions();
damage += cs.getDamage();
heal += cs.getHeal();
effectiveHeal += cs.getEffectiveHeal();
damageTaken += cs.getDamageTaken();
damageTakenTotal += cs.getDamageTakenTotal();
absorbed += cs.getAbsorbed();
absorbedTotal += cs.getAbsorbedTotal();
healTaken += cs.getHealTaken();
effectiveHealTaken += cs.getEffectiveHealTaken();
effectiveHealTakenTotal += cs.getEffectiveHealTakenTotal();
threat += cs.getThreat();
threatPositive += cs.getThreatPositive();
}
return new CombatStats(tick, actions, damage, heal, effectiveHeal, damageTaken, damageTakenTotal, absorbed, absorbedTotal, healTaken, effectiveHealTaken, effectiveHealTakenTotal, threat, threatPositive, null);
}
use of com.ixale.starparse.domain.stats.CombatStats in project StarParse by Ixale.
the class EventServiceTest method testFull.
@Test
public void testFull() throws Exception {
// load test source file
final File sourceLog = new File(getClass().getClassLoader().getResource("combat_2014-01-26_22_01_13_435268.txt").toURI());
parser.setCombatLogFile(sourceLog);
// check DAO
eventService.storeCombatLog(parser.getCombatLog());
// parse one by one, with intermediary flushes
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(sourceLog);
br = new BufferedReader(fr);
String line;
int i = 0;
while ((line = br.readLine()) != null) {
parser.parseLogLine(line);
if (++i % 3000 == 0) {
eventService.flushEvents(parser.getEvents(), parser.getCombats(), parser.getCurrentCombat(), parser.getEffects(), parser.getCurrentEffects(), parser.getPhases(), parser.getCurrentPhase(), parser.getAbsorptions(), parser.getActorStates());
}
}
eventService.flushEvents(parser.getEvents(), parser.getCombats(), parser.getCurrentCombat(), parser.getEffects(), parser.getCurrentEffects(), parser.getPhases(), parser.getCurrentPhase(), parser.getAbsorptions(), parser.getActorStates());
} finally {
try {
br.close();
} catch (Exception ignored) {
}
try {
fr.close();
} catch (Exception ignored) {
}
}
// check result
Combat c = null;
CombatStats stats = null;
DamageDealtStats dds = null;
List<DamageDealtStats> damageDealtStats = null;
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss.SSS", Locale.ENGLISH);
List<Combat> combats = eventService.getCombats();
assertEquals(31, combats.size());
assertEquals("Ixale", parser.getCombatLog().getCharacterName());
// verify combat 1
c = combats.get(1);
assertEquals("2014-01-27 01:10:34.526", sdf.format(c.getTimeFrom()));
assertEquals("Dread Master Calphayus (SM 8m)", c.getBoss().toString());
assertEquals(442874, c.getTimeTo() - c.getTimeFrom());
stats = eventService.getCombatStats(c, null, parser.getCombatLog().getCharacterName());
assertEquals(34.68, stats.getApm());
assertEquals(1018954, stats.getDamage());
assertEquals(2301, stats.getDps());
assertEquals(199588, stats.getHeal());
assertEquals(451, stats.getHps());
assertEquals(204, stats.getEhps());
assertEquals(45.31, stats.getEhpsPercent());
assertEquals(140364, stats.getDamageTaken());
assertEquals(317, stats.getDtps());
assertEquals(342032, stats.getHealTaken());
assertEquals(772, stats.getHpsTaken());
assertEquals(295, stats.getEhpsTaken());
assertEquals(1143416, stats.getThreat());
assertEquals(2582, stats.getTps());
assertEquals(1143416, stats.getThreatPositive());
assertEquals(8358, stats.getAbsorbed());
// verify combat 6
c = combats.get(6);
assertEquals("2014-01-27 01:31:59.110", sdf.format(c.getTimeFrom()));
assertEquals("Dread Master Raptus (HM 8m)", c.getBoss().toString());
assertEquals(394327, c.getTimeTo() - c.getTimeFrom());
stats = eventService.getCombatStats(c, null, parser.getCombatLog().getCharacterName());
assertEquals(32.41, stats.getApm());
assertEquals(874441, stats.getDamage());
assertEquals(2218, stats.getDps());
assertEquals(132737, stats.getHeal());
assertEquals(337, stats.getHps());
assertEquals(253, stats.getEhps());
assertEquals(75.21, stats.getEhpsPercent());
assertEquals(247176, stats.getDamageTaken());
assertEquals(627, stats.getDtps());
assertEquals(303582, stats.getHealTaken());
assertEquals(770, stats.getHpsTaken());
assertEquals(509, stats.getEhpsTaken());
assertEquals(14938, stats.getThreat());
assertEquals(38, stats.getTps());
assertEquals(845628, stats.getThreatPositive());
// verify combat 14
c = combats.get(14);
assertEquals("2014-01-27 02:05:31.950", sdf.format(c.getTimeFrom()));
assertEquals(null, c.getBoss());
assertEquals(61428, c.getTimeTo() - c.getTimeFrom());
assertEquals("Dwayna, Bartley, Dread Host Soldier (2), Dread Guard Nullifier, Dread Host Commando, Unknown", c.getName());
// verify combat 30
c = combats.get(30);
assertEquals("2014-01-27 02:51:10.836", sdf.format(c.getTimeFrom()));
assertEquals("Dread Master Brontes (SM 8m)", c.getBoss().toString());
assertEquals(444166, c.getTimeTo() - c.getTimeFrom());
stats = eventService.getCombatStats(c, null, parser.getCombatLog().getCharacterName());
damageDealtStats = eventService.getDamageDealtStats(c, false, false, false, null, parser.getCombatLog().getCharacterName());
assertEquals(1, damageDealtStats.size());
dds = damageDealtStats.get(0);
assertEquals("Total", dds.getName());
assertEquals(876, dds.getTicks());
assertEquals(2043.0, dds.getAverageCrit());
assertEquals(1248.0, dds.getAverageNormal());
assertEquals(33.22, dds.getPercentCrit());
assertEquals(7.76, dds.getPercentMiss());
assertEquals(594457, dds.getTotalCrit());
assertEquals(571678, dds.getTotalNormal());
assertEquals(1166135, dds.getTotal());
assertEquals(2625, dds.getDps());
assertEquals(100.0, dds.getPercentTotal());
damageDealtStats = eventService.getDamageDealtStats(c, false, false, true, null, parser.getCombatLog().getCharacterName());
assertEquals(12, damageDealtStats.size());
dds = damageDealtStats.get(0);
assertEquals("Overload Saber: Burning (Physical)", dds.getName());
// dots actions
assertEquals(31, dds.getActions());
assertEquals(144, dds.getTicks());
assertEquals(2291.0, dds.getAverageCrit());
assertEquals(1085.0, dds.getAverageNormal());
assertEquals(61.11, dds.getPercentCrit());
assertEquals(0.69, dds.getPercentMiss());
assertEquals(201615, dds.getTotalCrit());
assertEquals(53182, dds.getTotalNormal());
assertEquals(254797, dds.getTotal());
assertEquals(574, dds.getDps());
assertEquals(21.8, dds.getPercentTotal());
assertEquals("elemental", dds.getDamageType());
damageDealtStats = eventService.getDamageDealtStats(c, true, true, false, null, parser.getCombatLog().getCharacterName());
assertEquals(17, damageDealtStats.size());
dds = damageDealtStats.get(0);
assertEquals("Total", dds.getName());
assertEquals(420, dds.getTicks());
assertEquals(2065.0, dds.getAverageCrit());
assertEquals(33.33, dds.getPercentCrit());
damageDealtStats = eventService.getDamageDealtStatsSimple(c, null, parser.getCombatLog().getCharacterName());
assertEquals(1, damageDealtStats.size());
dds = damageDealtStats.get(0);
assertEquals("Total", dds.getName());
assertEquals(876, dds.getTicks());
assertEquals(33.22, dds.getPercentCrit());
assertEquals(7.76, dds.getPercentMiss());
assertEquals(2625, dds.getDps());
List<Effect> effects = eventService.getCombatEffects(c, null);
Effect effect;
assertEquals(301, effects.size());
effect = effects.get(0);
assertEquals("Power Surge", effect.getEffect().getName());
assertEquals(Long.valueOf(3244362460823552L), effect.getEffect().getGuid());
assertEquals("Ixale", effect.getSource().getName());
assertEquals(1, effect.getSource().getType().getId());
assertEquals("Ixale", effect.getTarget().getName());
assertEquals(1, effect.getTarget().getType().getId());
assertEquals("2014-01-27 02:51:12.873", sdf.format(effect.getTimeFrom()));
assertEquals("2014-01-27 02:51:18.933", sdf.format(effect.getTimeTo()));
assertFalse(effect.isAbsorption());
assertFalse(effect.isActivated());
effect = effects.get(102);
assertEquals("Kolto Cloud", effect.getEffect().getName());
assertEquals("Fathersheep", effect.getSource().getName());
assertEquals("Ixale", effect.getTarget().getName());
assertEquals("2014-01-27 02:53:49.941", sdf.format(effect.getTimeFrom()));
assertEquals("2014-01-27 02:53:59.028", sdf.format(effect.getTimeTo()));
assertFalse(effect.isAbsorption());
assertFalse(effect.isActivated());
effect = effects.get(153);
assertEquals("Force Armor", effect.getEffect().getName());
assertTrue(effect.isAbsorption());
assertFalse(effect.isActivated());
effect = effects.get(300);
assertEquals("Burning (Physical)", effect.getEffect().getName());
assertEquals("Ixale", effect.getSource().getName());
assertEquals("Dread Master Brontes", effect.getTarget().getName());
assertEquals("2014-01-27 02:58:32.268", sdf.format(effect.getTimeFrom()));
assertEquals("2014-01-27 02:58:35.035", sdf.format(effect.getTimeTo()));
assertFalse(effect.isAbsorption());
assertFalse(effect.isActivated());
/*long x = System.currentTimeMillis();
List<Event> events = eventService.getCombatEvents(c, EnumSet.noneOf(Event.Type.class), null, null, null, null);
System.out.println("Took: "+(System.currentTimeMillis() - x)+" ("+events.size()+")");
for (Event e: events) {
File f = new File("c:/x/e"+e.getEventId()+".log");
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(e);
out.flush();
out.close();
fos.close();
}*/
/*context.reset();
events = null;
FileInputStream fin = new FileInputStream(f);
ObjectInputStream in = new ObjectInputStream(fin);
events = (List<Event>) in.readObject();
System.out.println(events.get(0).getSource().hashCode());
System.out.println(events.get(1).getSource().hashCode());
System.out.println(events.get(2).getSource().hashCode());
in.close();
fin.close();*/
// check combat extraction
c = combats.get(14);
assertEquals("2014-01-27 02:05:31.950", sdf.format(c.getTimeFrom()));
assertEquals("2014-01-27 02:06:33.378", sdf.format(c.getTimeTo()));
final String combat14 = FileLoader.extractPortion(sourceLog, "[" + sdfTime.format(c.getTimeFrom()), "[" + sdfTime.format(c.getTimeTo())).sb.toString();
assertNotNull(combat14);
assertEquals(58794, combat14.length());
}
use of com.ixale.starparse.domain.stats.CombatStats 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());
}
}
Aggregations