byxiaobai
本帖最后由 byxiaobai 于 2022-12-4 13:44 编辑


这是TabooLib的使用教程。

阅读本篇教程的前置条件:1.java基础 2.能开发简单的bukkit插件

本教程正在更新,目前不是完整教程







byxiaobai
本帖最后由 byxiaobai 于 2022-12-4 13:23 编辑

待更新:HostSQLite部分

1.HostSQL&datasource使用HostSQL可以连接MySQL数据库
  1. val host by lazy{
  2.         HostSQL(
  3.             SQLSettings.mySqlIp,
  4.             SQLSettings.mySqlPort.toString(),
  5.             SQLSettings.mySqlUserName,
  6.             SQLSettings.mySqlPassword,
  7.             SQLSettings.mySqlDatabaseName
  8.         )
  9.     }


  10.     val dataSource by lazy { host.createDataSource() }
复制代码
示例Table

  1. @SkipTo(LifeCycle.LOAD)
  2. object RpgAttributeTable {

  3.     val host = SQLData.host
  4.     val dataSource= SQLData.dataSource

  5.     val table by lazy{
  6.         Table(SQLSettings.PREFIX+"RpgAttribute", host) {
  7.             add { id() }
  8.             add("PlayerName") {
  9.                 type(ColumnTypeSQL.VARCHAR, 64) {
  10.                     options(ColumnOptionSQL.KEY)
  11.                 }
  12.             }
  13.             add("AttributeName") {
  14.                 type(ColumnTypeSQL.VARCHAR, 64)
  15.             }
  16.             add("ChangeValue") {
  17.                 type(ColumnTypeSQL.DOUBLE)
  18.             }
  19.         }
  20.     }

  21.     fun init() {
  22.         table.createTable(dataSource)
  23.     }


  24.     fun addData(playerName: String, attributeName: String, changeValue: Double) {
  25.         submit(async = true) {
  26.             val nowValue= getValue(playerName,attributeName)
  27.             val newValue=nowValue+changeValue
  28.             updateOrInsert(playerName,attributeName,newValue)
  29.         }
  30.     }

  31.     fun clear(){
  32.         submit(async = true) {
  33.             table.delete(dataSource){}
  34.         }
  35.     }

  36.     fun getStringList(playerName: String, callBack: CallBack<List<String>?>) {
  37.         submit(async = true) {
  38.             val list=table.select(dataSource){
  39.                 where("PlayerName" eq playerName)
  40.             }.map {
  41.                 val attributeName=getString("AttributeName")
  42.                 val changeValue=getDouble("ChangeValue")
  43.                 "$attributeName $changeValue"
  44.             }
  45.             callBack.call(list)
  46.         }
  47.     }

  48.     fun getKeys(callBack: CallBack<Set<String>>) {
  49.         submit(async = true) {
  50.             val list=table.select(dataSource){
  51.             }.map {
  52.                 getString("PlayerName")
  53.             }
  54.             val set=HashSet<String>()
  55.             for(str in list){
  56.                 set.add(str)
  57.             }
  58.             callBack.call(set)
  59.         }
  60.     }

  61.     private fun getValue(playerName: String, attributeName: String):Double{
  62.         return table.select(dataSource){
  63.             where("PlayerName" eq playerName)
  64.             where("AttributeName" eq attributeName)
  65.         }.firstOrNull {
  66.             getDouble("ChangeValue")
  67.         }?:0.0
  68.     }

  69.     private fun hasData(playerName: String, attributeName: String):Boolean{
  70.         return table.select(dataSource){
  71.             where("PlayerName" eq playerName)
  72.             where("AttributeName" eq attributeName)
  73.         }.find()
  74.     }

  75.     private fun updateOrInsert(playerName: String, attributeName: String,newValue:Double){
  76.         if(hasData(playerName,attributeName)){
  77.             table.update(dataSource){
  78.                 where("PlayerName" eq playerName)
  79.                 where("AttributeName" eq attributeName)
  80.                 set("ChangeValue",newValue)
  81.             }
  82.         }else{
  83.             table.insert(dataSource,"PlayerName","AttributeName","ChangeValue"){
  84.                 value(playerName,attributeName,newValue)
  85.             }
  86.         }

  87.     }

  88. }
复制代码


2.HostSQLite
使用HostSQLite可以连接本地文件数据库



byxiaobai
本帖最后由 byxiaobai 于 2022-12-7 10:54 编辑

待更新:
1.插件主类与获取BukkitPlugin
2.插件依赖
3.taboolib的适用条件与taboolib的本质属性
5.Demo插件本体
6.补充内容: Demo插件项目源码(GitHub);taboolib源码地址;推荐书籍(kotlin)

项目快速生成器:https://get.tabooproject.org/







byxiaobai
配置文件模块

byxiaobai
无实体寻路模块

byxiaobai
语言文件模块

byxiaobai
本帖最后由 byxiaobai 于 2022-12-4 13:34 编辑

taboolib的常见BUG
1.arclight下不能使用module-configuration
2.不支持1.7.10

byxiaobai
占楼待用。。。

byxiaobai
占楼待用。。。

byxiaobai
占楼待用。。。

byxiaobai
本帖最后由 byxiaobai 于 2022-12-7 10:54 编辑

前置知识

1.为什么要用kotlin和taboolib
    Kotlin的特性使得你能够更高效率地开发插件,同时保证代码的正确性。
    而Taboolib封装了许多常用工具,如配置文件、数据库等。
    比如,在java下需要new BukkitRunnable然后runTaskLater才能实现延时执行方法。
    但在Taboolib下,你只需要使用一行submit{}即可完成这一任务。


2.maven与gradle的基本概念
    ①maven:


    ②gradle:




天命_怨天
收藏一下,等楼主大力更新

2000000
好东西 (喜
占个楼等更新

楚儿
等个更新~

楚儿
催更一下。

Yc_Usay
6啊,作者666666

lzylzylzyl
666太好了太棒了