TShock中文插件库TShock中文插件库
插件文档
插件开发
其他文档
  • 简体中文
  • en-US
GitHub
插件文档
插件开发
其他文档
  • 简体中文
  • en-US
GitHub
  • TShock插件の仓库
  • AIChatPlugin AI聊天插件
  • AdditionalPylons 放置更多晶塔权
  • AnnouncementBoxPlus
  • AutoAirItem 自动垃圾桶插件
  • AutoBroadcast 自动广播
  • AutoClassificationQuickStack 便捷分类箱子
  • Autoclear 智能自动扫地
  • AutoFish 自动钓鱼
  • AutoPluginManager 自动更新插件
  • AutoReset 完全自动重置插件
  • AutoStoreItems 自动储存
  • AutoTeamPlus 更好的自动队伍
  • Back 回到死亡点
  • BagPing 地图上标记宝藏袋
  • BanNpc 阻止怪物生成
  • BedSet 设置重生点
  • BetterWhitelist 更好的白名单
  • BridgeBuilder 快速铺桥
  • BuildMaster 豆沙小游戏·建筑大师
  • CGive 离线命令
  • CNPCShop 自定义NPC商店
  • CaiBotPlugin Bot适配插件
  • CaiBotLitePlugin 官方机器人适配插件
  • CaiCustomEmojiCommand 自定义表情命令
  • CaiLib Cai的工具库(废弃)
  • CaiPacketDebug 数据包调试
  • CaiRewardChest 奖励箱
  • Challenger 挑战者模式
  • Chameleon 进服前登录
  • ChattyBridge 聊天桥
  • ChestRestore 无限宝箱和禁止箱子改名
  • yaaiomni
  • ConsoleSql 控制台SQL
  • ConvertWorld 击败怪物替换世界物品
  • CreateSpawn 出生点建筑
  • CriticalHit 打击文字提示
  • Crossplay 跨版本支持
  • CustomMonster 自定义怪物血量
  • DTEntryBlock 阻止进入地牢或神庙
  • DamageRuleLoot 伤害规则掉落
  • DamageStatistic 伤害统计
  • DataSync 进度同步插件
  • DeathDrop 死亡掉落
  • DisableMonsLoot 禁怪物掉落
  • DonotFuck 禁止脏话
  • Dummy 假人
  • DumpPluginsList
  • DumpTerrariaID 输出 TerrariaID
  • DwTP 定位传送插件
  • Economics.Core 插件[经济套件核心]
  • Economics.Deal 交易插件
  • Economics.NPC 插件 自定义怪物奖励
  • Economics.Projectile 自定义弹幕
  • Economics.RPG 职业插件
  • Economics.Regain 回收物品插件
  • Economics.Shop 商店插件
  • Economics.Skill 技能插件
  • Economics.Task 任务插件
  • Economics.WeaponPlus 武器强化EC版
  • EndureBoost 拥有指定数量物品给指定buff
  • EssentialsPlus
  • Ezperm 便捷权限
  • FishShop 鱼店
  • GenerateMap 将地图保存至图片
  • GolfRewards 高尔夫奖励
  • Goodnight 宵禁
  • HardPlayerDrop 硬核死亡掉生命水晶
  • HelpPlus 更好的帮助
  • History 记录图格操作
  • HouseRegion 圈地插件
  • InvincibilityPlugin 限时无敌
  • ItemBox 物品盒子
  • ItemDeco 手持物品显示
  • ItemPreserver 物品不消耗
  • JourneyUnlock 解锁旅途物品
  • Lagrange.XocMat BOT适配插件
  • LazyAPI 基础库
  • LifemaxExtra 提升生命值上限
  • ListPlugins 查看插件列表
  • Maptp 双击大地图传送
  • MiniGamesAPI 豆沙小游戏API
  • ModifyWeapons 修改武器插件
  • MonsterRegen 怪物进度回血
  • MusicPlayer 简易音乐播放器
  • Noagent 反代理插件
  • NormalDropsBags 普通难度掉落宝藏袋
  • 留言墙 NoteWall
  • Online Gift Package 在线礼包
  • PacketsStop 数据包拦截
  • PerPlayerLoot 独立战利品箱子
  • PermaBuff 永久Buff
  • PersonalPermission 玩家单独权限
  • Platform 判断玩家设备
  • PlayerManager 玩家管理器
  • PlayerRandomSwapper 玩家位置随机交换
  • PlayerSpeed 玩家速度插件
  • ProgressBag 进度礼包
  • ProgressControl 计划书
  • ProgressRestrict 超进度检测
  • ProxyProtocolSocket
  • pvper 决斗系统
  • QRCoder 二维码生成器
  • RainbowChat 彩虹聊天
  • RandReSpawn 随机出生点
  • RandomBroadcast 随机广播
  • ReFishTask 刷新渔夫任务
  • RealTime 现实时间
  • RebirthCoin 复活币
  • RecipesBrowser 合成表
  • RegionView 区域显示
  • Respawn 原地复活
  • RestInventory 提供 Rest 查背包接口
  • ReverseWorld 世界反转和全图放置地雷
  • RolesModifying 修改玩家背包
  • Sandstorm 切换沙尘暴
  • ServerTools 服务器工具箱
  • SessionSentinel 踢出长时不发包玩家
  • ShortCommand 简短指令
  • ShowArmors 展示装备
  • SignInSign 告示板登录
  • SimultaneousUseFix 解决卡双锤卡星旋机枪之类的问题
  • Smart Regions 智能区域
  • SpawnInfra 生成基础建设(开服自动基建)
  • SpclPerm 服主特权
  • StatusTextManager 模板文本管理器
  • SurfaceBlock 禁止地表弹幕
  • SurvivalCrisis 类among us小游戏
  • SwitchCommand 开关指令
  • TeleportRequest 传送请求
  • TimeRate 时间加速插件
  • TimerKeeper 保存计时器状态
  • TownNPCHomes NPC快速回家
  • TransfersPatch 翻译工具
  • UnseenInventory 允许生成“无法获取”的物品
  • VBY.Common VBY通用库
  • VBY.GameContentModify 游戏内容修改
  • VBY.OtherCommand 辅助命令
  • VBY.PluginLoader VBY插件加载器
  • VBY.PluginLoaderAutoReload VBY自动重载
  • VeinMiner 连锁挖矿
  • VotePlus 多功能投票
  • WeaponPlusCostCoin 武器强化钱币版
  • Terraria中文Wiki语言包加载器
  • WorldModify 简易的世界修改器
  • ZHIPlayerManager zhi的玩家管理插件

