Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
feat(StatusTextManager): DynamicText 动态文本内容
  • Loading branch information
LaoSparrow committed Oct 18, 2024
commit 0b097ab464617ab12c0b0046971f546457b720eb
46 changes: 39 additions & 7 deletions src/StatusTextManager/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,47 @@
## 更新日志

```
v1.1.0
添加 DynamicText 类
可插值

v1.0.0
初次添加插件
```

## 指令

| 语法 | 权限 | 说明 |
|-------------|:--:|:--------:|
| /statustext | 无 | 切换模板文本显示 |
| /st | 无 | 切换模板文本显示 |
| 语法 | 权限 | 说明 |
| ----------- | :---: | :--------------: |
| /statustext | 无 | 切换模板文本显示 |
| /st | 无 | 切换模板文本显示 |

## DynamicText 插值表

| 插值 | 插值内容 |
| ------------------------- | ------------------------------- |
| %PlayerName% | 玩家名称 |
| %PlayerGroupName% | 玩家所在组名称 |
| %PlayerLife% | 玩家生命值 |
| %PlayerMana% | 玩家魔力值 |
| %PlayerLifeMax% | 玩家最大生命值 |
| %PlayerManaMax% | 玩家最大魔力值 |
| %PlayerLuck% | 玩家幸运值 |
| %PlayerCoordinateX% | 玩家X坐标 |
| %PlayerCoordinateY% | 玩家Y坐标 |
| %PlayerCurrentRegion% | 玩家所在的 TShock 区域 |
| %IsPlayerAlive% | 玩家是否存活 |
| %RespawnTimer% | 玩家重生倒计时 (未知原因不生效) |
| %OnlinePlayersCount% | 在线玩家数量 |
| %OnlinePlayersList% | 在线玩家列表 |
| %AnglerQuestFishName% | 渔夫任务鱼名称 |
| %AnglerQuestFishID% | 渔夫任务鱼ID |
| %AnglerQuestFishingBiome% | 渔夫任务鱼钓鱼点 |
| %AnglerQuestCompleted% | 渔夫任务是否已完成 |
| %CurrentTime% | 游戏内时间 |
| %RealWorldTime% | 现实世界时间 |
| %WorldName% | 世界名称 |
| %CurrentBiomes% | 玩家当前所处群系 |

