• 泰拉瑞亚资源中心正式开放,若您要发布资源,请前往资源中心:https://www.bbstr.net/resources/,在资源中心的指定分类中发布资源同时也会自动发出帖子,同时您也可以自定义资源收费(目前仅支持硬币),并获得一定的硬币报酬,使用硬币购买的用户可以重复下载资源不收费,并且享受免费资源更新的特权哟~妈妈再也不怕我没有硬币花了~
    [必看]资源中心使用教程:https://www.bbstr.net/threads/852/

开发教程 【插件编写】TShock服务器插件编写入门

TheLastPrism

管理成员
版主
2019/10/25
625
207
100
武汉
前言
emmmm之前开的那个坑由于论坛更新被吞掉了​
所以重新开一个坑吧​
由于棱镜本人的水平也比较有限,所以大概也只能帮助有兴趣且有一定基础的服主入门插件编写吧​
如果想要精通还需要更多的练习和摸索​
棱镜只能教一些很基础的内容了​
Pt.0-1.插件开发环境配置
想要开发插件,你必须具备以下条件​
  • 电脑上有一套IDE(强烈推荐Visual Studio,教程也会使用Visual Studio)
  • 电脑上有一份TShock服务端
  • 具有耐心,能够承受实现十分钟调试一小时的痛苦(等等好像没必要划掉)
为了节省空间(懒癌发作),安装Visual Studio的说明这里给出fs49模组编写教程官方网站上的说明​
当然,如果你懒得点链接的话(你怎么这么懒啊!),可以直接往下翻,内容我也大概搬运过来了​
VS的下载与安装
本文引用内容:VS文档—安装 Visual Studio

备注:
仅适用于 Microsoft Windows。对于 Visual Studio for Mac,请参阅安装 Visual Studio for Mac

第 1 步 – 下载 Visual Studio
VS官网的下载:https://visualstudio.microsoft.com/zh-hans/downloads/,你可以在上面选择所需的 Visual Studio 版本,建议使用 Community 版本,因为它所包含的功能不但完全覆盖了Mod制作(在我们的场景下是TShock插件开发),还有很多我们完全用不到的强大功能,所以完全没有必要去下载付费的版本。

第 2 步 – 打开 Visual Studio 安装程序
运行 vs_community.exe

第 3 步 – 选择工作负载
在“Visual Studio 安装程序” 中找到所需的工作负载。对于泰拉瑞亚 mod 开发,请务必选择“.NET 桌面开发”,其他的都不用管。然后选择“安装” 。


接下来,会出现多个显示 Visual Studio 安装进度的状态屏幕。

提示
在安装之后,可以随时安装最初未安装的工作负荷或组件。 如果已打开 Visual Studio,请转到“工具” > “获取工具和功能…” ,这会打开 Visual Studio 安装程序。 或者,从“开始”菜单打开“Visual Studio 安装程序” 。 在此处可以选择要安装的工作负载或组件。 然后,选择“修改” 。​

第 4 步 – 选择安装位置(可选)
建议把VS本体装在C盘或者SSD硬盘所在的驱动器,这样VS加载和运行的速度会有质的飞跃。

重要!
仅当首次安装 Visual Studio 时,才可选择其他驱动器。 如果已安装 Visual Studio 并要更改驱动器,则必须先将其卸载然后再重新安装。

第 5 步 – 开始开发
在 Visual Studio 安装完成后,打开 Visual Studio 开始按后续教程进行开发。


完成
章节目录
Pt.0-1.你的第一个插件
Pt1.C#基础篇

Pt2.基础插件编写
 
最后编辑:

TheLastPrism

管理成员
版主
2019/10/25
625
207
100
武汉
Pt.0-1.你的第一个插件
引语:
学编程的人一般都从hello world开始,那么我们也从hello world开始吧!​
1.运用VS创建你的插件项目
要想写一个插件,你需要先通过VS创建一个项目​
1590540915460.png
在项目类型的列表中,找到“类库(.Net Framework)”,点击​
提示:找不到的可以使用搜索框哦
好的,然后填入我们的项目名"HelloWorldPlugin"​
注意:
一般来讲,项目名只由字母(A-Z,a-z),数字(0-9),下划线(_)组成,并且项目名具有实际意义
不要使用中文!不要使用中文!不要使用中文!!!!

