PDA

Просмотр полной версии : [Function] SpawnPlayerToKvadrat



Edwin
29.04.2017, 16:43
Функция устанавливает позицию игрока рандомно в периметре указанного прямоугольника. Если не указывать позицию Z, сервер попытается установить её автоматически




SpawnPlayerToRect(playerid, Float:min_x, Float:min_y, Float:max_x, Float:max_y, Float:posZ = 65535.0)
{
new Float:fPos[2];
fPos[0] = fRand(floatround(min_x), floatround(max_x));
fPos[1] = fRand(floatround(min_y), floatround(max_y));

if(posZ == 65535.0)
SetPlayerPosFindZ(playerid, fPos[0], fPos[1], posZ);
else
SetPlayerPos(playerid, fPos[0], fPos[1], posZ);
}





stock Float:fRand(Float:min, Float:max)
return floatadd(frandom(floatsub(max, min)), min);





Сюда же, дополнительно спавн по указанному радиусу. Аналогично предыдущей функции,
позиция по оси Z будет выставлена автоматически, если её не указать в аргументах


SpawnPlayerToCircle(playerid, Float:cRad, Float:cPosX, Float:cPosY, Float:cPosZ = 65535.0)
{
new Float:rPos[2];
rPos[0] = cRad *floatcos(random(360), degrees) +cPosX;
rPos[1] = cRad *floatsin(random(360), degrees) +cPosY;

if(cPosZ == 65535.0)
SetPlayerPosFindZ(playerid, rPos[0], rPos[1], cPosZ);
else
SetPlayerPos(playerid, rPos[0], rPos[1], cPosZ);
}




Примечание:

Координата по оси Z вычисляется неточно, её правильность зависит от того, находится ли игрок в зоне видимости новой точки. Для более точного вычисления используйте плагин Map Andreas (http://forum.sa-mp.com/showthread.php?t=275492)


Автор: Edwin (am I)

vovandolg
29.04.2017, 21:19
fPos[2] откуда берёт истоки) накладочка какая то там

Edwin
29.04.2017, 22:01
fPos[2] откуда берёт истоки) накладочка какая то там

Там SetPlayerPosFindZ, там какую ни поставь, всё одно - изменится
Факт в том, что изменится только если этот квадрат в зоне стрима игрока...
Но это поправимо с помощью MapAndreas)

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

Ну, в принципе, ради экономии миллисекунд, - да, можно не создавать третью ячейку, и вписать любое значение

DeimoS
29.04.2017, 22:05
А можно ещё пару миллисекунд сэкономит :3

stock SpawnPlayerToKvadrat(playerid, Float:min_x, Float:min_y, Float:max_x, Float:max_y, Float:posZ = 65535.0)
{
#if !defined frand
#define frand(%0,%1) (float(random(%1-%0)+%0)+float(random(1000))/1000)

min_x = frand(floatround(min_x), floatround(max_x));
min_y = frand(floatround(min_y), floatround(max_y));
#undef frand
#endif
if(posZ == 65535.0)
SetPlayerPosFindZ(playerid, min_x, min_y, posZ);
else
SetPlayerPos(playerid, min_x, min_y, posZ);
return 1;
}
Заодно и не засорять чужой мод макросом, который вряд ли впоследствии будет использоваться где-то ещё

ziggi
29.04.2017, 22:40
А можно ещё пару миллисекунд сэкономит :3

stock SpawnPlayerToKvadrat(playerid, Float:min_x, Float:min_y, Float:max_x, Float:max_y, Float:posZ = 65535.0)
{
#if !defined frand
#define frand(%0,%1) (float(random(%1-%0)+%0)+float(random(1000))/1000)

min_x = frand(floatround(min_x), floatround(max_x));
min_y = frand(floatround(min_y), floatround(max_y));
#undef frand
#endif
if(posZ == 65535.0)
SetPlayerPosFindZ(playerid, min_x, min_y, posZ);
else
SetPlayerPos(playerid, min_x, min_y, posZ);
return 1;
}
Заодно и не засорять чужой мод макросом, который вряд ли впоследствии будет использоваться где-то ещё

