Добавлен Faion,
не публикуется
Простая система создания атакующих волн.
Поддерживает:
-Рандомизацию времени повторного респавна;
-Ограничение кол-ва волн;
-Отсрочка спавна;
-Удаление спавна волн;
-Рандомизация пути следования;
-Множественные типы юнитов в волне;
-Рандомизация кол-ва юнитов в группе;
-Единовременная обработка множества групп.
-Рандомизацию времени повторного респавна;
-Ограничение кол-ва волн;
-Отсрочка спавна;
-Удаление спавна волн;
-Рандомизация пути следования;
-Множественные типы юнитов в волне;
-Рандомизация кол-ва юнитов в группе;
-Единовременная обработка множества групп.
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
Uses: Index
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
просто Юрок
11 лет назад
1
Когда уже карта будет)
0
Faion
11 лет назад
0
В теме проекта же говорил, летом, ближе к концу. Ветсан ланд должен закончить к концу мая.
0
просто Юрок
11 лет назад
0
Так долго( Ну значит карта просто обязана быть отличной)
0
Faion
11 лет назад
0
Ну так это вам не доту делать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.