Beispiel #1
0
        void CollisionHandler(ref CollisionStruct collisionInstance)
        {
            bool bounced = false;

            if (ricochets != 0)
            {
                bounced = (Vector3.Angle(body.velocity, -collisionInstance.contactNormal) - 90) < module.ricochetMaxAngle;
                ricochets--;
            }
            if (!bounced)
            {
                Collider collider = collisionInstance.targetCollider;
                if (!module.deflectionMaterials.Any(material => collider.material.name == material + " (Instance)"))
                {
                    GetComponent <Rigidbody>().velocity = new Vector3(0, 0, 0);
                    markForDeletion = true;
                }
            }
            if (module.applyGlow)
            {
                var creature = collisionInstance.targetCollider.GetComponentInParent <Creature>();
                if (creature)
                {
                    creature.gameObject.AddComponent <StunGlow>().hue = module.boltHue;
                }
            }
            item.ResetObjectCollision();
        }
Beispiel #2
0
        // Enemy

        private void CreatureCollisionEnemyHolding(ref CollisionStruct collisionInstance, Creature hitCreature)
        {
            if (hitCreature == Creature.player)
            {
                hitCreature.StartCoroutine(SpawnFireRain(hitCreature.body.transform.position, fireRainHeight, fireRainDuration, fireRainIntensity, fireRainRadius));
            }
        }
Beispiel #3
0
 void OnCollisionEvent(ref CollisionStruct collisionInstance)
 {
     if (canCollide == true)
     {
         Return();
     }
 }
Beispiel #4
0
        protected override void OnProjectileCollision(ref CollisionStruct collisionInstance)
        {
            base.OnProjectileCollision(ref collisionInstance);
            Vector3 point = collisionInstance.contactPoint;

            Catalog.GetData <ItemPhysic>("Rune").SpawnAsync(item => item.transform.position = point);
        }
        IEnumerator MindControlCoroutine(Creature creature, int origFac)
        {
            creature.SetFaction(2);
            GameObject fxs = null;

            if (controlledFX != null)
            {
                fxs = GameObject.Instantiate(controlledFX, creature.body.headBone);
                fxs.transform.localPosition = new Vector3(0, 0, 0);

                FXPlayer.StartAllFxOnObject(fxs);
            }


            while (item.isPenetrating && !creature.health.isKilled)
            {
                creature.SetFaction(2);
                CollisionStruct collisionStruct = new CollisionStruct(new DamageStruct(Damager.DamageType.Poison, damage), null, null, null, null, null, null, null);
                creature.health.Damage(ref collisionStruct);
                yield return(new WaitForSeconds(1f));
            }

            if (fxs != null)
            {
                Destroy(fxs);
            }

            creature.SetFaction(origFac);
        }
Beispiel #6
0
 private void ItemCollision(ref CollisionStruct collisionInstance)
 {
     if (bossPlayer.isInvis)
     {
         StopInvis();
     }
 }
Beispiel #7
0
 protected void OnCollision(ref CollisionStruct collisionInstance)
 {
     if (active)
     {
         var colliderId       = collisionInstance.targetColliderGroup?.collisionHandler?.item?.itemId;
         var colliderCreature = collisionInstance.targetColliderGroup?.collisionHandler?.ragdollPart?.ragdoll?.creature;
         if (colliderId != null && colliderId.Equals("DynamicProjectile") ||
             colliderCreature != null && colliderCreature.Equals(Player.currentCreature))
         {
             return;
         }
         if (mergeSpell == null)
         {
             return;
         }
         CollisionStruct collisionInstanceCopy = collisionInstance;
         for (int i = 0; i < numFireballs; i++)
         {
             mergeSpell.fireballItem.SpawnAsync(fireball => {
                 fireball.transform.position = collisionInstanceCopy.contactPoint + collisionInstanceCopy.contactNormal / 2.0f + new Vector3(
                     UnityEngine.Random.Range(-0.5f, 0.5f),
                     UnityEngine.Random.Range(-0.5f, 0.5f),
                     UnityEngine.Random.Range(-0.5f, 0.5f));
                 fireball.rb.useGravity = true;
                 mergeSpell.ThrowFireball(fireball, Quaternion.Euler(
                                              UnityEngine.Random.Range(-20.0f, 20.0f),
                                              UnityEngine.Random.Range(-20.0f, 20.0f),
                                              UnityEngine.Random.Range(-20.0f, 20.0f)) * collisionInstanceCopy.contactNormal * -3.0f);
             });
         }
         Despawn();
     }
 }
