예제 #1
0
        void OnEntityTakeDamage(BaseEntity entity, HitInfo info)
        {
            var victim = entity?.ToPlayer();
            var attacker = info?.Initiator?.ToPlayer();
            if (victim == null || attacker == null) return;
            if (victim == attacker) return;

            if (info.IsProjectile()) return;

            if (!permission.UserHasPermission(attacker.UserIDString, permMugging)) return;
            if (permission.UserHasPermission(victim.UserIDString, permProtection)) return;
            if (InNoLootZone(victim, attacker) || IsFriend(victim, attacker) || IsClanmate(victim, attacker)) return;

            if (!cooldowns.ContainsKey(attacker.UserIDString)) cooldowns.Add(attacker.UserIDString, 0f);
            if (usageCooldown != 0 && cooldowns[attacker.UserIDString] + usageCooldown > Interface.Oxide.Now)
            {
                PrintToChat(attacker, Lang("Cooldown", attacker.UserIDString));
                return;
            }

            if (itemStealing) StealItem(victim, attacker);
            if (moneyStealing) StealMoney(victim, attacker);
            if (pointStealing) StealPoints(victim, attacker);

            cooldowns[attacker.UserIDString] = Interface.Oxide.Now;
        }
예제 #2
0
        void OnPlayerAttack(BasePlayer attacker, HitInfo info)
        {
            if (info == null)
            {
                return;
            }
            if (!permission.UserHasPermission(attacker.UserIDString, enderPearlPerms))
            {
                return;
            }
            if (!info.IsProjectile())
            {
                return;
            }

            //var weapon = info.Weapon.GetItem();  // ONLY WORKS FOR GUNS
            //Puts(info.WeaponPrefab.name);

            string entName = info.WeaponPrefab.name;

            if (entName != config.enderpearl)
            {
                return;
            }

            Teleport(attacker, info);
        }
예제 #3
0
    public void Log(HitInfo info, float health_old, float health_new, string description = null)
    {
        uint   d;
        uint   num;
        string str;
        string str1;

        CombatLog.Event healthOld = new CombatLog.Event()
        {
            time = UnityEngine.Time.realtimeSinceStartup
        };
        if (!info.Initiator || info.Initiator.net == null)
        {
            d = 0;
        }
        else
        {
            d = info.Initiator.net.ID;
        }
        healthOld.attacker_id = d;
        if (!info.HitEntity || info.HitEntity.net == null)
        {
            num = 0;
        }
        else
        {
            num = info.HitEntity.net.ID;
        }
        healthOld.target_id = num;
        if (this.player == info.Initiator)
        {
            str = "you";
        }
        else
        {
            str = (info.Initiator ? info.Initiator.ShortPrefabName : "N/A");
        }
        healthOld.attacker = str;
        if (this.player == info.HitEntity)
        {
            str1 = "you";
        }
        else
        {
            str1 = (info.HitEntity ? info.HitEntity.ShortPrefabName : "N/A");
        }
        healthOld.target     = str1;
        healthOld.weapon     = (info.WeaponPrefab ? info.WeaponPrefab.name : "N/A");
        healthOld.ammo       = (info.ProjectilePrefab ? info.ProjectilePrefab.name : "N/A");
        healthOld.bone       = info.boneName;
        healthOld.area       = info.boneArea;
        healthOld.distance   = (info.IsProjectile() ? info.ProjectileDistance : Vector3.Distance(info.PointStart, info.HitPositionWorld));
        healthOld.health_old = health_old;
        healthOld.health_new = health_new;
        healthOld.info       = (description != null ? description : string.Empty);
        this.Log(healthOld);
    }
예제 #4
0
 public void Log(HitInfo info, float health_old, float health_new)
 {
     LogEvent(new CombatEvent
     {
         time        = Time.realtimeSinceStartup,
         attacker_id = ((!info.Initiator || info.Initiator.net == null) ? 0u : info.Initiator.net.ID),
         victim_id   = ((!info.HitEntity || info.HitEntity.net == null) ? 0u : info.HitEntity.net.ID),
         weapon      = ((!info.WeaponPrefab) ? "N/A" : info.WeaponPrefab.name),
         ammo        = ((!info.ProjectilePrefab) ? "N/A" : info.ProjectilePrefab.name),
         bone        = info.boneName,
         area        = info.boneArea,
         distance    = ((!info.IsProjectile()) ? Vector3.Distance(info.PointStart, info.HitPositionWorld) : info.ProjectileDistance),
         health_old  = health_old,
         health_new  = health_new,
     });
 }
