Как наложить свечение на игрока так чтобы на сервере где не установлен мод для этого игрока и для тех у кого есть мод отображалось свечение

Версия Minecraft
1.19.4
API
Forge
67
1
0
Нужно наложить эффект свечения на игрока которое будет накладываться при заходе в мир, при этом свечение должно быть видно самому светящемуся игроку, и тем игрокам у которых есть мод.
При этом на сервере не будет установлен мод.

Я знаю как наложить эффект, как сделать так чтобы он накладывался при заходе в мир, но как сделать так чтобы эффект свечения (GLOWING) при заходе на сервер был виден игрокам с таким-же модом.

Java:
@SubscribeEvent
        public static void onJoinOnLevel(EntityJoinLevelEvent e) { //При заходе в мир
                if(e.getEntity() instanceof Player) {
                    Player p = (Player) e.getEntity(); 
                    p.addEffect(new MobEffectInstance(new MobEffects().GLOWING, -1, 1));
                }
                
                if(e.getEntity() instanceof Player && e.getLevel().isClientSide) {
                    Player p = (Player) e.getEntity();
                    p.displayClientMessage(Component.literal("Приветствую тебя!"),  false);
                }
        }

При таком коде при заходе в одиночный мир, всё окей - ты светишься, кайф. Но когда заходишь на сервер ты не светишься, но эффект есть.
 
67
1
0
Java:
level.isClientside()
Java:
       @SubscribeEvent
        public static void onJoinOnLevel(EntityJoinLevelEvent e) { //При заходе в мир
                if(e.getEntity() instanceof Player && e.getLevel().isClientSide) {
                    Player p = (Player) e.getEntity();
                    p.displayClientMessage(Component.literal("Приветствую тебя!"),  false);
                    p.addEffect(new MobEffectInstance(new MobEffects().GLOWING, -1, 1));
                }
        }

На сервере всё равно не светится
 
1,382
114
244
Потому что эффекты находятся на стороне сервера, а код ты хочешь вызвать из клиента.
На сервере лог. клиент и лог. сервер разделены. У тебя в одиночке - это одно и то же.
Тебе нужен другой эвент, который будет рисовать эту рамку, а не выдавать эффект свечения.
 
1,382
114
244
Подменить RenderType в LivingEntityRenderer#render
Очень нехорошо. Может сломаться совместимость с другими модами, да и рендер переписывать... Ну явно перебор.
Можно модифицировать public boolean isCurrentlyGlowing() в Entity или LivingEntity
А вот это уже ближе к правде. Но я не уверен, что метод ClientOnly. Потому что если нет - прощай совместимость с серверами без мода, т.к. мод перестанет быть ClientOnly.

Как я и сказал ранее, всё что касается клиента - пусть будет на клиенте.
Используем рендер мира (для этого, к слову, есть отдельный эвент) для ренедера рамки, но не выдачи эффекта свечения.
 
63
4
31
Рендер переписывать не надо. Обычный редирект все сделает без особых проблем с совместимостью

public boolean isCurrentlyGlowing() в Entity клиент онли и он вызывается из LivingEntity если остальные проверки не проходят. Это конечно самый безопасный вариант
 
1,382
114
244
Обычный редирект все сделает без особых проблем с совместимостью
А вот тут не соглашусь. При попытке изменить миксином тот же метод, майн успешно крашнет. Проверено на Sodium с его облаками.
По крайней мере, так обстоит дело именно с редиректом. Если говорим об инжект - всё ок, но только до тех пор, пока какой-то другой мод не сделает редирект/оверайт метода.
Поэтому наиболее безопасный вариант - эвент рендера мира.
public boolean isCurrentlyGlowing() в Entity клиент онли и он вызывается из LivingEntity если остальные проверки не проходят. Это конечно самый безопасный вариант
В таком случае, скорее всего, он будет наиболее приемлемым. Пусть автор темы попробует инжектнуться туда..
 
1,038
57
229
Даже в чём-то интересная идея
придумал круче. По сути можно к нику добавлять невидимые для текста цвета, тем самым передавая эффекты, вообще любые эффекты можно спрятать в нике. Это ты мне подал такую идею..
 
Сверху