Files
reallife-gamemode/ReallifeGamemode.Client/admin/anticheat.ts
2021-04-11 14:43:18 +02:00

217 lines
7.4 KiB
TypeScript

export default function antiCheat(globalData: IGlobalData) {
const allowedWeaponHashes: number[] = [
453432689,
3219281620,
1593441988,
2578377531,
736523883,
171789620,
3220176749,
487013001,
2210333304,
1649403952,
100416529,
2725352035,
2508868239,
2343591895,
3638508604,
1737195953,
-270015777,
911657153,
-1716589765,
-2084633992,
-1075685676,
-1786099057,
-1074790547
]
mp.events.add("playerJoin", () => {
mp.events.call("client:respawning")
});
mp.events.add("client:checkInvincible", () => {
if (mp.players.local.dimension == 0) return
if (!Behaviour.active) return
var healthBefore = Behaviour.health
mp.players.local.applyDamageTo(1, true);
setTimeout(() => {
if (healthBefore == Behaviour.health) {
if (mp.players.local.getHealth() > 0) {
mp.events.callRemote('CLIENT:CheatDetection', "Static Godmode")
}
}
else {
Behaviour.sleep(1)
mp.players.local.setHealth(healthBefore + 100)
}
}, 500);
})
setInterval(() => {
mp.events.call("client:checkInvincible")
}, 30000);
mp.events.add('SERVER:AntiCheat:weaponSwap', () => {
Behaviour.resetWeapon()
})
mp.events.add('playerWeaponShot', () => {
if (Behaviour.checkWeaponhash()) {
mp.events.callRemote("CLIENT:CheatDetection", "Unallowed Weapon", Behaviour.weapon)
}
if (Behaviour.reloadingWeapon) {
mp.events.callRemote("CLIENT:CheatDetection", "No Reload")
Behaviour.resetWeapon()
}
Behaviour.updateMagSize()
});
mp.keys.bind(0x52, true, () => {
Behaviour.reloading = true
setTimeout(() => {
Behaviour.magazin = mp.game.weapon.getWeaponClipSize(mp.game.invoke(`0x0A6DB4965674D243`, mp.players.local.handle))
Behaviour.reloading = false
}, 2000);
})
mp.events.add('client:respawning', () => {
if (Behaviour.active) Behaviour.sleep(3)
})
class PlayerBehaviour {
active: boolean;
flags: number;
hits: number;
reloadingWeapon: boolean;
pos: Vector3Mp;
health: number;
weapon: number;
magazin: number;
firstshot: boolean;
reloading: boolean;
range_to_btm: number;
constructor() {
this.active = true
this.flags, this.hits = 0
this.reloadingWeapon = false
this.pos = mp.players.local.position
this.health = Number(mp.players.local.getHealth()) + Number(mp.players.local.getArmour())
this.weapon = Number(mp.game.invoke(`0x0A6DB4965674D243`, mp.players.local.handle));
this.magazin = mp.game.weapon.getWeaponClipSize(this.weapon)
this.firstshot = true
}
sleep(duration) {
this.active = false
setTimeout(() => {
this.active = true
}, duration * 1000);
}
secs() {
return Math.round(Date.now() / 1000)
}
isRagdollOnHeight(height) {
this.range_to_btm = mp.game.gameplay.getGroundZFor3dCoord(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, 0, false);
if (Math.abs(mp.players.local.position.z - this.range_to_btm) > Math.abs(height - this.range_to_btm)) {
if (!this.isWalking()) {
return false;
} else if (this.active && this.range_to_btm > 0) {
return true;
}
return false
}
}
isWalking() {
if (mp.players.local.isFalling() || mp.players.local.isRagdoll()) return false
else if (!mp.players.local.vehicle) return true
}
subtractVector(v1, v2) {
return { "x": v1.x - v2.x, "y": v1.y - v2.y, "z": v1.z - v2.z }
}
VehicleFasterThan(max) {
if (mp.players.local.vehicle) {
if (mp.players.local.vehicle.getClass() != 16) {
return mp.players.local.vehicle.getSpeed() * 3.6 > max
}
}
return false
}
checkCarPos(maxHeight = 50) {
if (mp.players.local.vehicle) {
if (mp.players.local.vehicle.getClass() != 15 && mp.players.local.vehicle.getClass() != 16) {
this.range_to_btm = mp.game.gameplay.getGroundZFor3dCoord(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, 0, false);
if (mp.players.local.position.z - this.range_to_btm > maxHeight + this.range_to_btm) {
return true
}
return false
}
}
}
checkWeaponhash() {
let h = this.weapon;
if (allowedWeaponHashes.indexOf(h) === -1) {
mp.gui.chat.push("unallowed weapon: " + h);
return true
}
return false
}
resetWeapon() {
this.weapon = mp.game.invoke(`0x0A6DB4965674D243`, mp.players.local.handle)
this.magazin = mp.game.weapon.getWeaponClipSize(this.weapon)
this.reloadingWeapon = false
}
updateMagSize() {
this.weapon = mp.game.invoke(`0x0A6DB4965674D243`, mp.players.local.handle)
if (this.firstshot) {
this.firstshot = false
this.resetWeapon()
}
this.magazin -= 1
if (this.magazin <= 0) {
this.reloadingWeapon = true
setTimeout(() => {
this.reloadingWeapon = false
this.resetWeapon()
}, 1250);
}
}
}
var Behaviour = new PlayerBehaviour()
var loop = Behaviour.secs()
mp.events.add("render", () => {
Behaviour.health = Number(mp.players.local.getHealth()) + Number(mp.players.local.getArmour())
if (loop < Behaviour.secs()) {
if (Behaviour.active) {
let Difference = Behaviour.subtractVector(Behaviour.pos, mp.players.local.position)
if (Math.abs(Difference.x) > 30 || Math.abs(Difference.y) > 30) {
if (Behaviour.isWalking()) {
mp.events.callRemote("CLIENT:CheatDetection", "Flyhack/Teleport")
}
}
if (mp.players.local.vehicle) {
if (Behaviour.checkCarPos(25)) {
mp.events.callRemote("CLIENT:CheatDetection", "Vehicle Flyhack")
}
if (Behaviour.VehicleFasterThan(250)) {
mp.events.callRemote("CLIENT:CheatDetection", "Vehicle Speedhack")
}
}
}
Behaviour.pos = mp.players.local.position
loop = Behaviour.secs() + 3;
}
});
setInterval(() => {
let hp = Behaviour.health
setTimeout(() => {
if (hp < Behaviour.health && Behaviour.active) {
mp.events.callRemote("CLIENT:CheatDetection", "Healkey (unexpected HP added)")
}
}, 400);
}, 500);
}