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(); }
// Enemy private void CreatureCollisionEnemyHolding(ref CollisionStruct collisionInstance, Creature hitCreature) { if (hitCreature == Creature.player) { hitCreature.StartCoroutine(SpawnFireRain(hitCreature.body.transform.position, fireRainHeight, fireRainDuration, fireRainIntensity, fireRainRadius)); } }
void OnCollisionEvent(ref CollisionStruct collisionInstance) { if (canCollide == true) { Return(); } }
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); }
private void ItemCollision(ref CollisionStruct collisionInstance) { if (bossPlayer.isInvis) { StopInvis(); } }
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(); } }
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); } }
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); } } } }
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)); } } }
public void OnStakeCollision(ref CollisionStruct collisionInstance) { if (!isExtended && !isExplosionReady) { CancelInvoke("ReadyExplosion"); Invoke("ReadyExplosion", module.chargeTime); defuseSFX.Play(); } }
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; } }
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; } } }
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); }
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; } } }
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)); } }
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 { } }
private void EventManager_onCreatureHit(Creature creature, ref CollisionStruct collisionStruct) { if (this) { if (damageStored < limit) { damageStored += collisionStruct.damageStruct.damage; } } else { EventManager.onCreatureHit -= EventManager_onCreatureHit; } }
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>(); } }
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)); } } } }
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); } } } } } } }
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); }