diff --git a/locals/Log.csv b/locals/Log.csv index 60dffeb..f0ca0bd 100644 --- a/locals/Log.csv +++ b/locals/Log.csv @@ -36,4 +36,5 @@ log_found_files,找到{0}个文件,Found {0} files,{0}ファイルが見つか log_found_item_types,从文件中找到{0}个物品类型,Found {0} item types in files,ファイルから{0}個のアイテム・タイプが見つかった log_register_item,注册物品类型{0}结果为{1},Registered item type {0}; results in {1},登録されたアイテム・タイプ {0} の結果は {1} です。 log_error_when_open_item_regs_dir,尝试打开物品信息目录时发生错误,Error when opening itemRegs dir,アイテム情報カタログを開こうとしてエラーが発生しました。 -log_wrong_custom_arg,不匹配的参数:类型为{0}而值为{1},Mismatched parameter: type {0} and value {1},パラメータの不一致:型{0}と値{1}。 \ No newline at end of file +log_wrong_custom_arg,不匹配的参数:类型为{0}而值为{1},Mismatched parameter: type {0} and value {1},パラメータの不一致:型{0}と値{1}。 +log_item_container_is_null,物品容器为空,Item container is null,アイテム・コンテナが空です \ No newline at end of file diff --git a/scripts/character/CharacterTemplate.cs b/scripts/character/CharacterTemplate.cs index 90c5c6e..30c19a2 100644 --- a/scripts/character/CharacterTemplate.cs +++ b/scripts/character/CharacterTemplate.cs @@ -7,7 +7,6 @@ using ColdMint.scripts.debug; using ColdMint.scripts.health; using ColdMint.scripts.inventory; using ColdMint.scripts.item; -using ColdMint.scripts.item.itemStacks; using ColdMint.scripts.utils; using ColdMint.scripts.item.weapon; using ColdMint.scripts.loot; @@ -40,9 +39,20 @@ public partial class CharacterTemplate : CharacterBody2D protected string? CharacterName; + protected IItemContainer? ProtectedItemContainer; + //Item containers are used to store items. //物品容器用于存储物品。 - public IItemContainer? ItemContainer { get; set; } + public IItemContainer? ItemContainer + { + get => ProtectedItemContainer; + set + { + ProtectedItemContainer = value; + WhenBindItemContainer(ProtectedItemContainer); + } + } + //Items currently held //当前持有的物品 @@ -58,6 +68,16 @@ public partial class CharacterTemplate : CharacterBody2D } } + /// + /// When binding an item container to a character + /// 当为角色绑定物品容器时 + /// + /// + protected virtual void WhenBindItemContainer(IItemContainer? itemContainer) + { + } + + /// /// When the items the character holds are updated /// 当角色持有的物品更新时 @@ -618,7 +638,6 @@ public partial class CharacterTemplate : CharacterBody2D { var itemSlotNode = ItemContainer?.GetItemSlotNode(index); if (itemSlotNode is null) return; - if (number < 0) { while (!itemSlotNode.IsEmpty()) diff --git a/scripts/character/Player.cs b/scripts/character/Player.cs index f618a05..edcf35a 100644 --- a/scripts/character/Player.cs +++ b/scripts/character/Player.cs @@ -1,9 +1,9 @@ using System; using System.Text; using System.Threading.Tasks; - using ColdMint.scripts.damage; using ColdMint.scripts.deathInfo; +using ColdMint.scripts.inventory; using ColdMint.scripts.item; using ColdMint.scripts.map.events; using ColdMint.scripts.utils; @@ -62,6 +62,43 @@ public partial class Player : CharacterTemplate } } + protected override void WhenBindItemContainer(IItemContainer? itemContainer) + { + if (itemContainer == null) + { + return; + } + + //Subscribe to events when the item container is bound to the player. + //在物品容器与玩家绑定时订阅事件。 + itemContainer.SelectedItemSlotChangeEvent += SelectedItemSlotChangeEvent; + } + + public override void _ExitTree() + { + base._ExitTree(); + if (ProtectedItemContainer != null) + { + //Unsubscribe to events when this object is destroyed. + //此节点被销毁时,取消订阅事件。 + ProtectedItemContainer.SelectedItemSlotChangeEvent -= SelectedItemSlotChangeEvent; + } + } + + private void SelectedItemSlotChangeEvent(SelectedItemSlotChangeEvent selectedItemSlotChangeEvent) + { + var item = selectedItemSlotChangeEvent.NewItemSlotNode?.GetItemStack()?.GetItem(); + GameSceneNodeHolder.HideBackpackUiContainerIfVisible(); + if (item is Node2D node2D) + { + CurrentItem = node2D; + } + else + { + CurrentItem = null; + } + } + /// /// Update operation prompt /// 更新操作提示 @@ -103,7 +140,7 @@ public partial class Player : CharacterTemplate operationTipBuilder.Append(Config.OperationTipActionColor); operationTipBuilder.Append(']'); operationTipBuilder.Append( - TranslationServerUtils.Translate(InputMap.ActionGetEvents("ui_down")[0].AsText())); + TranslationServerUtils.Translate(InputMap.ActionGetEvents("ui_down")[0].AsText())); operationTipBuilder.Append("[/color]"); operationTipBuilder.Append(TranslationServerUtils.Translate("action_jump_down")); } @@ -117,7 +154,7 @@ public partial class Player : CharacterTemplate operationTipBuilder.Append(Config.OperationTipActionColor); operationTipBuilder.Append(']'); operationTipBuilder.Append( - TranslationServerUtils.Translate(InputMap.ActionGetEvents("pick_up")[0].AsText())); + TranslationServerUtils.Translate(InputMap.ActionGetEvents("pick_up")[0].AsText())); operationTipBuilder.Append("[/color]"); operationTipBuilder.Append(TranslationServerUtils.Translate("action_pick_up")); operationTipLabel.Text = operationTipBuilder.ToString(); @@ -140,7 +177,7 @@ public partial class Player : CharacterTemplate operationTipBuilder.Append(Config.OperationTipActionColor); operationTipBuilder.Append(']'); operationTipBuilder.Append( - TranslationServerUtils.Translate(InputMap.ActionGetEvents("use_item")[0].AsText())); + TranslationServerUtils.Translate(InputMap.ActionGetEvents("use_item")[0].AsText())); operationTipBuilder.Append("[/color]"); operationTipBuilder.Append(TranslationServerUtils.Translate("action_use_item")); operationTipBuilder.Append(TranslationServerUtils.Translate(item.Name)); @@ -244,8 +281,8 @@ public partial class Player : CharacterTemplate } _parabola.Points = CurrentItem == null - ? _emptyVector2Array - : ParabolicUtils.ComputeParabolic(ItemMarker2D.Position, GetThrowVelocity(), Gravity, 0.1f); + ? _emptyVector2Array + : ParabolicUtils.ComputeParabolic(ItemMarker2D.Position, GetThrowVelocity(), Gravity, 0.1f); } @@ -403,9 +440,9 @@ public partial class Player : CharacterTemplate { var rotationDegreesNode2D = node2D.RotationDegrees; var rotationDegreesNode2DAbs = Math.Abs(rotationDegreesNode2D); - _floatLabel.Position = rotationDegreesNode2DAbs > 90 - ? new Vector2(0, PromptTextDistance) - : new Vector2(0, -PromptTextDistance); + _floatLabel.Position = rotationDegreesNode2DAbs > 90 + ? new Vector2(0, PromptTextDistance) + : new Vector2(0, -PromptTextDistance); _floatLabel.RotationDegrees = 0 - rotationDegreesNode2D; var label = _floatLabel.GetNode