Game servers hosting by BoneHosting

Premium Game Server Hosting

Deploy your game servers instantly with our powerful and reliable hosting platform.

Platform Preview

Why Choose Us

Built for developers who need reliable infrastructure without the complexity

High Performance

Powered by enterprise-grade hardware for optimal performance

DDoS Protection

Advanced protection to keep your servers online 24/7

Instant Deployment

Deploy your servers in seconds with our automated system

Simple, Transparent Pricing

Choose the resources you need

Free Plan

Everything you need to build and scale your applications

What's included

  • 2GB default RAM + 1 CPU core
  • France
  • DDoS protection
  • 24/7* Uptime

Always free

$0 forever

Get Started
import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js'; import { EffectComposer } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/postprocessing/EffectComposer.js'; import { RenderPass } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/postprocessing/RenderPass.js'; import { UnrealBloomPass } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/postprocessing/UnrealBloomPass.js'; import { ShaderPass } from 'https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/postprocessing/ShaderPass.js'; const container = document.getElementById('ghost-cursor-container'); if (container) { // Create ghost cursor container div const cursorDiv = document.createElement('div'); cursorDiv.className = 'ghost-cursor'; container.appendChild(cursorDiv); const options = { color: '#B19EEF', brightness: 2, edgeIntensity: 0, trailLength: 50, inertia: 0.5, grainIntensity: 0.05, bloomStrength: 0.1, bloomRadius: 1, bloomThreshold: 0.025, fadeDelayMs: 1000, fadeDurationMs: 1500 }; // Initialize GhostCursor initGhostCursor(cursorDiv, options); } function initGhostCursor(containerEl, options) { const parent = containerEl.parentElement; if (!parent) return; const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, depth: false, stencil: false, premultipliedAlpha: false }); renderer.setClearColor(0x000000, 0); renderer.domElement.style.pointerEvents = 'none'; renderer.domElement.style.mixBlendMode = 'screen'; containerEl.appendChild(renderer.domElement); const scene = new THREE.Scene(); const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); const trailLength = options.trailLength || 50; const trailBuffer = Array.from({ length: trailLength }, () => new THREE.Vector2(0.5, 0.5)); let head = 0; const baseColor = new THREE.Color(options.color); const material = createMaterial(trailLength, baseColor, options); const geometry = new THREE.PlaneGeometry(2, 2); const mesh = new THREE.Mesh(geometry, material); scene.add(mesh); const composer = new EffectComposer(renderer); composer.addPass(new RenderPass(scene, camera)); const bloomPass = new UnrealBloomPass( new THREE.Vector2(1, 1), options.bloomStrength, options.bloomRadius, options.bloomThreshold ); composer.addPass(bloomPass); composer.addPass(createFilmGrainPass(options.grainIntensity)); composer.addPass(createUnpremultiplyPass()); let currentMouse = new THREE.Vector2(0.5, 0.5); let velocity = new THREE.Vector2(0, 0); let fadeOpacity = 1.0; let lastMoveTime = performance.now(); let pointerActive = false; let running = false; let rafId = null; function resize() { const rect = parent.getBoundingClientRect(); const cssW = Math.max(1, Math.floor(rect.width)); const cssH = Math.max(1, Math.floor(rect.height)); const pixelRatio = Math.min(window.devicePixelRatio || 1, 0.5); renderer.setPixelRatio(pixelRatio); renderer.setSize(cssW, cssH, false); composer.setSize(cssW, cssH); const wpx = Math.max(1, Math.floor(cssW * pixelRatio)); const hpx = Math.max(1, Math.floor(cssH * pixelRatio)); material.uniforms.iResolution.value.set(wpx, hpx, 1); material.uniforms.iScale.value = Math.max(0.5, Math.min(2.0, Math.min(cssW, cssH) / 600)); bloomPass.setSize(wpx, hpx); } const startTime = performance.now(); function animate() { const now = performance.now(); const t = (now - startTime) / 1000; if (pointerActive) { velocity.set( currentMouse.x - material.uniforms.iMouse.value.x, currentMouse.y - material.uniforms.iMouse.value.y ); material.uniforms.iMouse.value.copy(currentMouse); fadeOpacity = 1.0; } else { velocity.multiplyScalar(options.inertia); if (velocity.lengthSq() > 1e-6) { material.uniforms.iMouse.value.add(velocity); } const dt = now - lastMoveTime; if (dt > options.fadeDelayMs) { const k = Math.min(1, (dt - options.fadeDelayMs) / options.fadeDurationMs); fadeOpacity = Math.max(0, 1 - k); } } head = (head + 1) % trailLength; trailBuffer[head].copy(material.uniforms.iMouse.value); const arr = material.uniforms.iPrevMouse.value; for (let i = 0; i < trailLength; i++) { const srcIdx = (head - i + trailLength) % trailLength; arr[i].copy(trailBuffer[srcIdx]); } material.uniforms.iOpacity.value = fadeOpacity; material.uniforms.iTime.value = t; composer.render(); if (!pointerActive && fadeOpacity <= 0.001) { running = false; rafId = null; return; } rafId = requestAnimationFrame(animate); } function ensureLoop() { if (!running) { running = true; rafId = requestAnimationFrame(animate); } } parent.addEventListener('pointermove', (e) => { const rect = parent.getBoundingClientRect(); const x = THREE.MathUtils.clamp((e.clientX - rect.left) / Math.max(1, rect.width), 0, 1); const y = THREE.MathUtils.clamp(1 - (e.clientY - rect.top) / Math.max(1, rect.height), 0, 1); currentMouse.set(x, y); pointerActive = true; lastMoveTime = performance.now(); ensureLoop(); }, { passive: true }); parent.addEventListener('pointerenter', () => { pointerActive = true; ensureLoop(); }, { passive: true }); parent.addEventListener('pointerleave', () => { pointerActive = false; lastMoveTime = performance.now(); ensureLoop(); }, { passive: true }); window.addEventListener('resize', resize); resize(); ensureLoop(); } function createMaterial(trailLength, baseColor, options) { const vertexShader = ` varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); } `; const fragmentShader = ` uniform float iTime; uniform vec3 iResolution; uniform vec2 iMouse; uniform vec2 iPrevMouse[${trailLength}]; uniform float iOpacity; uniform float iScale; uniform vec3 iBaseColor; uniform float iBrightness; uniform float iEdgeIntensity; varying vec2 vUv; float hash(vec2 p){ return fract(sin(dot(p,vec2(127.1,311.7))) * 43758.5453123); } float noise(vec2 p){ vec2 i = floor(p), f = fract(p); f *= f * (3. - 2. * f); return mix(mix(hash(i + vec2(0.,0.)), hash(i + vec2(1.,0.)), f.x), mix(hash(i + vec2(0.,1.)), hash(i + vec2(1.,1.)), f.x), f.y); } float fbm(vec2 p){ float v = 0.0; float a = 0.5; mat2 m = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5)); for(int i=0;i<5;i++){ v += a * noise(p); p = m * p * 2.0; a *= 0.5; } return v; } vec3 tint1(vec3 base){ return mix(base, vec3(1.0), 0.15); } vec3 tint2(vec3 base){ return mix(base, vec3(0.8, 0.9, 1.0), 0.25); } vec4 blob(vec2 p, vec2 mousePos, float intensity, float activity) { vec2 q = vec2(fbm(p * iScale + iTime * 0.1), fbm(p * iScale + vec2(5.2,1.3) + iTime * 0.1)); vec2 r = vec2(fbm(p * iScale + q * 1.5 + iTime * 0.15), fbm(p * iScale + q * 1.5 + vec2(8.3,2.8) + iTime * 0.15)); float smoke = fbm(p * iScale + r * 0.8); float radius = 0.5 + 0.3 * (1.0 / iScale); float distFactor = 1.0 - smoothstep(0.0, radius * activity, length(p - mousePos)); float alpha = pow(smoke, 2.5) * distFactor; vec3 c1 = tint1(iBaseColor); vec3 c2 = tint2(iBaseColor); vec3 color = mix(c1, c2, sin(iTime * 0.5) * 0.5 + 0.5); return vec4(color * alpha * intensity, alpha * intensity); } void main() { vec2 uv = (gl_FragCoord.xy / iResolution.xy * 2.0 - 1.0) * vec2(iResolution.x / iResolution.y, 1.0); vec2 mouse = (iMouse * 2.0 - 1.0) * vec2(iResolution.x / iResolution.y, 1.0); vec3 colorAcc = vec3(0.0); float alphaAcc = 0.0; vec4 b = blob(uv, mouse, 1.0, iOpacity); colorAcc += b.rgb; alphaAcc += b.a; for (int i = 0; i < ${trailLength}; i++) { vec2 pm = (iPrevMouse[i] * 2.0 - 1.0) * vec2(iResolution.x / iResolution.y, 1.0); float t = 1.0 - float(i) / float(${trailLength}); t = pow(t, 2.0); if (t > 0.01) { vec4 bt = blob(uv, pm, t * 0.8, iOpacity); colorAcc += bt.rgb; alphaAcc += bt.a; } } colorAcc *= iBrightness; vec2 uv01 = gl_FragCoord.xy / iResolution.xy; float edgeDist = min(min(uv01.x, 1.0 - uv01.x), min(uv01.y, 1.0 - uv01.y)); float distFromEdge = clamp(edgeDist * 2.0, 0.0, 1.0); float k = clamp(iEdgeIntensity, 0.0, 1.0); float edgeMask = mix(1.0 - k, 1.0, distFromEdge); float outAlpha = clamp(alphaAcc * iOpacity * edgeMask, 0.0, 1.0); gl_FragColor = vec4(colorAcc, outAlpha); } `; return new THREE.ShaderMaterial({ uniforms: { iTime: { value: 0 }, iResolution: { value: new THREE.Vector3(1, 1, 1) }, iMouse: { value: new THREE.Vector2(0.5, 0.5) }, iPrevMouse: { value: Array.from({ length: trailLength }, () => new THREE.Vector2(0.5, 0.5)) }, iOpacity: { value: 1.0 }, iScale: { value: 1.0 }, iBaseColor: { value: new THREE.Vector3(baseColor.r, baseColor.g, baseColor.b) }, iBrightness: { value: options.brightness }, iEdgeIntensity: { value: options.edgeIntensity } }, vertexShader, fragmentShader, transparent: true, depthTest: false, depthWrite: false }); } function createFilmGrainPass(intensity) { return new ShaderPass({ uniforms: { tDiffuse: { value: null }, iTime: { value: 0 }, intensity: { value: intensity } }, vertexShader: ` varying vec2 vUv; void main(){ vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; uniform float iTime; uniform float intensity; varying vec2 vUv; float hash1(float n){ return fract(sin(n)*43758.5453); } void main(){ vec4 color = texture2D(tDiffuse, vUv); float n = hash1(vUv.x*1000.0 + vUv.y*2000.0 + iTime) * 2.0 - 1.0; color.rgb += n * intensity * color.rgb; gl_FragColor = color; } ` }); } function createUnpremultiplyPass() { return new ShaderPass({ uniforms: { tDiffuse: { value: null } }, vertexShader: ` varying vec2 vUv; void main(){ vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } `, fragmentShader: ` uniform sampler2D tDiffuse; varying vec2 vUv; void main(){ vec4 c = texture2D(tDiffuse, vUv); float a = max(c.a, 1e-5); vec3 straight = c.rgb / a; gl_FragColor = vec4(clamp(straight, 0.0, 1.0), c.a); } ` }); }