PDA

Просмотр полной версии : [Вопрос] Толпа на спавне



vovandolg
03.11.2016, 04:17
Чем можно растолкать всех игроков в одной точке,
в моде такая фича тпает всех в одну точку стоит прибавка +0.4 по Z чтобы в воздухе чутка рассасывались,
но при большом кол-ве игроков и этого мало бывает,
может у кого есть идея менее затратная по функционалу
чтобы их рассасывало на спавне по сторонам и не било по здоровью?

ziggi
03.11.2016, 09:18
http://pro-pawn.ru/showthread.php?14124

x += random(2) == 0 ? frandom(2.0) : -frandom(2.0);
y += random(2) == 0 ? frandom(2.0) : -frandom(2.0);
SetPlayerPos(playerid, x, y, z);

Item
03.11.2016, 13:12
Один из вариантов реализации (ЖДЛС + автовокзал)


switch(random(5)) {
case 0..3: {
return SetSpawnInfo(playerid, 0, 1, 1754.6554 + float(random(14)), -1888.9286 - float(random(17)), 13.5569, 270.00, 0, 0, 0, 0, 0, 0);
}
case 4: {
return SetSpawnInfo(playerid, 0, 1, 1143.1887 + float(random(17)), -1771.6901 + float(random(4)), 16.59, 0.00, 0, 0, 0, 0, 0, 0);
}
}

vovandolg
03.11.2016, 13:37
Один из вариантов реализации (ЖДЛС + автовокзал)


switch(random(5)) {
case 0..3: {
return SetSpawnInfo(playerid, 0, 1, 1754.6554 + float(random(14)), -1888.9286 - float(random(17)), 13.5569, 270.00, 0, 0, 0, 0, 0, 0);
}
case 4: {
return SetSpawnInfo(playerid, 0, 1, 1143.1887 + float(random(17)), -1771.6901 + float(random(4)), 16.59, 0.00, 0, 0, 0, 0, 0, 0);
}
}


Много лишних аргументов) да и функция затратная если часто юзать)

DeimoS
03.11.2016, 13:42
Я бы предложил более элегантный вариант и телепортировал бы всех вокруг того, к кому, собственно, телепортирует. И чем больше народа телепортируется, тем больше кругов вокруг первого игрока создаётся

vovandolg
03.11.2016, 14:10
Я бы предложил более элегантный вариант и телепортировал бы всех вокруг того, к кому, собственно, телепортирует. И чем больше народа телепортируется, тем больше кругов вокруг первого игрока создаётся

так тогда мне мапы все переделать надо, и расширять окружность спавна)
были бы пинки менее затраные или колизия на время было бы не плохо

Nexius_Tailer
03.11.2016, 14:16
Я бы предложил более элегантный вариант и телепортировал бы всех вокруг того, к кому, собственно, телепортирует. И чем больше народа телепортируется, тем больше кругов вокруг первого игрока создаётся
Очень не экономно. Место внутри круга будет пустым. А если это будет ещё и огромная толпа, то не всякая местность подойдёт под такие размеры круга
Хотя если делать в несколько кругов, то проще уже рандомом ставить

DeimoS
03.11.2016, 14:28
Очень не экономно.

Число игроков известно заранее. Выйдет одна простая формула.


Место внутри круга будет пустым.

Делай минимальный радиус, спавня игроков рядом с тем, к кому телепортируют. И со временем этот радиус увеличивай


А если это будет ещё и огромная толпа, то не всякая местность подойдёт под такие размеры круга

Рандом тоже не для всякой местности подойдёт. Либо игроки будут спавнится друг в друге


проще уже рандомом ставить

Зная рандом в Pawn, игроков всё равно начнёт спавнить друг в друге или слишком близко друг к другу. И чем больше игроков, тем больше вероятность подобного.

- - - Добавлено - - -


так тогда мне мапы все переделать надо, и расширять окружность спавна)
были бы пинки менее затраные или колизия на время было бы не плохо

