Example #1
0
        /// <summary>
        ///Deals damage to nearby players
        /// </summary>
        //private IEnumerator FireAuraLoop()
        //{

        //    float dmg = (3 * Level + 40f) * DamageAmp;
        //    if (BoltNetwork.isRunning)
        //    {
        //        while (true)
        //        {
        //            yield return new WaitForSeconds(0.5f);
        //            foreach (BoltEntity item in ModReferences.AllPlayerEntities)
        //            {
        //                if ((item.transform.position - transform.position).sqrMagnitude < 80)
        //                {
        //                    PlayerHitByEnemey playerHitByEnemey = PlayerHitByEnemey.Create(item);
        //                    playerHitByEnemey.Damage = (int)dmg;
        //                    playerHitByEnemey.Send();
        //                }
        //            }
        //            if ((LocalPlayer.Transform.position - transform.position).sqrMagnitude < 80)
        //            {
        //                LocalPlayer.Stats.HealthChange(-1 * dmg * ModdedPlayer.instance.DamageReductionTotal * (1 - ModdedPlayer.instance.ArmorDmgRed));
        //            }
        //        }
        //    }
        //    else
        //    {
        //        while (true)
        //        {
        //            if ((LocalPlayer.Transform.position - transform.position).sqrMagnitude < 80)
        //            {
        //                LocalPlayer.Stats.Health -= Time.deltaTime * 2 * dmg * ModdedPlayer.instance.DamageReductionTotal * (1 - ModdedPlayer.instance.ArmorDmgRed);
        //            }
        //            yield return null;
        //        }
        //    }
        //}
        void SendFireAura()
        {
            if (abilities.Contains(Abilities.FireAura))
            {
                float aurDmg = (3 * Level + 20f) * DamageAmp / 2;
                FireAura.Cast(gameObject, aurDmg);
                if (BoltNetwork.isRunning)
                {
                    Network.NetworkManager.SendLine("ES2" + entity.networkId.PackedValue + ";" + aurDmg, NetworkManager.Target.Clinets);
                }
            }
        }
