public void Apply(ChampionStats championStats) { AbilityHaste = championStats.AbilityHaste; AbilityPower = championStats.AbilityPower; Armor = championStats.Armor; ArmorPenetrationFlat = championStats.ArmorPenetrationFlat; ArmorPenetrationPercent = championStats.ArmorPenetrationPercent * 100f; AttackDamage = championStats.AttackDamage; AttackRange = championStats.AttackRange; AttackSpeed = championStats.AttackSpeed; BonusArmorPenetrationPercent = championStats.BonusArmorPenetrationPercent * 100f; BonusMagicPenetrationPercent = championStats.BonusMagicPenetrationPercent * 100f; CritChance = championStats.CritChance * 100f; CritDamagePercent = championStats.CritDamage; HealthCurrent = championStats.CurrentHealth; HealthMax = championStats.MaxHealth; HealthRegenRate = championStats.HealthRegenRate; HealShieldPower = championStats.HealShieldPower; LifeSteal = championStats.LifeSteal * 100f; MagicLethality = championStats.MagicLethality; MagicPenetrationFlat = championStats.MagicPenetrationFlat; MagicPenetrationPercent = championStats.MagicPenetrationPercent * 100f; MagicResist = championStats.MagicResist; MoveSpeed = championStats.MoveSpeed; Omnivamp = championStats.Omnivamp; PhysicalLethality = championStats.PhysicalLethality; PhysicalVamp = championStats.PhysicalVamp; ResourceCurrent = championStats.ResourceValue; ResourceMax = championStats.ResourceMax; ResourceRegenRate = championStats.ResourceRegenRate; ResourceType = ParseEnum <ResourceType> .TryParseOr(championStats.ResourceType, ResourceType.Unknown); SpellVamp = championStats.SpellVamp; Tenacity = championStats.Tenacity * 100f; }
// Constructor public CombatItem(long time, ulong srcAgent, ulong dstAgent, int value, int buffDmg, uint overstackValue, long skillId, ushort srcInstid, ushort dstInstid, ushort srcMasterInstid, ushort dstMasterInstid, ParseEnum.IFF iff, byte isBuff, byte result, ParseEnum.Activation isActivation, ParseEnum.BuffRemove isBuffRemove, byte isNinety, byte isFifty, byte isMoving, ParseEnum.StateChange isStateChange, byte isFlanking, byte isShields, byte isOffcycle) { Time = time; SrcAgent = srcAgent; DstAgent = dstAgent; Value = value; BuffDmg = buffDmg; OverstackValue = overstackValue; SkillID = skillId; SrcInstid = srcInstid; DstInstid = dstInstid; SrcMasterInstid = srcMasterInstid; DstMasterInstid = dstMasterInstid; IFF = iff; IsBuff = isBuff; Result = result; ResultEnum = ParseEnum.GetResult(result); IsActivation = isActivation; IsBuffRemove = isBuffRemove; IsNinety = isNinety; IsFifty = isFifty; IsMoving = isMoving; IsStateChange = isStateChange; IsFlanking = isFlanking; IsShields = isShields; IsOffcycle = isOffcycle; }
private void BuildFromBuffInfo(CombatItem evtcItem) { ProbablyInvul = evtcItem.IsFlanking > 0; ProbablyInvert = evtcItem.IsShields > 0; Category = ParseEnum.GetBuffCategory(evtcItem.IsOffcycle); MaxStacks = evtcItem.SrcMasterInstid; StackingTypeByte = evtcItem.Pad1; StackingType = ParseEnum.GetBuffStackType(StackingTypeByte); ProbablyResistance = evtcItem.Pad2 > 0; }
public NonDirectDamageEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData) : base(evtcItem, agentData, skillData) { Damage = evtcItem.BuffDmg; ParseEnum.ConditionResult result = ParseEnum.GetConditionResult(evtcItem.Result); IsAbsorbed = result == ParseEnum.ConditionResult.InvulByBuff || result == ParseEnum.ConditionResult.InvulByPlayerSkill1 || result == ParseEnum.ConditionResult.InvulByPlayerSkill2 || result == ParseEnum.ConditionResult.InvulByPlayerSkill3; HasHit = result == ParseEnum.ConditionResult.ExpectedToHit; ShieldDamage = evtcItem.IsShields > 0 ? Damage : 0; }
public BuffFormula(CombatItem evtcItem, BuffInfoEvent buffInfoEvent) { _buffInfoEvent = buffInfoEvent; _npc = evtcItem.IsFlanking == 0; _player = evtcItem.IsShields == 0; _break = evtcItem.IsOffcycle > 0; byte[] formulaBytes = new byte[8 * sizeof(float)]; int offset = 0; // 2 foreach (byte bt in BitConverter.GetBytes(evtcItem.Time)) { formulaBytes[offset++] = bt; } // 2 foreach (byte bt in BitConverter.GetBytes(evtcItem.SrcAgent)) { formulaBytes[offset++] = bt; } // 2 foreach (byte bt in BitConverter.GetBytes(evtcItem.DstAgent)) { formulaBytes[offset++] = bt; } // 1 foreach (byte bt in BitConverter.GetBytes(evtcItem.Value)) { formulaBytes[offset++] = bt; } // 1 foreach (byte bt in BitConverter.GetBytes(evtcItem.BuffDmg)) { formulaBytes[offset++] = bt; } // float[] formulaFloats = new float[8]; Buffer.BlockCopy(formulaBytes, 0, formulaFloats, 0, formulaBytes.Length); // Type = (int)formulaFloats[0]; ByteAttr1 = (byte)formulaFloats[1]; ByteAttr2 = (byte)formulaFloats[2]; Attr1 = ParseEnum.GetBuffAttribute(ByteAttr1); Attr2 = ParseEnum.GetBuffAttribute(ByteAttr2); ConstantOffset = formulaFloats[3]; LevelOffset = formulaFloats[4]; Variable = formulaFloats[5]; TraitSrc = (int)formulaFloats[6]; TraitSelf = (int)formulaFloats[7]; _extraNumber = evtcItem.OverstackValue; _extraNumberState = evtcItem.Pad1; }
public void ParseEnum_ValidArgs() { object value1 = ParseEnum.ByString("randomValue", "noneExistingEnumType"); Assert.IsNull(value1); object value2 = ParseEnum.ByString("randomValue", "Autodesk.Revit.DB.WallSide"); Assert.IsNull(value2); object value3 = ParseEnum.ByString("Exterior", "Autodesk.Revit.DB.WallSide"); Assert.AreEqual(value3, Autodesk.Revit.DB.WallSide.Exterior); }
public DirectDamageEvent(CombatItem evtcItem, AgentData agentData, SkillData skillData, long offset) : base(evtcItem, agentData, skillData, offset) { Damage = evtcItem.Value; ParseEnum.PhysicalResult result = ParseEnum.GetPhysicalResult(evtcItem.Result); IsAbsorbed = result == ParseEnum.PhysicalResult.Absorb; IsBlind = result == ParseEnum.PhysicalResult.Blind; IsBlocked = result == ParseEnum.PhysicalResult.Block; HasCrit = result == ParseEnum.PhysicalResult.Crit; HasDowned = result == ParseEnum.PhysicalResult.Downed; IsEvaded = result == ParseEnum.PhysicalResult.Evade; HasGlanced = result == ParseEnum.PhysicalResult.Glance; HasHit = result == ParseEnum.PhysicalResult.Normal || result == ParseEnum.PhysicalResult.Crit || result == ParseEnum.PhysicalResult.Glance || result == ParseEnum.PhysicalResult.KillingBlow; //Downed and Interrupt omitted for now due to double procing mechanics || result == ParseEnum.PhysicalResult.Downed || result == ParseEnum.PhysicalResult.Interrupt; HasKilled = result == ParseEnum.PhysicalResult.KillingBlow; HasInterrupted = result == ParseEnum.PhysicalResult.Interrupt; ShieldDamage = evtcItem.IsShields > 0 ? (int)evtcItem.OverstackValue : 0; }
protected DamageLog(long time, CombatItem c) { Time = time; SkillId = c.SkillID; IsCondi = c.IsBuff > 0; Result = ParseEnum.GetResult(c.Result); IsNinety = c.IsNinety > 0; IsFifty = c.IsFifty > 0; IsMoving = c.IsMoving > 0; IsFlanking = c.IsFlanking > 0; SrcAgent = c.SrcAgent; SrcInstId = c.SrcInstid; DstAgent = c.DstAgent; DstInstId = c.DstInstid; ShieldDamage = c.IsShields > 0 ? c.OverstackValue > 0 ? (int)c.OverstackValue : c.Value : 0; }
protected DamageLog(long time, CombatItem c) { Time = time; SkillId = c.SkillID; IsIndirectDamage = c.IsBuff > 0; if (Boon.BoonsByIds.TryGetValue(c.SkillID, out Boon boon)) { IsCondi = (boon.Nature == Boon.BoonNature.Condition); } Result = ParseEnum.GetResult(c.Result); IsNinety = c.IsNinety > 0; IsFifty = c.IsFifty > 0; IsMoving = c.IsMoving > 0; IsFlanking = c.IsFlanking > 0; SrcAgent = c.SrcAgent; SrcInstId = c.SrcInstid; DstAgent = c.DstAgent; DstInstId = c.DstInstid; ShieldDamage = c.IsShields > 0 ? c.OverstackValue > 0 ? (int)c.OverstackValue : c.Value : 0; }
/// <summary> /// Process stats for kill event /// </summary> /// <returns></returns> public async Task AddScriptKill(Player attacker, Player victim, int serverId, string map, string hitLoc, string type, string damage, string weapon, string killOrigin, string deathOrigin) { await AddStandardKill(attacker, victim); if (victim == null) { Log.WriteError($"[AddScriptKill] Victim is null"); return; } var statsSvc = ContextThreads[serverId]; var playerDetection = Servers[serverId].PlayerDetections[attacker.ClientNumber]; var kill = new EFClientKill() { Active = true, AttackerId = attacker.ClientId, VictimId = victim.ClientId, ServerId = serverId, Map = ParseEnum <IW4Info.MapName> .Get(map, typeof(IW4Info.MapName)), DeathOrigin = Vector3.Parse(deathOrigin), KillOrigin = Vector3.Parse(killOrigin), DeathType = ParseEnum <IW4Info.MeansOfDeath> .Get(type, typeof(IW4Info.MeansOfDeath)), Damage = Int32.Parse(damage), HitLoc = ParseEnum <IW4Info.HitLocation> .Get(hitLoc, typeof(IW4Info.HitLocation)), Weapon = ParseEnum <IW4Info.WeaponName> .Get(weapon, typeof(IW4Info.WeaponName)) }; playerDetection.ProcessKill(kill); return; statsSvc.KillStatsSvc.Insert(kill); await statsSvc.KillStatsSvc.SaveChangesAsync(); }
public FixHeaderDecoder(SocketClientConnection connection, bool debug = false) { _debug = debug; _parseStatus = ParseEnum.Received; _connection = connection; }
/// <summary> /// Process stats for kill event /// </summary> /// <returns></returns> public async Task AddScriptKill(Player attacker, Player victim, int serverId, string map, string hitLoc, string type, string damage, string weapon, string killOrigin, string deathOrigin, string viewAngles, string offset, string isKillstreakKill, string Ads) { var statsSvc = ContextThreads[serverId]; Vector3 vDeathOrigin = null; Vector3 vKillOrigin = null; try { vDeathOrigin = Vector3.Parse(deathOrigin); vKillOrigin = Vector3.Parse(killOrigin); } catch (FormatException) { Log.WriteWarning("Could not parse kill or death origin vector"); Log.WriteDebug($"Kill - {killOrigin} Death - {deathOrigin}"); await AddStandardKill(attacker, victim); return; } var kill = new EFClientKill() { Active = true, AttackerId = attacker.ClientId, VictimId = victim.ClientId, ServerId = serverId, Map = ParseEnum <IW4Info.MapName> .Get(map, typeof(IW4Info.MapName)), DeathOrigin = vDeathOrigin, KillOrigin = vKillOrigin, DeathType = ParseEnum <IW4Info.MeansOfDeath> .Get(type, typeof(IW4Info.MeansOfDeath)), Damage = Int32.Parse(damage), HitLoc = ParseEnum <IW4Info.HitLocation> .Get(hitLoc, typeof(IW4Info.HitLocation)), Weapon = ParseEnum <IW4Info.WeaponName> .Get(weapon, typeof(IW4Info.WeaponName)), ViewAngles = Vector3.Parse(viewAngles).FixIW4Angles(), TimeOffset = Int64.Parse(offset), When = DateTime.UtcNow, IsKillstreakKill = isKillstreakKill[0] != '0', AdsPercent = float.Parse(Ads) }; if (kill.DeathType == IW4Info.MeansOfDeath.MOD_SUICIDE && kill.Damage == 100000) { // suicide by switching teams so let's not count it against them return; } await AddStandardKill(attacker, victim); if (kill.IsKillstreakKill) { return; } var clientDetection = Servers[serverId].PlayerDetections[attacker.ClientId]; var clientStats = Servers[serverId].PlayerStats[attacker.ClientId]; // increment their hit count if (kill.DeathType == IW4Info.MeansOfDeath.MOD_PISTOL_BULLET || kill.DeathType == IW4Info.MeansOfDeath.MOD_RIFLE_BULLET || kill.DeathType == IW4Info.MeansOfDeath.MOD_HEAD_SHOT) { clientStats.HitLocations.Single(hl => hl.Location == kill.HitLoc).HitCount += 1; statsSvc.ClientStatSvc.Update(clientStats); await statsSvc.ClientStatSvc.SaveChangesAsync(); } //statsSvc.KillStatsSvc.Insert(kill); //await statsSvc.KillStatsSvc.SaveChangesAsync(); if (Plugin.Config.Configuration().EnableAntiCheat) { async Task executePenalty(Cheat.DetectionPenaltyResult penalty) { switch (penalty.ClientPenalty) { case Penalty.PenaltyType.Ban: await attacker.Ban("You appear to be cheating", new Player() { ClientId = 1 }); break; case Penalty.PenaltyType.Flag: if (attacker.Level != Player.Permission.User) { break; } var flagCmd = new CFlag(); await flagCmd.ExecuteAsync(new GameEvent(GameEvent.EventType.Flag, $"{(int)penalty.Bone}-{Math.Round(penalty.RatioAmount, 2).ToString()}@{penalty.KillCount}", new Player() { ClientId = 1, Level = Player.Permission.Console, ClientNumber = -1, CurrentServer = attacker.CurrentServer }, attacker, attacker.CurrentServer)); break; } } await executePenalty(clientDetection.ProcessKill(kill)); await executePenalty(clientDetection.ProcessTotalRatio(clientStats)); } }
private static string GetNPCIcon(int id) { switch (ParseEnum.GetTargetIDS(id)) { case ParseEnum.TargetIDS.WorldVersusWorld: return("https://wiki.guildwars2.com/images/d/db/PvP_Server_Browser_%28map_icon%29.png"); case ParseEnum.TargetIDS.ValeGuardian: return("https://i.imgur.com/MIpP5pK.png"); case ParseEnum.TargetIDS.Gorseval: return("https://i.imgur.com/5hmMq12.png"); case ParseEnum.TargetIDS.Sabetha: return("https://i.imgur.com/UqbFp9S.png"); case ParseEnum.TargetIDS.Slothasor: return("https://i.imgur.com/h1xH3ER.png"); case ParseEnum.TargetIDS.Berg: return("https://i.imgur.com/tLMXqL7.png"); case ParseEnum.TargetIDS.Narella: return("https://i.imgur.com/FwMCoR0.png"); case ParseEnum.TargetIDS.Zane: return("https://i.imgur.com/tkPWMST.png"); case ParseEnum.TargetIDS.Matthias: return("https://i.imgur.com/3uMMmTS.png"); case ParseEnum.TargetIDS.KeepConstruct: return("https://i.imgur.com/Kq0kL07.png"); case ParseEnum.TargetIDS.Xera: return("https://i.imgur.com/lYwJEyV.png"); case ParseEnum.TargetIDS.Cairn: return("https://i.imgur.com/gQY37Tf.png"); case ParseEnum.TargetIDS.MursaatOverseer: return("https://i.imgur.com/5LNiw4Y.png"); case ParseEnum.TargetIDS.Samarog: return("https://i.imgur.com/MPQhKfM.png"); case ParseEnum.TargetIDS.Deimos: return("https://i.imgur.com/mWfxBaO.png"); case ParseEnum.TargetIDS.SoullessHorror: case ParseEnum.TargetIDS.Desmina: return("https://i.imgur.com/jAiRplg.png"); case ParseEnum.TargetIDS.BrokenKing: return("https://i.imgur.com/FNgUmvL.png"); case ParseEnum.TargetIDS.SoulEater: return("https://i.imgur.com/Sd6Az8M.png"); case ParseEnum.TargetIDS.EyeOfFate: case ParseEnum.TargetIDS.EyeOfJudgement: return("https://i.imgur.com/kAgdoa5.png"); case ParseEnum.TargetIDS.Dhuum: return("https://i.imgur.com/RKaDon5.png"); case ParseEnum.TargetIDS.ConjuredAmalgamate: return("https://i.imgur.com/C23rYTl.png"); case ParseEnum.TargetIDS.CALeftArm: return("https://i.imgur.com/qrkQvEY.png"); case ParseEnum.TargetIDS.CARightArm: return("https://i.imgur.com/MVwjtH7.png"); case ParseEnum.TargetIDS.Kenut: return("https://i.imgur.com/6yq45Cc.png"); case ParseEnum.TargetIDS.Nikare: return("https://i.imgur.com/TLykcrJ.png"); case ParseEnum.TargetIDS.Qadim: return("https://i.imgur.com/IfoHTHT.png"); case ParseEnum.TargetIDS.Freezie: return("https://wiki.guildwars2.com/images/d/d9/Mini_Freezie.png"); case ParseEnum.TargetIDS.Adina: return("https://i.imgur.com/or3m1yb.png"); case ParseEnum.TargetIDS.Sabir: return("https://i.imgur.com/Q4WUXqw.png"); case ParseEnum.TargetIDS.PeerlessQadim: return("https://i.imgur.com/47uePpb.png"); case ParseEnum.TargetIDS.IcebroodConstruct: case ParseEnum.TargetIDS.IcebroodConstructFraenir: return("https://i.imgur.com/dpaZFa5.png"); case ParseEnum.TargetIDS.ClawOfTheFallen: return("https://i.imgur.com/HF85QpV.png"); case ParseEnum.TargetIDS.VoiceOfTheFallen: return("https://i.imgur.com/BdTGXMU.png"); case ParseEnum.TargetIDS.VoiceAndClaw: return("https://i.imgur.com/V1rJBnq.png"); case ParseEnum.TargetIDS.FraenirOfJormag: return("https://i.imgur.com/MxudnKp.png"); case ParseEnum.TargetIDS.Boneskinner: return("https://i.imgur.com/7HPdKDQ.png"); case ParseEnum.TargetIDS.WhisperOfJormag: return("https://i.imgur.com/lu9ZLVq.png"); case ParseEnum.TargetIDS.MAMA: return("https://i.imgur.com/1h7HOII.png"); case ParseEnum.TargetIDS.Siax: return("https://i.imgur.com/5C60cQb.png"); case ParseEnum.TargetIDS.Ensolyss: return("https://i.imgur.com/GUTNuyP.png"); case ParseEnum.TargetIDS.Skorvald: return("https://i.imgur.com/IOPAHRE.png"); case ParseEnum.TargetIDS.Artsariiv: return("https://wiki.guildwars2.com/images/b/b4/Artsariiv.jpg"); case ParseEnum.TargetIDS.Arkk: return("https://i.imgur.com/u6vv8cW.png"); case ParseEnum.TargetIDS.LGolem: return("https://wiki.guildwars2.com/images/4/47/Mini_Baron_von_Scrufflebutt.png"); case ParseEnum.TargetIDS.AvgGolem: return("https://wiki.guildwars2.com/images/c/cb/Mini_Mister_Mittens.png"); case ParseEnum.TargetIDS.StdGolem: return("https://wiki.guildwars2.com/images/8/8f/Mini_Professor_Mew.png"); case ParseEnum.TargetIDS.MassiveGolem: return("https://wiki.guildwars2.com/images/3/33/Mini_Snuggles.png"); case ParseEnum.TargetIDS.MedGolem: return("https://wiki.guildwars2.com/images/c/cb/Mini_Mister_Mittens.png"); case ParseEnum.TargetIDS.TwistedCastle: return("https://i.imgur.com/ZBm5Uga.png"); } switch (ParseEnum.GetTrashIDS(id)) { case Spirit: case Spirit2: case ChargedSoul: case HollowedBomber: return("https://i.imgur.com/sHmksvO.png"); case Saul: return("https://i.imgur.com/ck2IsoS.png"); case GamblerClones: return("https://i.imgur.com/zMsBWEx.png"); case GamblerReal: return("https://i.imgur.com/J6oMITN.png"); case Pride: return("https://i.imgur.com/ePTXx23.png"); case OilSlick: case Oil: return("https://i.imgur.com/R26VgEr.png"); case Tear: return("https://i.imgur.com/N9seps0.png"); case Gambler: case Drunkard: case Thief: return("https://i.imgur.com/vINeVU6.png"); case TormentedDead: case Messenger: return("https://i.imgur.com/1J2BTFg.png"); case Enforcer: return("https://i.imgur.com/elHjamF.png"); case Echo: return("https://i.imgur.com/kcN9ECn.png"); case Core: case ExquisiteConjunction: return("https://i.imgur.com/yI34iqw.png"); case Jessica: case Olson: case Engul: case Faerla: case Caulle: case Henley: case Galletta: case Ianim: return("https://i.imgur.com/qeYT1Bf.png"); case InsidiousProjection: return("https://i.imgur.com/9EdItBS.png"); case EnergyOrb: return("https://i.postimg.cc/NMNvyts0/Power-Ball.png"); case UnstableLeyRift: return("https://i.imgur.com/YXM3igs.png"); case RadiantPhantasm: return("https://i.imgur.com/O5VWLyY.png"); case CrimsonPhantasm: return("https://i.imgur.com/zP7Bvb4.png"); case Storm: return("https://i.imgur.com/9XtNPdw.png"); case IcePatch: return("https://i.imgur.com/yxKJ5Yc.png"); case BanditSaboteur: return("https://i.imgur.com/jUKMEbD.png"); case NarellaTornado: case Tornado: return("https://i.imgur.com/e10lZMa.png"); case Jade: return("https://i.imgur.com/ivtzbSP.png"); case Zommoros: return("https://i.imgur.com/BxbsRCI.png"); case AncientInvokedHydra: return("https://i.imgur.com/YABLiBz.png"); case IcebornHydra: return("https://i.imgur.com/LoYMBRU.png"); case IceElemental: return("https://i.imgur.com/pEkBeNp.png"); case WyvernMatriarch: return("https://i.imgur.com/kLKLSfv.png"); case WyvernPatriarch: return("https://i.imgur.com/vjjNSpI.png"); case ApocalypseBringer: return("https://i.imgur.com/0LGKCn2.png"); case ConjuredGreatsword: return("https://i.imgur.com/vHka0QN.png"); case ConjuredShield: return("https://i.imgur.com/wUiI19S.png"); case GreaterMagmaElemental1: case GreaterMagmaElemental2: return("https://i.imgur.com/sr146T6.png"); case LavaElemental1: case LavaElemental2: return("https://i.imgur.com/mydwiYy.png"); case PyreGuardian: case SmallKillerTornado: case BigKillerTornado: return("https://i.imgur.com/6zNPTUw.png"); case QadimLamp: return("https://i.imgur.com/89Kjv0N.png"); case PyreGuardianRetal: return("https://i.imgur.com/WC6LRkO.png"); case PyreGuardianStab: return("https://i.imgur.com/ISa0urR.png"); case PyreGuardianProtect: return("https://i.imgur.com/jLW7rpV.png"); case ReaperofFlesh: return("https://i.imgur.com/Notctbt.png"); case Kernan: return("https://i.imgur.com/WABRQya.png"); case Knuckles: return("https://i.imgur.com/m1y8nJE.png"); case Karde: return("https://i.imgur.com/3UGyosm.png"); case Rigom: return("https://i.imgur.com/REcGMBe.png"); case Guldhem: return("https://i.imgur.com/xa7Fefn.png"); case Scythe: return("https://i.imgur.com/INCGLIK.png"); case BanditBombardier: case SurgingSoul: case MazeMinotaur: case Enervator: case WhisperEcho: return("https://i.imgur.com/k79t7ZA.png"); case HandOfErosion: case HandOfEruption: return("https://i.imgur.com/reGQHhr.png"); case VoltaicWisp: return("https://i.imgur.com/C1mvNGZ.png"); case ParalyzingWisp: return("https://i.imgur.com/YBl8Pqo.png"); case Pylon2: return("https://i.imgur.com/b33vAEQ.png"); case EntropicDistortion: return("https://i.imgur.com/MIpP5pK.png"); case SmallJumpyTornado: return("https://i.imgur.com/WBJNgp7.png"); case OrbSpider: return("https://i.imgur.com/FB5VM9X.png"); case Seekers: return("https://i.imgur.com/FrPoluz.png"); case BlueGuardian: return("https://i.imgur.com/6CefnkP.png"); case GreenGuardian: return("https://i.imgur.com/nauDVYP.png"); case RedGuardian: return("https://i.imgur.com/73Uj4lG.png"); case UnderworldReaper: return("https://i.imgur.com/Tq6SYVe.png"); case CagedWarg: case GreenSpirit1: case GreenSpirit2: case BanditSapper: case ProjectionArkk: case PrioryExplorer: case PrioryScholar: case VigilRecruit: case VigilTactician: case Prisoner1: case Prisoner2: case Pylon1: return("https://i.imgur.com/0koP4xB.png"); case FleshWurm: return("https://i.imgur.com/o3vX9Zc.png"); case Hands: return("https://i.imgur.com/8JRPEoo.png"); case TemporalAnomaly: case TemporalAnomaly2: return("https://i.imgur.com/MIpP5pK.png"); case DOC: case BLIGHT: case PLINK: case CHOP: return("https://wiki.guildwars2.com/images/4/47/Mini_Baron_von_Scrufflebutt.png"); case FreeziesFrozenHeart: return("https://wiki.guildwars2.com/images/9/9e/Mini_Freezie%27s_Heart.png"); case RiverOfSouls: return("https://i.imgur.com/4pXEnaX.png"); case DhuumDesmina: return("https://i.imgur.com/jAiRplg.png"); //case CastleFountain: // return "https://i.imgur.com/xV0OPWL.png"; case HauntingStatue: return("https://i.imgur.com/7IQDyuK.png"); case GreenKnight: case RedKnight: case BlueKnight: return("https://i.imgur.com/lpBm4d6.png"); } return("https://i.imgur.com/HuJHqRZ.png"); }
private static CombatItem ReadCombatItemRev1(BinaryReader reader) { // 8 bytes: time long time = reader.ReadInt64(); // 8 bytes: src_agent ulong srcAgent = reader.ReadUInt64(); // 8 bytes: dst_agent ulong dstAgent = reader.ReadUInt64(); // 4 bytes: value int value = reader.ReadInt32(); // 4 bytes: buff_dmg int buffDmg = reader.ReadInt32(); // 4 bytes: overstack_value uint overstackValue = reader.ReadUInt32(); // 4 bytes: skill_id uint skillId = reader.ReadUInt32(); // 2 bytes: src_instid ushort srcInstid = reader.ReadUInt16(); // 2 bytes: dst_instid ushort dstInstid = reader.ReadUInt16(); // 2 bytes: src_master_instid ushort srcMasterInstid = reader.ReadUInt16(); // 2 bytes: dst_master_instid ushort dstmasterInstid = reader.ReadUInt16(); // 1 byte: iff ParseEnum.IFF iff = ParseEnum.GetIFF(reader.ReadByte()); // 1 byte: buff byte buff = reader.ReadByte(); // 1 byte: result ParseEnum.Result result = ParseEnum.GetResult(reader.ReadByte()); // 1 byte: is_activation ParseEnum.Activation isActivation = ParseEnum.GetActivation(reader.ReadByte()); // 1 byte: is_buffremove ParseEnum.BuffRemove isBuffRemove = ParseEnum.GetBuffRemove(reader.ReadByte()); // 1 byte: is_ninety byte isNinety = reader.ReadByte(); // 1 byte: is_fifty byte isFifty = reader.ReadByte(); // 1 byte: is_moving byte isMoving = reader.ReadByte(); // 1 byte: is_statechange ParseEnum.StateChange isStateChange = ParseEnum.GetStateChange(reader.ReadByte()); // 1 byte: is_flanking byte isFlanking = reader.ReadByte(); // 1 byte: is_flanking byte isShields = reader.ReadByte(); // 1 byte: is_flanking byte isOffcycle = reader.ReadByte(); // 5 bytes: offcycle (?) + garbage ParseHelper.SafeSkip(reader.BaseStream, 4); //save // Add combat return(new CombatItem(time, srcAgent, dstAgent, value, buffDmg, overstackValue, skillId, srcInstid, dstInstid, srcMasterInstid, dstmasterInstid, iff, buff, result, isActivation, isBuffRemove, isNinety, isFifty, isMoving, isStateChange, isFlanking, isShields, isOffcycle)); }
public ParseNode(ParseEnum e, String value) { this.E = e; this.Value = value; }
public static void ReadFullyWithPrefix(StreamGenerator <byte> generator) { int messageLength = 0; int offset = 0; int prefixBytesDoneCount = 0; int prefixBytesDoneThisOp = 0; int messageBytesDoneCount = 0; int messageBytesDoneThisOp = 0; int remainingBytesToProcess = 0; foreach (var item in generator.Generate()) { Array.Clear(buffer, 0, buffer.Length); while (true) { switch (status) { case ParseEnum.Receive: { prefixBytesDoneThisOp = 0; messageBytesDoneThisOp = 0; //recv += socket.Receive(receive); var stream = new MemoryStream(item); var read = stream.Read(buffer, 0, buffer.Length); // 接收到FIN if (read == 0) { return; } remainingBytesToProcess = read; status = ParseEnum.Process_Head; } break; case ParseEnum.Process_Head: { if (prefixBytesDoneCount < headLength) { if (prefixBytesDoneCount == 0) { headBuffer = ArrayPool <byte> .Shared.Rent(headLength); } if (remainingBytesToProcess >= headLength - prefixBytesDoneCount) { Buffer.BlockCopy( buffer, 0 + offset, headBuffer, prefixBytesDoneCount, headLength - prefixBytesDoneCount); prefixBytesDoneThisOp = headLength - prefixBytesDoneCount; prefixBytesDoneCount += prefixBytesDoneThisOp; remainingBytesToProcess = remainingBytesToProcess - prefixBytesDoneThisOp; messageLength = BitConverter.ToInt32(headBuffer, 0); ArrayPool <byte> .Shared.Return(headBuffer, true); if (messageLength > maxMessageLength) { Console.WriteLine("消息长度超过最大限制,直接丢弃"); return; } status = ParseEnum.Process_Body; } else { Buffer.BlockCopy( buffer, 0 + offset, headBuffer, prefixBytesDoneCount, remainingBytesToProcess); prefixBytesDoneThisOp = remainingBytesToProcess; prefixBytesDoneCount += prefixBytesDoneThisOp; remainingBytesToProcess = 0; offset = 0; status = ParseEnum.Receive; goto Loop; } } else { status = ParseEnum.Process_Body; } } break; case ParseEnum.Process_Body: { if (messageBytesDoneCount == 0) { bodyBuffer = ArrayPool <byte> .Shared.Rent(messageLength); } if (remainingBytesToProcess >= messageLength - messageBytesDoneCount) { Buffer.BlockCopy( buffer, prefixBytesDoneThisOp + offset, bodyBuffer, messageBytesDoneCount, messageLength - messageBytesDoneCount); messageBytesDoneThisOp = messageLength - messageBytesDoneCount; messageBytesDoneCount += messageBytesDoneThisOp; remainingBytesToProcess = remainingBytesToProcess - messageBytesDoneThisOp; status = ParseEnum.Find_Body; } else { Buffer.BlockCopy( buffer, prefixBytesDoneThisOp + offset, bodyBuffer, messageBytesDoneCount, remainingBytesToProcess); messageBytesDoneThisOp = remainingBytesToProcess; messageBytesDoneCount += messageBytesDoneThisOp; remainingBytesToProcess = 0; offset = 0; status = ParseEnum.Receive; goto Loop; } } break; case ParseEnum.Find_Body: { ProcessMessage(bodyBuffer, messageLength, generator); if (remainingBytesToProcess == 0) { messageLength = 0; prefixBytesDoneCount = 0; messageBytesDoneCount = 0; status = ParseEnum.Receive; goto Loop; } else { offset += (headLength + messageLength); messageLength = 0; prefixBytesDoneCount = 0; prefixBytesDoneThisOp = 0; messageBytesDoneCount = 0; messageBytesDoneThisOp = 0; status = ParseEnum.Process_Head; } } break; } } Loop :; } }
protected FightLogic(ushort triggerID, AgentData agentData) { TriggerID = triggerID; HasCombatReplayMap = GetCombatMap() != null; MechanicList = new List <Mechanic>() { new PlayerStatusMechanic(SkillItem.DeathId, "Dead", new MechanicPlotlySetting("x", "rgb(0,0,0)"), "Dead", 0), new PlayerStatusMechanic(SkillItem.DownId, "Downed", new MechanicPlotlySetting("cross", "rgb(255,0,0)"), "Downed", 0), new PlayerStatusMechanic(SkillItem.ResurrectId, "Resurrect", new MechanicPlotlySetting("cross-open", "rgb(0,255,255)"), "Res", 0), new PlayerStatusMechanic(SkillItem.AliveId, "Got up", new MechanicPlotlySetting("cross", "rgb(0,255,0)"), "Got up", 0), new PlayerStatusMechanic(SkillItem.DCId, "Disconnected", new MechanicPlotlySetting("x", "rgb(120,120,120)"), "DC", 0), new PlayerStatusMechanic(SkillItem.RespawnId, "Respawn", new MechanicPlotlySetting("cross", "rgb(120,120,255)"), "Resp", 0) }; _basicMechanicsCount = MechanicList.Count; List <ParseEnum.TrashIDS> ids = GetTrashMobsIDS(); List <AgentItem> aList = agentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => ids.Contains(ParseEnum.GetTrashIDS(x.ID))).ToList(); foreach (AgentItem a in aList) { Mob mob = new Mob(a); TrashMobs.Add(mob); } }
// Constructors public FightData(int id, AgentData agentData, long start, long end) { FightOffset = start; FightEnd = end - start; TriggerID = id; switch (ParseEnum.GetTargetID(id)) { // case ParseEnum.TargetID.ValeGuardian: Logic = new ValeGuardian(id); break; case ParseEnum.TargetID.Gorseval: Logic = new Gorseval(id); break; case ParseEnum.TargetID.Sabetha: Logic = new Sabetha(id); break; case ParseEnum.TargetID.Slothasor: Logic = new Slothasor(id); break; case ParseEnum.TargetID.Zane: case ParseEnum.TargetID.Berg: case ParseEnum.TargetID.Narella: Logic = new BanditTrio(id); break; case ParseEnum.TargetID.Matthias: Logic = new Matthias(id); break; /*case ParseEnum.TargetIDS.Escort: * Logic = new Escort(id, agentData); * break;*/ case ParseEnum.TargetID.KeepConstruct: Logic = new KeepConstruct(id); break; case ParseEnum.TargetID.Xera: // some TC logs are registered as Xera if (agentData.GetNPCsByID((int)ParseEnum.TrashID.HauntingStatue).Count > 0) { TriggerID = (int)ParseEnum.TrashID.HauntingStatue; Logic = new TwistedCastle((int)ParseEnum.TargetID.TwistedCastle); break; } Logic = new Xera(id); break; case ParseEnum.TargetID.Cairn: Logic = new Cairn(id); break; case ParseEnum.TargetID.MursaatOverseer: Logic = new MursaatOverseer(id); break; case ParseEnum.TargetID.Samarog: Logic = new Samarog(id); break; case ParseEnum.TargetID.Deimos: Logic = new Deimos(id); break; case ParseEnum.TargetID.SoullessHorror: Logic = new SoullessHorror(id); break; case ParseEnum.TargetID.Desmina: Logic = new River(id); break; case ParseEnum.TargetID.BrokenKing: Logic = new BrokenKing(id); break; case ParseEnum.TargetID.SoulEater: Logic = new EaterOfSouls(id); break; case ParseEnum.TargetID.EyeOfFate: case ParseEnum.TargetID.EyeOfJudgement: Logic = new DarkMaze(id); break; case ParseEnum.TargetID.Dhuum: // some eyes logs are registered as Dhuum if (agentData.GetNPCsByID((int)ParseEnum.TargetID.EyeOfFate).Count > 0 || agentData.GetNPCsByID((int)ParseEnum.TargetID.EyeOfJudgement).Count > 0) { TriggerID = (int)ParseEnum.TargetID.EyeOfFate; Logic = new DarkMaze(TriggerID); break; } Logic = new Dhuum(id); break; case ParseEnum.TargetID.ConjuredAmalgamate: Logic = new ConjuredAmalgamate(id); break; case ParseEnum.TargetID.Kenut: case ParseEnum.TargetID.Nikare: Logic = new TwinLargos(id); break; case ParseEnum.TargetID.Qadim: Logic = new Qadim(id); break; case ParseEnum.TargetID.Freezie: Logic = new Freezie(id); break; case ParseEnum.TargetID.Adina: Logic = new Adina(id); break; case ParseEnum.TargetID.Sabir: Logic = new Sabir(id); break; case ParseEnum.TargetID.PeerlessQadim: Logic = new PeerlessQadim(id); break; // case ParseEnum.TargetID.IcebroodConstruct: Logic = new IcebroodConstruct(id); break; case ParseEnum.TargetID.FraenirOfJormag: Logic = new FraenirOfJormag(id); break; case ParseEnum.TargetID.VoiceOfTheFallen: case ParseEnum.TargetID.ClawOfTheFallen: Logic = new SuperKodanBrothers(id); break; case ParseEnum.TargetID.Boneskinner: Logic = new Boneskinner(id); break; case ParseEnum.TargetID.WhisperOfJormag: Logic = new WhisperOfJormag(id); break; case ParseEnum.TargetID.VariniaStormsounder: Logic = new ColdWar(id); break; // case ParseEnum.TargetID.MAMA: Logic = new MAMA(id); break; case ParseEnum.TargetID.Siax: Logic = new Siax(id); break; case ParseEnum.TargetID.Ensolyss: Logic = new Ensolyss(id); break; case ParseEnum.TargetID.Skorvald: Logic = new Skorvald(id); break; case ParseEnum.TargetID.Artsariiv: Logic = new Artsariiv(id); break; case ParseEnum.TargetID.Arkk: Logic = new Arkk(id); break; // case ParseEnum.TargetID.WorldVersusWorld: Logic = new WvWFight(id); break; // case ParseEnum.TargetID.MassiveGolem: case ParseEnum.TargetID.AvgGolem: case ParseEnum.TargetID.LGolem: case ParseEnum.TargetID.MedGolem: case ParseEnum.TargetID.StdGolem: Logic = new Golem(id); break; // default: switch (ParseEnum.GetTrashID(id)) { case ParseEnum.TrashID.HauntingStatue: Logic = new TwistedCastle((int)ParseEnum.TargetID.TwistedCastle); break; default: // Unknown Logic = new UnknownFightLogic(id); break; } break; } }
// Constructors public FightData(ushort id, bool requirePhases) { ID = id; _requirePhases = requirePhases; switch (ParseEnum.GetTargetIDS(id)) { case ParseEnum.TargetIDS.ValeGuardian: Logic = new ValeGuardian(id); break; case ParseEnum.TargetIDS.Gorseval: Logic = new Gorseval(id); break; case ParseEnum.TargetIDS.Sabetha: Logic = new Sabetha(id); break; case ParseEnum.TargetIDS.Slothasor: Logic = new Slothasor(id); break; case ParseEnum.TargetIDS.Zane: case ParseEnum.TargetIDS.Berg: case ParseEnum.TargetIDS.Narella: Logic = new BanditTrio(id); break; case ParseEnum.TargetIDS.Matthias: Logic = new Matthias(id); break; case ParseEnum.TargetIDS.KeepConstruct: Logic = new KeepConstruct(id); break; case ParseEnum.TargetIDS.Xera: Logic = new Xera(id); break; case ParseEnum.TargetIDS.Cairn: Logic = new Cairn(id); break; case ParseEnum.TargetIDS.MursaatOverseer: Logic = new MursaatOverseer(id); break; case ParseEnum.TargetIDS.Samarog: Logic = new Samarog(id); break; case ParseEnum.TargetIDS.Deimos: Logic = new Deimos(id); break; case ParseEnum.TargetIDS.SoullessHorror: Logic = new SoullessHorror(id); break; case ParseEnum.TargetIDS.Dhuum: Logic = new Dhuum(id); break; case ParseEnum.TargetIDS.ConjuredAmalgamate: Logic = new ConjuredAmalgamate(id); break; case ParseEnum.TargetIDS.Kenut: case ParseEnum.TargetIDS.Nikare: Logic = new TwinLargos(id); break; case ParseEnum.TargetIDS.Qadim: Logic = new Qadim(id); break; case ParseEnum.TargetIDS.Freezie: Logic = new Freezie(id); break; case ParseEnum.TargetIDS.MAMA: Logic = new MAMA(id); break; case ParseEnum.TargetIDS.Siax: Logic = new Siax(id); break; case ParseEnum.TargetIDS.Ensolyss: Logic = new Ensolyss(id); break; case ParseEnum.TargetIDS.Skorvald: Logic = new Skorvald(id); break; case ParseEnum.TargetIDS.Artsariiv: Logic = new Artsariiv(id); break; case ParseEnum.TargetIDS.Arkk: Logic = new Arkk(id); break; case ParseEnum.TargetIDS.MassiveGolem: case ParseEnum.TargetIDS.AvgGolem: case ParseEnum.TargetIDS.LGolem: case ParseEnum.TargetIDS.MedGolem: case ParseEnum.TargetIDS.StdGolem: Logic = new Golem(id); break; default: // Unknown Logic = new UnknownFightLogic(id); break; } }
public static string GetNPCIcon(ushort id) { switch (ParseEnum.GetTargetIDS(id)) { case ParseEnum.TargetIDS.ValeGuardian: return("https://i.imgur.com/MIpP5pK.png"); case ParseEnum.TargetIDS.Gorseval: return("https://i.imgur.com/5hmMq12.png"); case ParseEnum.TargetIDS.Sabetha: return("https://i.imgur.com/UqbFp9S.png"); case ParseEnum.TargetIDS.Slothasor: return("https://i.imgur.com/h1xH3ER.png"); case ParseEnum.TargetIDS.Berg: return("https://i.imgur.com/tLMXqL7.png"); case ParseEnum.TargetIDS.Narella: return("https://i.imgur.com/FwMCoR0.png"); case ParseEnum.TargetIDS.Zane: return("https://i.imgur.com/tkPWMST.png"); case ParseEnum.TargetIDS.Matthias: return("https://i.imgur.com/3uMMmTS.png"); case ParseEnum.TargetIDS.KeepConstruct: return("https://i.imgur.com/Kq0kL07.png"); case ParseEnum.TargetIDS.Xera: return("https://i.imgur.com/lYwJEyV.png"); case ParseEnum.TargetIDS.Cairn: return("https://i.imgur.com/gQY37Tf.png"); case ParseEnum.TargetIDS.MursaatOverseer: return("https://i.imgur.com/5LNiw4Y.png"); case ParseEnum.TargetIDS.Samarog: return("https://i.imgur.com/MPQhKfM.png"); case ParseEnum.TargetIDS.Deimos: return("https://i.imgur.com/mWfxBaO.png"); case ParseEnum.TargetIDS.SoullessHorror: return("https://i.imgur.com/jAiRplg.png"); case ParseEnum.TargetIDS.Dhuum: return("https://i.imgur.com/RKaDon5.png"); case ParseEnum.TargetIDS.ConjuredAmalgamate: return("https://i.imgur.com/C23rYTl.png"); case ParseEnum.TargetIDS.CALeftArm: return("https://i.imgur.com/qrkQvEY.png"); case ParseEnum.TargetIDS.CARightArm: return("https://i.imgur.com/MVwjtH7.png"); case ParseEnum.TargetIDS.Nikare: return("https://i.imgur.com/6yq45Cc.png"); case ParseEnum.TargetIDS.Kenut: return("https://i.imgur.com/TLykcrJ.png"); case ParseEnum.TargetIDS.Qadim: return("https://i.imgur.com/IfoHTHT.png"); case ParseEnum.TargetIDS.Freezie: return("https://wiki.guildwars2.com/images/d/d9/Mini_Freezie.png"); case ParseEnum.TargetIDS.MAMA: return("https://i.imgur.com/1h7HOII.png"); case ParseEnum.TargetIDS.Siax: return("https://i.imgur.com/5C60cQb.png"); case ParseEnum.TargetIDS.Ensolyss: return("https://i.imgur.com/GUTNuyP.png"); case ParseEnum.TargetIDS.Skorvald: return("https://i.imgur.com/IOPAHRE.png"); case ParseEnum.TargetIDS.Artsariiv: return("https://wiki.guildwars2.com/images/b/b4/Artsariiv.jpg"); case ParseEnum.TargetIDS.Arkk: return("https://i.imgur.com/u6vv8cW.png"); case ParseEnum.TargetIDS.LGolem: return("https://wiki.guildwars2.com/images/4/47/Mini_Baron_von_Scrufflebutt.png"); case ParseEnum.TargetIDS.AvgGolem: return("https://wiki.guildwars2.com/images/c/cb/Mini_Mister_Mittens.png"); case ParseEnum.TargetIDS.StdGolem: return("https://wiki.guildwars2.com/images/8/8f/Mini_Professor_Mew.png"); case ParseEnum.TargetIDS.MassiveGolem: return("https://wiki.guildwars2.com/images/3/33/Mini_Snuggles.png"); case ParseEnum.TargetIDS.MedGolem: return("https://wiki.guildwars2.com/images/c/cb/Mini_Mister_Mittens.png"); } switch (ParseEnum.GetTrashIDS(id)) { case Spirit: case Spirit2: case ChargedSoul: return("https://i.imgur.com/sHmksvO.png"); case Saul: return("https://i.imgur.com/ck2IsoS.png"); case GamblerClones: return("https://i.imgur.com/zMsBWEx.png"); case GamblerReal: return("https://i.imgur.com/J6oMITN.png"); case Pride: return("https://i.imgur.com/ePTXx23.png"); case OilSlick: case Oil: return("https://i.imgur.com/R26VgEr.png"); case Tear: return("https://i.imgur.com/N9seps0.png"); case Gambler: case Drunkard: case Thief: return("https://i.imgur.com/vINeVU6.png"); case TormentedDead: case Messenger: return("https://i.imgur.com/1J2BTFg.png"); case Enforcer: return("https://i.imgur.com/elHjamF.png"); case Echo: return("https://i.imgur.com/kcN9ECn.png"); case Core: case ExquisiteConjunction: return("https://i.imgur.com/yI34iqw.png"); case Jessica: case Olson: case Engul: case Faerla: case Caulle: case Henley: case Galletta: case Ianim: return("https://i.imgur.com/qeYT1Bf.png"); case InsidiousProjection: return("https://i.imgur.com/9EdItBS.png"); case UnstableLeyRift: return("https://i.imgur.com/YXM3igs.png"); case RadiantPhantasm: return("https://i.imgur.com/O5VWLyY.png"); case CrimsonPhantasm: return("https://i.imgur.com/zP7Bvb4.png"); case Storm: return("https://i.imgur.com/9XtNPdw.png"); case IcePatch: return("https://i.imgur.com/yxKJ5Yc.png"); case BanditSaboteur: return("https://i.imgur.com/jUKMEbD.png"); case NarellaTornado: case Tornado: return("https://i.imgur.com/e10lZMa.png"); case Jade: return("https://i.imgur.com/ivtzbSP.png"); case Zommoros: return("https://i.imgur.com/BxbsRCI.png"); case AncientInvokedHydra: return("https://i.imgur.com/YABLiBz.png"); case IcebornHydra: return("https://i.imgur.com/LoYMBRU.png"); case IceElemental: return("https://i.imgur.com/pEkBeNp.png"); case WyvernMatriarch: return("https://i.imgur.com/kLKLSfv.png"); case WyvernPatriarch: return("https://i.imgur.com/vjjNSpI.png"); case ApocalypseBringer: return("https://i.imgur.com/0LGKCn2.png"); case ConjuredGreatsword: return("https://i.imgur.com/vHka0QN.png"); case ConjuredShield: return("https://i.imgur.com/wUiI19S.png"); case GreaterMagmaElemental1: case GreaterMagmaElemental2: return("https://i.imgur.com/sr146T6.png"); case LavaElemental1: case LavaElemental2: return("https://i.imgur.com/mydwiYy.png"); case PyreGuardian: return("https://i.imgur.com/6zNPTUw.png"); case ReaperofFlesh: return("https://i.imgur.com/Notctbt.png"); case Kernan: return("https://i.imgur.com/WABRQya.png"); case Knuckles: return("https://i.imgur.com/m1y8nJE.png"); case Karde: return("https://i.imgur.com/3UGyosm.png"); case Rigom: return("https://i.imgur.com/REcGMBe.png"); case Guldhem: return("https://i.imgur.com/xa7Fefn.png"); case Scythe: return("https://i.imgur.com/INCGLIK.png"); case BanditBombardier: case SurgingSoul: return("https://i.imgur.com/k79t7ZA.png"); case Seekers: return("https://i.imgur.com/FrPoluz.png"); case BlueGuardian: return("https://i.imgur.com/6CefnkP.png"); case GreenGuardian: return("https://i.imgur.com/nauDVYP.png"); case RedGuardian: return("https://i.imgur.com/73Uj4lG.png"); case CagedWarg: case UnderworldReaper: case BanditSapper: return("https://i.imgur.com/0koP4xB.png"); case FleshWurm: return("https://i.imgur.com/o3vX9Zc.png"); case Hands: return("https://i.imgur.com/8JRPEoo.png"); case TemporalAnomaly: case TemporalAnomaly2: return("https://i.imgur.com/MIpP5pK.png"); case DOC: case BLIGHT: case PLINK: case CHOP: return("https://wiki.guildwars2.com/images/4/47/Mini_Baron_von_Scrufflebutt.png"); case FreeziesFrozenHeart: return("https://wiki.guildwars2.com/images/9/9e/Mini_Freezie%27s_Heart.png"); } return("https://i.imgur.com/HuJHqRZ.png"); }
public ParseNode(ParseEnum e) { this.E = e; }
public void InitTrashMobCombatReplay(ParsedLog log, int pollingRate) { List <ParseEnum.TrashIDS> ids = GetTrashMobsIDS(); List <AgentItem> aList = log.AgentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => ids.Contains(ParseEnum.GetTrashIDS(x.ID))).ToList(); foreach (AgentItem a in aList) { Mob mob = new Mob(a); mob.InitCombatReplay(log, pollingRate, true, false); TrashMobs.Add(mob); } }
public void ProcessReceive(SocketAsyncEventArgs e) { Print("当前线程id:" + Thread.CurrentThread.ManagedThreadId); while (true) { #region ParseLogic switch (_parseStatus) { case ParseEnum.Received: { prefixBytesDoneThisOp = 0; messageBytesDoneThisOp = 0; var read = e.BytesTransferred; if (e.SocketError == SocketError.Success) { // 接收到FIN if (read == 0) { _connection.DoClose(); return; } remainingBytesToProcess = read; _parseStatus = ParseEnum.Process_Head; } else { _connection.DoAbort("e.SocketError != SocketError.Success"); return; } } break; case ParseEnum.Process_Head: { if (prefixBytesDoneCount < headLength) { if (prefixBytesDoneCount == 0) { headBuffer = ArrayPool <byte> .Shared.Rent(headLength); } if (remainingBytesToProcess >= headLength - prefixBytesDoneCount) { Buffer.BlockCopy( e.Buffer, 0 + offset, headBuffer, prefixBytesDoneCount, headLength - prefixBytesDoneCount); prefixBytesDoneThisOp = headLength - prefixBytesDoneCount; prefixBytesDoneCount += prefixBytesDoneThisOp; remainingBytesToProcess = remainingBytesToProcess - prefixBytesDoneThisOp; messageLength = BitConverter.ToInt32(headBuffer, 0); ArrayPool <byte> .Shared.Return(headBuffer, true); if (messageLength == 0 || messageLength > maxMessageLength) { _connection.DoAbort("消息长度为0或超过最大限制,直接丢弃"); return; } _parseStatus = ParseEnum.Process_Body; } else { Buffer.BlockCopy( e.Buffer, 0 + offset, headBuffer, prefixBytesDoneCount, remainingBytesToProcess); prefixBytesDoneThisOp = remainingBytesToProcess; prefixBytesDoneCount += prefixBytesDoneThisOp; remainingBytesToProcess = 0; offset = 0; _parseStatus = ParseEnum.Received; // 开始新一次recv _connection.DoReceive(e); return; } } else { _parseStatus = ParseEnum.Process_Body; } } break; case ParseEnum.Process_Body: { if (messageBytesDoneCount == 0) { bodyBuffer = ArrayPool <byte> .Shared.Rent(messageLength); } if (remainingBytesToProcess >= messageLength - messageBytesDoneCount) { Buffer.BlockCopy( e.Buffer, prefixBytesDoneThisOp + offset, bodyBuffer, messageBytesDoneCount, messageLength - messageBytesDoneCount); messageBytesDoneThisOp = messageLength - messageBytesDoneCount; messageBytesDoneCount += messageBytesDoneThisOp; remainingBytesToProcess = remainingBytesToProcess - messageBytesDoneThisOp; _parseStatus = ParseEnum.Find_Body; } else { Buffer.BlockCopy( e.Buffer, prefixBytesDoneThisOp + offset, bodyBuffer, messageBytesDoneCount, remainingBytesToProcess); messageBytesDoneThisOp = remainingBytesToProcess; messageBytesDoneCount += messageBytesDoneThisOp; remainingBytesToProcess = 0; offset = 0; _parseStatus = ParseEnum.Received; // 开始新一次recv _connection.DoReceive(e); return; } } break; case ParseEnum.Find_Body: { _connection.MessageReceived(bodyBuffer, messageLength); if (remainingBytesToProcess == 0) { messageLength = 0; prefixBytesDoneCount = 0; messageBytesDoneCount = 0; _parseStatus = ParseEnum.Received; // 开始新一次recv _connection.DoReceive(e); return; } else { offset += (headLength + messageLength); messageLength = 0; prefixBytesDoneCount = 0; prefixBytesDoneThisOp = 0; messageBytesDoneCount = 0; messageBytesDoneThisOp = 0; _parseStatus = ParseEnum.Process_Head; } } break; } #endregion } }
protected virtual void ComputeFightTargets(AgentData agentData, List <CombatItem> combatItems) { foreach (int id in GetUniqueTargetIDs()) { RegroupTargetsByID(id, agentData, combatItems); } List <int> ids = GetFightTargetsIDs(); foreach (int id in ids) { List <AgentItem> agents = agentData.GetNPCsByID(id); foreach (AgentItem agentItem in agents) { Targets.Add(new NPC(agentItem)); } } List <ParseEnum.TrashIDS> ids2 = GetTrashMobsIDS(); var aList = agentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => ids2.Contains(ParseEnum.GetTrashIDS(x.ID))).ToList(); //aList.AddRange(agentData.GetAgentByType(AgentItem.AgentType.Gadget).Where(x => ids2.Contains(ParseEnum.GetTrashIDS(x.ID)))); foreach (AgentItem a in aList) { var mob = new NPC(a); TrashMobs.Add(mob); } }
public BreakbarStateEvent(CombatItem evtcItem, AgentData agentData) : base(evtcItem, agentData) { State = ParseEnum.GetBreakbarState(evtcItem.Value); }
protected void ComputeFightTargets(AgentData agentData, List <CombatItem> combatItems) { foreach (ushort id in GetUniqueTargetIDs()) { RegroupTargetsByID(id, agentData, combatItems); } List <ushort> ids = GetFightTargetsIDs(); foreach (ushort id in ids) { List <AgentItem> agents = agentData.GetAgentsByID(id); foreach (AgentItem agentItem in agents) { Targets.Add(new Target(agentItem)); } } List <ParseEnum.TrashIDS> ids2 = GetTrashMobsIDS(); List <AgentItem> aList = agentData.GetAgentByType(AgentItem.AgentType.NPC).Where(x => ids2.Contains(ParseEnum.GetTrashIDS(x.ID))).ToList(); foreach (AgentItem a in aList) { Mob mob = new Mob(a); TrashMobs.Add(mob); } }
// Constructors public FightData(ushort id, AgentData agentData, long start, long end) { FightStartLogTime = start; FightEndLogTime = end; ID = id; _requirePhases = Properties.Settings.Default.ParsePhases; switch (ParseEnum.GetTargetIDS(id)) { case ParseEnum.TargetIDS.ValeGuardian: Logic = new ValeGuardian(id); break; case ParseEnum.TargetIDS.Gorseval: Logic = new Gorseval(id); break; case ParseEnum.TargetIDS.Sabetha: Logic = new Sabetha(id); break; case ParseEnum.TargetIDS.Slothasor: Logic = new Slothasor(id); break; case ParseEnum.TargetIDS.Zane: case ParseEnum.TargetIDS.Berg: case ParseEnum.TargetIDS.Narella: Logic = new BanditTrio(id); break; case ParseEnum.TargetIDS.Matthias: Logic = new Matthias(id); break; /*case ParseEnum.TargetIDS.Escort: * Logic = new Escort(id, agentData); * break;*/ case ParseEnum.TargetIDS.KeepConstruct: Logic = new KeepConstruct(id); break; case ParseEnum.TargetIDS.Xera: Logic = new Xera(id); break; case ParseEnum.TargetIDS.Cairn: Logic = new Cairn(id); break; case ParseEnum.TargetIDS.MursaatOverseer: Logic = new MursaatOverseer(id); break; case ParseEnum.TargetIDS.Samarog: Logic = new Samarog(id); break; case ParseEnum.TargetIDS.Deimos: Logic = new Deimos(id); break; case ParseEnum.TargetIDS.SoullessHorror: Logic = new SoullessHorror(id); break; case ParseEnum.TargetIDS.Desmina: Logic = new River(id); break; case ParseEnum.TargetIDS.BrokenKing: Logic = new BrokenKing(id); break; case ParseEnum.TargetIDS.SoulEater: Logic = new EaterOfSouls(id); break; case ParseEnum.TargetIDS.EyeOfFate: case ParseEnum.TargetIDS.EyeOfJudgement: Logic = new DarkMaze(id); break; case ParseEnum.TargetIDS.Dhuum: // some eyes log are registered as Dhuum if (agentData.GetAgentsByID((ushort)ParseEnum.TargetIDS.EyeOfFate).Count > 0 || agentData.GetAgentsByID((ushort)ParseEnum.TargetIDS.EyeOfJudgement).Count > 0) { ID = (ushort)ParseEnum.TargetIDS.EyeOfFate; Logic = new DarkMaze((ushort)ParseEnum.TargetIDS.EyeOfFate); break; } Logic = new Dhuum(id); break; case ParseEnum.TargetIDS.ConjuredAmalgamate: Logic = new ConjuredAmalgamate(id); break; case ParseEnum.TargetIDS.Kenut: case ParseEnum.TargetIDS.Nikare: Logic = new TwinLargos(id); break; case ParseEnum.TargetIDS.Qadim: Logic = new Qadim(id); break; case ParseEnum.TargetIDS.Freezie: Logic = new Freezie(id); break; case ParseEnum.TargetIDS.Adina: Logic = new Adina(id); break; case ParseEnum.TargetIDS.Sabir: Logic = new Sabir(id); break; case ParseEnum.TargetIDS.PeerlessQadim: Logic = new PeerlessQadim(id); break; case ParseEnum.TargetIDS.MAMA: Logic = new MAMA(id); break; case ParseEnum.TargetIDS.Siax: Logic = new Siax(id); break; case ParseEnum.TargetIDS.Ensolyss: Logic = new Ensolyss(id); break; case ParseEnum.TargetIDS.Skorvald: Logic = new Skorvald(id); break; case ParseEnum.TargetIDS.Artsariiv: Logic = new Artsariiv(id); break; case ParseEnum.TargetIDS.Arkk: Logic = new Arkk(id); break; case ParseEnum.TargetIDS.WorldVersusWorld: Logic = new WvWFight(id); break; case ParseEnum.TargetIDS.MassiveGolem: case ParseEnum.TargetIDS.AvgGolem: case ParseEnum.TargetIDS.LGolem: case ParseEnum.TargetIDS.MedGolem: case ParseEnum.TargetIDS.StdGolem: Logic = new Golem(id); break; default: // Unknown Logic = new UnknownFightLogic(id); break; } }
private static CombatItem ReadCombatItem(BinaryReader reader) { // 8 bytes: time long time = reader.ReadInt64(); // 8 bytes: src_agent ulong src_agent = reader.ReadUInt64(); // 8 bytes: dst_agent ulong dst_agent = reader.ReadUInt64(); // 4 bytes: value int value = reader.ReadInt32(); // 4 bytes: buff_dmg int buff_dmg = reader.ReadInt32(); // 2 bytes: overstack_value ushort overstack_value = reader.ReadUInt16(); // 2 bytes: skill_id ushort skill_id = reader.ReadUInt16(); // 2 bytes: src_instid ushort src_instid = reader.ReadUInt16(); // 2 bytes: dst_instid ushort dst_instid = reader.ReadUInt16(); // 2 bytes: src_master_instid ushort src_master_instid = reader.ReadUInt16(); // 9 bytes: garbage ParseHelper.safeSkip(reader.BaseStream, 9); // 1 byte: iff ParseEnum.IFF iff = ParseEnum.getIFF(reader.ReadByte()); // 1 byte: buff ushort buff = (ushort)reader.ReadByte(); // 1 byte: result ParseEnum.Result result = ParseEnum.getResult(reader.ReadByte()); // 1 byte: is_activation ParseEnum.Activation is_activation = ParseEnum.getActivation(reader.ReadByte()); // 1 byte: is_buffremove ParseEnum.BuffRemove is_buffremoved = ParseEnum.getBuffRemove(reader.ReadByte()); // 1 byte: is_ninety ushort is_ninety = (ushort)reader.ReadByte(); // 1 byte: is_fifty ushort is_fifty = (ushort)reader.ReadByte(); // 1 byte: is_moving ushort is_moving = (ushort)reader.ReadByte(); // 1 byte: is_statechange ParseEnum.StateChange is_statechange = ParseEnum.getStateChange(reader.ReadByte()); // 1 byte: is_flanking ushort is_flanking = (ushort)reader.ReadByte(); // 1 byte: is_flanking ushort is_shields = (ushort)reader.ReadByte(); // 2 bytes: garbage ParseHelper.safeSkip(reader.BaseStream, 2); //save // Add combat return(new CombatItem(time, src_agent, dst_agent, value, buff_dmg, overstack_value, skill_id, src_instid, dst_instid, src_master_instid, iff, buff, result, is_activation, is_buffremoved, is_ninety, is_fifty, is_moving, is_statechange, is_flanking, is_shields)); }