PDA

Просмотр полной версии : [Мануал] Падающая бомба



L0ndl3m
09.03.2014, 01:43
Всем привет, пользователи и гости Pro-Pawn.Ru (Pro-Pawn.Ru). В этом мануале мы попробуем создать падающую бомбу.

Создадим глобальную переменные (обычно их распологают почти в начале мода):


new
BombObject = INVALID_OBJECT_ID;



Создадим команду, с помощью которой мы запустим бомбу.

Если у вас стандартный командный процессор, то в public OnPlayerCommandText:


if(strcmp(cmdtext, "/bomb", true) == 0)
{
if(BombObject != INVALID_OBJECT_ID)
return SendClientMessage(playerid, -1, "Бомба уже падает.");
new
Float: p_pos_x,
Float: p_pos_y,
Float: p_pos_z;

GetPlayerPos(playerid, p_pos_x, p_pos_y, p_pos_z);
BombObject = CreateObject(18849, p_pos_x, p_pos_y, p_pos_z + 50, 0.0, 0.0, 0.0);
MoveObject(BombObject, p_pos_x, p_pos_y, p_pos_z + 6.5, 1);
return SendClientMessageToAll(-1, "Сейчас упадёт бомба, беги!");
}


Если dc_cmd, zcmd, ..., в конец мода:


CMD:bomb(playerid, params[])
{
if(BombObject != INVALID_OBJECT_ID)
return SendClientMessage(playerid, -1, "Бомба уже падает.");
new
Float: p_pos_x,
Float: p_pos_y,
Float: p_pos_z;

GetPlayerPos(playerid, p_pos_x, p_pos_y, p_pos_z);
BombObject = CreateObject(18849, p_pos_x, p_pos_y, p_pos_z + 50, 0.0, 0.0, 0.0);
MoveObject(BombObject, p_pos_x, p_pos_y, p_pos_z + 6.5, 2.0);
return SendClientMessageToAll(-1, "Сейчас упадёт бомба, беги!");
}


В public OnObjectMoved:


if(objectid == BombObject)
{
new
Float: o_pos_x,
Float: o_pos_y,
Float: o_pos_z;

GetObjectPos(objectid, o_pos_x, o_pos_y, o_pos_z);
DestroyObject(objectid);
BombObject = INVALID_OBJECT_ID;
return CreateExplosion(o_pos_x, o_pos_y, o_pos_z - 6.5, 2, 10.0);
}


Автор: Londlem (http://pro-pawn.ru/member.php?2057-Londlem)

Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

Salvacore
09.03.2014, 01:48
Бесподобно :3

iStrange
09.03.2014, 02:11
Скорость очень маленькая.
А так - идея реализована отлично!

Salvacore
09.03.2014, 02:15
Скорость очень маленькая.
А так - идея реализована отлично!
Увеличь ;)

#Vito
09.03.2014, 02:15
Хах, отлично))

iStrange
09.03.2014, 02:20
Увеличь ;)
Это был намёк на то, чтобы он увеличил :D

DeimoS
09.03.2014, 08:28
Смотрел с телефона и думал, что показалось, но нет...

public UpdateBombPos();//Ок
public UpdateBombPos()
{
new Float: p[3];
GetDynamicObjectPos(BombObject, p[0], p[1], p[2]);
if(p[2] - BombPos[2] <= 6)
{
CreateExplosion(p[0], p[1], p[2], 2, 10);
DestroyDynamicObject(BombObject);
KillTimer(BombTimer);
BombObject = -1;
return true;
}
SetDynamicObjectPos(BombObject, p[0], p[1], p[2] - 0.05);
return true;
}
Ди и тут не хватает слэша

if(!strcmp(cmdtext[1], "bomb", true))

Salvacore
09.03.2014, 08:29
Смотрел с телефона и думал, что показалось, но нет...

public UpdateBombPos();//Ок
public UpdateBombPos()
{
new Float: p[3];
GetDynamicObjectPos(BombObject, p[0], p[1], p[2]);
if(p[2] - BombPos[2] <= 6)
{
CreateExplosion(p[0], p[1], p[2], 2, 10);
DestroyDynamicObject(BombObject);
KillTimer(BombTimer);
BombObject = -1;
return true;
}
SetDynamicObjectPos(BombObject, p[0], p[1], p[2] - 0.05);
return true;
}
Ди и тут не хватает слэша

if(!strcmp(cmdtext[1], "bomb", true))

public UpdateBombPos();//Ок
public UpdateBombPos()
Попробуй и ты... Никакой разницы нет...

Seregamil
09.03.2014, 08:31
Зачем использовать стример, если разрешена одна бомба?
Паблик и снова паблик, у меня глюки?
И move object и onobjectmoved будут более экономичней и без таймеров для данной системы

