anti cheat
This commit is contained in:
210
ReallifeGamemode.Client/admin/anticheat.ts
Normal file
210
ReallifeGamemode.Client/admin/anticheat.ts
Normal file
@@ -0,0 +1,210 @@
|
||||
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
|
||||
]
|
||||
|
||||
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) {
|
||||
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.gui.chat.push("tp hack");
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user