Все объекты в l2jserver

parrx

Выдающийся
Участник
Сообщения
57
Розыгрыши
0
Репутация
7
Реакции
5
Баллы
1 310
Хроники
  1. Infinite Odyssey
Исходники
Присутствуют
Сборка
l2jserver
Всем привет

кто нибудь может ткнуть как в l2jserver сборках реализовать поиск по всем игрокам\нпц
на лост\овер сборках

Код:
for(Player player : GameObjectsStorage.getPlayers())
{
    //
}

а вот в лыже подобной что то не могу придумать как это сделать
 
индексы конечно штука полезная, но иногда можно накрутить так, что будет ещё хуже.
вот по поводу ключей, да, тут согласен. было бы куда удобней поцепить всё на референсах (они и так есть, просто не на уровне базы) и сделать каскадное удаление (самый простой пример), тем самым дропая юзера - дропаются все референсы на уровне базы, что работает гораздо быстрее, чем то, в каком виде сейчас в большинстве сборок.
триггеры возможно имеют место быть, правда сразу не могу придумать их применение дабы улучшить какие-то процессы.

я не гуру движка mysql и не знаю как оно там работает, так что вся информация ниже касается только oracle DB.
гугл не сильно помог найти инфу по контекстам в mysql и как там под капотом работают процедурки, так что возможно там другая механика, поправьте если кто-то хорошо знает это
процедуры под самым большим сомнением: перевод банальных апдейт-запросов с 1 параметром на процедуры, но это не самое лучшее решение такие процедуры будут выполнятся дольше из-за переключения контекстов на уровне бд (sql и pl/sql), чем обычный апдейт-запрос, хотя разница почти не ощутима на маленьких объемах данных (а в л2 они как раз таки и маленькие).

я знаю про стримы и как\когда они начинают выполнятся, но это не отменяет того, что необходимо будет пройтись по всем объектам в коллекции, хоть это будет куда быстрее чем итерировать через фор.
я в своём сообщении имел ввиду больше о мапинге этих объектов на уровне sql и приходе на сервер уже готового datatype с замапленными данными, которые просто нужно преобразовать в необходимый вид. тем самым мы полностью избавляемся от любого использования for'ов или stream'ов.
я пока не могу придумать как это всё организовать, возможно даже решения и нету :-D:-D:-D
но вот такой процесс улучшил бы перформанс.
 
Реакции: kick
Rovskoi, только не кому не надо перепиливать эмули в нормальный вид ибо починишь/переделаешь одно поломается совсем 3 и костыль который был это решал. Как и писать, что то своё с 0 так как не взлетит такая поделка и для выкачки денег. Просто эмули л2 это показатель как не надо писать код прям совсем, отличное учебное пособие.
 
Хз для маленьких баз л2 почти все есть что нужно. И ключи на таблицах, и индексы.
Посмотрите в запросы в дао и сравните с индексами: для всех частых выборок есть индексы. Вторичные ключи где то делали в сборках, только вот Это очень не удобно когда руками в базе пытаешься что то вставить быстро ручками, а проверки не дают без правильных идшников(кейс с удалением вероятно полезный, но у меня вот в базе игроки полностью не удаляются, а помечаются удаленными). Триггеры тоже для консистентности. Кстати, Триггеры и вторичные ключи в промышленных решениях считаются плохой практикой, консистентность данных должна на уровне приложения обеспечиваться , а они вызывают больше проблем. Про процедуры я уже говорил постом выше( про обработку в памяти вс базе), больше не вижу реальных кейсов их использования.

Кстати джойн в скл не будет ничуть быстрее, чем работа в стриме. Если по индексу: вызовется Nested loops(цикл) и будет сравнивать значение. Но за счёт сортировки по ключам, найдёт быстрее чем просто цикл в яве. Хотя в яве тоже можно конструкцию с сортированным списком и компаратором придумать. И бд проиграет.
Если хэш джойн: сформирует таблицу из ключей по хэш функции и будет сравнивать с хэш функциями другой коллекции( точно также причём как и в стримах, разве что сама хэш функция другой может быть). Опять же бд Проиграет.
 
Последнее редактирование модератором:

я вообще хотел это узнать чтобы, попробовать сделать поиск игроков в указанном регионе)
например: хочу узнать всех игроков или нпц в городе глудио, но пока не получилось
 
регион как сделать нашел а вот как по нему циклом пройти
Код:
L2MapRegion region = MapRegionManager.getInstance().getMapRegion(loc.getX(), loc.getY());

for (L2Object obj : поиск по региону)
{       
    if (obj != null)
        System.out.println(obj.getName());
}
 
for (L2Playable object : region.getVisiblePlayable().values())
{
}

for (L2Playable object : region.getVisibleObjects().values())
{
}
 
for (L2Playable object : region.getVisiblePlayable().values())
{
}

for (L2Playable object : region.getVisibleObjects().values())
{
}

Код:
for (L2Playable obj : region.getVisiblePlayable().values())
не такого region.getVisiblePlayable().values()

единственное как у меня получилось
Код:
int reg = MapRegionManager.getInstance().getMapRegionLocId(loc.getX(), loc.getY());

for (L2Object obj : L2World.getInstance().getVisibleObjects())
    if (reg == MapRegionManager.getInstance().getMapRegionLocId(obj))
        System.out.println(obj.getName();

но это как то govnocode как мне кажется
 
Пожалуй самый правильный вариант написать функцию связывающую L2MapRegion и WorldRegion.
В L2MapRegion координаты региона определяюстя таким сдвигом x - World.MAP_MIN_X >> 15. А в WorldRegion в общем случае таким (x >> 11) + Math.abs(MAP_MIN_X >> 11);
Значит MapRegion состоит из нескольких WorldRegion, считаете мин и макс X, которые вам подойдут из WorldRegion. Затем в цикле перебираете регионы World.getRegions()[xmin++][][] (аналогично для y и z)
Если регион не null, то добавляете еще один цикл for(GameObject obj : region). Ну и obj.sPlayer()? action..
 
если конкретно по городам, то можно просто перебрать все нужные объекты в конкретной зоне, в данном случае в мирной зоне нужного города.
а если надо искать по всей територии, принадлежащей определенному городу/замку, то можно просто перебрать всех в онлайне на тему того, что они находятся в данный момент в нужном домене.