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;
        }
Exemple #5
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;
        }
Exemple #6
0
        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);
        }
Exemple #7
0
 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;
 }
Exemple #9
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;
 }
Exemple #10
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;
 }
Exemple #12
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, 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));
            }
        }
Exemple #13
0
        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");
        }
Exemple #14
0
        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));
        }
Exemple #15
0
 public ParseNode(ParseEnum e, String value)
 {
     this.E = e;
     this.Value = value;
 }
Exemple #16
0
        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);
            }
        }
Exemple #18
0
        // 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;
            }
        }
Exemple #20
0
        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");
        }
Exemple #21
0
 public ParseNode(ParseEnum e, String value)
 {
     this.E     = e;
     this.Value = value;
 }
Exemple #22
0
 public ParseNode(ParseEnum e)
 {
     this.E = e;
 }
Exemple #23
0
        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);
 }
Exemple #27
0
        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);
            }
        }
Exemple #28
0
 public ParseNode(ParseEnum e)
 {
     this.E = e;
 }
Exemple #29
0
        // 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));
        }