Beispiel #8
0
 public override void OnImbueCollisionStart(ref CollisionStruct collisionInstance)
 {
     base.OnImbueCollisionStart(ref collisionInstance);
     if (collisionInstance.targetColliderGroup.collisionHandler.isRagdollPart)
     {
         collisionInstance.sourceColliderGroup.imbue.energy = 0;
     }
 }
 void OnChargedCollisionEvent(ref CollisionStruct collisionInstance)
 {
     if (isCharged)
     {
         isCharged = false;
         ShockWave(explosionRadius);
     }
 }
Beispiel #10
0
 void OnChargedCollisionEvent(ref CollisionStruct collisionInstance)
 {
     if (isCharged && item.rb.velocity.magnitude >= 3f)
     {
         isCharged = false;
         ShockWave(explosionRadius);
     }
 }
        private void CollisionHandler_OnCollisionStartEvent(ref CollisionStruct collisionInstance)
        {
            if (isHeld)
            {
                //Debug.Log("col is held");
                if (playerHolding)
                {
                    //Debug.Log("col player is holding");
                    if (OnCollisionPlayerHoldingEvent != null)
                    {
                        OnCollisionPlayerHoldingEvent(ref collisionInstance);
                    }

                    if (collisionInstance.damageStruct.hitRagdollPart)
                    {
                        Creature creature = collisionInstance.damageStruct.hitRagdollPart.ragdoll.creature;
                        if (OnCollisionCreaturePlayerHoldingEvent != null)
                        {
                            OnCollisionCreaturePlayerHoldingEvent(ref collisionInstance, creature);
                        }
                    }
                }
                else
                {
                    //Debug.Log("col player is not holding");
                    if (OnCollisionEnemyHoldingEvent != null)
                    {
                        OnCollisionEnemyHoldingEvent(ref collisionInstance);
                    }

                    if (collisionInstance.damageStruct.hitRagdollPart)
                    {
                        Creature creature = collisionInstance.damageStruct.hitRagdollPart.ragdoll.creature;
                        if (OnCollisionCreatureEnemyHoldingEvent != null)
                        {
                            OnCollisionCreatureEnemyHoldingEvent(ref collisionInstance, creature);
                        }
                    }
                }
            }
            else
            {
                //Debug.Log("col noone is holding");
                if (OnCollisionNooneHolding != null)
                {
                    OnCollisionNooneHolding(ref collisionInstance);
                }

                if (collisionInstance.damageStruct.hitRagdollPart)
                {
                    Creature creature = collisionInstance.damageStruct.hitRagdollPart.ragdoll.creature;
                    if (OnCollisionCreatureNooneHoldingEvent != null)
                    {
                        OnCollisionCreatureNooneHoldingEvent(ref collisionInstance, creature);
                    }
                }
            }
        }