예제 #5
0
 public override void OnAttacked(HitInfo info)
 {
     if (this.isServer && info.WeaponPrefab is BaseMelee && !info.IsProjectile())
     {
         BasePlayer initiator = info.Initiator as BasePlayer;
         if (Object.op_Implicit((Object)initiator) && (double)this.reflectDamage > 0.0)
         {
             initiator.Hurt(this.reflectDamage * Random.Range(0.75f, 1.25f), DamageType.Stab, (BaseEntity)this, true);
             if (this.reflectEffect.isValid)
             {
                 Effect.server.Run(this.reflectEffect.resourcePath, (BaseEntity)initiator, StringPool.closest, ((Component)this).get_transform().get_position(), Vector3.get_up(), (Connection)null, false);
             }
         }
     }
     base.OnAttacked(info);
 }
예제 #6
0
 public override void OnAttacked(HitInfo info)
 {
     if (base.isServer && info.WeaponPrefab is BaseMelee && !info.IsProjectile())
     {
         BasePlayer initiator = info.Initiator as BasePlayer;
         if (initiator && this.reflectDamage > 0f)
         {
             initiator.Hurt(this.reflectDamage * UnityEngine.Random.Range(0.75f, 1.25f), DamageType.Stab, this, true);
             if (this.reflectEffect.isValid)
             {
                 Effect.server.Run(this.reflectEffect.resourcePath, initiator, StringPool.closest, base.transform.position, Vector3.up, null, false);
             }
         }
     }
     base.OnAttacked(info);
 }
예제 #7
0
    public void Log(HitInfo info, float health_old, float health_new, string description = null)
    {
        Event val = default(Event);

        val.time        = UnityEngine.Time.realtimeSinceStartup;
        val.attacker_id = (((bool)info.Initiator && info.Initiator.net != null) ? info.Initiator.net.ID : 0u);
        val.target_id   = (((bool)info.HitEntity && info.HitEntity.net != null) ? info.HitEntity.net.ID : 0u);
        val.attacker    = ((player == info.Initiator) ? "you" : (info.Initiator ? info.Initiator.ShortPrefabName : "N/A"));
        val.target      = ((player == info.HitEntity) ? "you" : (info.HitEntity ? info.HitEntity.ShortPrefabName : "N/A"));
        val.weapon      = (info.WeaponPrefab ? info.WeaponPrefab.name : "N/A");
        val.ammo        = (info.ProjectilePrefab ? info.ProjectilePrefab.name : "N/A");
        val.bone        = info.boneName;
        val.area        = info.boneArea;
        val.distance    = (info.IsProjectile() ? info.ProjectileDistance : Vector3.Distance(info.PointStart, info.HitPositionWorld));
        val.health_old  = health_old;
        val.health_new  = health_new;
        val.info        = ((description != null) ? description : string.Empty);
        Log(val);
    }
예제 #8
0
 public void Log(HitInfo info, float health_old, float health_new, string description = null)
 {
     this.Log(new CombatLog.Event()
     {
         time        = Time.get_realtimeSinceStartup(),
         attacker_id = !Object.op_Implicit((Object)info.Initiator) || info.Initiator.net == null ? 0U : (uint)(int)info.Initiator.net.ID,
         target_id   = !Object.op_Implicit((Object)info.HitEntity) || info.HitEntity.net == null ? 0U : (uint)(int)info.HitEntity.net.ID,
         attacker    = Object.op_Equality((Object)this.player, (Object)info.Initiator) ? "you" : (Object.op_Implicit((Object)info.Initiator) ? info.Initiator.ShortPrefabName : "N/A"),
         target      = Object.op_Equality((Object)this.player, (Object)info.HitEntity) ? "you" : (Object.op_Implicit((Object)info.HitEntity) ? info.HitEntity.ShortPrefabName : "N/A"),
         weapon      = Object.op_Implicit((Object)info.WeaponPrefab) ? ((Object)info.WeaponPrefab).get_name() : "N/A",
         ammo        = Object.op_Implicit((Object)info.ProjectilePrefab) ? ((Object)info.ProjectilePrefab).get_name() : "N/A",
         bone        = info.boneName,
         area        = info.boneArea,
         distance    = info.IsProjectile() ? info.ProjectileDistance : Vector3.Distance(info.PointStart, info.HitPositionWorld),
         health_old  = health_old,
         health_new  = health_new,
         info        = description != null ? description : string.Empty
     });
 }
