SA-MP Forums Archive
Баг респавна транспорта - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Баг респавна транспорта (/showthread.php?tid=601163)



Баг респавна транспорта - OmegaKiller72 - 17.02.2016

Здраствуйте народ!) помогите пожалуйста создать две глобальные переменные для playerid и hitid в паблике
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_VEHICLE)
{
static Float:X, Float:Y, Float:Z; //Show in the petrol tank - It also works when the player is inside.
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAP, X, Y, Z);
if(VectorSize(fX-X, fY-Y, fZ-Z) < 0.15)
{
SetVehicleHealth(hitid, 0.0);
return 1;
}
//Shot in empty vehicle
for(new i = GetPlayerPoolSize(); i > -1; i--)
{
if(GetPlayerVehicleID(i) == hitid && GetPlayerVehicleSeat(i) == 0)
return 1;
}
GetVehicleHealth(hitid, X);
if(X > 0)
{
switch(weaponid)
{
case 0 .. 15: SetVehicleHealth(hitid, X - 10);
case 22 .. 23: SetVehicleHealth(hitid, X - 15);
case 24: SetVehicleHealth(hitid, X - 50);
case 25 .. 27: SetVehicleHealth(hitid, X - 30);
case 28, 29, 32: SetVehicleHealth(hitid, X - 5);
case 30, 31: SetVehicleHealth(hitid, X - 10);
case 33, 34: SetVehicleHealth(hitid, X - 40);
case 35 .. 38: SetVehicleHealth(hitid, X - 80);
default: return 1;
}
}
}
return 1;
}

чтоб их можно было использовать в public OnVehicleDeath, читал что если так ломать пустой транспорт, то он не респавнится потом изза отсутствия killerid, либо спавнится с последним нанесённым уроном и взрывается снова


Re: Баг респавна транспорта - eakwarp - 17.02.2016

Что?


Re: Баг респавна транспорта - OmegaKiller72 - 17.02.2016

Quote:
Originally Posted by eakwarp
View Post
Что?
в паблике OnVehicleDeath мне надо указать ид взорваной машины и ид игрока взорвавшего машину, иначе никак не респавнится транспорт после взрыва! а для этого надо две глобальные переменные ид машины в которую стреляют и ид игрока который стреляет в эту машину


Re: Баг респавна транспорта - Diman777 - 17.02.2016

PHP Code:
// Объявляем глобально
// Константы если необходимо заменяешь на свои
new player_shot_id[MAX_PLAYERS];
new 
vehicle_death_id[MAX_VEHICLES];
public 
OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
{
    if (
hittype == BULLET_HIT_TYPE_VEHICLE)
    {
        static 
Float:XFloat:YFloat:Z//Show in the petrol tank - It also works when the player is inside.
        
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAPXYZ);
        if (
VectorSize(fX-XfY-YfZ-Z) < 0.15)
        {
            
SetVehicleHealth(hitid0.0);
            
// Записываем полученные значения в нужную ячейку
            
player_shot_id[playerid] = playerid;
            
vehicle_death_id[hitid] = hitid;
            return 
1;
        }
        
//Shot in empty vehicle
        
for (new GetPlayerPoolSize(); > -1i--)
        {
            if (
GetPlayerVehicleID(i) == hitid && GetPlayerVehicleSeat(i) == 0)
            {
                return 
1;
            }
        }
        
GetVehicleHealth(hitidX);
        if (
0)
        {
            switch (
weaponid)
            {
                case 
0..15SetVehicleHealth(hitid10);
                case 
22..23SetVehicleHealth(hitid15);
                case 
24SetVehicleHealth(hitid50);
                case 
25..27SetVehicleHealth(hitid30);
                case 
28,29,32SetVehicleHealth(hitid5);
                case 
30,31SetVehicleHealth(hitid10);
                case 
33,34SetVehicleHealth(hitid40);
                case 
35..38SetVehicleHealth(hitid80);
                default: return 
1;
            }
        }
    }
    return 
