Python и Minecraft

+36
Naked_Skullв блоге My Little Minecraft15 января 2020, 23:40
Немного програмизьма

Есть такая штука как "Minecraft Overviewer" — Штуковина, которая делает карту мира майна аля гугл-карта
Ну как-то так это выглядит

К этой карте прилагается инструкция и там есть раздел "Таблички и маркеры".

Итак, вопрос: Как делать свои маркеры на этой карте?
У меня разобраться не получилось, если тут найдется человек, у которого получится, то буду очень благодарна за инструкцию

16 комментариев

Naked_Skull
+2
О, на одном моём любимом серваке была такая карта)
Vibrissa
0
На серваках вроде другой плагин, а эта доя сингла то, что надо
Naked_Skull
0
Но то был DynMap
Dushess_az
0
ок, ща будет
TheOceanPony
+2
Ну вот, пожалуйста, написал небольшой скрипт и мануал к этому ко всему.
С удовольствием помогу если возниктнут какие-либо проблемы.
Было довольно поздно, так что возможны ошибки… Заранее прошу за них прощения

Мануал1 Установка1) Идём сюда, и скачиваем подходящую вам версию.
2) Разархивруем архив в удобое для вас место.
3) Качаем этот фалик («myconfig.py») и ложим рядом с «overviewer.exe».

2 Настройка1) Открываем «myconfig.py» (последний скачаный файл) любым текстовым редактором и редактируем первые две строки.
2) В первой указать путь к вашему миру. Например:
world_path = "C:/Users/Usr_name/AppData/Roaming/.minecraft/saves/MyWorld1"

3) Во второй — путь, куда будет сохранен рендер. Например:
output_path = "C:\render"


3 В самой игре1) В общем есть шесть типов маркеров:
home, marker, town, tower, mine, farm 
(Они отличаются только значками, и есть двух цветов)

2) Для того чтобы маркер появился на карте нужно поставить табличку и написать в её 1-й строке одно из кодовых слов:
<home>, <marker>, <town_r>, <town_b>, <tower_r>, <tower_b>, <farm_r>, <farm_b>, <mine_r>, <mine_b>      
(После него на табличке можно описть всё что угодно, оно отобразится как описание маркера на карте)
НаглядноВ игре:

На карте:




4 Запуск1) Открывам консоль (Win + R и «cmd»)
2)
cd C:\Users\usrname\Desktop\overviewer-0.15.2 

3)
overviewer.exe --config=myconfig.py 

4)
overviewer.exe --config=myconfig.py --genpoi 
Если всё прошло успешно то в выходной папке (например «C:\render») у вас должно было появиться много разных файлов.
5) Находите «index.html» и открываете его любым браузером
6) Вуаля, вы восхитительны!


TheOceanPony
+3
Если всё прошло успешно то в выходной папке (например «C:\render») у вас должно было появиться много разных файлов.

Файла нет, консоль пишет это, маркеры не появились 3:
Naked_Skull
0
Файла нет,

Нет, вру, эти товарищи появились
Naked_Skull
0
Играл однажды на замечательных серваках, админы не школоло, ламповость игры присутствовала, торговля и простота сервера… Были времена, ща бы не отказался поиграть на ламповом серве.
Andrelyx
0
Могу подсказать одного стримера, у которого сервер для платных подписчиков довольно ламповый
Naked_Skull
0
Давай, гляну с удовольствием.
Andrelyx
0
Прошлая я, как ты в этом смогла разобраться :D диву даюсь)
Naked_Skull
+5
Оставлю тут новый «более рабочий» конфиг здесь, вместо облака:
myconfig.py
worlds = {}
# Define the path to your world here.
worlds["MyWorld"] = r"C:\Users\UserName\AppData\Roaming\.minecraft\saves\MySuperWorld"

# Define where to put the output here.
outputdir = r"C:\Users\UserName\Desktop\Map render"

# Define the resourcepack (optional)(Remove '#' before the line underneath).
# texturepath = r"C:\Users\UserName\Desktop\resourcepack.zip"


# Filters
def marker_Filter(poi):
    if poi['id'] == "Sign" or poi['id'] == "minecraft:sign" or poi['id'] == "minecraft:oak_sign":
        if poi['Text1'] == "<marker>":
            # poi['icon'] = "markers/marker_location.png"
            return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])

def home_Filter(poi):
    if poi['id'] == "Sign" or poi['id'] == "minecraft:sign" or poi['id'] == "minecraft:oak_sign":
        if poi['Text1'] == "<home>":
            # poi['icon'] = "markers/marker_home.png"
            return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])


def farm_Filter(poi):
    if poi['id'] == "Sign" or poi['id'] == "minecraft:sign" or poi['id'] == "minecraft:oak_sign":
        if poi['Text1'] == "<farm_r>":
            # poi['icon'] = "markers/marker_hoe_red.png"
            return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])

def town_Filter(poi):
    if poi['id'] == "Sign" or poi['id'] == "minecraft:sign" or poi['id'] == "minecraft:oak_sign":
        if poi['Text1'] == "<town_b>":
            # poi['icon'] = "markers/marker_town.png"
            return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])

