mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-09 07:20:04 -04:00
remove old modding documentation
This commit is contained in:
parent
2df91178f4
commit
60e0e829cb
193
doc/Modding.md
193
doc/Modding.md
@ -1,193 +0,0 @@
|
||||
# Modding
|
||||
|
||||
## Disclaimer: This is completely outdated and will be rewritten soon. Just wait with mod writing! Sorry
|
||||
|
||||
## mod.json
|
||||
|
||||
In the root folder of your jar file (the mod) must be a file called `mod.json`. It contains metadata for the mod loader.
|
||||
|
||||
### Example
|
||||
|
||||
```json
|
||||
{
|
||||
"uuid": "1f37a8e0-9ec7-45db-ad2f-40afd2eb5a07",
|
||||
"version_id": 123,
|
||||
"version_name": "1.0",
|
||||
"authors": [
|
||||
"Example dev"
|
||||
],
|
||||
"name": "Example Mod",
|
||||
"modding_api_version": 1,
|
||||
"resource_namespace": "example",
|
||||
"main_class": "de.example.mod.Main",
|
||||
"loading": {
|
||||
"priority": "NORMAL"
|
||||
},
|
||||
"dependencies": {
|
||||
"hard": [
|
||||
{
|
||||
"uuid": "7fd5d30c-246e-42f6-9dfe-82f2383b4b68",
|
||||
"version": {
|
||||
"minimum": 123,
|
||||
"maximum": 123
|
||||
}
|
||||
}
|
||||
],
|
||||
"soft": [
|
||||
{
|
||||
"uuid": "af8c9c7e-c3c7-41e0-bcc6-3882202d0c18",
|
||||
"version": {
|
||||
"minimum": 123,
|
||||
"maximum": 123
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
### Explanation
|
||||
|
||||
- `uuid` is a unique id for the mod. Generate 1 and keep it in all versions (used for dependencies, etc). **Required**
|
||||
- `version_id` like in android there is a numeric version id. It is used to compare between versions (and as identifier). **Required**
|
||||
- `version_name`, `authors` and `name` is the classic implementation of metadata. Can be anything, will be displayed in the mod list. **Required**
|
||||
- `modding_api_version` Modding API version of minosoft. Currently `1` **Required**
|
||||
- `resource_namespace` is the prefix of items (for Minecraft it is `minecraft`). Aka the thing before the `:`. **Required**
|
||||
- `main_class` the Main class of your mod (self explaining). The main class needs to extend the abstract class `MinosoftMod`. **Required**
|
||||
- `loading` Loading attributes. **Optional**
|
||||
- `priority` should the mod be loaded at the beginning or at the end. Possible values are `LOWEST`, `LOW`, `NORMAL`, `HIGH`, `HIGHEST` **Optional**
|
||||
- `dependencies` Used if you need another mod to work **Optional**
|
||||
- `hard` These mods are **needed** to work. If the loading fails, your mod is not getting loaded, and a warning message is being displayed. **Optional**
|
||||
- `soft` These mods are **optional** to work. Both use the following format: **Optional**
|
||||
- `uuid` the uuid of the mod to load. **Required**
|
||||
- `version` Specifies the version you need to load. **Optional**
|
||||
- `minimum` Minimum versionId required. **Maximum, minimum, both or none**
|
||||
- `maximum` Maximum versionId required. **Maximum, minimum, both or none**
|
||||
|
||||
## Getting started
|
||||
Add Minosoft to your maven dependencies with
|
||||
Repository:
|
||||
```xml
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
```
|
||||
Dependency:
|
||||
```xml
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>de.bixilon.gitlab.bixilon</groupId>
|
||||
<artifactId>minosoft</artifactId>
|
||||
<version>master-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
Instead of `master-SNAPSHOT` you should write the latest commit, if there is no release tagged yet.
|
||||
|
||||
## Mod loading (aka Main class)
|
||||
Your main class must extend the following class: `de.bixilon.minosoft.modding.MinosoftMod`.
|
||||
|
||||
### Phases
|
||||
There are different phases (states) for the loading. There are the following phases:
|
||||
1. `BOOTING` Happens after loading all configuration files and while displaying the server list.
|
||||
2. `INITIALIZING` All mods are loaded into the ram and everything before registering anything happens here (like OpenGL stuff, etc). You should also register Events here.
|
||||
3. `LOADING` You have custom items, entities, blocks, etc? Load it here.
|
||||
4. `STARTING` All items, etc are loaded. If you want to do anything else, do it here.
|
||||
5. `STARTED` The loading is complete
|
||||
|
||||
The most important thing is performance. To archive fast loading times, etc, all mods (if they don't on each other) are getting loaded async.
|
||||
One phase is completed (= Next phase starts), once all mods have completed the previous phase. Everything is async.
|
||||
If your start function needs much time, you can set the loading priority in the `mod.json` to start at the beginning. The `start` method returns a success boolean.
|
||||
|
||||
|
||||
Create a Main class, here is an example
|
||||
|
||||
```java
|
||||
package de.bixilon.example.mod.main;
|
||||
|
||||
import de.bixilon.minosoft.modding.loading.ModPhases;
|
||||
|
||||
public class TestMod extends MinosoftMod {
|
||||
|
||||
public boolean start(ModPhases phase) {
|
||||
if (phase == ModPhases.BOOTING) {
|
||||
getLogger().info("Hello world!");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
Your `mod.json` can look like this
|
||||
|
||||
```json
|
||||
{
|
||||
"uuid": "1f37a8e0-9ec7-45db-ad2f-40afd2eb5a07",
|
||||
"version_id": 1,
|
||||
"version_name": "1.0",
|
||||
"authors": [
|
||||
"Bixilon"
|
||||
],
|
||||
"name": "Example Mod",
|
||||
"resource_namespace": "example",
|
||||
"main_class": "de.bixilon.example.mod.main.TestMod"
|
||||
}
|
||||
```
|
||||
|
||||
## Events
|
||||
There are global events (which works on all connections) and connections events (server specific).
|
||||
|
||||
To register a global event you need to use (in the `INITIALIZING` phase) `getEventManager().registerGlobalListener(new XYEventListener());`.
|
||||
If you want to register an event depending on a server address (like server specific support, you can use the following), you can use `EventManager::registerConnectionListener` method.
|
||||
It takes 2 arguments: The first one is your listener, the second one is a `ServerAddressValidator`.
|
||||
There are several validators, choose one or write your own:
|
||||
- `HostnameValidator` Simply check the hostname. For example: `bixilon.de`.
|
||||
- `PortValidator` Get all connections with a specific port. For example: `25565`
|
||||
- `SimpleAddressValidator` Check for server address and port. e.g.: `bixilon.de:25565`
|
||||
- `RegexValidator` Check for a regular expression like: `*.de`
|
||||
|
||||
Use the following: `getEventManager().registerConnectionListener(new XYEventListener(), new HostnameValidator("127.0.0.1"));`
|
||||
|
||||
Your event methods need to be annotated by `EventHandler`. `EventHandler` **can** take these arguments:
|
||||
- `priority` Pretty much self explaining. `HIGH` means, that it gets executed at "the beginning", `LOW` means the opposite. Defaults to `NORMAL`.
|
||||
- `ignoreCancelled` If it is a cancellable event, your method only gets executed, when all prior listeners (potentially with a higher priority) did not cancel the connectionEvent. Defaults to `false`.
|
||||
|
||||
Your XYEventListener class needs to extend `de.bixilon.minosoft.modding.event.EventListener`;
|
||||
|
||||
```java
|
||||
import de.bixilon.minosoft.modding.EventPriorities;
|
||||
import de.bixilon.minosoft.modding.event.EventListener;
|
||||
import de.bixilon.minosoft.modding.event.events.ChatMessageReceiveEvent;
|
||||
import de.bixilon.minosoft.modding.event.events.ChatMessageReceivingEvent;
|
||||
import de.bixilon.minosoft.modding.event.events.ChatMessageSendEvent;
|
||||
import de.bixilon.minosoft.modding.event.events.annotations.EventHandler;
|
||||
|
||||
public class ChatEvent extends EventListener {
|
||||
|
||||
@EventHandler(priority = EventPriorities.HIGHEST)
|
||||
public void onChatMessageReceiving(ChatMessageReceiveEvent event) {
|
||||
if (event.getMessage().getMessage().contains("Bixilon")) {
|
||||
MinosoftExampleMod.getInstance().getLogger().info("Bixilon wrote a potential bad chat message. Suppressing it!");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onChatMessageSending(ChatMessageSendEvent event) {
|
||||
if (event.getMessage().contains("jeb_ is stupid")) {
|
||||
event.setCancelled(true);
|
||||
event.getConnection().getSender().sendChatMessage("jeb_ is awesome!");
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The following code would suppress messages containing the word "Bixilon" and if you write "jeb_ is stupid" into the chat, the message's text will be "jeb_ is awesome". To see a list of all events look into `de.bixilon.minosoft.modding.connectionEvent.events`. There is also sometimes a javadoc, but generally just search for a file or open an issue.
|
||||
|
||||
## Debugging and running
|
||||
|
||||
Use a classic zip script that replaces the .jar in your mods folder:)
|
||||
|
||||
Just kidding, no clue yet. We need a build system, #12
|
Loading…
x
Reference in New Issue
Block a user