This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Вопрос setHealth, setArmour

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
Всем привет, подскажите пожалуйста, в чем разница, где я буду менять ХП и броню игроку ? Если я это буду делать на сервере или на клиент ?

server:
player.health = 200;
player.armour = 100;

client:
mp.players.local.setHealth(200);
mp.players.local.setArmour(100);

Смотрю разные сборки, везде по разному, кто то на клиенте делает, кто то на сервере...

Суть задачи: ну простенькая админ команда, которая будет менять ХП и броню игроку по id...

вопрос 1: есть ли разница на какой стороне менять хп броню
вопрос 2: я могу менять макс уровень хп и брони ? тот же маджестик, там есть броня 50, 100 и еще 150... (то есть они как то 150 сделали)
знаю про команду maxSetHealth, но она вроде как для клиенте и вроде как не особо синхронизирована ? хз...
 

nafanych!

naffanch
BackEnd developer
FrontEnd developer
25 Ноя 2023
280
54
65
делать броник больше 100% можно только на клиенте (сервер просто не даст поставить больше)
хотя можно лепить костыль на set/get Variable, и там хранить текущий % бронежилета, но все же на клиенте проще)
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
На клиенте ты можешь изменить HP только у конкретного игрока.
То есть если рассматриваем 2 игрока: Вася и Петя, то клиент Васи может изменить хп только у самого Васи. С сервера же ты можешь поменять хп и Васе, и Пете. Либо отправить 2 запроса обоим на клиенты и поменять их там. Где менять - в данном конкретном случае без разницы, т.к. рейдж обновит кол-во хп по серверу потом сам.
НО на рейдже есть некоторая проблема при обновлении хп - он их синхронизирует не постоянно, то есть можно словить тайминги, в которых ХП игрока по серверу будет отличаться от его реального ХП у него на клиенте. С этим ничего не сделать, так устроен рейдж.

По поводу брони - всё то же самое, но кол-во максимальной брони можно изменить только на клиенте, используя setMaxArmour с нужным количеством.
 

PercyBerkeley

Участник портала
16 Ноя 2024
94
19
25
player.health = 200; player.armour = 100;
Authority:
Maximum authority. This is the player's "real" and trusted value.
Effect: Changes values on the server. The server automatically syncs this new value to all clients (including the affected player).
Purpose: You should always use the server to set permanent health and armor, calculate damage, prevent cheating, and handle all critical game logic.



mp.players.local.setHealth(200); mp.players.local.setArmour(100);
Authority:
Minimum authority. Changes only the appearance or visual state of the game on that local machine.
Effect: Changes the value only for the player executing that code. Other players and the server are unaware of the change.
Purpose: Generally used for visual effects, user interfaces (HUDs), or actions that do not affect the core game logic.
Synchronization: Does not automatically synchronize with the server. The server can overwrite this value at any time with its "real" value.
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
mp.players.local.setHealth(200); mp.players.local.setArmour(100);
Synchronization: Does not automatically synchronize with the server. The server can overwrite this value at any time with its "real" value.
Это не правда.
Установив HP/Armour на клиенте - она автоматически обновится и на сервере.
 

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
когда на сервере пишу player.armour = 100, то шкала в игре (ну где мини карта - полностью заполняется). Это ведь означает, что максимальный уровень брони установлен ? Если да, то на сервере можно 100% сделать
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
Устанавливая armour на 100 ты устанавливаешь его на 100, а не на 100%.
Ты можешь сделать setMaxArmour на клиенте на 200, тогда установив armour на сервере на 100 - на клиенте у игрока будет отрисовано 50% брони, потому что в реальности его у неё 200.
Ты устанавливаешь значение, а не %.
 

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
Ты имеешь ввиду про количество ивентов ?
например, админ по id игрока хочет изменить ему ХП
и есть 2 варианта
Либо мы меняет на сервере ХП
Либо на клиенте ХП

вариант 1 (сервер):
CEF (id игрока которому меняем хп) -> отправляем запрос на CLIENT -> SERVER - и уже тут (на сервере) меняем ХП игроку
вариант 2(клиент)
CEF (id игрока которому меняем хп) -> отправляем запрос на CLIENT -> SERVER (вызываем клиент игрока, которому надо менять хп) -> CLIENT - и уже тут (на клиенте) меняем ХП игроку

то есть типа лучше использовать сервер, потому что действий меньше надо будет делать ? (меньше event)
 

PercyBerkeley

