开发教程 [Mod编写教程]玩家创建人物、中核复活后自带物品以及进入游戏提示

2019年度弹幕揭晓!是你发过的那个吗?

-Cyril-

Lv2
创意者
冒险家
2018/08/28
26
31
45
不能看不知道怎么形容的Mod教程
大家好我是Cyril,我有个特别的外号叫亏了
今天我来写教程,因为想不出要什么开场白所以就直接开始了吧
PS:关于Mod教程同样可以参考裙中世界,那里的教程很强很强很强...
PSS:如果文中有错误或是漏洞,请大佬指出
PSSS:看教程之前最好先学会这个教程中的内容
PSSSS:我会在评论中放出教程全代码
===========================================
创建文件

C#:
using System.Collections.Generic;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace BunnyMod//这里是命名空间,记得改成你自己的(问怎么改的,去看裙中世界)
{
    public class BunnyModPlayer : ModPlayer
    {
        //即将要写骚操作的地方
    }
}
大概就这样
===========================================
创建人物自带物品

首先要用到的一个重写函数是:
public override void SetupStartInventory(IList<Item> items, bool mediumcoreDeath)
关于这个重写函数还有另一个版本是:
public override void SetupStartInventory(IList<Item> items)
上面那个版本是用于TML版本为0.10.1.5的,下面那个是0.10.1.5之前的
推荐使用上面的,然后TML尽量保持为最新版本(目前最新版本是0.10.1.5)

这个重写函数的作用是:修改玩家创建时物品栏内的物品
如果第二个参数mediumcoreDeath为True,则:为在中核(死亡掉落所有物品)死亡的角色添加物品(就是死了之后重生物品栏自带的物品)
那么解释完之后就开始实际运用,我会用注释的方法说明每一条的作用
C#:
public override void SetupStartInventory(IList<Item> items, bool mediumcoreDeath)//重写函数
{
    Item item = new Item();//添加一个新物品
    item.SetDefaults(ItemID.BunnyStatue);//添加的物品为原版的兔子雕像,ItemID.BunnyStatue表示ID为445的物品(就是兔子雕像嘛)
    item.stack = 233;//物品的堆叠数,如果没有这一条它会默认为1
    items.Add(item);//添加到玩家物品栏库存里
    if (mediumcoreDeath)//如果玩家在中核中复活了,就运行大括号的内容
    {
        item = new Item();//添加一个新物品
        item.SetDefaults(mod.ItemType("名叫Sawynture的兔子"));//添加的物品选定为Mod中类名为"名叫Sawynture的兔子"的物品
        item.stack = 31415;//堆叠数
        items.Add(item);//给玩家物品栏库存添加
    }
}
===========================================
进入游戏提示语

用到的重写函数是
public override void OnEnterWorld(Player player)
巧了,这个没有另一个版本:razz:
这个重写函数在玩家进入世界时运行
参数"player"选定的是进入世界的玩家,不过提示语并不需要用到player这个参数
但是你可以用player做一些有:razz:趣的,比如进入游戏就代码杀
(代码杀的代码是player.KillMe(PlayerDeathReason.ByCustomReason(player.name + " 被神秘的东方力量杀死了"), 1000.0, 0, false);
接下来我还是用注释讲解吧
C#:
public override void OnEnterWorld(Player player)//当玩家进入世界,运行以下代码
{
    Main.NewText("欢迎来到作者的Terraria游戏世界", Color.Gold);//提示语,显示为金色
}
关于Main.NewText,这里有4种使用方法
当你只填了提示语这个参数,其他都没填,默认是这种:
220
否则就是:
221
222
223
我推荐使用void Main.NewText(string newText, Microsoft.Xna.Framework.Color color, [bool force = false]这种
原因:这个简单,而且我只会用这种和默认的:razz:
如果你想自定义颜色,就选择默认的那种,分别填进去RGB值就OK
如果你不想用默认的,那你是闲着没事干么,滚我就教你怎么用第二种:在第二个参数填上new Color(R值, G值, B值)就行
示例:[/COLOR]Main.NewText("欢迎来到作者的Terraria游戏世界", new Color(233, 233, 233));//会显示[COLOR=rgb(233, 233, 233)]欢迎来到作者的Terraria游戏世界[/COLOR]

那么"bool force"又是什么参数?
答:其实我也不知道,我通过神秘的反编译魔法也没发现这个有什么特点
唯一的特点就是当这个值为true时,不会有提示语显示出来,我猜测这个也许是拿来充当if的
比如我想让玩家拿着兔子物品时才发送提示语,我可以这么写:
C#:
Main.NewText("你手里拿着Sawynture的亲戚干啥?", Color.Gold, player.inventory[player.selectedItem].type != NPCID.Bunny);
关于以上代码每个地方分别表达什么意思,就让你们自己去想了(其实是懒得写了2333)
===========================================
应该就清晰明了了吧~
如果还有什么不会的可以在评论里问我
最好问的是本文章提及的内容
 
最后编辑:

-Cyril-

Lv2
创意者
冒险家
2018/08/28
26
31
45
以下是全代码:
C#:
using System.Collections.Generic;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace BunnyMod//这里是命名空间,记得改成你自己的(问怎么改的,去看裙中世界)
{
    public class BunnyModPlayer : ModPlayer
    {
        //写骚操作的地方
        public override void OnEnterWorld(Player player)
        {
            Main.NewText("欢迎来到作者的Terraria游戏世界", Color.Gold);
            Main.NewText("你手里拿着Sawynture的亲戚干啥?", Color.Gold, player.inventory[player.selectedItem].type != NPCID.Bunny);
        }
        public override void SetupStartInventory(IList<Item> items, bool mediumcoreDeath)//重写函数
        {
            Item item = new Item();//添加一个新物品
            item.SetDefaults(ItemID.BunnyStatue);//添加的物品为原版的兔子雕像,ItemID.BunnyStatue表示ID为445的物品(就是兔子雕像嘛)
            item.stack = 233;//物品的堆叠数,如果没有这一条它会默认为1
            items.Add(item);//添加到玩家物品栏库存里
            if (mediumcoreDeath)//如果玩家在中核中复活了,就运行大括号的内容
            {
                item = new Item();//添加一个新物品
                item.SetDefaults(mod.ItemType("名叫Sawynture的兔子"));//添加的物品选定为Mod中类名为"名叫Sawynture的兔子"的物品
                item.stack = 31415;//堆叠数
                items.Add(item);//给玩家物品栏库存添加
            }
        }
    }
}
 
最后编辑:
  • 投币
反馈: 佐藤そうた

幽の白银

Lv2
冒险家
2019/01/30
6
2
25
太平洋中央的菠萝小屋
以下是全代码:
C#:
using System.Collections.Generic;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace BunnyMod//这里是命名空间,记得改成你自己的(问怎么改的,去看裙中世界)
{
    public class BunnyModPlayer : ModPlayer
    {
        //写骚操作的地方
        public override void OnEnterWorld(Player player)
        {
            Main.NewText("欢迎来到作者的Terraria游戏世界", Color.Gold);
            Main.NewText("你手里拿着Sawynture的亲戚干啥?", Color.Gold, player.inventory[player.selectedItem].type != NPCID.Bunny);
        }
        public override void SetupStartInventory(IList<Item> items, bool mediumcoreDeath)//重写函数
        {
            Item item = new Item();//添加一个新物品
            item.SetDefaults(ItemID.BunnyStatue);//添加的物品为原版的兔子雕像,ItemID.BunnyStatue表示ID为445的物品(就是兔子雕像嘛)
            item.stack = 233;//物品的堆叠数,如果没有这一条它会默认为1
            items.Add(item);//添加到玩家物品栏库存里
            if (mediumcoreDeath)//如果玩家在中核中复活了,就运行大括号的内容
            {
                item = new Item();//添加一个新物品
                item.SetDefaults(mod.ItemType("名叫Sawynture的兔子"));//添加的物品选定为Mod中类名为"名叫Sawynture的兔子"的物品
                item.stack = 31415;//堆叠数
                items.Add(item);//给玩家物品栏库存添加
            }
        }
    }
}
那两个newtext太恶趣味了8
 

鱼鱼

Lv2
冒险家
2019/07/05
19
45
45
%~K8G72E1R7N(CO1OK_Y{HN.jpg
不过有个小错误,那个force参数表示的是要不要换行,默认为false也就是换行,如果为true就是不换行。

换行的规则是超出80个字符就换一次,而且只会在空格处换行(因为英文单词用空格隔开,所以如果是一大串中文是不会有换行效果的)。

false的情况本质是将字符串拆成多段之后,给拆分后的每段字符都调用一次为true的Main.NewText。

(虽然我并不知道为什么你那边为true会不显示就是了

_8PJZ@OU[TR7X{RL_8AC`U2.jpg