Пример #1
0
        public static void OnHit(NPC.NPCBase npc, ModLoader.OnHitData data)
        {
            if ((data.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerClick ||
                 data.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerProjectile) && !npc.Colony.Owners.Contains((Players.Player)data.HitSourceObject))
            {
                var p = (Players.Player)data.HitSourceObject;

                if (_warnedPlayers.Contains(p))
                {
                    ServerManager.Disconnect(p);
                }
                else
                {
                    _warnedPlayers.Add(p);
                    NetworkMenu menu = new NetworkMenu();
                    menu.LocalStorage.SetAs("header", "WARNING");
                    menu.Width            = 800;
                    menu.Height           = 600;
                    menu.ForceClosePopups = true;
                    menu.Items.Add(new Label(new LabelData("WARNING: Killing colonists that do not belong to you will result in a kick. This is your first and ONLY warning.", UnityEngine.Color.black)));
                    NetworkMenuManager.SendServerPopup(p, menu);
                }

                data.HitDamage    = 0;
                data.ResultDamage = 0;
            }
        }
Пример #2
0
 public static void OnMonsterHit(IMonster monster, ModLoader.OnHitData d)
 {
     if (Pipliz.Random.NextFloat() > .5f)
     {
         AudioManager.SendAudio(monster.Position, GameLoader.NAMESPACE + ".ZombieAudio");
     }
 }
Пример #3
0
        public static void OnPlayerHit(Players.Player player, ModLoader.OnHitData box)
        {
            var state = PlayerState.GetPlayerState(player);

            DeductArmor(box, state.Armor);
            state.IncrimentStat("Damage Taken", box.HitDamage);
        }
Пример #4
0
        public static void NotKillPlayerOnHitWater(Players.Player player, ModLoader.OnHitData d)
        {
            if(null == player || null == d || d.HitSourceType != ModLoader.OnHitData.EHitSourceType.FallDamage)
                return;

            Vector3Int position = new Vector3Int(player.Position);
            ushort hitType = 0;

            int max = 10;
            do
            {
                if(!World.TryGetTypeAt(position, out hitType))
                    break;

                if(hitType == _fluids[(int)EFluids.Water].source || hitType == _fluids[(int)EFluids.Water].fake)
                {
                    d.ResultDamage = 0;
                    break;
                }

                position += Vector3Int.down;

                if(max-- <= 0)
                    break;
            }
            while(hitType == BlockTypes.Builtin.BuiltinBlocks.Air);
        }
Пример #5
0
        public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData box)
        {
            var inv = GetSettlerInventory(npc);

            DeductArmor(box, inv.Armor);
            inv.IncrimentStat("Damage Taken", box.HitDamage);
        }
Пример #6
0
 public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData box)
 {
     if (npc != null && npc.Job != null && npc.Job.GetType() == typeof(Knight))
     {
         box.ResultDamage = box.ResultDamage - box.ResultDamage * .75f;
     }
 }
Пример #7
0
        public static void OnHit(NPC.NPCBase npc, ModLoader.OnHitData data)
        {
            if ((data.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerClick ||
                 data.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerProjectile) && !npc.Colony.Owners.Contains((Players.Player)data.HitSourceObject))
            {
                var p = (Players.Player)data.HitSourceObject;

                if (_warnedPlayers.Contains(p))
                {
                    ServerManager.Disconnect(p);
                }
                else
                {
                    _warnedPlayers.Add(p);
                    NetworkMenu menu = new NetworkMenu();
                    menu.LocalStorage.SetAs("header", _LocalizationHelper.LocalizeOrDefault("warning", p));
                    menu.Width            = 800;
                    menu.Height           = 600;
                    menu.ForceClosePopups = true;
                    menu.Items.Add(new Label(new LabelData(_LocalizationHelper.LocalizeOrDefault("KillingColonists", p), UnityEngine.Color.black)));
                    NetworkMenuManager.SendServerPopup(p, menu);
                }

                data.HitDamage    = 0;
                data.ResultDamage = 0;
            }
        }
