コード例 #1
0
ファイル: StickyBomb.cs プロジェクト: DevZhav/The-Forest
 private void OnTriggerEnter(Collider other)
 {
     if (other.gameObject.CompareTag("enemyCollide") || other.gameObject.CompareTag("animalRoot") || other.gameObject.CompareTag("animalCollide"))
     {
         if (this.doneStick)
         {
             return;
         }
         arrowStickToTarget arrowStickToTarget = other.GetComponent <arrowStickToTarget>();
         if (arrowStickToTarget == null)
         {
             arrowStickToTarget = other.GetComponentInChildren <arrowStickToTarget>();
         }
         if (arrowStickToTarget)
         {
             Transform transform = arrowStickToTarget.returnNearestJoint(base.transform);
             if (transform)
             {
                 FollowTarget followTarget = base.gameObject.AddComponent <FollowTarget>();
                 followTarget.target         = transform;
                 followTarget.offset         = (base.transform.position - transform.position) / 3.5f;
                 followTarget.followRotation = true;
                 CapsuleCollider component = base.transform.GetComponent <CapsuleCollider>();
                 if (component)
                 {
                     component.isTrigger = true;
                 }
                 base.GetComponent <Rigidbody>().isKinematic = true;
                 this.doneStick = true;
                 UnityEngine.Object.Destroy(this);
             }
         }
     }
 }
コード例 #2
0
 public override void OnEvent(stuckArrowsSync evnt)
 {
     if (!this.ValidateSender(evnt, SenderTypes.Any))
     {
         return;
     }
     if (evnt.target)
     {
         arrowStickToTarget arrowStickToTarget = evnt.target.GetComponent <arrowStickToTarget>();
         if (!arrowStickToTarget)
         {
             arrowStickToTarget = evnt.target.GetComponentInChildren <arrowStickToTarget>();
         }
         if (arrowStickToTarget)
         {
             if (evnt.removeArrow)
             {
                 int num = 0;
                 foreach (KeyValuePair <Transform, int> keyValuePair in arrowStickToTarget.stuckArrows)
                 {
                     if (num == evnt.index && keyValuePair.Key)
                     {
                         UnityEngine.Object.Destroy(keyValuePair.Key.gameObject);
                     }
                     num++;
                 }
                 return;
             }
             return;
         }
     }
 }
コード例 #3
0
 public override void OnEvent(stuckArrowsSync evnt)
 {
     if (!this.ValidateSender(evnt, SenderTypes.Any))
     {
         return;
     }
     if (evnt.target)
     {
         arrowStickToTarget arrowStickToTarget = evnt.target.GetComponent <arrowStickToTarget>();
         if (!arrowStickToTarget)
         {
             arrowStickToTarget = evnt.target.GetComponentInChildren <arrowStickToTarget>();
         }
         if (arrowStickToTarget)
         {
             if (evnt.removeArrow)
             {
                 int num = 0;
                 foreach (KeyValuePair <Transform, int> keyValuePair in arrowStickToTarget.stuckArrows)
                 {
                     if (num == evnt.index && keyValuePair.Key)
                     {
                         UnityEngine.Object.Destroy(keyValuePair.Key.gameObject);
                     }
                     num++;
                 }
                 return;
             }
             int        type = evnt.type;
             GameObject gameObject;
             if (type != 1)
             {
                 gameObject = UnityEngine.Object.Instantiate <GameObject>(arrowStickToTarget.fakeArrowPickup, evnt.target.transform.position, evnt.target.transform.rotation);
             }
             else
             {
                 gameObject = UnityEngine.Object.Instantiate <GameObject>(arrowStickToTarget.fakeArrowBonePickup, evnt.target.transform.position, evnt.target.transform.rotation);
             }
             gameObject.transform.parent        = arrowStickToTarget.stickToJoints[evnt.index];
             gameObject.transform.localPosition = evnt.pos;
             gameObject.transform.localRotation = evnt.rot;
             arrowStickToTarget.stuckArrows.Add(gameObject.transform, evnt.index);
             fakeArrowSetup component = gameObject.GetComponent <fakeArrowSetup>();
             if (component && BoltNetwork.isRunning)
             {
                 component.storedIndex  = arrowStickToTarget.stuckArrows.Count - 1;
                 component.entityTarget = evnt.target;
             }
         }
     }
 }
コード例 #4
0
    public Transform metgoragdoll(Vector3 varpvelocity = default(Vector3))
    {
        Transform transform = UnityEngine.Object.Instantiate <Transform>(this.vargamragdoll, base.transform.position, base.transform.rotation);

        if (!this.ignoreScale)
        {
            transform.localScale = base.transform.localScale;
        }
        this.metcopytransforms(base.transform, transform, varpvelocity * 1f);
        if (this.doCreepySkin && this.enemyHealth)
        {
            transform.gameObject.SendMessage("setSkin", this.enemyHealth.MySkin.sharedMaterial, SendMessageOptions.DontRequireReceiver);
            this.enemyHealth.MySkin.GetPropertyBlock(this.bloodPropertyBlock);
            transform.gameObject.SendMessage("setSkinDamageProperty", this.bloodPropertyBlock, SendMessageOptions.DontRequireReceiver);
            if (this.enemyHealth.Fire.Length > 0)
            {
                mutantTransferFire component = base.transform.parent.GetComponent <mutantTransferFire>();
                foreach (GameObject gameObject in this.enemyHealth.Fire)
                {
                    if (gameObject.activeSelf && component)
                    {
                        component.transferFireToTarget(gameObject, transform.gameObject);
                    }
                }
            }
            if (BoltNetwork.isServer)
            {
                BoltEntity component2 = base.transform.parent.GetComponent <BoltEntity>();
                if (component2)
                {
                    IMutantState         state = component2.GetState <IMutantState>();
                    CoopMutantDummyToken coopMutantDummyToken = new CoopMutantDummyToken();
                    coopMutantDummyToken.Scale       = base.transform.localScale;
                    coopMutantDummyToken.skinDamage1 = this.bloodPropertyBlock.GetFloat("_Damage1");
                    coopMutantDummyToken.skinDamage2 = this.bloodPropertyBlock.GetFloat("_Damage2");
                    coopMutantDummyToken.skinDamage3 = this.bloodPropertyBlock.GetFloat("_Damage3");
                    coopMutantDummyToken.skinDamage4 = this.bloodPropertyBlock.GetFloat("_Damage4");
                    coopMutantDummyToken.skinColor   = this.enemyHealth.MySkin.sharedMaterial.GetColor("_Color");
                    mutantTypeSetup component3 = base.transform.parent.GetComponent <mutantTypeSetup>();
                    if (component3)
                    {
                    }
                    BoltNetwork.Attach(transform.gameObject, coopMutantDummyToken);
                }
            }
        }
        if (this.animalHealth && this.animalHealth.mySkin)
        {
            this.animalHealth.mySkin.GetPropertyBlock(this.bloodPropertyBlock);
            float @float = this.bloodPropertyBlock.GetFloat("_Damage1");
            transform.gameObject.SendMessage("setSkinDamageProperty", this.bloodPropertyBlock, SendMessageOptions.DontRequireReceiver);
        }
        if (this.animalHealth && this.animalHealth.Fire)
        {
            mutantTransferFire component4;
            if (base.transform.parent)
            {
                component4 = base.transform.parent.GetComponent <mutantTransferFire>();
            }
            else
            {
                component4 = base.transform.GetComponent <mutantTransferFire>();
            }
            if (this.animalHealth.Fire.activeSelf && component4)
            {
                component4.transferFireToTarget(this.animalHealth.Fire, transform.gameObject);
            }
        }
        if (this.bat && this.burning)
        {
            transform.gameObject.SendMessage("enableFire", SendMessageOptions.DontRequireReceiver);
        }
        if (this.animal)
        {
            animalSpawnFunctions component5 = base.transform.root.GetComponent <animalSpawnFunctions>();
            if (component5)
            {
                transform.gameObject.SendMessage("setSkin", component5.meshRenderer.sharedMaterial, SendMessageOptions.DontRequireReceiver);
            }
            if (this.ca && this.ca.isSnow)
            {
                transform.gameObject.SendMessage("setupSnowRabbitTypeTrigger", SendMessageOptions.DontRequireReceiver);
            }
        }
        if (this.bird)
        {
            if (this.burning)
            {
                transform.gameObject.SendMessage("enableFire", SendMessageOptions.DontRequireReceiver);
            }
            lb_Bird component6 = base.transform.GetComponent <lb_Bird>();
            transform.gameObject.SendMessage("setSkin", component6.skin.sharedMaterial, SendMessageOptions.DontRequireReceiver);
        }
        if (this.fish)
        {
            transform.gameObject.SendMessage("doSkinSetup", this.fishScript.fishTypeInt, SendMessageOptions.DontRequireReceiver);
            transform.gameObject.SendMessage("setupFishType", this.fishScript.fishNatureGuideValue, SendMessageOptions.DontRequireReceiver);
        }
        if (this.alreadyBurnt)
        {
            transform.gameObject.SendMessage("enableBurntSkin", SendMessageOptions.DontRequireReceiver);
        }
        if (this.ast)
        {
            arrowStickToTarget component7 = transform.GetComponent <arrowStickToTarget>();
            if (component7)
            {
                int num = 0;
                foreach (KeyValuePair <Transform, int> keyValuePair in this.ast.stuckArrows)
                {
                    if (keyValuePair.Key)
                    {
                        component7.CreatureType(this.ast.IsAnimal, this.ast.IsBird, this.ast.IsFish);
                        int arrowType = 0;
                        if (num < this.ast.stuckArrowsTypeList.Count)
                        {
                            arrowType = this.ast.stuckArrowsTypeList[num];
                        }
                        component7.applyStuckArrowToDummy(keyValuePair.Key, keyValuePair.Key.localPosition, keyValuePair.Key.localRotation, keyValuePair.Value, arrowType);
                        num++;
                    }
                }
            }
        }
        this.burning      = false;
        this.alreadyBurnt = false;
        return(transform);
    }