Example #2
0
            public void SetQuality(RuneQuality quality)
            {
                var lightEffect = ConstructGameObject(quality);

                m_startEffects.m_effectPrefabs = new EffectList.EffectData[] { new EffectList.EffectData {
                                                                                   m_prefab = lightEffect, m_enabled = true, m_attach = true
                                                                               } };
                TriggerStartEffects();
                if (quality == RuneQuality.Dark)
                {
                    var startInstance = m_startEffectInstances[0];
                    fireAura            = startInstance.AddComponent <FireAura>();
                    fireAura.m_ttl      = m_ttl - m_time;
                    fireAura.m_hitOwner = false;
                    fireAura.Setup(m_character, Vector3.zero, 0, null, null);
                }
            }
        public static void OnCommand(byte[] bytes)
        {
            using (MemoryStream stream = new MemoryStream(bytes))
            {
                using (BinaryReader r = new BinaryReader(stream))
                {
                    int cmdIndex = r.ReadInt32();

                    if (cmdIndex == 1)  //previousely AB
                    {
                        if (GameSetup.IsMpServer && ModSettings.DifficultyChoosen)
                        {
                            using (MemoryStream answerStream = new MemoryStream())
                            {
                                using (BinaryWriter w = new BinaryWriter(answerStream))
                                {
                                    w.Write(2);
                                    w.Write((int)ModSettings.difficulty);
                                    w.Write(ModSettings.FriendlyFire);
                                    w.Write((int)ModSettings.dropsOnDeath);
                                    w.Write(ModSettings.killOnDowned);
                                    w.Close();
                                }
                                Network.NetworkManager.SendLine(answerStream.ToArray(), Network.NetworkManager.Target.Clients);
                                answerStream.Close();
                            }
                        }
                    }
                    else if (cmdIndex == 2) //request for the what is the difficulty
                    {
                        if (!GameSetup.IsMpClient || ModSettings.IsDedicated)
                        {
                            return;
                        }

                        int index = r.ReadInt32();
                        ModSettings.FriendlyFire = r.ReadBoolean();
                        ModSettings.dropsOnDeath = (ModSettings.DropsOnDeathMode)r.ReadInt32();
                        ModSettings.killOnDowned = r.ReadBoolean();
                        Array values = Enum.GetValues(typeof(ModSettings.Difficulty));
                        ModSettings.difficulty = (ModSettings.Difficulty)values.GetValue(index);
                        if (!ModSettings.DifficultyChoosen)
                        {
                            LocalPlayer.FpCharacter.UnLockView();
                            LocalPlayer.FpCharacter.MovementLocked = false;
                        }
                        ModSettings.DifficultyChoosen = true;
                    }
                    else if (cmdIndex == 3) //spell casted
                    {
                        int spellid = r.ReadInt32();
                        if (spellid == 1)
                        {
                            Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            BlackHole.CreateBlackHole(pos, r.ReadBoolean(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle(), r.ReadString());
                        }
                        else if (spellid == 2)
                        {
                            Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            HealingDome.CreateHealingDome(pos, r.ReadSingle(), r.ReadSingle(), r.ReadBoolean(), r.ReadBoolean(), r.ReadSingle());
                        }
                        else if (spellid == 3)
                        {
                            Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            DarkBeam.Create(pos, r.ReadBoolean(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        }
                        else if (spellid == 4)
                        {
                            bool   isOn   = r.ReadBoolean();
                            string packed = r.ReadString();
                            BlackFlame.ToggleOtherPlayer(packed, isOn);
                        }
                        else if (spellid == 5)
                        {
                            Vector3 pos     = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            float   radius  = r.ReadSingle();
                            float   speed   = r.ReadSingle();
                            float   dmg     = r.ReadSingle();
                            bool    GiveDmg = r.ReadBoolean();
                            bool    GiveAr  = r.ReadBoolean();
                            int     ar      = 0;
                            if (GiveAr)
                            {
                                ar = r.ReadInt32();
                            }

                            WarCry.Cast(pos, radius, speed, dmg, GiveDmg, GiveAr, ar);
                        }
                        else if (spellid == 6)
                        {
                            Vector3 pos      = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            float   duration = r.ReadSingle();
                            int     id       = r.ReadInt32();

                            Portal.CreatePortal(pos, duration, id, r.ReadBoolean(), r.ReadBoolean());
                        }
                        else if (spellid == 7)
                        {
                            Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            Vector3 dir = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());

                            float  dmg       = r.ReadSingle();
                            string caster    = r.ReadString();
                            float  duration  = r.ReadSingle();
                            bool   slow      = r.ReadBoolean();
                            bool   dmgdebuff = r.ReadBoolean();
                            if (GameSetup.IsMpServer)
                            {
                                MagicArrow.Create(pos, dir, dmg, caster, duration, slow, dmgdebuff);
                            }
                            else
                            {
                                MagicArrow.CreateEffect(pos, dir, dmgdebuff, duration);
                            }
                        }
                        else if (spellid == 8)
                        {
                            Purge.Cast(new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()), r.ReadSingle(), r.ReadBoolean(), r.ReadBoolean());
                        }
                        else if (spellid == 9)
                        {
                            Vector3 pos  = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            float   dist = r.ReadSingle();

                            SnapFreeze.CreateEffect(pos, dist);
                            if (!GameSetup.IsMpClient)
                            {
                                SnapFreeze.HostAction(pos, dist, r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            }
                        }
                        else if (spellid == 10)
                        {
                            Vector3 pos   = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            Vector3 speed = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            float   dmg   = r.ReadSingle();
                            uint    id    = r.ReadUInt32();

                            if (BallLightning.lastID < id)
                            {
                                BallLightning.lastID = id;
                            }

                            BallLightning.Create(pos, speed, dmg, id);
                        }
                        else if (spellid == 11)
                        {
                            Vector3 pos       = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            float   radius    = r.ReadSingle();
                            float   dmg       = r.ReadSingle();
                            float   duration  = r.ReadSingle();
                            bool    isArcane  = r.ReadBoolean();
                            bool    fromEnemy = r.ReadBoolean();
                            Cataclysm.Create(pos, radius, dmg, duration, isArcane ? Cataclysm.TornadoType.Arcane : Cataclysm.TornadoType.Fire, fromEnemy);
                        }
                        else if (spellid == 12)
                        {
                            //a request from a client to a host to spawn a ball lightning. The host assigns the id of
                            //a ball lightning to not create overlapping ids
                            using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                            {
                                using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                {
                                    w.Write(3);
                                    w.Write(10);
                                    w.Write(r.ReadSingle());
                                    w.Write(r.ReadSingle());
                                    w.Write(r.ReadSingle());
                                    w.Write(r.ReadSingle());
                                    w.Write(r.ReadSingle());
                                    w.Write(r.ReadSingle());
                                    w.Write(r.ReadSingle());
                                    w.Write((uint)(BallLightning.lastID + 1));
                                    w.Close();
                                    BallLightning.lastID++;
                                }
                                ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Everyone);
                                answerStream.Close();
                            }
                        }
                        else if (spellid == 13) //parry was casted by a client
                        {
                            Vector3 pos    = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            float   radius = r.ReadSingle();
                            bool    ignite = r.ReadBoolean();
                            float   dmg    = r.ReadSingle();

                            DamageMath.DamageClamp(dmg, out int d, out int rep);
                            var hits = Physics.SphereCastAll(pos, radius, Vector3.one);

                            for (int i = 0; i < hits.Length; i++)
                            {
                                if (hits[i].transform.CompareTag("enemyCollide"))
                                {
                                    for (int a = 0; a < rep; a++)
                                    {
                                        hits[i].transform.SendMessageUpwards("Hit", d, SendMessageOptions.DontRequireReceiver);
                                        if (ignite)
                                        {
                                            hits[i].transform.SendMessageUpwards("Burn", SendMessageOptions.DontRequireReceiver);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else if (cmdIndex == 4) //remove item
                    {
                        PickUpManager.RemovePickup(r.ReadUInt64());
                    }
                    else if (cmdIndex == 5)                                                        //create item
                    {
                        Item  item = new Item(ItemDataBase.ItemBases[r.ReadInt32()], 1, 0, false); //reading first value, id
                        ulong id   = r.ReadUInt64();
                        item.level = r.ReadInt32();
                        int     amount = r.ReadInt32();
                        Vector3 pos    = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        while (r.BaseStream.Position != r.BaseStream.Length)
                        {
                            ItemStat stat = new ItemStat(ItemDataBase.Stats[r.ReadInt32()])
                            {
                                Amount = r.ReadSingle()
                            };
                            item.Stats.Add(stat);
                        }
                        PickUpManager.SpawnPickUp(item, pos, amount, id);
                    }
                    else if (cmdIndex == 6) //host has been asked to share info on enemy
                    {
                        if (!GameSetup.IsMpClient)
                        {
                            ulong packed = r.ReadUInt64();
                            if (EnemyManager.hostDictionary.ContainsKey(packed))
                            {
                                EnemyProgression ep = EnemyManager.hostDictionary[packed];
                                using (MemoryStream answerStream = new MemoryStream())
                                {
                                    using (BinaryWriter w = new BinaryWriter(answerStream))
                                    {
                                        w.Write(7);
                                        w.Write(packed);
                                        w.Write(ep.EnemyName);
                                        w.Write(ep.Level);
                                        w.Write(ep._hp + ep._Health.Health);
                                        w.Write(ep.MaxHealth);
                                        w.Write(ep.bounty);
                                        w.Write(ep.Armor);
                                        w.Write(ep.ArmorReduction);
                                        w.Write(ep.Steadfast);
                                        w.Write(ep.abilities.Count);
                                        foreach (EnemyProgression.Abilities item in ep.abilities)
                                        {
                                            w.Write((int)item);
                                        }

                                        w.Close();
                                    }
                                    Network.NetworkManager.SendLine(answerStream.ToArray(), Network.NetworkManager.Target.Clients);
                                    answerStream.Close();
                                }
                            }
                            else
                            {
                                CotfUtils.Log("no enemy in host's dictionary");
                            }
                        }
                    }
                    else if (cmdIndex == 7) //host answered info about a enemy and the info is processed
                    {
                        if (ModSettings.IsDedicated)
                        {
                            return;
                        }

                        if (GameSetup.IsMpClient)
                        {
                            ulong packed = r.ReadUInt64();
                            if (!EnemyManager.allboltEntities.ContainsKey(packed))
                            {
                                EnemyManager.GetAllEntities();
                            }
                            if (EnemyManager.allboltEntities.ContainsKey(packed))
                            {
                                BoltEntity entity         = EnemyManager.allboltEntities[packed];
                                string     name           = r.ReadString();
                                int        level          = r.ReadInt32();
                                float      health         = r.ReadSingle();
                                float      maxhealth      = r.ReadSingle();
                                long       bounty         = r.ReadInt64();
                                int        armor          = r.ReadInt32();
                                int        armorReduction = r.ReadInt32();
                                float      steadfast      = r.ReadSingle();
                                int        length         = r.ReadInt32();
                                int[]      affixes        = new int[length];
                                for (int i = 0; i < length; i++)
                                {
                                    affixes[i] = r.ReadInt32();
                                }
                                if (EnemyManager.clinetProgressions.ContainsKey(entity))
                                {
                                    ClinetEnemyProgression cp = EnemyManager.clinetProgressions[entity];
                                    cp.creationTime   = Time.time;
                                    cp.Entity         = entity;
                                    cp.Level          = level;
                                    cp.Health         = health;
                                    cp.MaxHealth      = maxhealth;
                                    cp.Armor          = armor;
                                    cp.ArmorReduction = armorReduction;
                                    cp.EnemyName      = name;
                                    cp.ExpBounty      = bounty;
                                    cp.Steadfast      = steadfast;
                                    cp.Affixes        = affixes;
                                }
                                else
                                {
                                    new ClinetEnemyProgression(entity, name, level, health, maxhealth, bounty, armor, armorReduction, steadfast, affixes);
                                }
                            }
                        }
                    }
                    else if (cmdIndex == 8) //enemy spell casted
                    {
                        int id = r.ReadInt32();
                        if (id == 1) //snow aura
                        {
                            ulong    packed = r.ReadUInt64();
                            SnowAura sa     = new GameObject("Snow").AddComponent <SnowAura>();
                            if (!EnemyManager.allboltEntities.ContainsKey(packed))
                            {
                                EnemyManager.GetAllEntities();
                            }
                            sa.followTarget = EnemyManager.allboltEntities[packed].transform;
                        }
                        else if (id == 2) //fire aura
                        {
                            ulong      packed = r.ReadUInt64();
                            float      dmg    = r.ReadSingle();
                            GameObject go     = EnemyManager.allboltEntities[packed].gameObject;
                            FireAura.Cast(go, dmg);
                        }
                    }
                    else if (cmdIndex == 9)  //poison Player
                    {
                        string playerID = r.ReadString();
                        if (ModReferences.ThisPlayerID == playerID)
                        {
                            int   source   = r.ReadInt32();
                            float amount   = r.ReadSingle();
                            float duration = r.ReadSingle();

                            BuffDB.AddBuff(3, source, amount, duration);
                        }
                    }
                    else if (cmdIndex == 10) //kill experience
                    {
                        ModdedPlayer.instance.AddKillExperience(r.ReadInt64());
                    }
                    else if (cmdIndex == 11) //add experience without massacre
                    {
                        ModdedPlayer.instance.AddFinalExperience(r.ReadInt64());
                    }
                    else if (cmdIndex == 12)  //root the player
                    {
                        if (ModdedPlayer.instance.RootImmune == 0 && ModdedPlayer.instance.StunImmune == 0)
                        {
                            Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                            if ((LocalPlayer.Transform.position - pos).sqrMagnitude < 1250)
                            {
                                float duration = r.ReadSingle();
                                ModdedPlayer.instance.Root(duration);
                                using (MemoryStream answerStream = new MemoryStream())
                                {
                                    using (BinaryWriter w = new BinaryWriter(answerStream))
                                    {
                                        w.Write(14);
                                        w.Write(LocalPlayer.Transform.position.x);
                                        w.Write(LocalPlayer.Transform.position.y);
                                        w.Write(LocalPlayer.Transform.position.z);
                                        w.Write(duration);
                                        w.Close();
                                    }
                                    NetworkManager.SendLine(answerStream.ToArray(), NetworkManager.Target.Everyone);
                                    answerStream.Close();
                                }
                            }
                        }
                    }
                    else if (cmdIndex == 13)  //stun the player
                    {
                        if (ModSettings.IsDedicated)
                        {
                            return;
                        }
                        if (ModdedPlayer.instance.StunImmune == 0)
                        {
                            string playerID = r.ReadString();
                            if (ModReferences.ThisPlayerID == playerID)
                            {
                                float duration = r.ReadSingle();
                                ModdedPlayer.instance.Stun(duration);
                            }
                        }
                    }
                    else if (cmdIndex == 14) //player has been chained, now spawn effect
                    {
                        if (ModSettings.IsDedicated)
                        {
                            return;
                        }

                        Vector3 pos      = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        float   duration = r.ReadSingle();
                        RootSpell.Create(pos, duration);
                    }
                    else if (cmdIndex == 15)    //create trap sphere
                    {
                        Vector3 pos      = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        float   duration = r.ReadSingle();
                        float   radius   = r.ReadSingle();
                        TrapSphereSpell.Create(pos, radius, duration);
                    }
                    else if (cmdIndex == 16)    //create enemy laser, aka plasma cannon
                    {
                        Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        Vector3 dir = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());

                        EnemyLaser.CreateLaser(pos, dir);
                    }
                    else if (cmdIndex == 17) //create enemy meteor rain
                    {
                        Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        Meteor.CreateEnemy(pos, r.ReadInt32());
                    }
                    else if (cmdIndex == 18) //player's level info, or command to wipe level data
                    {
                        if (r.BaseStream.Position == r.BaseStream.Length)
                        {
                            ModReferences.PlayerLevels.Clear();
                        }
                        using (MemoryStream answerStream = new MemoryStream())
                        {
                            using (BinaryWriter w = new BinaryWriter(answerStream))
                            {
                                w.Write(19);
                                w.Write(ModReferences.ThisPlayerID);
                                w.Write(ModdedPlayer.instance.Level);
                                w.Close();
                            }
                            Network.NetworkManager.SendLine(answerStream.ToArray(), NetworkManager.Target.Others);
                            answerStream.Close();
                        }
                    }
                    else if (cmdIndex == 19)//add or update some players level to list
                    {
                        string packed = r.ReadString();
                        int    level  = r.ReadInt32();
                        if (ModReferences.PlayerLevels.ContainsKey(packed))
                        {
                            ModReferences.PlayerLevels[packed] = level;
                        }
                        else
                        {
                            ModReferences.PlayerLevels.Add(packed, level);
                        }
                    }
                    else if (cmdIndex == 20) //enemy hitmarker
                    {
                        if (ModSettings.IsDedicated)
                        {
                            return;
                        }

                        int     amount = r.ReadInt32();
                        Vector3 pos    = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        Color   c      = new Color(r.ReadSingle(), r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        MainMenu.CreateHitMarker(amount, pos, c);
                    }
                    else if (cmdIndex == 21)  //player hitmarker
                    {
                        if (ModSettings.IsDedicated)
                        {
                            return;
                        }

                        int     amount = r.ReadInt32();
                        Vector3 pos    = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        new MainMenu.HitMarker(amount, pos, true);
                    }
                    else if (cmdIndex == 22)   //slow Enemy
                    {
                        if (GameSetup.IsMpServer || GameSetup.IsSinglePlayer)
                        {
                            ulong id = r.ReadUInt64();
                            if (EnemyManager.hostDictionary.ContainsKey(id))
                            {
                                float amount = r.ReadSingle();
                                float time   = r.ReadSingle();
                                int   src    = r.ReadInt32();
                                EnemyManager.hostDictionary[id].Slow(src, amount, time);
                            }
                        }
                    }
                    else if (cmdIndex == 23)  //sync magic find
                    {
                        if (GameSetup.IsMpServer)
                        {
                            if (ModSettings.IsDedicated)
                            {
                                ItemDataBase.MagicFind = 1;
                            }
                            else
                            {
                                ItemDataBase.MagicFind = ModdedPlayer.instance.MagicFindMultipier;
                            }
                        }
                        else
                        {
                            using (MemoryStream answerStream = new MemoryStream())
                            {
                                using (BinaryWriter w = new BinaryWriter(answerStream))
                                {
                                    w.Write(24);
                                    w.Write(ModdedPlayer.instance.MagicFindMultipier);
                                    w.Close();
                                }
                                Network.NetworkManager.SendLine(answerStream.ToArray(), Network.NetworkManager.Target.OnlyServer);
                                answerStream.Close();
                            }
                        }
                    }
                    else if (cmdIndex == 24) //update magic find for host
                    {
                        if (GameSetup.IsMpServer)
                        {
                            ItemDataBase.MagicFind *= r.ReadSingle();
                        }
                    }
                    else if (cmdIndex == 25) //ask for item
                    {
                        if (GameSetup.IsMpServer)
                        {
                            ulong itemID = r.ReadUInt64();
                            if (PickUpManager.PickUps.ContainsKey(itemID))
                            {
                                int    itemAmount = r.ReadInt32();
                                string playerID   = r.ReadString();

                                if (PickUpManager.PickUps[itemID].amount > 0)
                                {
                                    int givenAmount = itemAmount;
                                    if (itemAmount > PickUpManager.PickUps[itemID].amount)
                                    {
                                        givenAmount = Mathf.Min(PickUpManager.PickUps[itemID].amount, itemAmount);
                                    }

                                    NetworkManager.SendItemToPlayer(PickUpManager.PickUps[itemID].item, playerID, givenAmount);

                                    PickUpManager.PickUps[itemID].amount -= givenAmount;

                                    if (PickUpManager.PickUps[itemID].amount > 0)
                                    {
                                        return;
                                    }
                                }
                            }
                            using (MemoryStream answerStream = new MemoryStream())
                            {
                                using (BinaryWriter w = new BinaryWriter(answerStream))
                                {
                                    w.Write(4);
                                    w.Write(itemID);
                                    w.Close();
                                }
                                Network.NetworkManager.SendLine(answerStream.ToArray(), Network.NetworkManager.Target.Clients);
                                answerStream.Close();
                            }
                        }
                    }
                    else if (cmdIndex == 26) //give item to player
                    {
                        string playerID = r.ReadString();
                        if (ModReferences.ThisPlayerID == playerID)
                        {
                            //creating the item.
                            Item item = new Item(ItemDataBase.ItemBases[r.ReadInt32()], r.ReadInt32(), 0, false)
                            {
                                level = r.ReadInt32()
                            };

                            //adding stats to the item
                            while (r.BaseStream.Position != r.BaseStream.Length)
                            {
                                ItemStat stat = new ItemStat(ItemDataBase.Stats[r.ReadInt32()])
                                {
                                    Amount = r.ReadSingle()
                                };
                                item.Stats.Add(stat);
                            }

                            Player.Inventory.Instance.AddItem(item, item.Amount);
                        }
                    }
                    else if (cmdIndex == 27) // bonus fire damage
                    {
                        if (GameSetup.IsMpServer || GameSetup.IsSinglePlayer)
                        {
                            ulong id = r.ReadUInt64();
                            if (EnemyManager.hostDictionary.ContainsKey(id))
                            {
                                float amount = r.ReadSingle();
                                float time   = r.ReadSingle();
                                int   src    = r.ReadInt32();
                                EnemyManager.hostDictionary[id].FireDebuff(src, amount, time);
                            }
                        }
                    }
                    else if (cmdIndex == 28) //custom weapon in mp
                    {
                        string id       = r.ReadString();
                        int    weaponID = r.ReadInt32();
                        if (!ModReferences.PlayerHands.ContainsKey(id))
                        {
                            ModReferences.FindHands();
                        }

                        if (ModReferences.PlayerHands.ContainsKey(id))
                        {
                            CoopCustomWeapons.SetWeaponOn(ModReferences.PlayerHands[id], weaponID);
                            Console.WriteLine(ModReferences.PlayerHands[id].name);
                        }
                        else
                        {
                            Debug.LogWarning("NO HAND IN COMMAND READER");
                        }
                    }
                    else if (cmdIndex == 29) //request for enemy damage information
                    {
                        if (GameSetup.IsMpServer)
                        {
                            ulong id = r.ReadUInt64();
                            if (EnemyManager.hostDictionary.ContainsKey(id))
                            {
                                EnemyProgression p = EnemyManager.hostDictionary[id];
                                using (MemoryStream answerStream = new MemoryStream())
                                {
                                    using (BinaryWriter w = new BinaryWriter(answerStream))
                                    {
                                        w.Write(30);
                                        w.Write(id);
                                        w.Write(p.BaseDamageMult);
                                        foreach (EnemyProgression.Abilities ability in p.abilities)
                                        {
                                            w.Write((int)ability);
                                        }
                                        w.Close();
                                    }
                                    NetworkManager.SendLine(answerStream.ToArray(), NetworkManager.Target.Clients);
                                    answerStream.Close();
                                }
                            }
                        }
                    }
                    else if (cmdIndex == 30) //answer to client damage
                    {
                        ulong id  = r.ReadUInt64();
                        float dmg = r.ReadSingle();
                        List <EnemyProgression.Abilities> abilities = new List <EnemyProgression.Abilities>();
                        while (r.BaseStream.Position != r.BaseStream.Length)
                        {
                            abilities.Add((EnemyProgression.Abilities)r.ReadInt32());
                        }
                        new ClientEnemy(id, dmg, abilities);
                    }
                    else if (cmdIndex == 31) //detonate ball lightning
                    {
                        uint    id  = r.ReadUInt32();
                        Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        if (BallLightning.list.ContainsKey(id))
                        {
                            BallLightning.list[id].CoopTrigger(pos);
                        }
                    }
                    else if (cmdIndex == 32) //apply DoT to an enemy
                    {
                        ulong id = r.ReadUInt64();
                        if (EnemyManager.hostDictionary.ContainsKey(id))
                        {
                            EnemyProgression p = EnemyManager.hostDictionary[id];
                            p.DoDoT(r.ReadInt32(), r.ReadSingle());
                        }
                    }
                    else if (cmdIndex == 33) //enemy got bashed
                    {
                        ulong enemy = r.ReadUInt64();
                        if (EnemyManager.hostDictionary.ContainsKey(enemy))
                        {
                            EnemyProgression p        = EnemyManager.hostDictionary[enemy];
                            float            duration = r.ReadSingle();
                            var   source      = r.ReadInt32();
                            float slowAmount  = r.ReadSingle();
                            float dmgDebuff   = r.ReadSingle();
                            var   bleedDmg    = r.ReadInt32();
                            float bleedChance = r.ReadSingle();
                            p.Slow(source, slowAmount, duration);
                            p.DmgTakenDebuff(source, dmgDebuff, duration);
                            if (UnityEngine.Random.value < bleedChance)
                            {
                                p.DoDoT(bleedDmg, duration);
                            }
                        }
                    }
                    else if (cmdIndex == 34)
                    {
                        if (GameSetup.IsMpServer)
                        {
                            ulong enemy = r.ReadUInt64();
                            if (EnemyManager.hostDictionary.ContainsKey(enemy))
                            {
                                EnemyProgression p = EnemyManager.hostDictionary[enemy];
                                var   source       = r.ReadInt32();
                                float amount       = r.ReadSingle();
                                float duration     = r.ReadSingle();
                                p.DmgTakenDebuff(source, amount, duration);
                            }
                        }
                    }
                    else if (cmdIndex == 35)    //clear ping command
                    {
                        string player = r.ReadString();
                        if (MainMenu.Instance.otherPlayerPings.ContainsKey(player))
                        {
                            MainMenu.Instance.otherPlayerPings.Remove(player);
                        }
                    }
                    else if (cmdIndex == 36)    //create ping command
                    {
                        string PlayerID           = r.ReadString();
                        MarkObject.PingType ptype = (MarkObject.PingType)r.ReadInt32();
                        switch (ptype)
                        {
                        case MarkObject.PingType.Enemy:
                            ulong EnemyID = r.ReadUInt64();
                            if (!EnemyManager.allboltEntities.ContainsKey(EnemyID))
                            {
                                EnemyManager.GetAllEntities();
                            }
                            if (EnemyManager.allboltEntities.ContainsKey(EnemyID))
                            {
                                bool      isElite = r.ReadBoolean();
                                string    name    = r.ReadString();
                                Transform tr      = EnemyManager.allboltEntities[EnemyID].transform;
                                if (PlayerID == ModReferences.ThisPlayerID)
                                {
                                    MainMenu.Instance.localPlayerPing = new MarkEnemy(tr, name, isElite);
                                }
                                else
                                {
                                    if (MainMenu.Instance.otherPlayerPings.ContainsKey(PlayerID))
                                    {
                                        MainMenu.Instance.otherPlayerPings[PlayerID] = new MarkEnemy(tr, name, isElite);
                                    }
                                    else
                                    {
                                        MainMenu.Instance.otherPlayerPings.Add(PlayerID, new MarkEnemy(tr, name, isElite));
                                    }
                                }
                            }
                            break;

                        case MarkObject.PingType.Location:
                            float x = r.ReadSingle(), y = r.ReadSingle(), z = r.ReadSingle();
                            if (PlayerID == ModReferences.ThisPlayerID)
                            {
                                MainMenu.Instance.localPlayerPing = new MarkPostion(new Vector3(x, y, z));
                            }
                            else
                            {
                                if (MainMenu.Instance.otherPlayerPings.ContainsKey(PlayerID))
                                {
                                    MainMenu.Instance.otherPlayerPings[PlayerID] = new MarkPostion(new Vector3(x, y, z));
                                }
                                else
                                {
                                    MainMenu.Instance.otherPlayerPings.Add(PlayerID, new MarkPostion(new Vector3(x, y, z)));
                                }
                            }

                            break;

                        case MarkObject.PingType.Item:
                            ulong PickupID = r.ReadUInt64();
                            if (PickUpManager.PickUps.ContainsKey(PickupID))
                            {
                                var pu = PickUpManager.PickUps[PickupID];
                                if (PlayerID == ModReferences.ThisPlayerID)
                                {
                                    MainMenu.Instance.localPlayerPing = new MarkPickup(pu.transform, pu.item.name, pu.item.Rarity);
                                }
                                else
                                {
                                    if (MainMenu.Instance.otherPlayerPings.ContainsKey(PlayerID))
                                    {
                                        MainMenu.Instance.otherPlayerPings[PlayerID] = new MarkPickup(pu.transform, pu.item.name, pu.item.Rarity);
                                    }
                                    else
                                    {
                                        MainMenu.Instance.otherPlayerPings.Add(PlayerID, new MarkPickup(pu.transform, pu.item.name, pu.item.Rarity));
                                    }
                                }
                            }
                            break;
                        }
                    }
                    else if (cmdIndex == 37)    //create ping for enemy
                    {
                        if (GameSetup.IsMpServer)
                        {
                            string PlayerID = r.ReadString();
                            ulong  EnemyID  = r.ReadUInt64();
                            if (EnemyManager.hostDictionary.ContainsKey(EnemyID))
                            {
                                var enemy = EnemyManager.hostDictionary[EnemyID];
                                using (MemoryStream answerStream = new MemoryStream())
                                {
                                    using (BinaryWriter w = new BinaryWriter(answerStream))
                                    {
                                        w.Write(36);
                                        w.Write(PlayerID);
                                        w.Write(0);
                                        w.Write(EnemyID);
                                        w.Write(enemy._rarity != EnemyProgression.EnemyRarity.Normal);
                                        w.Write(enemy.EnemyName);
                                        w.Close();
                                    }
                                    NetworkManager.SendLine(answerStream.ToArray(), NetworkManager.Target.Everyone);
                                    answerStream.Close();
                                }
                            }
                        }
                    }
                    else if (cmdIndex == 38)    //spark of light after darkness callback to clients
                    {
                        if (GameSetup.IsMpClient)
                        {
                            string PlayerID = r.ReadString();
                            if (ModReferences.ThisPlayerID == PlayerID)
                            {
                                Vector3 pos = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                                SpellActions.CastBallLightning(pos, Vector3.down);
                            }
                        }
                    }
                    else if (cmdIndex == 39)    //archangel bow hit a player
                    {
                        var s = r.ReadString();
                        if (ModReferences.ThisPlayerID == s)
                        {
                            BuffDB.AddBuff(25, 91, r.ReadSingle(), 30);
                            BuffDB.AddBuff(9, 92, 1.35f, 30);
                            ModdedPlayer.instance.damageAbsorbAmounts[2] = r.ReadSingle();
                        }
                    }
                    else if (cmdIndex == 40)    //buff a player by ID
                    {
                        var s = r.ReadString();
                        if (ModReferences.ThisPlayerID == s)
                        {
                            BuffDB.AddBuff(r.ReadInt32(), r.ReadInt32(), r.ReadSingle(), r.ReadSingle());
                        }
                    }
                    else if (cmdIndex == 41)    //buff a player by distance
                    {
                        var vector = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle());
                        var dist   = r.ReadSingle();
                        if ((vector - LocalPlayer.Transform.position).sqrMagnitude <= dist * dist)
                        {
                            BuffDB.AddBuff(r.ReadInt32(), r.ReadInt32(), r.ReadSingle(), r.ReadSingle());
                        }
                    }
                    else if (cmdIndex == 42)    //buff all players globally
                    {
                        BuffDB.AddBuff(r.ReadInt32(), r.ReadInt32(), r.ReadSingle(), r.ReadSingle());
                    }
                    r.Close();
                }
                stream.Close();
            }
        }
Example #4
0
        private void Setup()
        {
            try
            {
                if (BoltNetwork.isRunning)
                {
                    if (entity == null)
                    {
                        entity = transform.root.GetComponentInChildren <BoltEntity>();
                    }
                    if (entity == null)
                    {
                        entity = _Health.entity;
                    }
                    if (entity == null)
                    {
                        entity = transform.root.GetComponent <BoltEntity>();
                    }
                    EnemyManager.AddHostEnemy(this);
                }
            }
            catch (Exception ex)
            {
                ModAPI.Log.Write(ex.ToString());
            }

            //Assiging base health, if new enemy
            if (BaseHealth == 0)
            {
                BaseHealth = _Health.Health;
            }
            else    //reverting health to base health if reused enemy (in case enemies are pooled)
            {
                _Health.Health = BaseHealth;
            }


            RollName();

            Steadfast         = 1000;
            slows             = new Dictionary <int, EnemyDebuff>();
            dmgTakenDebuffs   = new Dictionary <int, EnemyDebuff>();
            dmgDealtDebuffs   = new Dictionary <int, EnemyDebuff>();
            FireDamageDebuffs = new Dictionary <int, EnemyDebuff>();
            abilities         = new List <Abilities>();

            //picking abilities
            if (UnityEngine.Random.value < 0.1 || (_AI.creepy_boss && !_AI.girlFullyTransformed))
            {
                int count = UnityEngine.Random.Range(2, 7);
                if (_AI.creepy_boss)
                {
                    count = 10;
                }                                      //Megan boss always has abilities, a lot of them.
                else if (EnemyName == "Farket")
                {
                    count = 11;
                }

                int   i   = 0;
                Array arr = Enum.GetValues(typeof(Abilities));

                //Determining if enemy is Elite, Miniboss or Boss type of enemy
                if (count > 6 && Random.value < 0.3f)
                {
                    type = EnemyType.Boss; abilities.Add(Abilities.BossSteadfast);
                }
                else if (count > 4 && Random.value < 0.3f)
                {
                    abilities.Add(Abilities.EliteSteadfast); type = EnemyType.Miniboss;
                }
                else
                {
                    type = EnemyType.Elite;
                }

                if (_AI.creepy_boss)    //Force adding BossSteadfast to Megan
                {
                    abilities.Clear();
                    type = EnemyType.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }

                //Trial and error method of picking abilities
                while (i < count)
                {
                    bool      success = true;
                    Abilities ab      = (Abilities)arr.GetValue(UnityEngine.Random.Range(0, arr.Length));
                    if (ab == Abilities.Steadfast || ab == Abilities.EliteSteadfast || ab == Abilities.BossSteadfast)
                    {
                        if (abilities.Contains(Abilities.Steadfast) || abilities.Contains(Abilities.EliteSteadfast) || abilities.Contains(Abilities.BossSteadfast))
                        {
                            success = false;
                        }
                    }
                    else if (ab == Abilities.Tiny || ab == Abilities.Huge)
                    {
                        if (_AI.creepy_boss && ab == Abilities.Tiny)
                        {
                            success = false;
                        }
                        else if (abilities.Contains(Abilities.Huge) || abilities.Contains(Abilities.Tiny))
                        {
                            success = false;
                        }
                    }
                    else if (ab == Abilities.DoubleLife && !(_AI.creepy || _AI.creepy_fat))
                    {
                        success = false;
                    }
                    if (abilities.Contains(ab))
                    {
                        success = false;
                    }
                    if (success)
                    {
                        i++; abilities.Add(ab);
                    }
                }
            }
            else
            {
                type = EnemyType.Normal;
            }


            AssignEnemyType();

            //Assigning level
            AssignLevel();

            //Assigning rest of stats
            DamageMult     = Level / 4.5f + 0.55f;
            Armor          = Mathf.FloorToInt(Random.Range(Level * Level * 0.5f, Level * Level * 1.1f));
            ArmorReduction = 0;
            Health         = Mathf.RoundToInt((_Health.Health * Mathf.Pow(Level, 1.35f) / 2));
            AnimSpeed      = 1f + (float)Level / 125;


            if (EnemyName == "Farket")
            {
                AnimSpeed  *= 2;
                Armor      *= 2;
                Health     *= 2;
                DamageMult *= 2;
            }
            //Extra health for boss type enemies
            switch (type)
            {
            case EnemyType.Elite:
                Health *= 2;

                break;

            case EnemyType.Miniboss:
                Health *= 5;

                break;

            case EnemyType.Boss:
                Health *= 10;
                break;
            }

            //Applying some abilities
            if (abilities.Contains(Abilities.Huge))
            {
                Armor *= 2;
                gameObject.transform.localScale *= 2;
                Health     *= 2;
                DamageMult *= 2;
            }
            else if (abilities.Contains(Abilities.Tiny))
            {
                gameObject.transform.localScale *= 0.35f;
                Health     *= 2;
                DamageMult *= 1.5f;
                BroadcastMessage("SetTriggerScaleForTiny", SendMessageOptions.DontRequireReceiver);
            }
            if (abilities.Contains(Abilities.Steadfast))
            {
                Steadfast = 8;
            }
            if (abilities.Contains(Abilities.EliteSteadfast))
            {
                Steadfast = 2f;
            }
            if (abilities.Contains(Abilities.BossSteadfast))
            {
                Steadfast = 1;
            }
            if (abilities.Contains(Abilities.ExtraHealth))
            {
                Health *= 3;
            }
            if (abilities.Contains(Abilities.ExtraDamage))
            {
                DamageMult *= 2.5f;
            }
            if (abilities.Contains(Abilities.RainEmpowerement))
            {
                prerainDmg   = DamageMult;
                prerainArmor = Armor;
            }
            if (abilities.Contains(Abilities.Juggernaut))
            {
                CCimmune = true;
            }
            if (abilities.Contains(Abilities.FireAura))
            {
                float aurDmg = (3 * Level + 20f) * DamageAmp / 2;
                FireAura.Cast(gameObject, aurDmg);
                if (BoltNetwork.isRunning)
                {
                    Network.NetworkManager.SendLine("ES2" + entity.networkId.PackedValue + ";" + aurDmg, NetworkManager.Target.Clinets);
                }
                InvokeRepeating("SendFireAura", 20, 30);
            }
            //Clamping Health
            Health = Mathf.Min(Health, int.MaxValue - 5);


            //Setting other health variables
            _Health.maxHealthFloat = Health;
            MaxHealth         = Health;
            _Health.maxHealth = Mathf.RoundToInt(Health);
            _Health.Health    = Mathf.RoundToInt(Health);
            DebuffDmgMult     = DamageMult;
            DualLifeSpend     = false;
            setupComplete     = true;
            OnDieCalled       = false;
            BaseDamageMult    = DamageMult;
            BaseAnimSpeed     = AnimSpeed;

            AssignBounty();

            SteadfastCap = Mathf.RoundToInt(Steadfast * 0.01f * MaxHealth);
            if (SteadfastCap < 1) // Making sure the enemy can be killed
            {
                SteadfastCap = 1;
            }

            CreationTime = Time.time;

            if (BoltNetwork.isRunning)
            {
                ulong id = entity.networkId.PackedValue;

                string aa = "AI" + id + ";" + BaseDamageMult + ";";
                foreach (var ability in abilities)
                {
                    aa += (int)ability + ";";
                }
                NetworkManager.SendLine(aa, NetworkManager.Target.Clinets);
            }
        }
Example #5
0
        public static void OnCommand(string s)
        {
            Debug.Log("Recieved: " + s);

            try
            {
                if (s.StartsWith("AB"))     //ask the host to send the command to set the difficulty for clinet
                {
                    if (GameSetup.IsMpServer && ModSettings.DifficultyChoosen)
                    {
                        string answer = "AA" + (int)ModSettings.difficulty + ";";
                        if (ModSettings.FriendlyFire)
                        {
                            answer += "t;";
                        }
                        else
                        {
                            answer += "f;";
                        }

                        Network.NetworkManager.SendLine(answer, Network.NetworkManager.Target.Clinets);
                    }
                }
                else if (s.StartsWith("AA"))    //answer for the what is the difficulty query
                {
                    if (ModSettings.DifficultyChoosen || !GameSetup.IsMpClient || ModSettings.IsDedicated)
                    {
                        return;
                    }
                    i  = 2;
                    ch = s.ToCharArray();
                    int index = int.Parse(Read());
                    ModSettings.FriendlyFire = ReadBool();
                    Array values = Enum.GetValues(typeof(ModSettings.Difficulty));
                    ModSettings.difficulty        = (ModSettings.Difficulty)values.GetValue(index);
                    ModSettings.DifficultyChoosen = true;
                    LocalPlayer.FpCharacter.UnLockView();
                    LocalPlayer.FpCharacter.MovementLocked = false;
                }
                else if (s.StartsWith("SC"))    //spell cast
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    int spellid = int.Parse(Read());
                    if (spellid == 1)
                    {
                        Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        BlackHole.CreateBlackHole(pos, ReadBool(), float.Parse(Read()), float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    }
                    else if (spellid == 2)
                    {
                        Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        HealingDome.CreateHealingDome(pos, float.Parse(Read()), float.Parse(Read()), ReadBool(), float.Parse(Read()));
                    }
                    else if (spellid == 3)
                    {
                        Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        DarkBeam.Create(pos, ReadBool(), float.Parse(Read()), float.Parse(Read()), float.Parse(Read()), float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    }
                    else if (spellid == 4)
                    {
                        bool  isOn   = ReadBool();
                        ulong packed = ulong.Parse(Read());
                        BlackFlame.ToggleOtherPlayer(packed, isOn);
                    }
                    else if (spellid == 5)
                    {
                        Vector3 pos     = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        float   radius  = float.Parse(Read());
                        bool    GiveDmg = ReadBool();
                        bool    GiveAr  = ReadBool();
                        int     ar      = 0;
                        if (GiveAr)
                        {
                            ar = int.Parse(Read());
                        }
                        WarCry.Cast(pos, radius, GiveDmg, GiveAr, ar);
                    }
                    else if (spellid == 6)
                    {
                        Vector3 pos      = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        float   duration = float.Parse(Read());
                        int     id       = int.Parse(Read());

                        Portal.CreatePortal(pos, duration, id, ReadBool(), ReadBool());
                    }
                    else if (spellid == 7)
                    {
                        Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        Vector3 dir = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));

                        float dmg       = float.Parse(Read());
                        ulong caster    = ulong.Parse(Read());
                        float duration  = float.Parse(Read());
                        bool  slow      = ReadBool();
                        bool  dmgdebuff = ReadBool();
                        if (GameSetup.IsMpServer)
                        {
                            MagicArrow.Create(pos, dir, dmg, caster, duration, slow, dmgdebuff);
                        }
                        else
                        {
                            MagicArrow.CreateEffect(pos, dir, dmgdebuff, duration);
                        }
                    }
                    else if (spellid == 8)
                    {
                        Purge.Cast(new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read())), float.Parse(Read()));
                    }
                    else if (spellid == 9)
                    {
                        Vector3 pos  = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        float   dist = float.Parse(Read());

                        SnapFreeze.CreateEffect(pos, dist);
                        if (!GameSetup.IsMpClient)
                        {
                            SnapFreeze.HostAction(pos, dist, float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        }
                    }
                }
                else if (s.StartsWith("RI"))    //remove item
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    ulong id = ulong.Parse(Read());
                    PickUpManager.RemovePickup(id);
                }
                else if (s.StartsWith("CI"))    //create item
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    Item  item = new Item(ItemDataBase.ItemBases[int.Parse(Read())], 1, 0, false);  //reading first value, id
                    ulong id   = ulong.Parse(Read());
                    item.level = int.Parse(Read());
                    int     amount = int.Parse(Read());
                    Vector3 pos    = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    while (i < ch.Length)
                    {
                        ItemStat stat = new ItemStat(ItemDataBase.Stats[int.Parse(Read())])
                        {
                            Amount = float.Parse(Read())
                        };
                        item.Stats.Add(stat);
                    }
                    PickUpManager.SpawnPickUp(item, pos, amount, id);
                }
                else if (s.StartsWith("EE"))       //host has been asked to share info on enemy
                {
                    if (!GameSetup.IsMpClient)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong packed = ulong.Parse(Read());
                        if (EnemyManager.hostDictionary.ContainsKey(packed))
                        {
                            EnemyProgression ep = EnemyManager.hostDictionary[packed];
                            parseval = "EA" + packed + ";" + ep.EnemyName + ";" + ep.Level + ";" + ep.Health + ";" + ep.MaxHealth + ";" + ep.Bounty + ";" + ep.Armor + ";" + ep.ArmorReduction + ";" + ep.Steadfast + ";" + ep.abilities.Count + ";";
                            foreach (EnemyProgression.Abilities item in ep.abilities)
                            {
                                parseval += (int)item + ";";
                            }
                            Network.NetworkManager.SendLine(parseval, Network.NetworkManager.Target.Everyone);
                        }
                    }
                }
                else if (s.StartsWith("ES"))       //enemy spell
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    int id = int.Parse(Read());
                    if (id == 1) //snow aura
                    {
                        ulong    packed = ulong.Parse(Read());
                        SnowAura sa     = new GameObject("Snow").AddComponent <SnowAura>();
                        if (!EnemyManager.allboltEntities.ContainsKey(packed))
                        {
                            EnemyManager.GetAllEntities();
                        }

                        sa.followTarget = EnemyManager.allboltEntities[packed].transform;
                    }
                    else if (id == 2) //fire aura
                    {
                        ulong      packed = ulong.Parse(Read());
                        float      dmg    = float.Parse(Read());
                        GameObject go     = EnemyManager.allboltEntities[packed].gameObject;
                        FireAura.Cast(go, dmg);
                    }
                }
                else if (s.StartsWith("PO"))    //poison Player
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    ulong playerPacked = ulong.Parse(Read());
                    if (ModReferences.ThisPlayerPacked == playerPacked)
                    {
                        int   source   = int.Parse(Read());
                        float amount   = float.Parse(Read());
                        float duration = float.Parse(Read());

                        BuffDB.AddBuff(3, source, amount, duration);
                    }
                }
                else if (s.StartsWith("KX"))    //kill experience
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    long exp = long.Parse(Read());
                    ModdedPlayer.instance.AddKillExperience(exp);
                }
                else if (s.StartsWith("KY"))    //kill experience
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    long exp = long.Parse(Read());
                    ModdedPlayer.instance.AddFinalExperience(exp);
                }
                else if (s.StartsWith("EA"))       //host answered info about a enemy and the info is processed
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    if (GameSetup.IsMpClient)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong packed = ulong.Parse(Read());
                        if (!EnemyManager.allboltEntities.ContainsKey(packed))
                        {
                            EnemyManager.GetAllEntities();
                        }
                        if (EnemyManager.allboltEntities.ContainsKey(packed))
                        {
                            BoltEntity entity  = EnemyManager.allboltEntities[packed];
                            string     name    = Read();
                            int        v1      = int.Parse(Read());
                            int        v2      = int.Parse(Read());
                            int        v3      = int.Parse(Read());
                            int        v4      = int.Parse(Read());
                            int        v5      = int.Parse(Read());
                            int        v6      = int.Parse(Read());
                            float      v7      = float.Parse(Read());
                            int        lenght  = int.Parse(Read());
                            int[]      affixes = new int[lenght];
                            int        id      = 0;
                            while (i < ch.Length)
                            {
                                affixes[id] = int.Parse(Read());
                                id++;
                            }
                            if (EnemyManager.clinetProgressions.ContainsKey(entity))
                            {
                                ClinetEnemyProgression cp = EnemyManager.clinetProgressions[entity];
                                cp.creationTime   = Time.time;
                                cp.Entity         = entity;
                                cp.Level          = v1;
                                cp.Health         = v2;
                                cp.MaxHealth      = v3;
                                cp.Armor          = v5;
                                cp.ArmorReduction = v6;
                                cp.EnemyName      = name;
                                cp.ExpBounty      = v4;
                                cp.Steadfast      = v7;
                                cp.Affixes        = affixes;
                            }
                            else
                            {
                                new ClinetEnemyProgression(entity, name, v1, v2, v3, v4, v5, v6, v7, affixes);
                            }
                        }
                    }
                }
                else if (s.StartsWith("RO"))    //root the player
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    if (ModdedPlayer.instance.RootImmune == 0 && ModdedPlayer.instance.StunImmune == 0)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                        if ((LocalPlayer.Transform.position - pos).sqrMagnitude < 1200)
                        {
                            float duration = float.Parse(Read());
                            NetworkManager.SendLine("RE" + LocalPlayer.Transform.position.x + ";" + LocalPlayer.Transform.position.y + ";" + LocalPlayer.Transform.position.z + ";" + duration + ";", NetworkManager.Target.Everyone);
                            ModdedPlayer.instance.Root(duration);
                        }
                    }
                }
                else if (s.StartsWith("ST"))    //stun the player
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    if (ModdedPlayer.instance.StunImmune == 0)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong packed = ulong.Parse(Read());
                        if (ModReferences.ThisPlayerPacked == packed)
                        {
                            float duration = float.Parse(Read());
                            ModdedPlayer.instance.Stun(duration);
                        }
                    }
                }
                else if (s.StartsWith("RE"))
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    Vector3 pos      = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    float   duration = float.Parse(Read());
                    RootSpell.Create(pos, duration);
                }
                else if (s.StartsWith("TR"))
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    Vector3 pos      = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    float   duration = float.Parse(Read());
                    float   radius   = float.Parse(Read());
                    TrapSphereSpell.Create(pos, radius, duration);
                }
                else if (s.StartsWith("LA"))
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    Vector3 dir = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));

                    EnemyLaser.CreateLaser(pos, dir);
                }
                else if (s.StartsWith("MT"))
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    Vector3 pos = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    Meteor.CreateEnemy(pos, int.Parse(Read()));
                }
                else if (s.StartsWith("RL"))
                {
                    if (s.Length > 2)
                    {
                        ModReferences.PlayerLevels.Clear();
                    }
                    NetworkManager.SendLine("AL" + ModReferences.ThisPlayerPacked + ";" + ModdedPlayer.instance.Level + ";", NetworkManager.Target.Everyone);
                }
                else if (s.StartsWith("AL"))
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    ulong packed = ulong.Parse(Read());
                    int   level  = int.Parse(Read());
                    if (ModReferences.PlayerLevels.ContainsKey(packed))
                    {
                        ModReferences.PlayerLevels[packed] = level;
                    }
                    else
                    {
                        ModReferences.PlayerLevels.Add(packed, level);
                    }
                }
                else if (s.StartsWith("EH"))    //enemy hitmarker
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    int     amount = int.Parse(Read());
                    Vector3 pos    = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    new MainMenu.HitMarker(amount, pos);
                }
                else if (s.StartsWith("PH"))    //enemy hitmarker
                {
                    if (ModSettings.IsDedicated)
                    {
                        return;
                    }

                    i  = 2;
                    ch = s.ToCharArray();
                    int     amount = int.Parse(Read());
                    Vector3 pos    = new Vector3(float.Parse(Read()), float.Parse(Read()), float.Parse(Read()));
                    new MainMenu.HitMarker(amount, pos, true);
                }
                else if (s.StartsWith("AC"))    //slow Enemy
                {
                    if (GameSetup.IsMpServer || GameSetup.IsSinglePlayer)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong id     = ulong.Parse(Read());
                        float amount = float.Parse(Read());
                        float time   = float.Parse(Read());
                        int   src    = int.Parse(Read());
                        EnemyManager.hostDictionary[id].Slow(src, amount, time);
                    }
                }
                else if (s.StartsWith("AD"))    //sync magic find
                {
                    if (GameSetup.IsMpServer)
                    {
                        if (ModSettings.IsDedicated)
                        {
                            ItemDataBase.MagicFind = 1;
                        }
                        else
                        {
                            ItemDataBase.MagicFind = ModdedPlayer.instance.MagicFindMultipier;
                        }
                    }
                    else
                    {
                        Network.NetworkManager.SendLine("AE" + ModdedPlayer.instance.MagicFindMultipier + ";", Network.NetworkManager.Target.OnlyServer);
                    }
                }
                else if (s.StartsWith("AE"))
                {
                    if (GameSetup.IsMpServer)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ItemDataBase.MagicFind *= float.Parse(Read());
                    }
                }
                else if (s.StartsWith("AF"))    //ask for item
                {
                    if (GameSetup.IsMpServer)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong itemID     = ulong.Parse(Read());
                        int   itemAmount = int.Parse(Read());
                        ulong playerID   = ulong.Parse(Read());

                        if (PickUpManager.PickUps.ContainsKey(itemID))
                        {
                            if (PickUpManager.PickUps[itemID].amount > 0)
                            {
                                int givenAmount = itemAmount;
                                if (itemAmount > PickUpManager.PickUps[itemID].amount)
                                {
                                    givenAmount = Mathf.Min(PickUpManager.PickUps[itemID].amount, itemAmount);
                                }

                                NetworkManager.SendItemToPlayer(PickUpManager.PickUps[itemID].item, playerID, givenAmount);

                                PickUpManager.PickUps[itemID].amount -= givenAmount;

                                if (PickUpManager.PickUps[itemID].amount > 0)
                                {
                                    return;
                                }
                            }
                        }
                        Network.NetworkManager.SendLine("RI" + itemID + ";", Network.NetworkManager.Target.Clinets);
                    }
                }
                else if (s.StartsWith("AG"))    //give item to player
                {
                    //if (!GameSetup.IsMpClient) return;
                    i  = 2;
                    ch = s.ToCharArray();
                    ulong playerID = ulong.Parse(Read());
                    ModAPI.Console.Write("This player packed: " + ModReferences.ThisPlayerPacked + "\nPlayer pickup packed: " + playerID);
                    if (ModReferences.ThisPlayerPacked == playerID)
                    {
                        Item item = new Item(ItemDataBase.ItemBases[int.Parse(Read())], int.Parse(Read()), 0, false);   //creating the item.
                        item.level = int.Parse(Read());

                        while (i < ch.Length)
                        {
                            ItemStat stat = new ItemStat(ItemDataBase.Stats[int.Parse(Read())])
                            {
                                Amount = float.Parse(Read())
                            };
                            item.Stats.Add(stat);
                        }
                        Player.Inventory.Instance.AddItem(item, item.Amount);
                    }
                }
                else if (s.StartsWith("AH"))     //bonus fire damage agnist enemy
                {
                    if (GameSetup.IsMpServer || GameSetup.IsSinglePlayer)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong id     = ulong.Parse(Read());
                        float amount = float.Parse(Read());
                        float time   = float.Parse(Read());
                        int   src    = int.Parse(Read());
                        EnemyManager.hostDictionary[id].FireDebuff(src, amount, time);
                    }
                }
                else if (s.StartsWith("CE"))     //custom weapon in mp
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    ulong id       = ulong.Parse(Read());
                    int   weaponID = int.Parse(Read());
                    if (ModReferences.PlayerHands.ContainsKey(id))
                    {
                        CoopCustomWeapons.SetWeaponOn(ModReferences.PlayerHands[id], weaponID);
                    }
                    else
                    {
                        Debug.LogWarning("NO HAND IN COMMAND READER");
                    }
                }
                else if (s.StartsWith("AJ"))    //
                {
                    if (GameSetup.IsMpServer)
                    {
                        i  = 2;
                        ch = s.ToCharArray();
                        ulong  id = ulong.Parse(Read());
                        var    p  = EnemyManager.hostDictionary[id];
                        string a  = "AI" + id + ";" + p.BaseDamageMult + ";";
                        foreach (var ability in p.abilities)
                        {
                            a += (int)ability + ";";
                        }
                        NetworkManager.SendLine(a, NetworkManager.Target.Clinets);
                    }
                }
                else if (s.StartsWith("AI"))    //
                {
                    i  = 2;
                    ch = s.ToCharArray();
                    ulong id  = ulong.Parse(Read());
                    float dmg = float.Parse(Read());
                    List <EnemyProgression.Abilities> abilities = new List <EnemyProgression.Abilities>();
                    while (i < s.Length)
                    {
                        abilities.Add((EnemyProgression.Abilities) int.Parse(Read()));
                    }
                    new ClientEnemy(id, dmg, abilities);
                }
            }
            catch (Exception e)
            {
                Debug.Log(e.ToString());
            }
        }
