Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ComponentFurnace.cs
浏览该文件的文档.
1using System.Globalization;
2using Engine;
5
6namespace Game {
9
11
13
14 #region 1.8.1.1变量
15
17
19
21
23
24 public bool StopFuelWhenNoRecipeIsActive = true;
25
26 public float SmeltSpeed = 0.15f;
27
31 public float SmeltProgressReductionSpeed = float.PositiveInfinity;
32
36 public float FuelTimeEfficiency = 1f;
37
42 public float m_fuelEndTime;
43
44 public virtual float FireTimeRemaining => m_fireTimeRemaining;
45
46 #endregion
47
48 public int m_furnaceSize;
49
50 public string[] m_matchedIngredients = new string[9];
51
52 public virtual float m_fireTimeRemaining { get; set; }
53
54 public float m_heatLevel;
55
57
59
60 public float m_smeltingProgress;
61
62 public virtual int RemainsSlotIndex => SlotsCount - 1;
63
64 public virtual int ResultSlotIndex => SlotsCount - 2;
65
66 public virtual int FuelSlotIndex => SlotsCount - 3;
67
68 public virtual float HeatLevel => m_heatLevel;
69
70 public virtual float SmeltingProgress => m_smeltingProgress;
71
73
74 public override int GetSlotCapacity(int slotIndex, int value) {
75 if (slotIndex == FuelSlotIndex) {
77 return base.GetSlotCapacity(slotIndex, value);
78 }
79 return 0;
80 }
81 return base.GetSlotCapacity(slotIndex, value);
82 }
83
84 public override void AddSlotItems(int slotIndex, int value, int count) {
86 base.AddSlotItems(slotIndex, value, count);
87 }
88
89 public override int RemoveSlotItems(int slotIndex, int count) {
91 return base.RemoveSlotItems(slotIndex, count);
92 }
93
94 public override void OnEntityRemoved() {
95 m_subsystemParticles.RemoveParticleSystem(m_fireParticleSystem);
96 }
97
98 public virtual void Update(float dt) {
99 m_fuelEndTime = (float)(m_subsystemGameInfo.TotalElapsedGameTime + m_fireTimeRemaining);
100 if (m_heatLevel > 0f) {
102 if (m_fireTimeRemaining == 0f) {
103 m_heatLevel = 0f;
104 }
105 }
108 }
109 if (m_smeltingRecipe == null) //没有配方,处理空烧
110 {
112 StopSmelting(true);
113 }
114 }
115 if (m_smeltingRecipe != null
116 && m_fireTimeRemaining <= 0f) {
117 UseFuel();
118 }
119 if (m_fireTimeRemaining <= 0f) {
120 m_smeltingRecipe = null;
122 }
123 if (m_smeltingRecipe != null) {
125 if (m_smeltingProgress >= 1f) {
126 for (int i = 0; i < m_furnaceSize; i++) {
127 if (m_slots[i].Count > 0) {
128 m_slots[i].Count--;
129 }
130 }
131 m_slots[ResultSlotIndex].Value = m_smeltingRecipe.ResultValue;
132 m_slots[ResultSlotIndex].Count += m_smeltingRecipe.ResultCount;
133 if (m_smeltingRecipe.RemainsValue != 0
134 && m_smeltingRecipe.RemainsCount > 0) {
135 m_slots[RemainsSlotIndex].Value = m_smeltingRecipe.RemainsValue;
136 m_slots[RemainsSlotIndex].Count += m_smeltingRecipe.RemainsCount;
137 }
138 m_smeltingRecipe = null;
141 }
142 }
143 //根据熔炉燃烧状态调整方块值
144 int cellValue = m_componentBlockEntity.BlockValue;
145 if (m_heatLevel > 0f) {
146 m_fireParticleSystem.m_position = m_componentBlockEntity.Position + new Vector3(0.5f, 0.2f, 0.5f);
147 if (Terrain.ExtractContents(cellValue) == FurnaceBlock.Index) {
149 m_componentBlockEntity.BlockValue = Terrain.ReplaceContents(cellValue, LitFurnaceBlock.Index);
150 }
151 }
152 else {
153 if (Terrain.ExtractContents(cellValue) == LitFurnaceBlock.Index) {
154 m_subsystemParticles.RemoveParticleSystem(m_fireParticleSystem);
155 m_componentBlockEntity.BlockValue = Terrain.ReplaceContents(cellValue, FurnaceBlock.Index);
156 }
157 }
158 }
159
163 public virtual void UpdateSmeltingRecipe() {
165 float heatLevel = 0f;
166 if (m_heatLevel > 0f) {
167 heatLevel = m_heatLevel;
168 }
169 else {
170 Slot slot = m_slots[FuelSlotIndex];
171 if (slot.Count > 0) {
172 int num = Terrain.ExtractContents(slot.Value);
173 heatLevel = BlocksManager.Blocks[num].GetFuelHeatLevel(slot.Value);
174 }
175 }
176 CraftingRecipe craftingRecipe = FindSmeltingRecipe(heatLevel);
177 if (craftingRecipe != m_smeltingRecipe) {
178 m_smeltingRecipe = craftingRecipe != null && craftingRecipe.ResultValue != 0 ? craftingRecipe : null;
180 }
181 }
182
187 public virtual bool UseFuel() {
188 Point3 coordinates = m_componentBlockEntity.Coordinates;
189 Slot slot2 = m_slots[FuelSlotIndex];
190 if (slot2.Count > 0) {
191 int num2 = Terrain.ExtractContents(slot2.Value);
192 Block block = BlocksManager.Blocks[num2];
193 if (block.GetExplosionPressure(slot2.Value) > 0f) {
194 slot2.Count = 0;
195 m_subsystemExplosions.TryExplodeBlock(coordinates.X, coordinates.Y, coordinates.Z, slot2.Value);
196 }
197 else if (block.GetFuelHeatLevel(slot2.Value) > 0f) {
198 slot2.Count--;
200 m_heatLevel = block.GetFuelHeatLevel(slot2.Value);
201 return true;
202 }
203 }
204 return false;
205 }
206
207 public virtual void StopSmelting(bool resetProgress) {
208 m_heatLevel = 0f;
210 if (resetProgress) {
212 }
213 }
214
215 public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) {
216 base.Load(valuesDictionary, idToEntityMap);
217 m_subsystemTerrain = Project.FindSubsystem<SubsystemTerrain>(true);
220 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
221 m_subsystemParticles = Project.FindSubsystem<SubsystemParticles>(true);
222 m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
224 m_fireTimeRemaining = valuesDictionary.GetValue<float>("FireTimeRemaining");
225 m_heatLevel = valuesDictionary.GetValue<float>("HeatLevel");
227 m_fireParticleSystem = new FireParticleSystem(m_componentBlockEntity.Position + new Vector3(0.5f, 0.2f, 0.5f), 0.15f, 16f);
228 }
229
230 public override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap) {
231 base.Save(valuesDictionary, entityToIdMap);
232 valuesDictionary.SetValue("FireTimeRemaining", m_fireTimeRemaining);
233 valuesDictionary.SetValue("HeatLevel", m_heatLevel);
234 }
235
236 public virtual CraftingRecipe FindSmeltingRecipe(float heatLevel) {
237 if (heatLevel > 0f) {
238 for (int i = 0; i < m_furnaceSize; i++) {
239 int slotValue = GetSlotValue(i);
240 int num = Terrain.ExtractContents(slotValue);
241 int num2 = Terrain.ExtractData(slotValue);
242 if (GetSlotCount(i) > 0) {
243 Block block = BlocksManager.Blocks[num];
244 m_matchedIngredients[i] = $"{block.GetCraftingId(slotValue)}:{num2.ToString(CultureInfo.InvariantCulture)}";
245 }
246 else {
247 m_matchedIngredients[i] = null;
248 }
249 }
250 ComponentPlayer componentPlayer = FindInteractingPlayer();
251 float playerLevel = componentPlayer?.PlayerData.Level ?? 1f;
252 CraftingRecipe craftingRecipe;
253 craftingRecipe = CraftingRecipesManager.FindMatchingRecipe(m_subsystemTerrain, m_matchedIngredients, heatLevel, playerLevel);
254 if (craftingRecipe != null
255 && craftingRecipe.ResultValue != 0) {
256 if (craftingRecipe.RequiredHeatLevel <= 0f) {
257 craftingRecipe = null;
258 }
259 if (craftingRecipe != null) {
261 int num3 = Terrain.ExtractContents(craftingRecipe.ResultValue);
262 if (slot.Count != 0
263 && (craftingRecipe.ResultValue != slot.Value
264 || craftingRecipe.ResultCount + slot.Count > BlocksManager.Blocks[num3].GetMaxStacking(craftingRecipe.ResultValue))) {
265 craftingRecipe = null;
266 }
267 }
268 if (craftingRecipe != null
269 && craftingRecipe.RemainsValue != 0
270 && craftingRecipe.RemainsCount > 0) {
271 if (m_slots[RemainsSlotIndex].Count == 0
272 || m_slots[RemainsSlotIndex].Value == craftingRecipe.RemainsValue) {
275 < craftingRecipe.RemainsCount) {
276 craftingRecipe = null;
277 }
278 }
279 else {
280 craftingRecipe = null;
281 }
282 }
283 }
284 if (craftingRecipe != null
285 && !string.IsNullOrEmpty(craftingRecipe.Message)) {
286 componentPlayer?.ComponentGui.DisplaySmallMessage(craftingRecipe.Message, Color.White, true, true);
287 }
288 return craftingRecipe;
289 }
290 return null;
291 }
292 }
293}
Engine.Vector3 Vector3
static int Min(int x1, int x2)
static int Max(int x1, int x2)
virtual float GetExplosionPressure(int value)
virtual int GetMaxStacking(int value)
virtual float GetFuelFireDuration(int value)
virtual float GetFuelHeatLevel(int value)
SubsystemGameInfo m_subsystemGameInfo
virtual void Update(float dt)
SubsystemParticles m_subsystemParticles
virtual bool UseFuel()
使用燃料逻辑,目前返回值在API熔炉中无作用
override void AddSlotItems(int slotIndex, int value, int count)
virtual CraftingRecipe FindSmeltingRecipe(float heatLevel)
SubsystemTerrain m_subsystemTerrain
SubsystemExplosions m_subsystemExplosions
virtual void UpdateSmeltingRecipe()
更新配方逻辑
float FuelTimeEfficiency
使用燃料时,燃料实际补充的时间倍数
ComponentBlockEntity m_componentBlockEntity
FireParticleSystem m_fireParticleSystem
override int GetSlotCapacity(int slotIndex, int value)
override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
virtual void StopSmelting(bool resetProgress)
override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap)
float SmeltProgressReductionSpeed
没有燃料时,冶炼进度倒退速率
float m_fuelEndTime
燃料耗尽时间 开发时,注意这个不能改成{get;set;}形式,否则会出现mod兼容问题
override int RemoveSlotItems(int slotIndex, int count)
实际移除的数量
virtual void DisplaySmallMessage(string text, Color color, bool blinking, bool playNotificationSound)
virtual int GetSlotCount(int slotIndex)
virtual int GetSlotValue(int slotIndex)
static CraftingRecipe FindMatchingRecipe(SubsystemTerrain terrain, string[] ingredients, float heatLevel, float playerLevel)
static int ExtractContents(int value)
static int ReplaceContents(int value, int contents)
方块值的最低10位,替换为目标Content
static int ExtractData(int value)
ValuesDictionary ValuesDictionary
static Color White