예제 #9
0
        private void OnEntityTakeDamage(Door entity, HitInfo info)
        {
            if (info.Weapon == null || !info.IsProjectile() || info.InitiatorPlayer == null ||
                !entity.PrefabName.Contains("wood") ||
                !info.InitiatorPlayer.IPlayer.HasPermission(PermissionUse))
            {
                return;
            }
            ArrowDamage BaseDamage;

            if (!_config.ArrowDamage.TryGetValue(info.ProjectilePrefab.name, out BaseDamage))
            {
                return;
            }
            float Mult;

            if (!_config.BowMultipliers.TryGetValue(info.Weapon.ShortPrefabName, out Mult))
            {
                Mult = 1;
            }
            info.damageTypes.Set(DamageType.Arrow, Random.Range(BaseDamage.MinDamage, BaseDamage.MaxDamage + 1) * Mult);
        }
예제 #10
0
        private object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
        {
            if (!ignoreProjectiles)
            {
                return(null);
            }
            BaseTrap trap = entity.GetComponent <BaseTrap>();

            if (!trap)
            {
                return(null);
            }
            if (!info.IsProjectile())
            {
                return(null);
            }
            BearTrap bearTrap = entity.GetComponent <BearTrap>();

            if (bearTrap)
            {
                bearTrap.Arm();
            }
            return(true);
        }
예제 #11
0
        private object OnEntityTakeDamage(BaseCombatEntity anEntity, HitInfo aHitInfo)
        {
            if (!aHitInfo?.Weapon?.GetComponent <TaserController>())
            {
                return(null);
            }

            aHitInfo.damageTypes.Clear();
            aHitInfo.DoHitEffects = false;
            aHitInfo.DoDecals     = false;

            if (aHitInfo.InitiatorPlayer && !permission.UserHasPermission(aHitInfo.InitiatorPlayer.UserIDString, PERMISSION_USETASER))
            {
                return(true);
            }

            float theDistance = !aHitInfo.IsProjectile() ? Vector3.Distance(aHitInfo.PointStart, aHitInfo.HitPositionWorld) : aHitInfo.ProjectileDistance;

            if (config.TaserDistance > 0f && theDistance > config.TaserDistance)
            {
                aHitInfo.DidHit = false;
                return(true);
            }
            Effect.server.Run(config.PrefabShock, anEntity, aHitInfo.HitBone, aHitInfo.HitPositionLocal, aHitInfo.HitNormalLocal);
            aHitInfo.damageTypes.Add(DamageType.ElectricShock, config.TaserDamage);
            BasePlayer thePlayer = anEntity?.GetComponent <BasePlayer>();

            if (thePlayer)
            {
                if (thePlayer.IsNpc)
                {
                    if (aHitInfo.InitiatorPlayer && !permission.UserHasPermission(aHitInfo.InitiatorPlayer.UserIDString, PERMISSION_TASENPC))
                    {
                        return(null);
                    }

                    if (config.InstantKillsNPCs)
                    {
                        thePlayer.Die(aHitInfo);
                        return(null);
                    }

                    if (config.NPCBeltLocked)
                    {
                        thePlayer.inventory.containerBelt.SetLocked(true);
                    }
                    if (config.NPCWearLocked)
                    {
                        thePlayer.inventory.containerWear.SetLocked(true);
                    }
                }

                ShockedController theController = thePlayer.GetComponent <ShockedController>();
                if (!theController)
                {
                    theController        = thePlayer.gameObject.AddComponent <ShockedController>();
                    theController.Config = config;
                }
                NextFrame(() => theController.Shock(aHitInfo));
            }
            return(null);
        }
