tModLoader 基础饰品

饰品

方法

继承自ModItem

方法名称 用处
UpdateAccessory 实际的饰品效果,只运行一次,但是每游戏刻更新一次

常用加成

更多加成可以CTRL + 左键 进入 玩家类查看,主要为字段 / 属性,代码行1550前后,需要注意的是,部分加成使用乘算,因此进行修改时需要使用 *= 1 + %

使用Player.Get可以获得大量加成提示

属性 / 字段名称 作用
GetDamage 获取伤害加成引用
GetCritChance 获取暴击率加成引用
GetArmorPenetration 获取盔甲穿透力引用
1
2
3
4
5
6
7
8
public override void SetDefaults()
{
    Item.accessory = true;
}
public override void UpdateAccessory(Player player, bool hideVisual)
{
    player.GetDamage(DamageClass.Generic) *= 1 + 0.5f;
}

Mod Player

使用饰品为玩家提供原版加成是在大多数情况下是次要的,除了伤害加成等,tModLoader为我们提供了 ModPlayer类,可以让开发者自定义玩家属性,从而达到特殊的判定等。例如特殊装备的冷却计时

  1. 创建自己的ModPlayer

    1
    
    public class MyModPlayer : ModPlayer{}
    
  2. 定义自定义 属性 / 字段 例如xxxxTimerbool 类型,对于非bool类型,应当自行控制何时增减,对于bool类型,应当在ResetInfoAccessories方法中将其恢复为默认值,此方法用来重置自定义属性,每游戏刻都会更新一次,但是在所有加成完成之后,否则饰品效果自然无效了

    1
    2
    3
    4
    5
    6
    7
    
    public int NewTextTimer = 0;
    public bool Yes = false;
    
    public override void ResetInfoAccessories()
    {
        Yes = false;
    }
    
  3. 在饰品的UpdateAccessory中,更改 / 使用自定义的玩家属性,也可以在ModPlayer提供的virtual方法中执行这些操作,下面的代码示例,当玩家佩戴次饰品时,我们自定义的Yes字段被设置为true,并且设置NewTextTimer每游戏刻自增1

    1
    2
    3
    4
    5
    6
    7
    8
    
    public override void UpdateAccessory(Player player, bool hideVisual)
    {
        player.GetDamage(DamageClass.Generic) *= 1 + 0.5f;
        var modPlayer = player.GetModPlayer<MyModPlayer>();
        modPlayer.Yes = true;
        if(modPlayer.NewTextTimer < 60)
            modPlayer.NewTextTimer++;
    }
    
  4. 效果我们可以直接在UpdateAccessory里面写,也可以在ModPlayerUpdateEquips方法中,或者其他任何你想进行的地方,只需要你确保,你应用的方法在此字段被恢复为默认值之前就可。加成不建议写每游戏刻运行一次的方法,而是写在每游戏刻更新一次的方法。可以写一个简单绘制,如果绘制没有按照预期绘制,但是此方法内的Main.NewText却一直运行,那大概率是目标方法了。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    public override void UpdateEquips()
    {
        //Player.inventory 玩家背包
        if (Yes) Player.statLifeMax2 += 100;
        if (NewTextTimer >= 60) {
            CombatText.NewText(new((int)Player.Center.X, (int)Player.Center.Y, 20, 20), Color.Aqua, "60!");
            NewTextTimer = 0;
        }
        base.UpdateEquips();
    }
    

本地化

对于饰品,进行加成本地化时有两种方法,一种是直接写死在hjson文件中,另一种是在代码中传值,可以保证本地化显示与实际同步,强烈建议是在代码中传值,hjson中使用占位符

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Items: {
	TestAss: {
		DisplayName: Test Ass
		Tooltip: 
		'''
		增加{0}生命上限
		{1}秒跳字
		'''
	}
}
1
2
3
4
public class TestAss : ModItem
{
    public override LocalizedText Tooltip => base.Tooltip.WithFormatArgs(100, 1);
}

这样写后是,效果与相同,实际上这两个数字可以使用变量 / 属性进行存储

1
2
增加100生命上限
1秒跳字
1
2
3
public static int addMaxLife = 100;
public static int textTimer = 60;
public override LocalizedText Tooltip => base.Tooltip.WithFormatArgs(addMaxLife, textTimer / 60);

相应的,加成部分需要使用这两个字段来进行加成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public override void UpdateAccessory(Player player, bool hideVisual)
{
    if(modPlayer.NewTextTimer < textTimer)
    modPlayer.NewTextTimer++;
}
public override void UpdateEquips()
{
    //Player.inventory 玩家背包
    if (Yes) Player.statLifeMax2 += TestAss.addMaxLife;
    if (NewTextTimer >= TestAss.textTimer)
}

甚至可以将加成字段统一管理起来,这个就看个人喜好了。

使用 Hugo 构建
主题 StackJimmy 设计