M
Description
CACA SEPON BOUTON EXPLOSIF CACA
GAMEUniversal
UPDATEDOct 17, 2026
ACCESSKeyless
PLATFORMDesktop
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End BloxScripts Risk Notice ]]
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>💩 Caca Simulator 3D</title>
<style>
*{box-sizing:border-box}
body{
margin:0;background:#111827;color:white;
font-family:Arial,sans-serif;text-align:center
}
header{padding:14px;background:#202d43}
h1{margin:5px;font-size:25px}
p{color:#cbd5e1}
#game{
height:60vh;min-height:320px;position:relative;
overflow:hidden;background:#82cfff
}
canvas{display:block;width:100%;height:100%}
.panel{
padding:15px;display:flex;flex-wrap:wrap;
justify-content:center;align-items:center;gap:10px
}
button{
background:#8b5cf6;color:white;border:0;border-radius:12px;
padding:14px 18px;font-weight:bold;font-size:16px;cursor:pointer
}
button:active{transform:scale(.96)}
.secondary{background:#334155}
label{display:flex;gap:8px;align-items:center}
input{width:110px}
#status{font-weight:bold;color:#86efac;min-height:25px}
</style>
</head>
<body>
<header>
<h1>💩 CACA SIMULATOR 3D 💩</h1>
<p>Un bouton. Un personnage. Un maximum de caca.</p>
</header>
<div id="game"></div>
<div class="panel">
<button id="drop">💩 FAIRE TOMBER UN CACA</button>
<button id="rain" class="secondary">🌧️ PLUIE DE CACA</button>
<button id="reset" class="secondary">🔄 RECOMMENCER</button>
</div>
<div class="panel">
<label>Taille
<input id="size" type="range" min="0.5" max="2.5"
step="0.1" value="1">
</label>
<label>Vitesse de chute
<input id="speed" type="range" min="1" max="12"
step="1" value="5">
</label>
<label>Rebond
<input id="bounce" type="checkbox" checked>
</label>
</div>
<div id="status">Prêt ! Clique sur le bouton 💩</div>
<p>Objets au sol : <span id="count">0</span></p>
<script type="module">
import * as THREE from
'https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js';
const container=document.getElementById('game');
const status=document.getElementById('status');
const count=document.getElementById('count');
const scene=new THREE.Scene();
scene.background=new THREE.Color(0x82cfff);
scene.fog=new THREE.Fog(0x82cfff,18,45);
const camera=new THREE.PerspectiveCamera(
55,container.clientWidth/container.clientHeight,0.1,100
);
camera.position.set(5,5,10);
camera.lookAt(0,1,0);
const renderer=new THREE.WebGLRenderer({antialias:true});
renderer.setPixelRatio(Math.min(devicePixelRatio,2));
renderer.setSize(container.clientWidth,container.clientHeight);
renderer.shadowMap.enabled=true;
renderer.shadowMap.type=THREE.PCFSoftShadowMap;
container.appendChild(renderer.domElement);
scene.add(new THREE.HemisphereLight(0xffffff,0x596579,2));
const sun=new THREE.DirectionalLight(0xffffff,3);
sun.position.set(5,10,5);
sun.castShadow=true;
scene.add(sun);
// Sol
const ground=new THREE.Mesh(
new THREE.PlaneGeometry(100,100),
new THREE.MeshStandardMaterial({color:0x55ad55})
);
ground.rotation.x=-Math.PI/2;
ground.receiveShadow=true;
scene.add(ground);
// Dalles décoratives
const platform=new THREE.Mesh(
new THREE.BoxGeometry(6,0.2,6),
new THREE.MeshStandardMaterial({color:0x9ca3af})
);
platform.position.y=0.1;
platform.receiveShadow=true;
platform.castShadow=true;
scene.add(platform);
// Personnage humanoïde simple
const avatar=new THREE.Group();
scene.add(avatar);
function block(w,h,d,color,x,y,z){
const mesh=new THREE.Mesh(
new THREE.BoxGeometry(w,h,d),
new THREE.MeshStandardMaterial({color,roughness:0.75})
);
mesh.position.set(x,y,z);
mesh.castShadow=true;
mesh.receiveShadow=true;
avatar.add(mesh);
return mesh;
}
block(0.8,1,0.45,0x2864d7,0,1.55,0);
block(0.65,0.65,0.65,0xffc99b,0,2.38,0);
block(0.7,0.18,0.7,0x51321f,0,2.76,0);
block(0.25,0.85,0.3,0x26354b,-0.23,0.63,0);
block(0.25,0.85,0.3,0x26354b,0.23,0.63,0);
block(0.22,0.8,0.25,0xffc99b,-0.55,1.55,0);
block(0.22,0.8,0.25,0xffc99b,0.55,1.55,0);
// Visage visible
const eyesMat=new THREE.MeshStandardMaterial({color:0x222222});
for(const x of [-0.13,0.13]){
const eye=new THREE.Mesh(
new THREE.SphereGeometry(0.045,12,12),eyesMat
);
eye.position.set(x,2.42,0.32);
avatar.add(eye);
}
// Caca 3D constitué de plusieurs boules empilées
function createPoop(scale=1){
const group=new THREE.Group();
const brown=new THREE.MeshStandardMaterial({
color:0x754019,roughness:0.5
});
const parts=[
{r:0.34,h:0.19,y:0.12},
{r:0.255,h:0.20,y:0.29},
{r:0.17,h:0.18,y:0.44},
{r:0.075,h:0.16,y:0.57}
];
for(const part of parts){
const mesh=new THREE.Mesh(
new THREE.SphereGeometry(part.r,20,16),brown
);
mesh.scale.y=part.h/ (part.r*2);
mesh.position.y=part.y;
mesh.castShadow=true;
mesh.receiveShadow=true;
group.add(mesh);
}
group.scale.setScalar(scale);
return group;
}
const poops=[];
let total=0;
function spawnPoop(){
const size=Number(document.getElementById('size').value);
const poop=createPoop(size);
// Derrière le personnage
poop.position.set(
avatar.position.x,
3.1*size+1,
avatar.position.z-0.7
);
scene.add(poop);
poops.push({
mesh:poop,
velocity:0,
phase:'fall',
age:0,
bounces:0,
size
});
total++;
count.textContent=total;
status.textContent='💩 PLOP ! Le caca est en train de tomber !';
}
function drop(){
spawnPoop();
}
document.getElementById('drop').addEventListener('click',drop);
let rainTimer=null;
document.getElementById('rain').addEventListener('click',()=>{
if(rainTimer){
clearInterval(rainTimer);
rainTimer=null;
status.textContent='Pluie arrêtée !';
return;
}
status.textContent='🌧️ PLUIE DE CACA ACTIVÉE !';
rainTimer=setInterval(()=>{
spawnPoop();
if(poops.length>=100){
clearInterval(rainTimer);
rainTimer=null;
}
},350);
});
document.getElementById('reset').addEventListener('click',()=>{
if(rainTimer)clearInterval(rainTimer);
rainTimer=null;
for(const p of poops)scene.remove(p.mesh);
poops.length=0;
total=0;
count.textContent='0';
status.textContent='Tout est nettoyé !';
});
const clock=new THREE.Clock();
function animate(){
requestAnimationFrame(animate);
const dt=Math.min(clock.getDelta(),0.04);
const speed=Number(document.getElementById('speed').value);
const bounce=document.getElementById('bounce').checked;
for(let i=poops.length-1;i>=0;i--){
const p=poops[i];
p.age+=dt;
if(p.phase==='fall'){
p.velocity+=9.8*dt;
p.mesh.position.y-=p.velocity*dt*speed/5;
p.mesh.rotation.y+=dt*2;
const floorY=0.2*p.size;
if(p.mesh.position.y<=floorY){
p.mesh.position.y=floorY;
if(bounce&&p.bounces<2){
p.velocity=2.8/(p.bounces+1);
p.bounces++;
p.phase='bounce';
}else{
p.phase='ground';
p.mesh.rotation.x=0;
}
}
}else if(p.phase==='bounce'){
p.velocity-=12*dt;
p.mesh.position.y+=p.velocity*dt;
p.mesh.rotation.z=Math.sin(p.age*15)*0.12;
if(p.mesh.position.y<=0.2*p.size){
p.mesh.position.y=0.2*p.size;
p.phase='ground';
}
}else{
p.mesh.rotation.y+=dt*0.15;
}
}
renderer.render(scene,camera);
}
animate();
window.addEventListener('resize',()=>{
const w=container.clientWidth;
const h=container.clientHeight;
camera.aspect=w/h;
camera.updateProjectionMatrix();
renderer.setSize(w,h);
});
</script>
</body>
</html>
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place