Вынести frand в отдельную функцию будет намного лучше, так как не будет лишних вызовов floatround:


stock Float:frand(Float:min, Float:max)
{
return float(random(floatround(min) - floatround(max))) + min + float(random(1000)) / 1000.0;
}

stock SpawnPlayerToKvadrat(playerid, Float:min_x, Float:min_y, Float:max_x, Float:max_y, Float:posZ = 65535.0)
{
min_x = frand(min_x, max_x);
min_y = frand(min_y, max_y);

if(posZ == 65535.0)
SetPlayerPosFindZ(playerid, min_x, min_y, posZ);
else
SetPlayerPos(playerid, min_x, min_y, posZ);
}


Но реализация frand очень странная, предлагаю использовать эту: https://gist.github.com/ziggi/26281856399e304bd66c812fa07e4b47
Или вот, укороченная версия для этого случая:

stock Float:frand(Float:min, Float:max)
{
return float(random(0)) / (float(cellmax) / (max - min)) + min;
}

Daniel_Cortez
30.04.2017, 00:23
Вдобавок ко всему вышеперечисленному советую название SpawnPlayerInRect. Всяко лучше, чем непонятная смесь английского с транслитом, хоть название здесь и не самый большой изъян.

Edwin
30.04.2017, 12:05
Вдобавок ко всему вышеперечисленному советую название SpawnPlayerInRect. Всяко лучше, чем непонятная смесь английского с транслитом, хоть название здесь и не самый большой изъян.

Тоже верно, изменить не долго)

Daniel_Cortez
03.05.2017, 17:04
Тоже верно, изменить не долго)
Если это посыл к пользователям, то, боюсь, вы не та том форуме с таким подходом.

Edwin
05.05.2017, 12:16
Если это посыл к пользователям, то, боюсь, вы не та том форуме с таким подходом.

Взял, каждый кто хочет, - изменил, какая проблема?

Есть знаменитая функция PlayerToKvadrat, которой пользуется подавляющее большинство пользователей этого форума, и я ещё не ни разу видел, что бы кто-то предложил переименовать её в PlayerToRect
Многие учатся понимать скриптинг, но не все знают английский. Что за предвзятость к названиям? Я же называю функцию не просто так, а что бы скриптеры, плохо понимающие английский, могли сразу вникнуть в назначение функции. Не Ваши ли слова о том, что всё быть должно понятно?

Nexius_Tailer
05.05.2017, 14:26
Многие учатся понимать скриптинг, но не все знают английский. Что за предвзятость к названиям? Я же называю функцию не просто так, а что бы скриптеры, плохо понимающие английский, могли сразу вникнуть в назначение функции. Не Ваши ли слова о том, что всё быть должно понятно?
Насчёт последнего согласиться сложно. Представь ситуацию, что ты или кто-то, кто выложит твой код не на русскоязычном форуме. Тотчас же такая понятность пропадёт и вникать тем пользователям нужно будет абсолютно с нуля. И более того, пользователь даже при желании перевести этот транслит вряд ли поймёт что-то внятное, в отличие от нормальных названий на английском, которое перевести русскоязычному пользователю труда не составляет никакого.