Так делай игроков бессмертными на время падения и возвращай им прежнее число здоровья при падении на землю, если никакие эстетичные варианты не устраивают

Nexius_Tailer
03.11.2016, 14:36
Число игроков известно заранее. Выйдет одна простая формула.
Я про расстояние говорил


Зная рандом в Pawn, игроков всё равно начнёт спавнить друг в друге или слишком близко друг к другу. И чем больше игроков, тем больше вероятность подобного.
Тоже самое почти: зная количество игроков можно сделать примерную зависимость радиуса, в которой их будет спавнить.
Но через рандом это будет гораздо проще, особенно если взять рандом для дробных чисел

ziggi
03.11.2016, 14:52
Если не нравится рандом, то можно просто создать массив точек и спавнить игроков на них по очереди.

DeimoS
03.11.2016, 14:54
гораздо проще

...сделать так

CMD:gethere(playerid, params[])
{
new Float:x,
Float:y,
Float:z,
Float: health = -1.0;
GetPlayerPos(playerid, x, y, z);

for(new i; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i))
continue;
SetPlayerPos(i, x, y+1.0, z+2.0);
GetPlayerHealth(i, health);
SetPVarFloat(i, "SpawnHealth", health);
SetPlayerHealth(i, 0x7F800000);
}
if(floatcmp(health, -1.0))
SetTimer("@___ReturnPlayerHealth", 3000, false);
}


@___ReturnPlayerHealth();
@___ReturnPlayerHealth()
{
new
Float: health;
for(new i; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || !floatcmp(health = GetPVarFloat(i, "SpawnHealth"), 0.0))
continue;
SetPlayerHealth(i, health);
DeletePVar(i, "SpawnHealth");
}
}

Я думаю, автор получил ответ на свой вопрос


UPD: И да, формула для спавна по кругу должна выглядеть как-то так

pos_x + floatsin((360.0/число_игроков_в_круге) * число_игроков_в_круге, degrees) * радиус_от_центрального_игрока//Х координата

pos_y + floatcos((360.0/число_игроков_в_круге) * число_игроков_в_круге, degrees) * радиус_от_центрального_игрока//Y координата
Часть формулы можно подсчитать для каждого круга ещё на этапе написания скрипта. Если всё настроить, такое телепортирование будет выглядеть довольно интересно.
Можно так же и с углом поворота игроков поиграться, дабы, например, все смотрели конкретно в сторону того, кто их телепортировал.
Вроде мелочь, а уже часть игроков оценит такой щепетильный подход

vovandolg
03.11.2016, 15:07
Если не нравится рандом, то можно просто создать массив точек и спавнить игроков на них по очереди.

Я просто не пробовал его в деле ещё, должно норм получится на процентов так 90-99 точно, но у меня есть в загрузке между мапами пауза где игроки в бессмертии, вот DeimoS в принципе подсказал мне, расширить время бессмертия и после падения уже, но опять же кто то может уйти в афк на несколько секунд и пролетит с бессмертием, надо тестить оба варианта с бессмертием и рандомом, а массив делать это на каждую маппу свои коорды надо и очень много, тоже долгий и нудный вариант.

DeimoS
03.11.2016, 15:18
Я просто не пробовал его в деле ещё, должно норм получится на процентов так 90-99 точно, но у меня есть в загрузке между мапами пауза где игроки в бессмертии, вот DeimoS в принципе подсказал мне, расширить время бессмертия и после падения уже, но опять же кто то может уйти в афк на несколько секунд и пролетит с бессмертием, надо тестить оба варианта с бессмертием и рандомом, а массив делать это на каждую маппу свои коорды надо и очень много, тоже долгий и нудный вариант.

При телепорте проверяй, находится ли игрок в афк и либо не телепортируй его, либо как-то помечай его и запускай для него таймер на отключение GM после того, как он уйдёт из афк