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; } }
public static void OnMonsterHit(IMonster monster, ModLoader.OnHitData d) { if (Pipliz.Random.NextFloat() > .5f) { AudioManager.SendAudio(monster.Position, GameLoader.NAMESPACE + ".ZombieAudio"); } }
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); }
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); }
public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData box) { var inv = GetSettlerInventory(npc); DeductArmor(box, inv.Armor); inv.IncrimentStat("Damage Taken", box.HitDamage); }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } } } } }
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; }
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"); } }
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); }
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}"); }
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); }
static bool IsKilled(NPC.NPCBase npc, ModLoader.OnHitData data) { return(npc.health - data.ResultDamage <= 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; } } }
public static void OnNPCHit(NPCBase npc, ModLoader.OnHitData box) { var inv = GetSettlerInventory(npc); DeductArmor(box, inv.Armor, npc.Colony.Owner, inv.SettlerName); }
public static void OnPlayerHit(Players.Player player, ModLoader.OnHitData box) { var state = PlayerState.GetPlayerState(player); DeductArmor(box, state.Armor, player, "Your"); }
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); } } } } }