Economics.Skill 技能插件

  • 作者: 少司命
  • 出处: 无
  • 一个可以释放技能的插件

注

需要安装前置插件:EconomicsAPI、Economics.RPG (本仓库)
使用AI样式功能可能会造成占用大量带宽量力而为

配置注意事项

  • 触发模式中 击杀 击打 主动 三个模式,其中任意两个都无法组合,击杀 击打 本身就是主动的体现。

触发模式

  • CD 主动 打击 击杀 死亡 血量 蓝量 冲刺 装备 跳跃 BUFF 技能 环境

指令

语法权限说明
/skill buy [技能索引]economics.skill.use购买技能
/skill del [技能索引]economics.skill.use解绑技能
/skill mseconomics.skill.use查看已绑定技能
/skill delalleconomics.skill.use解绑手持武器的所有技能
/skill cleareconomics.skill.use解绑所有技能
/skill reseteconomics.skill.admin重置技能
/skill give [玩家] [技能索引]economics.skill.admin给予玩家技能(不安全的,此指令不会检查玩家技能情况)
/skill del [玩家] [技能索引]economics.skill.admin移除目标玩家技能
/skill clearh [玩家]economics.skill.admin移除玩家所有隐藏技能

进度限制

Economics文档:进度限制值

配置

配置文件位置:tshock/Economics/Skill.json

