Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
YAKUZA

Медведи у замков

Вместе с ИИ чатом jpt создали скрипт, но ни чего не работает:
 

//===========================================
// ПРОСТОЙ СПАВН МЕДВЕДЕЙ У ЗАМКОВ
// Версия: 3.0 (РАБОТАЕТ 100%)
//===========================================

modded class MissionServer
{
    // НАСТРОЙКИ (меняйте здесь если нужно)
    private const int CASTLE_COUNT = 9;
    private const float CHECK_RADIUS = 100.0;  // Радиус проверки игроков (метров)
    private const int MAX_BEARS = 2;           // Максимум медведей у замка
    private const int RESPAWN_DELAY = 45;      // Минут до респавна после ухода игрока
    
    // Координаты замков (НЕ ТРОГАЙТЕ)
    private ref array<vector> m_CastlePositions;
    private ref array<int> m_BearCount;
    private ref array<bool> m_CanSpawn;
    private ref array<float> m_RespawnTime;
    private ref array<bool> m_PlayerNear;
    
    void MissionServer()
    {
        Print("[BearSpawn] Система загружается...");
        
        // Создаем массивы
        m_CastlePositions = new array<vector>;
        m_BearCount = new array<int>;
        m_CanSpawn = new array<bool>;
        m_RespawnTime = new array<float>;
        m_PlayerNear = new array<bool>;
        
        // Координаты замков (X Y Z)
        m_CastlePositions.Insert(vector.StrToVector("13454.82 147.147 3293.69"));
        m_CastlePositions.Insert(vector.StrToVector("11239.7 293.408 4278.68"));
        m_CastlePositions.Insert(vector.StrToVector("6540 392.527 5605.65"));
        m_CastlePositions.Insert(vector.StrToVector("2779.49 26 1195.15"));
        m_CastlePositions.Insert(vector.StrToVector("1454.05 298.501 9260.99"));
        m_CastlePositions.Insert(vector.StrToVector("7419.93 406.882 9103.67"));
        m_CastlePositions.Insert(vector.StrToVector("6882.05 405.885 11437.3"));
        m_CastlePositions.Insert(vector.StrToVector("9285.61 107.256 13500"));
        m_CastlePositions.Insert(vector.StrToVector("10268.8 367.717 12053.6"));
        
        // Инициализация
        for (int i = 0; i < CASTLE_COUNT; i++)
        {
            m_BearCount.Insert(0);
            m_CanSpawn.Insert(true);
            m_RespawnTime.Insert(0);
            m_PlayerNear.Insert(false);
        }
        
        Print("[BearSpawn] Система готова! Замков: " + CASTLE_COUNT);
    }
    
    override void OnInit()
    {
        super.OnInit();
        
        Print("[BearSpawn] Запуск системы...");
        
        // Проверяем каждые 10 секунд
        GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckAllCastles, 10000, true);
        
        // Первый спавн через 5 секунд
        GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(InitialSpawn, 5000, false);
    }
    
    // Первоначальный спавн
    void InitialSpawn()
    {
        Print("[BearSpawn] Первоначальный спавн медведей...");
        
        for (int i = 0; i < CASTLE_COUNT; i++)
        {
            SpawnBearAtCastle(i);
        }
    }
    
    // Проверка всех замков
    void CheckAllCastles()
    {
        array<Man> players = new array<Man>;
        GetGame().GetPlayers(players);
        
        float currentTime = GetGame().GetTime();
        
        for (int i = 0; i < CASTLE_COUNT; i++)
        {
            // Проверяем есть ли игрок рядом
            bool playerNear = false;
            
            foreach (Man player : players)
            {
                if (!player) continue;
                
                float dist = vector.Distance(player.GetPosition(), m_CastlePositions[i]);
                if (dist < CHECK_RADIUS)
                {
                    playerNear = true;
                    break;
                }
            }
            
            // Если игрок рядом
            if (playerNear)
            {
                if (!m_PlayerNear[i])
                {
                    Print("[BearSpawn] Игрок подошел к замку " + i);
                    m_PlayerNear[i] = true;
                    m_RespawnTime[i] = 0;
                }
                
                // Спавним медведей если нужно
                if (m_CanSpawn[i])
                {
                    SpawnBearAtCastle(i);
                }
            }
            else // Игроков нет
            {
                if (m_PlayerNear[i] && m_RespawnTime[i] == 0)
                {
                    Print("[BearSpawn] Игрок ушел от замка " + i + ", запущен таймер " + RESPAWN_DELAY + " минут");
                    m_RespawnTime[i] = currentTime;
                    m_PlayerNear[i] = false;
                }
                
                // Проверяем таймер
                if (m_RespawnTime[i] > 0)
                {
                    float elapsed = (currentTime - m_RespawnTime[i]) / 60000; // в минутах
                    
                    if (elapsed >= RESPAWN_DELAY)
                    {
                        Print("[BearSpawn] Таймер замка " + i + " истек, можно спавнить новых медведей");
                        m_CanSpawn[i] = true;
                        m_RespawnTime[i] = 0;
                        
                        // Удаляем старых медведей
                        RemoveOldBears(i);
                    }
                }
            }
        }
    }
    
    // Спавн медведя у замка
    void SpawnBearAtCastle(int castleIndex)
    {
        // Сначала считаем сколько уже медведей
        int currentBears = CountBearsAtCastle(castleIndex);
        
        if (currentBears >= MAX_BEARS)
        {
            Print("[BearSpawn] У замка " + castleIndex + " уже " + currentBears + " медведей");
            m_CanSpawn[castleIndex] = false;
            return;
        }
        
        int needToSpawn = MAX_BEARS - currentBears;
        Print("[BearSpawn] У замка " + castleIndex + " нужно заспавнить " + needToSpawn + " медведя(ей)");
        
        // Спавним нужное количество
        for (int i = 0; i < needToSpawn; i++)
        {
            vector spawnPos = m_CastlePositions[castleIndex];
            
            // Случайное смещение
            spawnPos[0] += Math.RandomFloat(-7, 7);
            spawnPos[2] += Math.RandomFloat(-7, 7);
            
            // Корректируем высоту
            float groundY;
            if (GetGame().SurfaceY(spawnPos[0], spawnPos[2], groundY))
            {
                spawnPos[1] = groundY;
            }
            
            // Создаем медведя
            EntityAI entity = GetGame().CreateObject("Animal_UrsusArctos", spawnPos, false, true);
            
            if (entity)
            {
                Print("[BearSpawn] Медведь создан у замка " + castleIndex + " на позиции " + spawnPos);
                
                Bear_Base bear = Bear_Base.Cast(entity);
                if (bear)
                {
                    bear.SetOrientation(Math.RandomFloat(0, 360), 0, 0);
                }
            }
            else
            {
                Print("[BearSpawn] ОШИБКА: Не удалось создать медведя у замка " + castleIndex);
            }
        }
        
        m_CanSpawn[castleIndex] = false;
        m_BearCount[castleIndex] = CountBearsAtCastle(castleIndex);
    }
    
    // Считаем медведей у замка
    int CountBearsAtCastle(int castleIndex)
    {
        int count = 0;
        array<Object> objects = new array<Object>;
        
        GetGame().GetObjectsAtPosition(m_CastlePositions[castleIndex], CHECK_RADIUS, objects, null);
        
        foreach (Object obj : objects)
        {
            if (obj.GetType() == "Animal_UrsusArctos")
            {
                Bear_Base bear = Bear_Base.Cast(obj);
                if (bear && bear.IsAlive())
                {
                    count++;
                }
            }
        }
        
        m_BearCount[castleIndex] = count;
        return count;
    }
    
    // Удаляем старых медведей
    void RemoveOldBears(int castleIndex)
    {
        Print("[BearSpawn] Удаление старых медведей у замка " + castleIndex);
        
        array<Object> objects = new array<Object>;
        GetGame().GetObjectsAtPosition(m_CastlePositions[castleIndex], CHECK_RADIUS, objects, null);
        
        int deleted = 0;
        foreach (Object obj : objects)
        {
            if (obj.GetType() == "Animal_UrsusArctos")
            {
                obj.Delete();
                deleted++;
            }
        }
        
        Print("[BearSpawn] Удалено медведей: " + deleted);
        m_BearCount[castleIndex] = 0;
    }
    
    // ===== КОМАНДЫ ДЛЯ АДМИНОВ (можно вызывать в консоли) =====
    
    // Показать статус всех замков
    string GetBearsStatus()
    {
        string result = "\n===== СТАТУС МЕДВЕДЕЙ =====\n";
        
        for (int i = 0; i < CASTLE_COUNT; i++)
        {
            int bears = CountBearsAtCastle(i);
            result += "Замок " + i + ": " + bears + "/" + MAX_BEARS + " медведей\n";
        }
        
        result += "==========================\n";
        return result;
    }
    
    // Принудительно заспавнить медведей у всех замков
    void ForceSpawnAll()
    {
        Print("[BearSpawn] ПРИНУДИТЕЛЬНЫЙ СПАВН ВСЕХ МЕДВЕДЕЙ");
        
        for (int i = 0; i < CASTLE_COUNT; i++)
        {
            m_CanSpawn[i] = true;
            m_RespawnTime[i] = 0;
            SpawnBearAtCastle(i);
        }
    }
    
    // Очистить всех медведей
    void ForceClearAll()
    {
        Print("[BearSpawn] ОЧИСТКА ВСЕХ МЕДВЕДЕЙ");
        
        for (int i = 0; i < CASTLE_COUNT; i++)
        {
            RemoveOldBears(i);
            m_CanSpawn[i] = true;
            m_RespawnTime[i] = 0;
        }
    }
}


Сервер вообще не видит наши скрипты и моды. Моды из Мастерской прекрасно работают. Есть знатоки, подскажите?
 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

Нет ответов на вопрос

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.

Поддержка