1;




Re: Баг респавна транспорта - OmegaKiller72 - 18.02.2016

Quote:
Originally Posted by Diman777
View Post
PHP Code:
// Объявляем глобально
// Константы если необходимо заменяешь на свои
new player_shot_id[MAX_PLAYERS];
new 
vehicle_death_id[MAX_VEHICLES];
public 
OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
{
    if (
hittype == BULLET_HIT_TYPE_VEHICLE)
    {
        static 
Float:XFloat:YFloat:Z//Show in the petrol tank - It also works when the player is inside.
        
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAPXYZ);
        if (
VectorSize(fX-XfY-YfZ-Z) < 0.15)
        {
            
SetVehicleHealth(hitid0.0);
            
// Записываем полученные значения в нужную ячейку
            
player_shot_id[playerid] = playerid;
            
vehicle_death_id[hitid] = hitid;
            return 
1;
        }
        
//Shot in empty vehicle
        
for (new GetPlayerPoolSize(); > -1i--)
        {
            if (
GetPlayerVehicleID(i) == hitid && GetPlayerVehicleSeat(i) == 0)
            {
                return 
1;
            }
        }
        
GetVehicleHealth(hitidX);
        if (
0)
        {
            switch (
weaponid)
            {
                case 
0..15SetVehicleHealth(hitid10);
                case 
22..23SetVehicleHealth(hitid15);
                case 
24SetVehicleHealth(hitid50);
                case 
25..27SetVehicleHealth(hitid30);
                case 
28,29,32SetVehicleHealth(hitid5);
                case 
30,31SetVehicleHealth(hitid10);
                case 
33,34SetVehicleHealth(hitid40);
                case 
35..38SetVehicleHealth(hitid80);
                default: return 
1;
            }
        }
    }
    return 
1;

а как теперь мне их обозначить в public OnVehicleDeath(vehicleid, killerid) ?


Re: Баг респавна транспорта - Diman777 - 18.02.2016

