У вас є дві дуже різні речі для управління:
Сервер повинен керувати усім світом в авторському порядку. Для цього необхідне спілкування з N клієнтами (де N - "масовий").
Клієнт , в принципі, міг знати про весь світ, але цього не потрібно . Для клієнта достатньо знати про те, що знаходиться поблизу гравця. Припустимо, наприклад, досить грубу сітку поділу, потрібно знати лише клітинку гравця та 26 комірок навколо програвача (або 8 комірок, якщо у вас є двовимірна сітка). Дещо тонша сітка краще, але ви отримуєте ідею.
Зараз дуже багато пікапів, що таке "багато"? Ви копаєте, можливо, 5 речей в секунду, це може бути два десятки номерів, які потрібно оновити на сервері, і сервер, можливо, повинен буде передати їх іншому гравцеві, область інтересів якої перекриває вашу клітинку. Для комп’ютера це досить смішний об'єм даних та незначна кількість обчислень. Це може стати викликом, коли в одній комірці є сотні / тисячі гравців (тоді ваше розділення занадто грубе).
Серверу не потрібно ні знати, ні дбати про обертання підбирачів або подібні деталі. Навіщо це?
Клієнта насправді теж не хвилює, оскільки це лише цукерки для очей, які клієнт може скласти з льоту.
Що потрібно з точки зору сервера - це знати, що ви копали (30, 40, 50) у вузлі, в якому ви перебуваєте, і він вирішує, що це породжує, наприклад, три об’єкти типу 5 або один об'єкт типу 7 з кількість 3. Це все, що це хвилює, і це все, що вам скаже. Вона також буде включати цю інформацію в дані, що надсилаються тому, хто пізніше переміщає область, що цікавить, через сітку комірки (якщо припустити, що вона все ще є до цього часу).
Клієнт отримує інформацію про три породжені об'єкти, бла-бла. Тепер, незалежно від того, чи відображає клієнт ASCII-арт-карту, де зараз є D, чи він показує обертову купу бруду, все одно. Незалежно від того, чи є палі різними обертаннями, чи обертаються лише ті, що наближаються до вашого програвача. Це просто речі, які відображаються на моніторі, вони не впливають ні на кого більше.
Отже, у конкретному випадку, що ви хочете обертати лише довколишні палі бруду, ви можете просто перевірити дальність дії всіх об'єктів, про які ви знаєте. Оскільки набір даних не велика, навіть груба сила на все буде працювати.
Ви можете (і повинні) залежно від вашого розміру перегородки тривіально обрізати осередки сітки, які занадто далеко.
Ви, звичайно, можете надалі підрозділяти свою клітинку і використовувати щось супер розумне. Використовуйте kd-Дерево, якщо хочете, але не очікуйте великих прибутків. Ви можете підрізати речі за допомогою манхеттенської дистанції, або можете сортувати свої речі у невеликій власній сітці ... але чому?
Перевірка відстані (дійсно відстань у квадраті, але для вас це однаково) - це лише два множення та доповнення (оптимізовано до MUL, MADD, так що насправді лише дві операції), після чого слід гілка або умовний хід. Це майже так само швидко, як і будь-яка інша операція, яка не обрізає цілі комірки сітки одночасно. Насправді це щось, що ви могли навіть зробити на GPU ...
Бачачи, як у вас буде кілька сотень, або щонайбільше декілька тисяч перевірок відстані на ту саму позицію (відстань у квадраті працює добре), у вас справді не виникає особливих проблем, просто роблячи цей розрахунок, тим більше, що це досить кеш- дружня ітерація над суміжною пам’яттю, а при умовних рухах - бруд дешевий. Щось на кшталт (псевдокод) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. Це одна ітерація над масивом у кілька сотень значень на кадр. Комп'ютер не міг менше дбати про це, це суміжні навантаження та магазини, простий АЛУ, відсутність філій та лише кілька тисяч ітерацій.
Це (багато-до-одного) - це не той самий клас проблем (багато-до-багатьох), як на сервері. Дійсно, клієнт не проблема.
minecraft:dirt
) і кількість (30), так що коли гравець достатньо близький, щоб забрати його, він просто додасть якомога більше підрахунку до інвентаря гравця. Якщо у гравця є лише 6 місць, а стек на 30 - на полі, гравець підніме 6, а стек на рахунку землі зменшиться до 24.