Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SurvivalCraftModLoader.cs
浏览该文件的文档.
1using Engine;
3using Engine.Media;
5#if WINDOWS
6using ImeSharp;
7#endif
8
9namespace Game {
11 public override void __ModInitialize() {
12 ModsManager.RegisterHook("InitKeyCompatibleGroups", this);
13 ModsManager.RegisterHook("OnCameraListInit", this);
14 ModsManager.RegisterHook("ManageCameras", this);
15 ModsManager.RegisterHook("OnCameraChange", this);
16 ModsManager.RegisterHook("OnPlayerDead", this);
17 ModsManager.RegisterHook("OnModelRendererDrawExtra", this);
18 ModsManager.RegisterHook("GetMaxInstancesCount", this);
19 //ModsManager.RegisterHook("BeforeWidgetDrawItemRender", this);
20 ModsManager.RegisterHook("OnDrawItemAssigned", this);
21 ModsManager.RegisterHook("WindowModeChanged", this);
22 }
23
24 public override void InitKeyCompatibleGroups() { //示例:添加按键兼容组,同组内的按键在按键绑定界面不会显示冲突(但功能上仍可能存在冲突,请自行安排)
25 //第一个参数为组名;后续参数为按键名
26 KeyCompatibleGroupsManager.AddKeyToCompatibleGroup("Group_Movement", "Jump", "MoveUp");
27 KeyCompatibleGroupsManager.AddKeyToCompatibleGroup("Group_Crouch", "ToggleCrouch", "MoveDown");
28 KeyCompatibleGroupsManager.AddKeyToCompatibleGroup("Group_Action", "Dig", "Hit");
29 KeyCompatibleGroupsManager.AddKeyToCompatibleGroup("Group_Interact", "Interact", "Aim");
30 //若需要添加一个使用鼠标左键但与挖掘、攻击兼容的按键Fire,将其添加至对应的组Group_Action即可。代码如下:
31 //KeyCompatibleGroupsManager.AddKeyToCompatibleGroup("Group_Action","Fire");
32 }
33
34 public override IEnumerable<KeyValuePair<string, int>> GetCameraList() { //示例:向摄像机列表设置中添加调试视角。若此处不添加,则设置里不会显示该视角的选项,并且在游戏中通过切换视角按键也无法切换到该视角
35 yield return
36 new KeyValuePair<string, int>(
37 "Game.DebugCamera",
38 4
39 ); //4为调试视角的默认序号。其它摄像机的序号详见SettingsManager.InitializeCameraManageSettings。这些序号只作为默认设置
40 }
41
42 public override void ManageCameras(GameWidget gameWidget) { //示例:向GameWidget中添加调试视角
43 DebugCamera debugCamera = new(gameWidget);
44 //第一个参数声明一个新的摄像机
45 //第二个参数为一个Func委托,输入gameWidget可对当前条件进行判断(例如判断是否为创造模式、是否乘坐载具等),若不符合条件则在玩家切换视角时会跳过当前摄像机
46 //如果不用判断条件(任何条件都不跳过该摄像机),第二个参数可传入null或不填
47 gameWidget.AddCamera(
48 debugCamera,
49 gameWidget1 => {
50 SubsystemGameInfo subsystemGameInfo = gameWidget1.Target.Project.FindSubsystem<SubsystemGameInfo>();
51 return subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative;
52 }
53 );
54 }
55
56 public override void OnCameraChange(ComponentPlayer m_componentPlayer, ComponentGui componentGui) {
57 GameWidget gameWidget = m_componentPlayer.GameWidget;
58 int currentIndex = -1;
59 Dictionary<string, int> dictionary = ModSettingsManager.CombinedCameraManageSettings;
60 foreach (KeyValuePair<string, int> item in dictionary) {
61 Type type = TypeCache.FindType(item.Key, true, true);
62 if (type == gameWidget.ActiveCamera.GetType()) {
63 currentIndex = item.Value;
64 break;
65 }
66 }
68 int nextCameraIndex = (currentIndex + 1) % enableCount;
69 Camera camera;
70 bool isEnable;
71 string key;
72 do {
73 key = dictionary.First(item2 => item2.Value == nextCameraIndex).Key;
74 Type type = TypeCache.FindType(key, true, true);
75 camera = gameWidget.FindCamera(type, out isEnable);
76 nextCameraIndex = (nextCameraIndex + 1) % enableCount;
77 }
78 while (!isEnable);
79 gameWidget.ActiveCamera = camera;
80 componentGui.DisplaySmallMessage(LanguageControl.Get("CameraManage", key), Color.White, false, false);
81 }
82
83 public override void OnPlayerDead(PlayerData playerData) {
84 playerData.GameWidget.ActiveCamera = playerData.GameWidget.FindCamera<DeathCamera>();
85 if (playerData.ComponentPlayer != null) {
86 string text = playerData.ComponentPlayer.ComponentHealth.CauseOfDeath;
87 if (string.IsNullOrEmpty(text)) {
89 }
90 string arg = string.Format(LanguageControl.Get(PlayerData.fName, 13), text);
91 if (playerData.m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Cruel) {
94 string.Format(
96 arg,
97 LanguageControl.Get("GameMode", playerData.m_subsystemGameInfo.WorldSettings.GameMode.ToString())
98 ),
99 30f,
100 1.5f
101 );
102 }
103 else if (playerData.m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Adventure
107 string.Format(LanguageControl.Get(PlayerData.fName, 8), arg),
108 30f,
109 1.5f
110 );
111 }
112 else {
115 string.Format(LanguageControl.Get(PlayerData.fName, 9), arg),
116 30f,
117 1.5f
118 );
119 }
120 }
121 }
122
123 public override void OnModelRendererDrawExtra(SubsystemModelsRenderer modelsRenderer,
125 Camera camera,
126 float? alphaThreshold) {
127 ComponentModel componentModel = modelData.ComponentModel;
128 if (componentModel is ComponentHumanModel) {
129 ComponentPlayer m_componentPlayer = componentModel.Entity.FindComponent<ComponentPlayer>();
130 if (m_componentPlayer != null
131 && camera.GameWidget.PlayerData != m_componentPlayer.PlayerData) {
132 ComponentCreature m_componentCreature = m_componentPlayer.ComponentMiner.ComponentCreature;
133 Vector3 position = Vector3.Transform(
134 m_componentCreature.ComponentBody.Position + 1.02f * Vector3.UnitY * m_componentCreature.ComponentBody.BoxSize.Y,
135 camera.ViewMatrix
136 );
137 if (position.Z < 0f) {
138 Color color = Color.Lerp(Color.White, Color.Transparent, MathUtils.Saturate((position.Length() - 4f) / 3f));
139 if (color.A > 8) {
142 camera.ViewMatrix
143 );
144 Vector3 down = Vector3.TransformNormal(-0.005f * Vector3.UnitY, camera.ViewMatrix);
146 modelsRenderer.PrimitivesRenderer
147 .FontBatch(
148 font,
149 1,
154 )
155 .QueueText(
156 m_componentPlayer.PlayerData.Name,
157 position,
158 right,
159 down,
160 color,
161 TextAnchor.HorizontalCenter | TextAnchor.Bottom
162 );
163 }
164 }
165 }
166 }
167 }
168
169 public override int GetMaxInstancesCount() => 7;
170
171 /*public override void BeforeWidgetDrawItemRender(Widget.DrawItem drawItem,
172 out bool skipVanillaDraw,
173 out Action afterWidgetDraw,
174 ref Rectangle scissorRectangle,
175 Widget.DrawContext drawContext) {
176 if (drawItem.Widget is TextBoxWidget
177 && drawItem.IsOverdraw) {
178 // 如果绘制的 Widget 是文本框控件,则提前取消 ScissorRectangle 并 Flush ,最后还原 ScissorRectangle 以达到显示候选窗内容的效果。
179 Rectangle rect = scissorRectangle;
180 Display.ScissorRectangle = Display.Viewport.Rectangle;
181 afterWidgetDraw = () => {
182 drawContext.PrimitivesRenderer2D.Flush();
183 Display.ScissorRectangle = rect;
184 };
185 }
186 skipVanillaDraw = false;
187 afterWidgetDraw = null;
188 }*/
189
190 public override void OnDrawItemAssigned(Widget.DrawContext drawContext) {
191 int layer = drawContext.m_drawItems.LastOrDefault()?.Layer ?? 0;
192 layer++;
193 for (int i = 0; i < drawContext.m_drawItems.Count; i++) {
194 Widget.DrawItem drawItem = drawContext.m_drawItems[i];
195 if (drawItem.Widget is TextBoxWidget
196 && drawItem.IsOverdraw) {
197 drawItem.Layer = layer;
198 }
199 }
200 drawContext.m_drawItems.Sort();
201 // 将 TextBoxWidget 的 Overdraw 绘制转移至最后面。
202 }
203
204 public override void WindowModeChanged(WindowMode mode) {
206#if WINDOWS
207 InputMethod.ShowOSImeWindow = !SettingsManager.FullScreenMode;
208#endif
209 }
210 }
211}
static readonly BlendState AlphaBlend
static readonly DepthStencilState DepthRead
static readonly RasterizerState CullNoneScissor
static float Saturate(float x)
static Type FindType(string typeName, bool skipSystemAssemblies, bool throwIfNotFound)
GameWidget GameWidget
Matrix ViewMatrix
Vector3 ViewDirection
virtual void DisplayLargeMessage(string largeText, string smallText, float duration, float delay)
ComponentCreature ComponentCreature
static void AddKeyToCompatibleGroup(string groupId, params string[] keys)
添加按键到兼容组
static BitmapFont BitmapFont
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
static Dictionary< string, int > CombinedCameraManageSettings
SubsystemGameInfo m_subsystemGameInfo
ComponentPlayer ComponentPlayer
GameWidget GameWidget
static string fName
override void WindowModeChanged(WindowMode mode)
当窗口模式改变时执行。
override void OnCameraChange(ComponentPlayer m_componentPlayer, ComponentGui componentGui)
改变相机模式时执行
override IEnumerable< KeyValuePair< string, int > > GetCameraList()
用于添加新的摄像机顺序,在重置摄像机列表时也会使用这里的设置作为默认值。 使用yield return可返回多个键值对。键:摄像机类名;值:顺序
override void ManageCameras(GameWidget gameWidget)
当GameWidget被创建时执行,适合添加新的摄像机类型。具体方法可参考SurvivalCraftModLoader.ManageCameras
override void __ModInitialize()
当ModLoader类被实例化时执行
override void InitKeyCompatibleGroups()
初始化按键兼容组
override void OnDrawItemAssigned(Widget.DrawContext drawContext)
在 DrawItem 排序后。
override void OnModelRendererDrawExtra(SubsystemModelsRenderer modelsRenderer, SubsystemModelsRenderer.ModelData modelData, Camera camera, float? alphaThreshold)
绘制额外模型数据的方法,如人物头顶的名字
override int GetMaxInstancesCount()
设置生物最大组件数,多个Mod时取最大
override void OnPlayerDead(PlayerData playerData)
当人物死亡时执行。在玩家进入世界且玩家处于死亡状态时也会执行 可以通过playerData.m_stateMachine.PreviousState == "Playing",来判断是刚死的,还是加载世...
绘制任务,有多种类型,绘制任务会按照 Layer 进行排序。
Component FindComponent(Type type, string name, bool throwOnError)
virtual Subsystem FindSubsystem(Type type, string name, bool throwOnError)
PlayerData PlayerData
void AddCamera(Camera camera, Func< GameWidget, bool > isEnable=null)
此方法建议在ModLoader.ManageCameras接口中使用,避免重复添加。若无需结合条件判断摄像机是否可用(比如调试视角仅创造模式可用),则isEnable可传null
Camera FindCamera(Type type, bool throwOnError=true)
static void RegisterHook(string HookName, ModLoader modLoader)
注册Hook
static Color Lerp(Color c1, Color c2, float f)
static Color Transparent
定义 Color.cs:5
static Color White
static Vector3 TransformNormal(Vector3 v, Matrix m)
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 Cross(Vector3 v1, Vector3 v2)
static Vector3 Normalize(Vector3 v)
static readonly Vector3 UnitY