def playerIcons(poi):
    if poi['id'] == 'Player':
        poi['icon'] = "https://overviewer.org/avatar/%s" % poi['EntityId']
        return "Last known location for %s" % poi['EntityId']


# Map layers
renders["MyWorld"] = {
        "world":        "MyWorld",
        "title":        "Overworld",
        "dimension":    "overworld",
        "rendermode":   "smooth-lighting",
        "markers":      [
                        dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                        dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                        dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                        dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")
                        ],
    }

renders["MyWorld Cave"] = {
        "world":        "MyWorld",
        "title":        "Cave",
        "dimension":    "overworld",
        "rendermode":   "cave",
        "markers":      [
                        dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                        dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                        dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                        dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")
                        ],
}

renders["MyWorld Nether"] = {
        "world":        "MyWorld",
        "title":        "MyWorld Nether",
        "dimension":    "nether",
        "rendermode":   "nether",
        "markers":      [
                        dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                        dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                        dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                        dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")
                        ],

}

renders["MyWorld End"] = {
        "world":        "MyWorld",
        "title":        "MyWorld End",
        "dimension":    "end",
        "markers":      [
                        dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                        dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                        dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                        dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")
                        ],
}
TheOceanPony
+3
Хотел спросить, а потом оно как-то само решилось. Вернее как...Ностальгия, тщеславие и прокрастинация слились в единое желание развернуть интерактивную карту. Гамаю на 1.7.10 последняя версия что поддерживает Flan сея речь бибики Потому последняя версия Overview матюкается на отсутствие текстурок для новых блоков по типу адской древесины:


Накатал ресурс пак с текстурами 1.7.10 и патч для поддержки старой системы ID блоков. Без результатно.

Раскопал древнющую Overview v0.11.0, что писалась как раз под MC 1.7. Он устанавливается через треклятый setup.py ради которого мне пришлось накатывать Python 3.9, подключать Pip, докачивать Numpy с Pillow и всё ради того, что бы етот душнила напомнил о том, что его зовут питон:


Указал точный адресс етава душнилы-питона. На сей раз наебнулся уже сам setup.py:


Забыл и вернулся к актуальной версии Overviewer. Попробывал пойти от обратного и задать ресурс пак не как для вьювера (1.7.10), а как для майна (1.17). Внезапно сработало. Спустя 10 минут ожиданий у меня був следующий результат:


И тута я резко вспомнил, что играю ващет на ForgeOptiFine 1.7.10… Ну и не успел я даже подумать, как документация резко ответила:



McFord
+1
Ну, стоило ожидать что блоки из модов он не видит
Naked_Skull
0
Для потомков
Чтобы было так:




Делай так:
worlds["Prostoy SAVE!!!"] = "C:\Users\UserName\AppData\Roaming\.minecraft\saves\MySuperWorld""
world = "Prostoy SAVE!!!"
my_nether_lighting = [Base(), EdgeLines(), Nether(), SmoothLighting(strength=0.4)]
my_end_lighting = [Base(), EdgeLines(), SmoothLighting(strength=0.4)]

outputdir = "C:/Users/User/Desktop/rendermap"

def marker_Filter(poi):
	if poi['id'] == "Sign" or poi['id'] == "minecraft:sign":
		if poi['Text1'] == "<marker>":
			return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])

def home_Filter(poi):
	if poi['id'] == "Sign" or poi['id'] == "minecraft:sign":
		if poi['Text1'] == "<home>":
			return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])


def farm_Filter(poi):
	if poi['id'] == "Sign" or poi['id'] == "minecraft:sign":
		if poi['Text1'] == "<farm_r>":
			return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])


def town_Filter(poi):
	if poi['id'] == "Sign" or poi['id'] == "minecraft:sign":
		if poi['Text1'] == "<town_b>":
			return "\n".join([poi['Text1'], poi['Text2'], poi['Text3'], poi['Text4']])

renders["Day"] = {
        "title": "Day Lighting",
        "rendermode": lighting,
        "dimension": "overworld",
	"markers": [dict(name="marker", filterFunction=marker_Filter),
                    dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                    dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                    dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                    dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")],
}

renders["Cave"] = {
        "title": "Cave",
        "rendermode": cave,
        "dimension": "overworld",
	"markers": [dict(name="marker", filterFunction=marker_Filter),
                    dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                    dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                    dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                    dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")],
}

renders["Nether"] = {
        "title": "Nether",
        "rendermode": my_nether_lighting,
        "dimension": "nether",
	"markers": [dict(name="marker", filterFunction=marker_Filter),
                    dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                    dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                    dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                    dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")],
}


renders["End"] = {
        "title": "End",
        "rendermode": my_end_lighting,
        "dimension": "end",
	"markers": [dict(name="marker", filterFunction=marker_Filter),
                    dict(name="marker", filterFunction=marker_Filter, icon="markers/marker_location.png"),
                    dict(name="home",   filterFunction=home_Filter, icon="markers/marker_home.png"),
                    dict(name="farm",   filterFunction=farm_Filter, icon="markers/marker_hoe_red.png"),
                    dict(name="town",   filterFunction=town_Filter, icon="markers/marker_town.png")],
}
</town_b></farm_r></home></marker>

И вот так:

Naked_Skull
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.