コード例 #5
0
ファイル: ArrowDamage.cs プロジェクト: K07H/The-Forest
    public void CheckHit(Vector3 position, Transform target, bool isTrigger, Collider targetCollider)
    {
        if (this.ignoreCollisionEvents(targetCollider) && !target.CompareTag("enemyRoot"))
        {
            return;
        }
        if (!isTrigger)
        {
            Molotov componentInParent = base.transform.GetComponentInParent <Molotov>();
            if (componentInParent)
            {
                componentInParent.IncendiaryBreak();
            }
        }
        bool headDamage = false;

        if (target.gameObject.layer == LayerMask.NameToLayer("Water"))
        {
            FMODCommon.PlayOneshotNetworked(this.hitWaterEvent, base.transform, FMODCommon.NetworkRole.Any);
        }
        else if (target.CompareTag("SmallTree"))
        {
            FMODCommon.PlayOneshotNetworked(this.hitBushEvent, base.transform, FMODCommon.NetworkRole.Any);
        }
        if (target.CompareTag("PlaneHull"))
        {
            FMODCommon.PlayOneshotNetworked(this.hitMetalEvent, base.transform, FMODCommon.NetworkRole.Any);
        }
        if (target.CompareTag("Tree") || target.root.CompareTag("Tree") || target.CompareTag("Target"))
        {
            if (this.spearType)
            {
                base.StartCoroutine(this.HitTree(this.hit.point - base.transform.forward * 2.1f));
            }
            else if (this.hitPointUpdated)
            {
                base.StartCoroutine(this.HitTree(this.hit.point - base.transform.forward * 0.35f));
            }
            else
            {
                base.StartCoroutine(this.HitTree(base.transform.position - base.transform.forward * 0.35f));
            }
            this.disableLive();
            if (target.CompareTag("Tree") || target.root.CompareTag("Tree"))
            {
                TreeHealth component = target.GetComponent <TreeHealth>();
                if (!component)
                {
                    component = target.root.GetComponent <TreeHealth>();
                }
                if (component)
                {
                    component.LodTree.AddTreeCutDownTarget(base.gameObject);
                }
            }
        }
        else if (target.CompareTag("enemyCollide") || target.tag == "lb_bird" || target.CompareTag("animalCollide") || target.CompareTag("Fish") || target.CompareTag("enemyRoot") || target.CompareTag("animalRoot"))
        {
            bool flag  = target.tag == "lb_bird" || target.CompareTag("lb_bird");
            bool flag2 = target.CompareTag("Fish");
            bool flag3 = target.CompareTag("animalCollide") || target.CompareTag("animalRoot");
            arrowStickToTarget arrowStickToTarget = target.GetComponent <arrowStickToTarget>();
            if (!arrowStickToTarget)
            {
                arrowStickToTarget = target.root.GetComponentInChildren <arrowStickToTarget>();
            }
            if (!this.spearType && !this.flintLockAmmoType && !flag2)
            {
                if (arrowStickToTarget && arrowStickToTarget.enabled)
                {
                    if (flag)
                    {
                        EventRegistry.Achievements.Publish(TfEvent.Achievements.BirdArrowKill, null);
                    }
                    arrowStickToTarget.CreatureType(flag3, flag, flag2);
                    if (BoltNetwork.isRunning)
                    {
                        if (this.at && this.at._boltEntity && this.at._boltEntity.isAttached && this.at._boltEntity.isOwner)
                        {
                            headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                        }
                    }
                    else
                    {
                        headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                    }
                }
                if (arrowStickToTarget)
                {
                    base.Invoke("destroyMe", 0.1f);
                }
            }
            base.StartCoroutine(this.HitAi(target, flag || flag3, headDamage));
            if (flag2)
            {
                base.StartCoroutine(this.HitFish(target, this.hit.point - base.transform.forward * 0.35f));
            }
            this.disableLive();
        }
        else if (target.CompareTag("PlayerNet"))
        {
            if (BoltNetwork.isRunning)
            {
                BoltEntity boltEntity = target.GetComponentInParent <BoltEntity>();
                if (!boltEntity)
                {
                    boltEntity = target.GetComponent <BoltEntity>();
                }
                if (boltEntity)
                {
                    HitPlayer.Create(boltEntity, EntityTargets.OnlyOwner).Send();
                    this.disableLive();
                }
            }
        }
        else if (target.CompareTag("TerrainMain") && !LocalPlayer.IsInCaves)
        {
            if (this.ignoreTerrain)
            {
                this.ignoreTerrain = false;
                base.StartCoroutine(this.RevokeIgnoreTerrain());
            }
            else
            {
                if (this.spearType)
                {
                    if (this.bodyCollider)
                    {
                        this.bodyCollider.isTrigger = true;
                    }
                    base.StartCoroutine(this.HitStructure(base.transform.position - base.transform.forward * 2.1f, false));
                }
                else
                {
                    Vector3 position2 = base.transform.position - base.transform.forward * -0.8f;
                    float   num       = Terrain.activeTerrain.SampleHeight(base.transform.position) + Terrain.activeTerrain.transform.position.y;
                    if (base.transform.position.y < num)
                    {
                        position2.y = num + 0.5f;
                    }
                    base.StartCoroutine(this.HitStructure(position2, false));
                }
                this.disableLive();
                FMODCommon.PlayOneshotNetworked(this.hitGroundEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
        }
        else if (target.CompareTag("structure") || target.CompareTag("jumpObject") || target.CompareTag("SLTier1") || target.CompareTag("SLTier2") || target.CompareTag("SLTier3") || target.CompareTag("UnderfootWood"))
        {
            if (target.transform.parent && (target.transform.parent.GetComponent <StickFenceChunkArchitect>() || target.transform.parent.GetComponent <BoneFenceChunkArchitect>()))
            {
                return;
            }
            if (!isTrigger)
            {
                if (this.spearType)
                {
                    base.StartCoroutine(this.HitStructure(this.hit.point - base.transform.forward * 2.1f, true));
                }
                else
                {
                    base.StartCoroutine(this.HitStructure(this.hit.point - base.transform.forward * 0.35f, true));
                }
                this.disableLive();
            }
        }
        else if (target.CompareTag("CaveDoor"))
        {
            this.ignoreTerrain = true;
            Physics.IgnoreCollision(base.GetComponent <Collider>(), Terrain.activeTerrain.GetComponent <Collider>(), true);
        }
        else if (this.flintLockAmmoType && (target.CompareTag("BreakableWood") || target.CompareTag("BreakableRock")))
        {
            target.SendMessage("Hit", 40, SendMessageOptions.DontRequireReceiver);
        }
        if (!this.Live)
        {
            this.destroyThisAmmo();
            this.parent.BroadcastMessage("OnArrowHit", SendMessageOptions.DontRequireReceiver);
        }
    }
コード例 #6
0
        public override void CheckHit(Vector3 position, Transform target, bool isTrigger, Collider targetCollider)
        {
            if (ignoreCollisionEvents(targetCollider) && !target.CompareTag("enemyRoot"))
            {
                return;
            }
            if (!isTrigger)
            {
                Molotov componentInParent = transform.GetComponentInParent <Molotov>();
                if ((bool)componentInParent)
                {
                    componentInParent.IncendiaryBreak();
                }
            }
            bool headDamage = false;

            if (target.gameObject.layer == LayerMask.NameToLayer("Water"))
            {
                FMODCommon.PlayOneshotNetworked(hitWaterEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            else if (target.CompareTag("SmallTree"))
            {
                FMODCommon.PlayOneshotNetworked(hitBushEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            if (target.CompareTag("PlaneHull"))
            {
                FMODCommon.PlayOneshotNetworked(hitMetalEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            if (target.CompareTag("Tree") || target.root.CompareTag("Tree") || target.CompareTag("Target"))
            {
                if (spearType)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 2.1f));
                }
                else if (hitPointUpdated)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 0.35f));
                }
                else
                {
                    base.StartCoroutine(HitTree(base.transform.position - base.transform.forward * 0.35f));
                }
                disableLive();
                if (target.CompareTag("Tree") || target.root.CompareTag("Tree"))
                {
                    TreeHealth component = target.GetComponent <TreeHealth>();
                    if (!(bool)component)
                    {
                        component = target.root.GetComponent <TreeHealth>();
                    }
                    if ((bool)component)
                    {
                        component.LodTree.AddTreeCutDownTarget(base.gameObject);
                    }
                }
            }
            else if (target.CompareTag("enemyCollide") || target.tag == "lb_bird" || target.CompareTag("animalCollide") || target.CompareTag("Fish") || target.CompareTag("enemyRoot") || target.CompareTag("animalRoot"))
            {
                bool flag  = target.tag == "lb_bird" || target.CompareTag("lb_bird");
                bool flag2 = target.CompareTag("Fish");
                bool flag3 = target.CompareTag("animalCollide") || target.CompareTag("animalRoot");
                arrowStickToTarget arrowStickToTarget = target.GetComponent <arrowStickToTarget>();
                if (!(bool)arrowStickToTarget)
                {
                    arrowStickToTarget = target.root.GetComponentInChildren <arrowStickToTarget>();
                }
                if (!spearType && !flintLockAmmoType && !flag2)
                {
                    if (arrowStickToTarget && arrowStickToTarget.enabled)
                    {
                        if (flag)
                        {
                            EventRegistry.Achievements.Publish(TfEvent.Achievements.BirdArrowKill, null);
                        }
                        arrowStickToTarget.CreatureType(flag3, flag, flag2);
                        if (BoltNetwork.isRunning)
                        {
                            if (at && at._boltEntity && at._boltEntity.isAttached && at._boltEntity.isOwner)
                            {
                                headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                            }
                        }
                        else
                        {
                            headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                        }
                    }
                    if ((bool)arrowStickToTarget)
                    {
                        base.Invoke("destroyMe", 0.1f);
                    }
                }
                base.StartCoroutine(HitAi(target, flag || flag3, headDamage));
                ModdedPlayer.instance.DoAreaDamage(target.root, damage);
                ModdedPlayer.instance.DoOnHit();

                if (ModdedPlayer.instance.RangedArmorReduction > 0 && target.gameObject.CompareTag("enemyCollide"))
                {
                    if (BoltNetwork.isClient)
                    {
                        BoltEntity be = target.GetComponentInParent <BoltEntity>();
                        if (be == null)
                        {
                            be = target.GetComponent <BoltEntity>();
                        }
                        if (be != null)
                        {
                            EnemyProgression.ReduceArmor(be, ModdedPlayer.instance.MeleeArmorReduction);
                        }
                    }
                    else
                    {
                        target.transform.SendMessageUpwards("ReduceArmor", ModdedPlayer.instance.MeleeArmorReduction, SendMessageOptions.DontRequireReceiver);
                    }
                }
                if (flag2)
                {
                    base.StartCoroutine(HitFish(target, hit.point - base.transform.forward * 0.35f));
                }
                disableLive();
            }
            else if (target.CompareTag("PlayerNet"))
            {
                if (BoltNetwork.isRunning)
                {
                    BoltEntity boltEntity = target.GetComponentInParent <BoltEntity>();
                    if (!(bool)boltEntity)
                    {
                        boltEntity = target.GetComponent <BoltEntity>();
                    }
                    if (boltEntity && ModSettings.FriendlyFire)
                    {
                        HitPlayer HP = HitPlayer.Create(boltEntity, EntityTargets.Everyone);
                        HP.damage = damage;
                        HP.Send();
                        disableLive();
                    }
                }
            }
            else if (target.CompareTag("TerrainMain") && !LocalPlayer.IsInCaves)
            {
                if (ignoreTerrain)
                {
                    ignoreTerrain = false;
                    base.StartCoroutine(RevokeIgnoreTerrain());
                }
                else
                {
                    if (spearType)
                    {
                        if ((bool)bodyCollider)
                        {
                            bodyCollider.isTrigger = true;
                        }
                        base.StartCoroutine(HitStructure(base.transform.position - base.transform.forward * 2.1f, false));
                    }
                    else
                    {
                        Vector3 position2 = base.transform.position - base.transform.forward * -0.8f;
                        float   num       = Terrain.activeTerrain.SampleHeight(base.transform.position);
                        Vector3 position3 = Terrain.activeTerrain.transform.position;
                        float   num2      = num + position3.y;
                        Vector3 position4 = base.transform.position;
                        if (position4.y < num2)
                        {
                            position2.y = num2 + 0.5f;
                        }
                        base.StartCoroutine(HitStructure(position2, false));
                    }
                    disableLive();
                    FMODCommon.PlayOneshotNetworked(hitGroundEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
            }
            else if (target.CompareTag("structure") || target.CompareTag("jumpObject") || target.CompareTag("SLTier1") || target.CompareTag("SLTier2") || target.CompareTag("SLTier3") || target.CompareTag("UnderfootWood"))
            {
                if ((bool)target.transform.parent)
                {
                    if ((bool)target.transform.parent.GetComponent <StickFenceChunkArchitect>())
                    {
                        return;
                    }
                    if ((bool)target.transform.parent.GetComponent <BoneFenceChunkArchitect>())
                    {
                        return;
                    }
                }
                if (!isTrigger)
                {
                    if (spearType)
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 2.1f, true));
                    }
                    else
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 0.35f, true));
                    }
                    disableLive();
                }
            }
            else if (target.CompareTag("CaveDoor"))
            {
                ignoreTerrain = true;
                Physics.IgnoreCollision(base.GetComponent <Collider>(), Terrain.activeTerrain.GetComponent <Collider>(), true);
            }
            else if (flintLockAmmoType && (target.CompareTag("BreakableWood") || target.CompareTag("BreakableRock")))
            {
                target.SendMessage("Hit", 40, SendMessageOptions.DontRequireReceiver);
            }
            if (!Live)
            {
                destroyThisAmmo();
                parent.BroadcastMessage("OnArrowHit", SendMessageOptions.DontRequireReceiver);
            }
        }
