资源图标

[其他]VBYShop —— 一个商店插件 [2.1] 2022-07-31

没有下载许可
英文名称
VBYShop
来源
原创
API类型
TerrariaServerAPI
插件类型
  1. 经济
语言支持
  1. 简体中文
适用版本
  1. 1.4
前置Mod/插件
TShockAPI
开源地址
API版本
2.1
做的第一个插件,Progress是发的第一个插件,刚学的时候不知道做什么,想到Leader的shop的奇怪bug,就以模仿这个shop为目标而创建的这个插件,商店插件的话,论坛也有几个,不过除了Leader的shop都没用过,本插件对于其他插件的优缺点并不清楚,自己看着来吧
提示:NPC功能因为NPC.NewNPC参数原因仅适用于1436版本,虽说用TShock的方法生成NPC可以做到跨版本,但是这个没有控制生成的位置
这里内嵌了Progress,如果有使用我之前发布的Progress请移除,不然可能有问题
主要分成几个模块:
物品商店:购买物品
物品商店-系统商店:系统的商店,商品无限,符合条件可随意购买
物品商店-交易商店:玩家的商店,由玩家上架,一个商品只可购买一次
增益商店:购买增益和增益时间
生命商店:购买最大生命和额外恢复
NPC商店:购买NPC
方块商店:购买一些自然生成的方块
充值商店:使用物品购买货币

文件介绍:
配置目录:tshock/shop
配置文件:tshock/shop/config.json
数据存放:tshock/shop/shop.db
可选文件(翻译文件):ItemID.json,PrefixID.json,NpcID.json,BuffID.json

数据介绍:
使用sqlite数据库,文件名为shop.db,拥有以下内容

字段介绍:
通用字段:
Price 价格
Progress 进度检查文本
Zone 区域检查文本

表:ItemSystemShop(物品商店-系统)
Type 购买ID 和 买到的物品ID
Stack 物品数量
Prefix 前缀

表:ItemChangeShop(物品商店-交易)
BuyId 购买ID
PlayerName 出售者的名称
Type 不再作为购买ID
其余同ItemSystemShop

表:BuffShop(增益商店)
Type 购买ID 和 买到的增益ID
其余同ItemSystemShop

表:LifeShop(最大生命商店)
Start 购买此商品的最低血量
End 购买此商品的最高血量

表:HealShop(额外恢复商店)
同LifeShop,不过血量换成换成了恢复值
Start和End主要是做到涨价的目的(涨价什么的感觉写json更好,不过都用数据库了,就不塞json了)

表:NpcShop(NPC商店)
MaxStack 购买此商品时世界上同时存在此的NPC最大数量,0不检测

表:TileShop(方块商店)
Size 放置方块的大小,写法为x大小和y大小,目前只有两个值 22(暗影珠|猩红之心|花苞)和32(祭坛),用于确定放置时的大小
Style 方块的子类型

表:PayShop(充值商店)
Price 购买后给予玩家的货币数量
Prefix 物品要求的前缀 -1为任意
其余同ItemSystemShop