Example #6
0
        private void Setup()
        {
            try
            {
                if (BoltNetwork.isRunning)
                {
                    if (entity == null)
                    {
                        entity = transform.root.GetComponentInChildren <BoltEntity>();
                    }
                    if (entity == null)
                    {
                        entity = HealthScript.entity;
                    }
                    if (entity == null)
                    {
                        entity = transform.root.GetComponent <BoltEntity>();
                    }
                    EnemyManager.AddHostEnemy(this);
                }
                if (!EnemyManager.enemyByTransform.ContainsKey(transform))
                {
                    EnemyManager.enemyByTransform.Add(this.transform, this);
                }
            }
            catch (Exception ex)
            {
                ModAPI.Log.Write(ex.ToString());
            }

            //Assiging base health, if new enemy
            if (baseHealth == 0)
            {
                baseHealth = HealthScript.Health;
            }
            else                //reverting health to base health if reused enemy (in case enemies are pooled)
            {
                HealthScript.Health = baseHealth;
            }

            StopAllCoroutines();

            Steadfast          = 100;
            slows              = new Dictionary <int, EnemyDebuff>();
            dmgTakenDebuffs    = new Dictionary <int, EnemyDebuff>();
            dmgDealtDebuffs    = new Dictionary <int, EnemyDebuff>();
            FireDamageDebuffs  = new Dictionary <int, EnemyDebuff>();
            DamageOverTimeList = new List <DoT>();
            abilities          = new List <Abilities>();

            //picking abilities
            if ((UnityEngine.Random.value < 0.1 || (AIScript.creepy_boss && !AIScript.girlFullyTransformed) || ModSettings.difficulty == ModSettings.Difficulty.Hell) && enemyType != Enemy.Baby)
            {
                int abilityAmount = UnityEngine.Random.Range(3, 7);
                if (AIScript.creepy_boss)
                {
                    abilityAmount = 10;
                }                   //Megan boss always has abilities, a lot of them.

                int   i            = 0;
                Array abilityArray = Enum.GetValues(typeof(Abilities));

                //Determining if enemy is Elite, Miniboss or Boss type of enemy
                if (abilityAmount > 6 && Random.value < 0.3f)
                {
                    _rarity = EnemyRarity.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }
                else if (abilityAmount > 4 && Random.value < 0.3f)
                {
                    abilities.Add(Abilities.EliteSteadfast);
                    _rarity = EnemyRarity.Miniboss;
                }
                else
                {
                    _rarity = EnemyRarity.Elite;
                }

                if (AIScript.creepy_boss && !AIScript.girlFullyTransformed)                    //Force adding BossSteadfast to Megan
                {
                    abilities.Clear();
                    _rarity = EnemyRarity.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }

                //Trial and error method of picking abilities
                while (i < abilityAmount)
                {
                    bool      canAdd = true;
                    Abilities ab     = (Abilities)abilityArray.GetValue(UnityEngine.Random.Range(0, abilityArray.Length));
                    if (ab == Abilities.Steadfast || ab == Abilities.EliteSteadfast || ab == Abilities.BossSteadfast)
                    {
                        if (abilities.Contains(Abilities.Steadfast) || abilities.Contains(Abilities.EliteSteadfast) || abilities.Contains(Abilities.BossSteadfast))
                        {
                            canAdd = false;
                        }
                    }
                    else if (ab == Abilities.Tiny || ab == Abilities.Huge)
                    {
                        if (AIScript.creepy_boss && ab == Abilities.Tiny)
                        {
                            canAdd = false;
                        }
                        else if (abilities.Contains(Abilities.Huge) || abilities.Contains(Abilities.Tiny))
                        {
                            canAdd = false;
                        }
                    }
                    else if (ab == Abilities.Undead && !(AIScript.creepy || AIScript.creepy_fat))
                    {
                        canAdd = false;
                    }
                    if (abilities.Contains(ab))
                    {
                        canAdd = false;
                    }
                    if (canAdd)
                    {
                        i++;
                        abilities.Add(ab);
                    }
                }
            }
            else
            {
                _rarity = EnemyRarity.Normal;
            }

            SetType();
            SetLevel();
            RollName();
            //Assigning rest of stats
            int dif = (int)ModSettings.difficulty;

            DamageMult  = Mathf.Pow(Level, 3.5f) / 100f + 0.4f;
            DamageMult *= dif * 2f + 1;

            Armor          = Mathf.FloorToInt(Random.Range(Mathf.Pow(Level, 2.4f) * 0.36f + 1, Mathf.Pow(Level, 2.45f) + 20) * ModSettings.EnemyArmorMultiplier);
            Armor         *= dif / 2 + 1;
            ArmorReduction = 0;
            extraHealth    = (HealthScript.Health * Mathf.Pow((float)Level, 2.215f + (dif * 0.19f)) / 16);
            extraHealth   *= dif / 2 + 1;
            AnimSpeed      = 0.94f + (float)Level / 190;

            extraHealth *= ModSettings.EnemyHealthMultiplier;
            DamageMult  *= ModSettings.EnemyDamageMultiplier;
            AnimSpeed   *= ModSettings.EnemySpeedMultiplier;

            if (_rarity != EnemyRarity.Normal)
            {
                Armor *= 2;
            }
            //Extra health for boss type enemies
            switch (_rarity)
            {
            case EnemyRarity.Elite:
                extraHealth *= 2;

                break;

            case EnemyRarity.Miniboss:
                extraHealth *= 5;

                break;

            case EnemyRarity.Boss:
                extraHealth *= 10;
                if (!abilities.Contains(Abilities.Tiny))
                {
                    gameObject.transform.localScale *= 1.1f;
                }

                break;
            }
            extraHealth *= (float)(dif * 0.25f + 0.75f);
            if (dif > 3)
            {
                extraHealth *= 2.15f;
            }
            if (dif > 6)
            {
                extraHealth *= 3.4f;
            }
            //Applying some abilities
            if (abilities.Contains(Abilities.Huge))
            {
                Armor *= 2;
                gameObject.transform.localScale *= 2;
                extraHealth *= 2;
                DamageMult  *= 2;
                AnimSpeed   /= 1.6f;
            }
            else if (abilities.Contains(Abilities.Tiny))
            {
                gameObject.transform.localScale *= 0.35f;
                AnimSpeed  *= 1.1f;
                DamageMult *= 1.2f;
                BroadcastMessage("SetTriggerScaleForTiny", SendMessageOptions.DontRequireReceiver);
            }
            if (abilities.Contains(Abilities.Steadfast))
            {
                Steadfast = 5;
            }
            if (abilities.Contains(Abilities.EliteSteadfast))
            {
                Steadfast = 2f;
            }
            if (abilities.Contains(Abilities.BossSteadfast))
            {
                Steadfast = 0.25f;
            }
            if (abilities.Contains(Abilities.ExtraHealth))
            {
                extraHealth *= 3;
            }
            if (abilities.Contains(Abilities.ExtraDamage))
            {
                DamageMult *= 4f;
            }
            if (abilities.Contains(Abilities.RainEmpowerement))
            {
                prerainDmg   = DamageMult;
                prerainArmor = Armor;
            }
            if (abilities.Contains(Abilities.Juggernaut))
            {
                CCimmune   = true;
                AnimSpeed /= 1.15f;
            }
            if (abilities.Contains(Abilities.Avenger))
            {
                if (avengerability == null)
                {
                    avengerability = gameObject.AddComponent <Avenger>();
                }
                avengerability.progression = this;
                avengerability.Stacks      = 0;
            }
            else if (avengerability != null)
            {
                Destroy(avengerability);
            }
            if (abilities.Contains(Abilities.FireAura))
            {
                float aurDmg = (5 * Level + 1) * ((int)ModSettings.difficulty + 1.3f);
                FireAura.Cast(gameObject, aurDmg);
                if (BoltNetwork.isRunning)
                {
                    using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                    {
                        using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                        {
                            w.Write(8);
                            w.Write(2);
                            w.Write(entity.networkId.PackedValue);
                            w.Write(aurDmg);
                        }
                        ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Clients);
                        answerStream.Close();
                    }
                }

                InvokeRepeating("SendFireAura", 20, 30);
            }
            else
            {
                var aura = gameObject.GetComponent <FireAura>();
                if (aura != null)
                {
                    Destroy(aura);
                }
            }
            //Clamping Health
            try
            {
                maxHealth = extraHealth;
                HealthScript.maxHealthFloat = extraHealth;
                Armor = Mathf.Min(Armor, int.MaxValue - 5);
                if (Armor < 0)
                {
                    Armor = int.MaxValue;
                }
                //Setting other health variables
                HealthScript.maxHealth = Mathf.RoundToInt(Mathf.Min(extraHealth, int.MaxValue - 5));
                HealthScript.Health    = Mathf.RoundToInt(Mathf.Min(extraHealth, int.MaxValue - 5));
                extraHealth           -= HealthScript.Health;
                DebuffDmgMult          = DamageMult;
                DualLifeSpend          = false;
                setupComplete          = true;
                OnDieCalled            = false;
                BaseDamageMult         = DamageMult;
                BaseAnimSpeed          = AnimSpeed;
            }
            catch (Exception e)
            {
                ModAPI.Log.Write(e.ToString());
                CotfUtils.Log(e.Message);
            }

            AssignBounty();

            SteadfastCap = Mathf.Max(Steadfast * 0.01f * maxHealth, 1f);
            if (SteadfastCap < 1)             // Making sure the enemy can be killed
            {
                SteadfastCap = 1;
            }

            CreationTime = Time.time;

            if (BoltNetwork.isRunning)
            {
                ulong id = entity.networkId.PackedValue;
                using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                {
                    using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                    {
                        w.Write(30);
                        w.Write(id);
                        w.Write(BaseDamageMult);
                        foreach (Abilities ability in abilities)
                        {
                            w.Write((int)ability);
                        }
                        w.Close();
                    }
                    ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Clients);
                    answerStream.Close();
                }
            }
        }
