Skocz do zawartości

TheMolkaPL
 Udostępnij

Rekomendowane odpowiedzi

Robię sobie plugin na minigry Arcade. Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!, ale chce napisać go od nowa i zbudować w ogóle innych design, który pozwoli na jeszcze więcej funkcji.
 
Cały kod od początku powstaje jako open-source. Można go znaleźć na GitHubie - Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!.
Obecnie nie ma możliwości pobrania pluginu, ponieważ dopiero buduje jego strukturę.
 
Projekt Arcade - bo tak to nazwałem - ma się składać z pluginu na mini-gry, plikami serwerowymi i kilkoma przykładowymi mapami do właśnie tych gier.

Projekt od samego początku powstaje jako publiczny i z otwartym kodem źródłowym. Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść! wprowadziłem 25 grudnia zeszłego roku. Była to 1 klasa i 22 linie kodu; dzisiaj (10/02 2016) jest to ponad 350 klas i ponad 20 000 linii kodu.

Design
Plugin chce napisać jak najbardziej abstrakcyjnie jak to możliwe, aby umożliwić łatwe dopisywanie nowych funkcji do pluginu. Chcę go oprzeć o moduły, które będą włączone i wyłączane w potrzebie do każdej z map. Cała logika pluginu będzie polegać na przenoszeniu się między mapami.
 
1. Ładowanie mapy oraz jej ustawień.
2. Włączanie modułów pluginu.
3. Przenoszenie graczy.
4. Startowanie gry.
5. Kończenie gry.
6. Wyłączanie modułów pluginu.
7. Patrz punkt 1.
 
Każdą mapę będzie można dobrowolnie konfigurować, niezależnie od innych map. Działanie pluginu będzie oparte właśnie o te konfigurację. Folder mapy (w którym znajduje się level.dat, oraz inne pliki mapy) należy umieścić w folderze repozytorium map. Taki folder powinien posiadać plik XML map.xml z jej konfiguracją.
 
Plugin poprzez kolejkowanie map będzie je ładował (najpierw kopiował do swojej lokalizacji światów) i uruchamiał według ustawień zawartych w konfiguracji.

Cały plugin działa na modelu publikacji-subskrypcji - dla zielonych - mam dużo eventów, tak jak w Bukkit, nasłuchuje je w innych częściach kodu.

Konfiguracja mapy
 
Przykładowa konfiguracja wygląda tak - Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!.
 
Obecnie mam napisaną podstawową logikę pluginu, system tasków, zarządania modułami, mapami, grami, regionami, kitami - w sumie wszystko z podstaw. Teraz to testuje i rozwijam moduły. Mam już napisany moduł na rozgrywanie meczy oraz tworzenie drużyn.

Na samym początku pliku konfiguracyjnego należy zdefiniować nazwę mapy, wersję, opis (cel gry), jej autorów oraz ustawienia świata Minecraft. Do ustawień świata zalicza się - poziom trudności (easy/normal/hard/peaceful), środowisko (normal, nether, the end), pvp (włączone/wyłączone globalnie na całej mapie).

Dodatkowo można także podać generator który ma być wykorzystany - domyślnie jest to void, pusty świat. Można ustawić vanilla, normalny generator (aczkolwiek zabija CPU), lub z zainstalowanego pluginu na serwerze, na przykład TerrainControl.

U ustawieniach należy także podać domyślny spawn - będą się na nim spawnować przyszli obserwatorzy modułu match.
 
Piszcie propozycję do pluginu i pomysły na jego rozwój :D

"Game"

No dobrze, ale co daje ten Arcade? Szczerze? nic... Tak... nic.. no prawie. :) Wprowadza on tak na prawdę zarządzanie obiektami Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!, który odpowiada za trwającą rozgrywkę na serwerze. Całą resztę wprowadzają moduły, które dobrowolnie włącza się niezależnie w konfiguracjach map. Każda mapa musi posiadać plik map.xml (tak, to jest XML, nie YAML - patrz niżej).

Przykładowo na mapie można włączyć moduł match. Odpowiada on za rozgrywanie meczy na mapie. Jest to odliczanie do startu (jeżeli mapa i gracze są gotowi do startu). Start meczu aż do zaliczenia wszystkich celów meczu przez minimum jedną drużynę. Zakończenie meczu - odliczanie do przeniesienia na następną mapę. Ten poziom modułu - definiujący tryb działania mapy nazwałem "środowisko" - czyli "environment". Kolejnym poziomem modułu jest "format", ale tylko w match, bo są one zależne od niego. Ten moduł definiuje tryb działania graczy na mapie. Na razie implementuje tylko drużyny, aczkolwiek w przyszłości planuje dodać FFA - Free-for-all, to znaczy - każdy gra dla siebie. Co ciekawe, taka zmiana nie powinna popsuć jakichkolwiek mini-gier! Zaprezentujmy więc te drużyny...

Poniżej znajdują się dwie drużyny - Blue Team oraz Red Team. Oba mają mieć friendly-fire, to znaczy, że członkowie nie mogą się nawzajem atakować. Ilość slotów to 50, aczkolwiek moderator, lub inna osoba z dodatkowym uprawnieniem może wejść nawet jeśli są pełne. Ostateczne ograniczenie to przepełnienie - overfill. Po przepełnieniu do drużyny nie może wejść już żadna osoba.

<teams>
    <team id="blue-team" name="Blue Team" color="blue" friendly-fire="true" slots="50" overfill="60">
        <kits>
            <kit>spawn-kit</kit>
        </kits>
        <spawns>
            <region yaw="90">
                <cuboid min-x="43" min-y="25" min-z="-69" max-x="60" max-y="25" max-z="-62" />
            </region>
        </spawns>
    </team>

    <team id="red-team" name="Red Team" color="red" friendly-fire="true" slots="50" overfill="60">
        <kits>
            <kit>spawn-kit</kit>
        </kits>
        <spawns>
            <region yaw="270">
                <cuboid min-x="-59" min-y="25" min-z="63" max-x="-42" max-y="25" max-z="70" />
            </region>
        </spawns>
    </team>
</teams>

Kolejnym poziomem modułu meczu to cele, czyli objectives. Wszystkie inne są najniższym poziomem modułów i nie wpływają aż tak bardzo na rozgrywkę. Cele to inaczej gry, ale dlaczego nie games? Ponieważ plugin Arcade wprowadza możliwość ich mieszania! Można wymieszać Destroy The Core i Destroy The Monument jednocześnie! Dzięki temu drużyna musi zniszczyć rdzeń(ie) i monument(y) przeciwnika, aby wygrać mecz. Dzięki temu, jak i systemowi modułów każda mapa może stworzyć unikalną, niepowtarzalną mini-grę.

Gry

Napisałem już w pełni działający Destroy The Core. Zadaniem Twojej drużyny jest zniszczenie rdzenia drużyny przeciwnej, przy czym musisz chronić także swój. Przeciwnik ma identyczne zadanie. Rdzeń to najczęściej kula z obsidianu zalana w środku lawą. Aby wygrać, lawa musi wylać się poza rdzeń ilość bloków zdefiniowaną w konfiguracji mapy. Drużyna do której rdzeń należy może oczywiście wyciek lawy zatamować. Może zablokować go wstawieniem z powrotem bloku w miejsce wycieku. To wszystko tworzy niesamowitą rozgrywkę walki dwóch (lub więcej) drużyn.

Przykładowa konfiguracja dwóch rdzeni - jeden należy do blue-team, drugi do red-team. Wygrana nastąpi po wycieku lawy 8 bloków poniżej rdzenia. Oba rdzenie nazywają się "Core". Materiał rdzenia nie jest podany, oznacza to, że będzie to obsidian. Typ cieczy nie jest podany, oznacza to, że plugin sam wykryje co znajduje się w jego wnętrzu - akceptowane ciecze (lawa i woda).

