Каким образом происходит отображение 3D текста конкретно для одного игрока? Над всеми игроками отображает имя и ID. А как сделать еще отображение здоровья для администраторов? Использую streamer.
Вид для печати
Каким образом происходит отображение 3D текста конкретно для одного игрока? Над всеми игроками отображает имя и ID. А как сделать еще отображение здоровья для администраторов? Использую streamer.
Добавил .playerid = playerid, пока тестирую на playerid, и текст вообще перестал отображаться. Или в этом и ошибка?
Код покажи: как создаёшь, как применяешь..
Параметр playerid в функции CreateDynamic3DTextLabel обозначает для какого игрока этот 3D текст будет создан. То есть для кого он будет виден. Параметр attachedplayer обозначает к какому игроку этот 3D текст будет прикреплён.
Использовать одинаковые имена для названия параметра и переменной можно, главное проследить чтобы значение переменной было нужным.
PHP код:
public OnPlayerSpawn(playerid)
{
/*Есть проверка на одно выполнение*/
HUD3D[playerid] = CreateDynamic3DTextLabel("•", -1, 0.0, 0.0, 0.05, 25, .playerid = playerid, .attachedplayer = playerid);
return 1;
}
public OnPlayerUpdate(playerid)
{
if(hud_watch{playerid} == 0)
format(string, sizeof string, str, name, playerid);
else
format(string_hud, sizeof string_hud, str_hud, name, playerid, health);
UpdateDynamic3DTextLabelText(HUD3D[playerid], 0xFFFFFF00, string_hud);
return 1;
}
А если переделать код без этих выкрутасов он так же не будет работать?)Код:HUD3D[playerid] = CreateDynamic3DTextLabel("•", -1, 0.0, 0.0, 0.05, 25, .playerid = playerid, .attachedplayer = playerid);
Возможные причины:
1. hud_watch{playerid} всегда равно 0
2. Содержимое str_hud пустое.
Просто проверь строку, которую ты передаёшь в UpdateDynamic3DTextLabelText.
- Есть команда по изменению значения hud_watch{playerid}. Я использую один массив. Это в примере накасячил );
PHP код:
public OnPlayerUpdate(playerid)
{
if(hud_watch{playerid} == 0)
format(string_hud, sizeof string_hud, str, name, playerid);
else
format(string_hud, sizeof string_hud, str_hud, name, playerid, health);
UpdateDynamic3DTextLabelText(HUD3D[playerid], 0xFFFFFF00, string_hud);
return 1;
}
- Строки st и str_hud есть
Вот полный код:
- - - Добавлено - - -PHP код:
public OnPlayerUpdate(playerid)
{
static const
str[] = "%s (%i)",
str_hud[] = "%s (%i) | %.0fHP";
new
Float:health,
string_hud[sizeof str_hud+MAX_PLAYER_NAME+4+3-2*3];
if(hud_watch{playerid} == 0)
format(string_hud, sizeof string_hud, str, pInfo[playerid][pName], playerid);
else
{
GetPlayerHealth(playerid, health);
format(string_hud, sizeof string_hud, str_hud, pInfo[playerid][pName], playerid, health);
}
UpdateDynamic3DTextLabelText(HUD3D[playerid], 0xFFFFFF00, string_hud);
return 1;
}
Компилятор начнет ругаться на неизвестные переменные.
Если создать 3d текст для игрока, то только ему он и будет виден. Это не учел.
Если только так
Но текст не обновляетсяPHP код:
for(new i = 0; i < MAX_PLAYERS; i++)
HUD3D[playerid] = CreateDynamic3DTextLabel("•", -1, 0.0, 0.0, 0.05, 25, .attachedplayer = playerid, .playerid = i);
Предлагаю использовать OnPlayerStreamIn/OnPlayerStreamOut, а не OnPlayerSpawn. Тогда и циклы никакие использовать не нужно будет, и будут известны нужные ID
А создавать нужно двумерный массив, ибо для одного админа потребуется создать большое число 3d текстов для каждого игрока. То бишь, запись должна выглядеть так:
PHP код:
HUD3D[id_админа][id_игрока] = CreateDynamic3DTextLabel(...);
Я об этом явно написал в этом посте: "Параметр playerid в функции CreateDynamic3DTextLabel обозначает для какого игрока этот 3D текст будет создан. То есть для кого он будет виден. ". Не знаю как это можно было не учесть...
Ты сам себе придумал проблему и пытаешься её решить, твой код записывается так:
Было бы проще, если бы ты сразу написал то, чего ты хочешь добиться.PHP код:
HUD3D[playerid] = CreateDynamic3DTextLabel("•", -1, 0.0, 0.0, 0.05, 25, .attachedplayer = playerid);
Обновление будет?
- - - Добавлено - - -PHP код:
foreach(Player, i)
UpdateDynamic3DTextLabelText(HUD3D[playerid][i], 0xFFFFFFAA, string_hud);
И показал сам код. Прикреплять текст к игроку и так мог, а вот разное отображения для разных игроков нет.
Благодаря вам в мире сейчас грустит один маленький Дэймос. Надеюсь вы довольны :'(
Повторяю ещё раз, проще всё сделать через OnPlayerStreamIn/OnPlayerStreamOut. Вот как всё будет выглядеть:
Обновление делаешь через секундный таймер (можно для пущего эффекта создать итератор, в котором будут хранится ID всех админов + итератор, в котором будет хранится инфа о том, для кого был создан 3d текст. И уже этими итераторами будешь обновлять. Сам над оптимизацией подумай, крч) и через какой-нибудь OnPlayerWeaponShot.PHP код:
new Text3D:HUD_3D[MAX_PLAYERS][MAX_PLAYERS] =
{
{Text3D:-1, Text3D:-1, ...},
{Text3D:-1, Text3D:-1, ...},
...
};
public OnPlayerStreamIn(playerid, forplayerid)
{
if(pInfo[forplayerid][pAdmin])
{
HUD_3D[forplayerid][playerid] = CreateDynamic3DTextLabel("•", -1, 0.0, 0.0, 0.05, 25, playerid, forplayerid);
}
return 1;
}
public OnPlayerStreamOut(playerid, forplayerid)
{
if(pInfo[forplayerid][pAdmin])
{
DestroyDynamic3DTextLabel(HUD_3D[forplayerid][playerid]);
HUD_3D[forplayerid][playerid] = Text3D:-1;
}
return 1;
}
Поясняю зачем: урон, который игрок получил не от другого игрока, не особо важен для админов, нежели урон, который игрок получил от игроков. Если обновлять в секундном таймере весь урон - урон от попаданий будет отображаться с запозданием.
Спасибо