## 配置
> 配置文件位置:tshock/StatusTextManager.json
Expand All @@ -36,8 +67,9 @@ v1.0.0
"UpdateInterval": 1200 //更新间隔, 以帧为单位, 60=1s, 比如这里 1200=20s
},
{
"TypeName": "StaticText", //大同小异
"Text": "\nAnother Static Text\n"
"TypeName": "DynamicText", //动态文本类型
"Text": "\nWorld Name: %WorldName%, Player Name: %PlayerName%\n", //动态文本内容, 被百分号(%)包裹的插值会被动态替换成对应的插值内容
"UpdateInterval": 60 //更新间隔, 大同小异
},
{
"TypeName": "HandlerInfoOverride", //大同小异
Expand All @@ -54,7 +86,7 @@ v1.0.0
```
Helloooooooooooooooooooooooooo
Sparrow Hello from STMTest2 9
Another Static Text
World Name: 1449World, Player Name: Sparrow
Sparrow Hello from STMTest1 16
```

Expand Down
62 changes: 62 additions & 0 deletions src/StatusTextManager/SettingsModel/DynamicText.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using Newtonsoft.Json;
using StatusTextManager.Utils;
using System.Text;
using Terraria;
using TShockAPI;

namespace StatusTextManager.SettingsModel;

public class DynamicText : IStatusTextSetting, IStatusTextUpdateHandler
{
[JsonProperty] public static string TypeName => nameof(DynamicText);

public string Text { get; set; }

public ulong UpdateInterval { get; set; }

private readonly StringBuilder?[] _playerStringBuilders = new StringBuilder[Main.maxPlayers];

public void ProcessHandlers(List<StatusTextUpdateHandlerItem> handlers, List<IStatusTextUpdateHandler> processedHandlers, int settingsIdx)
{
processedHandlers.Add(this);
}


public bool Invoke(TSPlayer player, bool forceUpdate = false)
{
if (forceUpdate || (Common.TickCount + (ulong) player.Index) % this.UpdateInterval == 0)
{
var sb = this._playerStringBuilders.AcquirePlayerStringBuilder(player);
sb.Append(this.Text);
sb.Replace("%PlayerName%", player.Name)
.Replace("%PlayerGroupName%", player.Group.Name)
.Replace("%PlayerLife%", player.TPlayer.statLife.ToString())
.Replace("%PlayerMana%", player.TPlayer.statMana.ToString())
.Replace("%PlayerLifeMax%", player.TPlayer.statLifeMax2.ToString())
.Replace("%PlayerManaMax%", player.TPlayer.statManaMax2.ToString())
.Replace("%PlayerLuck%", player.TPlayer.luck.ToString())
.Replace("%PlayerCoordinateX%", player.TileX.ToString())
.Replace("%PlayerCoordinateY%", player.TileY.ToString())
.Replace("%PlayerCurrentRegion%", player.CurrentRegion == null ? GetString("空区域") : player.CurrentRegion.Name)
.Replace("%IsPlayerAlive%", player.Dead ? GetString("已死亡") : GetString("存活"))
.Replace("%RespawnTimer%", player.RespawnTimer == 0 ? GetString("未死亡") : player.RespawnTimer.ToString())
.Replace("%OnlinePlayersCount%", TShock.Utils.GetActivePlayerCount().ToString())
.Replace("%OnlinePlayersList%", string.Join(',', TShock.Players.Where(x => x is { Active: true }).Select(x => x.Name)))
.Replace("%AnglerQuestFishName%", Common.GetAnglerQuestFishName())
.Replace("%AnglerQuestFishID%", Common.GetAnglerQuestFishId().ToString())
.Replace("%AnglerQuestFishingBiome%", Common.GetAnglerQuestFishingBiome())
.Replace("%AnglerQuestCompleted%", Main.anglerWhoFinishedToday.Exists((string x) => x == player.Name) ? GetString("已完成") : GetString("未完成"))
.Replace("%CurrentTime%", Common.GetCurrentTime())
.Replace("%RealWorldTime%", DateTime.Now.ToString("HH:mm"))
.Replace("%WorldName%", Main.worldName)
.Replace("%CurrentBiomes%", player.GetFormattedBiomesList());
return true;
}
return false;
}

public string GetPlayerStatusText(TSPlayer player)
{
return this._playerStringBuilders[player.Index]?.ToString() ?? "";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace StatusTextManager.SettingsModel;

[JsonConverter(typeof(InterfaceConcreteConverter))]
[Implements(typeof(StaticText), typeof(HandlerInfoOverride))]
[Implements(typeof(StaticText), typeof(HandlerInfoOverride), typeof(DynamicText))]
public interface IStatusTextSetting
{
void ProcessHandlers(List<StatusTextUpdateHandlerItem> handlers, List<IStatusTextUpdateHandler> processedHandlers, int settingsIdx);
Expand Down
2 changes: 1 addition & 1 deletion src/StatusTextManager/StatusTextManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ private void CommandSt(CommandArgs args)
public override string Name => "Status Text Manager";
public override string Author => "LaoSparrow";
public override string Description => "Manage status text of different plugins";
public override Version Version => new (1, 0, 0);
public override Version Version => new (1, 1, 0);

#endregion

Expand Down
176 changes: 176 additions & 0 deletions src/StatusTextManager/Utils/Common.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System.Text;
using Terraria;
using Terraria.ID;
using Terraria.Localization;
using TShockAPI;

namespace StatusTextManager.Utils;
Expand Down Expand Up @@ -26,4 +29,177 @@ public static void ClearTickCount()
{
TickCount = 0;
}

public static string GetCurrentTime()
{
var num = Main.time / 3600.0;
num += 4.5;
if (!Main.dayTime)
{
num += 15.0;
}
num %= 24.0;
return string.Format("{0}:{1:D2}", (int)Math.Floor(num), (int)Math.Floor(num % 1.0 * 60.0));
}

public static string GetFormattedBiomesList(this TSPlayer plr)
{
StringBuilder stringBuilder = new();
var envInfo = plr.GetBiomesInfo();
var envStr = envInfo.Exists((string x) => x == GetString("空岛")) ?
("[c/00BFFF:" + string.Join(',', envInfo) + "]") :
(envInfo.Exists((string x) => x == GetString("地下")) ?
("[c/FF8C00:" + string.Join(',', envInfo) + "]") :
(envInfo.Exists((string x) => x == GetString("洞穴")) ?
("[c/A0522D:" + string.Join(',', envInfo) + "]") :
((!envInfo.Exists((string x) => x == GetString("地狱"))) ?
("[c/008000:" + string.Join(',', envInfo) + "]") :
("[c/FF0000:" + string.Join(',', envInfo) + "]"))));
stringBuilder.Append(envStr);
return stringBuilder.ToString();
}
public static List<string> GetBiomesInfo(this TSPlayer plr)
{
var index = plr.Index;
var list = new List<string>();
if (Main.player[index].ZoneDungeon)
{
list.Add(GetString("地牢"));
}
if (Main.player[index].ZoneCorrupt)
{
list.Add(GetString("腐化"));
}
if (Main.player[index].ZoneHallow)
{
list.Add(GetString("神圣"));
}
if (Main.player[index].ZoneMeteor)
{
list.Add(GetString("陨石"));
}
if (Main.player[index].ZoneJungle)
{
list.Add(GetString("丛林"));
}
if (Main.player[index].ZoneSnow)
{
list.Add(GetString("雪原"));
}
if (Main.player[index].ZoneCrimson)
{
list.Add(GetString("猩红"));
}
if (Main.player[index].ZoneWaterCandle)
{
list.Add(GetString("水蜡烛"));
}
if (Main.player[index].ZonePeaceCandle)
{
list.Add(GetString("和平蜡烛"));
}
if (Main.player[index].ZoneDesert)
{
list.Add(GetString("沙漠"));
}
if (Main.player[index].ZoneGlowshroom)
{
list.Add(GetString("发光蘑菇"));
}
if (Main.player[index].ZoneUndergroundDesert)
{
list.Add(GetString("地下沙漠"));
}
if (Main.player[index].ZoneSkyHeight)
{
list.Add(GetString("空岛"));
}
if (Main.player[index].ZoneDirtLayerHeight)
{
list.Add(GetString("地下"));
}
if (Main.player[index].ZoneRockLayerHeight)
{
list.Add(GetString("洞穴"));
}
if (Main.player[index].ZoneUnderworldHeight)
{
list.Add(GetString("地狱"));
}
if (Main.player[index].ZoneBeach)
{
list.Add(GetString("海滩"));
}
if (Main.player[index].ZoneRain)
{
list.Add(GetString("雨天"));
}
if (Main.player[index].ZoneSandstorm)
{
list.Add(GetString("沙尘暴"));
}
if (Main.player[index].ZoneGranite)
{
list.Add(GetString("花岗岩"));
}
if (Main.player[index].ZoneMarble)
{
list.Add(GetString("大理石"));
}
if (Main.player[index].ZoneHive)
{
list.Add(GetString("蜂巢"));
}
if (Main.player[index].ZoneGemCave)
{
list.Add(GetString("宝石洞窟"));
}
if (Main.player[index].ZoneLihzhardTemple)
{
list.Add(GetString("神庙"));
}
if (Main.player[index].ZoneGraveyard)
{
list.Add(GetString("墓地"));
}
if (Main.player[index].ZoneShadowCandle)
{
list.Add(GetString("阴影蜡烛"));
}
if (Main.player[index].ZoneShimmer)
{
list.Add(GetString("微光"));
}
if (Main.player[index].ShoppingZone_Forest)
{
list.Add(GetString("森林"));
}
return list;
}

public static string GetAnglerQuestFishName()
{
var itemID = Main.anglerQuestItemNetIDs[Main.anglerQuest];
return (string) Lang.GetItemName(itemID);

}
public static int GetAnglerQuestFishId()
{
var itemID = Main.anglerQuestItemNetIDs[Main.anglerQuest];
return itemID;
}

public static string GetAnglerQuestFishingBiome()
{
var itemID = Main.anglerQuestItemNetIDs[Main.anglerQuest];
var questText3 = Language.GetTextValue("AnglerQuestText.Quest_" + ItemID.Search.GetName(itemID));
var splits = questText3.Split("\n\n".ToCharArray());
if (splits.Length > 1)
{
questText3 = splits[splits.Count() - 1];
questText3 = questText3.Replace(GetString("(抓捕位置:"), "");
questText3 = questText3.Replace(GetString(")"), "");
}
return questText3;
}
}