И вообще пользователям, кто программирует не зная английского стоит понимать, что программирование почти везде ведётся на английском (ну, кроме чего-нибудь вроде этого (https://vk.com/photo-58723216_377705151)), и любая актуальная документация также в основном на нём, так что с ним им вольно-невольно, но столкнуться придётся. Так что не знаю, может и нормально не владеть английским для написания эффективных алгоритмов, но и иметь в коде смесь из английского и русского транслита выглядит неудобно и нечитабельно.

Ну а если конкретно по теме, то действительно проблема не первостепенная.
И хорошо бы добавить поддержку MapAndreas/ColAndreas по проверке его наличия для более точного подсчёта Z

DeimoS
05.05.2017, 14:51
Взял, каждый кто хочет, - изменил, какая проблема?

Есть знаменитая функция PlayerToKvadrat, которой пользуется подавляющее большинство пользователей этого форума, и я ещё не ни разу видел, что бы кто-то предложил переименовать её в PlayerToRect
Многие учатся понимать скриптинг, но не все знают английский. Что за предвзятость к названиям? Я же называю функцию не просто так, а что бы скриптеры, плохо понимающие английский, могли сразу вникнуть в назначение функции. Не Ваши ли слова о том, что всё быть должно понятно?

Собственно, сначала ты игнорируешь любую критику твоего кода, а потом говоришь, что к тебе на данном форуме как-то не так относятся... :)

И да, адекватный аналог PlayerToKvadtat - IsPlayerInSquare. И появился он уже довольно давно (это к тому, что если ты пользуешься PlayerToKvadrat до сих пор, то не нужно за всех говорить).
А PlayerToKvadrat, как и всякие ReturnUser - наследие GodFather и прочих скриптов, написанных лет 8 назад. Если ты так любишь ориентироваться на наследие прошлого ради тех, кто "плохо понимает", то почему бы не выкинуть компьютер в окно и не начать пользоваться деревянными счётами? Да ещё и на то наследие, которое не лучшего качества (перестань тогда мыться и умри от чумы, чтоб прямо по канону было).

Edwin
05.05.2017, 17:44
Если ты так любишь ориентироваться на наследие прошлого ради тех, кто "плохо понимает", то почему бы не выкинуть компьютер в окно и не начать пользоваться деревянными счётами? Да ещё и на то наследие, которое не лучшего качества (перестань тогда мыться и умри от чумы, чтоб прямо по канону было).

Чего ты всем всегда указываешь что им делать?
Не нравится название - да возьмите и переименуйте, какая проблема, я не понимаю? Я предлагаю КОД, а не название, зачем выбирать товар по коробке?
Как вообще можно так к этому относиться? Я представляю, какие вы будете в старости: "Внучак, почему тарелки стоят не по убыванию в ряд, а вперемешку? Не нравится ставить тарелки в ряд - перестань стричь ногти, и умри от того, что во сне они тебе вонзятся в шею" :mosking::mosking:

DeimoS
05.05.2017, 18:30
Чего ты всем всегда указываешь что им делать?

Где и кому я что-то указывал? Тебе я лишь дал совет и не более.


Не нравится название - да возьмите и переименуйте, какая проблема, я не понимаю?

Так а зачем тогда вообще тут ты, если ты не готов следить за тем, что выкладываешь на всеобщее обозрение? Именно из-за таких вот "возьмите и сделайте сами" люди до сих пор впихивают IsPlayerConnected(playerid) в каждую команду и используют тобой упомянутый IsPlayerKvadrat. Ты код не для нас выкладываешь, а для новичков, что зайдут в эту тему. И для них твой код будет эталоном, хотя на деле он вброшен со словами "и так сойдёт".


Я предлагаю КОД, а не название, зачем выбирать товар по коробке?

Охх, ну спасибо большое за такое великодушное одолжение. КОД он нам предлагает. Рич тоже КОД предлагал, когда слил в общий доступ RLS. И теперь сотни недокодеров кодят на том же уровне, на каком написан сей мод, слепо повторяя все его глупости. С такими одолжениями и правда лучше на других форумах удачу ищи, если привык, что тебе должны быть благодарны лишь за то, что ты предложил КОД. А тут пекутся за качество информации, что дойдёт, в итоге, до неокрепших умов новичков.


Как вообще можно так к этому относиться?

Ну да, лучше ведь просто быть настолько упёртым, что отказываться даже самые очевидные ошибки исправлять. Раздутое эго не позволяет, видимо, да? Или нет. Если начать прислушиваться к мнению людей на данном форуме, то не на кого ругаться будет тогда! Ведь тут тебя только и делают, что необоснованно критикуют, а ты, добряк, просто хочешь поделиться с нами, злодеями, своим КОДОМ.



Я представляю, какие вы будете в старости: "Внучак, почему тарелки стоят не по убыванию в ряд, а вперемешку? Не нравится ставить тарелки в ряд - перестань стричь ногти, и умри от того, что во сне они тебе вонзятся в шею" :mosking::mosking:

Тарелки и ногти? Хмм... Не улавливаю связи, уж извини

Edwin
05.05.2017, 19:06
Ай короче ясно
Вот за это я и обхожу стороной ваше, как вы выражаетесь, "комьюнити"


Тарелки и ногти? Хмм... Не улавливаю связи, уж извини

Ну я тоже не особо понял, за что ты меня приписываешь к наследию не лучшего качества.
Ладно, это просто, скорее всего, моё эго
Спасибо, всего доброго

DeimoS
05.05.2017, 20:24
Ай короче ясно
Вот за это я и обхожу стороной ваше, как вы выражаетесь, "комьюнити"

За аргументированную критику? Такое себе достижение.
Хотя да, критика не повышает самооценку так, как похвалы нубов. И плевать, что они хвалят работу не за её содержимое, а просто чтоб набить стату (это я не про конкретно тебя или эту твою тему, а про отношение некоторых личностей к форумам в целом. То, что вас там не критикуют, не означает, что там все добряки, а тут одни злодеи или что ваша работа идеальна, а тут до мелочей докапываются. Собственно, причину я уже описал выше). :mamba:


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



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

Разве ты не сам себя приписываешь к нему, ориентируясь на какие-то несуразные ошибки прошлого, которые распространились в массы просто потому, что никто особо не заморачивался над тем, как правильно следует делать? :)

