298 lines
18 KiB
TypeScript
298 lines
18 KiB
TypeScript
// @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 {
|
|
}
|
|
}
|
|
}
|