Я предпалагаю, что вот так
PHP Code:
public OnVehicleDeath(vehicleidkillerid)
{
    if (
vehicleid == vehicle_death_id[vehicleid] && killerid == player_shot_id[killerid])
    {
        ...
    }

Но я не проверял, так что смотри сам.


Re: Баг респавна транспорта - OmegaKiller72 - 18.02.2016

Quote:
Originally Posted by Diman777
View Post
Я предпалагаю, что вот так
PHP Code:
public OnVehicleDeath(vehicleidkillerid)
{
    if (
vehicleid == vehicle_death_id[vehicleid] && killerid == player_shot_id[killerid])
    {
        ...
    }

Но я не проверял, так что смотри сам.
Сделал у себя во так
PHP Code:
public OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
{
    if(
hittype == BULLET_HIT_TYPE_VEHICLE)
    {
        static 
Float:XFloat:YFloat:Z//Show in the petrol tank - It also works when the player is inside.
        
GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAPXYZ);
        if(
VectorSize(fX-XfY-YfZ-Z) < 0.15)
        {
              
SetVehicleHealth(hitid0.0);
              
EmptyVeh[hitid] = hitid;
              
KillerVeh[playerid] = playerid;
            return 
1;
        }
         
//Shot in empty vehicle
        
for(new GetPlayerPoolSize(); > -1i--)
        {
            if(
GetPlayerVehicleID(i) == hitid && GetPlayerVehicleSeat(i) == 0)
            return 
1;
        }
        
GetVehicleHealth(hitidX);
        
EmptyVeh[hitid] = hitid;
        
KillerVeh[playerid] = playerid;
          if(
0)
        {
             switch(
weaponid)
               {
                 case 
.. 15SetVehicleHealth(hitid10);
                  case 
22 .. 23SetVehicleHealth(hitid15);
                 case 
24SetVehicleHealth(hitid50);
                   case 
25 .. 27SetVehicleHealth(hitid30);
                case 
282932SetVehicleHealth(hitid5);
                case 
3031SetVehicleHealth(hitid10);
                case 
3334SetVehicleHealth(hitid40);
                case 
35 .. 38SetVehicleHealth(hitid80);
                default: return 
1;
            }
        }
    }
    return 
1;
}
public 
OnVehicleDeath(vehicleidkillerid)
{
   if (
vehicleid == EmptyVeh[vehicleid])
    {
        if (
killerid == vehicleid)
        {
            
SetVehicleToRespawn(vehicleid);
         }
     }
     return 
1;

но всёравно не хочет машина респавниться


Re: Баг респавна транспорта - Diman777 - 18.02.2016

Код по идеи должен сработать правильно когда вот это сравнение
PHP Code:
if (VectorSize(fX-XfY-YfZ-Z) < 0.15
является истиной.

Попробуй провести проверку:
PHP Code:
if (VectorSize(fX-XfY-YfZ-Z) < 0.15)
{
    
SetVehicleHealth(hitid0.0);
    
EmptyVeh[hitid] = hitid;
    
KillerVeh[playerid] = playerid;
    print(
"DEBUG 1");
    return 
1;
}
public 
OnVehicleDeath(vehicleidkillerid)
{
    if (
vehicleid == EmptyVeh[vehicleid])
    {
        if (
killerid == vehicleid)
        {
            
SetVehicleToRespawn(vehicleid);
            print(
"DEBUG 2");
        }
    }
    return 
1;

Если всё прошло хорошо, то в консоли ты увидишь 2 сообщения этих.


Re: Баг респавна транспорта - OmegaKiller72 - 18.02.2016

неа Debug 2 не принтит


Re: Баг респавна транспорта - Diman777 - 19.02.2016

DEBUG 1 вызвался всё-таки да?)
Попробуй кинуть в OnVehicleDeath принтф (разумеется перед возможными условиями):
PHP Code:
printf("DEBUG OnVehicleDeath(vehicleid = %d, killerid = %d)"vehicleidkillerid); 
Что напишет кинь сюды. Хотя уже наверно ясно, что killerid = INVALID_PLAYER_ID


Re: Баг респавна транспорта - OmegaKiller72 - 19.02.2016

OnVehicleDeath не вызывается если до взрыва машины в ней никто не сидел, а это принтит только после того как я сел и вышел из машины, потом расстрелял её
[13:47:30] DEBUG 1
[13:47:30] DEBUG OnVehicleDeath(vehicleid = 505, killerid = 0)
[13:47:30] DEBUG OnVehicleDeath(vehicleid = 505, killerid = 0)
[13:48:15] DEBUG OnVehicleDeath(vehicleid = 507, killerid = 0)
[13:48:15] DEBUG OnVehicleDeath(vehicleid = 507, killerid = 0)

тоесть если машину вообще не трогать и расстрелять её то она не респавнится, а если выйти из зоны стриминга и войти обратно то машина появляется но уже с уроном 0,0 или сколько оставалось до взрыва, и снова взрывается и не респавнится


Re: Баг респавна транспорта - Diman777 - 22.02.2016

Проделай всё тоже самое, только замени DEBUG 1 на
PHP Code:
printf("DEBUG EmptyVeh[%d] = %d | KillerVeh[%d] = %d"hitidEmptyVeh[hitid], playeridKillerVeh[playerid]); 
По идеи должно быть всё в норме, killerid не INVALID_PLAYER_ID судя по твоему логу.
И почему по 2 раза вызывается колбек смерти для одного и того же авто не понятно)


Re: Баг респавна транспорта - OmegaKiller72 - 22.02.2016

Это я заходил в интерьер и выходил, машина появлялась с 0,0 хп. Вычитал что если до взрыва в машине никого небыло, то OnVehicleDeath не вызывается, значит надо подключать плагин https://sampforum.blast.hk/showthread.php?tid=513499 но пока я даже запустить плагин не могу) не понимаю в чем дело