PDA

Просмотр полной версии : [Вопрос] Подмена координат объекта



Danil_Cage
10.04.2017, 12:37
Доброго времени суток.
Сразу к сути, я создаю объект при наезде на который происходит взрыв. Далее создаю объект который прокалывает шипы, но он так же взрывается.
Объект который должен взрываться:

if(IsValidPlayerObject(playerid, obmin[battleinv[playerid]]))
{
new Float:xo, Float:yo, Float:zo;
GetPlayerObjectPos(playerid, obmin[battleinv[playerid]], xo, yo, zo);

if(IsPlayerInRangeOfPoint(playerid, 5.0, xo, yo, zo))
{
DestroyObject(obmin[battleinv[playerid]]);
foreach(Player, i)
{
if(battleinv[i] == battleinv[playerid])
{
CreateExplosion(xo, yo, zo, 0, 6.0);
DestroyPlayerObject(i, obmin[battleinv[i]]);
xo = 0;
yo = 0;
zo = 0;
}
}
}
}
Объект который должен прокалывать шипы:

new Float:xs, Float:ys, Float:zs;
new panelss, doorss, lightss, tiress;
GetPlayerObjectPos(playerid, shipi[battleinv[playerid]], xs, ys, zs);
if(IsPlayerInRangeOfPoint(playerid, 1.0, xs, ys, zs))
{

GetVehicleDamageStatus(vehicleid, panelss, doorss, lightss, tiress);
UpdateVehicleDamageStatus(vehicleid, panelss, doorss, lightss, 15);
}
Если сначала поставить объект который прокалывает шипы, а потом создать тот что должен взрываться, то всё работает правильно.

DeimoS
10.04.2017, 16:40
При удалении объекта нужно и переменную обнулять, что хранит ID объекта

Danil_Cage
10.04.2017, 16:59
При удалении объекта нужно и переменную обнулять, что хранит ID объекта

Проблема была действительно в том, что я не обнулял переменную. Спасибо, тема закрыта.

DeimoS
10.04.2017, 17:53
Сталкиваюсь с подобной проблемой у людей далеко не первый раз, поэтому давайте попробую объяснить причину, по которой происходил баг (встречаются и те, кто не понимает почему так происходит):

Когда ты создавал объект бомбы, он занимал, например, ID 1, который ты записывал в переменную.
Далее ты действие обрабатывал и удалял сам объект, но переменную не обнулял.
После ты создал объект шипов и он занял первый свободный ID (тот самый 1-ый ID, который был у объекта бомбы).
Соответственно, теперь у тебя и бомба, и шипы имеют одинаковый ID объекта => когда происходит обработка кода для бомб, функция IsValidPlayerObject возвращает информацию о том, что объект существует (хотя это шипы, а не бомба) и действие для шипов выполняется как для бомбы.

Это так же можно было зафиксить проверкой на нужную тебе модель объекта (GetPlayerObjectModel) вместо IsValidPlayerObject, но обнуление переменной в данном случае подходит больше


Закрыто.