Загрузка...

Funny
Kitty for the forum

Thread in Extentions created by APT29388 Jul 26, 2025. (bumped Oct 5, 2025) 910 views

  1. APT29388
    APT29388 Topic starter Jul 26, 2025 Banned 11,595 Aug 19, 2024
    [IMG][IMG]
    JS
    // ==UserScript==
    // @name Котик
    // @namespace http://tampermonkey.net/
    // @version 1.0
    // @description Котяра
    // @author APT29388
    // @match https://lolz.live/*
    // @match https://*.lolz.live/*
    // @grant none
    // ==/UserScript==

    (function () {
    'use strict';
    const catStyles = `
    <style id="lolz-cat-styles">
    #lolz-cat {
    position: fixed;
    width: 50px;
    height: 50px;
    z-index: 9999;
    pointer-events: auto;
    transition: all 0.3s ease;
    font-size: 32px;
    user-select: none;
    cursor: pointer;
    }


    .cat-speech {
    position: absolute;
    top: -35px;
    left: 50%;
    transform: translateX(-50%);
    background: white;
    border: 2px solid #29ad72;
    border-radius: 15px;
    padding: 5px 10px;
    font-size: 14px;
    font-weight: bold;
    color: #29ad72;
    white-space: nowrap;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease;
    z-index: 10000;
    }

    .cat-speech::after {
    content: '';
    position: absolute;
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    border: 8px solid transparent;
    border-top-color: white;
    }

    .cat-speech::before {
    content: '';
    position: absolute;
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    border: 10px solid transparent;
    border-top-color: #29ad72;
    z-index: -1;
    }

    .cat-speech.show {
    opacity: 1;
    }


    .cat-stopped {
    animation: none !important;
    }

    .cat-stopped #paw-front-left,
    .cat-stopped #paw-front-right,
    .cat-stopped #paw-back-left,
    .cat-stopped #paw-back-right,
    .cat-stopped #tail,
    .cat-stopped #cat-body,
    .cat-stopped #cat-head {
    animation: none !important;
    }


    .cat-sitting #cat-body {
    transform: translateY(8px);
    transition: transform 0.3s ease;
    }

    .cat-sitting #paw-back-left,
    .cat-sitting #paw-back-right {
    transform: translateY(8px) scaleY(0.6);
    transition: transform 0.3s ease;
    }

    .cat-sitting #paw-front-left,
    .cat-sitting #paw-front-right {
    transform: translateY(4px);
    transition: transform 0.3s ease;
    }

    .cat-sitting #tail {
    transform: rotate(-20deg);
    transform-origin: 30px 50px;
    transition: transform 0.3s ease;
    }


    @keyframes pawRunFront {
    0% { transform: translateY(0px) rotate(0deg); }
    25% { transform: translateY(-4px) rotate(-10deg); }
    50% { transform: translateY(0px) rotate(0deg); }
    75% { transform: translateY(-2px) rotate(10deg); }
    100% { transform: translateY(0px) rotate(0deg); }
    }

    @keyframes pawRunBack {
    0% { transform: translateY(0px) rotate(0deg); }
    25% { transform: translateY(-2px) rotate(10deg); }
    50% { transform: translateY(0px) rotate(0deg); }
    75% { transform: translateY(-4px) rotate(-10deg); }
    100% { transform: translateY(0px) rotate(0deg); }
    }

    @keyframes tailRun {
    0% { transform: rotate(0deg); }
    50% { transform: rotate(15deg); }
    100% { transform: rotate(0deg); }
    }

    @keyframes bodyBounce {
    0% { transform: translateY(0px); }
    50% { transform: translateY(-3px); }
    100% { transform: translateY(0px); }
    }




    .cat-running #paw-front-left { animation: pawRunFront 0.3s infinite; }
    .cat-running #paw-front-right { animation: pawRunFront 0.3s infinite 0.15s; }
    .cat-running #paw-back-left { animation: pawRunBack 0.3s infinite; }
    .cat-running #paw-back-right { animation: pawRunBack 0.3s infinite 0.15s; }
    .cat-running #tail { animation: tailRun 0.6s infinite; }
    .cat-running #cat-body { animation: bodyBounce 0.3s infinite; }
    .cat-running #cat-head { animation: bodyBounce 0.3s infinite; }




    .paw-print {
    position: fixed;
    width: 12px;
    height: 12px;
    z-index: 9998;
    pointer-events: none;
    opacity: 0.6;
    animation: pawFade 3s ease-out forwards;
    }

    @keyframes pawFade {
    0% { opacity: 0.6; transform: scale(1); }
    50% { opacity: 0.4; transform: scale(0.9); }
    100% { opacity: 0; transform: scale(0.7); }
    }
    </style>
    `;


    document.head.insertAdjacentHTML('beforeend', catStyles);


    const cat = document.createElement('div');
    cat.id = 'lolz-cat';
    cat.innerHTML = `
    <svg width="60" height="40" viewBox="0 0 120 80" xmlns="http://www.w3.org/2000/svg">
    <ellipse cx="60" cy="75" rx="25" ry="4" fill="#000" opacity="0.2"/>
    <path id="tail" d="M 30 50 Q 15 45 10 30 Q 8 20 18 25 Q 25 30 30 40"
    stroke="#29ad72" stroke-width="6" fill="none" stroke-linecap="round"/>
    <rect id="paw-back-left" x="42" y="60" width="4" height="12" rx="2" fill="#29ad72"/>
    <rect id="paw-back-right" x="52" y="60" width="4" height="12" rx="2" fill="#29ad72"/>
    <path id="cat-body" d="M 30 45 Q 35 35 50 35 Q 80 35 85 45 Q 85 60 80 65 Q 50 65 35 65 Q 30 60 30 45 Z"
    fill="#29ad72"/>
    <rect id="paw-front-left" x="65" y="60" width="4" height="12" rx="2" fill="#29ad72"/>
    <rect id="paw-front-right" x="75" y="60" width="4" height="12" rx="2" fill="#29ad72"/>
    <ellipse cx="85" cy="45" rx="8" ry="12" fill="#29ad72"/>
    <path id="cat-head" d="M 75 35 Q 85 25 95 25 Q 105 25 115 35 Q 115 45 105 50 Q 95 55 85 50 Q 75 45 75 35 Z"
    fill="#29ad72"/>
    <path id="ear-left" d="M 85 30 L 90 15 L 95 30 Z" fill="#29ad72"/>
    <path id="ear-right" d="M 95 30 L 100 15 L 105 30 Z" fill="#29ad72"/>
    <path d="M 87 28 L 90 18 L 93 28 Z" fill="#FFB3D9"/>
    <path d="M 97 28 L 100 18 L 103 28 Z" fill="#FFB3D9"/>
    <ellipse id="eye-left" cx="90" cy="38" rx="3" ry="4" fill="#90EE90"/>
    <ellipse id="eye-right" cx="100" cy="38" rx="3" ry="4" fill="#90EE90"/>
    <ellipse cx="90" cy="38" rx="1.5" ry="2.5" fill="#000"/>
    <ellipse cx="100" cy="38" rx="1.5" ry="2.5" fill="#000"/>
    <circle id="pupil-left" cx="90.5" cy="37" r="0.5" fill="white"/>
    <circle id="pupil-right" cx="100.5" cy="37" r="0.5" fill="white"/>
    <path id="nose" d="M 95 42 L 93 45 L 97 45 Z" fill="#FF69B4"/>
    <path id="mouth" d="M 95 45 L 95 47" stroke="#000" stroke-width="1"/>
    <path d="M 95 47 Q 92 48 89 47" stroke="#000" stroke-width="1" fill="none"/>
    <path d="M 95 47 Q 98 48 101 47" stroke="#000" stroke-width="1" fill="none"/>
    <line x1="80" y1="40" x2="70" y2="39" stroke="#000" stroke-width="0.8"/>
    <line x1="80" y1="43" x2="70" y2="43" stroke="#000" stroke-width="0.8"/>
    <line x1="110" y1="40" x2="120" y2="39" stroke="#000" stroke-width="0.8"/>
    <line x1="110" y1="43" x2="120" y2="43" stroke="#000" stroke-width="0.8"/>
    </svg>
    `;
    document.body.appendChild(cat);


    let catX = 100;
    let catY = 100;
    let targetX = catX;
    let targetY = catY;
    let isScrolling = false;
    let scrollTimeout;
    let moveInterval;
    let washingTimeout;
    let currentState = 'idle';
    let pawPrintCounter = 0;
    let isHovered = false;


    const speechBubble = document.createElement('div');
    speechBubble.className = 'cat-speech';


    const meowSounds = ['Мяy!', 'Мяy~', 'Мур-мяy!', 'Мяв!', 'Мурр!', 'Мяy-мяy!'];

    cat.appendChild(speechBubble);


    cat.style.left = catX + 'px';
    cat.style.top = catY + 'px';


    function getRandomElement() {
    const elements = document.querySelectorAll('div, p, h1, h2, h3, h4, h5, h6, span, a, button, img');
    const visibleElements = Array.from(elements).filter(el => {
    const rect = el.getBoundingClientRect();
    return rect.width > 20 && rect.height > 20 &&
    rect.top >= 0 && rect.left >= 0 &&
    rect.bottom <= window.innerHeight &&
    rect.right <= window.innerWidth;
    });

    if (visibleElements.length > 0) {
    return visibleElements[Math.floor(Math.random() * visibleElements.length)];
    }
    return null;
    }


    function moveCatToTarget() {
    const dx = targetX - catX;
    const dy = targetY - catY;
    const distance = Math.sqrt(dx * dx + dy * dy);

    if (distance > 5) {
    const speed = 2;
    catX += (dx / distance) * speed;
    catY += (dy / distance) * speed;


    if (dx > 0) {
    cat.style.transform = 'scaleX(1)';
    } else if (dx < 0) {
    cat.style.transform = 'scaleX(-1)';
    }

    cat.style.left = catX + 'px';
    cat.style.top = catY + 'px';


    pawPrintCounter++;
    if (pawPrintCounter % 15 === 0) {
    createPawPrint(catX, catY);
    }

    if (currentState !== 'running') {
    setState('running');
    }
    } else {

    findNewTarget();
    }
    }


    function setState(newState) {

    cat.classList.remove('cat-running', 'cat-washing', 'cat-jumping', 'cat-sitting');

    currentState = newState;

    switch (newState) {
    case 'running':
    cat.classList.add('cat-running');
    break;
    case 'washing':
    cat.classList.add('cat-washing');
    break;
    case 'jumping':
    cat.classList.add('cat-jumping');
    break;
    case 'sitting':
    cat.classList.add('cat-sitting');
    break;
    }
    }


    function createPawPrint(x, y) {
    const pawPrint = document.createElement('div');
    pawPrint.className = 'paw-print';
    pawPrint.innerHTML = `
    <svg width="12" height="12" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
    <ellipse cx="12" cy="16" rx="4" ry="3" fill="#8B4513" opacity="0.7"/>
    <circle cx="8" cy="10" r="1.5" fill="#8B4513" opacity="0.7"/>
    <circle cx="12" cy="8" r="1.5" fill="#8B4513" opacity="0.7"/>
    <circle cx="16" cy="10" r="1.5" fill="#8B4513" opacity="0.7"/>
    <circle cx="12" cy="12" r="1" fill="#8B4513" opacity="0.7"/>
    </svg>
    `;

    pawPrint.style.left = (x - 6) + 'px';
    pawPrint.style.top = (y + 15) + 'px';

    document.body.appendChild(pawPrint);


    setTimeout(() => {
    if (pawPrint.parentNode) {
    pawPrint.parentNode.removeChild(pawPrint);
    }
    }, 3000);
    }


    function findNewTarget() {
    const element = getRandomElement();
    if (element) {
    const rect = element.getBoundingClientRect();
    targetX = rect.left + rect.width / 2;
    targetY = rect.top + rect.height / 2;


    targetX = Math.max(20, Math.min(window.innerWidth - 60, targetX));
    targetY = Math.max(20, Math.min(window.innerHeight - 60, targetY));
    } else {

    targetX = Math.random() * (window.innerWidth - 80) + 40;
    targetY = Math.random() * (window.innerHeight - 80) + 40;
    }
    }


    cat.addEventListener('mouseenter', () => {
    isHovered = true;


    cat.classList.add('cat-stopped');
    cat.classList.add('cat-sitting');


    const randomMeow = meowSounds[Math.floor(Math.random() * meowSounds.length)];
    speechBubble.textContent = randomMeow;
    speechBubble.classList.add('show');

    console.log('Котик говорит:', randomMeow);
    });

    cat.addEventListener('mouseleave', () => {
    isHovered = false;


    cat.classList.remove('cat-stopped');
    cat.classList.remove('cat-sitting');


    speechBubble.classList.remove('show');


    if (!isScrolling) {
    setState('idle');
    findNewTarget();
    }
    });


    moveInterval = setInterval(() => {
    if (!isHovered && (currentState === 'running' || currentState === 'idle')) {
    moveCatToTarget();
    }
    }, 50);


    setTimeout(() => {
    findNewTarget();
    }, 1000);


    window.addEventListener('resize', () => {
    catX = Math.max(20, Math.min(window.innerWidth - 60, catX));
    catY = Math.max(20, Math.min(window.innerHeight - 60, catY));
    cat.style.left = catX + 'px';
    cat.style.top = catY + 'px';
    });

    console.log('Котик загружен! ');
    })();


    Как поставить?
    1) Качаете Tampermonkey
    2) Включаете режим разработчика в браузере
    3) Нажимаете на него
    4) Нажимаете Создать новый скрипт
    5) Копируете туда скрипт
    6) Файл -> Сохранить
    7) Обновляете страницу
     
    This article was useful for you?
    You can thank the author of the topic by transferring funds to your balance
    Thank the author
  2. Арбузим
    нифигачке
     
  3. морфий
    морфий Jul 26, 2025 Мои Деньги Ходят На Работу Ведь Они Не Глупые
    пусть он еще хуйню рандомную с оффтопа несет
     
  4. llimonix
    llimonix Jul 26, 2025
    Telegram: View @XomiachiyNovostnik
    29,129 Jan 20, 2020
    а он за мне статьи на актуальные темы напишет и в оффтопике посидит ?
     
    1. APT29388 Topic starter
      avatarllimonix , использование ИИ для написания ответов и тем запрещено(
    2. llimonix
      avatarAPT29388 , котик что мертвый ? я думал он живой
    3. APT29388 Topic starter
      avatarllimonix , он ток мяукать умеет(
  5. Помни
    Помни Jul 26, 2025 КАК ВЫБРАТЬСЯ ОТСЮДА?? - lolz.live/logout 19,423 Aug 18, 2019
    а где котик
     
    1. APT29388 Topic starter
  6. затроллен
    да звучит прикольно мне нрав
     
  7. God_likeGL
    [IMG]

    он обматерил меня?
     
    1. View previous comments (9)
    2. APT29388 Topic starter
    3. БИЛЛИНОГАМИ
    4. God_likeGL Layer 1
      avatarБИЛЛИНОГАМИ, так же через тамперманки ставится, код могу в тг скинуть
  8. BulletProxies
    Имбовый котик
     
  9. NodeHostu
    дополнение привет из 2000х по сайтам были такие [IMG] у меня по красевее будет
     
  10. Fazerechek
    Fazerechek Jul 29, 2025 фанат avatarAlex 1,085 Sep 23, 2023
    а он срать баллами будет?
     
  11. ResterMag
    ResterMag Aug 19, 2025 :catzaza::catzaza::catzaza: 5,008 Apr 10, 2024
    милашка
     
  12. blessed
    можно добавить ему функцию чтобы он в оффтопик хуйню писал сам ?
     
    1. мя_у
      avatarblessed , АХАХАХАХАХАХ подьебнуть к нему гпт, и чтобы по нажатию какой нибудь кнопки генерил поеботу, добавить анимацию, только без отправки автоматической, вроде правилами запрещено
  13. мя_у
    Пиздец он укурыш угарный
     
  14. suslik1325
    можно добавить попытки поймать курсор мышки или при открытии оффтопа он ссал на него, идея забавная
     
Loading...