{
  "绑定技能最大数量": 6,
  "单武器绑定最大技能数量": 6,
  "禁止拉怪表": [],  //填写npcid
  "禁止伤怪表": [],  //填写npcid
  "最大显示页": 20,
  "技能列表": [
    {
      "名称": "测试技能",
      "喊话": "",
      "技能唯一": false,
      "全服唯一": false,
      "隐藏": false,
      "技能价格": [  //此技能价格需要根据EconomicsAPI调整
        {
          "数量": 0,
          "货币类型": "经验"
        }
      ],
      "限制等级": [], //填写RPG插件等级,此限制会检测并包含父等级
      "限制进度": [], //填写进度
      "限制技能": [], //技能序号
      "事件循环": {
        "循环间隔": 10,
        "循环次数": 1,
        "弹幕循环": [
          {
            "运行累计触发": 1,
            "运行区间始": 1,
            "运行区间终": 1,
            "弹幕ID": 0,
            "伤害": 0,
            "击退": 0.0,
            "角度": 0,
            "X轴起始位置": 0,
            "Y轴起始位置": 0,
            "X轴速度": 0.0,
            "Y轴速度": 0.0,
            "自动方向": true,
            "持续时间": -1,
            "动态伤害": false,
            "AI": [
              0.0,
              0.0,
              0.0
            ],
            "速度": 0.0,
            "更新事件": [],
            "生成事件": [],
            "广播": ""
          }
        ],
        "范围循环": [
          {
            "运行累计触发": 1,
            "运行区间始": 1,
            "运行区间终": 1,
            "范围": 0,
            "Buff列表": [],
            "清理弹幕": false,
            "命令": [],
            "血量": 0,
            "魔力": 0,
            "NPC增益": [],
            "拉怪": false,
            "拉怪X轴调整": 0,
            "拉怪Y轴调整": 0,
            "伤害敌怪": 0,
            "广播": ""
          }
        ],
        "玩家循环": [
          {
            "运行累计触发": 1,
            "运行区间始": 1,
            "运行区间终": 1,
            "传送": {
              "启用": false,
              "面向修正": false,
              "X轴位置": 0,
              "Y轴位置": 0
            },
            "无敌": {
              "启用": false,
              "时长": 0
            },
            "广播": ""
          }
        ]
      },
      "触发设置": {
        "触发模式": [
          "主动",
          "CD"
        ],
        "冷却": 0,
        "血量": 0,
        "血量比例计算": false,
        "大于血量": false,
        "蓝量": 0,
        "蓝量比例计算": false,
        "大于蓝量": false,
        "物品条件": [
          {
            "背包物品": false,
            "装备": false,
            "饰品": false,
            "手持物品": false,
            "是否消耗": false,
            "物品ID": 0,
            "数量": 0,
            "前缀": 0
          }
        ],
        "Buff条件": [],
        "环境条件": [],
        "技能条件": []
      },
      "执行脚本": "环绕锁敌.js" //执行脚本名称
    }
  ]
}

配置说明

  • 在上方示例配置中,我并未解释事件循环如何配置,我个人认为事件循环的设计过于复杂,因此我并不推荐使用配置来实现弹幕效果
  • 在最新版的Skill插件配置中更加注重对单个弹幕的控制,这可能有助于实现更加复杂的弹幕效果,但他让配置文件变的宂余。因此我添加了新选择JavaScript
  • 这是我期待的,触发效果交给配置文件来处理,当达成触发条件后调用js脚本。

脚本(Script)

脚本是通过Jint库进行调用的,其性能并不高,我考虑过使用ClearScriptV8来支持脚本运行,但对于一个插件来说它太大了,因此最终选择了Jint,如果将来遇到性能瓶颈,我会考虑升级至ClearScriptV8.

先来看一个示例

var Xna = importNamespace("Microsoft.Xna.Framework");
var Terraria = importNamespace("Terraria");
/*
* skill 是技能配置对象
* ply 是玩家对象
* pos 是技能释放位置
* vel 是技能释放方向
* identify 弹幕释放id如果不是弹幕触发的则为-1
*/
function main(skill, ply, pos, vel, identify) {
    let projs = [];
    var distance = 16 * 25;    // 固定半径
    var startAngle = 0;         // 初始角度(度)
    var angleIncrement = 60;    // 角度间隔(度)
    var count = 360 / angleIncrement;             // 弹幕数量

    // 生成初始位置并记录每个弹幕的初始角度(弧度)
    var posList = ply.TPlayer.Center.GetPointsOnCircle(distance, startAngle, angleIncrement, count);
    var n = 0;
    posList.ForEach(pos => {
        var projIdx = SpawnProjtile(ply, pos, new Xna.Vector2(0, 0), 684, 100, 10, ply.Index, 0, 0, 0);
        SendProjectilePacket(projIdx);
        projs.push({
            id: projIdx,
            angle: (startAngle + n * angleIncrement) * Math.PI / 180 // 初始角度转为弧度
        });
        n += 1;
    });
    
    var loopCount = 60 * 100;
    var j = 0;
    for (let i = 0; i < loopCount; i++) {
        Schedule((args) => {
            j++; //闭包原因无法正确捕获变量i用j代替
            projs.forEach(projData => {
                var proj = Terraria.Main.projectile[projData.id];
                //if (!proj.active) return;

                // 计算新角度:初始角度 + 旋转速度 * 当前帧
                var newAngle = projData.angle + j * 0.05; // 每帧旋转0.05弧度
                var center = ply.TPlayer.Center;

                // 用固定半径计算新位置
                proj.Center = new Xna.Vector2(
                    center.X + Math.cos(newAngle) * distance,
                    center.Y + Math.sin(newAngle) * distance
                );
                SendProjectilePacket(projData.id);
                LockNpc(ply, proj, projData.id);
            });
        }, i); // 按帧延迟执行
    }
}