Beispiel #12
0
        private void FinalItem_OnCollisionEvent(ref CollisionStruct collisionInstance)
        {
            //Debug.Log("oncol");
            if (collisionInstance.damageStruct.damage > 0)
            {
                //Debug.Log("dmg >0");
                if (collisionInstance.damageStruct.hitRagdollPart)
                {
                    //Debug.Log("ragdoll");
                    Creature creature = collisionInstance.targetCollider.GetComponentInParent <Creature>();
                    //Debug.Log("creat");

                    if (!collisionInstance.damageStruct.hitRagdollPart.GetComponentInChildren <MeshRenderer>())
                    {
                        return;
                    }

                    Renderer renderer = collisionInstance.damageStruct.hitRagdollPart.GetComponentInChildren <MeshRenderer>();

                    if (renderer.GetComponentInChildren <ParticleSystem>())
                    {
                        return;
                    }

                    //Debug.Log("no paticles");

                    ParticleSystem ps = Instantiate(particleSystem, renderer.transform);



                    ps.gameObject.transform.localScale    = new Vector3(1, 1, 1);
                    ps.gameObject.transform.localPosition = new Vector3(0, 0, 0);
                    ps.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);

                    var main = ps.main;

                    main.loop            = false;
                    main.duration        = 5;
                    main.simulationSpace = ParticleSystemSimulationSpace.World;
                    main.startSize       = new ParticleSystem.MinMaxCurve(0.5f, 0.8f);
                    main.gravityModifier = -0.2f;

                    var shape = ps.shape;
                    shape.shapeType = ParticleSystemShapeType.Mesh;
                    shape.mesh      = renderer.GetComponent <MeshFilter>().mesh;


                    var em = ps.emission;

                    em.rateOverTime = 10;



                    StartCoroutine(Burn(creature, ps, renderer.material));
                }
            }
        }
Beispiel #13
0
 public void OnStakeCollision(ref CollisionStruct collisionInstance)
 {
     if (!isExtended && !isExplosionReady)
     {
         CancelInvoke("ReadyExplosion");
         Invoke("ReadyExplosion", module.chargeTime);
         defuseSFX.Play();
     }
 }
Beispiel #14
0
        void OnBubbleCollisionEvent(ref CollisionStruct collisionInstance)
        {
            Debug.Log("Collision detected with " + collisionInstance.targetCollider.transform.root.name);
            EbediamHandyFunctions.TargetType targetType = EbediamHandyFunctions.Utils.GetTargetType(collisionInstance);

            rb.isKinematic = true;
            col.enabled    = false;
            SummonVFX();
            switch (targetType)
            {
            case EbediamHandyFunctions.TargetType.Environment:

                Portal portal = collisionInstance.targetCollider.GetComponentInParent <Portal>();
                if (portal)
                {
                    portal.maxSummons = 0;
                    portal.timer      = 99f;
                }
                else
                {
                    if (mode == Mode.Summon)
                    {
                        Summon();
                    }
                    else
                    {
                        Debug.Log("Create portal starts");
                        scepter.CreatePortal(transform.position, summonData, summonFaction);
                    }
                }

                break;


            case EbediamHandyFunctions.TargetType.NPC:
                Creature creature = collisionInstance.targetCollider.GetComponentInParent <Creature>();
                if (creature)
                {
                    if (creature.state == Creature.State.Dead)
                    {
                        creature.health.Resurrect(10f, Creature.player);
                        creature.ragdoll.SetState(Creature.State.Destabilized);
                    }

                    creature.SetFaction(2);
                }

                break;



            default:
                Debug.Log("TargetType not considered");
                break;
            }
        }
Beispiel #15
0
 void CollisionHandler(ref CollisionStruct collisionInstance)
 {
     try {
         if (collisionInstance.sourceColliderGroup.name == "KyberCrystalCollision" && collisionInstance.targetColliderGroup.name == "CollisionHilt")
         {
             collisionInstance.targetColliderGroup.transform.root.SendMessage("TryAddCrystal", this);
         }
     }
     catch { }
 }
        void CollisionHandler(ref CollisionStruct collisionInstance)
        {
            Collider collider = collisionInstance.targetCollider;

            if (!module.deflectionMaterials.Any(material => collider.material.name == material + " (Instance)"))
            {
                GetComponent <Rigidbody>().velocity = new Vector3(0, 0, 0);
                markForDeletion = true;
            }
        }
 public void OnWheelCollision(ref CollisionStruct collisionInstance)
 {
     if (isExtended && collisionInstance.targetType == CollisionStruct.TargetType.NPC)
     {
         if (collisionInstance.targetCollider.transform.root.GetComponent <Creature>().state != Creature.State.Dead)
         {
             Creature.player.health.currentHealth += collisionInstance.damageStruct.damage * 0.33f;
         }
     }
 }