Участник портала
16 Ноя 2024
94
19
25
igual los valores de da{p
But it's not safe. RAGE's default damage is usually very high. Also, when you do it this way, there are sometimes accidents (falls, crashes, etc.) where you sometimes take very little damage, or sometimes a lot.

If you want something solid, you should use https://wiki.rage.mp/wiki/PlayerDamage, and you can use this repository as an example: https://github.com/JJiGolem/rage-custom-weapon-damage
 

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
а, вот как... интересно, по дефолту, какое ЗНАЧЕНИЕ (не проценты, а значение) равно максимальному уровню брони ?
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
Стандартные значения и для HP, и для брони - 100. Таким образом 1 = 1%.
Если ты изменишь максимальное кол-во брони, например, на 200, то очевидно, что значение 100 окажется лишь 50%.
Как будто тебе не особо нужно знать % вообще где-либо?
Изменять HP можно как на сервере, так и на клиенте, вопрос конкретной нужды. Если нет нужды менять на клиенте и ты можешь поменять на сервере, то так и делай.
Перевожу ещё раз: в твоём случае - да, на сервере обновить HP будет более выгодно, т.к. не нужно отправлять ещё один ивент на клиент.
 

PercyBerkeley

Участник портала
16 Ноя 2024
94
19
25
If a player uses mp.players.local.setHealth(200) on the client, the server does NOT automatically update their player.health property to that value, because the client does not have the authority to tell the server what their "real" health should be. The server does. If the server has 100 health, and the client sets it to 200, on the next sync cycle (or upon taking damage), the server will very likely tell the client "Your health is 100," and the value will resync. If you let the client manage your health and armor, then cheaters will have a field day.
 

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
Thanks, I'll test this and get back to you here
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
Откуда ты это взял или ты это сам придумал, что оно вот так? Оно так должно быть, но оно работает не так в случае с HP.
На клиенте у игрока вообще считается HP иначе, там чтобы установить значение HP нужно взять это самое значение (например 50) и прибавить к нему 100 (в сумме получится 150), тогда установится нужное HP (например 50).
После установки на клиенте у игрока HP на 50 (то есть 150, т.к. клиентское исчисление HP другое), сервер обновит эту информацию и тоже станет показывать 50 HP.
Так происходит потому, что клиент является сам контроллером своего персонажа и всё, что происходит с персонажем - сервер синхронизирует с этого контроллера.
То есть игрок А не сможет установить HP игроку B - это правда, тогда HP будет автоматически обновлено, но игрок может изменить HP у самого себя (mp.players.local).
 

PercyBerkeley

Участник портала
16 Ноя 2024
94
19
25
Yes, the client can 'sync' local health with itself. But this is how a cheater makes their server vulnerable. The professional developer overrides this automatic synchronization and delegates authority over health and damage exclusively to the server, using events like PlayerDamage or IncomingDamage.
 

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
кстати да, в сборках, где ХП ставилось на клиенте, везде было +100 значение... не понимал зачем... теперь ясно
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
Тебя спрашивают МОЖНО ЛИ.
Ответ должен быть единственный: да, можно.
Вопрос защиты здесь не стоит, это для отдельного топика размышление.
Естественно, что если у тебя просто будет клиентский ивент, в котором аргумент - кол-во хп и сразу его установка, то это плохое решение, но тут вопрос не об этом был совершенно.
 

PercyBerkeley

Участник портала
16 Ноя 2024
94
19
25
That's fine. If your only question is whether the client can use mp.players.local.setHealth(value) to force the player.health property to update on the server, the answer is yes. But no serious gamemode developer would maintain that default behavior, as it makes cheating easier.

bye
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
3,094
1,806
211
28
В том, чтобы обновить HP на клиенте - нет ничего плохого, если это делать корректно.

Вот так делать НЕ НУЖНО, но можно:
JavaScript:
mp.events.add("sethp", (hp) =>
{
    mp.players.local.setHealth(100 + parseInt(hp));
});

mp.events.call("sethp", 50);

Если система сделана корректно и везде всё правильно отслеживается, но заканчивается на клиенте - можно изменить HP и на нём, ничего страшного в этом нет.
Ключевое условие: валидация, но это, повторюсь, совершенно иная тема.
 
Реакции: PercyBerkeley

qweqweqwe123123123

Новый участник
24 Июн 2025
23
2
13
100500 варинатов прогуглил, когда вызываю на клиенте setMaxArmour или setMaxHealth - пишет, что такой функции нету... хотя в доке и в ts.d есть... что не так делаю ?) я в playerJoin , playerReady, просто где то по кнопке вызываю событие - всегда setMaxArmour или setMaxHealth - undefined
 

Similar threads