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=518186)



Бензин - Aizov - 08.06.2014

PHP код:
public FuelTimer()
{
    for(new 
0;iMAX_VEHICLES;i++)
    {
        if(
tick[i] < 10)return tick[i]+=1;
        if(
tick[i] >= 10 && cInfo[i][Engine] == 1)cInfo[i][Fuel] -= GetFuelCost(cInfo[i][Model]);
        
tick[i] = 0;
    }
    return 
true;
}
forward Float:GetFuelCost(vehicleid);
Float:GetFuelCost(vehicleid)  
{  
    new 
Float:FuelC;  
    switch(
vehicleid)  
    {  
        case 
400FuelC 0.66,printf("%f",FuelC);//40 Литров  
        
case 522FuelC 1.2,printf("%f",FuelC);  
    }  
    return 
FuelC;  

По сути не работает. Не знаю почему. Не вызывается даже Float:GetFuelCost.


Re: Бензин - Aizov - 08.06.2014

Не работает даже без функции (Заменял на -1)


Re: Бензин - Stepashka - 08.06.2014

Для начала функциям не нужен forward, но функция должна быть объявлена до момента первого вызова.
Во-вторых, жить надо проще:
pawn Код:
Float:GetFuelCost(vehicleModel) {
    if (vehicleModel== 400) return 0.66;
    else if (vehicleModel== 522) return 1.2;
    else return 0.0;
}
public FuelTimer() {
    for (new i = 0; i< MAX_VEHICLES; i++) {
        if (tick[i] < 10) return tick[i]+=1;
        else if (cInfo[i][Engine] == 1) cInfo[i][Fuel] -= GetFuelCost(cInfo[i][Model]);
        tick[i] = 0;
    }
    return 1;
}
Начнем с простого, дебаг:
  1. определяем вызывается ли FuelTimer
  2. если да, определяем выполняются ли условия
Я вижу одну грубую ошибку, твой цикл обрывается на первой же машине у которой выполняется условие tick[i] < 10, и остальные машины просто не проверяются.


Re: Бензин - DartfoL - 08.06.2014

Quote:

Для начала функциям не нужен forward, но функция должна быть объявлена до момента первого вызова.

чтобы она не была должна объявлена до первого вызова юзается forward
я не люблю, когда у меня где-то в начале или в середине мода торчит какая-то функция лишь потому, что её нужно объявить выше вызова. У меня сначала все глобальные переменные, потом колбеки, потом всё остальное


Re: Бензин - Aizov - 08.06.2014

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Для начала функциям не нужен forward, но функция должна быть объявлена до момента первого вызова.
Во-вторых, жить надо проще:
pawn Код:
Float:GetFuelCost(vehicleModel) {
    if (vehicleModel== 400) return 0.66;
    else if (vehicleModel== 522) return 1.2;
    else return 0.0;
}
public FuelTimer() {
    for (new i = 0; i< MAX_VEHICLES; i++) {
        if (tick[i] < 10) return tick[i]+=1;
        else if (cInfo[i][Engine] == 1) cInfo[i][Fuel] -= GetFuelCost(cInfo[i][Model]);
        tick[i] = 0;
    }
    return 1;
}
Начнем с простого, дебаг:
  1. определяем вызывается ли FuelTimer
  2. если да, определяем выполняются ли условия
Я вижу одну грубую ошибку, твой цикл обрывается на первой же машине у которой выполняется условие tick[i] < 10, и остальные машины просто не проверяются.
Как лучше сделать это?


Re: Бензин - Stepashka - 08.06.2014

Quote:
Originally Posted by DartfoL
Посмотреть сообщение
чтобы она не была должна объявлена до первого вызова юзается forward
я не люблю, когда у меня где-то в начале или в середине мода торчит какая-то функция лишь потому, что её нужно объявить выше вызова. У меня сначала все глобальные переменные, потом колбеки, потом всё остальное
Инклуды тебе в помощь.
Quote:
Originally Posted by Aizov
Посмотреть сообщение
Как лучше сделать это?
pawn Код:
public FuelTimer() {
    for (new i = 0; i< MAX_VEHICLES; i++) {
        if (tick[i] < 10) tick[i]+=1;
        else if (cInfo[i][Engine] == 1) {
            cInfo[i][Fuel] -= GetFuelCost(cInfo[i][Model]);
            tick[i] = 0;//вот тут не уверен, логики вашей не знаю, если сбрасывается только когда движок заведен то верно, если в любом случае то нужно продублировать ещё и для отключенного двигателя
        }
    }
}



Re: Бензин - White_116 - 08.06.2014

Логика вообще не ясна, зачем тики считать?
PHP код:
new Float:FuelCost[212]={1.0, ...};//массив с ценами для транспорта.
public FuelTimer()
{
    for(new 
0iMAX_VEHICLESi++)
    {
        if(
tick[i] < 10)
        {
            ++
tick[i];
        }
        else if(
cInfo[i][Engine])
        {
            
cInfo[i][Fuel] -= FuelCost[cInfo[i][Model]];//FuelCost[cInfo[i][Model]-400] если не используется смещение моделей
            
tick[i] = 0;
        }
    }
    return 
true;




Re: Бензин - Aizov - 08.06.2014

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Инклуды тебе в помощь.

pawn Код:
public FuelTimer() {
    for (new i = 0; i< MAX_VEHICLES; i++) {
        if (tick[i] < 10) tick[i]+=1;
        else if (cInfo[i][Engine] == 1) {
            cInfo[i][Fuel] -= GetFuelCost(cInfo[i][Model]);
            tick[i] = 0;//вот тут не уверен, логики вашей не знаю, если сбрасывается только когда движок заведен то верно, если в любом случае то нужно продублировать ещё и для отключенного двигателя
        }
    }
}
Это как часики тикают. Его не нужно трогать)


Re: Бензин - Aizov - 08.06.2014

Quote:
Originally Posted by White_116
Посмотреть сообщение
Логика вообще не ясна, зачем тики считать?
PHP код:
new Float:FuelCost[212]={1.0, ...};//массив с ценами для транспорта.
public FuelTimer()
{
    for(new 
0iMAX_VEHICLESi++)
    {
        if(
tick[i] < 10)
        {
            ++
tick[i];
        }
        else if(
cInfo[i][Engine])
        {
            
cInfo[i][Fuel] -= FuelCost[cInfo[i][Model]];//FuelCost[cInfo[i][Model]-400] если не используется смещение моделей
            
tick[i] = 0;
        }
    }
    return 
true;

Мне так проще. Заодно учусь функции писать