Salvacore
09.03.2014, 08:33
Зачем использовать стример, если разрешена одна бомба?
Паблик и снова паблик, у меня глюки?
И move object и onobjectmoved будут более экономичней и без таймеров для данной системы
Кто то недавно втирал про функционал :D

DeimoS
09.03.2014, 08:36
public UpdateBombPos();//Ок
public UpdateBombPos()
Попробуй и ты... Никакой разницы нет...
О чём ты?


Кто то недавно втирал про функционал :D

Какой тут функционал? Либо ты таймером двигаешь объект, либо одной функцией указываешь финальную позицию и всё тут

Salvacore
09.03.2014, 08:44
О чём ты?



Какой тут функционал? Либо ты таймером двигаешь объект, либо одной функцией указываешь финальную позицию и всё тут

У вас с ним был спор,сейчас не найду 100%.
Он утверждал о функционале,а ты о скорости.(если не путаю что то)

Seregamil
09.03.2014, 08:47
У вас с ним был спор,сейчас не найду 100%.
Он утверждал о функционале,а ты о скорости.(если не путаю что то)

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

DeimoS
09.03.2014, 08:49
У вас с ним был спор,сейчас не найду 100%.
Он утверждал о функционале,а ты о скорости.(если не путаю что то)

Ситуация совсем иная была. Да и тут от move object и к функционалу, и к скорости, и к красоте кода прибавиться

Salvacore
09.03.2014, 09:40
Ситуация совсем иная была. Да и тут от move object и к функционалу, и к скорости, и к красоте кода прибавиться
Передам автору все ваши пожелания, надеюсь вы будете довольны ;)

L0ndl3m
09.03.2014, 12:10
Смотрел с телефона и думал, что показалось, но нет...

public UpdateBombPos();//Ок
public UpdateBombPos()
{
new Float: p[3];
GetDynamicObjectPos(BombObject, p[0], p[1], p[2]);
if(p[2] - BombPos[2] <= 6)
{
CreateExplosion(p[0], p[1], p[2], 2, 10);
DestroyDynamicObject(BombObject);
KillTimer(BombTimer);
BombObject = -1;
return true;
}
SetDynamicObjectPos(BombObject, p[0], p[1], p[2] - 0.05);
return true;
}



Как бы вариант с форвардом и пабликом будет рабочим.



Ди и тут не хватает слэша

if(!strcmp(cmdtext[1], "bomb", true))


Посмотри внимательно, первый символ не проверяется (cmdtext[1]), ибо все команды начинаются со слэша.


Зачем использовать стример, если разрешена одна бомба?
Паблик и снова паблик, у меня глюки?
И move object и onobjectmoved будут более экономичней и без таймеров для данной системы

Вдруг у игрока на сервере очень много объектов, а игрок просто захотел затестить эту бомбу. Лимит же, или нет?

Кстати да, совсем забыл про стандартные функции MoveObject и OnObjectMoved :|. С ними было бы лучше, да.

Seregamil
09.03.2014, 12:14
Лимит же, или нет?
нет

DeimoS
09.03.2014, 12:20
Как бы вариант с форвардом и пабликом будет рабочим.

В курсе, но давайте лучше называть вещи своими именами и использовать их по своему назначению? Если в ENUM к последней переменной поставить запятую, всё тоже будет прекрасно работать, но это же не значит, что такой вариант верен :)


Посмотри внимательно, первый символ не проверяется (cmdtext[1]), ибо все команды начинаются со слэша.
Ах да, не посмотрел. Прошу прощения. Но это извращение какое-то, по моему :D



Вдруг у игрока на сервере очень много объектов, а игрок просто захотел затестить эту бомбу. Лимит же, или нет?

Ну тогда стоит учесть вариант, когда вокруг игрока будет слишком много объектов и даже стример не справится с их отображением. И вариант, когда у человека руки из задницы и он неправильно вставит код. И ещё кучу всего.
P.S. Это сарказм, если что ;) Хотя можно было бы сделать так:

#if defined STREAMER_TYPE_OBJECT
BombObject = CreateDynamicObject(18849, BombPos[0], BombPos[1], BombPos[2] + 50, 0.0, 0.0, 0.0);
#else
BombObject = CreateObject(18849, BombPos[0], BombPos[1], BombPos[2] + 50, 0.0, 0.0, 0.0);
#endif
И с уничтожением так же. Выйдет полная совместимость :)

Landlem
24.03.2014, 15:27
Врун!
Это американский скрипт!
Где аммуниция с неба падала!

Salvacore
24.03.2014, 15:28
Врун!
Это американский скрипт!
Где аммуниция с неба падала!
Ссылку в студию.
Кроме вас тут врунов нету.

Caypen
26.03.2014, 16:56
Очень медленно на видео бомба падает, да и взрыв слабый, юзай 6-ой,он очень большой и красивый.
А так интересная разработка.