Beispiel #18
0
        internal static void ChargeItem(Item item)
        {
            DamageStruct chargeDamage = new DamageStruct(Damager.DamageType.Shock, 1f);

            chargeDamage.effectId    = "Shock";
            chargeDamage.effectRatio = 1f;
            // TODO?: Charging the first collider works for vanilla weapons, investigate with modded weapons?
            CollisionStruct collision = new CollisionStruct(chargeDamage, targetCollider: item.definition.colliderGroups[0].colliders[0]);

            item.OnDamageReceived(ref collision);
        }
Beispiel #19
0
 private void AssassinDarkDaggerItem_OnCollisionCreatureEnemyHoldingEvent(ref CollisionStruct collisionInstance, Creature hitCreature)
 {
     Debug.Log("Enemy hit a creature with dark dagger");
     if (hitCreature == Creature.player)
     {
         if (!EnemyInvis)
         {
             StartCoroutine(EnemyInvisCoroutine(itemHolderCreature));
             EnemyInvis = true;
         }
     }
 }
Beispiel #20
0
        public void Detonate()
        {
            var pos          = transform.position;
            var colliders    = Physics.OverlapSphere(pos, module.radius);
            var damage       = new CollisionStruct(new DamageStruct(DamageType.Energy, module.damage), null, null);
            var creatures    = new List <Creature>();
            var layerMask    = ~((1 << 10) | (1 << 13) | (1 << 26) | (1 << 27) | (1 << 31));
            var creatureMask = ~((1 << 13) | (1 << 26) | (1 << 27) | (1 << 31));

            armedSound.Stop();
            beepTime = 0;

            foreach (var hit in colliders)
            {
                var distance   = Vector3.Distance(hit.transform.position, pos);
                var multiplier = (module.radius - distance) / module.radius;
                var rb         = hit.GetComponent <Rigidbody>() ?? hit.GetComponentInParent <Rigidbody>();
                if (rb && (distance < 0.3 || !Physics.Linecast(pos, hit.transform.position, layerMask, QueryTriggerInteraction.Ignore)))
                {
                    rb.AddExplosionForce(module.impuse * multiplier, pos, module.radius, 1.0f);
                    var creature = hit.transform.GetComponentInParent <Creature>();
                    if (creature)
                    {
                        if (creature != Player.local.creature)
                        {
                            var rp = hit.GetComponent <RagdollPart>() ?? hit.GetComponentInParent <RagdollPart>();
                            if (rp && rp.sliceAllowed && validParts.ContainsKey(rp.type) && validParts[rp.type] < multiplier)
                            {
                                try {
                                    rp.Slice();
                                }
                                catch { }
                            }
                        }
                        if (!creatures.Contains(creature) && !Physics.Linecast(pos, hit.transform.position, creatureMask, QueryTriggerInteraction.Ignore))
                        {
                            creatures.Add(creature);
                            damage.damageStruct.damage = module.damage * multiplier;
                            creature.Damage(ref damage);
                        }
                    }
                }
            }

            Utils.PlaySound(explosionSound, module.explosionSoundAsset);
            Utils.PlaySound(explosionSound2, module.explosionSoundAsset2);

            Utils.PlayParticleEffect(particles, true);
            renderer.enabled = false;
            item.enabled     = false;
            item.Despawn(1.5f);
        }
        private void ReforgedCaestusItem_OnCollisionCreatureEnemyHoldingEvent(ref CollisionStruct collisionInstance, Creature hitCreature)
        {
            if (hitCreature == Creature.player)
            {
                lastPlayerHitTime = Time.time;

                if (!isFast)
                {
                    isFast = true;
                    StartCoroutine(EnemyAttackSpeedCoroutine(itemHolderCreature));
                }
            }
        }
        public IEnumerator Burn(Creature creature, float duration, float fireDamage)
        {
            float startTime = Time.time;

            creature.TryAction(new ActionShock(10f, duration), true);

            while (Time.time - startTime > duration)
            {
                CollisionStruct collisionStruct = new CollisionStruct(new DamageStruct(DamageType.Energy, fireDamage));
                creature.health.Damage(ref collisionStruct);
                yield return(new WaitForSeconds(1f));
            }
        }
