// ==UserScript==
// @name 3D Game for Drawaria
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 3D Game on drawaria.online
// @author YouTubeDrawaria
// @match https://drawaria.online/*
// @require https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js
// @grant none
// @icon https://drawaria.online/avatar/cache/86e33830-86ea-11ec-8553-bff27824cf71.jpg
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Clear existing content
while (document.body.firstChild) {
document.body.removeChild(document.body.firstChild);
}
// Create game container with high z-index
const gameContainer = document.createElement('div');
gameContainer.style.position = 'fixed';
gameContainer.style.top = '0';
gameContainer.style.left = '0';
gameContainer.style.width = '100%';
gameContainer.style.height = '100%';
gameContainer.style.zIndex = '9999';
gameContainer.style.overflow = 'hidden';
gameContainer.tabIndex = 0;
document.body.appendChild(gameContainer);
gameContainer.focus();
// Main screen container
const mainScreenContainer = document.createElement('div');
mainScreenContainer.style.position = 'absolute';
mainScreenContainer.style.top = '40%';
mainScreenContainer.style.left = '50%';
mainScreenContainer.style.transform = 'translate(-50%, -50%)';
mainScreenContainer.style.textAlign = 'center';
mainScreenContainer.innerHTML = `
<div style="display: inline-block; text-align: center;">
<img id="logo" src="https://i.ibb.co/mrtyK2Z8/3dgame-fw.png" alt="3D Game Logo" style="width: 500px; margin-bottom: 50px;">
<br><br>
<button id="startButton" style="padding: 30px 60px; font-size: 30px; cursor: pointer; background: linear-gradient(45deg, #FFD700, #FFA500); color: white; border: none; border-radius: 15px; box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); transition: background-color 0.3s, transform 0.3s;">Start Game</button>
</div>
`;
gameContainer.appendChild(mainScreenContainer);
// Game elements
const scoreDiv = document.createElement('div');
scoreDiv.id = 'score';
scoreDiv.style.position = 'absolute';
scoreDiv.style.top = '20px';
scoreDiv.style.left = '20px';
scoreDiv.style.color = 'white';
scoreDiv.style.fontFamily = 'Arial';
scoreDiv.style.fontSize = '24px';
scoreDiv.textContent = 'Score: 0';
scoreDiv.style.display = 'none';
gameContainer.appendChild(scoreDiv);
const gameOverDiv = document.createElement('div');
gameOverDiv.id = 'gameOver';
gameOverDiv.style.display = 'none';
gameOverDiv.style.position = 'absolute';
gameOverDiv.style.top = '50%';
gameOverDiv.style.left = '50%';
gameOverDiv.style.transform = 'translate(-50%, -50%)';
gameOverDiv.style.background = 'rgba(0,0,0,0.8)';
gameOverDiv.style.color = 'white';
gameOverDiv.style.padding = '20px';
gameOverDiv.style.textAlign = 'center';
gameOverDiv.style.fontFamily = 'Arial';
gameOverDiv.style.zIndex = '10000';
gameOverDiv.innerHTML = `
<h2>Game Over!</h2>
<p>Final Score: <span id="finalScore">0</span></p>
<button onclick="window.restartGame()" style="padding: 20px 40px; font-size: 24px; cursor: pointer; background: linear-gradient(45deg, #FFD700, #FFA500); color: white; border: none; border-radius: 10px; box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); transition: background-color 0.3s, transform 0.3s;">Play Again</button>
<br><br>
<button onclick="window.location.reload()" style="padding: 20px 40px; font-size: 24px; cursor: pointer; background: linear-gradient(45deg, #FF4500, #FF8C00); color: white; border: none; border-radius: 10px; box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); transition: background-color 0.3s, transform 0.3s; margin-bottom: 20px;">Restart Page</button>
`;
gameContainer.appendChild(gameOverDiv);
let scene, camera, renderer, car;
let moveLeft = false, moveRight = false;
let obstacles = [];
let score = 0;
let gameActive = false;
let audio, crashAudio;
const gameSpeed = 0.1; // Constant game speed
function initThreeJS() {
// Scene setup
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.domElement.style.position = 'absolute';
renderer.domElement.style.display = 'none';
gameContainer.appendChild(renderer.domElement);
// Car
const carGeometry = new THREE.BoxGeometry(1, 0.5, 2);
const carMaterial = new THREE.MeshPhongMaterial({ color: 0x00ff00 });
car = new THREE.Mesh(carGeometry, carMaterial);
car.position.y = 0.5;
scene.add(car);
// Road
const roadGeometry = new THREE.PlaneGeometry(8, 1000);
const roadMaterial = new THREE.MeshPhongMaterial({ color: 0x444444 });
const road = new THREE.Mesh(roadGeometry, roadMaterial);
road.rotation.x = -Math.PI / 2;
road.position.y = -0.1;
scene.add(road);
// Lighting
const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.6);
directionalLight.position.set(10, 20, 0);
scene.add(directionalLight);
camera.position.set(0, 5, 5);
camera.lookAt(0, 0, 0);
}
function onKeyDown(event) {
if (!gameActive) return;
if (event.key === 'ArrowLeft') moveLeft = true;
if (event.key === 'ArrowRight') moveRight = true;
}
function onKeyUp(event) {
if (event.key === 'ArrowLeft') moveLeft = false;
if (event.key === 'ArrowRight') moveRight = false;
}
function createObstacle() {
const obstacleGeometry = new THREE.BoxGeometry(1, 0.5, 1);
const obstacleMaterial = new THREE.MeshPhongMaterial({ color: 0xff0000 });
const obstacle = new THREE.Mesh(obstacleGeometry, obstacleMaterial);
obstacle.position.y = 0.5;
obstacle.position.x = (Math.random() - 0.5) * 6;
obstacle.position.z = -20;
scene.add(obstacle);
obstacles.push(obstacle);
}
function checkCollision(obstacle) {
const carBox = new THREE.Box3().setFromObject(car);
const obstacleBox = new THREE.Box3().setFromObject(obstacle);
return carBox.intersectsBox(obstacleBox);
}
function update() {
if (!gameActive) return;
// Move car (constant speed)
if (moveLeft && car.position.x > -3) car.position.x -= gameSpeed;
if (moveRight && car.position.x < 3) car.position.x += gameSpeed;
// Move obstacles (constant speed)
obstacles.forEach((obstacle, index) => {
obstacle.position.z += gameSpeed;
if (obstacle.position.z > 5) {
scene.remove(obstacle);
obstacles.splice(index, 1);
}
if (checkCollision(obstacle)) {
gameActive = false;
gameOverDiv.style.display = 'block';
document.getElementById('finalScore').textContent = Math.floor(score/10);
audio.pause();
crashAudio.play().catch(error => {
console.error('Error playing crash audio:', error);
});
}
});
// Create new obstacles
if (Math.random() < 0.02) {
createObstacle();
}
// Update score
score++;
scoreDiv.textContent = `Score: ${Math.floor(score/10)}`;
// Update camera
camera.position.x = car.position.x;
camera.position.z = car.position.z + 5;
camera.lookAt(car.position);
}
function animate() {
requestAnimationFrame(animate);
update();
renderer.render(scene, camera);
}
window.restartGame = function() {
gameActive = true;
score = 0;
car.position.x = 0;
obstacles.forEach(obstacle => scene.remove(obstacle));
obstacles = [];
gameOverDiv.style.display = 'none';
scoreDiv.style.display = 'block';
renderer.domElement.style.display = 'block';
gameContainer.focus();
animate();
audio.play().catch(error => {
console.error('Error playing audio:', error);
});
};
window.startGame = function() {
mainScreenContainer.style.display = 'none';
gameActive = true;
score = 0;
car.position.x = 0;
obstacles = [];
scoreDiv.style.display = 'block';
renderer.domElement.style.display = 'block';
gameContainer.focus();
animate();
audio = new Audio('https://www.myinstants.com/media/sounds/dr-livesey.mp3');
audio.loop = true;
audio.play().catch(error => {
console.error('Error playing audio:', error);
});
crashAudio = new Audio('https://www.myinstants.com/media/sounds/super-mario-bros_1.mp3');
};
// Initialize game
initThreeJS();
// Event listeners
gameContainer.addEventListener('keydown', onKeyDown);
gameContainer.addEventListener('keyup', onKeyUp);
// Handle window resize
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
// Pulsating logo effect
const logo = document.getElementById('logo');
let pulsing = true;
function pulseLogo() {
if (pulsing) {
logo.style.transform = 'scale(1.1)';
setTimeout(() => {
logo.style.transform = 'scale(1)';
setTimeout(pulseLogo, 1000);
}, 1000);
}
}
pulseLogo();
// Start button event listener
document.getElementById('startButton').addEventListener('click', window.startGame);
})();