Example #1
0
        private static void PerEquipmentStatDefOnRegisterStatDefs(On.RoR2.Stats.PerEquipmentStatDef.orig_RegisterStatDefs orig)
        {
            var instancesList = typeof(PerEquipmentStatDef).GetFieldValue <List <PerEquipmentStatDef> >("instancesList");

            foreach (PerEquipmentStatDef perEquipmentStatDef in instancesList)
            {
                var prefix       = perEquipmentStatDef.GetFieldValue <string>("prefix");
                var recordType   = perEquipmentStatDef.GetFieldValue <StatRecordType>("recordType");
                var dataType     = perEquipmentStatDef.GetFieldValue <StatDataType>("dataType");
                var keyToStatDef = EquipmentCatalog.GetPerEquipmentBuffer <StatDef>();
                perEquipmentStatDef.SetFieldValue("keyToStatDef", keyToStatDef);

                foreach (EquipmentIndex equipmentIndex in EquipmentCatalog.allEquipment)
                {
                    if ((int)equipmentIndex >= OriginalEquipmentCount)
                    {
                        continue;
                    }
                    StatDef statDef = StatDef.Register(prefix + "." + equipmentIndex, recordType, dataType, 0.0);
                    keyToStatDef[(int)equipmentIndex] = statDef;
                }
            }
        }
Example #2
0
        //The Awake() method is run at the very start when the game is initialized.
        public void Awake()
        {
            this.ourStatDef = StatDef.Register(this.token, StatRecordType.Sum, StatDataType.ULong, 0, null);
#if DEBUG
            this.testDef = StatDef.Register("test", StatRecordType.Sum, StatDataType.ULong, 0, null);
#endif
            On.RoR2.UI.GameEndReportPanelController.Awake += (orig, self) =>
            { //Function that hopefully gets implemented into R2API.
                orig(self);

                string[] strArray = new string[self.statsToDisplay.Length + 1];
                self.statsToDisplay.CopyTo(strArray, 0);
                strArray[self.statsToDisplay.Length] = this.token;
                self.statsToDisplay = strArray;
#if DEBUG       //Add our Debug stat
                strArray = new string[strArray.Length + 1];
                self.statsToDisplay.CopyTo(strArray, 0);
                strArray[self.statsToDisplay.Length] = "test";
                self.statsToDisplay = strArray;
#endif          //
            };
            On.RoR2.HealthComponent.TakeDamage += HealthDamageHook;
        }
Example #3
0
        // Disable field making for totalCollected and highestCollected for custom items
        private static void PerItemStatDefOnRegisterStatDefs(On.RoR2.Stats.PerItemStatDef.orig_RegisterStatDefs orig)
        {
            var instancesList = typeof(PerItemStatDef).GetFieldValue <List <PerItemStatDef> >("instancesList");

            foreach (PerItemStatDef perItemStatDef in instancesList)
            {
                var prefix       = perItemStatDef.GetFieldValue <string>("prefix");
                var recordType   = perItemStatDef.GetFieldValue <StatRecordType>("recordType");
                var dataType     = perItemStatDef.GetFieldValue <StatDataType>("dataType");
                var keyToStatDef = ItemCatalog.GetPerItemBuffer <StatDef>();
                perItemStatDef.SetFieldValue("keyToStatDef", keyToStatDef);

                foreach (ItemIndex itemIndex in ItemCatalog.allItems)
                {
                    if ((int)itemIndex >= OriginalItemCount)
                    {
                        continue;
                    }
                    ItemDef itemDef = ItemCatalog.GetItemDef(itemIndex);
                    StatDef statDef = StatDef.Register(prefix + "." + itemDef.name, recordType, dataType, 0.0);
                    keyToStatDef[(int)itemIndex] = statDef;
                }
            }
        }
Example #4
0
 public WastedTime()
 {
     Definition = StatDef.Register(token, StatRecordType.Sum, StatDataType.Double, 0, new StatDef.DisplayValueFormatterDelegate(StatDef.TimeMMSSDisplayValueFormatter));
     FullText   = fullText;
 }
Example #5
0
 public Seed()
 {
     Definition = StatDef.Register(token, StatRecordType.Newest, StatDataType.ULong, 0);
     FullText   = fulltext;
 }
Example #6
0
 public RandomNumber()
 {
     random     = new Random();
     Definition = StatDef.Register(token, StatRecordType.Newest, StatDataType.ULong, 0);
     FullText   = fulltext;
 }
Example #7
0
 public DamageBlocked()
 {
     Definition = StatDef.Register(token, StatRecordType.Sum, StatDataType.ULong, 0, null);
     FullText   = fullText;
 }
Example #8
0
 public Jumps()
 {
     Definition = StatDef.Register(token, recordType, dataType, 0, null);
     FullText   = fullText;
 }
Example #9
0
        protected void LoadBehavior()
        {
            Playername   = new List <CharacterBody>();
            counter      = new List <int>();
            currentStage = 0;

            statsLostItems = null;
            statsGainItems = null;

            statsLostItems = StatDef.Register("Lostitems", StatRecordType.Sum, StatDataType.ULong, 0, null);
            statsGainItems = StatDef.Register("Gainitems", StatRecordType.Sum, StatDataType.ULong, 0, null);

            On.RoR2.UI.GameEndReportPanelController.Awake += (orig, self) =>
            {
                orig(self);
                if (!Networking._instance.IsArtifactEnabled)
                {
                    return;
                }
                string[] information = new string[self.statsToDisplay.Length + 2];
                self.statsToDisplay.CopyTo(information, 0);
                information[information.Length - 2] = "Lostitems";
                information[information.Length - 1] = "Gainitems";
                self.statsToDisplay = information;
            };
            On.RoR2.PreGameController.StartRun += (orig, self) =>
            {
                orig(self);
            };

            On.RoR2.SceneDirector.PopulateScene += (orig, self) =>
            {
                orig(self);

                currentStage = Run.instance.stageClearCount + 1;


                if (Run.instance.selectedDifficulty == DifficultyIndex.Easy)
                {
                    timeForBuff = ArtifactOfDoomConfig.timeAfterHitToNotLoseItemDrizzly.Value;
                }
                if (Run.instance.selectedDifficulty == DifficultyIndex.Normal)
                {
                    timeForBuff = ArtifactOfDoomConfig.timeAfterHitToNotLoseItemRainstorm.Value;
                }
                if (Run.instance.selectedDifficulty == DifficultyIndex.Hard)
                {
                    timeForBuff = ArtifactOfDoomConfig.timeAfterHitToNotLoseItemMonsoon.Value;
                }
                if (timeForBuff == -1.0)
                {
                    List <Difficulty> characters = ArtifactOfDoomConfig.timeAfterHitToNotLoseItemOtherDifficulty.Value.FromJson <List <Difficulty> >();
                    foreach (var element in characters)
                    {
                        if (Run.instance.selectedDifficulty == (DifficultyIndex)element.DifficultyIndex)
                        {
                            timeForBuff = element.time;
                        }
                    }
                    if (timeForBuff == -1.0)
                    {
                        Debug.LogWarning("Didn't find valid Configuration for Selected Difficulty. Falling back to 0.1 seconds for Buff. If you want a own definition fill out timeAfterHitToNotLoseItemOtherDifficulty in the Config. DifficultyIndex=" + Run.instance.selectedDifficulty);
                        timeForBuff = 0.1;
                    }
                }
                QueueLostItemSprite   = new Dictionary <uint, Queue <ItemDef> >();
                QueueGainedItemSprite = new Dictionary <uint, Queue <ItemDef> >();
                Playername            = new List <CharacterBody>();
                counter = new List <int>();
                LockNetworkUser.Clear();
            };
            On.RoR2.Run.Awake += (orig, self) =>
            {
                orig(self);
                //Debug.LogWarning("NetworkClass.SpawnNetworkObject();");
            };
            On.RoR2.Run.Start += (orig, self) =>
            {
                orig(self);
            };
            On.RoR2.CharacterBody.OnInventoryChanged += (orig, self) =>
            {
                orig(self);


                if (!Networking._instance.IsArtifactEnabled)
                {
                    return;
                }
                if (!self.isPlayerControlled)
                {
                    return;
                }

                NetworkUser tempNetworkUser = getNetworkUserOfCharacterBody(self);
                int         calculatesEnemyCountToTrigger = calculateEnemyCountToTrigger(self.inventory);

                if (!Playername.Contains(self))
                {
                    Playername.Add(self);
                    counter.Add(0);
                }
                if (tempNetworkUser != null)
                {
                    string tempString = counter[Playername.IndexOf(self)] + "," + calculatesEnemyCountToTrigger;
                    if (NetworkServer.active)
                    {
                        Networking.ServerEnsureNetworking();
                        Networking._instance.TargetUpdateProgressBar(tempNetworkUser.connectionToClient, tempString);
                    }
                }
            };
            On.RoR2.GlobalEventManager.OnCharacterDeath += (orig, self, damageReport) =>
            {
                //try
                //{
                orig(self, damageReport);
                Networking._instance.IsArtifactEnabled      = RunArtifactManager.instance.IsArtifactEnabled(ArtifactOfDoom.Transmutation.artifactIndex);
                Networking._instance.IsCalculationSacrifice = ArtifactOfDoomConfig.useArtifactOfSacrificeCalculation.Value;

                if (!Networking._instance.IsArtifactEnabled)
                {
                    return;
                }
                if (Run.instance.isGameOverServer)
                {
                    return;
                }
                if (damageReport.victimBody.isPlayerControlled)
                {
                    return;
                }
                if (damageReport.attackerBody == null)
                {
                    return;
                }
                if (damageReport.attackerBody.inventory == null)
                {
                    return;
                }
                if (damageReport.victimBody.inventory == null)
                {
                    return;
                }

                if (damageReport.attackerOwnerMaster != null)
                {
                    if (!Playername.Contains(damageReport.attackerBody))
                    {
                        Playername.Add(damageReport.attackerOwnerMaster.GetBody());
                        counter.Add(0);
                    }
                }
                if (!Playername.Contains(damageReport.attackerBody))
                {
                    Playername.Add(damageReport.attackerBody);
                    counter.Add(0);
                }

                CharacterBody currentBody;
                if (damageReport.attackerOwnerMaster != null)
                {
                    currentBody = damageReport.attackerOwnerMaster.GetBody();
                }
                else
                {
                    currentBody = damageReport.attackerBody;
                }
                if (!currentBody.isPlayerControlled)
                {
                    return;
                }

                uint pos = 0;

                int  calculatesEnemyCountToTrigger = calculateEnemyCountToTrigger(currentBody.inventory);
                bool enemyTrigger = getEnemyDropRate(damageReport);
                if (counter[Playername.IndexOf(currentBody)] <= calculatesEnemyCountToTrigger && !ArtifactOfDoomConfig.useArtifactOfSacrificeCalculation.Value)
                {
                    counter[Playername.IndexOf(currentBody)]++;

                    NetworkUser tempNetworkUser = getNetworkUserOfDamageReport(damageReport, true);
                    string      temp            = counter[Playername.IndexOf(currentBody)] + "," + calculatesEnemyCountToTrigger;
                    //Debug.LogWarning("tempNetworkUser: "******"temp: " + temp);
                    if (NetworkServer.active)
                    {
                        Networking.ServerEnsureNetworking();
                        Networking._instance.TargetUpdateProgressBar(tempNetworkUser.connectionToClient, temp);
                    }
                }
                else
                {
                    if (ArtifactOfDoomConfig.useArtifactOfSacrificeCalculation.Value && !enemyTrigger)
                    {
                        return;
                    }
                    CharacterBody body;

                    if (damageReport.attackerOwnerMaster != null)
                    {
                        body = damageReport.attackerOwnerMaster.GetBody();

                        double chanceToTrigger = getCharacterSpezificBuffLengthMultiplier(body.baseNameToken);
                        chanceToTrigger *= 100;
                        var rand = new System.Random();
                        while (chanceToTrigger > rand.Next(0, 99))
                        {
                            ItemIndex addedItem = GiveAndReturnRandomItem(body.inventory);
                            if (ArtifactOfDoomConfig.enableChatItemOutput.Value)
                            {
                                var pickupDef   = ItemCatalog.GetItemDef(addedItem);
                                var pickupName  = Language.GetString(pickupDef.nameToken);
                                var playerColor = damageReport.attackerOwnerMaster.GetBody().GetColoredUserName();
                                var itemCount   = damageReport.attackerOwnerMaster.GetBody().inventory.GetItemCount(pickupDef.itemIndex);
                                Chat.SendBroadcastChat(new Chat.SimpleChatMessage
                                {
                                    baseToken =
                                        damageReport.attackerOwnerMaster.GetBody().GetColoredUserName() + $"<color=#{GrayColor}> gained</color> " +
                                        $"{pickupName ?? "???"} ({itemCount})</color> <color=#{GrayColor}></color>"
                                });
                            }
                            PlayerStatsComponent.FindBodyStatSheet(body).PushStatValue(statsGainItems, 1UL);
                            if (QueueGainedItemSprite.ContainsKey(body.netId.Value))
                            {
                                pos = body.netId.Value;
                            }
                            else
                            {
                                QueueGainedItemSprite.Add(body.netId.Value, new Queue <ItemDef>());
                                pos = body.netId.Value;
                            }
                            QueueGainedItemSprite[pos].Enqueue(ItemCatalog.GetItemDef(addedItem));
                            chanceToTrigger -= 100;
                        }
                    }
                    else
                    {
                        body = damageReport.attackerBody;
                        double chanceToTrigger = getCharacterSpezificItemCount(body.baseNameToken);
                        chanceToTrigger *= 100;
                        var rand = new System.Random();
                        while (chanceToTrigger > rand.Next(0, 99))
                        {
                            ItemIndex addedItem = GiveAndReturnRandomItem(body.inventory);
                            if (ArtifactOfDoomConfig.enableChatItemOutput.Value)
                            {
                                var pickupDef   = ItemCatalog.GetItemDef(addedItem);
                                var pickupName  = Language.GetString(pickupDef.nameToken);
                                var playerColor = body.GetColoredUserName();
                                var itemCount   = body.inventory.GetItemCount(pickupDef.itemIndex);
                                Chat.SendBroadcastChat(new Chat.SimpleChatMessage
                                {
                                    baseToken =
                                        body.GetColoredUserName() + $"<color=#{GrayColor}> gained</color> " +
                                        $"{pickupName ?? "???"} ({itemCount})</color> <color=#{GrayColor}></color>"
                                });
                            }
                            PlayerStatsComponent.FindBodyStatSheet(body).PushStatValue(statsGainItems, 1UL);
                            if (QueueGainedItemSprite.ContainsKey(body.netId.Value))
                            {
                                pos = body.netId.Value;
                            }
                            else
                            {
                                try
                                {
                                    QueueGainedItemSprite.Add(body.netId.Value, new Queue <ItemDef>());
                                    pos = body.netId.Value;
                                }
                                catch (Exception)
                                {
                                    Debug.LogError("[SirHamburger ArtifactOfDoom] Error while excecuting : QueueGainedItemSprite.Add(body.netId.Value, new Queue<Sprite>()); (line 203)");
                                }
                            }
                            QueueGainedItemSprite[pos].Enqueue(ItemCatalog.GetItemDef(addedItem));
                            chanceToTrigger -= 100;
                        }
                    }

                    if (QueueGainedItemSprite[pos].Count > 10)
                    {
                        QueueGainedItemSprite[pos].Dequeue();
                    }
                    string temp = "";
                    foreach (var element in QueueGainedItemSprite[pos])
                    {
                        temp += element.name + " ";
                    }

                    NetworkUser tempNetworkUser = getNetworkUserOfDamageReport(damageReport, true);

                    if (!LockItemGainNetworkUser.ContainsKey(tempNetworkUser))
                    {
                        LockItemGainNetworkUser.Add(tempNetworkUser, false);
                    }
                    counter[Playername.IndexOf(currentBody)]++;


                    if (!LockItemGainNetworkUser[tempNetworkUser])
                    {
                        LockItemGainNetworkUser[tempNetworkUser] = false;

                        LockItemGainNetworkUser[tempNetworkUser] = false;
                        string tempString = counter[Playername.IndexOf(currentBody)] + "," + calculatesEnemyCountToTrigger;
                        if (NetworkServer.active)
                        {
                            Networking._instance.TargetAddGainedItemsToPlayers(tempNetworkUser.connectionToClient, temp);
                            Networking.ServerEnsureNetworking();
                            Networking._instance.TargetUpdateProgressBar(tempNetworkUser.connectionToClient, tempString);
                        }
                    }

                    counter[Playername.IndexOf(currentBody)] = 0;
                }
            };
            On.RoR2.HealthComponent.TakeDamage += (orig, self, damageinfo) =>
            {
                //For adding possibility to dont loose items for some time: characterBody.AddTimedBuff(BuffIndex.Immune, duration);
                orig(self, damageinfo);
                //BuffIndex buff = new BuffIndex();
                //Debug.LogError("buffindex " +buff );
//
                //BuffCatalog.FindBuffIndex("ArtifactOfDoomDidLoseItem");
                //                Debug.LogError("buffindex " +buff );


                if (!Networking._instance.IsArtifactEnabled)
                {
                    return;
                }

                if (damageinfo.rejected)
                {
                    //Debug.Log("Teddie?");
                    return;
                }

                if (debug)
                {
                    Debug.LogWarning("Line 336");
                }

                if (self.body == null)
                {
                    if (debug)
                    {
                        Debug.LogWarning("self.body == null)");
                    }
                    return;
                }

                if (self.body.inventory == null)
                {
                    if (debug)
                    {
                        Debug.LogWarning("self.body.inventory == null)");
                    }
                    return;
                }

                if (Run.instance.isGameOverServer)
                {
                    if (debug)
                    {
                        Debug.LogWarning("RoR2.Run.instance.isGameOverServer)");
                    }
                    return;
                }

                if (damageinfo == null)
                {
                    if (debug)
                    {
                        Debug.LogWarning("damageinfo == null)");
                    }
                    return;
                }

                if (damageinfo.attacker == null)
                {
                    if (debug)
                    {
                        Debug.LogWarning("damageinfo.attacker.name==null)");
                    }
                    return;
                }
                if (self.body.HasBuff(ArtifactOfDoomConfig.ArtifactOfDoomBuff))
                {
                    if (debug)
                    {
                        Debug.LogWarning("you did lose an item not long ago so you don't lose one now");
                    }
                    return;
                }

                int totalItems = getTotalItemCountOfPlayer(self.body.inventory);
                if (self.body.isPlayerControlled && (totalItems > 0) && self.name != damageinfo.attacker.name)
                {
                    Dictionary <ItemIndex, int> lstItemIndex = new Dictionary <ItemIndex, int>();
                    List <ItemIndex>            index        = new List <ItemIndex>();
                    foreach (var element in ItemCatalog.allItems)
                    {
                        if (self.body.inventory.GetItemCount(element) > 0)
                        {
                            lstItemIndex.Add(element, self.body.inventory.GetItemCount(element));
                            index.Add(element);
                        }
                    }

                    double chanceToTrigger = 100.0;
                    if (totalItems <= (ArtifactOfDoomConfig.minItemsPerStage.Value * currentStage))
                    {
                        //chanceToTrigger = 1.0 - (double)(ArtifactOfDoomConfig.minItemsPerStage.Value * currentStage - totalItems) / ((double)ArtifactOfDoomConfig.minItemsPerStage.Value * currentStage);
                        chanceToTrigger  = (double)Math.Sqrt((double)totalItems / ((double)currentStage * (double)ArtifactOfDoomConfig.minItemsPerStage.Value));
                        chanceToTrigger *= 100;
                    }
                    //Debug.LogError("ChanceToTriggerLoose_Item"+ chanceToTrigger);

                    var rand = new System.Random();

                    for (int i = 0; i < self.body.inventory.GetItemCount(RoR2.RoR2Content.Items.Clover) + 1; i++)
                    {
                        int randomValue = rand.Next(1, 100);

                        if (chanceToTrigger < randomValue)
                        {
                            return;
                        }
                    }

                    chanceToTrigger = 100.0;

                    if (totalItems > (ArtifactOfDoomConfig.maxItemsPerStage.Value * currentStage))
                    {
                        chanceToTrigger  = Math.Pow((double)(totalItems) / ((double)ArtifactOfDoomConfig.maxItemsPerStage.Value * currentStage), ArtifactOfDoomConfig.exponentailFactorToCalculateSumOfLostItems.Value);
                        chanceToTrigger *= 100;
                    }

                    int lostItems = 0;

                    uint pos = 50000;

                    while (chanceToTrigger > 0)
                    {
                        if (QueueLostItemSprite.ContainsKey(self.body.netId.Value))
                        {
                            pos = self.body.netId.Value;
                        }
                        else
                        {
                            try
                            {
                                QueueLostItemSprite.Add(self.body.netId.Value, new Queue <ItemDef>());
                                pos = self.body.netId.Value;
                            }
                            catch (Exception)
                            {
                                Debug.Log($"[SirHamburger ArtifactOfDoom] Error in Line 311");
                            }
                        }
                        if (chanceToTrigger < rand.Next(0, 99))
                        {
                            break;
                        }
                        lostItems++;
                        int       randomPosition = rand.Next(0, lstItemIndex.Count - 1);
                        ItemIndex itemToRemove   = index[randomPosition];
                        while ((lstItemIndex[itemToRemove] == 0))
                        {
                            randomPosition = rand.Next(0, lstItemIndex.Count - 1);
                            itemToRemove   = index[randomPosition];
                        }
                        lstItemIndex[itemToRemove]--;

                        if (!ItemCatalog.lunarItemList.Contains(itemToRemove) && (ItemCatalog.GetItemDef(itemToRemove).tier != ItemTier.NoTier && itemToRemove != RoR2.RoR2Content.Items.CaptainDefenseMatrix.itemIndex))
                        {
                            self.body.inventory.RemoveItem(itemToRemove, 1);

                            //Chat.AddPickupMessage(self.body,itemToRemove,self.body.GetColoredUserName,PickupCatalog.GetPickupDef(itemToRemove).)

                            if (ArtifactOfDoomConfig.enableChatItemOutput.Value)
                            {
                                var pickupDef   = ItemCatalog.GetItemDef(itemToRemove);
                                var pickupName  = Language.GetString(pickupDef.nameToken);
                                var playerColor = self.body.GetColoredUserName();
                                var itemCount   = self.body.inventory.GetItemCount(pickupDef.itemIndex);
                                Chat.SendBroadcastChat(new Chat.SimpleChatMessage
                                {
                                    baseToken =
                                        self.body.GetColoredUserName() + $"<color=#{GrayColor}> lost</color> " +
                                        $"{pickupName ?? "???"} ({itemCount})</color> <color=#{GrayColor}></color>"

                                        //baseToken = self.body.GetColoredUserName() + " lost " + Language.GetString(ItemCatalog.GetItemDef(itemToRemove).pickupToken)
                                });
                            }
                            PlayerStatsComponent.FindBodyStatSheet(self.body).PushStatValue(statsLostItems, 1UL);


                            QueueLostItemSprite[pos].Enqueue(ItemCatalog.GetItemDef(itemToRemove));
                            if (QueueLostItemSprite[pos].Count > 10)
                            {
                                QueueLostItemSprite[pos].Dequeue();
                            }

                            double buffLengthMultiplier = getCharacterSpezificBuffLengthMultiplier(self.body.baseNameToken);
                            self.body.AddTimedBuff(ArtifactOfDoomConfig.ArtifactOfDoomBuff, (float)(timeForBuff * (float)buffLengthMultiplier));
                        }

                        chanceToTrigger -= 100;
                    }

                    string temp = "";
                    foreach (var element in ArtifactOfDoom.QueueLostItemSprite[pos])
                    {
                        temp += element.name + " ";
                    }
                    NetworkUser tempNetworkUser = getNetworkUserOfCharacterBody(self.body);

                    if (tempNetworkUser == null)
                    {
                        Debug.LogError("--------------------------------tempNetworkUser(lostitems)==null---------------------------");
                    }
                    if (!LockNetworkUser.ContainsKey(tempNetworkUser))
                    {
                        LockNetworkUser.Add(tempNetworkUser, false);
                    }
                    if (LockNetworkUser[tempNetworkUser] == false)
                    {
                        LockNetworkUser[tempNetworkUser] = false;
                        int    calculatesEnemyCountToTrigger = calculateEnemyCountToTrigger(self.body.inventory);
                        string tempString = counter[Playername.IndexOf(self.body)] + "," + calculatesEnemyCountToTrigger;
                        if (NetworkServer.active)
                        {
                            Networking._instance.TargetAddLostItemsOfPlayers(tempNetworkUser.connectionToClient, temp);
                            Networking.ServerEnsureNetworking();
                            Networking._instance.TargetUpdateProgressBar(tempNetworkUser.connectionToClient, tempString);
                        }
                    }
                }
            };
        }