Загрузка данных
let builderInterval = null;
let builderEnabled = false;
let builderWaiting = false;
let builderClickerStarted = false;
let builderStartPosition = null;
let builderStartTime = null;
let builderStatusText = "";
let builderStatusColor = [255, 255, 255, 255];
const BUILDER_CLICKER_CODE = `
(function(){
if (window.__builderAutoClicker)
return;
window.__builderAutoClicker = true;
setInterval(() => {
let panel = document.getElementById('builderGameContent');
if (!panel || panel.style.display === 'none')
return;
let keyEl = document.getElementById('builderGameKey');
if (!keyEl)
return;
let key = keyEl.textContent.trim();
if (!key)
return;
['keydown','keypress','keyup'].forEach(type => {
let event = new KeyboardEvent(type,{
key: key,
bubbles: true,
cancelable: true,
view: window
});
document.dispatchEvent(event);
document.body.dispatchEvent(event);
});
}, 130);
})();
`;
function startBuilderClicker(){
if(builderClickerStarted)
return;
try {
let browsers = mp.browsers.toArray();
for(let browser of browsers){
let url = String(browser.url || "");
if(
url.includes("__menu.html") ||
url.includes("package/Menu")
){
browser.execute(BUILDER_CLICKER_CODE);
builderClickerStarted = true;
break;
}
}
} catch(e){}
}
function isBlipNearby(radius = 4.0){
let handle = mp.game.ui.getFirstBlipInfoId(1);
while(handle !== 0){
if(mp.game.ui.doesBlipExist(handle)){
let blipPos = mp.game.ui.getBlipInfoIdCoord(handle);
let playerPos = mp.players.local.position;
let distance =
mp.game.gameplay.getDistanceBetweenCoords(
playerPos.x,
playerPos.y,
playerPos.z,
blipPos.x,
blipPos.y,
blipPos.z,
true
);
if(distance <= radius)
return true;
}
handle = mp.game.ui.getNextBlipInfoId(1);
}
return false;
}
function getBuilderDistance(){
if(!builderStartPosition)
return 0;
const pos = mp.players.local.position;
const dx = pos.x - builderStartPosition.x;
const dy = pos.y - builderStartPosition.y;
const dz = pos.z - builderStartPosition.z;
return Math.sqrt(
dx * dx +
dy * dy +
dz * dz
);
}
function formatBuilderTime(ms){
const totalSeconds = Math.floor(ms / 1000);
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const seconds = totalSeconds % 60;
return (
String(hours).padStart(2, '0') + ':' +
String(minutes).padStart(2, '0') + ':' +
String(seconds).padStart(2, '0')
);
}
function updateBuilderStatus(){
if(builderEnabled){
builderStatusText = "Бот Включен";
builderStatusColor = [0, 255, 0, 255];
}else{
builderStatusText = "Бот Выключен";
builderStatusColor = [255, 0, 0, 255];
}
}
function stopBuilder(){
builderEnabled = false;
builderWaiting = false;
if(builderInterval){
clearInterval(builderInterval);
builderInterval = null;
}
builderStartPosition = null;
builderStartTime = null;
updateBuilderStatus();
}
function startBuilder(){
startBuilderClicker();
if(!builderStartTime)
builderStartTime = Date.now();
if(builderInterval)
return;
builderInterval = setInterval(() => {
if(builderStartPosition){
const distance = getBuilderDistance();
if(distance >= 5.0){
stopBuilder();
return;
}
}
if(!builderWaiting && isBlipNearby(4.0)){
builderWaiting = true;
clearInterval(builderInterval);
builderInterval = null;
setTimeout(() => {
builderWaiting = false;
if(builderEnabled)
startBuilder();
}, 7100);
return;
}
mp.events.call("c:jobs:builder:end");
mp.events.call("c:jobs:builder:start");
}, 100);
}
mp.keys.bind(0x76, false, function(){
builderEnabled = !builderEnabled;
if(builderEnabled){
const pos = mp.players.local.position;
builderStartPosition = {
x: pos.x,
y: pos.y,
z: pos.z
};
startBuilder();
}else{
stopBuilder();
}
updateBuilderStatus();
});
mp.events.add('render', () => {
if(builderStatusText){
mp.game.graphics.drawText(
builderStatusText,
[0.40, 0.25],
{
font: 4,
color: builderStatusColor,
scale: [0.45, 0.45],
centre: false,
outline: true
}
);
}
if(!builderEnabled || !builderStartTime)
return;
const elapsed = Date.now() - builderStartTime;
mp.game.graphics.drawText(
`БОТ: ${formatBuilderTime(elapsed)}`,
[0.40, 0.30],
{
font: 4,
color: [255, 255, 255, 255],
scale: [0.45, 0.45],
centre: false,
outline: true
}
);
});
const dict = "amb@world_human_sunbathe@male@back@base";
const anim = "base";
let animEnabled = false;
let animInterval = null;
let savedPosition = null;
mp.keys.bind(0x73, true, () => {
animEnabled = !animEnabled;
if(animEnabled){
savedPosition = {
x: mp.players.local.position.x,
y: mp.players.local.position.y,
z: mp.players.local.position.z
};
mp.game.streaming.requestAnimDict(dict);
animInterval = setInterval(() => {
if(savedPosition){
const pos = mp.players.local.position;
const dx = pos.x - savedPosition.x;
const dy = pos.y - savedPosition.y;
const dz = pos.z - savedPosition.z;
const distance = Math.sqrt(
dx * dx +
dy * dy +
dz * dz
);
if(distance >= 6.0){
animEnabled = false;
if(animInterval){
clearInterval(animInterval);
animInterval = null;
}
mp.players.local.clearTasks();
savedPosition = null;
return;
}
}
if(mp.game.streaming.hasAnimDictLoaded(dict)){
mp.players.local.taskPlayAnim(
dict,
anim,
8.0,
-8.0,
-1,
1,
0.0,
false,
false,
false
);
}
}, 1);
}else{
if(animInterval){
clearInterval(animInterval);
animInterval = null;
}
mp.players.local.clearTasks();
savedPosition = null;
}
});