Клиент сервер

Версия Minecraft
1.7.10
1,201
31
185
Здравствуйте форумчане
Не совсем понимаю разницу между @SideOnly(Side.SERVER) и !world.isRemote() и getSide()
Да, я прочитал все темы про разделение сервер/клиент, но из всех тем понял только тему фолкена, и то не полностью :(
Какой код именно можно убрать с клиента?
Как спавнить сущности только на сервере? Проверкой world.isRemote? Но ведь оно спавнит в одиночке тоже, я понимаю, ибо там сразу и сервер и клиент.
Спавнить сущность на сервере можно с помощью пакета, это я вроде знаю. Но как это все блин происходит, в голове не укладывается(
Помогити
 

timaxa007

Модератор
5,831
409
672
Будет работать, если запущен на сервере.
Серверная сторона. На клиенте запускается имитация сервера - но это не сервер.
В разных случаях это разные условия.
Какой код именно можно убрать с клиента?
Тот что связан только с клиентом, к примеру: текстуры, геометрия, звук, "клавиатура и мышь" (т.е. что используется от LWJGL).
Как спавнить сущности только на сервере?
"Сервер" и "серверная сторона" - это разные вещи. Хотя иногда для сокращения "сервером" иметься виду "серверную сторону", это просто надо понимать.
Если как надо, то под условием "!world.isRemote".
 
1,201
31
185
запущен на сервере.
Выделенный сервер? Если запускать игру в одиночке, то код под этим условием будет работать?
У меня недопонимание насчет разделения мода на 2 части
Имею лишь такое предположение насчет спавна энтити.
В классе который мы зарегали как ловца событий фмл шины (нажатие кнопок и т.п) (надеюсь я правильно сказал :D) регаем кнопку, в эвенте KeyInputEvent проверяем если кнопка нажата, то посылать пакет на сервер. Но так как на клиенте серверного кода нет, что сувать в пакет?
world.spawnEntityInWorld(entity);? Или вызывать серверный метод, но как? Я глупый еще в этом, простите
 
929
30
66
Если запускать игру в одиночке, то код под этим условием будет работать?
да,будет.
в эвенте KeyInputEvent проверяем если кнопка нажата, то посылать пакет на сервер
Да , можно на клиенте из пакета код вырезать, т.е Measage пустой оставить , а на серверном моде там код будет присутствовать.
 
1,201
31
185
клиенте из пакета код вырезать
Разве тогда не будет посылать пустой мессейдж?
сервера ивент сделать , типа проверять , что игрок пкм нажал
вообще же глупость, оно не будет работать. Игрок сам должен посылать пакет через фмл эвент
 
929
30
66
вообще же глупость, оно не будет работать. Игрок сам должен посылать пакет через фмл эвент
В чем глупость ? Тики юзай и там проверяй нажал ли он.
Разве тогда не будет посылать пустой мессейдж?
А ничего , что сама механика это сервер , думаешь ему твой клиентский пакет нужен? Нет , он сервера будет брать пакет.
 
Последнее редактирование:
1,201
31
185
Нет , он сервера будет брать пакет.
Ой великий, спасибо, это я и хотел узнать, это разом ответило на большинство моих вопросов
Если кто то хочет внести свою лепту в мой, пока что скудный на знания мозг, то пожалуйста :)
 
2,505
81
397
Выделенный сервер? Если запускать игру в одиночке, то код под этим условием будет работать?
Нет, не будет. Код, помеченный аннотацией @SideOnly(Side.SERVER) удаляется с клиента во время загрузки класса.

Я не понял, что ты хочешь. Защитить свой код или понять какой код выполняется только на клиенте, какой на сервере, а какой двусторонний.

В классе который мы зарегали как ловца событий фмл шины (нажатие кнопок и т.п) (надеюсь я правильно сказал :D) регаем кнопку, в эвенте KeyInputEvent проверяем если кнопка нажата, то посылать пакет на сервер. Но так как на клиенте серверного кода нет, что сувать в пакет?
world.spawnEntityInWorld(entity);?
Тут все верно.

Нажатие кнопки происходит на клиенте. Поэтому если нужно обработать на сервере, то очевидно нужно отправлять пакет.
 
1,201
31
185
Защитить свой код
Хочется защитить свой код, но я просто не понимаю какой код вырезать константой, фолкен обьяснил что !world.isRemote(), но я чот все равно не допер немного, когда читал его тутор
Сейчас вроде более менее имею представление, если оно, конечно, правильное
 
929
30
66
Какой код именно можно убрать с клиента?
Тот что связан только с клиентом, к примеру: текстуры, геометрия, звук, "клавиатура и мышь" (т.е. что используется от LWJGL).
Вот, Серега назвал , что оставлять в клиенте другое смело вырезай и оставляй ток на сервере , а если на сервере где-то делаешь что-то клиентское , то ставь на тот метод SideOnly(Side.Client) , а то будет краш майна по причине не найден класс , а так будет знать , что это делать нужно на клиенте.
 
2,505
81
397
Допустим ты знаешь, что код выполняется только на серверной стороне. Что будет, если ты обернешь его в if (false) { /* code */ }? Он просто удалится на этапе компиляции.
Теперь создай где-нибудь public static final FLAG = true. И оберни свой код в if (FLAG) { /* code */ }. Никаких изменений естественно не будет. Но если ты заменишь флаг на false, то соберется защищенная версия. Т.е. теперь нужно собирать две версии: обычную для выделенного и защищенную для клиентов. Ты можешь руками менять флаг и пересобирать либо закостылить через build.gradle.
 
2,505
81
397
Но это лишь один из способов. Самый простой, но не особо удобный.
Еще можно при сборке клиента эксклюдить серверные пакеты (или классы), и наоборот.
Также можно с собранному джарнику сразу применить SideTransformer, который обычно применяется в рантайме. Тогда код, помеченный аннотацией SideOnly, удалится заранее.
 
Сверху