# MineLastDaysProxy对接指南

MineLastDaysProxy的主要职责是进行Mod与Plugin的对接。

其提供Plugin便捷调用Mod内功能的途径，同时协调Mod与Plugin的功能。

{% hint style="info" %}
对接相关文件位于proxies包中
{% endhint %}

## 一，你方作为服务提供商时

![你需要向本插件提供服务](https://3954282708-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MaVvv247EKzjGB7gwi6%2F-MaVw01zXnIR9iHDm8cA%2F-MaW3Pn5K7BUqNd8lbCs%2Fframework1.png?alt=media\&token=f801a4fa-9fdc-4219-83d4-0be5fe9e5633)

位于proxies包下，有两个类负责对接

* IFunctionProvider。服务提供接口。你需要实现该接口，以提供服务。
* ProviderManager。服务对接器。在该类中注册你的实现类。

### 1. 以对接队伍服务为例

通常，若需要对接，插件将会创建一个需求接口。

{% code title="ITeamInfoProvider.java" %}

```java
//需求接口，包含需要对接的内容。
public interface ITeamInfoProvider extends IFunctionProvider {
  
  /**
  *  判断两玩家是否是队友
  */
  boolean isTeammate(UUID playrUUID1, UUID playerUUID2);
  
  /**
  *  获取某玩家的队友
  */
  ArrayList<UUID> getTeammates(UUID playerUUID);
}
```

{% endcode %}

你方需要对该接口进行实现，以提供功能。

{% code title="TeamInfoProviderImpl.java" %}

```java
//为需求接口写入你的实现方法
public class TeamInfoProviderImpl implements ITeamInfoProvider{

    /**
    *  判断两玩家是否是队友
    */
    public boolean isTeammate(UUID playrUUID1, UUID playerUUID2){
        boolean result = false;
        //TODO 你的逻辑代码
        return result;
    }
    
    //其他部分同理...
    
}
```

{% endcode %}

至此，你已经完成对接口的实现。

接下来，你需要在服务对接器注册你的实现类。我们通常在插件开启时进行。

{% code title="YourPlugin.java" %}

```java
public class YourPlugin extends JavaPlugin{

    @Override
    public void onEnable(){
        //注册你的实现类
        ProviderManager.register(new TeamInfoProviderImpl());
    }

}
```

{% endcode %}

自此，你已完成对接。

{% hint style="success" %}
你可以使用ProviderManager.getProvider(ITeamInfoProvider.class)调用你的实现类，进行测试。
{% endhint %}

## 二，本插件提供功能时

![该插件作为提供方，即你方作为服务消费者](https://3954282708-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MaVvv247EKzjGB7gwi6%2F-MaW3V1Qp3Hxoycx03MV%2F-MaW3gqfzmQ2u3UQnAQp%2Fframework2.png?alt=media\&token=4f46ea6d-046f-46cf-b227-30658d9729cc)

当该插件提供功能时，通常会提供以Manager结尾的类，以提供相应的静态方法。

### 1. 以怪物对接为例

当你需要获取怪物类型时，调用方法。

```java
//获得怪物类型
MobManager.getMobType(theEntity);
```

其他同理，可在功能提供分类下了解详细。

## 三，本插件作为对接枢纽时

在某些情况下，该插件作为一个对接枢纽，如图所示。

![作为对接枢纽时，插件A作为服务提供商，插件B作为服务消费方](https://3954282708-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MaVvv247EKzjGB7gwi6%2F-MaVw01zXnIR9iHDm8cA%2F-MaW2dtYBsgoQZVHlecZ%2Fframework.png?alt=media\&token=b9aa434e-1ec8-4094-9b13-08c2ec31f09d)

### 1. 当你方作为服务提供商时

你只需实现需求接口，并注册即可。

### 2. 当你方作为服务消费者时

由上文可知，当它方插件作为服务提供商时，需要在ProviderManager中注册其服务，该服务是允许第三方获得的。

如下所示，你可以得到目标服务接口的实现类。

```java
//获取服务
//若返回为NULL，则代表该接口未被实现。
ITeamInfoProvider iTeamInfoProvider = ProviderManager.getProvider(ITeamInfoProvider.class);

//TODO 你的使用代码
```

至此，你完成了服务的调用。
