Files
reallife-gamemode/ReallifeGamemode.Client/util/animationSync.ts
2021-04-07 00:26:11 +02:00

124 lines
4.5 KiB
TypeScript

export default function animationSync() {
let blockInput = false;
mp.events.add("SERVER:LoadAnimations", () => {
animationSyncData.register("Cuffed", "mp_arresting", "idle", -1, true, 50);
animationSyncData.register("doArrest", "mp_arrest_paired", "cop_p2_back_right", 3760, false, 0);
animationSyncData.register("getArrest", "mp_arrest_paired", "crook_p2_back_right", 3760, false, 0);
animationSyncData.register("doUncuff", "mp_arresting", "a_uncuff", 5500, false, 0);
animationSyncData.register("getUncuff", "mp_arresting", "b_uncuff", 5500, false, 0);
});
const animationSyncData =
{
animations: [],
register: function (name, animDict, animName, duration, loop, flag) {
let id = mp.game.joaat(name);
if (!this.animations.hasOwnProperty(id)) {
this.animations[id] =
{
id: id,
name: name,
animDict: animDict,
animName: animName,
duration: duration,
loop: loop,
flag: flag
};
} else {
mp.game.graphics.notify("Animation Sync Error: ~r~Duplicate Entry");
}
}
};
/*
mp.events.add("entityStreamIn", (entity) => {
if (entity.type === "player" && entity.animationData) {
if (!entity.animationData.playOnStream)
return;
animationSync.playAnim(entity, mp.game.joaat(entity.animationData.name));
}
});
*/
setInterval(() => {
if (mp.players.local.getVariable("AnimationData")) {
let index = mp.game.joaat(mp.players.local.getVariable("AnimationData"));
let currentAnim = animationSyncData.animations[index];
let { id, name, animDict, animName, duration, loop, flag } = currentAnim;
if (loop) {
blockInput = true;
} else {
blockInput = false;
}
}
mp.players.forEachInStreamRange(
(player) => {
if (!player.getVariable("AnimationData")) {
return;
}
let index = mp.game.joaat(player.getVariable("AnimationData"));
let currentAnim = animationSyncData.animations[index];
let { id, name, animDict, animName, duration, loop, flag } = currentAnim;
if (loop && !player.isPlayingAnim(animDict, animName, 3)) {
loadAnimDict(animDict, function () {
mp.players.exists(player) && 0 !== player.handle && player.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1)
});
}
});
}, 100);
mp.events.addDataHandler("AnimationData", (entity: PlayerMp, string) => {
entity.clearTasksImmediately();
if (string == null) {
return;
}
let index = mp.game.joaat(string);
if (!animationSyncData.animations.hasOwnProperty(index)) return;
let animData = animationSyncData.animations[index];
let { id, name, animDict, animName, duration, loop, flag } = animData;
loadAnimDict(animDict, function () {
mp.players.exists(entity) && 0 !== entity.handle && entity.taskPlayAnim(animDict, animName, 1, 0, duration, parseInt(flag), 0, !1, !1, !1)
});
if (!loop) {
let a = setInterval(function () {
mp.events.callRemote("CLIENT:ClearAnimationData", entity);
mp.events.callRemote("CLIENT:AnimPairTransition");
clearInterval(a);
}, duration);
}
});
mp.events.add("render", () => {
if (blockInput) {
mp.game.controls.disableControlAction(32, 25, true);
mp.game.controls.disableControlAction(32, 24, true);
mp.game.controls.disableControlAction(32, 22, true);
}
});
function loadAnimDict(animDict, callback) {
if (mp.game.streaming.hasAnimDictLoaded(animDict)) return void callback();
mp.game.streaming.requestAnimDict(animDict);
let c = setInterval(function () {
mp.game.streaming.hasAnimDictLoaded(animDict) && (clearInterval(c), callback())
}, 100)
}
mp.events.add("SERVER:SetInFrontPosition", (entity) => {
mp.events.callRemote("CLIENT:SET_InFrontOfPos", entity.getOffsetFromInWorldCoords(0, 1, 0));
});
}