全站通知:

Clothing

阅读

    

2023-08-26更新

    

最新编辑:TrimesS_

阅读:

  

更新日期:2023-08-26

  

最新编辑:TrimesS_

来自S&boxWIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
-TrimesS-

什么是服装?

s&box 香肠人的预制服装,开发者和玩家都可以用它们来装扮自己的香肠人(Pawn)。你可以在主菜单中查看一些可用的服装。在某些游戏模式中,开发者可能希望手动设置玩家的服装,例如在团队之间创建视觉区分。您可以使用服装的资源 ID 通过资源库系统加载服装。

什么是资源 ID?

资源 ID 是 s&box 内部保存服装和其他资产参考的方式。您可以在游戏中添加以下控制台命令,查看可用服装名称和资源 ID 的列表。

/// <summary>
/// 调试控制台命令列出所有可用的玩家服装。
/// </summary>
[ConCmd.Admin]
public static void ListAllClothing()
{
	foreach ( var item in ResourceLibrary.GetAll<Clothing>() )
	{
		Log.Info( $"{item.Title} - {item.ResourceId}" );
	}
}

设置玩家服装

游戏模式必须实现一个穿衣系统,以防止赤身裸体的野蛮香肠人出现。s&box 自带的 ClothingContainer 类可抽象出衣服的加载,并防止添加衣服时可能发生的碰撞(如两件衬衫、两双鞋等)。

自动加载玩家默认服装

以下代码将为玩家穿上他们从主菜单中选择的任何服装。请注意,Clothing.DressEntity 可以为任何 Pawn 实例(如 NPC)穿上衣服。

MyPlayer.Clothing.cs

public partial class MyPlayer
{
	public ClothingContainer Clothing { get; protected set; }

	/// <summary>
	/// 将衣服设置为玩家所穿的衣服
	/// </summary>
	public void UpdateClothes( Client cl )
	{
		Clothing ??= new();
		Clothing.LoadFromClient( cl );
	}
}

MyPlayer.cs

public partial class MyPlayer : Player
{
	public override void Respawn()
	{
		UpdateClothes( Client );
		Clothing.DressEntity( this );
	}
}

手动设置玩家所穿服装

您还可以手动设置玩家的服装,忽略他们之前在主菜单中的配置。这对于团队游戏模式来说通常很重要。

MyPlayer.Clothes.cs

public partial class MyPlayer
{
	public ClothingContainer Clothing { get; protected set; }

	private static readonly int[] TeamAClothing =
	{
		1846461341, // Police Cap.
		-923065548, // Suit Jacket.
		1761917151, // Tactical Vest.
		1194605997, // Smart Trousers.
		-1377292782 // Black Boots.
	};

	private static readonly int[] TeamBClothing =
	{
		-394380878, // Prison Jumpsuit.
		591027714 // Sneakers.
	};

	/// <summary>
	/// 根据玩家的队伍设置衣服
	/// </summary>
	public void UpdateClothes( Client cl )
	{
		Clothing ??= new ClothingContainer();

		var player = cl.Pawn as MyPlayer;

		// 清除任何先前装备的衣服。
		Clothing.Clothing.Clear();

		// 注意:您可以将此代码重构为一个 'GetTeamClothing' 方法。
		if ( player.Team == Team.A )
		{
			foreach ( var itemId in TeamAClothing )
			{
				Clothing.Toggle( ResourceLibrary.Get<Clothing>( itemId ) );
			}
		}
		else
		{
			foreach ( var itemId in TeamBClothing )
			{
				Clothing.Toggle( ResourceLibrary.Get<Clothing>( itemId ) );
			}
		}
	}
}

白名单服装类别

为了实现某种程度的自定义,您可能希望允许玩家配置自己的头发、皮肤等,同时强迫他们穿上特定的衬衫和鞋子。为此,您可以将某些服装类别列入白名单,并手动反序列化玩家的装备。

MyPlayer.Clothes.cs

public partial class MyPlayer
{
	public ClothingContainer Clothing { get; protected set; }

	private static readonly Clothing.ClothingCategory[] WhitelistedAccessories =
	{
		Sandbox.Clothing.ClothingCategory.Skin, Sandbox.Clothing.ClothingCategory.Facial,
		Sandbox.Clothing.ClothingCategory.Hair
	};

	public void UpdateClothes( Client cl )
	{
		Clothing ??= new ClothingContainer();

		// Clear out any previously equipped clothing.
		Clothing.Clothing.Clear();

		// Only loads certain client configured clothing items.
		// E.g. Hair, Skin, etc.
		DeserializeAccessories( cl.GetClientData( "avatar" ) );

		// ... Set the rest of the player's clothing manually ...
		// (See above)
	}

	/// <summary>
	/// 反序列化客户端配件并为其提供装备。
	/// "Accessories" may include Hair, Skin, Etc.
	/// </summary>
	/// <param name="json"></param>
	private void DeserializeAccessories( string json )
	{
		if ( string.IsNullOrWhiteSpace( json ) )
		{
			return;
		}

		try
		{
			var entries = JsonSerializer.Deserialize<ClothingContainer.Entry[]>( json );
			foreach ( var entry in entries! )
			{
				var item = ResourceLibrary.Get<Clothing>( entry.Id );
				if ( item == null ) continue;
				if ( !WhitelistedAccessories.Contains( item.Category ) ) continue;

				Clothing.Toggle( item );
			}
		}
		catch ( System.Exception e )
		{
			Log.Warning( e, "Error deserializing accessories" );
		}
	}
}