Пример #8
0
 public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData d)
 {
     if (d.ResultDamage > 0 && d.HitSourceType == ModLoader.OnHitData.EHitSourceType.Monster)
     {
         var state = PlayerState.GetPlayerState(npc.Colony.Owner);
         d.ResultDamage += state.Difficulty.MonsterDamage;
     }
 }
Пример #9
0
 public static void OnPlayerHit(Players.Player player, ModLoader.OnHitData d)
 {
     if (d.ResultDamage > 0 && d.HitSourceType == ModLoader.OnHitData.EHitSourceType.Monster)
     {
         var state = PlayerState.GetPlayerState(player);
         d.ResultDamage += state.Difficulty.MonsterDamage;
     }
 }
Пример #10
0
 public static void OnPlayerHit(Players.Player player, ModLoader.OnHitData d)
 {
     if (d.ResultDamage > 0 && d.HitSourceType == ModLoader.OnHitData.EHitSourceType.Monster && player.ActiveColony != null && !(d.HitSourceObject is IPandaZombie))
     {
         var state = ColonyState.GetColonyState(player.ActiveColony);
         d.ResultDamage += state.Difficulty.MonsterDamage;
     }
 }
Пример #11
0
 public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData d)
 {
     if (d.ResultDamage > 0 && d.HitSourceType == ModLoader.OnHitData.EHitSourceType.Monster && !(d.HitSourceObject is IPandaZombie))
     {
         var state = ColonyState.GetColonyState(npc.Colony);
         d.ResultDamage += state.Difficulty.MonsterDamage;
     }
 }
Пример #12
0
        private static void DeductArmor(ModLoader.OnHitData box, Dictionary <ArmorSlot, ArmorState> entityArmor,
                                        Players.Player player, string name)
        {
            if (box.ResultDamage > 0)
            {
                float armor = 0;

                foreach (ArmorSlot armorSlot in ArmorSlotEnum)
                {
                    if (!entityArmor.ContainsKey(armorSlot))
                    {
                        entityArmor.Add(armorSlot, new ArmorState());
                    }

                    if (!entityArmor[armorSlot].IsEmpty())
                    {
                        armor += ArmorLookup[entityArmor[armorSlot].Id].ArmorRating;
                    }
                }

                if (armor != 0)
                {
                    box.ResultDamage = box.ResultDamage - box.ResultDamage * armor;

                    var hitLocation = _rand.Next(1, 100);

                    var dic = _hitChance;

                    if (!entityArmor[ArmorSlot.Shield].IsEmpty())
                    {
                        dic = _hitChanceShield;
                    }

                    foreach (var loc in dic)
                    {
                        if (!entityArmor[loc.Key].IsEmpty() && loc.Value >= hitLocation)
                        {
                            entityArmor[loc.Key].Durability--;

                            if (entityArmor[loc.Key].Durability <= 0)
                            {
                                entityArmor[loc.Key].Durability = 0;
                                entityArmor[loc.Key].Id         = default(ushort);

                                PandaChat.Send(player,
                                               $"{name} {loc.Key} broke! If you have a spare one it will be automatically equipt within 30 seconds.",
                                               ChatColor.white);
                            }

                            break;
                        }
                    }
                }
            }
        }
Пример #13
0
        public static void OnPlayerHit(Players.Player player, ModLoader.OnHitData d)
        {
            if (null == player || null == d || d.HitSourceType != ModLoader.OnHitData.EHitSourceType.FallDamage)
            {
                return;
            }

            if (d.ResultDamage < 0)
            {
                return;
            }
            d.ResultDamage = 0;
        }
