|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>PUBG Recoil Control Macro</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<style> |
|
.weapon-btn.active { |
|
transform: scale(0.95); |
|
box-shadow: inset 0 0 10px rgba(0,0,0,0.5); |
|
} |
|
.recoil-pattern { |
|
background-image: radial-gradient(circle, rgba(255,0,0,0.2) 1px, transparent 1px); |
|
background-size: 20px 20px; |
|
} |
|
.macro-key { |
|
transition: all 0.2s ease; |
|
} |
|
.macro-key.active { |
|
transform: translateY(2px); |
|
box-shadow: inset 0 2px 4px rgba(0,0,0,0.3); |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gray-900 text-gray-100 min-h-screen"> |
|
<div class="container mx-auto px-4 py-8"> |
|
<header class="mb-8 text-center"> |
|
<h1 class="text-4xl font-bold text-yellow-400 mb-2"> |
|
<i class="fas fa-crosshairs mr-2"></i>PUBG Recoil Macro |
|
</h1> |
|
<p class="text-gray-400">Advanced recoil control system for PUBG Battlegrounds</p> |
|
<div class="mt-4 bg-gray-800 rounded-lg p-3 max-w-2xl mx-auto"> |
|
<p class="text-sm text-yellow-200"><i class="fas fa-exclamation-triangle mr-2"></i>Warning: Using macros may violate PUBG's terms of service. Use at your own risk.</p> |
|
</div> |
|
</header> |
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6"> |
|
|
|
<div class="bg-gray-800 rounded-xl p-6 shadow-lg"> |
|
<h2 class="text-xl font-semibold mb-4 text-yellow-400"> |
|
<i class="fas fa-gun mr-2"></i>Weapon Profile |
|
</h2> |
|
|
|
<div class="grid grid-cols-2 gap-3 mb-6"> |
|
<button class="weapon-btn bg-gray-700 hover:bg-gray-600 py-3 rounded-lg transition-all flex flex-col items-center" data-weapon="m416"> |
|
<img src="https://via.placeholder.com/50/333/fff?text=M416" class="w-10 h-10 mb-1"> |
|
<span>M416</span> |
|
</button> |
|
<button class="weapon-btn bg-gray-700 hover:bg-gray-600 py-3 rounded-lg transition-all flex flex-col items-center" data-weapon="akm"> |
|
<img src="https://via.placeholder.com/50/333/fff?text=AKM" class="w-10 h-10 mb-1"> |
|
<span>AKM</span> |
|
</button> |
|
<button class="weapon-btn bg-gray-700 hover:bg-gray-600 py-3 rounded-lg transition-all flex flex-col items-center" data-weapon="scar"> |
|
<img src="https://via.placeholder.com/50/333/fff?text=SCAR" class="w-10 h-10 mb-1"> |
|
<span>SCAR-L</span> |
|
</button> |
|
<button class="weapon-btn bg-gray-700 hover:bg-gray-600 py-3 rounded-lg transition-all flex flex-col items-center" data-weapon="beryl"> |
|
<img src="https://via.placeholder.com/50/333/fff?text=Beryl" class="w-10 h-10 mb-1"> |
|
<span>Beryl</span> |
|
</button> |
|
</div> |
|
|
|
<div class="mb-4"> |
|
<label class="block text-gray-400 mb-2">Vertical Recoil</label> |
|
<input type="range" min="1" max="100" value="50" class="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer" id="verticalSlider"> |
|
<div class="flex justify-between text-xs text-gray-400 mt-1"> |
|
<span>Low</span> |
|
<span>Medium</span> |
|
<span>High</span> |
|
</div> |
|
</div> |
|
|
|
<div class="mb-4"> |
|
<label class="block text-gray-400 mb-2">Horizontal Recoil</label> |
|
<input type="range" min="1" max="100" value="30" class="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer" id="horizontalSlider"> |
|
<div class="flex justify-between text-xs text-gray-400 mt-1"> |
|
<span>Low</span> |
|
<span>Medium</span> |
|
<span>High</span> |
|
</div> |
|
</div> |
|
|
|
<div class="mb-6"> |
|
<label class="block text-gray-400 mb-2">Fire Rate (ms delay)</label> |
|
<input type="range" min="50" max="200" value="100" class="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer" id="rateSlider"> |
|
<div class="flex justify-between text-xs text-gray-400 mt-1"> |
|
<span>Fast</span> |
|
<span>Normal</span> |
|
<span>Slow</span> |
|
</div> |
|
</div> |
|
|
|
<button id="saveProfile" class="w-full bg-green-600 hover:bg-green-700 text-white py-2 rounded-lg font-medium transition"> |
|
<i class="fas fa-save mr-2"></i>Save Profile |
|
</button> |
|
</div> |
|
|
|
|
|
<div class="bg-gray-800 rounded-xl p-6 shadow-lg"> |
|
<h2 class="text-xl font-semibold mb-4 text-yellow-400"> |
|
<i class="fas fa-bullseye mr-2"></i>Recoil Pattern |
|
</h2> |
|
|
|
<div class="recoil-pattern bg-gray-900 rounded-lg h-64 mb-4 relative border border-gray-700"> |
|
<div id="recoilPath" class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-1 h-1 bg-red-500 rounded-full"></div> |
|
<div id="recoilLine" class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-0.5 bg-red-500 opacity-70"></div> |
|
</div> |
|
|
|
<div class="grid grid-cols-2 gap-4 mb-6"> |
|
<div class="bg-gray-700 p-3 rounded-lg"> |
|
<div class="text-xs text-gray-400">Vertical</div> |
|
<div id="verticalValue" class="text-lg font-mono">50</div> |
|
</div> |
|
<div class="bg-gray-700 p-3 rounded-lg"> |
|
<div class="text-xs text-gray-400">Horizontal</div> |
|
<div id="horizontalValue" class="text-lg font-mono">30</div> |
|
</div> |
|
<div class="bg-gray-700 p-3 rounded-lg"> |
|
<div class="text-xs text-gray-400">Fire Rate</div> |
|
<div id="rateValue" class="text-lg font-mono">100ms</div> |
|
</div> |
|
<div class="bg-gray-700 p-3 rounded-lg"> |
|
<div class="text-xs text-gray-400">Weapon</div> |
|
<div id="weaponValue" class="text-lg">M416</div> |
|
</div> |
|
</div> |
|
|
|
<button id="testRecoil" class="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 rounded-lg font-medium transition mb-3"> |
|
<i class="fas fa-play mr-2"></i>Test Recoil |
|
</button> |
|
<button id="resetRecoil" class="w-full bg-gray-600 hover:bg-gray-700 text-white py-2 rounded-lg font-medium transition"> |
|
<i class="fas fa-undo mr-2"></i>Reset |
|
</button> |
|
</div> |
|
|
|
|
|
<div class="bg-gray-800 rounded-xl p-6 shadow-lg"> |
|
<h2 class="text-xl font-semibold mb-4 text-yellow-400"> |
|
<i class="fas fa-keyboard mr-2"></i>Macro Settings |
|
</h2> |
|
|
|
<div class="mb-6"> |
|
<label class="block text-gray-400 mb-2">Activation Key</label> |
|
<div class="grid grid-cols-3 gap-2"> |
|
<button class="macro-key bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-key="mouse4"> |
|
<i class="fas fa-mouse-pointer mr-1"></i> Mouse 4 |
|
</button> |
|
<button class="macro-key bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-key="mouse5"> |
|
<i class="fas fa-mouse-pointer mr-1"></i> Mouse 5 |
|
</button> |
|
<button class="macro-key bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-key="ctrl"> |
|
Ctrl |
|
</button> |
|
<button class="macro-key bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-key="shift"> |
|
Shift |
|
</button> |
|
<button class="macro-key bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-key="alt"> |
|
Alt |
|
</button> |
|
<button class="macro-key bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-key="space"> |
|
Space |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div class="mb-6"> |
|
<label class="block text-gray-400 mb-2">Fire Mode</label> |
|
<div class="grid grid-cols-3 gap-2"> |
|
<button class="fire-mode bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-mode="auto"> |
|
Auto |
|
</button> |
|
<button class="fire-mode bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-mode="burst"> |
|
Burst (3) |
|
</button> |
|
<button class="fire-mode bg-gray-700 hover:bg-gray-600 py-3 rounded transition-all" data-mode="single"> |
|
Single |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div class="mb-6"> |
|
<label class="block text-gray-400 mb-2">Scope Sensitivity Multiplier</label> |
|
<input type="range" min="50" max="200" value="100" class="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer" id="scopeSlider"> |
|
<div class="flex justify-between text-xs text-gray-400 mt-1"> |
|
<span>50%</span> |
|
<span>100%</span> |
|
<span>200%</span> |
|
</div> |
|
</div> |
|
|
|
<div class="flex space-x-3"> |
|
<button id="exportConfig" class="flex-1 bg-purple-600 hover:bg-purple-700 text-white py-2 rounded-lg font-medium transition"> |
|
<i class="fas fa-file-export mr-2"></i>Export |
|
</button> |
|
<button id="importConfig" class="flex-1 bg-indigo-600 hover:bg-indigo-700 text-white py-2 rounded-lg font-medium transition"> |
|
<i class="fas fa-file-import mr-2"></i>Import |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="mt-8 bg-gray-800 rounded-xl p-6 shadow-lg"> |
|
<h2 class="text-xl font-semibold mb-4 text-yellow-400"> |
|
<i class="fas fa-code mr-2"></i>Macro Script |
|
</h2> |
|
<div class="bg-gray-900 p-4 rounded-lg font-mono text-sm overflow-x-auto"> |
|
<pre id="scriptOutput">// Select a weapon and configure settings to generate script</pre> |
|
</div> |
|
<div class="mt-4 flex justify-end"> |
|
<button id="copyScript" class="bg-gray-700 hover:bg-gray-600 px-4 py-2 rounded-lg transition"> |
|
<i class="fas fa-copy mr-2"></i>Copy to Clipboard |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
|
|
const config = { |
|
weapon: 'm416', |
|
vertical: 50, |
|
horizontal: 30, |
|
rate: 100, |
|
key: 'mouse4', |
|
mode: 'auto', |
|
scope: 100 |
|
}; |
|
|
|
|
|
const weaponProfiles = { |
|
m416: { name: 'M416', verticalBase: 50, horizontalBase: 30 }, |
|
akm: { name: 'AKM', verticalBase: 70, horizontalBase: 40 }, |
|
scar: { name: 'SCAR-L', verticalBase: 45, horizontalBase: 25 }, |
|
beryl: { name: 'Beryl M762', verticalBase: 65, horizontalBase: 50 } |
|
}; |
|
|
|
|
|
const weaponBtns = document.querySelectorAll('.weapon-btn'); |
|
const macroKeys = document.querySelectorAll('.macro-key'); |
|
const fireModes = document.querySelectorAll('.fire-mode'); |
|
const verticalSlider = document.getElementById('verticalSlider'); |
|
const horizontalSlider = document.getElementById('horizontalSlider'); |
|
const rateSlider = document.getElementById('rateSlider'); |
|
const scopeSlider = document.getElementById('scopeSlider'); |
|
const verticalValue = document.getElementById('verticalValue'); |
|
const horizontalValue = document.getElementById('horizontalValue'); |
|
const rateValue = document.getElementById('rateValue'); |
|
const weaponValue = document.getElementById('weaponValue'); |
|
const recoilPath = document.getElementById('recoilPath'); |
|
const recoilLine = document.getElementById('recoilLine'); |
|
const testRecoilBtn = document.getElementById('testRecoil'); |
|
const resetRecoilBtn = document.getElementById('resetRecoil'); |
|
const saveProfileBtn = document.getElementById('saveProfile'); |
|
const exportConfigBtn = document.getElementById('exportConfig'); |
|
const importConfigBtn = document.getElementById('importConfig'); |
|
const copyScriptBtn = document.getElementById('copyScript'); |
|
const scriptOutput = document.getElementById('scriptOutput'); |
|
|
|
|
|
function initUI() { |
|
|
|
document.querySelector(`.weapon-btn[data-weapon="${config.weapon}"]`).classList.add('active'); |
|
weaponValue.textContent = weaponProfiles[config.weapon].name; |
|
|
|
|
|
verticalSlider.value = config.vertical; |
|
horizontalSlider.value = config.horizontal; |
|
rateSlider.value = config.rate; |
|
scopeSlider.value = config.scope; |
|
|
|
|
|
document.querySelector(`.macro-key[data-key="${config.key}"]`).classList.add('active'); |
|
|
|
|
|
document.querySelector(`.fire-mode[data-mode="${config.mode}"]`).classList.add('active'); |
|
|
|
|
|
updateValues(); |
|
generateScript(); |
|
} |
|
|
|
|
|
function updateValues() { |
|
verticalValue.textContent = config.vertical; |
|
horizontalValue.textContent = config.horizontal; |
|
rateValue.textContent = `${config.rate}ms`; |
|
} |
|
|
|
|
|
weaponBtns.forEach(btn => { |
|
btn.addEventListener('click', () => { |
|
weaponBtns.forEach(b => b.classList.remove('active')); |
|
btn.classList.add('active'); |
|
|
|
config.weapon = btn.dataset.weapon; |
|
const profile = weaponProfiles[config.weapon]; |
|
|
|
|
|
config.vertical = profile.verticalBase; |
|
config.horizontal = profile.horizontalBase; |
|
|
|
|
|
verticalSlider.value = config.vertical; |
|
horizontalSlider.value = config.horizontal; |
|
|
|
weaponValue.textContent = profile.name; |
|
updateValues(); |
|
generateScript(); |
|
}); |
|
}); |
|
|
|
|
|
macroKeys.forEach(key => { |
|
key.addEventListener('click', () => { |
|
macroKeys.forEach(k => k.classList.remove('active')); |
|
key.classList.add('active'); |
|
config.key = key.dataset.key; |
|
generateScript(); |
|
}); |
|
}); |
|
|
|
|
|
fireModes.forEach(mode => { |
|
mode.addEventListener('click', () => { |
|
fireModes.forEach(m => m.classList.remove('active')); |
|
mode.classList.add('active'); |
|
config.mode = mode.dataset.mode; |
|
generateScript(); |
|
}); |
|
}); |
|
|
|
|
|
verticalSlider.addEventListener('input', () => { |
|
config.vertical = verticalSlider.value; |
|
verticalValue.textContent = config.vertical; |
|
generateScript(); |
|
}); |
|
|
|
horizontalSlider.addEventListener('input', () => { |
|
config.horizontal = horizontalSlider.value; |
|
horizontalValue.textContent = config.horizontal; |
|
generateScript(); |
|
}); |
|
|
|
rateSlider.addEventListener('input', () => { |
|
config.rate = rateSlider.value; |
|
rateValue.textContent = `${config.rate}ms`; |
|
generateScript(); |
|
}); |
|
|
|
scopeSlider.addEventListener('input', () => { |
|
config.scope = scopeSlider.value; |
|
generateScript(); |
|
}); |
|
|
|
|
|
testRecoilBtn.addEventListener('click', () => { |
|
const patternContainer = document.querySelector('.recoil-pattern'); |
|
const width = patternContainer.clientWidth; |
|
const height = patternContainer.clientHeight; |
|
|
|
|
|
recoilLine.style.height = '0'; |
|
recoilLine.style.transform = 'translate(-50%, -50%) rotate(0)'; |
|
|
|
|
|
const vertical = config.vertical / 10; |
|
const horizontal = config.horizontal / 50; |
|
const steps = 20; |
|
let path = ''; |
|
|
|
|
|
let currentY = 0; |
|
let currentX = 0; |
|
let angle = 0; |
|
|
|
const interval = setInterval(() => { |
|
|
|
const randX = (Math.random() - 0.5) * 5; |
|
const randY = (Math.random() - 0.5) * 2; |
|
|
|
currentY += vertical / steps + randY; |
|
currentX += (Math.random() > 0.5 ? horizontal : -horizontal) / steps + randX; |
|
|
|
|
|
currentY = Math.min(currentY, height/2 - 10); |
|
currentX = Math.max(Math.min(currentX, width/2 - 10), -width/2 + 10); |
|
|
|
|
|
recoilPath.style.transform = `translate(calc(-50% + ${currentX}px), calc(-50% + ${currentY}px))`; |
|
|
|
|
|
angle = Math.atan2(currentY, currentX) * (180 / Math.PI); |
|
const length = Math.sqrt(currentX*currentX + currentY*currentY); |
|
recoilLine.style.height = `${length}px`; |
|
recoilLine.style.transform = `translate(-50%, -50%) rotate(${-angle}deg)`; |
|
|
|
}, 50); |
|
|
|
|
|
setTimeout(() => { |
|
clearInterval(interval); |
|
}, 2000); |
|
}); |
|
|
|
|
|
resetRecoilBtn.addEventListener('click', () => { |
|
recoilPath.style.transform = 'translate(-50%, -50%)'; |
|
recoilLine.style.height = '0'; |
|
}); |
|
|
|
|
|
saveProfileBtn.addEventListener('click', () => { |
|
alert(`Profile for ${weaponProfiles[config.weapon].name} saved!`); |
|
}); |
|
|
|
|
|
exportConfigBtn.addEventListener('click', () => { |
|
const configStr = JSON.stringify(config, null, 2); |
|
alert('Copy this configuration:\n\n' + configStr); |
|
}); |
|
|
|
|
|
importConfigBtn.addEventListener('click', () => { |
|
const configStr = prompt('Paste your configuration JSON:'); |
|
if (configStr) { |
|
try { |
|
const importedConfig = JSON.parse(configStr); |
|
Object.assign(config, importedConfig); |
|
initUI(); |
|
} catch (e) { |
|
alert('Invalid configuration format'); |
|
} |
|
} |
|
}); |
|
|
|
|
|
copyScriptBtn.addEventListener('click', () => { |
|
navigator.clipboard.writeText(scriptOutput.textContent) |
|
.then(() => { |
|
const originalText = copyScriptBtn.innerHTML; |
|
copyScriptBtn.innerHTML = '<i class="fas fa-check mr-2"></i>Copied!'; |
|
setTimeout(() => { |
|
copyScriptBtn.innerHTML = originalText; |
|
}, 2000); |
|
}) |
|
.catch(err => { |
|
console.error('Failed to copy: ', err); |
|
}); |
|
}); |
|
|
|
|
|
function generateScript() { |
|
|
|
let script = `// PUBG Recoil Control Macro for ${weaponProfiles[config.weapon].name} |
|
// Activation Key: ${config.key.toUpperCase()} |
|
// Fire Mode: ${config.mode.toUpperCase()} |
|
// Vertical Recoil: ${config.vertical} | Horizontal Recoil: ${config.horizontal} |
|
// Fire Rate: ${config.rate}ms | Scope Sensitivity: ${config.scope}% |
|
|
|
function main() { |
|
// Check if left mouse button is pressed (firing) |
|
if (event.isPressed("MOUSE_LEFT")) { |
|
// Apply recoil compensation |
|
${getRecoilCompensationCode()} |
|
|
|
// Add delay between shots based on fire rate |
|
delay(${config.rate}); |
|
} |
|
} |
|
|
|
// Bind to activation key |
|
bind("${config.key.toUpperCase()}", "TOGGLE", main);`; |
|
|
|
scriptOutput.textContent = script; |
|
} |
|
|
|
|
|
function getRecoilCompensationCode() { |
|
let code = ''; |
|
const verticalMove = config.vertical / 1000; |
|
const horizontalMove = config.horizontal / 1000; |
|
|
|
if (config.mode === 'auto') { |
|
code = `// Continuous recoil control for auto fire |
|
moveMouseRelative(0, ${verticalMove.toFixed(3)}); |
|
if (random() > 0.5) { |
|
moveMouseRelative(${horizontalMove.toFixed(3)}, 0); |
|
} else { |
|
moveMouseRelative(-${horizontalMove.toFixed(3)}, 0); |
|
}`; |
|
} else if (config.mode === 'burst') { |
|
code = `// Burst fire recoil control (3 shots) |
|
if (burstCount < 3) { |
|
moveMouseRelative(0, ${(verticalMove * 1.5).toFixed(3)}); |
|
if (random() > 0.5) { |
|
moveMouseRelative(${(horizontalMove * 1.2).toFixed(3)}, 0); |
|
} else { |
|
moveMouseRelative(-${(horizontalMove * 1.2).toFixed(3)}, 0); |
|
} |
|
burstCount++; |
|
} else { |
|
delay(300); // Burst delay |
|
burstCount = 0; |
|
}`; |
|
} else { |
|
code = `// Single shot recoil control |
|
moveMouseRelative(0, ${(verticalMove * 2).toFixed(3)}); |
|
if (random() > 0.5) { |
|
moveMouseRelative(${(horizontalMove * 1.5).toFixed(3)}, 0); |
|
} else { |
|
moveMouseRelative(-${(horizontalMove * 1.5).toFixed(3)}, 0); |
|
}`; |
|
} |
|
|
|
return code; |
|
} |
|
|
|
|
|
initUI(); |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=fvo123456/test1" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |