• 👋 好久不见,老朋友,序序新:964014008
资源图标

[其他]VBYShop —— 一个商店插件 [2.1] 2022-09-05

没有下载许可
英文名称
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枚
下载
110
查看
3,051
首次发布
最后更新
评分
0.00 星 0 人评分

来自wtufta的更多资源

最新更新

  1. 更新前瞻,插件没更新

    更新到1.0.0.3,别问我为什么没有1.0.0.2,问就是发过,但是不在这里 不写更新了什么,直接写新的文档(因为我都不知道我更新了什么,一些比较重要的可能会提)...
  2. 更新

    1、全部表都使用BuyId作为购买ID,不再是个别Type个别BuyId 2、ShopCtl Add 子命令修改:可以添加除Playerinfo以外所有表的数据 Del...
顶部