Пример #14
0
        public static void OnMonsterHit(IMonster monster, ModLoader.OnHitData d)
        {
            var ps         = PlayerState.GetPlayerState(monster.OriginalGoal);
            var pandaArmor = monster as IPandaArmor;
            var turret     = d.HitSourceObject as IPandaDamage;

            if (pandaArmor != null && Random.NextFloat() <= pandaArmor.MissChance)
            {
                d.ResultDamage = 0;
                return;
            }

            if (pandaArmor != null &&
                turret != null)
            {
                var damage = 0f;

                foreach (var dt in turret.Damage)
                {
                    var tmpDmg = dt.Key.CalcDamage(pandaArmor.ElementalArmor, dt.Value);

                    if (pandaArmor.AdditionalResistance.TryGetValue(dt.Key, out var flatResist))
                    {
                        tmpDmg = tmpDmg - tmpDmg * flatResist;
                    }

                    damage += tmpDmg;
                }

                d.ResultDamage = damage;
            }
            else if (pandaArmor != null)
            {
                d.ResultDamage = DamageType.Physical.CalcDamage(pandaArmor.ElementalArmor, d.ResultDamage);

                if (pandaArmor.AdditionalResistance.TryGetValue(DamageType.Physical, out var flatResist))
                {
                    d.ResultDamage = d.ResultDamage - d.ResultDamage * flatResist;
                }
            }

            d.ResultDamage = d.ResultDamage - d.ResultDamage * ps.Difficulty.MonsterDamageReduction;

            if (Random.NextFloat() > .5f)
            {
                ServerManager.SendAudio(monster.Position, GameLoader.NAMESPACE + ".ZombieAudio");
            }
        }
Пример #15
0
        public static void OnNPCHit(NPC.NPCBase npc, ModLoader.OnHitData data)
        {
            if (!(data.HitSourceObject is Players.Player))
            {
                return;
            }
            Players.Player killer = (Players.Player)data.HitSourceObject;
            foreach (Players.Player owner in npc.Colony.Owners)
            {
                if (owner == killer || PlayerTracker.IsFriendly(owner, killer))
                {
                    return;
                }
            }

            PlayerTracker.AddEnemy(npc.Colony, killer);
        }
Пример #16
0
        public static void OnNPCHit(NPC.NPCBase npc, ModLoader.OnHitData data)
        {
            if (!IsKilled(npc, data) || !IsHitByPlayer(data.HitSourceType) || !(data.HitSourceObject is Players.Player))
            {
                return;
            }
            Players.Player killer = (Players.Player)data.HitSourceObject;
            foreach (Players.Player owner in npc.Colony.Owners)
            {
                if (owner == killer)
                {
                    return;
                }
            }

            int kills;

            if (!KillCounter.TryGetValue(killer, out kills))
            {
                kills = 0;
            }
            KillCounter[killer] = ++kills;
            if (NpcKillsBanThreshold > 0 && kills >= NpcKillsBanThreshold)
            {
                Chat.SendToConnected($"{killer.Name} banned for killing too many colonists");
                BlackAndWhitelisting.AddBlackList(killer.ID.steamID.m_SteamID);
                Players.Disconnect(killer);
            }
            else if (NpcKillsKickThreshold > 0 && kills >= NpcKillsKickThreshold)
            {
                Chat.SendToConnected($"{killer.Name} kicked for killing too many colonists");
                Players.Disconnect(killer);
            }
            else if (NpcKillsJailThreshold > 0 && kills >= NpcKillsJailThreshold)
            {
                Chat.SendToConnected($"{killer.Name} put in Jail for killing too many colonists");
                JailManager.jailPlayer(killer, null, "Killing Colonists", JailManager.DEFAULT_JAIL_TIME);
            }
            Log.Write($"{killer.Name} killed a colonist of {npc.Colony.ColonyID} at {npc.Position}");
            int remainingJail = NpcKillsJailThreshold - kills;
            int remainingKick = NpcKillsKickThreshold - kills;

            Chat.Send(killer, $"You killed a colonist, remaining until jail: {remainingJail}, remaining until kick: {remainingKick}");
        }