コード例 #7
0
    public IEnumerator spawnDummy(getAnimatorParams.DummyParams p)
    {
        Quaternion angle = p.Angle;

        if (BoltNetwork.isClient)
        {
            yield break;
        }
        Vector3 bodyPosition    = base.transform.position;
        bool    useBodyPosition = false;

        if (this.setup && this.setup.ai && this.setup.ai.pale && !p.IsDummyLoad && this.health.trapGo)
        {
            trapTrigger componentInChildren = this.health.trapGo.GetComponentInChildren <trapTrigger>();
            if (componentInChildren)
            {
                componentInChildren.FixPalePosition(this.setup, false);
                bodyPosition   += -0.15f * Vector3.up;
                useBodyPosition = true;
            }
        }
        GameObject dummy = UnityEngine.Object.Instantiate <GameObject>(this.dummyMutant, bodyPosition, base.transform.rotation);

        dummy.transform.rotation = angle;
        if (p.IsDummyLoad || (this.animator.GetBool("trapBool") && this.animator.GetInteger("trapTypeInt1") == 2))
        {
            dummy.transform.localEulerAngles = new Vector3(0f, dummy.transform.localEulerAngles.y, 0f);
        }
        dummy.transform.localScale = this.mutantBase.localScale;
        dummy.SendMessage("setCalledFromDeath", SendMessageOptions.DontRequireReceiver);
        SkinnedMeshRenderer[] sk = dummy.GetComponentsInChildren <SkinnedMeshRenderer>();
        foreach (SkinnedMeshRenderer skinnedMeshRenderer in sk)
        {
            skinnedMeshRenderer.enabled = false;
        }
        Animator          dummyAnim = dummy.GetComponent <Animator>();
        AnimatorStateInfo state     = this.animator.GetCurrentAnimatorStateInfo(0);

        dummyAnim.CrossFade(state.nameHash, 0f, 0, state.normalizedTime);
        dummyAnim.CopyParamsFrom(this.animator);
        if (p.IsDummyLoad)
        {
            if (this.animator.GetInteger("trapTypeInt1") != 3)
            {
                dummyAnim.SetBoolReflected("trapBool", true);
                if (this.animator.GetInteger("trapTypeInt1") == 2)
                {
                    dummyAnim.SetBoolReflected("enterTrapBool", true);
                    dummyAnim.SetBoolReflected("deathBOOL", true);
                }
                else
                {
                    dummyAnim.SetTriggerReflected("deathTrigger");
                }
            }
        }
        this.dummyHips.rotation    = this.hips.rotation;
        this.dummyHips.position    = bodyPosition;
        dummy.transform.position   = bodyPosition;
        dummy.transform.localScale = this.mutantBase.localScale;
        if (this.setup.health.Fire.Length > 0)
        {
            mutantTransferFire component = base.transform.GetComponent <mutantTransferFire>();
            foreach (GameObject gameObject in this.setup.health.Fire)
            {
                if (gameObject.activeSelf)
                {
                    component.transferFireToTarget(gameObject, dummy);
                }
            }
        }
        if (p.IsDummyLoad || this.animator.GetBool("trapBool"))
        {
            if (this.animator.GetInteger("trapTypeInt1") == 2 && this.health.trapParent)
            {
                dummy.transform.parent = this.health.trapParent.transform;
                dummy.SendMessageUpwards("setTrapDummy", dummy);
                CoopMutantDummy componentInChildren2 = dummy.GetComponentInChildren <CoopMutantDummy>();
                if (componentInChildren2 && this.health.trapGo)
                {
                    this.health.trapGo.SendMessage("SetNooseRope", componentInChildren2, SendMessageOptions.DontRequireReceiver);
                }
            }
            if ((p.IsDummyLoad || this.animator.GetInteger("trapTypeInt1") == 0) && this.health.trapGo)
            {
                this.health.trapGo.SendMessage("addTrappedMutant", new object[]
                {
                    dummy,
                    this.setup
                }, SendMessageOptions.DontRequireReceiver);
                dummy.SendMessage("setTrapGo", this.health.trapGo, SendMessageOptions.DontRequireReceiver);
            }
        }
        string TYPE   = string.Empty;
        bool   skinny = false;

        dummy.SendMessage("invokePickupSpawn", SendMessageOptions.DontRequireReceiver);
        if (this.setup.ai.femaleSkinny)
        {
            skinny = true;
            dummy.SendMessage(TYPE = "setFemaleSkinny", base.transform);
        }
        if (this.setup.ai.maleSkinny)
        {
            skinny = true;
            if (this.setup.ai.pale)
            {
                dummy.SendMessage(TYPE = "enableMaleSkinnyPaleProps");
                dummy.SendMessage(TYPE = "setMaleSkinnyPale", base.transform);
                if (this.setup.ai.skinned)
                {
                    dummy.SendMessage(TYPE = "setSkinnedMutant", this.setup.ai.skinned);
                }
            }
            else
            {
                dummy.SendMessage(TYPE = "enableMaleSkinnyProps");
                dummy.SendMessage(TYPE = "setMaleSkinny", base.transform);
            }
        }
        if (this.setup.ai.pale && !this.setup.ai.maleSkinny)
        {
            dummy.SendMessage(TYPE = "enablePaleProps");
            dummy.SendMessage(TYPE = "setPaleMale");
            if (this.setup.ai.skinned)
            {
                dummy.SendMessage(TYPE = "setSkinnedMutant", this.setup.ai.skinned);
            }
        }
        if (this.setup.ai.leader && !this.setup.ai.maleSkinny && !this.setup.ai.pale && !this.setup.ai.female)
        {
            dummy.SendMessage(TYPE = "setRegularMale", this.setup.propManager ? this.setup.propManager.regularMaleDice : 0);
            dummy.SendMessage(TYPE = "enableLeaderProps", this.setup.propManager ? this.setup.propManager.LeaderDice : 0);
            if (this.setup.ai.painted)
            {
                dummy.SendMessage(TYPE = "setPaintedLeader");
            }
            dummy.SendMessage(TYPE = "setRegularMaleLeader");
        }
        if (this.setup.ai.fireman)
        {
            if (this.setup.ai.fireman_dynamite)
            {
                dummy.SendMessage(TYPE = "setDynamiteMan");
            }
            dummy.SendMessage(TYPE = "enableFiremanProps");
            dummy.SendMessage(TYPE = "setRegularMaleFireman");
        }
        if (this.setup.ai.female && !this.setup.ai.femaleSkinny)
        {
            if (this.setup.ai.painted)
            {
                dummy.SendMessage(TYPE = "setFemalePainted", this.setup.bodyVariation ? this.setup.bodyVariation.femaleDice : 0);
            }
            else
            {
                dummy.SendMessage(TYPE = "setFemaleRegular", this.setup.bodyVariation ? this.setup.bodyVariation.femaleDice : 0);
            }
            if (this.bodyVar && this.bodyVar.Hair && this.bodyVar.Hair.activeSelf)
            {
                dummy.SendMessage(TYPE = "setFemaleHair");
            }
            if (this.bodyVar && this.bodyVar.Clothing && this.bodyVar.Clothing.activeSelf)
            {
                dummy.SendMessage(TYPE = "setFemaleClothes");
            }
            if (this.bodyVar && this.bodyVar.FireDice == 2)
            {
                dummy.SendMessage(TYPE = "setFemaleFire");
            }
        }
        if (this.setup.ai.male && !this.setup.ai.maleSkinny && !this.setup.ai.pale && !this.setup.ai.fireman && !this.setup.ai.leader)
        {
            if (this.setup.ai.painted)
            {
                dummy.SendMessage(TYPE = "setPaintedMale", this.setup.propManager ? this.setup.propManager.regularMaleDice : 0);
            }
            else
            {
                dummy.SendMessage(TYPE = "setRegularMale", this.setup.propManager ? this.setup.propManager.regularMaleDice : 0);
            }
        }
        if (this.setup.health.alreadyBurnt)
        {
            dummy.SendMessage("setBurntSkin", SendMessageOptions.DontRequireReceiver);
        }
        dummy.SendMessage("setPoisoned", this.health.poisoned, SendMessageOptions.DontRequireReceiver);
        if (this.setup.arrowSticker)
        {
            arrowStickToTarget componentInChildren3 = dummy.GetComponentInChildren <arrowStickToTarget>();
            foreach (KeyValuePair <Transform, int> keyValuePair in this.setup.arrowSticker.stuckArrows)
            {
                if (keyValuePair.Key)
                {
                    componentInChildren3.applyStuckArrowToDummy(keyValuePair.Key, keyValuePair.Key.localPosition, keyValuePair.Key.localRotation, keyValuePair.Value);
                }
            }
        }
        this.setup.health.MySkin.GetPropertyBlock(this.bloodPropertyBlock);
        dummy.SendMessage("setSkinDamageProperty", this.bloodPropertyBlock, SendMessageOptions.DontRequireReceiver);
        dummy.SendMessage("setSkinMaterialProperties", this.health.MySkin.material, SendMessageOptions.DontRequireReceiver);
        if (BoltNetwork.isServer)
        {
            CoopMutantDummyToken coopMutantDummyToken = new CoopMutantDummyToken();
            coopMutantDummyToken.Skinny         = skinny;
            coopMutantDummyToken.HipPosition    = bodyPosition;
            coopMutantDummyToken.HipRotation    = this.hips.rotation;
            coopMutantDummyToken.OriginalMutant = base.GetComponent <BoltEntity>();
            coopMutantDummyToken.Scale          = this.mutantBase.localScale;
            coopMutantDummyToken.skinDamage1    = this.bloodPropertyBlock.GetFloat("_Damage1");
            coopMutantDummyToken.skinDamage2    = this.bloodPropertyBlock.GetFloat("_Damage2");
            coopMutantDummyToken.skinDamage3    = this.bloodPropertyBlock.GetFloat("_Damage3");
            coopMutantDummyToken.skinDamage4    = this.bloodPropertyBlock.GetFloat("_Damage4");
            if (p.IsDummyLoad)
            {
                foreach (SkinnedMeshRenderer skinnedMeshRenderer2 in sk)
                {
                    skinnedMeshRenderer2.enabled = true;
                }
                CoopMutantMaterialSync component2 = dummy.GetComponent <CoopMutantMaterialSync>();
                component2.ForceStart();
                coopMutantDummyToken.MaterialIndex = component2.GetMaterialIndex();
                CoopMutantPropSync component3 = dummy.GetComponent <CoopMutantPropSync>();
                coopMutantDummyToken.Props = component3.GetPropMask();
            }
            else
            {
                IMutantState state2 = base.GetComponent <BoltEntity>().GetState <IMutantState>();
                coopMutantDummyToken.MaterialIndex = state2.MainMaterialIndex;
                coopMutantDummyToken.Props         = state2.prop_mask;
            }
            if (this.health.poisoned)
            {
                coopMutantDummyToken.skinColor = new Color(0.670588255f, 0.796078444f, 0.5529412f, 1f);
            }
            else if (this.setup.ai.pale && !this.setup.ai.skinned)
            {
                coopMutantDummyToken.skinColor = new Color(0.8039216f, 0.870588243f, 0.9137255f, 1f);
            }
            else
            {
                coopMutantDummyToken.skinColor = new Color(0.698039234f, 0.698039234f, 0.698039234f, 1f);
            }
            BoltNetwork.Attach(dummy, coopMutantDummyToken);
        }
        if (BoltNetwork.isServer)
        {
            IMutantFemaleDummyState mutantFemaleDummyState;
            if (dummy.GetComponent <BoltEntity>().TryFindState <IMutantFemaleDummyState>(out mutantFemaleDummyState))
            {
                mutantFemaleDummyState.Type          = TYPE;
                mutantFemaleDummyState.CrossFadeHash = state.nameHash;
                mutantFemaleDummyState.CrossFadeTime = state.normalizedTime;
            }
            IMutantMaleDummyState mutantMaleDummyState;
            if (dummy.GetComponent <BoltEntity>().TryFindState <IMutantMaleDummyState>(out mutantMaleDummyState))
            {
                mutantMaleDummyState.Type          = TYPE;
                mutantMaleDummyState.CrossFadeHash = state.nameHash;
                mutantMaleDummyState.CrossFadeTime = state.normalizedTime;
            }
        }
        List <Quaternion> jointRotations = new List <Quaternion>();

        for (int l = 0; l < this.mrs.jointsToSync.Length; l++)
        {
            jointRotations.Add(this.mrs.jointsToSync[l].localRotation);
        }
        if (!p.IsDummyLoad && !this.animator.GetBool("trapBool"))
        {
            dummy.SendMessage("syncRagDollJoints", jointRotations, SendMessageOptions.DontRequireReceiver);
        }
        yield return(new WaitForFixedUpdate());

        yield return(new WaitForFixedUpdate());

        yield return(new WaitForFixedUpdate());

        yield return(new WaitForFixedUpdate());

        yield return(new WaitForFixedUpdate());

        dummy.transform.localScale = this.mutantBase.localScale;
        dummy.transform.position   = ((!useBodyPosition) ? this.DeadPosition : bodyPosition);
        if (this.animator.GetBool("trapBool") && this.animator.GetInteger("trapTypeInt1") == 2)
        {
            this.setup.rootTr.parent = null;
        }
        foreach (SkinnedMeshRenderer skinnedMeshRenderer3 in sk)
        {
            skinnedMeshRenderer3.enabled = true;
        }
        if (PoolManager.Pools["enemies"].IsSpawned(base.transform))
        {
            PoolManager.Pools["enemies"].Despawn(base.transform);
        }
        else if (BoltNetwork.isServer)
        {
            dummy.GetComponent <BoltEntity>().DestroyDelayed(0.1f);
        }
        else
        {
            UnityEngine.Object.Destroy(base.transform.gameObject);
        }
        yield return(null);

        yield break;
    }