Beispiel #23
0
 void CollisionHandler(ref CollisionStruct collisionInstance)
 {
     try {
         if (collisionInstance.sourceColliderGroup.name == "CollisionBlasterPowerCell" && collisionInstance.targetColliderGroup.name == "CollisionBlasterRefill")
         {
             collisionInstance.targetColliderGroup.transform.root.SendMessage("RechargeFromPowerCell", module.projectileID);
             Utils.PlayParticleEffect(particle);
             Utils.PlayHaptic(holdingLeft, holdingRight, Utils.HapticIntensity.Major);
             Utils.PlaySound(audio, module.audioAsset);
         }
     }
     catch { }
 }
Beispiel #24
0
 private void EventManager_onCreatureHit(Creature creature, ref CollisionStruct collisionStruct)
 {
     if (this)
     {
         if (damageStored < limit)
         {
             damageStored += collisionStruct.damageStruct.damage;
         }
     }
     else
     {
         EventManager.onCreatureHit -= EventManager_onCreatureHit;
     }
 }
Beispiel #25
0
        private void EventManager_onCreatureKill(Creature creature, Player player, ref CollisionStruct collisionStruct, EventTime eventTime)
        {
            if (collisionStruct.damageStruct.hitRagdollPart == creature.ragdoll.GetPart(RagdollPart.Type.Neck) || (collisionStruct.damageStruct.hitRagdollPart == creature.ragdoll.GetPart(RagdollPart.Type.Head)) &&
                collisionStruct.damageStruct.damageType == DamageType.Pierce || collisionStruct.damageStruct.damage > creature.maxHealth * 0.8f)
            {
                return;
            }
            int x = Mathf.RoundToInt(UnityEngine.Random.Range(0, 100));

            if (x <= 10 && !creature.gameObject.GetComponent <Faking>())
            {
                creature.gameObject.AddComponent <Faking>();
            }
        }
Beispiel #26
0
 private void EventManager_onCreatureHit(Creature creature, ref CollisionStruct collisionStruct)
 {
     if (this)
     {
         if (damageStored < limit && Vector3.Distance(collisionStruct.contactPoint, transform.position) < TraitsManager.powerLvl)
         {
             damageStored += collisionStruct.damageStruct.damage;
         }
     }
     else
     {
         EventManager.onCreatureHit -= EventManager_onCreatureHit;
     }
 }
 private void Item_OnCollisionEvent(ref CollisionStruct collisionInstance)
 {
     if (collisionInstance.damageStruct.hitRagdollPart?.ragdoll.creature)
     {
         Creature creature = collisionInstance.damageStruct.hitRagdollPart?.ragdoll.creature;
         if (creature != Creature.player && !creature.health.isKilled && creature.factionId != 2)
         {
             if (collisionInstance.damageStruct.penetration == DamageStruct.Penetration.Hit || collisionInstance.damageStruct.penetration == DamageStruct.Penetration.Pressure)
             {
                 int faction = creature.factionId;
                 StartCoroutine(MindControlCoroutine(creature, faction));
             }
         }
     }
 }