<leak>
    <leakable id="blue-core" name="Core" owner="blue-team" detector-level="8">
        <region>
            <cuboid min-x="11" min-y="26" min-z="-53" max-x="17" max-y="32" max-z="-47" />
        </region>
    </leakable>

    <leakable id="red-core" name="Core" owner="red-team" detector-level="8">
        <region>
            <cuboid min-x="-16" min-y="26" min-z="48" max-x="-10" max-y="32" max-z="54" />
        </region>
    </leakable>
</leak>

 

Napisałem już także Deathmatch, z czego na razie działa Team-deathmatch, z tego względu, że napisałem na razie jedynie moduł na drużyny jako format meczu. Deathmatch oparty jest o punkty. Punkty zdobywa się za zabicie.

<score>
    <kills>1</kills> <!-- Za zabicie otrzymuje się 1 punkt -->
    <limit>250</limit> <!-- Wygrana po zdobyciu 250 punktów -->
</score>

 

Następne gry jakie chciałbym zaimplementować to między innymi Destroy The Monument.

 

XML... użyj lepiej YAMLa...

YAML jest świetnym systemem zapisu, ale ma spore ograniczenia. XML jest łatwo rozbudowywalny poprzez skoncentrowanie całej struktury na elementach. Dodatkowo w XML można upchać znacznie więcej informacji, niż w YAML. YAML do potrzeb jakie stawia sobie Arcade jest po prostu niewystarczający... Dlatego zdecydowałem się na XML.

 

Potem opisze jeszcze system regionów i filtrów. Na razie mi się nie chce :P


Pozdrawiam :D 

A tak szczerze to wątpię, że ktoś to całe przeczytał. :) 

 

Pobierz: Aktualnie plugin jest we wczesnej wersji deweloperskiej. W związku z tym nie chce dawać pobierania, bo po prostu się do normalnego uruchomienia nie nadaje, a ja jeszcze nie chce się bawić w wersjonizację na tym etapie rozwoju.

Kod źródłowy: Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

Odnośnik do komentarza
Udostępnij na innych stronach

Dnia 12.02.2017 o 14:19, KrejzolekPRO napisał:

Jednym słowem...MISTRZ!

W końcu to Molek pisał, co nie? :P

 

rzecz jasna propsuje i to miliard razy, widzę działanie Arcade i jak na tą fazę rozwoju działa wręcz zajebiście.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...
2 godziny temu, Cynamonek napisał:

Ten "config" wygląda okropnie i dla zielonych nie czytających dokumentacji etc. trudnym będzie ogarnięcie.

Ale chodzi o to, że został stworzony w formacie XML, czy ogólny jego schemat? Starałem się każdy z tagów i atrybutów opisać jak najkrócej i jak najdokładniej. Tak, aby każdy prezentował za co odpowiada.

Odnośnik do komentarza
Udostępnij na innych stronach

 

Chodzi mi o to. Jeśli to config to jest dziwny.

<leak>
    <leakable id="blue-core" name="Core" owner="blue-team" detector-level="8">
        <region>
            <cuboid min-x="11" min-y="26" min-z="-53" max-x="17" max-y="32" max-z="-47" />
        </region>
    </leakable>

    <leakable id="red-core" name="Core" owner="red-team" detector-level="8">
        <region>
            <cuboid min-x="-16" min-y="26" min-z="48" max-x="-10" max-y="32" max-z="54" />
        </region>
    </leakable>
</leak>
Dnia 5.04.2017 o 18:47, TheMolkaPL napisał:

Ale chodzi o to, że został stworzony w formacie XML, czy ogólny jego schemat? Starałem się każdy z tagów i atrybutów opisać jak najkrócej i jak najdokładniej. Tak, aby każdy prezentował za co odpowiada.

Edytowane przez Vylence
Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...