コード例 #8
0
        public override void CheckHit(Vector3 position, Transform target, bool isTrigger, Collider targetCollider)
        {
            if (alreadyHit.Contains(target))
            {
                return;
            }
            else
            {
                alreadyHit.Add(target);
            }
            if (UpgradePointsMod.instance != null)
            {
                float a = BaseDamage + velocitybonus;

                a *= UpgradePointsMod.instance.ArrowDmg;

                if (UpgradePointsMod.instance.specialUpgrades[28].bought)
                {
                    if (UpgradePointsMod.instance.specialUpgrades[49].bought)
                    {
                        if (UpgradePointsMod.instance.specialUpgrades[50].bought)
                        {
                            if (UpgradePointsMod.instance.specialUpgrades[36].bought)
                            {
                                if (UpgradePointsMod.instance.specialUpgrades[90].bought)
                                {
                                    if (UpgradePointsMod.instance.specialUpgrades[91].bought)
                                    {
                                        if (UpgradePointsMod.instance.specialUpgrades[92].bought)
                                        {
                                            if (UpgradePointsMod.instance.specialUpgrades[93].bought)
                                            {
                                                if (UpgradePointsMod.instance.specialUpgrades[94].bought)
                                                {
                                                    if (UpgradePointsMod.instance.specialUpgrades[95].bought)
                                                    {
                                                        a *= 35;
                                                    }
                                                    else
                                                    {
                                                        a *= 32.5f;
                                                    }
                                                }
                                                else
                                                {
                                                    a *= 30f;
                                                }
                                            }
                                            else
                                            {
                                                a *= 27f;
                                            }
                                        }
                                        else
                                        {
                                            a *= 24f;
                                        }
                                    }
                                    else
                                    {
                                        a *= 20f;
                                    }
                                }
                                else
                                {
                                    a *= 16f;
                                }
                            }
                            else
                            {
                                a *= 8f;
                            }
                        }
                        else
                        {
                            a *= 3f;
                        }
                    }
                    else
                    {
                        a *= 2f;
                    }
                    if (spearType)
                    {
                        if (UpgradePointsMod.instance.specialUpgrades[30].bought)
                        {
                            a *= 3.5f;
                        }
                    }
                    if (UpgradePointsMod.instance.specialUpgrades[29].bought)
                    {
                        if (UpgradePointsMod.instance.specialUpgrades[89].bought)
                        {
                            a *= 1 + UpgradePointsMod.instance.FocusFireStacks * 0.4f;
                        }
                        else
                        {
                            a *= 1 + UpgradePointsMod.instance.FocusFireStacks * 0.25f;
                        }
                    }
                    if (UpgradePointsMod.instance.specialUpgrades[7].bought)
                    {
                        if (StealthCheck.IsHidden)
                        {
                            if (UpgradePointsMod.instance.specialUpgrades[8].bought)
                            {
                                if (UpgradePointsMod.instance.specialUpgrades[10].bought)
                                {
                                    a *= 15;
                                }
                                else
                                {
                                    a *= 5;
                                }
                            }
                            else
                            {
                                a *= 2;
                            }
                        }
                    }
                    a *= BrawlerUpgrade.DamageBonus + 1;

                    if (UpgradePointsMod.instance.specialUpgrades[33].bought)
                    {
                        float dist = Vector3.Distance(startingpos, target.position);
                        dist /= 20; // every 20 meters
                        a     = a * (1 + dist);
                    }
                    if (UpgradePointsMod.instance.specialUpgrades[48].bought)
                    {
                        if (target.CompareTag("enemyCollide"))
                        {
                            if (UpgradePointsMod.instance.ComboStrikeBonusDamage(UpgradePointsMod.StrikeType.Ranged, target.root))
                            {
                                a *= 4;
                            }
                            UpgradePointsMod.instance.AddToComboStrike(UpgradePointsMod.StrikeType.Melee, target.root);
                        }
                    }
                    if (UpgradePointsMod.instance.specialUpgrades[44].bought)
                    {
                        if (CharacterControllerMod.FloatVelocity < 0.1f)
                        {
                            a *= 3;
                        }
                    }
                }
                a     *= UpgradePointsMod.CritBonus();
                damage = Mathf.RoundToInt(a);
            }
            if (UpgradePointsMod.instance.specialUpgrades[29].bought)
            {
                if (UpgradePointsMod.instance.FocusFireTarget == target.gameObject)
                {
                    if (UpgradePointsMod.instance.specialUpgrades[88].bought)
                    {
                        UpgradePointsMod.instance.FocusFireStacks = Mathf.Clamp(UpgradePointsMod.instance.FocusFireStacks + 1, 0, 100);
                    }
                    else
                    {
                        UpgradePointsMod.instance.FocusFireStacks = Mathf.Clamp(UpgradePointsMod.instance.FocusFireStacks + 1, 0, 20);
                    }
                }
                else
                {
                    UpgradePointsMod.instance.FocusFireStacks = 0;
                    UpgradePointsMod.instance.FocusFireTarget = target.gameObject;
                }
            }



            if (!ignoreCollisionEvents(targetCollider))
            {
                if (!isTrigger)
                {
                    Molotov componentInParent = ((Component)base.transform).GetComponentInParent <Molotov>();
                    if ((bool)componentInParent)
                    {
                        componentInParent.IncendiaryBreak();
                    }
                }
                bool headDamage = false;
                if (target.gameObject.layer == LayerMask.NameToLayer("Water"))
                {
                    FMODCommon.PlayOneshotNetworked(hitWaterEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
                else if (target.CompareTag("SmallTree"))
                {
                    FMODCommon.PlayOneshotNetworked(hitBushEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
                if (target.CompareTag("PlaneHull"))
                {
                    FMODCommon.PlayOneshotNetworked(hitMetalEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
                if (target.CompareTag("Tree") || target.root.CompareTag("Tree") || target.CompareTag("Target"))
                {
                    if (spearType)
                    {
                        base.StartCoroutine(HitTree(hit.point - base.transform.forward * 2.1f));
                    }
                    else if (hitPointUpdated)
                    {
                        base.StartCoroutine(HitTree(hit.point - base.transform.forward * 0.35f));
                    }
                    else
                    {
                        base.StartCoroutine(HitTree(base.transform.position - base.transform.forward * 0.35f));
                    }
                    disableLive();
                    if (target.CompareTag("Tree") || target.root.CompareTag("Tree"))
                    {
                        TreeHealth component = ((Component)target).GetComponent <TreeHealth>();
                        if (!(bool)component)
                        {
                            component = ((Component)target.root).GetComponent <TreeHealth>();
                        }
                        if ((bool)component)
                        {
                            component.LodTree.AddTreeCutDownTarget(base.gameObject);
                        }
                    }
                }
                else if (target.CompareTag("enemyCollide") || target.tag == "lb_bird" || target.CompareTag("animalCollide") || target.CompareTag("Fish") || target.CompareTag("enemyRoot") || target.CompareTag("animalRoot"))
                {
                    UpgradePointsMod.instance.DoAreaDamage(target.transform.root, damage);

                    bool flag  = target.tag == "lb_bird" || target.CompareTag("lb_bird");
                    bool flag2 = target.CompareTag("Fish");
                    bool flag3 = target.CompareTag("animalCollide") || target.CompareTag("animalRoot");
                    arrowStickToTarget arrowStickToTarget = ((Component)target).GetComponent <arrowStickToTarget>();
                    if (!(bool)arrowStickToTarget)
                    {
                        arrowStickToTarget = ((Component)target.root).GetComponentInChildren <arrowStickToTarget>();
                    }
                    if (!spearType && !flintLockAmmoType && !flag2)
                    {
                        if ((bool)arrowStickToTarget && arrowStickToTarget.enabled)
                        {
                            if (flag)
                            {
                                EventRegistry.Achievements.Publish(TfEvent.Achievements.BirdArrowKill, null);
                            }
                            arrowStickToTarget.CreatureType(flag3, flag, flag2);
                            if (BoltNetwork.isRunning)
                            {
                                if ((bool)at && (bool)at._boltEntity && at._boltEntity.isAttached && at._boltEntity.isOwner)
                                {
                                    headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                                }
                            }
                            else
                            {
                                headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                            }
                        }
                        base.Invoke("destroyMe", 0.1f);
                    }

                    base.StartCoroutine(HitAi(target, flag || flag3, headDamage));
                    if (flag2)
                    {
                        base.StartCoroutine(HitFish(target, hit.point - base.transform.forward * 0.35f));
                    }
                    disableLive();
                }
                else if (target.CompareTag("PlayerNet"))
                {
                    if (BoltNetwork.isRunning)
                    {
                        BoltEntity boltEntity = ((Component)target).GetComponentInParent <BoltEntity>();
                        if (!(bool)boltEntity)
                        {
                            boltEntity = ((Component)target).GetComponent <BoltEntity>();
                        }
                        if ((bool)boltEntity)
                        {
                            HitPlayer.Create(boltEntity, EntityTargets.OnlyOwner).Send();
                            disableLive();
                        }
                    }
                }
                else if (target.CompareTag("TerrainMain") && !LocalPlayer.IsInCaves)
                {
                    if (ignoreTerrain)
                    {
                        ignoreTerrain = false;
                        base.StartCoroutine(RevokeIgnoreTerrain());
                    }
                    else
                    {
                        if (spearType)
                        {
                            if ((bool)bodyCollider)
                            {
                                bodyCollider.isTrigger = true;
                            }
                            base.StartCoroutine(HitStructure(base.transform.position - base.transform.forward * 2.1f, false));
                        }
                        else
                        {
                            Vector3 position2 = base.transform.position - base.transform.forward * -0.8f;
                            float   num       = Terrain.activeTerrain.SampleHeight(base.transform.position);
                            Vector3 position3 = Terrain.activeTerrain.transform.position;
                            float   num2      = num + position3.y;
                            Vector3 position4 = base.transform.position;
                            if (position4.y < num2)
                            {
                                position2.y = num2 + 0.5f;
                            }
                            base.StartCoroutine(HitStructure(position2, false));
                        }
                        disableLive();
                        FMODCommon.PlayOneshotNetworked(hitGroundEvent, base.transform, FMODCommon.NetworkRole.Any);
                    }
                }
                else if (target.CompareTag("structure") || target.CompareTag("jumpObject") || target.CompareTag("SLTier1") || target.CompareTag("SLTier2") || target.CompareTag("SLTier3") || target.CompareTag("UnderfootWood"))
                {
                    if ((bool)target.transform.parent)
                    {
                        if ((bool)((Component)target.transform.parent).GetComponent <StickFenceChunkArchitect>())
                        {
                            return;
                        }
                        if ((bool)((Component)target.transform.parent).GetComponent <BoneFenceChunkArchitect>())
                        {
                            return;
                        }
                    }
                    if (!isTrigger)
                    {
                        if (spearType)
                        {
                            base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 2.1f, true));
                        }
                        else
                        {
                            base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 0.35f, true));
                        }
                        disableLive();
                    }
                }
                else if (target.CompareTag("CaveDoor"))
                {
                    ignoreTerrain = true;
                    Physics.IgnoreCollision(base.GetComponent <Collider>(), ((Component)Terrain.activeTerrain).GetComponent <Collider>(), true);
                }
                else if (flintLockAmmoType && (target.CompareTag("BreakableWood") || target.CompareTag("BreakableRock")))
                {
                    target.SendMessage("Hit", 40, SendMessageOptions.DontRequireReceiver);
                }
                if (!Live)
                {
                    destroyThisAmmo();
                    parent.BroadcastMessage("OnArrowHit", SendMessageOptions.DontRequireReceiver);
                }
            }
        }
コード例 #9
0
        public override void OnEvent(PlayerHitEnemy ev)
        {
            //this needed to be changed.
            //the command would send damage using hitReal - pure damage.
            //this made clients attack ignore armor and deal too much dmg
            if (!this.ValidateSender(ev, SenderTypes.Any))
            {
                return;
            }
            if (!ev.Target)
            {
                return;
            }
            if (ev.Hit == 0)
            {
                return;
            }
            try
            {
                if (EnemyHealth.CurrentAttacker == null)
                {
                    EnemyHealth.CurrentAttacker = ev.Target;
                }
                var packed = ev.Target.networkId.PackedValue;
                if (EnemyManager.hostDictionary.ContainsKey(packed))
                {
                    var enemy = EnemyManager.hostDictionary[packed];
                    if (ev.explosion)
                    {
                        enemy.HealthScript.Explosion(-1);
                    }
                    if (ev.Burn)
                    {
                        enemy.HealthScript.Burn();
                    }
                    if (ev.getAttackerType == DamageMath.SILENTattackerType)
                    {
                        //ghost hit
                        float damage = BitConverter.ToSingle(BitConverter.GetBytes(ev.Hit), 0);
                        enemy.HitPhysicalSilent(damage);
                    }
                    else if (ev.getAttackerType == DamageMath.SILENTattackerTypeMagic)
                    {
                        //ghost hit
                        float damage = BitConverter.ToSingle(BitConverter.GetBytes(ev.Hit), 0);
                        enemy.HitMagic(damage);
                    }
                    else if (ev.getAttackerType == DamageMath.PURE)
                    {
                        float damage = BitConverter.ToSingle(BitConverter.GetBytes(ev.Hit), 0);
                        enemy.HitPure(damage);
                    }
                    else
                    {
                        if (ev.Hit > 0)
                        {
                            float damage = ev.getAttackerType >= DamageMath.CONVERTEDFLOATattackerType ? BitConverter.ToSingle(BitConverter.GetBytes(ev.Hit), 0) : ev.Hit;
                            if (ev.getAttackerType >= DamageMath.CONVERTEDFLOATattackerType)
                            {
                                ev.getAttackerType -= DamageMath.CONVERTEDFLOATattackerType;
                            }
                            //just in case i ever need this
                            //this is how to get the player object which raised the event (ev.RaisedBy.UserData as BoltEntity)
                            enemy.HealthScript.getAttackDirection(ev.getAttackerType);
                            var attackerGO = (ev.RaisedBy.UserData as BoltEntity).gameObject;
                            enemy.setup.search.switchToNewTarget(attackerGO);
                            enemy.setup.hitReceiver.getAttackDirection(ev.getAttackDirection);
                            enemy.setup.hitReceiver.getCombo(ev.getCombo);
                            enemy.HealthScript.takeDamage(ev.takeDamage);
                            enemy.HealthScript.setSkinDamage(1);
                            enemy.HitPhysical(damage);
                        }
                        else
                        {
                            ModAPI.Console.Write("The good armor reduction");
                            enemy.ReduceArmor(-ev.Hit);
                        }
                    }
                    return;
                }

                //F**k all of this spaghetti below
                lb_Bird   component           = ev.Target.GetComponent <lb_Bird>();
                Fish      componentInChildren = ev.Target.GetComponentInChildren <Fish>();
                Transform transform;
                if (componentInChildren)
                {
                    transform = componentInChildren.transform;
                }
                else if (ev.Target.GetComponent <animalHealth>())
                {
                    transform = ev.Target.transform;
                }
                else if (component)
                {
                    transform = component.transform;
                }
                else
                {
                    EnemyHealth componentInChildren2 = ev.Target.GetComponentInChildren <EnemyHealth>();
                    transform = componentInChildren2 ? componentInChildren2.transform : ev.Target.transform.GetChild(0);
                }
                if (ev.getAttacker == 10 && ev.Weapon)
                {
                    ArrowDamage componentInChildren3 = ev.Weapon.GetComponentInChildren <ArrowDamage>();
                    if (componentInChildren3.Live)
                    {
                        arrowStickToTarget componentInChildren4 = transform.GetComponentInChildren <arrowStickToTarget>();
                        Transform          target = transform;
                        if (componentInChildren4)
                        {
                            target = componentInChildren4.transform;
                        }
                        componentInChildren3.CheckHit(Vector3.zero, target, false, transform.GetComponent <Collider>());
                    }
                }
                if (ev.explosion)
                {
                    transform.SendMessage("Explosion", -1, SendMessageOptions.DontRequireReceiver);
                }
                if (ev.HitHead)
                {
                    transform.SendMessage("HitHead", SendMessageOptions.DontRequireReceiver);
                }
                if (ev.getStealthAttack)
                {
                    transform.SendMessage("getStealthAttack", SendMessageOptions.DontRequireReceiver);
                }
                float dmg = ev.getAttackerType >= DamageMath.CONVERTEDFLOATattackerType ? BitConverter.ToSingle(BitConverter.GetBytes(ev.Hit), 0) : ev.Hit;
                if (ev.hitFallDown)
                {
                    mutantHitReceiver componentInChildren5 = transform.GetComponentInChildren <mutantHitReceiver>();
                    if (componentInChildren5)
                    {
                        componentInChildren5.sendHitFallDown(dmg);
                    }
                }
                else
                {
                    if (ev.Hit > 0)
                    {
                        transform.SendMessage("getAttacker", (ev.RaisedBy.UserData as BoltEntity).gameObject, SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("getAttackerType", ev.getAttackerType, SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("getAttackDirection", ev.getAttackDirection, SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("getCombo", ev.getCombo, SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("takeDamage", ev.takeDamage, SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("setSkinDamage", UnityEngine.Random.Range(0, 3), SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("ApplyAnimalSkinDamage", ev.getAttackDirection, SendMessageOptions.DontRequireReceiver);
                        transform.SendMessage("Hit", dmg, SendMessageOptions.DontRequireReceiver);
                        if (ev.HitAxe)
                        {
                            transform.SendMessage("HitAxe", SendMessageOptions.DontRequireReceiver);
                        }
                        if (ev.Burn)
                        {
                            transform.SendMessage("Burn", SendMessageOptions.DontRequireReceiver);
                        }
                    }
                    else
                    {
                        ModAPI.Console.Write("The bad armor reduction");
                        transform.SendMessage("ReduceArmor", -dmg, SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
            finally
            {
                EnemyHealth.CurrentAttacker = null;
            }
        }
コード例 #10
0
        public override void CheckHit(Vector3 position, Transform target, bool isTrigger, Collider targetCollider)
        {
            if (ignoreCollisionEvents(targetCollider) && !target.CompareTag("enemyRoot"))
            {
                return;
            }
            if (!isTrigger)
            {
                Molotov componentInParent = transform.GetComponentInParent <Molotov>();
                if ((bool)componentInParent)
                {
                    componentInParent.IncendiaryBreak();
                    return;
                }
            }
            bool headDamage = false;

            if (target.gameObject.layer == LayerMask.NameToLayer("Water"))
            {
                FMODCommon.PlayOneshotNetworked(hitWaterEvent, base.transform, FMODCommon.NetworkRole.Any);
                return;
            }
            else if (target.CompareTag("SmallTree"))
            {
                FMODCommon.PlayOneshotNetworked(hitBushEvent, base.transform, FMODCommon.NetworkRole.Any);
                return;
            }
            else if (target.CompareTag("PlaneHull"))
            {
                FMODCommon.PlayOneshotNetworked(hitMetalEvent, base.transform, FMODCommon.NetworkRole.Any);
                return;
            }
            else if (target.CompareTag("Tree") || target.root.CompareTag("Tree") || target.CompareTag("Target"))
            {
                if (spearType)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 2.1f));
                }
                else if (hitPointUpdated)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 0.35f));
                }
                else
                {
                    base.StartCoroutine(HitTree(base.transform.position - base.transform.forward * 0.35f));
                }
                disableLive();
                if (target.CompareTag("Tree") || target.root.CompareTag("Tree"))
                {
                    TreeHealth component = target.GetComponent <TreeHealth>();
                    if (!(bool)component)
                    {
                        component = target.root.GetComponent <TreeHealth>();
                    }
                    if ((bool)component)
                    {
                        component.LodTree.AddTreeCutDownTarget(base.gameObject);
                    }
                }
                return;
            }
            else if (target.CompareTag("enemyCollide") || target.tag == "lb_bird" || target.CompareTag("animalCollide") || target.CompareTag("Fish") || target.CompareTag("enemyRoot") || target.CompareTag("animalRoot"))
            {
                if (lastPierced != null)
                {
                    if (target.root == lastPierced)
                    {
                        Physics.IgnoreCollision(base.GetComponent <Collider>(), targetCollider);
                        return;
                    }
                }
                bool  pierce       = false;
                float pierceChance = ModdedPlayer.Stats.projectilePierceChance - pierceCount;
                if (pierceChance > 0)
                {
                    if (pierceChance >= 1 || pierceChance < Random.value)
                    {
                        Physics.IgnoreCollision(base.GetComponent <Collider>(), targetCollider);
                        pierceCount++;
                        lastPierced = target.root;
                        Invoke("ForgetLastPierced", 0.125f);
                        pierce = true;
                    }
                }
                if (crossbowBoltType)
                {
                }
                else if (flintLockAmmoType)
                {
                }
                else if (spearType)
                {
                }
                else
                {
                    if (ModdedPlayer.Stats.i_CrossfireQuiver.value)
                    {
                        if (Time.time - ModdedPlayer.instance._lastCrossfireTime > 10 * ModdedPlayer.Stats.cooldown)
                        {
                            ModdedPlayer.instance._lastCrossfireTime = Time.time;
                            Vector3 pos = Camera.main.transform.position + Camera.main.transform.right * 5;
                            Vector3 dir = transform.position - pos;
                            dir.Normalize();
                            SpellActions.CastMagicArrow(pos, dir);
                        }
                    }
                }

                arrowStickToTarget arrowStickToTarget = target.GetComponent <arrowStickToTarget>();
                if (!(bool)arrowStickToTarget)
                {
                    arrowStickToTarget = target.root.GetComponentInChildren <arrowStickToTarget>();
                }

                bool isbird   = target.tag == "lb_bird" || target.CompareTag("lb_bird");
                bool isfish   = target.CompareTag("Fish");
                bool isanimal = target.CompareTag("animalCollide") || target.CompareTag("animalRoot");
                if (!spearType && !flintLockAmmoType && !isfish)
                {
                    if (arrowStickToTarget && arrowStickToTarget.enabled)
                    {
                        if (isbird)
                        {
                            EventRegistry.Achievements.Publish(TfEvent.Achievements.BirdArrowKill, null);
                        }
                        arrowStickToTarget.CreatureType(isanimal, isbird, isfish);
                        if (SpellActions.SeekingArrow_ChangeTargetOnHit)
                        {
                            startposition = transform.position;
                        }

                        if (BoltNetwork.isRunning)
                        {
                            if (at && at._boltEntity && at._boltEntity.isAttached && at._boltEntity.isOwner)
                            {
                                if (pierce)
                                {
                                    headDamage = ((XArrowStickToTargetMod)arrowStickToTarget).checkHeadDamage(transform);
                                }
                                else
                                {
                                    headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                                }
                            }
                        }
                        else
                        {
                            if (pierce)
                            {
                                headDamage = ((XArrowStickToTargetMod)arrowStickToTarget).checkHeadDamage(transform);
                            }
                            headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                        }
                    }
                    if ((bool)arrowStickToTarget && !pierce)
                    {
                        Destroy(parent.gameObject);
                    }
                }
                else
                {
                    if (SpellActions.SeekingArrow_ChangeTargetOnHit)
                    {
                        ModdedPlayer.Stats.spell_seekingArrow.value = true;
                        SpellActions.SeekingArrow_Target.gameObject.SetActive(true);
                        SpellActions.SeekingArrow_Target.parent   = target.transform;
                        SpellActions.SeekingArrow_Target.position = new Vector3(target.transform.position.x, transform.position.y - 0.075f, target.transform.position.z);
                        SpellActions.SeekingArrow_TimeStamp       = Time.time;
                        startposition = transform.position;
                        SpellActions.SeekingArrow_ChangeTargetOnHit = false;
                    }
                }
                if (headDamage && !flintLockAmmoType && ModdedPlayer.Stats.perk_trueAim && ModdedPlayer.Stats.spell_seekingArrow)
                {
                    //True aim ability
                    float dist = (startposition - transform.position).sqrMagnitude;
                    if (dist >= 3600f)
                    {
                        OutputDmg *= 4;
                        NewHitAi(target, isbird || isanimal, headDamage);
                        ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                        ModdedPlayer.instance.OnHit();
                        ModdedPlayer.instance.OnHit_Ranged(target);
                        BuffDB.AddBuff(28, 104, 1.20f, 5);                              //crit chance
                        if (ModdedPlayer.Stats.perk_trueAimUpgrade && dist >= 14400f)
                        {
                            OutputDmg *= 10;

                            NewHitAi(target, isbird || isanimal, headDamage);
                            NewHitAi(target, isbird || isanimal, headDamage);
                            ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                            ModdedPlayer.instance.OnHit();
                            ModdedPlayer.instance.OnHit_Ranged(target);
                            ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                            ModdedPlayer.instance.OnHit();
                            ModdedPlayer.instance.OnHit_Ranged(target);
                        }
                    }
                }



                NewHitAi(target, isbird || isanimal, headDamage);
                ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                ModdedPlayer.instance.OnHit();
                ModdedPlayer.instance.OnHit_Ranged(target);
                BoltEntity be = target.GetComponentInParent <BoltEntity>();
                if (be == null)
                {
                    be = target.GetComponent <BoltEntity>();
                }

                if (ModdedPlayer.Stats.perk_fireDmgIncreaseOnHit)
                {
                    int   myID = 1000 + ModReferences.Players.IndexOf(LocalPlayer.GameObject);
                    float dmg  = 1 + ModdedPlayer.Stats.spellFlatDmg / 3;
                    dmg *= ModdedPlayer.Stats.TotalMagicDamageMultiplier;
                    dmg *= ModdedPlayer.Stats.fireDamage + 1;
                    dmg *= 0.3f;
                    if (GameSetup.IsSinglePlayer || GameSetup.IsMpServer)
                    {
                        target.GetComponentInParent <EnemyProgression>()?.FireDebuff(myID, dmg, 14);
                    }
                    else
                    {
                        if (be != null)
                        {
                            using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                            {
                                using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                {
                                    w.Write(27);
                                    w.Write(be.networkId.PackedValue);
                                    w.Write(dmg);
                                    w.Write(14.5f);
                                    w.Write(1);
                                    w.Close();
                                }
                                ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.OnlyServer);
                                answerStream.Close();
                            }
                        }
                    }
                }
                if (ModdedPlayer.Stats.TotalRangedArmorPiercing > 0 && target.gameObject.CompareTag("enemyCollide"))
                {
                    if (ModdedPlayer.Stats.perk_thrownSpearExtraArmorReduction && spearType)
                    {
                        if (BoltNetwork.isClient)
                        {
                            if (be != null)
                            {
                                EnemyProgression.ReduceArmor(be, ModdedPlayer.Stats.TotalRangedArmorPiercing * 2 + ModdedPlayer.Stats.TotalMeleeArmorPiercing);
                            }
                        }
                        else if (EnemyManager.enemyByTransform.ContainsKey(target.root))
                        {
                            var prog = EnemyManager.enemyByTransform[target.root];
                            prog.ReduceArmor(ModdedPlayer.Stats.TotalRangedArmorPiercing * 2 + ModdedPlayer.Stats.TotalMeleeArmorPiercing);
                        }
                    }
                    else
                    {
                        if (BoltNetwork.isClient)
                        {
                            if (be != null)
                            {
                                EnemyProgression.ReduceArmor(be, ModdedPlayer.Stats.TotalRangedArmorPiercing);
                            }
                        }
                        else if (EnemyManager.enemyByTransform.ContainsKey(target.root))
                        {
                            var prog = EnemyManager.enemyByTransform[target.root];
                            prog.ReduceArmor(ModdedPlayer.Stats.TotalRangedArmorPiercing);
                        }
                    }
                }
                if (isfish)
                {
                    base.StartCoroutine(HitFish(target, hit.point - base.transform.forward * 0.35f));
                }
                //check piercing

                if (pierce)
                {
                    return;
                }
                Live = false;
                disableLive();
                DisableFlight();
            }
            else if (target.CompareTag("PlayerNet"))
            {
                if (BoltNetwork.isRunning)
                {
                    BoltEntity be = target.GetComponentInParent <BoltEntity>();
                    if (!(bool)be)
                    {
                        be = target.GetComponent <BoltEntity>();
                    }

                    if (be)
                    {
                        if (ModdedPlayer.Stats.i_ArchangelBow && GreatBow.isEnabled)
                        {
                            float lifePerSecond = (ModdedPlayer.Stats.healthRecoveryPerSecond) * ModdedPlayer.Stats.allRecoveryMult * (ModdedPlayer.Stats.healthPerSecRate) * 2;
                            using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                            {
                                using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                {
                                    w.Write(39);
                                    w.Write(be.GetState <IPlayerState>().name);
                                    w.Write(lifePerSecond);
                                    w.Write(ModdedPlayer.Stats.TotalMaxHealth * 0.2f);
                                    w.Close();
                                }
                                AsyncHit.SendCommandDelayed(1, answerStream.ToArray(), Network.NetworkManager.Target.OnlyServer);
                                answerStream.Close();
                            }
                            BuffDB.AddBuff(25, 91, lifePerSecond, 10);
                        }
                        else if (ModSettings.FriendlyFire)
                        {
                            float dmgUnclamped = this.OutputDmg;
                            if (ModdedPlayer.Stats.spell_seekingArrow)
                            {
                                float dist = Vector3.Distance(target.position, startposition);
                                dmgUnclamped *= 1 + dist * ModdedPlayer.Stats.spell_seekingArrow_DamagePerDistance;
                            }
                            if (spearType)
                            {
                                if (ModdedPlayer.Stats.perk_thrownSpearhellChance > 0 && Random.value <= ModdedPlayer.Stats.perk_thrownSpearhellChance && OutputDmg > 1)
                                {
                                    var obj = Instantiate(PhysicBody, Camera.main.transform.position + Vector3.up * 2f, Quaternion.LookRotation(PhysicBody.position - Camera.main.transform.position));
                                    obj.velocity = PhysicBody.velocity.normalized * 90f * ModdedPlayer.Stats.projectileSpeed;
                                    Destroy(obj.gameObject, 18);
                                }
                            }

                            if (headDamage || (flintLockAmmoType && Random.value <= ModdedPlayer.Stats.perk_bulletCritChance) || (spearType && Random.value <= ModdedPlayer.Stats.perk_thrownSpearhellChance))
                            {
                                headDamage    = true;
                                dmgUnclamped *= ModdedPlayer.Stats.headShotDamage;
                                dmgUnclamped *= SpellActions.FocusOnHeadShot();
                                if (ModdedPlayer.Stats.spell_seekingArrow)
                                {
                                    dmgUnclamped *= ModdedPlayer.Stats.spell_seekingArrow_HeadDamage;
                                }
                            }
                            else
                            {
                                dmgUnclamped *= SpellActions.FocusOnBodyShot();
                            }

                            DamageMath.ReduceDamageToSendOverNet(dmgUnclamped, out int sendDamage, out int reps);

                            HitPlayer HP = HitPlayer.Create(be, EntityTargets.Everyone);
                            HP.damage = sendDamage;
                            for (int i = 0; i < reps; i++)
                            {
                                HP.Send();
                            }
                            //check piercing
                            float pierceChance = ModdedPlayer.Stats.projectilePierceChance - pierceCount;
                            if (pierceChance > 0)
                            {
                                if (pierceChance >= 1 || pierceChance < Random.value)
                                {
                                    Physics.IgnoreCollision(base.GetComponent <Collider>(), targetCollider);
                                    pierceCount++;
                                    return;
                                }
                            }
                            disableLive();
                            DisableFlight();
                        }
                    }
                }
            }
            else if (target.CompareTag("TerrainMain") && !LocalPlayer.IsInCaves)
            {
                if (ignoreTerrain)
                {
                    ignoreTerrain = false;
                    base.StartCoroutine(RevokeIgnoreTerrain());
                }
                else
                {
                    if (spearType)
                    {
                        if ((bool)bodyCollider)
                        {
                            bodyCollider.isTrigger = true;
                        }
                        base.StartCoroutine(HitStructure(base.transform.position - base.transform.forward * 2.1f, false));
                    }
                    else
                    {
                        Vector3 position2 = base.transform.position - base.transform.forward * -0.8f;
                        float   num       = Terrain.activeTerrain.SampleHeight(base.transform.position);
                        Vector3 position3 = Terrain.activeTerrain.transform.position;
                        float   num2      = num + position3.y;
                        Vector3 position4 = base.transform.position;
                        if (position4.y < num2)
                        {
                            position2.y = num2 + 0.5f;
                        }
                        base.StartCoroutine(HitStructure(position2, false));
                    }
                    disableLive();
                    FMODCommon.PlayOneshotNetworked(hitGroundEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
            }
            else if (target.CompareTag("structure") || target.CompareTag("jumpObject") || target.CompareTag("SLTier1") || target.CompareTag("SLTier2") || target.CompareTag("SLTier3") || target.CompareTag("UnderfootWood"))
            {
                if ((bool)target.transform.parent)
                {
                    if ((bool)target.transform.parent.GetComponent <StickFenceChunkArchitect>())
                    {
                        return;
                    }
                    if ((bool)target.transform.parent.GetComponent <BoneFenceChunkArchitect>())
                    {
                        return;
                    }
                }
                if (!isTrigger)
                {
                    if (spearType)
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 2.1f, true));
                    }
                    else
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 0.35f, true));
                    }
                    disableLive();
                }
            }
            else if (target.CompareTag("CaveDoor"))
            {
                ignoreTerrain = true;
                Physics.IgnoreCollision(base.GetComponent <Collider>(), Terrain.activeTerrain.GetComponent <Collider>(), true);
            }
            else if (flintLockAmmoType && (target.CompareTag("BreakableWood") || target.CompareTag("BreakableRock")))
            {
                target.SendMessage("Hit", 40, SendMessageOptions.DontRequireReceiver);
            }
            if (!Live)
            {
                destroyThisAmmo();
                parent.BroadcastMessage("OnArrowHit", SendMessageOptions.DontRequireReceiver);
            }
        }
コード例 #11
0
        public override void CheckHit(Vector3 position, Transform target, bool isTrigger, Collider targetCollider)
        {
            if (ignoreCollisionEvents(targetCollider) && !target.CompareTag("enemyRoot"))
            {
                return;
            }
            if (!isTrigger)
            {
                Molotov componentInParent = transform.GetComponentInParent <Molotov>();
                if ((bool)componentInParent)
                {
                    componentInParent.IncendiaryBreak();
                }
            }
            bool headDamage = false;

            if (target.gameObject.layer == LayerMask.NameToLayer("Water"))
            {
                FMODCommon.PlayOneshotNetworked(hitWaterEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            else if (target.CompareTag("SmallTree"))
            {
                FMODCommon.PlayOneshotNetworked(hitBushEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            if (target.CompareTag("PlaneHull"))
            {
                FMODCommon.PlayOneshotNetworked(hitMetalEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            if (target.CompareTag("Tree") || target.root.CompareTag("Tree") || target.CompareTag("Target"))
            {
                if (spearType)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 2.1f));
                }
                else if (hitPointUpdated)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 0.35f));
                }
                else
                {
                    base.StartCoroutine(HitTree(base.transform.position - base.transform.forward * 0.35f));
                }
                disableLive();
                if (target.CompareTag("Tree") || target.root.CompareTag("Tree"))
                {
                    TreeHealth component = target.GetComponent <TreeHealth>();
                    if (!(bool)component)
                    {
                        component = target.root.GetComponent <TreeHealth>();
                    }
                    if ((bool)component)
                    {
                        component.LodTree.AddTreeCutDownTarget(base.gameObject);
                    }
                }
            }
            else if (target.CompareTag("enemyCollide") || target.tag == "lb_bird" || target.CompareTag("animalCollide") || target.CompareTag("Fish") || target.CompareTag("enemyRoot") || target.CompareTag("animalRoot"))
            {
                if (crossbowBoltType)
                {
                }
                else if (flintLockAmmoType)
                {
                }
                else if (spearType)
                {
                }
                else
                {
                    if (ModdedPlayer.instance.IsCrossfire)
                    {
                        if (Time.time - ModdedPlayer.instance.LastCrossfireTime > 10)
                        {
                            ModdedPlayer.instance.LastCrossfireTime = Time.time;
                            float damage1 = 55 + ModdedPlayer.instance.SpellDamageBonus * 1.25f;
                            damage1 = damage1 * ModdedPlayer.instance.SpellAMP;
                            Vector3 pos = Camera.main.transform.position + Camera.main.transform.right * 5;
                            Vector3 dir = transform.position - pos;
                            dir.Normalize();
                            if (GameSetup.IsSinglePlayer || GameSetup.IsMpServer)
                            {
                                MagicArrow.Create(pos, dir, damage1, ModReferences.ThisPlayerID, SpellActions.MagicArrowDuration, SpellActions.MagicArrowDoubleSlow, SpellActions.MagicArrowDmgDebuff);
                                if (BoltNetwork.isRunning)
                                {
                                    using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                                    {
                                        using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                        {
                                            w.Write(3);
                                            w.Write(7);
                                            w.Write(pos.x);
                                            w.Write(pos.y);
                                            w.Write(pos.z);
                                            w.Write(dir.x);
                                            w.Write(dir.y);
                                            w.Write(dir.z);
                                            w.Write(damage1);
                                            w.Write(ModReferences.ThisPlayerID);
                                            w.Write(SpellActions.MagicArrowDuration);
                                            w.Write(SpellActions.MagicArrowDoubleSlow);
                                            w.Write(SpellActions.MagicArrowDmgDebuff);

                                            w.Close();
                                        }
                                        ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Others);
                                        answerStream.Close();
                                    }
                                }
                            }
                            else if (GameSetup.IsMpClient)
                            {
                                MagicArrow.CreateEffect(pos, dir, SpellActions.MagicArrowDmgDebuff, SpellActions.MagicArrowDuration);
                                using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                                {
                                    using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                    {
                                        w.Write(3);
                                        w.Write(7);
                                        w.Write(pos.x);
                                        w.Write(pos.y);
                                        w.Write(pos.z);
                                        w.Write(dir.x);
                                        w.Write(dir.y);
                                        w.Write(dir.z);
                                        w.Write(damage1);
                                        w.Write(ModReferences.ThisPlayerID);
                                        w.Write(SpellActions.MagicArrowDuration);
                                        w.Write(SpellActions.MagicArrowDoubleSlow);
                                        w.Write(SpellActions.MagicArrowDmgDebuff);

                                        w.Close();
                                    }
                                    ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Others);
                                    answerStream.Close();
                                }
                            }
                        }
                    }
                }
                bool flag  = target.tag == "lb_bird" || target.CompareTag("lb_bird");
                bool flag2 = target.CompareTag("Fish");
                bool flag3 = target.CompareTag("animalCollide") || target.CompareTag("animalRoot");
                arrowStickToTarget arrowStickToTarget = target.GetComponent <arrowStickToTarget>();
                if (!(bool)arrowStickToTarget)
                {
                    arrowStickToTarget = target.root.GetComponentInChildren <arrowStickToTarget>();
                }
                if (!spearType && !flintLockAmmoType && !flag2)
                {
                    if (arrowStickToTarget && arrowStickToTarget.enabled)
                    {
                        if (flag)
                        {
                            EventRegistry.Achievements.Publish(TfEvent.Achievements.BirdArrowKill, null);
                        }
                        arrowStickToTarget.CreatureType(flag3, flag, flag2);
                        if (BoltNetwork.isRunning)
                        {
                            if (at && at._boltEntity && at._boltEntity.isAttached && at._boltEntity.isOwner)
                            {
                                headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                            }
                        }
                        else
                        {
                            headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                        }
                    }
                    if ((bool)arrowStickToTarget)
                    {
                        base.Invoke("destroyMe", 0.1f);
                    }
                }
                if (SpellActions.SeekingArrow_ChangeTargetOnHit)
                {
                    SpellActions.SeekingArrow = true;
                    SpellActions.SeekingArrow_Target.gameObject.SetActive(true);
                    SpellActions.SeekingArrow_Target.transform.parent   = target.transform;
                    SpellActions.SeekingArrow_Target.transform.position = new Vector3(target.transform.position.x, transform.position.y - 0.075f, target.transform.position.z);
                    SpellActions.SeekingArrow_TimeStamp = Time.time;
                    startposition = transform.position;
                    SpellActions.SeekingArrow_ChangeTargetOnHit = false;
                }
                if (headDamage && !flintLockAmmoType && ModdedPlayer.instance.TrueAim && SpellActions.SeekingArrow)
                {
                    float dist = (startposition - transform.position).sqrMagnitude;
                    if (dist >= 3600f)
                    {
                        OutputDmg *= 4;
                        NewHitAi(target, flag || flag3, headDamage);
                        ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                        ModdedPlayer.instance.OnHit();
                        ModdedPlayer.instance.OnHit_Ranged(target);
                        if (ModdedPlayer.instance.TrueAimUpgrade && dist >= 14400f)
                        {
                            OutputDmg *= 10;

                            NewHitAi(target, flag || flag3, headDamage);
                            NewHitAi(target, flag || flag3, headDamage);
                            ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                            ModdedPlayer.instance.OnHit();
                            ModdedPlayer.instance.OnHit_Ranged(target);
                            ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                            ModdedPlayer.instance.OnHit();
                            ModdedPlayer.instance.OnHit_Ranged(target);
                        }
                    }
                }

                NewHitAi(target, flag || flag3, headDamage);
                ModdedPlayer.instance.DoAreaDamage(target.root, OutputDmg);
                ModdedPlayer.instance.OnHit();
                ModdedPlayer.instance.OnHit_Ranged(target);
                BoltEntity be = target.GetComponentInParent <BoltEntity>();
                if (be == null)
                {
                    be = target.GetComponent <BoltEntity>();
                }

                if (ModdedPlayer.instance.SpellAmpFireDmg)
                {
                    int   myID = 1000 + ModReferences.Players.IndexOf(LocalPlayer.GameObject);
                    float dmg  = 1 + ModdedPlayer.instance.SpellDamageBonus / 3;
                    dmg *= ModdedPlayer.instance.SpellAMP;
                    dmg *= ModdedPlayer.instance.FireAmp + 1;
                    dmg *= 0.3f;
                    if (GameSetup.IsSinglePlayer || GameSetup.IsMpServer)
                    {
                        target.GetComponentInParent <EnemyProgression>()?.FireDebuff(myID, dmg, 14);
                    }
                    else
                    {
                        if (be != null)
                        {
                            using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                            {
                                using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                {
                                    w.Write(27);
                                    w.Write(be.networkId.PackedValue);
                                    w.Write(dmg);
                                    w.Write(14.5f);
                                    w.Write(1);
                                    w.Close();
                                }
                                ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.OnlyServer);
                                answerStream.Close();
                            }
                        }
                    }
                }
                if (ModdedPlayer.instance.RangedArmorReduction > 0 && target.gameObject.CompareTag("enemyCollide"))
                {
                    if (BoltNetwork.isClient)
                    {
                        if (be != null)
                        {
                            EnemyProgression.ReduceArmor(be, ModdedPlayer.instance.RangedArmorReduction);
                        }
                    }
                    else
                    {
                        target.transform.SendMessageUpwards("ReduceArmor", ModdedPlayer.instance.RangedArmorReduction, SendMessageOptions.DontRequireReceiver);
                    }
                }
                if (flag2)
                {
                    base.StartCoroutine(HitFish(target, hit.point - base.transform.forward * 0.35f));
                }
                disableLive();
            }
            else if (target.CompareTag("PlayerNet"))
            {
                if (BoltNetwork.isRunning)
                {
                    BoltEntity be = target.GetComponentInParent <BoltEntity>();
                    if (!(bool)be)
                    {
                        be = target.GetComponent <BoltEntity>();
                    }



                    if (be)
                    {
                        if (ModdedPlayer.instance.ArchangelBow && GreatBow.isEnabled)
                        {
                            using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                            {
                                using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                                {
                                    w.Write(39);
                                    w.Write(be.GetState <IPlayerState>().name);
                                    w.Write((ModdedPlayer.instance.LifeRegen) * ModdedPlayer.instance.HealingMultipier * (1 + ModdedPlayer.instance.HealthRegenPercent));
                                    w.Write(ModdedPlayer.instance.MaxHealth * 0.25f);
                                    w.Close();
                                }
                                AsyncHit.SendCommandDelayed(1, answerStream.ToArray(), Network.NetworkManager.Target.OnlyServer);
                                answerStream.Close();
                            }
                        }
                        else if (ModSettings.FriendlyFire)
                        {
                            float dmgUnclamped = this.OutputDmg;
                            if (SpellActions.SeekingArrow)
                            {
                                float dist = Vector3.Distance(target.position, startposition);
                                dmgUnclamped *= 1 + dist * SpellActions.SeekingArrow_DamagePerDistance;
                            }
                            if (spearType)
                            {
                                if (ModdedPlayer.instance.SpearhellChance > 0 && Random.value <= ModdedPlayer.instance.SpearhellChance && OutputDmg > 1)
                                {
                                    var obj = Instantiate(PhysicBody, Camera.main.transform.position + Vector3.up * 2f, Quaternion.LookRotation(Camera.main.transform.forward));
                                    obj.velocity = PhysicBody.velocity * 1.05f;
                                    Destroy(obj.gameObject, 30);
                                }
                            }
                            else
                            {
                                if (headDamage)
                                {
                                    if (ModdedPlayer.instance.EruptionBow && GreatBow.isEnabled)
                                    {
                                        //if (GameSetup.IsMultiplayer)
                                        //{
                                        BoltNetwork.Instantiate(BoltPrefabs.instantDynamite, transform.position, Quaternion.identity);
                                        //}
                                    }
                                }
                            }

                            if (headDamage || (flintLockAmmoType && Random.value <= ModdedPlayer.instance.BulletCritChance) || (spearType && Random.value <= ModdedPlayer.instance.SpearCritChance))
                            {
                                headDamage    = true;
                                dmgUnclamped *= ModdedPlayer.instance.HeadShotDamage;
                                dmgUnclamped *= SpellActions.FocusOnHeadShot();
                                if (SpellActions.SeekingArrow)
                                {
                                    dmgUnclamped *= SpellActions.SeekingArrow_HeadDamage;
                                }
                            }
                            else
                            {
                                dmgUnclamped *= SpellActions.FocusOnBodyShot();
                            }
                            if (GreatBow.isEnabled)
                            {
                                dmgUnclamped *= 2.1f;
                            }
                            dmgUnclamped *= ModdedPlayer.instance.RangedAMP * ModdedPlayer.instance.CritDamageBuff;
                            if (ModdedPlayer.instance.ProjectileDamageIncreasedBySize)
                            {
                                dmgUnclamped *= ModdedPlayer.instance.ProjectileSizeRatio;
                            }

                            DamageMath.DamageClamp(dmgUnclamped, out int sendDamage, out Repetitions);



                            HitPlayer HP = HitPlayer.Create(be, EntityTargets.Everyone);
                            HP.damage = sendDamage;
                            for (int i = 0; i < Repetitions; i++)
                            {
                                HP.Send();
                            }
                            disableLive();
                        }
                    }
                }
            }
            else if (target.CompareTag("TerrainMain") && !LocalPlayer.IsInCaves)
            {
                if (ignoreTerrain)
                {
                    ignoreTerrain = false;
                    base.StartCoroutine(RevokeIgnoreTerrain());
                }
                else
                {
                    if (spearType)
                    {
                        if ((bool)bodyCollider)
                        {
                            bodyCollider.isTrigger = true;
                        }
                        base.StartCoroutine(HitStructure(base.transform.position - base.transform.forward * 2.1f, false));
                    }
                    else
                    {
                        Vector3 position2 = base.transform.position - base.transform.forward * -0.8f;
                        float   num       = Terrain.activeTerrain.SampleHeight(base.transform.position);
                        Vector3 position3 = Terrain.activeTerrain.transform.position;
                        float   num2      = num + position3.y;
                        Vector3 position4 = base.transform.position;
                        if (position4.y < num2)
                        {
                            position2.y = num2 + 0.5f;
                        }
                        base.StartCoroutine(HitStructure(position2, false));
                    }
                    disableLive();
                    FMODCommon.PlayOneshotNetworked(hitGroundEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
            }
            else if (target.CompareTag("structure") || target.CompareTag("jumpObject") || target.CompareTag("SLTier1") || target.CompareTag("SLTier2") || target.CompareTag("SLTier3") || target.CompareTag("UnderfootWood"))
            {
                if ((bool)target.transform.parent)
                {
                    if ((bool)target.transform.parent.GetComponent <StickFenceChunkArchitect>())
                    {
                        return;
                    }
                    if ((bool)target.transform.parent.GetComponent <BoneFenceChunkArchitect>())
                    {
                        return;
                    }
                }
                if (!isTrigger)
                {
                    if (spearType)
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 2.1f, true));
                    }
                    else
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 0.35f, true));
                    }
                    disableLive();
                }
            }
            else if (target.CompareTag("CaveDoor"))
            {
                ignoreTerrain = true;
                Physics.IgnoreCollision(base.GetComponent <Collider>(), Terrain.activeTerrain.GetComponent <Collider>(), true);
            }
            else if (flintLockAmmoType && (target.CompareTag("BreakableWood") || target.CompareTag("BreakableRock")))
            {
                target.SendMessage("Hit", 40, SendMessageOptions.DontRequireReceiver);
            }
            if (!Live)
            {
                destroyThisAmmo();
                parent.BroadcastMessage("OnArrowHit", SendMessageOptions.DontRequireReceiver);
            }
        }