在这里你可以选择你的项目所在的目录,默认情况下是在C/用户/你的用户/source/repos文件夹​
当然你可以像我一样把项目放在别的地方​
注意,尽量把TShock项目放在同一个地方,便于以后再次使用
1590541460699.png
配置完成后点击创建​
1590541650867.png
创建之后你就可以看到VS为你自动填充的初始代码和你的工作界面了1590558461027.png
请记住图片上标注的区域的名称,以后会很常用(注意右边的工具栏对应上面的方框)
  • 工具栏:
    提供各种功能的菜单,包括运行、项目属性、生成项目等
  • 文件选项卡:
    用于在项目内切换正在编辑的文件
  • 行号:
    起定位作用,当出现错误时有时会给出出错的行号
  • 代码编辑器
    你干活的地方
  • 解决方案资源管理器
    用于对你项目中的文件进行管理
    ※也用于管理引用程序集信息
现在的你可能还无法理解这些代码是什么意思​
没关系,让我们先抄一段模板代码​
2.编写代码
C#:
//代码来源:https://github.com/chi-rei-den/PluginTemplate/blob/master/src/PluginTemplate/Program.cs
//恋恋的TShock插件模板,有改动(为了配合章节名)

using System;
using System.Collections.Generic;
using System.Reflection;
using Terraria;
using TerrariaApi.Server;
using TShockAPI;

namespace Plugin
{
    [ApiVersion(2, 1)]
    public class Plugin : TerrariaPlugin
    {
        //定义插件的作者名称
        public override string Author => "Author";

        //插件的一句话描述
        public override string Description => "Description";

        //插件的名称
        public override string Name => "Plugin Name";

        //插件的版本
        public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;

        //插件的构造器
        public Plugin(Main game) : base(game)
        {
        }

        //插件加载时执行的代码
        public override void Initialize()
        {
            //恋恋给出的模板代码中展示了如何为TShock添加一个指令
            Commands.ChatCommands.Add(new Command(
                permissions: new List<string> { "plugin.permission1", "plugin.permission2", },
                cmd: this.Cmd,
                "helloworld", "hw"));
        }

        //执行指令时对指令进行处理的方法
        private void Cmd(CommandArgs args)
        {
            args.Player.SendSuccessMessage("Hello world!");
        }
    }
}
好的,现在让我们把代码复制粘贴到VS中
1590559432691.png
宁搁这过年呢这么多红线??
如果你具有一定的思考能力,你应该会意识到,VS又不是TShock插件的专用编辑器
它怎么知道一个TShock的插件要用到哪些程序集啊?
所以,我们需要告诉VS,我们需要编写TShock的插件,要用到一些前置
找到解决方案管理器中的"引用",右键,添加引用
1590559772214.png
如图,点击浏览后,
定位到你的TShock目录,选择OTAPI.dll,TerrariaServer.exe和ServerPlugins目录下的TShockAPI.dll
(可以多次操作),然后回到引用管理器,点击“确定”
Tips:
准确来讲,添加引用这个操作不是“告诉IDE你要写TShock插件”,而是告诉IDE我要用到什么程序集(你可以简单地把它想象成一个存有代码的文件)来写,例如引用了TShockAPI后VS就知道你要使用TShock的相关类/函数/命名空间,这样VS才能提供准确的代码补全/查错功能,当然,也只有这样你的程序才能通过编译检查
(感觉写了跟没写一样啊,淦)
现在你的代码看上去应该就是正常的了,检查代码编辑器下方的这个标识​
1590642121617.png
没问题!爽啦!此时你就可以编译你的第一个插件了,点击工具栏中的“生成”,“生成HelloWorldPlugin”1590642174513.png
1590642190650.png
OK,到这一步为止,如果你前面的步骤没有出错的话,你应该能在VS的底部看到这个消息
1590642251017.png
爽啦!第一个插件成功编译啦!​
现在去你的项目文件夹下,找到bin文件夹,进入内层的Debug文件夹​
Tips:
你可以在解决方案管理器内右键你的项目,点击“在文件资源管理器中打开”来快速定位到你的项目文件夹
1590642443916.png
然后选择​
1590642461119.png
现在你可以看到编译成功的DLL了!1590642533782.png
你可能会注意到在编译插件的同时出现了很多奇怪的文件,我们暂时不需要在意,就把以自己项目名为名的dll复制到TShock的ServerPlugins下即可​
PS:棱镜使用的是PE版的TShock,插件的版本取决于你添加引用时文件所属的TShock版本,请在测试插件时注意版本问题,一般插件无法在其他版本的TShock上正常运行
照常启动你安装插件了的TShock,输入/help查看插件内编写的指令是否成功添加到了游戏中​
1590642776673.png
一般来讲,插件添加的非中文指令都会在指令列表的最后一页
现在输入/helloworld指令看看效果吧!​
1590642832426.png
运行成功!​
本章你应该学到的:
  • 使用Visual Studio创建插件项目
  • 初步了解Visual Studio的界面
  • 了解如何为插件项目添加引用
  • 利用插件模板生成插件
  • 测试插件是否生效
 

附件

最后编辑:
2020/06/17
13
0
20
您好,请问如何将1.3的插件所以到1.4版本呀,开RPG服想给职业增加一个永恒buff
 
2020/04/08
33
7
35
您好,请问如何将1.3的插件所以到1.4版本呀,开RPG服想给职业增加一个永恒buff
ts所有插件开源,在github上基本都能找到源码,把源码下下来。如果作者没更,就手动更改程序集引用重新生成一个
 

TheLastPrism

管理成员
版主
2019/10/25
625
207
100
武汉
https://dl.bbstr.net/pdf/c83d1fd4b4299c89c219471b68ca8578.pdf
联系小太把C#的入土入门教学放到了论坛网盘里,后续教程的C#知识都在这里面了
你无需安装Windows SDK,主要学习的是语法与思想
可以尝试用ConsoleApp(控制台应用程序)项目复现书中的代码
建议:
  1. 完整阅读第一部分理解基本语法
  2. 如果你能掌握第二部分的内容,那么后续的学习将会很轻松
    面向对象的基础是必须掌握的
  3. 如果有能力可以学习第三部分,学习更多方便的可扩展类型
  4. 如果你天赋异禀,你可以尝试学习第四部分关于多线程的初步内容(虽然我们很少会用到)
 
  • 投币
反馈: 逗孩子

TheLastPrism

管理成员
版主
2019/10/25
625
207
100
武汉
Pt.1.C#基础篇
从本章开始的练习全部在VS的控制台应用程序项目中进行
旨在令您掌握C#的基础语法,这是编写插件必须有的前置知识
本章内容主要是对于书内第一章内容的讲解
有能力的读者可以直接按照书上内容学习
(其实是棱镜在水贴啦)
Pt.1-0.创建控制台应用项目
1595044068692.png
图,创建一个控制台应用(.Net Framework)
1595044204902.png
命名建议使用章节名,方便以后查找复习​
1595044283394.png
如图,创建项目后你应该能够看到这些内容​
提示:
如果你发现哪个窗口不见了,你可以在菜单的"视图(V)"中找到你缺少的窗口,然后点击即可唤出
1595044451713.png
例如找不到解决方案资源管理器你可以点击图中“解决方案资源管理器”
或者按快捷键Ctrl+W,然后按S
有能力的读者建议记忆一些常用的快捷键
常用快捷键也可以在网上找到用法和说明
 
最后编辑:
  • 投币
反馈: 逗孩子

TheLastPrism

管理成员
版主
2019/10/25
625
207
100
武汉
Pt.1-1.命名空间
如图,namespace后面所定义的东西就是命名空间
1595118065305.png
为什么要有命名空间?
  1. 人类可用的单词数太少,不同的人写的程序不可能所有的变量都没有重名现象
  2. 使用命名空间有利于组织你的代码
例如你有亿一些朋友,他们都叫“张三”或者“李四”,那么你如何去区分他们呢?
张三A可能来自xxx学校,张三B可能在某公司工作,张三C可能是某个行业的知名人物
那么你可以这样区分他们:
  • 来自xxx学校的张三(指张三A)
  • 来自xxx公司的张三(指张三B)
  • 某行业知名的张三(指张三C)
