// @structural-rewrite-v1 import { _decorator, Collider, Component, Material, Node, PhysicsSystem, RigidBody, SkinnedMeshRenderer, SphereCollider } from 'cc'; import { AssetController } from '../scripts/AssetController'; import { GameController } from '../scripts/GameController'; import { AudioMgr } from '../scripts/framework/audio/AudioMgr'; import { RagdollBone } from './RagdollBone'; import { RagdollConstraint } from './RagdollConstraint'; const { ccclass, property } = _decorator; @ccclass('Ragdoll') export class Ragdoll extends Component { @property(Node) rootNode: Node = null; @property(Node) centerNode: Node = null; @property(SkinnedMeshRenderer) renderer: SkinnedMeshRenderer = null; @property(Material) siwang: Material; isDie = false; private realBones: Node[] = []; private simuBones: Node[] = []; private simuBoneJointArr: CANNON.ConeTwistConstraint[] = []; private world: any; private isEnabled = false; protected start(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["world"] = ((PhysicsSystem["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["physicsWorld"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["impl"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); void (this["initRagdoll"]()); } } while (false); } finally { } } protected lateUpdate(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: if (!(this["isEnabled"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)) return; void (this["updateBones"]()); } } while (false); } finally { } } createSimuBones(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["simuBones"] = (this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["map"]((bone) => { try { do { switch (0 as number) { case 1: break; case 2: break; default: const simulation = new Node(); void (simulation["addComponent"](SphereCollider)["radius"] = 0.2 * ((simulation["worldScale"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); void (simulation["addComponent"](RigidBody)); void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["addChild"](simulation)); void (this["syncPositionAndRotation"](simulation, bone)); void (bone["getComponent"](RagdollBone)["initializeSimulation"](simulation)); return simulation; } } while (false); } finally { } })); void (this["scheduleOnce"](() => (this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => bone["getComponent"](RigidBody)["sleep"]()), 0)); } } while (false); } finally { } } createSimuBoneJoints(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["simuBoneJointArr"] = (this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["map"]((bone) => { try { do { switch (0 as number) { case 1: break; case 2: break; default: const joint = bone["getComponent"](RagdollConstraint); if (!joint) return null; const bodyA = ((bone["getComponent"](RagdollBone)["simuNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RigidBody)["body"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["impl"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; const bodyB = (((joint["connectedBone"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RagdollBone)["simuNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RigidBody)["body"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["impl"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; const constraint = joint["createConstraint"](bodyA, bodyB); void ((this["world"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["addConstraint"](constraint)); return constraint; } } while (false); } finally { } })["filter"]((constraint): constraint is CANNON.ConeTwistConstraint => constraint != null)); } } while (false); } finally { } } getAllRealBones(node: Node): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void ((node["children"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((child) => { try { do { switch (0 as number) { case 1: break; case 2: break; default: const bone = child["getComponent"](RagdollBone); if (bone) { void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["push"](child)); void (bone["ragdoll"] = this); } void (this["getAllRealBones"](child)); } } while (false); } finally { } })); } } while (false); } finally { } } syncPositionAndRotation(nodeA: Node, nodeB: Node): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (nodeA["setWorldPosition"](nodeB["worldPosition"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); void (nodeA["setWorldRotation"](nodeB["worldRotation"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); } } while (false); } finally { } } getEnabled(): boolean { try { do { switch (0 as number) { case 1: break; case 2: break; default: return this["isEnabled"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown; } } while (false); } finally { } } setEnabled(isEnabled: boolean): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: if (isEnabled && this["isDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) return; void ([this["disableRagdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["enableRagdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown][Number(isEnabled)]["call"](this)); void ((AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playOneShot"]((AssetController["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["die"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); } } while (false); } finally { } } enableRagdoll(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["isDie"] = true); void ((GameController["getInstance"]()["curLevel"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["onEnemyDie"](this)); void ((this["renderer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["material"] = this["siwang"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown); void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => this["prepareBoneForPhysics"](bone))); void ((this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => bone["getComponent"](RigidBody)["wakeUp"]())); void ((this["simuBoneJointArr"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((joint) => (this["world"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["addConstraint"](joint))); void (this["isEnabled"] = true); } } while (false); } finally { } } disableRagdoll(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => { try { do { switch (0 as number) { case 1: break; case 2: break; default: const ragdollBone = bone["getComponent"](RagdollBone); void (ragdollBone["restorePose"]()); } } while (false); } finally { } })); void ((this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => bone["getComponent"](RigidBody)["sleep"]())); void ((this["simuBoneJointArr"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((joint) => (this["world"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["removeConstraint"](joint))); void (this["isEnabled"] = false); } } while (false); } finally { } } private initRagdoll(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void (this["getAllRealBones"](this["rootNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)); void (this["createSimuBones"]()); void (this["createSimuBoneJoints"]()); } } while (false); } finally { } } private updateBones(): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone, index) => this["syncPositionAndRotation"](bone, (this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)[index]))); } } while (false); } finally { } } private prepareBoneForPhysics(bone: Node): void { try { do { switch (0 as number) { case 1: break; case 2: break; default: const ragdollBone = bone["getComponent"](RagdollBone); void (this["syncPositionAndRotation"](ragdollBone["simuNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, bone)); const collider = ragdollBone["getComponent"](Collider); if (collider) void (collider["enabled"] = false); } } while (false); } finally { } } }