Buna seara si un an nou fericit tuturor. Făceam câteva teste așa cum ați descris anterior și observ câteva probleme la nivelul coliziunii. Am introdus și un obiect fizic pentru a înțelege dacă poziția/rotația în funcție de vehicul este corectă. Ceea ce observ, de exemplu, este că funcția CA_ContactTest trebuie să aibă toate valorile de poziție/rotație perfect egale cu obiectul de testat pentru a returna că condiția a apărut. O sa atasez cateva fotografii si scenariul atasat! Cu toate acestea, la obținerea poziției unui obiect CA_CreateObject, valorile float sunt întotdeauna 0.0. Nu există o metodă pentru a obține poziția ca CA_GetObjectPos? De asemenea, am rulat un test suplimentar între un CA_CreateObject și CreateObject cu aceeași poziție (unde apare condiția), deplasând obiectul de coliziune cu CA_SetObjectPos, coliziunea are loc în continuare. Mulțumesc pentru răbdarea dvs.
#include <a_samp>
#include <colandreas>
new obj1, obj2;
new objView;
new objTest1, objTest2;
public OnFilterScriptInit()
{
CA_Init();
//obj1 = CA_CreateObject(710, 2045.71887, 1351.40881, 24.95637, 0, 0, 0);
obj2 = CreateObject(3437, 2045.76587, 1351.48413, 15.64844, 356.85840, 0.00000, -3.00958);
//Object test
objTest1 = CA_CreateObject(19791, 2002.51270, 1259.76611, 9.96172, 0.00000, 0.00000, 0.00000);
objTest2 = CreateObject(19790, 2002.51270, 1259.76611, 9.96172, 0.00000, 0.00000, 0.00000);
CreateVehicle(411, 2048.3931, 1320.5370, 10.5648, 0.0000, -1, -1, 100);
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (!strcmp(cmdtext, "/col", true))
{
new
Float:x,
Float:y,
Float:z,
Float:rx,
Float:ry,
Float:rz;
GetObjectPos(obj2, x, y, z);
GetObjectRot(obj2, rx, ry, rz);
if (CA_ContactTest(18763, x, y, z, rx, ry, rz)) {
SendClientMessage(playerid, -1, "ok!");
}
else
{
SendClientMessage(playerid, -1, "no!");
}
return 1;
}
if (!strcmp(cmdtext, "/cbj", true))
{
new vehicleId = GetPlayerVehicleID(playerid);
new
Float:x,
Float:y,
Float:z,
Float:r;
GetVehiclePos(vehicleId, x, y, z);
GetVehicleZAngle(vehicleId, r);
obj1 = CA_CreateObject(18763, x, y, z, 0, 0, r);
objView = CreateObject(18763, x, y, z, 0, 0, r);
SendClientMessage(playerid, -1, "Object created!");
return 1;
}
if (!strcmp(cmdtext, "/dview", true))
{
DestroyObject(objView);
return 1;
}
///Checks for collision with the same position
if (!strcmp(cmdtext, "/coltest", true))
{
new
Float:x,
Float:y,
Float:z,
Float:rx,
Float:ry,
Float:rz;
GetObjectPos(objTest2, x, y, z);
GetObjectRot(objTest2, rx, ry, rz);
if (CA_ContactTest(19791, x, y, z, rx, ry, rz)) {
SendClientMessage(playerid, -1, "ok!");
}
else
{
SendClientMessage(playerid, -1, "no!");
}
return 1;
}
if (!strcmp(cmdtext, "/setpos", true))
{
new
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid, x, y, z);
CA_SetObjectPos(objTest1, x, y, z);
return 1;
}
return 0;
}
public OnPlayerUpdate(playerid)
{
new vehicleId = GetPlayerVehicleID(playerid);
new playerState = GetPlayerState(playerid);
if (playerState == PLAYER_STATE_DRIVER)
{
new
Float:x,
Float:y,
Float:z,
Float:r;
GetVehiclePos(vehicleId, x, y, z);
GetVehicleZAngle(vehicleId, r);
if (CA_IsValidObject(obj1))
{
CA_SetObjectPos(obj1, x, y, z);
CA_SetObjectRot(obj1, 0.0, 0.0, r);
}
if (IsValidObject(objView))
{
SetObjectPos(objView, x, y, z);
SetObjectRot(objView, 0.0, 0.0, r);
}
}
return 1;
}