コード例 #12
0
        public override void CheckHit(Vector3 position, Transform target, bool isTrigger, Collider targetCollider)
        {
            if (ignoreCollisionEvents(targetCollider) && !target.CompareTag("enemyRoot"))
            {
                return;
            }
            if (!isTrigger)
            {
                Molotov componentInParent = transform.GetComponentInParent <Molotov>();
                if ((bool)componentInParent)
                {
                    componentInParent.IncendiaryBreak();
                }
            }
            bool headDamage = false;

            if (target.gameObject.layer == LayerMask.NameToLayer("Water"))
            {
                FMODCommon.PlayOneshotNetworked(hitWaterEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            else if (target.CompareTag("SmallTree"))
            {
                FMODCommon.PlayOneshotNetworked(hitBushEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            if (target.CompareTag("PlaneHull"))
            {
                FMODCommon.PlayOneshotNetworked(hitMetalEvent, base.transform, FMODCommon.NetworkRole.Any);
            }
            if (target.CompareTag("Tree") || target.root.CompareTag("Tree") || target.CompareTag("Target"))
            {
                if (spearType)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 2.1f));
                }
                else if (hitPointUpdated)
                {
                    base.StartCoroutine(HitTree(hit.point - base.transform.forward * 0.35f));
                }
                else
                {
                    base.StartCoroutine(HitTree(base.transform.position - base.transform.forward * 0.35f));
                }
                disableLive();
                if (target.CompareTag("Tree") || target.root.CompareTag("Tree"))
                {
                    TreeHealth component = target.GetComponent <TreeHealth>();
                    if (!(bool)component)
                    {
                        component = target.root.GetComponent <TreeHealth>();
                    }
                    if ((bool)component)
                    {
                        component.LodTree.AddTreeCutDownTarget(base.gameObject);
                    }
                }
            }
            else if (target.CompareTag("enemyCollide") || target.tag == "lb_bird" || target.CompareTag("animalCollide") || target.CompareTag("Fish") || target.CompareTag("enemyRoot") || target.CompareTag("animalRoot"))
            {
                if (crossbowBoltType)
                {
                }
                else if (flintLockAmmoType)
                {
                }
                else if (spearType)
                {
                }
                else
                {
                    if (ModdedPlayer.instance.IsCrossfire)
                    {
                        if (Time.time - ModdedPlayer.instance.LastCrossfireTime > 20)
                        {
                            ModdedPlayer.instance.LastCrossfireTime = Time.time;
                            float damage = 55 + ModdedPlayer.instance.SpellDamageBonus * 1.25f;
                            damage = damage * ModdedPlayer.instance.SpellAMP;
                            Vector3 pos = Camera.main.transform.position + Camera.main.transform.right * 5;
                            Vector3 dir = transform.position - pos;
                            dir.Normalize();
                            if (GameSetup.IsSinglePlayer || GameSetup.IsMpServer)
                            {
                                MagicArrow.Create(pos, dir, damage, ModReferences.ThisPlayerPacked, SpellActions.MagicArrowDuration, SpellActions.MagicArrowDoubleSlow, SpellActions.MagicArrowDmgDebuff);
                                if (BoltNetwork.isRunning)
                                {
                                    string s = "SC7;" + System.Math.Round(pos.x, 5) + ";" + System.Math.Round(pos.y, 5) + ";" + System.Math.Round(pos.z, 5) + ";" + System.Math.Round(dir.x, 5) + ";" + System.Math.Round(dir.y, 5) + ";" + System.Math.Round(dir.z, 5) + ";";
                                    s += damage + ";" + ModReferences.ThisPlayerPacked + ";" + SpellActions.MagicArrowDuration + ";";
                                    if (SpellActions.MagicArrowDoubleSlow)
                                    {
                                        s += "t;";
                                    }
                                    else
                                    {
                                        s += "f;";
                                    }
                                    if (SpellActions.MagicArrowDmgDebuff)
                                    {
                                        s += "t;";
                                    }
                                    else
                                    {
                                        s += "f;";
                                    }
                                    Network.NetworkManager.SendLine(s, Network.NetworkManager.Target.Others);
                                }
                            }
                            else if (GameSetup.IsMpClient)
                            {
                                MagicArrow.CreateEffect(pos, dir, SpellActions.MagicArrowDmgDebuff, SpellActions.MagicArrowDuration);
                                string s = "SC7;" + System.Math.Round(pos.x, 5) + ";" + System.Math.Round(pos.y, 5) + ";" + System.Math.Round(pos.z, 5) + ";" + System.Math.Round(dir.x, 5) + ";" + System.Math.Round(dir.y, 5) + ";" + System.Math.Round(dir.z, 5) + ";";
                                s += damage + ";" + ModReferences.ThisPlayerPacked + ";" + SpellActions.MagicArrowDuration + ";";
                                if (SpellActions.MagicArrowDoubleSlow)
                                {
                                    s += "t;";
                                }
                                else
                                {
                                    s += "f;";
                                }
                                if (SpellActions.MagicArrowDmgDebuff)
                                {
                                    s += "t;";
                                }
                                else
                                {
                                    s += "f;";
                                }
                                Network.NetworkManager.SendLine(s, Network.NetworkManager.Target.Others);
                            }
                        }
                    }
                }
                bool flag  = target.tag == "lb_bird" || target.CompareTag("lb_bird");
                bool flag2 = target.CompareTag("Fish");
                bool flag3 = target.CompareTag("animalCollide") || target.CompareTag("animalRoot");
                arrowStickToTarget arrowStickToTarget = target.GetComponent <arrowStickToTarget>();
                if (!(bool)arrowStickToTarget)
                {
                    arrowStickToTarget = target.root.GetComponentInChildren <arrowStickToTarget>();
                }
                if (!spearType && !flintLockAmmoType && !flag2)
                {
                    if (arrowStickToTarget && arrowStickToTarget.enabled)
                    {
                        if (flag)
                        {
                            EventRegistry.Achievements.Publish(TfEvent.Achievements.BirdArrowKill, null);
                        }
                        arrowStickToTarget.CreatureType(flag3, flag, flag2);
                        if (BoltNetwork.isRunning)
                        {
                            if (at && at._boltEntity && at._boltEntity.isAttached && at._boltEntity.isOwner)
                            {
                                headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                            }
                        }
                        else
                        {
                            headDamage = arrowStickToTarget.stickArrowToNearestBone(base.transform);
                        }
                    }
                    if ((bool)arrowStickToTarget)
                    {
                        base.Invoke("destroyMe", 0.1f);
                    }
                }
                for (int i = 0; i < Repetitions; i++)
                {
                    base.StartCoroutine(HitAi(target, flag || flag3, headDamage));
                }
                ModdedPlayer.instance.DoAreaDamage(target.root, damage);
                ModdedPlayer.instance.DoOnHit();
                ModdedPlayer.instance.DoRangedOnHit();

                if (ModdedPlayer.instance.RangedArmorReduction > 0 && target.gameObject.CompareTag("enemyCollide"))
                {
                    if (BoltNetwork.isClient)
                    {
                        BoltEntity be = target.GetComponentInParent <BoltEntity>();
                        if (be == null)
                        {
                            be = target.GetComponent <BoltEntity>();
                        }
                        if (be != null)
                        {
                            EnemyProgression.ReduceArmor(be, ModdedPlayer.instance.MeleeArmorReduction);
                        }
                    }
                    else
                    {
                        target.transform.SendMessageUpwards("ReduceArmor", ModdedPlayer.instance.MeleeArmorReduction, SendMessageOptions.DontRequireReceiver);
                    }
                }
                if (flag2)
                {
                    base.StartCoroutine(HitFish(target, hit.point - base.transform.forward * 0.35f));
                }
                disableLive();
            }
            else if (target.CompareTag("PlayerNet"))
            {
                if (BoltNetwork.isRunning)
                {
                    BoltEntity boltEntity = target.GetComponentInParent <BoltEntity>();
                    if (!(bool)boltEntity)
                    {
                        boltEntity = target.GetComponent <BoltEntity>();
                    }
                    if (boltEntity && ModSettings.FriendlyFire)
                    {
                        HitPlayer HP = HitPlayer.Create(boltEntity, EntityTargets.Everyone);
                        HP.damage = damage;
                        HP.Send();
                        disableLive();
                    }
                }
            }
            else if (target.CompareTag("TerrainMain") && !LocalPlayer.IsInCaves)
            {
                if (ignoreTerrain)
                {
                    ignoreTerrain = false;
                    base.StartCoroutine(RevokeIgnoreTerrain());
                }
                else
                {
                    if (spearType)
                    {
                        if ((bool)bodyCollider)
                        {
                            bodyCollider.isTrigger = true;
                        }
                        base.StartCoroutine(HitStructure(base.transform.position - base.transform.forward * 2.1f, false));
                    }
                    else
                    {
                        Vector3 position2 = base.transform.position - base.transform.forward * -0.8f;
                        float   num       = Terrain.activeTerrain.SampleHeight(base.transform.position);
                        Vector3 position3 = Terrain.activeTerrain.transform.position;
                        float   num2      = num + position3.y;
                        Vector3 position4 = base.transform.position;
                        if (position4.y < num2)
                        {
                            position2.y = num2 + 0.5f;
                        }
                        base.StartCoroutine(HitStructure(position2, false));
                    }
                    disableLive();
                    FMODCommon.PlayOneshotNetworked(hitGroundEvent, base.transform, FMODCommon.NetworkRole.Any);
                }
            }
            else if (target.CompareTag("structure") || target.CompareTag("jumpObject") || target.CompareTag("SLTier1") || target.CompareTag("SLTier2") || target.CompareTag("SLTier3") || target.CompareTag("UnderfootWood"))
            {
                if ((bool)target.transform.parent)
                {
                    if ((bool)target.transform.parent.GetComponent <StickFenceChunkArchitect>())
                    {
                        return;
                    }
                    if ((bool)target.transform.parent.GetComponent <BoneFenceChunkArchitect>())
                    {
                        return;
                    }
                }
                if (!isTrigger)
                {
                    if (spearType)
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 2.1f, true));
                    }
                    else
                    {
                        base.StartCoroutine(HitStructure(hit.point - base.transform.forward * 0.35f, true));
                    }
                    disableLive();
                }
            }
            else if (target.CompareTag("CaveDoor"))
            {
                ignoreTerrain = true;
                Physics.IgnoreCollision(base.GetComponent <Collider>(), Terrain.activeTerrain.GetComponent <Collider>(), true);
            }
            else if (flintLockAmmoType && (target.CompareTag("BreakableWood") || target.CompareTag("BreakableRock")))
            {
                target.SendMessage("Hit", 40, SendMessageOptions.DontRequireReceiver);
            }
            if (!Live)
            {
                destroyThisAmmo();
                parent.BroadcastMessage("OnArrowHit", SendMessageOptions.DontRequireReceiver);
            }
        }