Example #7
0
        private void Setup()
        {
            try
            {
                if (BoltNetwork.isRunning)
                {
                    if (entity == null)
                    {
                        entity = transform.root.GetComponentInChildren <BoltEntity>();
                    }
                    if (entity == null)
                    {
                        entity = HealthScript.entity;
                    }
                    if (entity == null)
                    {
                        entity = transform.root.GetComponent <BoltEntity>();
                    }
                    EnemyManager.AddHostEnemy(this);
                }
                if (!EnemyManager.enemyByTransform.ContainsKey(transform))
                {
                    EnemyManager.enemyByTransform.Add(this.transform, this);
                }
            }
            catch (Exception ex)
            {
                ModAPI.Log.Write(ex.ToString());
            }

            //Assiging base health, if new enemy
            if (baseHealth == 0)
            {
                baseHealth = HealthScript.Health;
            }
            else                //reverting health to base health if reused enemy (in case enemies are pooled)
            {
                HealthScript.Health = baseHealth;
            }

            StopAllCoroutines();

            Steadfast          = 100;
            slows              = new Dictionary <int, EnemyDebuff>();
            dmgTakenDebuffs    = new Dictionary <int, EnemyDebuff>();
            dmgDealtDebuffs    = new Dictionary <int, EnemyDebuff>();
            FireDamageDebuffs  = new Dictionary <int, EnemyDebuff>();
            DamageOverTimeList = new List <DoT>();
            abilities          = new List <Abilities>();

            bool isElite = (Random.value < 0.1 || (AIScript.creepy_boss && !AIScript.girlFullyTransformed) || ModSettings.difficulty == ModSettings.Difficulty.Hell) && ModSettings.AllowElites;

            SetType(ref isElite);


            //picking abilities
            if (isElite)
            {
                int abilityAmount = (int)ModSettings.difficulty > (int)ModSettings.Difficulty.Veteran ? Random.Range(3, 7) : 2;
                if (AIScript.creepy_boss)
                {
                    abilityAmount = 10;
                }                   //Megan boss always has abilities, a lot of them.

                int   i            = 0;
                Array abilityArray = Enum.GetValues(typeof(Abilities));

                //Determining if enemy is Elite, Miniboss or Boss type of enemy
                if (abilityAmount > 6 && Random.value < 0.1f)
                {
                    _rarity = EnemyRarity.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }
                else if (abilityAmount > 4 && Random.value < 0.25f)
                {
                    abilities.Add(Abilities.EliteSteadfast);
                    _rarity = EnemyRarity.Miniboss;
                }
                else
                {
                    _rarity = EnemyRarity.Elite;
                }

                if (AIScript.creepy_boss && !AIScript.girlFullyTransformed)                    //Force adding BossSteadfast to Megan
                {
                    abilities.Clear();
                    _rarity = EnemyRarity.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }

                //Trial and error method of picking abilities
                while (i < abilityAmount)
                {
                    bool      canAdd = true;
                    Abilities ab     = (Abilities)abilityArray.GetValue(Random.Range(0, abilityArray.Length));
                    if (ab == Abilities.Steadfast || ab == Abilities.EliteSteadfast || ab == Abilities.BossSteadfast)
                    {
                        if (abilities.Contains(Abilities.Steadfast) || abilities.Contains(Abilities.EliteSteadfast) || abilities.Contains(Abilities.BossSteadfast))
                        {
                            canAdd = false;
                        }
                    }
                    else if (ab == Abilities.Tiny || ab == Abilities.Gargantuan)
                    {
                        if (AIScript.creepy_boss && ab == Abilities.Tiny)
                        {
                            canAdd = false;
                        }
                        else if (abilities.Contains(Abilities.Gargantuan) || abilities.Contains(Abilities.Tiny))
                        {
                            canAdd = false;
                        }
                    }
                    else if (ab == Abilities.Undead && !(AIScript.creepy || AIScript.creepy_fat))
                    {
                        canAdd = false;
                    }
                    else if (ab == Abilities.ArcaneCataclysm || ab == Abilities.BlackHole || ab == Abilities.FireCataclysm || ab == Abilities.Meteor)
                    {
                        if ((int)ModSettings.difficulty < (int)ModSettings.Difficulty.Master)
                        {
                            canAdd = false;
                        }
                    }
                    if (abilities.Contains(ab))
                    {
                        canAdd = false;
                    }
                    if (canAdd)
                    {
                        i++;
                        abilities.Add(ab);
                    }
                }
            }
            else
            {
                _rarity = EnemyRarity.Normal;
            }

            SetLevel();
            RollName(isElite);
            setupDifficulty = ModSettings.difficulty;
            //Assigning rest of stats
            int dif = (int)setupDifficulty;

            DamageMult     = level < 67 ? ((31f - 0.286f * (level - 20f)) * (level - 5f) + 3.5f) * (level - 1f) + 11 : Mathf.Pow(level - 60, 2.61f) * 600;
            armor          = Mathf.FloorToInt(Random.Range(Mathf.Pow(level, 2.4f) * 0.36f + 1, Mathf.Pow(level, 2.45f) + 20) * ModSettings.EnemyArmorMultiplier);
            armor         *= dif / 2 + 1;
            armorReduction = 0;
            extraHealth    = (Mathf.Sqrt(HealthScript.Health) + 40) * Mathf.Pow(level, 2.22f) / 6f;
            extraHealth   *= (level / 50) + 0.4f;

            AnimSpeed           = 0.93f + (float)level / 175;
            HealthScript.Health = int.MaxValue;

            extraHealth *= ModSettings.EnemyHealthMultiplier;
            DamageMult  *= ModSettings.EnemyDamageMultiplier;
            AnimSpeed   *= ModSettings.EnemySpeedMultiplier;

            if (_rarity != EnemyRarity.Normal)
            {
                armor *= 2;
            }
            //Extra health for boss type enemies
            switch (_rarity)
            {
            case EnemyRarity.Elite:
                extraHealth *= 5;

                break;

            case EnemyRarity.Miniboss:
                extraHealth *= 10;

                break;

            case EnemyRarity.Boss:
                extraHealth *= 20;
                if (!abilities.Contains(Abilities.Tiny))
                {
                    gameObject.transform.localScale *= 1.1f;
                }

                break;
            }
            if (level > 25)
            {
                extraHealth *= 2.15f;
            }
            if (level > 50)
            {
                extraHealth *= 2f;
            }
            if (level > 100)
            {
                extraHealth *= 3.4f;
            }
            if (level > 200)
            {
                extraHealth *= 2.5f;
            }
            if (level > 300)
            {
                extraHealth *= 3.2f;
            }
            //Applying some abilities
            if (abilities.Contains(Abilities.Gargantuan))
            {
                armor       *= 3;
                extraHealth *= 2.5f;
                DamageMult  *= 2.5f;
                AnimSpeed   /= 1.5f;
                BroadcastMessage("SetTriggerScale", 2.5f, SendMessageOptions.DontRequireReceiver);
            }
            else if (abilities.Contains(Abilities.Tiny))
            {
                AnimSpeed  *= 1.1f;
                DamageMult *= 1.2f;
                BroadcastMessage("SetTriggerScale", 5f, SendMessageOptions.DontRequireReceiver);
            }
            else
            {
                BroadcastMessage("SetTriggerScale", 1.6f, SendMessageOptions.DontRequireReceiver);
            }
            if (abilities.Contains(Abilities.Steadfast))
            {
                Steadfast = 6;
                armor    *= 2;
            }
            if (abilities.Contains(Abilities.EliteSteadfast))
            {
                Steadfast = 4f;
                armor    *= 2;
            }
            if (abilities.Contains(Abilities.BossSteadfast))
            {
                Steadfast = 1f;
                armor    *= 2;
            }
            if (abilities.Contains(Abilities.ExtraHealth))
            {
                extraHealth *= 4;
            }
            if (abilities.Contains(Abilities.ExtraDamage))
            {
                DamageMult *= 5f;
            }
            if (abilities.Contains(Abilities.RainEmpowerment))
            {
                prerainDmg   = DamageMult;
                prerainArmor = armor;
            }
            if (abilities.Contains(Abilities.Juggernaut))
            {
                CCimmune   = true;
                AnimSpeed /= 1.15f;
            }
            if (abilities.Contains(Abilities.Avenger))
            {
                if (avengerability == null)
                {
                    avengerability = gameObject.AddComponent <Avenger>();
                }
                avengerability.progression = this;
                avengerability.Stacks      = 0;
            }
            else if (avengerability != null)
            {
                Destroy(avengerability);
            }
            if (abilities.Contains(Abilities.Radiance))
            {
                float aurDmg = DamageMult / 20;
                FireAura.Cast(gameObject, aurDmg);
                if (BoltNetwork.isRunning)
                {
                    using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                    {
                        using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                        {
                            w.Write(8);
                            w.Write(2);
                            w.Write(entity.networkId.PackedValue);
                            w.Write(aurDmg);
                        }
                        Network.NetworkManager.SendLine(answerStream.ToArray(), Network.NetworkManager.Target.Clients);
                        answerStream.Close();
                    }
                }

                InvokeRepeating("SendFireAura", 20, 30);
            }
            else
            {
                var aura = gameObject.GetComponent <FireAura>();
                if (aura != null)
                {
                    Destroy(aura);
                }
            }
            //Clamping Health
            try
            {
                maxHealth = extraHealth;
                HealthScript.maxHealthFloat = maxHealth;
                HealthScript.Health         = (int)Mathf.Min(maxHealth, int.MaxValue);
                extraHealth = Mathf.Max(0, maxHealth - HealthScript.Health);
                ClampHealth();
                armor = Mathf.Min(armor, int.MaxValue - 5);
                if (armor < 0)
                {
                    armor = int.MaxValue;
                }
                DebuffDmgMult  = 1;
                DualLifeSpend  = false;
                setupComplete  = true;
                OnDieCalled    = false;
                BaseDamageMult = Mathf.Abs(DamageMult);
                BaseAnimSpeed  = AnimSpeed;
                knockbackSpeed = 0;
            }
            catch (Exception e)
            {
                CotfUtils.Log(e.Message);
            }

            AssignBounty();

            steadfastCap = Mathf.Max(Steadfast * 0.01f * maxHealth, 1f);
            if (steadfastCap < 1)             // Making sure the enemy can be killed
            {
                steadfastCap = 1;
            }

            CreationTime = Time.time;

            if (BoltNetwork.isRunning)
            {
                ulong id = entity.networkId.PackedValue;
                color = normalColor;
                SyncAppearance(id);
            }
        }