Beispiel #28
0
        private void CollisionPlayerHolding(ref CollisionStruct collisionInstance)
        {
            if (collisionInstance.impactVelocity.magnitude > 2)
            {
                if (!collisionInstance.targetCollider.attachedRigidbody)
                {
                    if (Time.time - lastColTime > 1f)
                    {
                        lastColTime = Time.time;

                        if (aoeEffectData != null)
                        {
                            EffectInstance effect = aoeEffectData.Spawn(collisionInstance.contactPoint, Quaternion.LookRotation(collisionInstance.contactNormal));
                            effect.Play();
                        }

                        foreach (Creature creature in Creature.list)
                        {
                            if (Vector3.Distance(creature.body.transform.position, collisionInstance.contactPoint) < aoeRange)
                            {
                                if (creature == Creature.player)
                                {
                                    continue;
                                }
                                if (!creature.health.isKilled)
                                {
                                    if (IsBoss(creature))
                                    {
                                        Debug.Log("Ram is boss");
                                        creature.TryAction(new ActionStagger((creature.body.transform.position - collisionInstance.contactPoint).normalized, 10f, ActionStagger.Type.FallGround), true);
                                        continue;
                                    }
                                    else
                                    {
                                        creature.ragdoll.SetState(Creature.State.Destabilized);
                                    }
                                }

                                foreach (RagdollPart part in creature.ragdoll.parts)
                                {
                                    part.rb.AddExplosionForce(aoeForce * part.rb.mass, collisionInstance.contactPoint, aoeRange, 2f, ForceMode.Impulse);
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #29
0
        private static void TryCharge(SpellCasterHand hand)
        {
            if (hand && hand.currentSpell is SpellLightning)
            {
                if (hand.bodyHand && hand.bodyHand.interactor && hand.bodyHand.interactor.grabbedHandle)
                {
                    bool           tryCast = hand.caster.creature == Creature.player && PlayerControl.GetHand(hand.bodyHand.side).indexCurl > 0.5f;
                    SpellLightning spell   = hand.currentSpell as SpellLightning;

                    if (hand.bodyHand.interactor.grabbedHandle.item)
                    {
                        if (tryCast || Electrical.ItemChargeSettings.autoCharge || hand.caster.creature != Creature.player)
                        {
                            float manaCost = Electrical.ItemChargeSettings.manaPerSec * Time.deltaTime;
                            if (hand.caster.currentMana > manaCost)
                            {
                                hand.caster.currentMana -= manaCost;
                                Item item = hand.bodyHand.interactor.grabbedHandle.item;
                                ChargeItem(item);

                                // If we're holding a bow, charge nocked arrows too
                                var bowString = item.GetComponentInChildren <BowString>();
                                if (bowString)
                                {
                                    if (bowString.nockedArrow)
                                    {
                                        ChargeItem(bowString.nockedArrow);
                                    }
                                }
                            }
                        }
                    }
                    if (hand.bodyHand.interactor.grabbedHandle is RagdollHandle && tryCast)
                    {
                        float manaCost = Electrical.RagdollChargeSettings.manaPerSec * Time.deltaTime;
                        if (hand.caster.currentMana > manaCost)
                        {
                            var          ragdollHandle = hand.bodyHand.interactor.grabbedHandle as RagdollHandle;
                            DamageStruct shockDamage   = spell.damageStruct;
                            shockDamage.damage         = Electrical.RagdollChargeSettings.damagePerSec * Time.deltaTime;
                            shockDamage.hitRagdollPart = ragdollHandle.ragdollPart;
                            CollisionStruct spellCollision = new CollisionStruct(shockDamage);
                            ragdollHandle.ragdollPart.ragdoll.creature.health.Damage(ref spellCollision);
                        }
                    }
                }
            }
        }
        private CollisionStruct CreateEnemyDamager(Collider targetCollider, Vector3 dir, Vector3 targetPosition, Vector3 contactNormal)
        {
            CollisionData   collisionData   = Catalog.current.GetCollisionData(Animator.StringToHash("SpellLightning (Instance)"), Animator.StringToHash(targetCollider.material.name));
            CollisionStruct collisionStruct = default;
            DamageStruct    damageStruct    = new DamageStruct(Damager.DamageType.Shock, module.damage);

            damageStruct.recoil           = 0;
            damageStruct.knockOutDuration = 0;
            damageStruct.effectId         = "EscrimaShock";
            damageStruct.effectRatio      = 1;
            Item otherItem = targetCollider.attachedRigidbody ? targetCollider.attachedRigidbody.GetComponent <Item>() : null;

            collisionStruct.NewHit(null, targetCollider, dir, targetPosition, contactNormal, damageStruct, 1, collisionData, null, null, otherItem);
            collisionStruct.damageStruct.hitRagdollPart = collisionStruct.targetCollider.gameObject.GetComponent <RagdollPart>();
            return(collisionStruct);
        }