表:PlayerInfo(玩家数据)
PlayerId 一个ID值,自增,用作记录和使用命令修改数据时使用
PlayerName 玩家名称
Money 玩家的货币数量
HaveBuff 玩家已购买的Buff
OpenBuff 玩家已打开的Buff
BuffTime 增益给予的时间
HealStack 额外恢复数值,使用时会除以一百
SQL:
CREATE TABLE IF NOT EXISTS ItemSystemShop
( Type INTEGER(32) NOT NULL CHECK (Type >= 0), Stack INTEGER(32) NOT NULL DEFAULT 1 CHECK (Stack > 0), Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Prefix INTEGER(16) NOT NULL DEFAULT 0 CHECK (Prefix >= 0), Progress TEXT(128) NOT NULL DEFAULT '', Zone TEXT(128) NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS ItemChangeShop
( BuyId INTEGER(16) NOT NULL UNIQUE CHECK (BuyId >= 0), Type INTEGER(32) NOT NULL CHECK (Type > 0), Stack INTEGER(32) NOT NULL DEFAULT 1 CHECK (Stack > 0), Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Prefix INTEGER(16) NOT NULL DEFAULT 0 CHECK (Prefix >= 0), PlayerName TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS BuffShop
( Type INTEGER(16) NOT NULL CHECK (Type >= 0), Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Progress TEXT(128) NOT NULL DEFAULT '', Zone TEXT(128) NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS LifeShop
( BuyId INTEGER(16) NOT NULL UNIQUE, Start INTEGER(16) NOT NULL DEFAULT 100 CHECK (Start >= 0), End INTEGER(16) NOT NULL DEFAULT 400 CHECK (End <= 32767), Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Progress TEXT(128) NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS HealShop
( BuyId INTEGER(16) NOT NULL UNIQUE, Start INTEGER(16) NOT NULL DEFAULT 100 CHECK (Start >= 0), End INTEGER(16) NOT NULL DEFAULT 400 CHECK (End <= 32767), Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Progress TEXT(128) NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS NpcShop
( Type INTEGER(32) NOT NULL, Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), MaxStack INTEGER(16) NOT NULL DEFAULT 0 CHECK (MaxStack >= 0), Progress TEXT(128) NOT NULL DEFAULT '', Zone TEXT(128) NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS TileShop
( Type INTEGER(32) NOT NULL CHECK (Type >= 0), Size TEXT(16) NOT NULL DEFAULT '', Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Style INTEGER(16) NOT NULL DEFAULT 0 CHECK (Style >= 0), Progress TEXT(128) NOT NULL DEFAULT '', Zone TEXT(128) NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS PayShop
( Type INTEGER(32) NOT NULL CHECK (Type >= 0), Stack INTEGER(32) NOT NULL DEFAULT 1 CHECK (Stack > 0), Price INTEGER(64) NOT NULL DEFAULT 1 CHECK (Price >= 0), Prefix INTEGER(16) NOT NULL DEFAULT 0 CHECK (Prefix >= -1), Progress TEXT(128) NOT NULL DEFAULT '', Zone TEXT(128) NOT NULL DEFAULT ''
);

玩家信息存储于内存中,在玩家进入服务器后创建,退出服务器后保存,每隔10分钟会保存所有玩家的信息到数据库,无提示,服务器没有玩家后会关闭10分钟的计时,有新玩家之后才会重新开启
虽然所有进入服务器的玩家的信息都会自动保存于数据库,但是有的命令要求登录才能使用

配置文件:
JSON:
{ "指令": { "使用": { "权限": "vby.shop.use", "名称": [ "shop" ] }, "管理": { "权限": "vby.shop.admin", "名称": [ "shopctl" ] } }, "商店": { "物品": { "系统": { "开启": true, "系统显示格式": "ID:{type} {itemname} {price}{moneyname}/{stack}个", "玩家显示格式": "ID:{type} {itemname}[i/s{stack}:{type}] {price}{moneyname}/{stack}个", "进度": true, "区域": true }, "玩家": { "开启": true, "系统显示格式": "ID:{buyid} {itemname} {price}{moneyname}/{stack}个 出售者:{sellername}", "玩家显示格式": "ID:{buyid} {itemname}[i/s{stack}:{type}] {price}{moneyname}/{stack}个 出售者:{sellername}", "手续费": 0.01 } }, "充值": { "开启": true, "进度": true }, "生命": { "上限": { "开启": true, "进度": true }, "恢复": { "开启": true, "进度": true, "重生": true } }, "增益": { "开启": true, "进度": true, "区域": true, "重生": true, "刷新": true, "最大时间": 1800, "时间价格": 1000 }, "npc": { "开启": true, "进度": true, "区域": true, "生成": { "x": 0, "y": 0 }, "最大数量": 5, "间隔": 1 }, "方块": { "开启": true, "进度": true, "区域": true, "生成": { "x": 1, "y": 2 } } }, "货币": { "名称": "余额", "打击": { "开启": true, "排除": [] } }, "购买": { "进度提示": true, "区域提示": true }, "其它": { "服务器区域检查": false }
}
指令:权限和名称,名称不能为空,至少有个名字(不懂建议别用本插件)
系统显示格式:Server执行时使用的输出格式
玩家显示格式:游戏内执行时使用的输出格式
以上使用String.Format方法,运行后会对{type}这些替换成{0}等,有实力的可以直接写{0:-5}这些
系统商店替换:{type}, {stack}, {price}, {itemname}, {moneyname}
玩家商店替换:{buyid}, {type}, {stack}, {price}, {itemname}, {moneyname}, {sellername}
以上数据会按顺序替换成{0},{1}等
手续费:玩家商店的手续费
开启:true表示启用此命令
进度:true表示使用buy和list的时候会进行进度检测
区域:true表示使用buy和list的时候会进行区域检测
恢复-重生:true表示复活或使用回程类物品后会回复最大生命值一半的血量
增益-重生:true表示复活或使用回程类物品后会根据打开buff和时间给与buff
增益-刷新:未使用,想法是允许玩家手动刷新来获得增益,而不是只靠增益-重生
增益-最大时间:允许购买的最大增益时间
增益-时间价格:购买每秒增益消耗的货币
npc-生成:生成npc距离玩家中心的x和y偏移量
npc-最大数量:单次购买允许的最大数量
npc-间隔:购买的每个npc之间的生成间隔,整数,单位秒
方块-生成:相对于玩家左上角的方块放置检测偏移,不理解不建议改
货币-名称:货币的名称,会在各个list的时候显示
货币-打击:leader的shop的继承,打击npc会获得1点货币,排除列表内写npcId,这样打击指定npc的时候不会给
购买-提示:当尝试购买不符合条件的商品时,是否进行缺少条件提示(简陋.jpg)
服务器区域检查:当服务器使用list遇到区域检查的时候,返回true还是false

命令:
所有Buy命令的使用均要求登录
{}包裹的表示使用子命令需要的文本,<>包裹表示必写参数,[]包裹表示可选参数,[]内带 = 表示默认值
普通命令:Shop
  • Buff 增益商店(除list外皆要求登录) {b,buff}
    • Buy 购买 {b,buy} <ID> [ID2] [...] 购买指定ID的增益,购买后会自动打开,可填写多个
    • Close 关闭 {c,close} <ID> [ID2] [...] 关闭指定ID的增益,关闭后复活不会给予,可填写多个
    • List 列表 {l,list} 查看当前可购买列表
    • Open 开启 {o,open} 打开关闭的增益,打开后复活会给予
    • State 状态 {s,state} 查看增益购买打开和时间信息
    • Time 时间购买 {t,time} <num> 购买num秒时间
  • Change 玩家物品商店 {c,change}
    • Add 上架 {a,add} <Price> 以Price价格售卖当前手持物品(需要SSC)
    • Buy 购买 {b,buy} <ID> 购买指定ID的商品
    • Cancel 取消上架 {c,cancel} <all|buyid> 取消上架所有或指定BuyId的商品(发现代码当使用BuyId取消上架的时候不会删除商品信息,也就是可以无限取消,尚未修复)
    • List 列表 {l,list} 查看当前可购买列表
  • Item 系统物品 {i,item}
    • Buy 购买 {b,buy} <ID> [Stack = 1] 购买指定ID的商品Stack份,不写Stack时默认为1
    • List 列表 {l,list} 查看当前可购买列表
  • Life 生命相关 {l,life}
    • Heal 额外恢复 {h,heal}
      • Buy 购买 {b,buy} <ID> [Stack = 1] 购买指定ID的商品Stack份,不写Stack时默认为1
      • List 列表 {l,list} 查看当前可购买列表
    • Max 最大生命 {m,max}
      • Buy 购买 {b,buy} <ID> [Stack = 1] 购买指定ID的商品Stack份,不写Stack时默认为1
      • List 列表 {l,list} 查看当前可购买列表
    • Money 查看自己货币 {m,money}
    • Npc NPC商店 {n,npc}
      • Buy 购买 {b,buy} <ID> [Stack = 1] 购买指定ID的商品Stack份,不写Stack时默认为1,Stack最大值受config.json里npc-最大数量限制
      • List 列表 {l,list} 查看当前可购买列表
    • Pay 充值商店 {p,pay}
      • Buy 购买 {b,buy} <ID> [Stack = 1] 购买指定ID的商品Stack份,不写Stack时默认为1
      • List 列表 {l,list} 查看当前可购买列表
    • Tile {t,tile}
      • Buy 购买 {b,buy} <ID> 购买指定ID的商品,购买方块的右下角基于config.json里方块-生成对玩家左上角坐标的偏移,会进行检查,要求玩家购买时不能移动,玩家高度不能超过3格,购买大小之内没有任何的墙和方块,液体未检测,并无脚下方块检测,不过脚下方块会影响是否放置成功,也就脚下方块不对的情况和,买了,但是没效果,请自行寻找合适的地方放置
      • List 列表 {l,list} 查看当前可购买列表
管理命令:ShopCtl
  • Add 添加商品(因为Zone字段是后来添加的,但是Add还是添加之前的,估计使用有问题,不建议使用) {a,add}
    • Item 添加系统商品
    • Change 添加玩家商品(一次性)
    • NPC 添加NPC商品
  • Check 查看玩家数据 {ch,check}
    • Name 查看指定名称玩家 {n,name} <name> 玩家不在线时会查找数据库
    • ID 查看指定ID玩家 {i,id} <index|PlayerId> 玩家在线时使用 /who -i 输出的index,不在线时使用 /shopctl l p 输出的PlayerId
  • Clear 清空数据 {cl,clear}
    • ChangeShop 清空玩家商店 {c,changeshop}
    • Money 清空玩家货币 {m,money}
    • NpcShop 清空NPC商店 {n,npcshop}
    • SystemShop 清空系统商店 {s,systemshop}
    • PlayerInfo 清空玩家数据 {p,playerinfo}
  • Del 根据输入的Type删除系统商品 {d,del} <ID> [ID2] [...]
  • Edit 修改数据 {e,edit}
    • LifeMax 修改玩家最大生命(因为最大生命不在PlayerInfo表,所以只修改在线玩家) {l,lifemax}
      • Name 查找玩家名称 <name> <num> 修改名称为name的玩家的最大血量为num
      • ID 查找玩家Index <index> <num> 修改Index为<index>的玩家的最大血量为num
    • Money 修改玩家货币 {m,money}
      • Name 查看指定名称玩家 {n,name} <name> <money> 修改名称为name的玩家的货币为money,不在线时会查找数据库
      • ID 查看指定ID玩家 {i,id} <index|PlayerId><money> 修改指定ID的玩家的货币数量为money,玩家在线时使用 /who -i 输出的index,不在线时使用 /shopctl l p 输出的PlayerId
    • Price 修改物品价格 {p,price} <Type> <Price> [Stack] 修改系统物品商店商品的价格,写Stack的时候会修改Stack
  • List 列出一些数据 {l,list}
    • PlayerId 查看玩家在数据库的ID {p,playerid}
    • onlineplayerindex 已废弃,但是帮助文本未删
  • State json序列化输出在内存中的config {s,state}

Progress字段文本:
使用Progress命令输出的Index值作为文本,以英文逗号分隔,当为 0 或者 空字符串 时Progress检测成功,| 符号表示或者,- 符号表示反义, , 符号(英文逗号)可以理解为和
例子1:1 要求击败 史莱姆王
例子2:1,2,3 要求击败 史莱姆王,克苏鲁之眼,世吞或者脑子
例子3:1|2,3 要求击败 史莱姆王或克苏鲁之眼,世吞或者脑子
例子4:1|2,-3 要求击败 史莱姆王或克苏鲁之眼,未击败世吞或者脑子
Zone字段文本:
和Progress字段相似,不过检测内容更换
代码:
Select Case checks
Case "", "0" result = True
Case "1" result = .ZoneDungeon'地牢
Case "2" result = .ZoneCorrupt'腐化
Case "3" result = .ZoneHallow '神圣
Case "4" result = .ZoneMeteor'流星
Case "5" result = .ZoneJungle'丛林
Case "6" result = .ZoneSnow'雪原
Case "7" result = .ZoneCrimson'猩红
Case "8" result = .ZoneWaterCandle'水蜡烛
Case "9" result = .ZonePeaceCandle'和平蜡烛
Case "10" result = .ZoneTowerSolar'日耀
Case "11" result = .ZoneTowerVortex'星漩
Case "12" result = .ZoneTowerNebula'星云
Case "13" result = .ZoneTowerStardust'星尘
Case "14" result = .ZoneDesert'沙漠
Case "15" result = .ZoneGlowshroom'蘑菇
Case "16" result = .ZoneUndergroundDesert'地下沙漠
Case "17" result = .ZoneSkyHeight '天空
Case "18" result = .ZoneOverworldHeight '地表
Case "19" result = .ZoneDirtLayerHeight '地下(泥土层)
Case "20" result = .ZoneRockLayerHeight '洞穴(岩石层)
Case "21" result = .ZoneUnderworldHeight '地狱
Case "22" result = .ZoneBeach '沙滩(海洋)
Case "23" result = .ZoneRain '雨
Case "24" result = .ZoneSandstorm '沙尘暴
Case "25" result = .ZoneOldOneArmy '旧日军团
Case "26" result = .ZoneGranite '花岗岩
Case "27" result = .ZoneMarble '大理石
Case "28" result = .ZoneHive '蜂巢
Case "29" result = .ZoneGemCave '宝石洞穴
Case "30" result = .ZoneLihzhardTemple '神庙
Case "31" result = .ZoneGraveyard '墓地
Case Else result = False
End Select
不过这里的我没有全部测试,就测试了天空和地狱什么的,宝石洞穴那个搞不懂是哪里,其他顾名思义

配置文件重载:
已加入TShock的reload事件

其它:
有人想拿这个缝点什么东西的,本插件是VBY.Shop命名空间下的Shop类,具有静态字段
VBYShopPlayer[] Players —— 和TShock.Players类似的Players
SqliteConnection SqlConnection —— 插件连接sqlite数据库使用的连接,不过不是open常驻,使用的时候记得open和close
bool ZoneCheckPlayerIsNull —— 区域检查当传入的Player为null时返回的值,由config.json中的 服务器区域检查 设置
作者
wtufta
价格
1枚
下载
13
查看
269
首次发布
最后更新
评分
0.00 星 0 人评分

* 这是一则由 Google AdSense 自动推荐的广告,与本站无关,不对其真实性与可靠性负责

顶部