Пример #17
0
        public static IPandaDamage GetWeapon(ModLoader.OnHitData box)
        {
            var weap = box.HitSourceObject as IPandaDamage;

            if (weap == null && box.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC)
            {
                var npc = box.HitSourceObject as NPCBase;

                if (npc != null)
                {
                    var inv = ColonistInventory.Get(npc);

                    if (!inv.Weapon.IsEmpty() && WeaponLookup.ContainsKey(inv.Weapon.Id))
                    {
                        weap = WeaponLookup[inv.Weapon.Id];
                    }
                }
            }

            if (weap == null &&
                (box.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerProjectile ||
                 box.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerClick))
            {
                var p = box.HitSourceObject as Players.Player;

                if (p != null)
                {
                    var ps = PlayerState.GetPlayerState(p);

                    if (!ps.Weapon.IsEmpty() && WeaponLookup.ContainsKey(ps.Weapon.Id))
                    {
                        weap = WeaponLookup[ps.Weapon.Id];
                    }
                }
            }

            return(weap);
        }
Пример #18
0
 static bool IsKilled(NPC.NPCBase npc, ModLoader.OnHitData data)
 {
     return(npc.health - data.ResultDamage <= 0);
 }
Пример #19
0
        private static void DeductArmor(ModLoader.OnHitData box, EventedDictionary <ArmorSlot, ItemState> entityArmor)
        {
            if (box.ResultDamage > 0)
            {
                float armor  = 0;
                bool  missed = false;
                var   weap   = Weapons.WeaponFactory.GetWeapon(box);

                foreach (ArmorSlot armorSlot in ArmorSlotEnum)
                {
                    if (!entityArmor.ContainsKey(armorSlot))
                    {
                        entityArmor.Add(armorSlot, new ItemState());
                    }

                    if (!entityArmor[armorSlot].IsEmpty())
                    {
                        var item = ArmorLookup[entityArmor[armorSlot].Id];
                        armor += item.ArmorRating;

                        if (item.MissChance != 0 && item.MissChance > Pipliz.Random.NextFloat())
                        {
                            missed = true;
                            break;
                        }
                    }
                }

                if (!missed && armor != 0)
                {
                    box.ResultDamage = box.ResultDamage - box.ResultDamage * armor;

                    var hitLocation = _rand.Next(1, 100);

                    var dic = _hitChance;

                    if (!entityArmor[ArmorSlot.Shield].IsEmpty())
                    {
                        dic = _hitChanceShield;
                    }

                    foreach (var loc in dic)
                    {
                        if (!entityArmor[loc.Key].IsEmpty() && loc.Value >= hitLocation)
                        {
                            entityArmor[loc.Key].Durability--;

                            if (entityArmor[loc.Key].Durability <= 0)
                            {
                                entityArmor[loc.Key].Durability = 0;
                                entityArmor[loc.Key].Id         = default(ushort);
                            }

                            break;
                        }
                    }
                }

                if (missed)
                {
                    box.ResultDamage = 0;
                }
            }
        }
Пример #20
0
        public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData box)
        {
            var inv = GetSettlerInventory(npc);

            DeductArmor(box, inv.Armor, npc.Colony.Owner, inv.SettlerName);
        }
Пример #21
0
        public static void OnPlayerHit(Players.Player player, ModLoader.OnHitData box)
        {
            var state = PlayerState.GetPlayerState(player);

            DeductArmor(box, state.Armor, player, "Your");
        }
