shape1
shape2
shape3
shape4
shape7
shape8

Проблемы с одометром (счетчик километража)


Статус
Закрыто для дальнейших ответов.

serij68tmb

Новичок
Пользователь
28.01.2015
11
0
0
Всем доброго времени суток!

Понадобился на сервер одометр на TextDraw. Что-то взял из Сети, что-то сам приписал. Вроде всё правильно, но он отображается только у игрока [ ID:1 ], причем выглядит это как несколько TextDraw'ов, наложенных один на другой. И при смене машины не изменяется значение пройденного пути! Т.е. на одной машине проехал 10 км, сел в другую - там отсчет тоже с 10 км пошел.

Помогите, пожалуйста, найти ошибку.

Ко всем new:

new Text:Odometr[MAX_PLAYERS];
new Float:speed[MAX_VEHICLES];
new Float:speed_x[MAX_VEHICLES];
new Float:speed_y[MAX_VEHICLES];
new Float:speed_z[MAX_VEHICLES];
new Float:probeg[MAX_VEHICLES];

В OnPlayerConnect:

Odometr[playerid] = TextDrawCreate(48,425,"----------");//////////////////////////
TextDrawAlignment(Odometr[playerid],0);
TextDrawBackgroundColor(Odometr[playerid],0x000000ff);
TextDrawFont(Odometr[playerid],3);
TextDrawLetterSize(Odometr[playerid],0.4,1.5);
TextDrawColor(Odometr[playerid], 0xDDDDDDFF);
TextDrawSetOutline(Odometr[playerid],1);
TextDrawSetProportional(Odometr[playerid],1);
TextDrawSetShadow(Odometr[playerid],1);
В OnPlayerDisconnect:

TextDrawDestroy(Odometr[playerid]); 
В OnPlayerUpdate:

if (GetPlayerState(playerid) == 2 || GetPlayerState(playerid) == 3)
{
new vehicleid = GetPlayerVehicleID(playerid);
GetVehicleVelocity(vehicleid, speed_x[vehicleid], speed_y[vehicleid], speed_z[vehicleid]);
speed[vehicleid] = 10 * floatsqroot( (floatpower ( floatabs(speed_x[vehicleid]), 2.0)) + (floatpower ( floatabs (speed_y[vehicleid]), 2.0)) + (floatpower ( floatabs (speed_z[vehicleid]), 2.0))); //множитель 10 выбран опытным путем.
speed[vehicleid] = floatround(speed[vehicleid]); //округленная скорость движения
}

Код:
public Odometer(playerid)
{
    for(new g = 0; g < MAX_PLAYERS; g++)
    {
        if(IsPlayerConnected(g))
	{
	        new string[16];
	        new vehicleid = GetPlayerVehicleID(g);
		if(!IsPlayerInAnyVehicle(g)) return 1;
		new Float:l = (25.33*speed[vehicleid])/10000;
		Probeg[vehicleid] += l;
		format(string,sizeof(string),"%05.1f km", Probeg[vehicleid]);
		TextDrawSetString(Odometr[g], string);
		TextDrawShowForPlayer(playerid, Odometr[g]);
	}
    }
    return 1;
}
Ну и Таймер:

Код:
SetTimer ("Odometer", 200, true);
 
Последнее редактирование модератором:

MarkVatson

Новичок
Пользователь
15.04.2014
11
0
0
Код:
public Odometer(playerid)
{
for(new g = 0; g < MAX_PLAYERS; g++)
{
if(IsPlayerConnected(g))
    {
if(IsPlayerInAnyVehicle(i))
{
     new string[16];
     new vehicleid = GetPlayerVehicleID(g);
        if(!IsPlayerInAnyVehicle(g)) return 1;
        new Float:l = (25.33*speed[vehicleid])/10000;
        Probeg[vehicleid] += l;
        format(string,sizeof(string),"%05.1f km", Probeg[vehicleid]);
        TextDrawSetString(Odometr[g], string);
        TextDrawShowForPlayer(playerid, Odometr[g]);
    }
}
}
return 1;
}
 

Mirex

Руководитель проекта
Команда портала
Гл.Администратор
Золотой
21.12.2013
2 513
550
0
26
definehost.ru
Скриптер
Странный какой-то у вас код.

Вы запускаете глобальный таймер на 200 мс, а колбэк объявлен как Odometer(playerid). Лучше переведите TD на CreatePlayerTextDraw и делайте тогда уже таймер для каждого игрока (SetTimerEx) и не используйте цикл всех игроков.

 

serij68tmb

Новичок
Пользователь
28.01.2015
11
0
0
Странный какой-то у вас код.

Вы запускаете глобальный таймер на 200 мс, а колбэк объявлен как Odometer(playerid). Лучше переведите TD на CreatePlayerTextDraw и делайте тогда уже таймер для каждого игрока (SetTimerEx) и не используйте цикл всех игроков.
Блин, точняк, это я когда цикл перебора всех игроков сделал, забыл убрать параметр функции... Понял, там вместо playerid внутри паблика надо g поставить, как я так пропустил  :sad:

То есть, при каждом обновлении не редактировать существующий TD, а удалять старый и создавать новый, с новым значением?

Спасибо Огромное!

 
Последнее редактирование модератором:

Mirex

Руководитель проекта
Команда портала
Гл.Администратор
Золотой
21.12.2013
2 513
550
0
26
definehost.ru
Скриптер
То есть, при каждом обновлении не редактировать существующий TD, а удалять старый и создавать новый, с новым значением?
Этого я не говорил. Я лишь посоветовал перевести TD на CreatePlayerTextDraw, так как он у вас всё равно локальный (для каждого игрока), меньше проблем будет + не нужно удалять при выходе, он сам отчищается.

 
Последнее редактирование модератором:

serij68tmb

Новичок
Пользователь
28.01.2015
11
0
0
Этого я не говорил. Я лишь посоветовал перевести TD на CreatePlayerTextDraw, так как он у вас всё равно локальный (для каждого игрока), меньше проблем будет + не нужно удалять при выходе, он сам отчищается.
Понял! Еще раз благодарю)

 
Статус
Закрыто для дальнейших ответов.