- Баллы
- 76
- Имя в Minecraft
- Jon
Я хочу добавить в класс Player дополнительное поле, чтобы не юзать HashMap. Это возможно как-то сделать, не переписывая ядро?
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Ожидал этого вопросаА чем HashMap не угодил?

Тоесть это невозможно? Я не говорю даже про плагин. Например, написать java программу, которая будет предварительно изменять класс Player, а после уже запускать ядро сервера. Своего рода запускатор.Много хочешь. Юзай метадату
NMS/OBC можно изменить и без таких ухищрений. Сделать объект расширяющий CraftPlayer, а потом подменять им настоящего игрока с помощью рефлексий. Правда это не всегда подходит.Тоесть это невозможно? Я не говорю даже про плагин. Например, написать java программу, которая будет предварительно изменять класс Player, а после уже запускать ядро сервера. Своего рода запускатор.
Это позволит изменять ядро сервера без каких либо правок.
Как сделать объект расширяющий CraftPlayer?NMS можно изменить и без таких ухищрений. Сделать объект расширяющий CraftPlayer, а потом подменять им настоящего игрока с помощью рефлексий.
А как тогда выбирать объект именно для определенного игрока?Есть идея еще размещать нужные мне объекты рядом друг с другом в оперативной памяти. И ссылаться по ним, как по массиву. Но я не знаю, как это все делать..
Для начала надо подключить craftbukkit как билиотекуКак сделать объект расширяющий CraftPlayer?
Ну брать Player, получать его указатель и сдвинуться на след. ячейку в ОП, а там уже будет нужный мне указатель на мою мета дату. Но это костыли в квадратеА как тогда выбирать объект именно для определенного игрока?
Для начала надо подключить craftbukkit как билиотеку

А почему под каждую версию, если я только хочу добавить поле, а не убрать, например? Тоесть по идее, не важно какая версия классаА как тогда выбирать объект именно для определенного игрока?
Для начала надо подключить craftbukkit как билиотеку
И чтобы плагин работал на разных версиях, придется писать этот класс отдельно под каждую версию (ну почти) и в зависимости от того на какой версии запускается, создавать нужный объект.
Слушать PME 4 раза в секунду - ?Ну он дает нагрузку, особенно когда его используешь в PlayerMoveEvent.
Потому что в разных версиях этот класс находится в разных пакетах. Вот например в 1.8.4 - 1.8.8 он вА почему под каждую версию, если я только хочу добавить поле, а не убрать, например? Тоесть по идее, не важно какая версия класса
Указатели в Java? o.oНу брать Player, получать его указатель и сдвинуться на след. ячейку в ОП, а там уже будет нужный мне указатель на мою мета дату. Но это костыли в квадрате![]()
Подходит, в него же входит craftbukkit. Но лучше все-таки тык чтобы ничего лишнего не порасширять (я не в курсе что там в Spigot'e)craftbukkit? А spigot не подходит?
Это неплохая идея.Слушать PME 4 раза в секунду - ?
Этого обычно достаточно чтобы творить с игроком что хочешь. Правда, если ты будешь отменять эвент, то тут уже грустнее всё.
Зачем тогда использовать craftbukkit, если Player всегда находится в одном пакете?Потому что в разных версиях этот класс находится в разных пакетах. Вот например в 1.8.4 - 1.8.8 он в
org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer
А в 1.7.10 в org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer
Указатели в Java? o.o
Даже если такое существует, то кто гарантирует, что место в памяти рядом с Player не занято?
Подходит, в него же входит craftbukkit. Но лучше все-таки тык чтобы ничего лишнего не порасширять (я не в курсе что там в Spigot'e)
Player это интерфейс, в нём нет полей. Чтобы обращаться к твоему полю без всяких костылей, придётся ручками допиливать CraftPlayer. Или патчить(я тут не спец) его в рантайме и лазить рефлексиями, что медленее хешмапы.Я хочу добавить в класс Player дополнительное поле, чтобы не юзать HashMap. Это возможно как-то сделать, не переписывая ядро?
Зато это надо будет сделать только один раз)что медленее хешмапы
Составить-то путь можно, но вот наследовать от этого пути объект? Не знаю возможно ли это.Да и всегда можно получить версию майна и составить путь к carftbukkit
В интерфейсе нет полей? Я думал там только они и есть.. Ну без унаследования они не дают толка. Попробую рефлексиями изменить.Player это интерфейс, в нём нет полей. Чтобы обращаться к твоему полю без всяких костылей, придётся ручками допиливать CraftPlayer. Или патчить(я тут не спец) его в рантайме и лазить рефлексиями, что медленее хешмапы.
В интерфейсе только методы, а полей нет.В интерфейсе нет полей? Я думал там только они и есть.. Ну без унаследования они не дают толка. Попробую рефлексиями изменить.
PlayerMoveEvent я написал как пример.А для чего Вам PlayerMoveEvent? За перемещением игрока лучше следить через планировщик.
лол, перепуталВ интерфейсе только методы, а полей нет.
В некоторых случаях и правда удобней создать своего CraftPlayer'а (например, если полей очень много). К тому же в нем можно изменить базовые значения переменных.Чем Вам HashMap не угодил? Я например, удаляю из него игроков, когда они отключаются от сервера, тогда элементов будет не так много. Либо можно использовать очередь с автоматическим выталкиванием.
Потому что прощеЧем Вам HashMap не угодил? Я например, удаляю из него игроков, когда они отключаются от сервера, тогда элементов будет не так много. Либо можно использовать очередь с автоматическим выталкиванием.
Ну тут остается помолитьсяВ некоторых случаях и правда удобней создать своего CraftPlayer'а (например, если полей очень много). К тому же в нем можно изменить базовые значения переменных.
Но это может напрочь убить совместимость с плагинами, которые делают так же.

Не знаю насчет проще, т.к. надо будет все время делать преобразование типовПотому что проще

package me.govnojon.essentials;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class PlayerData {
public Player player;
public int mana = 100;
public int poins = 0;
public FileConfiguration file;
PlayerData(Player player) {
this.player = player;
}
}
package me.govnojon.essentials;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.metadata.FixedMetadataValue;
public class Listeners implements Listener
{
@EventHandler
public void onPlayerJoinEvent(PlayerJoinEvent event) {
Player p = event.getPlayer(); //Игрок
PlayerData pd = new PlayerData(p); //Доп данные о игроке
p.setMetadata("data", new FixedMetadataValue(Essentials.plugin, pd)); //Сохраняим их под названием "data"
}
}
public static PlayerData getPlayerData(Player player) {
List<MetadataValue> values = player.getMetadata("data"); //Получаем список метадат "data"
for (MetadataValue value : values) { //Идем по списку (Будет только один проход, если вы добавили только одину метадату "data")
if (value.value() instanceof PlayerData) { //Если нашли, проверяем нужный ли это объект
return (PlayerData) value.value(); //Возращаем его
}
}
return null; //Если не наши, то возращаем null
}