76 SCR_DamageManagerComponent characterDamageManager = character.GetDamageManager();
78 if (!characterDamageManager || !characterAnimationComponent)
81 vector transformDir[4], rotorMat[4];
84 if (characterDamageManager.IsDestroyed())
86 const float ragrollEffectRadius = 0.5;
87 const float ragrollEffectMaxTime = 2;
88 vector forwardVec =
vector.Direction(rotorMat[3], contact.Position).Normalized();
89 vector upVec = rotorMat[1];
90 vector impactOrientationMat[4];
91 Math3D.DirectionAndUpMatrix(forwardVec, upVec, impactOrientationMat);
92 vector worldImpactDir = impactOrientationMat[0];
94 worldImpactDir = -worldImpactDir;
96 vector hitPosLocal = character.CoordToLocal(contact.Position);
97 vector directionLocal = character.VectorToLocal(worldImpactDir).Normalized();
99 characterAnimationComponent.AddRagdollEffectorDamage(hitPosLocal, directionLocal, force, ragrollEffectRadius, ragrollEffectMaxTime);
106 Physics otherPhysics = other.GetPhysics();
107 array<HitZone> characterHitZones = {};
108 characterDamageManager.GetAllHitZones(characterHitZones);
118 array<int> colliderIDs = {};
119 array<SurfaceProperties> surfaces = {};
122 MeshObject meshObject = character.GetVObject().ToMeshObject();
124 foreach (
HitZone characterHitZone : characterHitZones)
126 if (!characterHitZone.HasColliderNodes() || characterHitZone.GetDamageState() ==
EDamageState.DESTROYED)
130 characterHitZone.GetColliderIDs(colliderIDs);
132 foreach (
int colliderID : colliderIDs)
134 if (!
m_RotorHitZone.HasCollision(otherPhysics.GetGeomWorldPosition(colliderID)))
138 otherPhysics.GetGeomSurfaces(colliderID, surfaces);
139 if (surfaces.IsEmpty())
142 direction =
vector.Direction(rotorMat[3], otherPhysics.GetGeomWorldPosition(colliderID));
144 nodeID =
PhysicsUtils.GetNodeIndex(meshObject, colliderID);
147 character, characterHitZone, instigator,
148 surfaces[0], colliderID, nodeID
151 context.damageEffect = collisionEffect;
153 characterDamageManager.HandleDamage(context);
167 vector rotorTransformLocal[4];
171 float rotorRadiusSq = rotorRadius * rotorRadius;
174 vector contactPositionLocal = contactPos.InvMultiply4(ownerTransform).InvMultiply4(rotorTransformLocal).Normalized() * rotorRadius;
176 float distanceEdgeToContactSq =
vector.DistanceSq(rotorEdge, contactPositionLocal);
177 float rotorContactAngle =
Math.RAD2DEG *
Math.Acos((2 * rotorRadiusSq - distanceEdgeToContactSq) / (2 * rotorRadiusSq));
178 if (contactPositionLocal[1] < 0)
179 rotorContactAngle = 360 - rotorContactAngle;
183 Math3D.AnglesToMatrix({180, 0, rotorContactAngle}, rotationMatrix);
185 Math3D.AnglesToMatrix({180, 0, rotorContactAngle + 180}, rotationMatrix);
188 Math3D.MatrixMultiply3(rotorTransformLocal, rotationMatrix, resultRotation);
190 vector translatedTransform[4];
191 Math3D.MatrixMultiply3(ownerTransform, resultRotation, translatedTransform);
192 translatedTransform[3] = contactPos;
199 if (!resource || resource.IsEmpty())
316 float rotorCenterToContact =
vector.Distance(rotorTransform[3], contact.Position);
317 float rotorRPMMultiplier =
Math.Clamp(rotorCenterToContact / rotorRadius, 0, 1);
320 if (rotorRadius <= 0)
322 if (rotorBladeCount <= 0)
344 super.OnFilteredContact(owner, other, contact);
void ParticleEffectEntity(IEntitySource src, IEntity parent)
void RPC_OnContactBroadcast(vector contactPos, vector contactNormal, int contactShapeIndex1)
Clients don't simulate physics so this rpc replicates collision information for particles,...