Просто пойми, писать код для себя и писать код для публики - вещи разные. Я, например, далеко не всегда пишу код так, как писал его для статей на этом форуме, ибо до сих пор экспериментирую и ищу подходящий для себя стиль. Но мои эксперименты никак не относятся ни к тем, кто будет читать мои статьи, ни к форуму, на котором есть свои критерии по оформлению кода. Этот форум - не моя личная "песочница", в которой больше никого нет и можно делать всё, что хочешь. В этой "песочнице" есть и другие "дети", которые "младше" меня и если я начну при них "материться", то они, собственно, начнут повторять за мной, что ничего хорошего не привнесёт в общество. Поэтому когда я нахожусь в "песочнице", мне нужно отбросить все свои негативные качества, дабы "дети" впитали только хорошее и, в дальнейшем, превзошли меня в "лепке куличиков".
В общем, данный форум - это не то место, куда можно сливать код любого качества и надеяться на похвалу. Этот форум позиционирует себя как "детский сад", в котором есть "воспитатели", которые пытаются контролировать информацию, которая доходит до "детей", дабы они получали только хорошее. Не потому, что мы тут все такие ЧСВ и гнобим любого, кто не пляшет под нашу дудку. Нет. Мы просто создали свою "песочницу" и установили в ней свои правила, ибо посчитали, что правила в других "песочницах" ни к чему хорошему не ведут. Мы не пытаемся перестроить другие "песочницы" под свой лад. Мы просто строим свой коммунизм и не даём никому его развалить.

Я уже не знаю как ещё можно объяснить политику этого форума... В общем, никто ни тебя, ни кого-либо ещё не гнобит. Гнобят наплевательский подход к кодингу и пытаются объяснить как стоит делать, дабы кодить стало проще.

А с твоей стороны странно приходить в чужую "песочницу" (она и для меня чужая, если что. Правила устанавливают те, кто держат сайт) и удивляться тому, что там не хотят плясать под твою дудку. Если хочешь публиковать код так, как нравится тебе, то можешь завести тот же github, который является более личной "песочницей", нежели форумы, и уже там смело слать всех, кто решит тебя учить как тебе кодить. Но если приходишь в какое-либо сообщество, то будь готов соблюдать правила этого сообщества, дабы тебя не засмеяли в итоге. Это "правило" действует везде: будь то интернет или реальная жизнь :)