pXiaoD
本帖最后由 pXiaoD 于 2023-11-6 21:52 编辑

UltimateShop 使用教程
插件介绍贴:https://www.mcbbs.net/thread-1468190-1-1.html

第一章:基础使用1.插件文件结构欢迎您使用UltimateShop插件。在安装到服务器的plugins文件夹后,您应该会看到如下几个文件:config.yml,这是插件主要的配置文件。message.yml,这是插件的语言文件。datas文件夹,会在插件首次启动后生成(如果使用了数据库储存,则不会生成),储存插件的数据信息,随意修改这里的内容可能导致插件无法正常运行。items文件夹,会在首次保存自定义物品后生成(如果从未保存过自定义物品,则不会生成),随意修改这里的内容可能导致插件无法正常运行。shops文件夹,会在插件首次启动后生成,储存商店的配置信息。使用者需要修改这里的文件以制作自己心仪的商店。menus文件夹,会在插件首次启动后生成,储存菜单的配置信息。使用者需要修改这里的文件以制作自己心仪的菜单。

2.从制作一个最简单的商店开始在UltimateShop首次启动后,你应该会在服务端根目录下的/plugins/UltimateShops/shops文件夹中找到crops.yml,本次旅程将从这个文件开始。shops文件夹内储存的商店配置信息,你可以在UltimateShop中创建无数多的商店。每个单独yml的文件就是一个单独的商店,商店的ID就是文件的名称(不含文件后缀,如crops.yml文件的商店ID就是crops)。不同于其他商店插件,本插件的商店仅对应一个菜单,一个菜单仅对应一个游戏内GUI(如需多页商店,请阅读后文)。我们注意到该文件的开头部分是这个样子的:








settings是一个一级配置选项key,其下由若干二级配置选项组成,如这里的menu,buy-more等。在本文中,如果要说明你要修改settings下的menu选项,则会用settings.menu代表(settings和menu之间用一个英文的句号.表示),这个特点,后文将不再赘述。各二级配置选项的作用如下:menu:该商店使用到的菜单ID。这个选项是可选的,在本文中,如果说明这个选项是可选的,那么就代表你可以直接将这一行删掉。例如,该文件的开头部分我们可以直接改成这个样子:









如果你将这个选项删除,则代表这个商店没有对应的菜单,则玩家无法打开这个商店的GUI。玩家只能通过:1./shop quickbuy和/shopquicksell 指令快速购买或者回收商店里的商品。2.使用/shop sellall或者一键回收棒等手段一键回收商品,回收时会检测到这个商店。3.菜单中的buy,sell,sellall等动作。在本使用教程编写时,玩家可以购买或者回收未分配菜单的商店中的商品的方式就有如上几种,随着插件版本不断迭代更新,后续可能会存在其他方式,因此请以插件的更新记录为辅助。buy-more:该商品里的商品是否可以选择数量购买(即玩家Shift+右键无法打开选择物品数量的菜单)。可选。各个商品的配置中也有这个选项,因此这个选项也是可以删除的。如果未设置该选项,商品里也没有buy-more选项,则默认开启。
shop-name:该商店的名称。商店的名称一般会在变量符{shop-name}中使用到,作用就是显示给玩家这个商店的名称。例如这里我们设置的是'Crops page.1',翻译过来就是农作物 第1页的意思。可选。如果未设置该选项,则默认将商店的ID(即文件名称)作为显示名称。send-message-after-buy:在玩家尝试购买或者回收该商品时是否向玩家显示购买成功的提示。可选。如果未设置该选项,则默认开启。
在settings一级选项的后面是items一级选项,就像这个样子:








因篇幅所限,我们只筛选了一部分内容作为展示。我们可以看到items一级选项下由若干个不明要素的字符作为二级选项key的元素组成。例如这里的二级选项的key是A。A就是商品的ID,如果你需要在菜单中显示这个商品,则商品的ID必须是一个字符。(a-z,A-Z,0-9等,已经大于原版箱子54格的所需了)否则,你可以随心所欲的设置商品的ID,只是它们将不能再显示到商店UI中了,不过你仍可以在菜单中手动添加它们,后文详细说明。在这个名字为A的二级选项中又有若干个三级选项,这里删除了crops.yml本来存在的一些三级选项,因为这里的目标是制作一个最简单的商店。很明显,这些三级选项设置的内容都只为ID为A的这一个商品有效price-mode:该商品的价格模式。可选。如果未设置该选项,则默认是ANY。product-mode:该商品的货物模式。可选。如果未设置该选项,则默认是ANY。products:该商品的货物。可选。如果未设置该四级选项,则默认该商品购买后不会获得任何东西,也无法参与回收。(如果想要在菜单显示该商品,则products和display-item必须有一个存在,display-item的选项功能会在后文介绍)buy-prices:该商品的购买价格。可选。如果未设置该四级选项,则该商品无法购买,只能回收。(如果想要该商品免费,将amount设置为0,价格类型为任意一种即可)sell-prices:该商品的回收价格。可选。如果未设置该四级选项,则该商品无法回收,只能购买。
以上对于这些三级选项的介绍还不是很清楚,你只需要目前了解大概即可。在items一级选项的后面还有一个buttons一级选项,将在下一节介绍,该一级选项是可选的。
3.商店的另一个好伙伴:菜单前文已经提及,menus文件夹储存菜单信息,打开该文件夹,我们会发现若干个不明觉厉名称的文件。在第二节中,我们得知了商店的文件中的settings.menu选项作用是指定商店使用的菜单ID,因此我们打开这个文件夹下的example-shop-menu.yml文件作为进一步讲解的模板。跟商店一样,example-shop-menu.yml文件对应的菜单的ID是example-shop-menu。每个菜单对应一个游戏内的GUI,不支持多页。该文件中由如下一级选项组成:title:GUI内的标题(显示在顶上的)。可选。如果未设置,各种不同的类型的菜单显示的默认值不一样。这里的菜单类型是商店类型,如果这个选项不存在的话,会自动设置为商店的显示名称。size:GUI的大小,只能是9,18,27,36,45,54中的一个值,不对应则插件报错。可选。如果未设置,默认设置为54。layout:GUI的排版。用过TrMenu的应该会了解。在这里放置商品的ID或者按钮的ID,你可以放置不明觉厉的字符代表对应的格子的空的。(按钮会在后文提及,上文已经提及,商品的ID如果要显示在菜单里面只能是一个字符,这里就是答案,如果商店的ID是多个字符,则无法塞进layout中表示其显示的格子)conditions:菜单的条件,即打开该菜单需要的条件,在此示例中没有体现。buttons:GUI内的按钮。buttons下可以设置如下子选项:display-item(类似商品的展示物品),actions(点击执行的动作),conditions(执行动作的条件)。

菜单有3种类型,上文已经介绍了第一种,下面介绍其他两种。商店菜单。在商店的settings.menu指定用到的菜单会被视为商店类型菜单。商店菜单跟普通菜单几乎一样,只是layout会额外加载有将这个字符作为ID的商品。普通菜单。跟普通菜单插件几乎一样。选择数量菜单。默认情况下玩家可以使用Shift+右键商品图标选择购买或者回收的数量。打开的GUI就是选择数量菜单生成的,选择数量菜单可以在config.yml中的menu.buy-more.menu选项指定,默认是buy-more,也就是menus文件夹中的buy-more.yml。选择数量菜单对应的菜单文件不能删除,如要关闭选择菜单功能,请使用前文已经提及的存在于商店或者商品配置中的buy-more选项。









4.商品的显示物品,货物和价格第二节对于商品还有一些“小尾巴”未提及,本节将介绍一下。
展示物品首先提及一个可以在商品配置中设置的新的三级选项:display-item。在products选项中,我们可以看到其下有一个key为1的四级选项,四级选项下再有其对应代表的货物,这意味着一个商品可以有多个货物,到底哪个显示在菜单里供玩家查看呢?display-item的功能就此体现。








仍以crops.yml为例,我们添加display-item选项后,它长上面这个样子。可以看出,display-item可以视为同级下的products.1(或者是2,3,4…?)选项,它是独立于products选项的一个Minecraft物品,用于显示在菜单中,同时display-item的物品名称也会显示在{item}变量符中。例如,在第二节的示例中,玩家购买了这个商品后,游戏会提示“成功购买了1个WHEAT,花费了2 Coins。”这是因为作为货物的原版Minecraft物品不存在物品名称,插件自动将它的ID作为物品名称显示给玩家,而在这里,设置好名称是小麦以后,玩家再次购买将会提示“成功购买了1个小麦,花费了2 Coins。”显示物品与实际货物不一致可以让UltimteShop变为一个“欺诈商店”,你可以在商店中设置货物(products)选项的物品数量(amount)是1,而在显示物品(display-item)选项的物品数量设置为2,这样玩家以为自己购买的是2个小麦,其实是1个。display-item选项下可以设置新的四级选项modify-lore,代表这个显示物品是否自动添加价格,限制,冷却时间等商品信息,改为false则是不添加。添加的信息可以在config.yml中的display-item.add-lore中设置。该选项是可选的,你也可以不设置该选项,如果不设置,在config.yml中的display-item. auto-set-first-product为true的情况下,自动从所有货物中筛选出一个可以显示在菜单中的货物作为显示物品。
物品格式和经济格式products,buy-prices,sell-prices下可设置无数多的子级选项,也就是说一个商品可以有多个货物和价格。每个子级选项下使用物品格式或者经济格式。物品格式:material: wheat #物品IDname: 小麦 #物品名称,支持颜色代码lore: # 物品Lore,支持颜色代码  - '第一行Lore'  - '第二行Lore'damage: 5 #物品消耗的耐久值skull: xxx #头颅材质(material需要为PLAYER_HEAD)unbreakable: true #物品是否不可破坏custom-model-data: 1 #物品的custom-model-data值enchants: #物品原版附魔  ARROW_FIRE: 2  DURABILITY: 3  #附魔ID: 附魔等级   #支持EcoEnchants,ExcellentEnchants等注册原版的附魔插件  #这个选项不支持AdvancedEnchantments等非原版附魔插件plugin-enchants: #物品插件附魔  PLANTER: 1  #附魔ID: 附魔等级  #仅支持AdvancedEnchantments附魔插件  #该功能仅付费版插件可用stored-enchants: #附魔书中的附魔(material需要为ENCHANTED_BOOK)  ARROW_FIRE: 1flags: [HIDE_ATTRIBUTES, HIDE_POTION_EFFECTS] #物品标签glow: true #是否发光spawner: ZOMBIE #刷怪笼刷出的生物(material需要为SPAWNER)以上只是对于物品格式做出常用介绍,还有其他的请到插件Wiki查看。
保存物品:将物品格式中的material后填写的(原版)物品ID改为填写保存物品的ID即可。插件保存的物品储存在saves文件夹下,其ID就是不含后缀的文件名称,例如superior_sword.yml的对应物品ID是superior_sword。你可以使用指令/shop saveitem 来保存手上的物品到插件中。
第三方插件挂钩:如果要使用第三方插件的物品,可以使用hook-plugin和hook-item选项替代material选项。其中hook-plugin代表插件名称,区别大小写,必须和插件实际名称一模一样;hook-item代表物品ID,区别大小写。截至本教程编写时,hook-plugin选项支持eco,EcoItems,EcoArmor,MMOItems,ItemsAdder,Oraxen,NeigeItems,MythicMobs。不同的插件hook-item有所区别:如果是MMOItems,你应该按照物品类别;;物品ID的格式填写,例如hook-item: AXE;;TEST_AXE。如果是EcoArmor,你应该按照套装ID;;部位的格式填写,例如 hook-item: SUPER;;HELMET。如果是ItemsAdder,你应该按照物品命名空间:物品ID的格式填写,例如hook-item: blocks:damaged_stone。其他物品插件则直接填写物品ID即可。
来自第三方的插件同样适用于以上物品格式,例如你可以给来自MMOItems的TEST_AXE物品添加耐久附魔出售,那就是:








经济格式:经济格式非常简单,仅由economy-plugin和economy-type组成。economy-plugin代表使用到的经济插件的名称,大小写区别,必须与实际想要使用的插件名字一致。如果要使用原版的经验值或者等级,则不需要设置这个选项,将这个选项删除。截至本教程编写时,economy-plugin选项支持Vault,GamePoints,PlayerPoints,CoinsEngine,UltraEconomy,EcoBits,PEconomy,RedisEconomy,RoyaleEconomy。economy-type代表使用到的经济类型,原版经验值请填写exp,原版等级请填写levels,经济插件则分为两种情况,如果该插件是仅一个货币(如Vault等),则不需要设置这个选项,将这个选项删除,否则请填写货币ID。
货物模式和价格模式货物模式和价格模式都支持ANY,ALL,CLASSIC_ANY,CLASSIC_ALL四种(均大写)。这几个模式的区别见下表:   模式      ANY      ALL      CLASSIC_ANY      CLASSIC_ALL     玩家购买商品    在满足条件的商品中,随机选择一个给玩家。    .给玩家所有的商品。    同 ANY。    同 ALL。    玩家回收商品    从第一个到最后一个,最先发现玩家拥有的商品    玩家必须拥有所有的商品才能回收    同 ANY。    同 ALL。    购买商品后的收钱方式    从第一个到最后一个,最先发现玩家能够满足要求且生效的价格    玩家必须满足所有价格才能购买此商品    同 ANY。    同 ALL。    回收商品后的给钱方式    从第一个到最后一个,最先发现玩家能够满足条件且生效的价格    会给予玩家所有的价格    同 ANY。    同 ALL。    价格    支持实时动态价格 & 使用apply选项。    同 ANY。    玩家每次购买的价格必须一模一样,也就说不支持前面的巴拉巴拉。    同  CLASSIC_ALL。    消耗性能    当你的服务器有大量玩家,又同时有大量的购买/回收需求时,可能造成性能消耗高。    同 ANY。    低,就和其他的商店插件一样。    同  CLASSIC_ALL。   简单而言,带有CLASSIC前缀的模式和不带的模式价格计算方式不一样。前者是乘法,后者是加法。例如你要购买5个面包,面包单价是10元,那么前者是5+5+5+5+5+...+5,后者是 5x10。前者因为是相加关系,每次相加的数字可以不一样,后者因为是相乘关系,相乘过程中数字无法发生变动。
价格的子选项在buy-prices和sell-prices下,可以设置如下的子选项(这些子选项和你所设置的物品格式和经济格式的同级的)。start-apply:这个价格在第几次购买或者回收后开始生效。不设置的话,则默认第0次开始就有效(即从未购买时即生效)。end-apply:这个价格在第几次购买或者回收后开始失效。不设置的话,即默认永不失效。apply:这个价格生效的对应购买或者回收次数(格式是apply: [0,1,2,3])。不设置的话,即默认永久生效。placeholder:这个价格显示在{price}变量符中的名称,也就是价格的名称,不设置的话,则显示语言文件中的未知价格。conditions:这个价格生效的条件。

第一页 上一页 下一页 最后一页