Пример #22
0
        public static void OnMonsterHit(IMonster monster, ModLoader.OnHitData d)
        {
            var cs          = ColonyState.GetColonyState(monster.OriginalGoal);
            var pandaArmor  = monster as IPandaArmor;
            var pamdaDamage = d.HitSourceObject as IPandaDamage;
            var skilled     = 0f;

            if (pandaArmor != null && Random.NextFloat() <= pandaArmor.MissChance)
            {
                d.ResultDamage = 0;
                return;
            }

            if (pamdaDamage == null && d.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC)
            {
                var npc = d.HitSourceObject as NPCBase;
                var inv = ColonistInventory.Get(npc);
                ColonistManager.IncrimentSkill(npc);
                skilled = inv.GetSkillModifier();

                if (inv.Weapon != null && Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(inv.Weapon.Id, out var wep))
                {
                    pamdaDamage = wep;
                }
            }

            if (pandaArmor != null && pamdaDamage != null)
            {
                d.ResultDamage = Items.Weapons.WeaponFactory.CalcDamage(pandaArmor, pamdaDamage);
            }
            else if (pandaArmor != null)
            {
                d.ResultDamage = DamageType.Physical.CalcDamage(pandaArmor.ElementalArmor, d.ResultDamage);

                if (pandaArmor.AdditionalResistance.TryGetValue(DamageType.Physical, out var flatResist))
                {
                    d.ResultDamage = d.ResultDamage - d.ResultDamage * flatResist;
                }
            }

            double skillRoll = Pipliz.Random.Next() + skilled;

            if (skillRoll < skilled)
            {
                d.ResultDamage += d.ResultDamage;
            }

            d.ResultDamage = d.ResultDamage - d.ResultDamage * cs.Difficulty.MonsterDamageReduction;

            if (d.ResultDamage < 0)
            {
                d.ResultDamage = 0;
            }

            if (d.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC)
            {
                var npc = d.HitSourceObject as NPCBase;
                var inv = ColonistInventory.Get(npc);
                inv.IncrimentStat("Damage Done", d.ResultDamage);

                if (skillRoll < skilled)
                {
                    inv.IncrimentStat("Double Damage Hits");
                }
            }

            if (d.ResultDamage >= monster.CurrentHealth)
            {
                monster.OnRagdoll();
                var    rewardMonster = monster as IPandaZombie;
                string monsterType   = "zombie";

                if (rewardMonster != null)
                {
                    monsterType = rewardMonster.MosterType;
                }

                if (monster.OriginalGoal.OwnerIsOnline())
                {
                    if (!string.IsNullOrEmpty(monsterType) &&
                        LootTables.Lookup.TryGetValue(monsterType, out var lootTable))
                    {
                        float luck = 0;

                        if (d.HitSourceObject is ILucky luckSrc)
                        {
                            luck = luckSrc.Luck;
                        }
                        else if ((d.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerClick ||
                                  d.HitSourceType == ModLoader.OnHitData.EHitSourceType.PlayerProjectile) &&
                                 d.HitSourceObject is Players.Player player)
                        {
                            var ps = PlayerState.GetPlayerState(player);

                            foreach (var armor in ps.Armor)
                            {
                                if (Items.Armor.ArmorFactory.ArmorLookup.TryGetValue(armor.Value.Id, out var a))
                                {
                                    luck += a.Luck;
                                }
                            }

                            if (Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(ps.Weapon.Id, out var w))
                            {
                                luck += w.Luck;
                            }
                        }
                        else if (d.HitSourceType == ModLoader.OnHitData.EHitSourceType.NPC &&
                                 d.HitSourceObject is NPCBase nPC)
                        {
                            var inv = ColonistInventory.Get(nPC);

                            foreach (var armor in inv.Armor)
                            {
                                if (Items.Armor.ArmorFactory.ArmorLookup.TryGetValue(armor.Value.Id, out var a))
                                {
                                    luck += a.Luck;
                                }
                            }

                            if (Items.Weapons.WeaponFactory.WeaponLookup.TryGetValue(inv.Weapon.Id, out var w))
                            {
                                luck += w.Luck;
                            }
                        }

                        var roll = lootTable.GetDrops(luck);

                        foreach (var item in roll)
                        {
                            monster.OriginalGoal.Stockpile.Add(item.Key, item.Value);
                        }
                    }
                }
            }
        }