ChatGPT выдал что-то совсем не то, даже приблизительно.
Старайтесь не писать вслепую с помощью него, а только получать определённую информацию по отдельности.
Во-первых:
Сервер RAGEMP разбит на 3 отдельные части:
- Серверная часть (BackEnd server) - логика, которая рассчитывается сервером, на нём хранятся все важные данные (данные игрока, систем домов, бизнесов и т.д). Файлы сервера находятся в server-files/packages/ (если это NodeJS) или в server-files/dotnet/resources/ (если это C#).
- Клиентская часть (BackEnd client) - логика, которая рассчитывается у игрока на компьютере, там вычисляется не очень важная логика и то, что у игрока отличается от других (например вывод данных на экране или кнопки биндера, которые у разных игроков могут быть разными и т.д). Файлы клиента находятся в server-files/client_packages/ всегда.
- CEF часть (FrontEnd) - визуальная часть, на которой отрисован дизайн и связанная с этим логика - кнопки, ползунки и т.д. Файлы CEF находятся в server-files/client-packages/ всегда.
Все они работают независимо друг от друга, но могут общаться друг с другом, однако только последовательно, то есть сервер не может напрямую общаться с браузером и наоборот, они должны идти по очереди. Если с сервера нужно вызвать что-то на CEF, то сервер вызывает клиент и уже с клиента ты делаешь вызов на CEF. Это в двух словах.
Ты с помощью клиентского файла coords_client/index.js пытаешься обратиться к getElementById, который существует только на CEF'е - этого у тебя не получится сделать по очевидным причинам, которые я объяснил выше.
Во-вторых:
Для отрисовки координат на экране тебе не нужен CEF, как уже выше сказал Харланд - тебе достаточно использовать ивент
render (этот ивент срабатывает на клиентской стороне каждый кадр, то есть если у игрока 60FPS, то 60 раз в секунду сработает этот ивент) и
drawText - метод для отображения текста на экране игрока (требуется использовать каждый кадр).
Пример такого кода, который будет работать всегда (то есть без команды и без любых условий, потому что их тут нет, как можно увидеть):
JavaScript:
const localplayer = mp.players.local;
// Инициализация ивента "render"
mp.events.add("render", () =>
{
const entity = (localplayer.isInAnyVehicle(false) && localplayer.vehicle) ? localplayer.vehicle : localplayer; // Получаем сущность, с которой будем брать позицию, если в машине - с машины, иначе с персонажа
const position = entity.position; // Для небольшой оптимизации, чтобы сократить цепочку вызовов - забьём позицию в отдельную ячейку памяти
mp.game.graphics.drawText(`X: ${position.x.toFixed(3)}, Y: ${position.y.toFixed(3)}, Z: ${position.z.toFixed(3)}, R: ${entity.getRotation(2).z.toFixed(3)}`, [0.5, 0.95], // Обозначаем текст, который хотим вывести и позицию вывода на экране - 0.5 (слева направо 50% по X) и 0.95 (сверху вниз 95% по Y)
{
font: 0, // Номер выводимого шрифта
color: [255, 255, 255, 185], // Цвет вывода: Красный, Зелёный, Синий, Прозрачность
scale: [0.4, 0.4], // Множитель текста по осям X Y
outline: true // Обводка текста чёрным
});
});
Тебе никто не мешает дальше пытаться модернизировать этот код под свои нужды: добавлять условия, менять позицию вывода (она обозначена как 0.5 по X и 0.95 Y в коде).
Чтобы понять что за что отвечает - открываешь ragemp wiki и ищешь клиентские функции JS, там находишь нужную и смотришь её аргументы, далее изучаешь и пробуешь.
В-третьих, у RAGEMP нет ни ивента "playerMove" ни "resources" в conf.json.
Всё, что есть в conf.json описано
здесь.
Все ивенты, которые есть на серверном JS описаны
здесь.