function LockNpc(ply, proj, id){
    var npc = proj.Center.FindRangeNPC(50 * 16);
    if (npc && Terraria.Main.rand.Next(40) == 0) {
       // 找到最近的怪物
        let targetVel = Terraria.Main.projectile[id].Center.DirectionTo(npc.Center).SafeNormalize(Xna.Vector2.UnitY);
        targetVel = targetVel.ToLenOf(10);
        var projIdx = SpawnProjtile(ply, proj.Center, targetVel, 684, 100, 10, ply.Index);
        SendProjectilePacket(projIdx);
    }
}
  • 上方的js脚本,会创建一些弹幕环绕在玩家身边持续100秒时间,在此期间环绕中的弹幕会锁定并攻击附近50格范围内的怪物。

脚本说明

所有的脚本必须已以下格式编写

function main(skill, ply, pos, vel){

}

这就跟c系语言的入口函数一样,main函数是脚本的入口,其参数亦不可变。

在脚本中内置了一些函数

//void log(object msg)

function main(skill, ply, pos, vel){
    log("Hellow World"); //在ts控制台你会看到输出
}
//int SpawnProjtile(TSPlayer ply, Vector2 pos, Vector2 vel, int type, int Damage, int KnockBack, int Owner, float ai0 = 0, float ai1 = 0, float ai2 = 0, int timeLeft = -1, string uuid = "")

function main(skill, ply, pos, vel){
    let index = SpawnProjtile(ply, pos, vel, 684, 100, 10, ply.Index, 0, 0, 0)
        SendProjectilePacket(index);
}
//void SendPacket(int packetid, int num, int num2, int num3, int num4, int num5, int num6, int num7)

function main(skill, ply, pos, vel){
    SendPacket(66, ply.Index, life) //回复玩家100点生命
}
//void Schedule(Action<object> action, int interval, object obj)

function main(skill, ply, pos, vel){
    Schedule((args) =>{
        SendPacket(66, ply.Index, life);
    }, 60); //延迟60帧(1秒) 给玩家回复深生命值。
}

支持的扩展函数

  • EconomicsAPI.Extensions.GameProgress
  • Terraria.Utils
  • EconomicsAPI.Extensions.PlayerExt
  • EconomicsAPI.Extensions.NpcExt
  • EconomicsAPI.Extensions.TSPlayerExt
  • Enumerable
  • EconomicsAPI.Extensions.Vector2Ext
    示例脚本中相当一部分代码使用了扩展函数,你可以在这些命名空间中找到具体函数

支持的Assembly

  • EconomicsAPI
  • TShockAPI
  • OTAPI
  • System.Thread.Task
    你可以通过importNamespace函数访问这些程序集中的公开类

更新日志

v2.0.1.0
添加 GetString

v2.0.0.9
技能条件,buff条件,环境条件
购买技能条件

V2.0.0.0
适配多货币

V1.2.1.6
添加隐藏技能,隐藏技能无法被主动购买。
添加新指令:
/skill give 给玩家添加技能,此指令不是一个安全的指令,它不会检查玩家技能状态。
/skill del 这个指令可以删除目标玩家技能
/skill clearh 移除目标玩家身上的隐藏技能

V1.2.1.5
适配新 EconomicsAPI

V1.1.0.1
添加 无敌帧,锁定怪物,AI样式,传送玩家,移除画圆配置,改用循环实现
修复: 弹幕AI无法生效,持续时间无法生效

V1.0.0.1
修复:物品消耗

反馈

  • 共同维护的插件库:https://github.com/UnrealMultiple/TShockPlugin
  • 国内社区 trhub.cn 或 TShock 官方群等
上一篇
Economics.Shop 商店插件
下一篇
Economics.Task 任务插件