public override void VehicleFixedUpdate() { base.VehicleFixedUpdate(); if (!base.isClient && isSpawned) { if (IsEditableNow != prevEditable) { SendNetworkUpdate(); prevEditable = IsEditableNow; } if (VehicleIsActive) { Velocity = GetWorldVelocity(); waterlogged = WaterLevel.Test(waterSample.transform.position, true, this); } else { Velocity = Vector3.zero; } SetFlag(Flags.Reserved6, rigidBody.isKinematic); if (LightsAreOn && !HasDriver()) { SetLightsState(false); } for (int i = 0; i < NumAttachedModules; i++) { AttachedModuleEntities[i].VehicleFixedUpdate(VehicleIsActive); } } }
public void CalculateGroundQuality(bool firstCheck) { if (underWater && !firstCheck) { GroundQuality = 0f; return; } if (firstCheck) { Vector3 position = base.transform.position; if (WaterLevel.Test(position, true, this)) { underWater = true; GroundQuality = 0f; return; } underWater = false; terrainTypeValue = GetGroundTypeValue(position); } if (GetPlanter() != null) { GroundQuality = 0.6f; GroundQuality += (Fertilized ? 0.4f : 0f); } else { GroundQuality = terrainTypeValue; float num = (float)Genes.GetGeneTypeCount(GrowableGenetics.GeneType.Hardiness) * 0.2f; float b = GroundQuality + num; GroundQuality = Mathf.Min(0.6f, b); } GroundQuality = RemapValue(GroundQuality, 0f, Properties.OptimalGroundQuality, 0f, 1f); }
public override bool DoCheck(Construction.Placement place) { if (WaterLevel.Test(Vector3.op_Addition(place.position, Quaternion.op_Multiply(place.rotation, this.worldPosition))) == this.wantsInWater) { return(true); } Construction.lastPlacementError = "Failed Check: InWater (" + this.hierachyName + ")"; return(false); }
public override bool DoCheck(Construction.Placement place) { if (WaterLevel.Test(place.position + (place.rotation * this.worldPosition)) == this.wantsInWater) { return(true); } Construction.lastPlacementError = string.Concat("Failed Check: InWater (", this.hierachyName, ")"); return(false); }
public float ObstacleDistanceCheck(float speed = 15f) { RaycastHit raycastHit; Vector3 vector3 = base.transform.position; int num = 1; int num1 = Mathf.CeilToInt((float)(Mathf.Max(2, Mathf.CeilToInt(speed)) / num)); float single = 0f; Vector3 vector31 = QuaternionEx.LookRotationForcedUp(base.transform.forward, Vector3.up) * Vector3.forward; Vector3 vector32 = this.movementLOSOrigin.transform.position; vector32.y = base.transform.position.y; Vector3 vector33 = base.transform.up; for (int i = 0; i < num1; i++) { float single1 = (float)num; bool flag = false; float single2 = 0f; Vector3 vector34 = Vector3.zero; Vector3 vector35 = Vector3.up; Vector3 vector36 = vector32 + (Vector3.up * 0.5f); if (Physics.SphereCast(vector36, this.obstacleDetectionRadius, vector31, out raycastHit, single1, 1486954753)) { single2 = raycastHit.distance; vector34 = raycastHit.point; vector35 = raycastHit.normal; flag = true; } if (!flag) { if (!TransformUtil.GetGroundInfo((vector36 + (vector31 * 1f)) + (Vector3.up * 2f), out vector34, out vector35, 4f, 278986753, null)) { return(single); } single2 = Vector3.Distance(vector36, vector34); if (WaterLevel.Test(vector34 + (Vector3.one * this.maxWaterDepth))) { vector35 = -base.transform.forward; } flag = true; } if (flag) { float single3 = Vector3.Angle(vector33, vector35); float single4 = Vector3.Angle(vector35, Vector3.up); if (single3 > 45f && single4 > 50f) { return(single); } } single += single2; vector31 = QuaternionEx.LookRotationForcedUp(base.transform.forward, vector35) * Vector3.forward; vector32 = vector34; } return(single); }
public static float WorkoutGroundConditions(Vector3 pos) { if (WaterLevel.Test(pos)) { return(-1f); } TerrainSplat.Enum splatMaxType = (TerrainSplat.Enum)TerrainMeta.SplatMap.GetSplatMaxType(pos, -1); if (splatMaxType <= 16) { switch (splatMaxType - 1) { case 0: return(0.5f); case 1: return(-1f); case 2: break; case 3: return(-0.3f); default: if (splatMaxType == 8) { return(-0.7f); } if (splatMaxType == 16) { return(0.5f); } break; } } else { if (splatMaxType == 32) { return(0.4f); } if (splatMaxType == 64 || splatMaxType == 128) { return(-0.6f); } } return(0.5f); }
protected override void VehicleFixedUpdate() { if (!base.isClient) { if (!EngineOn()) { gasPedal = 0f; steering = 0f; } base.VehicleFixedUpdate(); bool flag = WaterLevel.Test(thrustPoint.position, true, this); if (gasPedal != 0f && flag && buoyancy.submergedFraction > 0.3f) { Vector3 force = (base.transform.forward + base.transform.right * steering * steeringScale).normalized * gasPedal * engineThrust; rigidBody.AddForceAtPosition(force, thrustPoint.position, ForceMode.Force); } } }
public bool Waterlogged() { return(WaterLevel.Test(((Component)this.waterSample).get_transform().get_position())); }
public bool Waterlogged() { return(WaterLevel.Test(this.waterSample.transform.position)); }
public float ObstacleDistanceCheck(float speed = 10f) { Vector3 position = base.transform.position; int num = Mathf.Max(2, Mathf.Min((int)speed, 10)); float num2 = 0.5f; int num3 = Mathf.CeilToInt((float)num / num2); float num4 = 0f; Vector3 vector = QuaternionEx.LookRotationForcedUp(base.transform.forward, Vector3.up) * Vector3.forward; Vector3 vector2 = movementLOSOrigin.transform.position; vector2.y = base.transform.position.y; Vector3 up = base.transform.up; for (int i = 0; i < num3; i++) { float num5 = num2; bool flag = false; float num6 = 0f; Vector3 pos = Vector3.zero; Vector3 normal = Vector3.up; Vector3 vector3 = vector2; Vector3 origin = vector3 + Vector3.up * (maxStepHeight + obstacleDetectionRadius); Vector3 vector4 = vector3 + vector * num5; float num7 = maxStepDownHeight + obstacleDetectionRadius; RaycastHit hitInfo; if (UnityEngine.Physics.SphereCast(origin, obstacleDetectionRadius, vector, out hitInfo, num5, 1486954753)) { num6 = hitInfo.distance; pos = hitInfo.point; normal = hitInfo.normal; flag = true; } if (!flag) { if (!TransformUtil.GetGroundInfo(vector4 + Vector3.up * 2f, out pos, out normal, 2f + num7, 278986753)) { return(num4); } num6 = Vector3.Distance(vector3, pos); if (WaterLevel.Test(pos + Vector3.one * maxWaterDepth, true, this)) { normal = -base.transform.forward; return(num4); } flag = true; } if (flag) { float num8 = Vector3.Angle(up, normal); float num9 = Vector3.Angle(normal, Vector3.up); if (num8 > maxWallClimbSlope || num9 > maxWallClimbSlope) { Vector3 vector5 = normal; float num10 = pos.y; int num11 = 1; for (int j = 0; j < normalOffsets.Length; j++) { Vector3 vector6 = vector4 + normalOffsets[j].x * base.transform.right; float num12 = maxStepHeight * 2.5f; Vector3 pos2; Vector3 normal2; if (TransformUtil.GetGroundInfo(vector6 + Vector3.up * num12 + normalOffsets[j].z * base.transform.forward, out pos2, out normal2, num7 + num12, 278986753)) { num11++; vector5 += normal2; num10 += pos2.y; } } num10 /= (float)num11; vector5.Normalize(); float num13 = Vector3.Angle(up, vector5); num9 = Vector3.Angle(vector5, Vector3.up); if (num13 > maxWallClimbSlope || num9 > maxWallClimbSlope || Mathf.Abs(num10 - vector4.y) > maxStepHeight) { return(num4); } } } num4 += num6; vector = QuaternionEx.LookRotationForcedUp(base.transform.forward, normal) * Vector3.forward; vector2 = pos; } return(num4); }
public override void Explode() { RaycastHit raycastHit; base.Explode(); if (WaterLevel.Test(base.transform.position)) { return; } ResourceDepositManager.ResourceDeposit orCreate = ResourceDepositManager.GetOrCreate(base.transform.position); if (orCreate == null) { return; } if (Time.realtimeSinceStartup - orCreate.lastSurveyTime < 10f) { return; } orCreate.lastSurveyTime = Time.realtimeSinceStartup; if (!TransformUtil.GetGroundInfo(base.transform.position, out raycastHit, 0.3f, 8388608, null)) { return; } Vector3 vector3 = raycastHit.point; Vector3 vector31 = raycastHit.normal; List <SurveyCrater> list = Pool.GetList <SurveyCrater>(); Vis.Entities <SurveyCrater>(base.transform.position, 10f, list, 1, QueryTriggerInteraction.Collide); bool count = list.Count > 0; Pool.FreeList <SurveyCrater>(ref list); if (count) { return; } bool flag = false; bool flag1 = false; foreach (ResourceDepositManager.ResourceDeposit.ResourceDepositEntry _resource in orCreate._resources) { if (_resource.spawnType != ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM || _resource.isLiquid || _resource.amount < 1000) { continue; } int num = Mathf.Clamp(Mathf.CeilToInt(2.5f / _resource.workNeeded * 10f), 0, 5); int num1 = 1; flag = true; if (_resource.isLiquid) { flag1 = true; } for (int i = 0; i < num; i++) { Item item = ItemManager.Create(_resource.type, num1, (ulong)0); Vector3 modifiedAimConeDirection = AimConeUtil.GetModifiedAimConeDirection(20f, Vector3.up, true); item.Drop(base.transform.position + (Vector3.up * 1f), this.GetInheritedDropVelocity() + (modifiedAimConeDirection * UnityEngine.Random.Range(5f, 10f)), UnityEngine.Random.rotation).SetAngularVelocity(UnityEngine.Random.rotation.eulerAngles * 5f); } } if (flag) { string str = (flag1 ? this.craterPrefab_Oil.resourcePath : this.craterPrefab.resourcePath); BaseEntity baseEntity = GameManager.server.CreateEntity(str, vector3, Quaternion.identity, true); if (baseEntity) { baseEntity.Spawn(); } } }
public bool Waterlogged() { return(WaterLevel.Test(waterSample.transform.position, true, this)); }
public override void Explode() { base.Explode(); if (WaterLevel.Test(((Component)this).get_transform().get_position())) { return; } ResourceDepositManager.ResourceDeposit resourceDeposit = ResourceDepositManager.GetOrCreate(((Component)this).get_transform().get_position()); if (resourceDeposit == null || (double)Time.get_realtimeSinceStartup() - (double)resourceDeposit.lastSurveyTime < 10.0) { return; } resourceDeposit.lastSurveyTime = Time.get_realtimeSinceStartup(); RaycastHit hitOut; if (!TransformUtil.GetGroundInfo(((Component)this).get_transform().get_position(), out hitOut, 0.3f, LayerMask.op_Implicit(8388608), (Transform)null)) { return; } Vector3 point = ((RaycastHit) ref hitOut).get_point(); ((RaycastHit) ref hitOut).get_normal(); List <SurveyCrater> list = (List <SurveyCrater>)Pool.GetList <SurveyCrater>(); Vis.Entities <SurveyCrater>(((Component)this).get_transform().get_position(), 10f, list, 1, (QueryTriggerInteraction)2); int num1 = list.Count > 0 ? 1 : 0; // ISSUE: cast to a reference type Pool.FreeList <SurveyCrater>((List <M0>&) ref list); if (num1 != 0) { return; } bool flag1 = false; bool flag2 = false; foreach (ResourceDepositManager.ResourceDeposit.ResourceDepositEntry resource in resourceDeposit._resources) { if (resource.spawnType == ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM && !resource.isLiquid && resource.amount >= 1000) { int num2 = Mathf.Clamp(Mathf.CeilToInt((float)(2.5 / (double)resource.workNeeded * 10.0)), 0, 5); int iAmount = 1; flag1 = true; if (resource.isLiquid) { flag2 = true; } for (int index = 0; index < num2; ++index) { Item obj = ItemManager.Create(resource.type, iAmount, 0UL); Vector3 aimConeDirection = AimConeUtil.GetModifiedAimConeDirection(20f, Vector3.get_up(), true); Vector3 vPos = Vector3.op_Addition(((Component)this).get_transform().get_position(), Vector3.op_Multiply(Vector3.get_up(), 1f)); Vector3 vVelocity = Vector3.op_Addition(this.GetInheritedDropVelocity(), Vector3.op_Multiply(aimConeDirection, Random.Range(5f, 10f))); Quaternion rotation1 = Random.get_rotation(); BaseEntity baseEntity = obj.Drop(vPos, vVelocity, rotation1); Quaternion rotation2 = Random.get_rotation(); Vector3 velocity = Vector3.op_Multiply(((Quaternion) ref rotation2).get_eulerAngles(), 5f); baseEntity.SetAngularVelocity(velocity); } } } if (!flag1) { return; } string strPrefab = flag2 ? this.craterPrefab_Oil.resourcePath : this.craterPrefab.resourcePath; BaseEntity entity = GameManager.server.CreateEntity(strPrefab, point, Quaternion.get_identity(), true); if (!Object.op_Implicit((Object)entity)) { return; } entity.Spawn(); }
public static bool TestFlying(BasePlayer ply, Vector3 oldPos, Vector3 newPos, bool verifyGrounded) { ply.isInAir = false; ply.isOnPlayer = false; if (!verifyGrounded) { ply.isInAir = (ply.OnLadder() || ply.IsSwimming() ? false : !ply.IsOnGround()); } else { float flyhackExtrusion = ConVar.AntiHack.flyhack_extrusion; Vector3 vector3 = (oldPos + newPos) * 0.5f; if (!ply.OnLadder() && !WaterLevel.Test(vector3 - new Vector3(0f, flyhackExtrusion, 0f)) && (int)(EnvironmentManager.Get(vector3) & EnvironmentType.Elevator) == 0) { float flyhackMargin = ConVar.AntiHack.flyhack_margin; float radius = ply.GetRadius(); float height = ply.GetHeight(false); Vector3 vector31 = vector3 + new Vector3(0f, radius - flyhackExtrusion, 0f); Vector3 vector32 = vector3 + new Vector3(0f, height - radius, 0f); float single = radius - flyhackMargin; ply.isInAir = !UnityEngine.Physics.CheckCapsule(vector31, vector32, single, 1503731969, QueryTriggerInteraction.Ignore); if (ply.isInAir) { int num = UnityEngine.Physics.OverlapCapsuleNonAlloc(vector31, vector32, single, AntiHack.buffer, 131072, QueryTriggerInteraction.Ignore); int num1 = 0; while (num1 < num) { BasePlayer baseEntity = AntiHack.buffer[num1].gameObject.ToBaseEntity() as BasePlayer; if (baseEntity == null || baseEntity == ply || baseEntity.isInAir || baseEntity.isOnPlayer || baseEntity.TriggeredAntiHack(1f, Single.PositiveInfinity) || baseEntity.IsSleeping()) { num1++; } else { ply.isOnPlayer = true; ply.isInAir = false; break; } } for (int i = 0; i < (int)AntiHack.buffer.Length; i++) { AntiHack.buffer[i] = null; } } } } if (!ply.isInAir) { ply.flyhackDistanceVertical = 0f; ply.flyhackDistanceHorizontal = 0f; } else { bool flag = false; Vector3 vector33 = newPos - oldPos; float single1 = Mathf.Abs(vector33.y); float single2 = vector33.Magnitude2D(); if (vector33.y >= 0f) { ply.flyhackDistanceVertical += vector33.y; flag = true; } if (single1 < single2) { ply.flyhackDistanceHorizontal += single2; flag = true; } if (flag) { float jumpHeight = ply.GetJumpHeight() + ConVar.AntiHack.flyhack_forgiveness_vertical; if (ply.flyhackDistanceVertical > jumpHeight) { return(true); } float flyhackForgivenessHorizontal = 5f + ConVar.AntiHack.flyhack_forgiveness_horizontal; if (ply.flyhackDistanceHorizontal > flyhackForgivenessHorizontal) { return(true); } } } return(false); }
public bool WaterLogged() { return(WaterLevel.Test(engineHeight.position, true, this)); }
public static bool TestFlying(BasePlayer ply, Vector3 oldPos, Vector3 newPos, bool verifyGrounded) { ply.isInAir = false; ply.isOnPlayer = false; if (verifyGrounded) { float flyhack_extrusion = ConVar.AntiHack.flyhack_extrusion; Vector3 vector = (oldPos + newPos) * 0.5f; if (!ply.OnLadder() && !WaterLevel.Test(vector - new Vector3(0f, flyhack_extrusion, 0f), true, ply) && (EnvironmentManager.Get(vector) & EnvironmentType.Elevator) == 0) { float flyhack_margin = ConVar.AntiHack.flyhack_margin; float radius = ply.GetRadius(); float height = ply.GetHeight(false); Vector3 vector2 = vector + new Vector3(0f, radius - flyhack_extrusion, 0f); Vector3 vector3 = vector + new Vector3(0f, height - radius, 0f); float radius2 = radius - flyhack_margin; ply.isInAir = !UnityEngine.Physics.CheckCapsule(vector2, vector3, radius2, 1503731969, QueryTriggerInteraction.Ignore); if (ply.isInAir) { int num = UnityEngine.Physics.OverlapCapsuleNonAlloc(vector2, vector3, radius2, buffer, 131072, QueryTriggerInteraction.Ignore); for (int i = 0; i < num; i++) { BasePlayer basePlayer = GameObjectEx.ToBaseEntity(buffer[i].gameObject) as BasePlayer; if (!(basePlayer == null) && !(basePlayer == ply) && !basePlayer.isInAir && !basePlayer.isOnPlayer && !basePlayer.TriggeredAntiHack() && !basePlayer.IsSleeping()) { ply.isOnPlayer = true; ply.isInAir = false; break; } } for (int j = 0; j < buffer.Length; j++) { buffer[j] = null; } } } } else { ply.isInAir = !ply.OnLadder() && !ply.IsSwimming() && !ply.IsOnGround(); } if (ply.isInAir) { bool flag = false; Vector3 v = newPos - oldPos; float num2 = Mathf.Abs(v.y); float num3 = v.Magnitude2D(); if (v.y >= 0f) { ply.flyhackDistanceVertical += v.y; flag = true; } if (num2 < num3) { ply.flyhackDistanceHorizontal += num3; flag = true; } if (flag) { float num4 = Mathf.Max((ply.flyhackPauseTime > 0f) ? ConVar.AntiHack.flyhack_forgiveness_vertical_inertia : ConVar.AntiHack.flyhack_forgiveness_vertical, 0f); float num5 = ply.GetJumpHeight() + num4; if (ply.flyhackDistanceVertical > num5) { return(true); } float num6 = Mathf.Max((ply.flyhackPauseTime > 0f) ? ConVar.AntiHack.flyhack_forgiveness_horizontal_inertia : ConVar.AntiHack.flyhack_forgiveness_horizontal, 0f); float num7 = 5f + num6; if (ply.flyhackDistanceHorizontal > num7) { return(true); } } } else { ply.flyhackDistanceVertical = 0f; ply.flyhackDistanceHorizontal = 0f; } return(false); }
public static float WorkoutGroundConditions(Vector3 pos) { if (WaterLevel.Test(pos)) { return(-1f); } TerrainSplat.Enum splatMaxType = (TerrainSplat.Enum)TerrainMeta.SplatMap.GetSplatMaxType(pos, -1); if (splatMaxType > TerrainSplat.Enum.Grass) { if (splatMaxType == TerrainSplat.Enum.Forest) { return(0.4f); } if (splatMaxType == TerrainSplat.Enum.Stones) { return(-0.6f); } if (splatMaxType == TerrainSplat.Enum.Gravel) { return(-0.6f); } } else { switch (splatMaxType) { case TerrainSplat.Enum.Dirt: { return(0.5f); } case TerrainSplat.Enum.Snow: { return(-1f); } case TerrainSplat.Enum.Dirt | TerrainSplat.Enum.Snow: { break; } case TerrainSplat.Enum.Sand: { return(-0.3f); } default: { if (splatMaxType == TerrainSplat.Enum.Rock) { return(-0.7f); } if (splatMaxType == TerrainSplat.Enum.Grass) { return(0.5f); } break; } } } return(0.5f); }
public bool WaterLogged() { return(WaterLevel.Test(this.engineHeight.position)); }
public static bool TestFlying( BasePlayer ply, Vector3 oldPos, Vector3 newPos, bool verifyGrounded) { ply.isInAir = false; ply.isOnPlayer = false; if (verifyGrounded) { float flyhackExtrusion = ConVar.AntiHack.flyhack_extrusion; Vector3 pos = Vector3.op_Multiply(Vector3.op_Addition(oldPos, newPos), 0.5f); if (!ply.OnLadder() && !WaterLevel.Test(Vector3.op_Subtraction(pos, new Vector3(0.0f, flyhackExtrusion, 0.0f))) && (EnvironmentManager.Get(pos) & EnvironmentType.Elevator) == (EnvironmentType)0) { float flyhackMargin = ConVar.AntiHack.flyhack_margin; float radius = ply.GetRadius(); float height = ply.GetHeight(false); Vector3 vector3_1 = Vector3.op_Addition(pos, new Vector3(0.0f, radius - flyhackExtrusion, 0.0f)); Vector3 vector3_2 = Vector3.op_Addition(pos, new Vector3(0.0f, height - radius, 0.0f)); float num1 = radius - flyhackMargin; ply.isInAir = !Physics.CheckCapsule(vector3_1, vector3_2, num1, 1503731969, (QueryTriggerInteraction)1); if (ply.isInAir) { int num2 = Physics.OverlapCapsuleNonAlloc(vector3_1, vector3_2, num1, AntiHack.buffer, 131072, (QueryTriggerInteraction)1); for (int index = 0; index < num2; ++index) { BasePlayer baseEntity = ((Component)AntiHack.buffer[index]).get_gameObject().ToBaseEntity() as BasePlayer; if (!Object.op_Equality((Object)baseEntity, (Object)null) && !Object.op_Equality((Object)baseEntity, (Object)ply) && (!baseEntity.isInAir && !baseEntity.isOnPlayer) && (!baseEntity.TriggeredAntiHack(1f, float.PositiveInfinity) && !baseEntity.IsSleeping())) { ply.isOnPlayer = true; ply.isInAir = false; break; } } for (int index = 0; index < AntiHack.buffer.Length; ++index) { AntiHack.buffer[index] = (Collider)null; } } } } else { ply.isInAir = !ply.OnLadder() && !ply.IsSwimming() && !ply.IsOnGround(); } if (ply.isInAir) { bool flag = false; Vector3 vector3 = Vector3.op_Subtraction(newPos, oldPos); double num1 = (double)Mathf.Abs((float)vector3.y); float num2 = Vector3Ex.Magnitude2D(vector3); if (vector3.y >= 0.0) { ply.flyhackDistanceVertical += (float)vector3.y; flag = true; } double num3 = (double)num2; if (num1 < num3) { ply.flyhackDistanceHorizontal += num2; flag = true; } if (flag) { float num4 = ply.GetJumpHeight() + ConVar.AntiHack.flyhack_forgiveness_vertical; if ((double)ply.flyhackDistanceVertical > (double)num4) { return(true); } float num5 = 5f + ConVar.AntiHack.flyhack_forgiveness_horizontal; if ((double)ply.flyhackDistanceHorizontal > (double)num5) { return(true); } } } else { ply.flyhackDistanceVertical = 0.0f; ply.flyhackDistanceHorizontal = 0.0f; } return(false); }
public static void ImpactEffect(HitInfo info) { if (!info.DoHitEffects) { return; } string materialName = StringPool.Get(info.HitMaterial); string strName = EffectDictionary.GetParticle(info.damageTypes.GetMajorityDamageType(), materialName); string decal = EffectDictionary.GetDecal(info.damageTypes.GetMajorityDamageType(), materialName); if (TerrainMeta.WaterMap != null && info.HitMaterial != Projectile.WaterMaterialID() && info.HitMaterial != Projectile.FleshMaterialID() && info.HitPositionWorld.y < TerrainMeta.WaterMap.GetHeight(info.HitPositionWorld) && WaterLevel.Test(info.HitPositionWorld, false)) { return; } if (BaseEntityEx.IsValid(info.HitEntity)) { GameObjectRef impactEffect = info.HitEntity.GetImpactEffect(info); if (impactEffect.isValid) { strName = impactEffect.resourcePath; } Run(strName, info.HitEntity, info.HitBone, info.HitPositionLocal, info.HitNormalLocal); if (info.DoDecals) { Run(decal, info.HitEntity, info.HitBone, info.HitPositionLocal, info.HitNormalLocal); } } else { Type overrideType = Type.Generic; Run(strName, info.HitPositionWorld, info.HitNormalWorld, default(Vector3), overrideType); Run(decal, info.HitPositionWorld, info.HitNormalWorld, default(Vector3), overrideType); } if ((bool)info.WeaponPrefab) { BaseMelee baseMelee = info.WeaponPrefab as BaseMelee; if (baseMelee != null) { string strikeEffectPath = baseMelee.GetStrikeEffectPath(materialName); if (BaseEntityEx.IsValid(info.HitEntity)) { Run(strikeEffectPath, info.HitEntity, info.HitBone, info.HitPositionLocal, info.HitNormalLocal); } else { Run(strikeEffectPath, info.HitPositionWorld, info.HitNormalWorld); } } } if (info.damageTypes.Has(DamageType.Explosion)) { DoAdditiveImpactEffect(info, "assets/bundled/prefabs/fx/impacts/additive/explosion.prefab"); } if (info.damageTypes.Has(DamageType.Heat)) { DoAdditiveImpactEffect(info, "assets/bundled/prefabs/fx/impacts/additive/fire.prefab"); } }