很多社区在服务器内修改了记分牌段位位置的图标用于显示VIP等信息
像这样:

有些小伙伴可能很好奇这是如何做到的呢?
1.首先修改段位位置的图标,我们需要使用CS2内部设置段位图标的方法
也就是 player.CompetitiveRankType
11 是 优先模式段位图标
12 是 竞技段位图标 与 自定图标
7是 搭档模式图标
例如 player.CompetitiveRankType = 12;
为了正常显示想要的图标还要设置胜利场次
设置 player.CompetitiveWins
如果胜利场次不足则会显示需求场次的图标
所以为了正确设置自己想要的图标尽量设置的大一些
例如 player.CompetitiveWins = 10;
接下来要设置使用的当前图标名称(关键)
player.CompetitiveRanking
player.CompetitiveRanking 的值与段位文件有关
例如 你想设置cs2内部竞技段位 黄金2
你可以设置
player.CompetitiveWins = 10; //设置胜场超过需要胜场 不然则会显示需要胜场 X
player.CompetitiveRankType = 12; //使用竞技段位文件夹
player.CompetitiveRanking = 8; //CS2一共有 18个段位 第8个段位就是黄金新星2
Utilities.SetStateChanged(player, "CCSPlayerController", "m_iCompetitiveRankType"); //最后修改至UI
注意!:由于引擎会覆盖修改,所以需要在OnTick中设置 (或者使用Timer未测试)
全部代码
//修改段位图标为黄金新星2
RegisterListener<Listeners.OnTick>(() =>
{
Utilities.GetPlayers().ForEach(player =>
{
//这里的示例是修改所有玩家,可以根据自己的逻辑区分应该修改谁
//例如 if(!isvip(player)) return;
player.CompetitiveWins = 10;
player.CompetitiveRankType = 12;
player.CompetitiveRanking = 8;
Utilities.SetStateChanged(player, "CCSPlayerController", "m_iCompetitiveRankType");
});
});
2.接下来是如何修改自定义图标
根据上面的原理 12是 指向竞技段位文件夹
也就是 panorama\images\icons\skillgroups

如果你想设置自己的自定义段位图片例如 SVIP VIP等
你需要在 panorama\images\icons\skillgroups 中
根据段位原版段位图标的文件名格式制作自己的图标文件
并上传到创意工坊使用
图标格式是svg文件 (上传后将自动打包成VSVG 文件 未测试)
例如 skillgroup10000.svg 上传后变为 skillgroup10000.vsvg_c
注意:文件名格式必须为前缀 skillgroup 后面的编号可以自己定义
之后使用
RegisterListener<Listeners.OnTick>(() =>
{
Utilities.GetPlayers().ForEach(player =>
{
//这里的示例是修改所有玩家,可以根据自己的逻辑区分应该修改谁
//例如 if(!isvip(player)) return;
player.CompetitiveWins = 10;
player.CompetitiveRankType = 12;
player.CompetitiveRanking = 10000; //这里填写 skillgroup10000.vsvg_c 中的 10000
Utilities.SetStateChanged(player, "CCSPlayerController", "m_iCompetitiveRankType");
});
});
这样你就把 段位图标改成了 自己想要的图片
3.修改硬币位置的图标
需要修改 InventoryServices.Rank[5] = (MedalRank_t)
其中 InventoryServices.Rank[5] = (MedalRank_t) 是固定格式
游戏内的默认硬币图片无法修改至UI
必须将自定义图标上传至创意工坊
由于创意工坊机制,同样路径的文件优先读取创意工坊文件
所以本质上是用创意工坊文件 覆盖了游戏原版硬币图标以达到替换的作用
找到游戏原版VPK

查看游戏内的原版硬币编号 使用游戏内的硬币编号 来设置硬币位置的图片
这些硬币的编号是有限的 用一个少一个
将自己制作的符合格式的图片上传至创意工坊
图片的路径必须与硬币编号内的硬编码路径一致,名称一致
才能正确设置自定义硬币图片
例如 想要使用1054号硬币 找到编号1054的这一栏
上面标注了 硬币图片的路径和图片前缀名称

接下来我们就可以在 panorama/images/econ/status_icons/ 路径中找到
panorama/images/econ/status_icons/maptoken_subzero_small_png.vtex_c
其中 maptoken_subzero_small_png 就是硬币显示的小图标
接下来 将你的自定义图标按照这个图标的大小 制作一份
上传至创意工坊 并且路径与文件名
一定要与 panorama/images/econ/status_icons/maptoken_subzero_small_png 一致
具体格式请参考官方文档之类的 制作符合的 图片格式

例如创意工坊中 其他人制作的 国旗图标 的文件

这个创意工坊的图片路径严格的按照了官方文件的路径与命名
经过查看他在1060号硬币上使用了国旗
也就是将国旗的名称设置为了1060号上需要的图片路径名称
//修改硬币图标不需要 ontick 可以使用命令 或者队伍切换等等事件设置
[GameEventHandler]
public HookResult OnEventPlayerTeam(EventPlayerTeam @event, GameEventInfo info)
{
var player = @event.Userid;
if (player == null || !player.IsValid)
{
return HookResult.Continue;
}
AddTimer(0.1f, () =>
{
player.InventoryServices.Rank[5] = (MedalRank_t) 1060;
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices");
});
return HookResult.Continue;
}
之后进入游戏切换队伍 我的硬币图标就变成了国旗 
以上就是关于设置自定义段位图标与自定义硬币图标的教程了 能帮到你的话就点个赞留下评论
题外话:
因为段位图标是在ontick内设置,可以制作动态段位的图标
既然都用ontick,那肯定要做的更炫酷一点~
int frame = 0;
float elapsed = 0f;
float frameInterval = 0.5f; // 每0.5秒切换一帧
int[] iconFrames = new int[] { 10000, 10001, 10002 }; // 轮播段位图标ID
public override void Load(bool hotReload)
{
RegisterListener<Listeners.OnTick>(() =>
{
elapsed += Server.TickInterval;
if (elapsed >= frameInterval)
{
elapsed = 0f;
frame = (frame + 1) % iconFrames.Length;
}
Utilities.GetPlayers().ForEach(player =>
{
player.CompetitiveWins = 10;
player.CompetitiveRankType = 12;
player.CompetitiveRanking = iconFrames[frame]; // 动态轮播
Utilities.SetStateChanged(player, "CCSPlayerController", "m_iCompetitiveRankType");
});
});
}
注意!! : V社官方声明,不允许玩家修改记分牌项目,(硬币或段位等)
使用可能会造成服务器封禁风险
使用可能需要将 Cssharp框架配置 core.json 内
FollowCS2ServerGuidelines 改为 false
是否使用请自行斟酌