16/12/2024 17:44
Possíveis Causas do Problema
1. Distância de Verificação:
No evento OnObjectMoved, você verifica a distância entre a posição do pacote e a posição da "zona de entrega" usando a função Distance. O valor definido para a distância máxima é 8.0:
Se o pacote não "cair" dentro de 8.0 unidades da zona de entrega, a lógica considera que ele não caiu na área.
Porém, dependendo do tamanho do checkpoint (do objeto 19946 que representa a área) e do modelo do pacote (2912), essa distância pode ser insuficiente. O objeto pode estar visualmente dentro do checkpoint, mas o cálculo da distância pode resultar em um valor maior devido às coordenadas.
2. Verificação com GetPlayerObjectPos:
A função GetPlayerObjectPos está sendo usada para obter as coordenadas do checkpoint:
Se o checkpoint estiver criado com uma coordenada Z específica (elevação), mas o pacote "cair" em uma altura ligeiramente diferente, isso pode causar imprecisão no cálculo de distância.
Solução Proposta
1. Ajustar a Distância Máxima
Aumente o valor da distância de 8.0 para algo mais permissivo, como 10.0 ou 12.0:
Isso garantirá que pequenas variações na posição não impeçam a validação do pacote.
2. Ignorar Pequenas Diferenças na Altura (Z)
Ao calcular a distância, você pode reduzir a influência da coordenada Z (altura). Isso é útil caso o pacote e o checkpoint estejam em elevações ligeiramente diferentes.
Aqui está a modificação na lógica de cálculo da distância:
Basicamente, usamos a coordenada Z do checkpoint como referência para a altura, ignorando a altura exata do pacote.
3. Adicionar Debug para Testar Coordenadas
Se o problema persistir, adicione mensagens de depuração para verificar as coordenadas e a distância calculada:
Isso ajudará a entender se a distância calculada está correta.
Código Ajustado
Abaixo está a versão ajustada da lógica em OnObjectMoved:
1. Distância de Verificação:
No evento OnObjectMoved, você verifica a distância entre a posição do pacote e a posição da "zona de entrega" usando a função Distance. O valor definido para a distância máxima é 8.0:
Código PHP:
if(dist < 8.0) {
Se o pacote não "cair" dentro de 8.0 unidades da zona de entrega, a lógica considera que ele não caiu na área.
Porém, dependendo do tamanho do checkpoint (do objeto 19946 que representa a área) e do modelo do pacote (2912), essa distância pode ser insuficiente. O objeto pode estar visualmente dentro do checkpoint, mas o cálculo da distância pode resultar em um valor maior devido às coordenadas.
2. Verificação com GetPlayerObjectPos:
A função GetPlayerObjectPos está sendo usada para obter as coordenadas do checkpoint:
Código PHP:
GetPlayerObjectPos(owner, TraffickingObjects[owner][OBJECT_ZONE], zonex, zoney, zonez);
Se o checkpoint estiver criado com uma coordenada Z específica (elevação), mas o pacote "cair" em uma altura ligeiramente diferente, isso pode causar imprecisão no cálculo de distância.
Solução Proposta
1. Ajustar a Distância Máxima
Aumente o valor da distância de 8.0 para algo mais permissivo, como 10.0 ou 12.0:
Código PHP:
if(dist < 12.0) {
Isso garantirá que pequenas variações na posição não impeçam a validação do pacote.
2. Ignorar Pequenas Diferenças na Altura (Z)
Ao calcular a distância, você pode reduzir a influência da coordenada Z (altura). Isso é útil caso o pacote e o checkpoint estejam em elevações ligeiramente diferentes.
Aqui está a modificação na lógica de cálculo da distância:
Código PHP:
new Float: adjustedDist = Distance(objx, objy, zonez, zonex, zoney, zonez);
if(adjustedDist < 12.0) {
Basicamente, usamos a coordenada Z do checkpoint como referência para a altura, ignorando a altura exata do pacote.
3. Adicionar Debug para Testar Coordenadas
Se o problema persistir, adicione mensagens de depuração para verificar as coordenadas e a distância calculada:
Código PHP:
printf("Object Pos: %.2f, %.2f, %.2f", objx, objy, objz);
printf("Zone Pos: %.2f, %.2f, %.2f", zonex, zoney, zonez);
printf("Distance: %.2f", dist);
Isso ajudará a entender se a distância calculada está correta.
Código Ajustado
Abaixo está a versão ajustada da lógica em OnObjectMoved:
Código PHP:
public OnObjectMoved(objectid)
{
if(GetObjectModel(objectid) == PACKAGE_MODEL)
{
new owner = INVALID_PLAYER_ID;
for(new i, p = GetPlayerPoolSize(); i <= p; ++i)
{
if(objectid == TraffickingObjects[i][OBJECT_PACKAGE])
{
owner = i;
break;
}
}
new Float: objx, Float: objy, Float: objz, Float: zonex, Float: zoney, Float: zonez, money;
GetObjectPos(objectid, objx, objy, objz);
GetPlayerObjectPos(owner, TraffickingObjects[owner][OBJECT_ZONE], zonex, zoney, zonez);
// Ajusta para ignorar pequenas diferenças de altura
new Float: dist = Distance(objx, objy, zonez, zonex, zoney, zonez);
if(dist < 12.0) { // Aumentei a distância para 12.0
money = 1500 + floatround(-100 * dist, floatround_floor);
if(money < 250) money = 250;
GivePlayerMoney(owner, money);
new id = random(sizeof(DropLocations)), string[144];
format(string, sizeof(string), "DELIVERY: {FFFFFF}You've delivered a package and earned {2ECC71}$%d{FFFFFF}.", money);
SendClientMessage(owner, 0x2ECC71FF, string);
DestroyPlayerObject(owner, TraffickingObjects[owner][OBJECT_ZONE]);
TraffickingObjects[owner][OBJECT_ZONE] = CreatePlayerObject(owner, 19946, DropLocations[id][dropX], DropLocations[id][dropY], DropLocations[id][dropZ], 0.0, 0.0, 0.0, 1200.0);
SetPlayerMapIcon(owner, 69, DropLocations[id][dropX], DropLocations[id][dropY], DropLocations[id][dropZ], 24, 0, MAPICON_GLOBAL);
format(string, sizeof(string), "DELIVERY: {FFFFFF}Drop the package in the marked area at {3498DB}%s{FFFFFF}.", DropLocations[id][dropLocation]);
SendClientMessage(owner, 0x2ECC71FF, string);
format(string, sizeof(string), "DELIVERY: {FFFFFF}Packages left: {3498DB}%d{FFFFFF}.", PackageCount[owner]);
SendClientMessage(owner, 0x2ECC71FF, string);
}else{
SendClientMessage(owner, 0xE74C3CFF, "DELIVERY: {FFFFFF}Package didn't land in the marked area, better luck next time.");
}
DestroyObject(TraffickingObjects[owner][OBJECT_PACKAGE]);
TraffickingObjects[owner][OBJECT_PACKAGE] = INVALID_OBJECT_ID;
if(PackageCount[owner] == 0)
{
SendClientMessage(owner, 0x2ECC71FF, "DELIVERY: {FFFFFF}You're out of packages.");
ResetDelivery(owner);
}
}
return 1;
}