从某种意义上就解决了重名的问题,这里的“行业、学校、公司”的前缀,你就可以类比成命名空间
但是你可能意识到了另一个问题:如果每个人都要带上前缀来叫,那么人名可能变得极长
例如:来自xxx学校xxx年级xxx班的张三和来自xxx学校xxx年级xxx班的李四是好朋友
你可以看到代码开头的“using”语句,using语句就是用于解决这种问题的​
using语句:
用于将某个命名空间引入作用域,同一文件的后续代码不再需要特定命名空间来限定对象
实例:
如图,我们在Main的大括号(其实是方法,后面会讲)中写入如图的代码,然后删除代码顶端的所有using语句
1595118983044.png
可以看到Console被划上了红线,这是VS强大功能的一部分,自动为你指出一些编译前出现的错误
1.使用命名空间完全限定名
现在我们在Console前加上"System.",如图所示
1595119174662.png
可以看到左下角出现了喜闻乐见的1595119212375.png
VS不觉得你有问题,但是我觉得你很有问题
谁没事打这么长的名称啊?以后代码量大了那还得了?
因此,在一般情况下我们使用using语句来引入命名空间
2.使用using引入命名空间
如图,现在我们在代码开头加上using语句
1595119685969.png
这样是不是好多了?​
本章你应该学到的:
  • 使用VS创建控制台应用项目
  • 了解什么是命名空间,并了解为什么要使用命名空间
  • 学会使用using语句引入命名空间
参考:Visual C# 从入门到精通 1.2-1.3
 
最后编辑:
  • 投币
反馈: 13005131758
2020/03/18
12
0
25
江西
这本电子书里,一上来就讲窗体啊,会不会对新手有影响.
 

TheLastPrism

管理成员
版主
2019/10/25
625
207
100
武汉
Pt.1-2.变量、操作符、表达式
1.语句
语句,顾名思义,就是C#中的“一句话”,可以是如下内容
  • 方法/函数调用
  • 声明变量
  • 变量赋值
  • 一些其他的操作
语句的结尾必须有分号,就像英文中的句点、中文里的句号一样
在上一章中Console.WriteLine("Hello world!");就是一个语句,它调用一个方法在控制台内输出信息
1595129735477.png
很简单吧?很好理解吧?不会有人看不懂吧?
2.变量
变量,顾名思义,就是可以变化的量
变量必须先声明再使用,C#不允许使用未赋值的变量
说到变量,我们不得不提标识符令无数人头疼的命名规范
标识符:
标识符是对程序中各个元素进行标识的名称,这些元素包括命名空间、类/结构名、函数、变量
标识符命名必须满足下面的规范
  • 只能使用字母(大写或小写)、数字、下划线
  • 标识符必须以字母或下划线开头(虽然一般情况下不建议以下划线开头)
  • 不能和C#保留关键词重名(参考教程书pdf第46页)
PS:C#中的标识符区分大小写
温馨提示:非局部变量的命名一定要具有可读性,可以顾名思义,否则你以后会后悔的
这些标识符是合法的:
prime、abc、abc2、a_bc、_abc(一般不推荐)
这些标识符是非法的:
2abc(数字开头)、a@b(不能使用其他符号)、public(和C#关键字重名)
希望以后没有人问我”为什么这里有红线“然后一看是命名不规范的问题......
C#是一门强类型编程语言,定义变量时必须明确地指定变量类型
声明变量可以理解为向计算机申请一个”箱子“,这个箱子可以装特定类型的东西
下面是一个使用变量的例子
1595131931929.png
在工具栏中选中”调试“,点击”开始执行(不调试)”(快捷键:Ctr+F5)
如果你的操作正确,你应该可以看到这样的输出结果1595132271519.png
变量既然叫变量,肯定是可以变的,对吧?​
OK,那么我们再来看下面这个例子~​
1595490372742.png
每次输出都按一下键盘,看看输出的结果吧!​
等等,那个灰色的小省略号是什么??​
将鼠标光标移动到它的上方,你应该可以看到VS给你的智能提示:​
1595490748459.png
ok,让我们采用智能提示,你可以看到你的赋值表达式被VS修改成了这样:​
1595490795024.png
这是什么?​
复合赋值运算符:
形如"运算符="的操作符都是复合赋值运算符,其等价于“变量 = 变量 操作符 表达式”
例如:
  • x+=1 //表示x=x+1,计算x的值加1并赋给x
  • y-=2 //表示y=y-2,计算y的值减2并赋给y
  • z*=3 //表示z=z*3,计算z的值乘3并赋给z
实质上复合赋值运算符只是为了让程序员少写一些代码(因为这样需要对变量的值进行修改的场景太多了)
这种语法对语言的功能并没有影响,但是更方便程序员使用
这种语法叫做语法糖,一般而言,使用语法糖能增强程序的可读性,从而减少代码出错的机会
 
最后编辑:
2020/04/08
33
7
35
求分享几份源码,以便学习
github.com/Pryaxis/TShock
github.com/Olink/Invincible-Tiles
github.com/Brycey92/WorldEdit
github.com/moisterrific/Ghost/
 
  • 投币
反馈: 13005131758