예제 #12
0
        private void OnPlayerDeath(BasePlayer victim, HitInfo hitInfo)
        {
            if (victim == null)
            {
                return;
            }

            if (hitInfo == null)
            {
                var wAttacker = victim.lastAttacker?.ToPlayer();
                if (wAttacker != null && victim.IsWounded())
                {
                    OnDeathFromWounds(wAttacker, victim);
                }
                return;
            }

            if (IsTrap(hitInfo.Initiator))
            {
                if (!_config.EnableEntityFeed)
                {
                    return;
                }
                OnKilledByEnt(hitInfo.Initiator, victim); return;
            }

            if (IsAnimal(hitInfo.Initiator))
            {
                if (!_config.EnableAnimalFeed)
                {
                    return;
                }
                OnKilledByAnimal(hitInfo.Initiator, victim); return;
            }

            if (IsRadiation(hitInfo))
            {
                if (!_config.EnableRadiationKills)
                {
                    return;
                }
                OnKilledByRadiation(victim); return;
            }

            var distance = !hitInfo.IsProjectile() ? (int)Vector3.Distance(hitInfo.PointStart, hitInfo.HitPositionWorld) : (int)hitInfo.ProjectileDistance;

            var attacker = hitInfo.InitiatorPlayer;

            if (attacker == null)
            {
                return;
            }

            if (attacker == victim)
            {
                if (!_config.EnableSuicides)
                {
                    return;
                }
                OnSuicide(victim); return;
            }

            if (IsExplosion(hitInfo))
            {
                OnExploded(attacker, victim);
            }

            else if (IsFlame(hitInfo))
            {
                OnBurned(attacker, victim);
            }

            else
            {
                OnKilled(attacker, victim, hitInfo, distance);
            }
        }
예제 #13
0
        private void OnEntityTakeDamage(BaseEntity entity, HitInfo info)
        {
            var victim   = entity.ToPlayer();
            var attacker = info?.Initiator?.ToPlayer();

            // Check if victim and attacker are invalid or equal
            if (victim == null || attacker == null || victim.Equals(attacker))
            {
                return;
            }

            // Check if victim or attacker is an NPCPlayer (ie. murderer)
            if (entity is NPCPlayer || info.Initiator is NPCPlayer)
            {
                return;
            }

            // Check if victim or attacker is an NPCPlayerApex (ie. scientist)
            if (entity is NPCPlayerApex || info.Initiator is NPCPlayerApex)
            {
                return;
            }

            // Check if victim or attacker is a manually spawned BasePlayer
            if (victim.Connection == null || attacker.Connection == null)
            {
                return;
            }

            // Make sure player isn't using ranged weapons
            if (info.IsProjectile())
            {
                return;
            }

            // Check if victim is protected from being mugged
            if (permission.UserHasPermission(victim.UserIDString, permProtection))
            {
                return;
            }

            // Check if attacker is allowed to mug
            if (!permission.UserHasPermission(attacker.UserIDString, permMugging))
            {
                return;
            }

            // Check if victim or attacker are in a loot zone, are friends, or share a clan
            if (InNoLootZone(victim, attacker) || IsFriend(victim, attacker) || IsClanmate(victim, attacker))
            {
                return;
            }

            // Check for a cooldown and set one if it doesn't exist
            if (!cooldowns.ContainsKey(attacker.UserIDString))
            {
                cooldowns.Add(attacker.UserIDString, 0f);
            }
            if (config.UsageCooldown != 0 && cooldowns[attacker.UserIDString] + config.UsageCooldown > Interface.Oxide.Now)
            {
                Player.Reply(attacker, Lang("Cooldown", attacker.UserIDString));
                return;
            }

            // Check if config options are enabled for stealing
            if (config.ItemStealing)
            {
                StealItem(victim, attacker);
            }
            if (config.MoneyStealing)
            {
                StealMoney(victim, attacker);
            }
            if (config.PointStealing)
            {
                StealPoints(victim, attacker);
            }

            // Set time for next cooldown check
            cooldowns[attacker.UserIDString] = Interface.Oxide.Now;
        }
