- 108
- 2
- 5
Настоятельно рекомендую почитать о запросах в SQLite, это очень упростит вам задачу!
Итак, моя проблема была в том, чтобы хранить статистику игрока (к примеру деньги, уровень, ID дома и прочее) на сервере, чтобы можно было в любой момент изменить её (прямо с сайта или даже если игрок оффлайн и сервер выключен).
Для решения данной проблемы я находил несколько решений:
Если немного не понятно о чем идет речь, вот как устроена база данных:
В данном случае поле:
Приступим к самой связи базы данных и сервера:
Создадим класс SqlHelper, который будет являться помощником работы с БД.
Теперь пропишем действия, при котором у нас должен вызываться эти методы
И вот что у меня получилось - настоящая автоматическая регистрация в БД!
Дальше уже можно использовать БД как хотите, но опять же рекомендую настоятельно выучить язык SQL, это существенно облегчит вам задачу!
Итак, моя проблема была в том, чтобы хранить статистику игрока (к примеру деньги, уровень, ID дома и прочее) на сервере, чтобы можно было в любой момент изменить её (прямо с сайта или даже если игрок оффлайн и сервер выключен).
Для решения данной проблемы я находил несколько решений:
- Capabilities - Оно основывается на хранении любых NBT значений в Entity, будь то игрок, корова или даже вагонетка, но данный способ мне не подходил, так как здесь возникает проблема изменения значений когда игрок оффлайн.
- WorldSavedData - Сохраняет значения в папке с миром. Не подходил данный метод из-за того, что изменение значений невозможно, когда сервер выключен, и к тому же для массивного хранения данных это так же не подходило.
- База данных SQLite - После размышлений над вторым вариантом, мне пришло в голову это. Идеальное решение для какого-либо проекта.
Очень просто.
Модель Клиент-Сервер мы уже знаем - они обмениваются пакетами данных, к примеру обновление статистики. О синхронизации мы можете почитать, в учебнике есть статья.
А вот Сервер выполняет запросы на Базу данных SQLite.
Модель Клиент-Сервер мы уже знаем - они обмениваются пакетами данных, к примеру обновление статистики. О синхронизации мы можете почитать, в учебнике есть статья.
А вот Сервер выполняет запросы на Базу данных SQLite.
Если немного не понятно о чем идет речь, вот как устроена база данных:
В данном случае поле:
- id - уникальный ключ, используется почти в каждой базе данных
- name - имя игрока
- money - деньги
- Остальные поля, которые вы можете добавлять и изменять как вам угодно
- База данных SQLite (может быть размещена где угодно, хоть у Вас на компьютере, хоть возьмите сайт https://www.freemysqlhosting.net/. Там можно бесплатно поставить одну базу данных до 5 мб в размерах.
- Java IDE с установленным драйвером JDBC (ниже я рассказываю как это сделать).
Так как моды собираются на билдере Gradle, то изменить настройки его нам и понадобится.
В корне нашего проекта находим чудесный файл build.gradle.
Находим строку buildscript и в нем по иерархии будет dependencies.
Добавляем в dependencies такую строчку
чтобы получилось примерно так:
Обращаю внимание, что в зависимости от версий у всех может быть разный файл Gradle!
Теперь добавляем в корневой dependencies (который не в buildscript) такую строку:
И итоговый вариант build.gradle должен содержать вот такую штукенцию:
Дальше обновите файл сборки Gradle (в принципе можно и не обновлять, так как он это сделает сам при сборке мода).
Если что-то не получилось, погуглите ошибку.
В корне нашего проекта находим чудесный файл build.gradle.
Находим строку buildscript и в нем по иерархии будет dependencies.
Добавляем в dependencies такую строчку
Код:
classpath 'mysql:mysql-connector-java:5.1.44'
Код:
buildscript {
repositories {
jcenter()
maven { url = "http://files.minecraftforge.net/maven" }
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
classpath 'mysql:mysql-connector-java:5.1.44'
}
}
Теперь добавляем в корневой dependencies (который не в buildscript) такую строку:
Код:
compile 'mysql:mysql-connector-java:5.1.44'
И итоговый вариант build.gradle должен содержать вот такую штукенцию:
Код:
buildscript {
repositories {
jcenter()
maven { url = "http://files.minecraftforge.net/maven" }
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
classpath 'mysql:mysql-connector-java:5.1.44'
}
}
dependencies {
compile 'mysql:mysql-connector-java:5.1.44'
}
Дальше обновите файл сборки Gradle (в принципе можно и не обновлять, так как он это сделает сам при сборке мода).
Если что-то не получилось, погуглите ошибку.
Приступим к самой связи базы данных и сервера:
Создадим класс SqlHelper, который будет являться помощником работы с БД.
Код:
public class SqlHelper {
private static final String user = "логин";
private static final String password = "пароль";
private static final String url = "jdbc:mysql://хост:3306/имя базы данных";
public static Connection connection;
public static Statement statement;
public static ResultSet resSet;
public static SqlHelper sqlHelperInstance = new SqlHelper(); //Создадим instance нашего класса для быстрого доступа
public void setConnection() throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver"); //Настраиваем драйвер JDBC
System.out.println("Driver was loaded");
} catch (ClassNotFoundException e) {
System.out.println("Class not Found!!!");
}
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
System.err.println("Connection can't be estabilished!!!"); //В случае если не сможет подключиться
}
if (connection != null) {
System.out.println("Connection with database was created!!!"); //Если все-таки соединение установлено, выведется это сообщение
} else System.out.println("There's fail to create connection!");
}
public void registerPlayer(String name) throws SQLException { //Функция регистрация игрока в базе данных на основе запроса БД
statement.executeUpdate("INSERT INTO players (name, money) VALUES ('" + name + "', '0',)");
System.out.println("Register player");
}
public boolean playerRegistered(String name) throws SQLException { //Возвращает true, если игрок уже зарегистрирован в системе
statement = connection.createStatement();
resSet = statement.executeQuery("SELECT EXISTS(SELECT * FROM players WHERE name='" + name + "')");
resSet.next();
if (resSet.getInt(1) == 1) {
System.out.println("Player registered");
return true;
} else {
System.out.println("PLayer not registered");
return false;
}
}
}
Теперь пропишем действия, при котором у нас должен вызываться эти методы
Код:
public class EventHandler { //Регистрируем игрока при входе если он не зарегистрирован в системе
@SubscribeEvent
public void onPlayerLogsIn(PlayerEvent.PlayerLoggedInEvent event) throws SQLException {
EntityPlayer player = event.player;
if (!player.worldObj.isRemote) {
if (!SqlHelper.sqlHelperInstance.playerRegistered(player.getDisplayNameString())) {
SqlHelper.sqlHelperInstance.registerPlayer(player.getDisplayNameString());
}
}
}
Дальше уже можно использовать БД как хотите, но опять же рекомендую настоятельно выучить язык SQL, это существенно облегчит вам задачу!