Добавлен , не публикуется
Простая система создания атакующих волн.
Поддерживает:
-Рандомизацию времени повторного респавна;
-Ограничение кол-ва волн;
-Отсрочка спавна;
-Удаление спавна волн;
-Рандомизация пути следования;
-Множественные типы юнитов в волне;
-Рандомизация кол-ва юнитов в группе;
-Единовременная обработка множества групп.
Core
library SpawnCreepWaves uses Index, UnitWaveGroup, UnitWaveRoute
{  
    // максимальное кол-во групп
    private constant int MAX_GROUPS = 10;
    // максимальное кол-во координат для группы
    private constant int MAX_ROUTES = 10;
    
    // переменные путей
    private int array WaveRoutes[MAX_GROUPS][MAX_ROUTES]
    private int array WaveRoutesCounter
    
    // переменные состава волны
    private int array WaveUnitWaveGroup
    
    // параметры волны   - индексом является ИД волны
    private int WaveCounter = -1;
    private int array WaveMaxCount;
    private float array SpawnPeriodMin;
    private float array SpawnPeriodMax;
    
    // параметры группы   - индексом является ИД группы
    private group array Groups
    private int GroupIndex = 0;
    private int GroupCounter = -1;
    private int array GroupSelectedRoute
    
    // параметры единиц групп - индексом является ИД юнита
    private int array GroupUnitPositionId;
    private int array GroupUnitPositionIndex;
    
    // параметры таймера
    private timer Timer;
    private float TimerPeriod = 1.0;
    
    private timer array Timers
    
    private float DistanceU2P(unit u,float x, float y)
    {
        x = GetWidgetX(u)-x
        y = GetWidgetY(u)-y
        return SquareRoot(x*x+y*y)
    }
    
    private void WaveCore()
    {
        for(GroupIndex = 0; GroupIndex <= GroupCounter; GroupIndex++)
        {
            // проверка наличия юнитов в группе
            
            if(FirstOfGroup(Groups[GroupIndex]) != null)
            {
                ForGroup(Groups[GroupIndex], lambda void(){
                    unit enumUnit = GetEnumUnit();
                    int id = Index_Get(enumUnit, false);
                    if(DistanceU2P(enumUnit,UnitWaveRoute_X[GroupUnitPositionId[id]][GroupUnitPositionIndex[id]], UnitWaveRoute_Y[GroupUnitPositionId[id]][GroupUnitPositionIndex[id]]) < 200.0)
                    {
                        GroupUnitPositionIndex[id]++;
                        if(GroupUnitPositionIndex[id] < UnitWaveRoute_Size[Index_GetValue(Groups[GroupIndex])])
                        {
                            IssuePointOrderById(enumUnit, order_smart, UnitWaveRoute_X[GroupUnitPositionId[id]][GroupUnitPositionIndex[id]], UnitWaveRoute_Y[GroupUnitPositionId[id]][GroupUnitPositionIndex[id]])
                        }
                        else
                        {
                            GroupRemoveUnit(Groups[GroupIndex],enumUnit)
                        }
                    }
                    enumUnit = null;
                });
            }
            else
            {   
                // ремув группы и освобождение индекса
                Index_Remove(group, Groups[GroupIndex])
                Groups[GroupIndex] = Groups[GroupCounter]
                Groups[GroupCounter] = null;
                GroupCounter--;
            }
        }
        if(GroupCounter == -1)
        {
            PauseTimer(Timer)
            DestroyTimer(Timer)
        }
    }
    
    public void RemoveWave(int waveId)
    {
        PauseTimer(Timers[WaveCounter])
        DestroyTimer(Timers[WaveCounter])
    }
    
    private void SpawnWave(int id)
    {
        if (WaveMaxCount[id] > -1)
        {
            WaveMaxCount[id]--;
            if( WaveMaxCount[id]  ==0)
            {
                RemoveWave(id);
            }
        }
        // создание группы по указанным параметрам.
        group g = CreateGroup();
        // присваиваем группе идентификатор волны
        Index_SetValue(Groups[GroupCounter],id);
        // селект роута для группы 
        int routeId = WaveRoutes[id][GetRandomInt(0, WaveRoutesCounter[id]-1)]
        
        // перебор отрядов волны
        for(int i = 0; i < UnitWaveGroup_Counter[WaveUnitWaveGroup[id]]; i++)
        {
            int waveCount = GetRandomInt(UnitWaveGroup_CountMin[WaveUnitWaveGroup[id]][i], UnitWaveGroup_CountMax[WaveUnitWaveGroup[id]][i]);
            for(int j = 0; j < waveCount; j++)
            {
                int typrId = UnitWaveGroup_TypeId[WaveUnitWaveGroup[id]][i];
                unit u = CreateUnit(Player(UnitWaveGroup_OwnerId[WaveUnitWaveGroup[id]]), UnitWaveGroup_TypeId[WaveUnitWaveGroup[id]][i],UnitWaveRoute_X[routeId][0], UnitWaveRoute_Y[routeId][0], 0.0);
                IssuePointOrderById(u, order_smart, UnitWaveRoute_X[GroupSelectedRoute[routeId]][1], UnitWaveRoute_Y[GroupSelectedRoute[routeId]][1])
                int groupUnitId = Index_Get(u, false);
                // сохранение для юнита параметров путей, и его позиции на нем
                GroupUnitPositionId[groupUnitId] = routeId;
                GroupUnitPositionIndex[groupUnitId] = 1;
                GroupAddUnit(g, u);
                u = null;
            }
        }
        // добавить группу в обработчик движения
        GroupCounter++;
        Groups[GroupCounter] = g;

        if(GroupCounter == 0)
        {   
            // запуск обработчика групп
            Timer = CreateTimer();
            TimerStart(Timer, TimerPeriod, true, function WaveCore);
        }
        g = null;
        
    }
    
    private void SpawnDelay()
    {
        // получение ID спавна
        timer t = GetExpiredTimer();
        int id = Index_GetValue(t);
        
        // освобождение индекса и ремув таймера
        Index_Remove(timer, t)
        
        // спавн группы
        SpawnWave(id);
        
        // является ли кол-во волно ограниченным
        if(WaveMaxCount[id] != -1)
        {
            // уменьшение счетчика волн
            WaveMaxCount[id]--;
        }
        if(WaveMaxCount[id] != 0 )
        {
            // запуск отсчета для следующей группы
            Timers[WaveCounter] = CreateTimer();
            Index_SetValue(Timers[WaveCounter],id);
            TimerStart(Timers[WaveCounter], GetRandomReal(SpawnPeriodMin[id], SpawnPeriodMax[id]), false, function SpawnDelay);
        }
        t = null;
    }
    
    private void SpawnWithoutDelay(int id)
    {
        // спавн группы
        SpawnWave(id);
        // является ли кол-во волно ограниченным
        if(WaveMaxCount[id] != -1)
        {
            // уменьшение счетчика волн
            WaveMaxCount[id]--;
        }
        if(WaveMaxCount[id] != 0 )
        {
            // запуск отсчета для следующей группы
            Timers[WaveCounter] = CreateTimer();
            Index_SetValue(Timers[WaveCounter],id);
            TimerStart(Timers[WaveCounter], GetRandomReal(SpawnPeriodMin[id], SpawnPeriodMax[id]), false, function SpawnDelay);
        }
    }
    
    
    public int AddWave(int waveMaxCount, float spawnPeriodMin, float spawnPeriodMax, float firstWaveDelay)
    {
        // счетчик групп
        WaveCounter++;
        
        // максимальное кол-во волн
        WaveMaxCount[WaveCounter] = waveMaxCount;
                
        // время спавна
        // минимальное
        SpawnPeriodMin[WaveCounter] = spawnPeriodMin;
        // максимальное
        SpawnPeriodMax[WaveCounter] = spawnPeriodMax;
                
        // инит
        WaveRoutesCounter[WaveCounter] = 0;
        
        // если указана задержка
        if(firstWaveDelay > 0)
        {
            // запуск спавна с отсчетом
            Timers[WaveCounter] = CreateTimer();
            Index_SetValue(Timers[WaveCounter],WaveCounter);
            TimerStart(Timers[WaveCounter], firstWaveDelay, false, function SpawnDelay);
        }
        else
        {
            SpawnWithoutDelay(WaveCounter);
        }
        // ретурн Id группы
        return WaveCounter;
    }
    
    
    public void AddUnitsWaveGroup(int id, int waveGroupId)
    {
        WaveUnitWaveGroup[id] = waveGroupId;
    }
    
    public void AddRoutes(int id, int routeId)
    {
        WaveRoutes[id][WaveRoutesCounter[WaveCounter]] = routeId;
        WaveRoutesCounter[WaveCounter]++;
    }
    
    public void PingWave(int routeId)
    {
        
        for(int i = 0; i < UnitWaveRoute_Size[routeId]; i++)
        {
            PingMinimap(UnitWaveRoute_X[routeId][i],UnitWaveRoute_Y[routeId][i], 5.0)
        }
    }
}
UnitWaveGroup
library UnitWaveGroup
{
    public int Indexer = -1;
    private constant int MAX_GROUP_COUNT = 20;
    private constant int MAX_UNIT_IN_GROUP = 20;
    
    public int array OwnerId
    public int array TypeId[MAX_GROUP_COUNT][MAX_UNIT_IN_GROUP]
    public int array CountMin[MAX_GROUP_COUNT][MAX_UNIT_IN_GROUP]
    public int array CountMax[MAX_GROUP_COUNT][MAX_UNIT_IN_GROUP]
    public int array Counter 
    
    public int Create(int ownerId)
    {
        Indexer++;
        OwnerId[Indexer] = ownerId;
        Counter[Indexer] = 0;
        return Indexer;
    }
    
    public void AddUnitTypeId(int id,  int typeId, int countMin, int countMax)
    {
        TypeId[id][Counter[id]] = typeId;
        CountMin[id][Counter[id]] = countMin;
        CountMax[id][Counter[id]] = countMax;
        Counter[id]++;
    }
}
UnitWaveRoute
library UnitWaveRoute
{
    private constant int MAX_COUNT = 100;
    private constant int MAX_SIZE = 20;
    public float array X[MAX_COUNT][MAX_SIZE]
    public float array Y[MAX_COUNT][MAX_SIZE]
    public int array Size
    public int Counter = -1;
    
    public int Create();
    {
        Counter++;
        Size[Counter] = 0;
        return Counter;
    }
    
    public void AddPoint(int routeId, float x, float y)
    {
        X[routeId][Size[routeId]] = x; 
        Y[routeId][Size[routeId]] = y;
        Size[routeId]++;
    }
}
Simple
library SpawnCreepWavesData uses  SpawnCreepWaves , UnitWaveGroup, UnitWaveRoute
{
    callback onInit()
    {
        
        int waveId = 0; 
        int groupId = 0;
        int routeId = 0;
        
        // создание волны
        // кол-во волн | минимальное время респавна волны | максимальное время респавна волны | отсрочка появления первой волны
        waveId = SpawnCreepWaves_AddWave(-1, 25.0, 35.0, 15.0);
        // создание пути - 1
        routeId = UnitWaveRoute_Create();
        //ID пути | X координата | Y координата
        UnitWaveRoute_AddPoint(routeId, 7886.0, -12670.0);
        UnitWaveRoute_AddPoint(routeId, 8141.0, -13730.0);
        UnitWaveRoute_AddPoint(routeId, 6050.0, -14800.0);
        UnitWaveRoute_AddPoint(routeId, 5600.0, -16500.0);
        UnitWaveRoute_AddPoint(routeId, 7125.0, -18500.0);
        UnitWaveRoute_AddPoint(routeId, 7460.0, -20100.0);
        UnitWaveRoute_AddPoint(routeId, 7200.0, -22000.0);
        // добавление пути к волне
        // ID волны | ID путей
        SpawnCreepWaves_AddRoutes(waveId, routeId);
        // создание пути - 2
        routeId = UnitWaveRoute_Create();
        //ID пути | X координата | Y координата
        UnitWaveRoute_AddPoint(routeId, 4650.0, -27800.0);
        UnitWaveRoute_AddPoint(routeId, 5400.0, -24800.0);
        UnitWaveRoute_AddPoint(routeId, 7100.0, -23700.0);
        UnitWaveRoute_AddPoint(routeId, 7777.0, -22550.0);
        UnitWaveRoute_AddPoint(routeId, 7200.0, -21900.0);
        // добавление пути к волне
        // ID волны | ID путей
        SpawnCreepWaves_AddRoutes(waveId, routeId);
        
        // создание группы
        //Номер игрока владельца
        groupId = UnitWaveGroup_Create(12);
        //ID группы | TypeID юнита | минимальное кол-во юнитов | максимальное кол-во юнитов
        UnitWaveGroup_AddUnitTypeId(groupId,  'hmpr', 1, 4);
        UnitWaveGroup_AddUnitTypeId(groupId,  'edry', 2, 3);
        UnitWaveGroup_AddUnitTypeId(groupId,  'nnrg', 1, 2);
        // добавление группы к волне
        // ID волны | ID группы
        SpawnCreepWaves_AddUnitsWaveGroup(waveId, groupId);
        
        
    }
}
Req: Last cJass
Uses: Index
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
17
11 лет назад
1
Когда уже карта будет)
0
24
11 лет назад
0
В теме проекта же говорил, летом, ближе к концу. Ветсан ланд должен закончить к концу мая.
0
17
11 лет назад
0
Так долго( Ну значит карта просто обязана быть отличной)
0
24
11 лет назад
0
Ну так это вам не доту делать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.