예제 #14
0
        private object OnEntityTakeDamage(BaseCombatEntity Entity, HitInfo HitInfo)
        {
            if (Entity == null || !(Entity as BasePlayer) || HitInfo == null)
            {
                return(null);
            }

            var Attacker = HitInfo.InitiatorPlayer;
            var Victim   = HitInfo.HitEntity as BasePlayer;

            if (Attacker == null || Victim == null || Victim.IsNpc)
            {
                return(null);
            }

            if (WoundedPlayers.Contains(Victim.userID))
            {
                return(false);
            }

            if (!permission.UserHasPermission(Attacker.UserIDString, UseTaser))
            {
                return(null);
            }
            if (!permission.UserHasPermission(Victim.UserIDString, TaserAffect) && config.AffectPermissionNeeded)
            {
                return(null);
            }

            var WeaponName = HitInfo.WeaponPrefab.ShortPrefabName;
            var WeaponAmmo = HitInfo.Weapon as BaseProjectile;

            if (WeaponName == null || WeaponAmmo == null)
            {
                return(null);
            }

            if (WeaponName != "pistol_semiauto.entity" || WeaponAmmo.primaryMagazine.ammoType != AmmoType)
            {
                return(null);
            }

            var Distance = !HitInfo.IsProjectile() ? (int)Vector3.Distance(HitInfo.PointStart, HitInfo.HitPositionWorld) : (int)HitInfo.ProjectileDistance;

            if (config.MaxDistance > 0 && Distance > config.MaxDistance)
            {
                return(null);
            }

            Victim.StartWounded();
            WoundedPlayers.Add(Victim.userID);

            if (config.PlayScream)
            {
                Effect.server.Run(ScreamSound, Victim.transform.position);

                ScreamSoundTimer = timer.Every(3f, () =>
                {
                    if (Victim == null)
                    {
                        ScreamSoundTimer.Destroy();
                    }

                    else
                    {
                        Effect.server.Run(ScreamSound, Victim.transform.position);
                    }
                });
            }

            timer.Once(config.WoundedTime, () =>
            {
                Victim.StopWounded();
                WoundedPlayers.Remove(Victim.userID);
                if (ScreamSoundTimer != null)
                {
                    ScreamSoundTimer.Destroy();
                }
            });

            return(false);
        }
예제 #15
0
            public AggressiveAction(HitInfo info)
            {
                if (info == null)
                {
                    return;
                }

                // Get the source of the aggression
                if (info.Initiator != null)
                {
                    if (info.InitiatorPlayer != null)
                    {
                        aggression_initiator = new Resident(info.InitiatorPlayer);
                    }
                    else
                    {
                        aggression_initiator = new Entity(info.Initiator);
                    }
                }


                // Get the target of the agression
                BasePlayer player = info.HitEntity?.GetComponent <BasePlayer>();

                if (player != null)
                {
                    aggression_target = new Resident(player);
                }
                else if (info.HitEntity != null)
                {
                    aggression_target = new Entity(info.HitEntity);
                }

                // Get the weapons name
                if (info.Weapon.ShortPrefabName != null)
                {
                    weapon_name   = info.Weapon.ShortPrefabName;
                    weapon_prefab = info.Weapon.PrefabName;
                }

                if (info.material != null)
                {
                    material_name = info.material.name;
                }

                if (info.hasDamage)
                {
                    damage_name = info.damageProperties.name;
                    damage_type = info.damageTypes.GetMajorityDamageType().ToString();
                    damage_delt = (int)info.damageTypes.Total();
                    is_attack   = info.damageTypes.IsConsideredAnAttack();
                }

                did_gather  = info.DidGather;
                is_headshot = info.isHeadshot;
                if (info.IsProjectile())
                {
                    is_projectile       = info.IsProjectile();
                    projectile_distance = info.ProjectileDistance;
                }
            }