Просмотр полной версии : [Вопрос] Толпа на спавне
vovandolg
03.11.2016, 04:17
Чем можно растолкать всех игроков в одной точке,
в моде такая фича тпает всех в одну точку стоит прибавка +0.4 по Z чтобы в воздухе чутка рассасывались,
но при большом кол-ве игроков и этого мало бывает,
может у кого есть идея менее затратная по функционалу
чтобы их рассасывало на спавне по сторонам и не било по здоровью?
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);
Один из вариантов реализации (ЖДЛС + автовокзал)
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);
}
}
Много лишних аргументов) да и функция затратная если часто юзать)
Я бы предложил более элегантный вариант и телепортировал бы всех вокруг того, к кому, собственно, телепортирует. И чем больше народа телепортируется, тем больше кругов вокруг первого игрока создаётся
vovandolg
03.11.2016, 14:10
Я бы предложил более элегантный вариант и телепортировал бы всех вокруг того, к кому, собственно, телепортирует. И чем больше народа телепортируется, тем больше кругов вокруг первого игрока создаётся
так тогда мне мапы все переделать надо, и расширять окружность спавна)
были бы пинки менее затраные или колизия на время было бы не плохо
Nexius_Tailer
03.11.2016, 14:16
Я бы предложил более элегантный вариант и телепортировал бы всех вокруг того, к кому, собственно, телепортирует. И чем больше народа телепортируется, тем больше кругов вокруг первого игрока создаётся
Очень не экономно. Место внутри круга будет пустым. А если это будет ещё и огромная толпа, то не всякая местность подойдёт под такие размеры круга
Хотя если делать в несколько кругов, то проще уже рандомом ставить
Очень не экономно.
Число игроков известно заранее. Выйдет одна простая формула.
Место внутри круга будет пустым.
Делай минимальный радиус, спавня игроков рядом с тем, к кому телепортируют. И со временем этот радиус увеличивай
А если это будет ещё и огромная толпа, то не всякая местность подойдёт под такие размеры круга
Рандом тоже не для всякой местности подойдёт. Либо игроки будут спавнится друг в друге
проще уже рандомом ставить
Зная рандом в Pawn, игроков всё равно начнёт спавнить друг в друге или слишком близко друг к другу. И чем больше игроков, тем больше вероятность подобного.
- - - Добавлено - - -
так тогда мне мапы все переделать надо, и расширять окружность спавна)
были бы пинки менее затраные или колизия на время было бы не плохо
Так делай игроков бессмертными на время падения и возвращай им прежнее число здоровья при падении на землю, если никакие эстетичные варианты не устраивают
Nexius_Tailer
03.11.2016, 14:36
Число игроков известно заранее. Выйдет одна простая формула.
Я про расстояние говорил
Зная рандом в Pawn, игроков всё равно начнёт спавнить друг в друге или слишком близко друг к другу. И чем больше игроков, тем больше вероятность подобного.
Тоже самое почти: зная количество игроков можно сделать примерную зависимость радиуса, в которой их будет спавнить.
Но через рандом это будет гораздо проще, особенно если взять рандом для дробных чисел
Если не нравится рандом, то можно просто создать массив точек и спавнить игроков на них по очереди.
гораздо проще
...сделать так
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 в принципе подсказал мне, расширить время бессмертия и после падения уже, но опять же кто то может уйти в афк на несколько секунд и пролетит с бессмертием, надо тестить оба варианта с бессмертием и рандомом, а массив делать это на каждую маппу свои коорды надо и очень много, тоже долгий и нудный вариант.
Я просто не пробовал его в деле ещё, должно норм получится на процентов так 90-99 точно, но у меня есть в загрузке между мапами пауза где игроки в бессмертии, вот DeimoS в принципе подсказал мне, расширить время бессмертия и после падения уже, но опять же кто то может уйти в афк на несколько секунд и пролетит с бессмертием, надо тестить оба варианта с бессмертием и рандомом, а массив делать это на каждую маппу свои коорды надо и очень много, тоже долгий и нудный вариант.
При телепорте проверяй, находится ли игрок в афк и либо не телепортируй его, либо как-то помечай его и запускай для него таймер на отключение GM после того, как он уйдёт из афк
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot