public void SaveCharacterData() { Godot.Collections.Dictionary jsonDictionary = this.GetParent().GetParent().Call("ReadData", "Character") as Godot.Collections.Dictionary; Godot.Collections.Dictionary charaData = jsonDictionary["chara" + characterSelected] as Godot.Collections.Dictionary; Godot.Collections.Dictionary equipTypeData = charaData["equip_types"] as Godot.Collections.Dictionary; Godot.Collections.Dictionary initialEquipData = charaData["initial_equip"] as Godot.Collections.Dictionary; Godot.Collections.Array effectList = new Godot.Collections.Array(); charaData["faceImage"] = facePath; charaData["charaImage"] = ""; charaData["name"] = GetNode <LineEdit>("NameLabel/NameText").Text; GetNode <OptionButton>("CharacterButton").SetItemText(characterSelected, GetNode <LineEdit>("NameLabel/NameText").Text); charaData["class"] = GetNode <OptionButton>("ClassLabel/ClassText").Selected; charaData["description"] = GetNode <TextEdit>("DescLabel/DescText").Text; charaData["initialLevel"] = GetNode <SpinBox>("InitLevelLabel/InitLevelText").Value; charaData["maxLevel"] = GetNode <SpinBox>("MaxLevelLabel/MaxLevelText").Value; equipTypeData.Clear(); int equip_items = GetNode <ItemList>("EquipLabel/EquipContainer/EquipContainer/EquipList").GetItemCount(); for (int i = 0; i < equip_items; i++) { string kind = GetNode <ItemList>("EquipLabel/EquipContainer/EquipContainer/EquipList").GetItemText(i)[0].ToString(); switch (kind) { case "W": equipTypeData["w" + i] = equipIdArray[i]; break; case "A": equipTypeData["a" + i] = equipIdArray[i]; break; } } charaData["equip_types"] = equipTypeData; int slotItems = GetNode <ItemList>("InitialEquipLabel/PanelContainer/TypeContainer/EquipList").GetItemCount(); for (int i = 0; i < slotItems; i++) { initialEquipData[i.ToString()] = Convert.ToInt32(initialEquipIdArray[i]); } charaData["initial_equip"] = initialEquipData; int effectSize = GetNode <ItemList>("EffectLabel/PanelContainer/VBoxContainer/HBoxContainer/EffectNames").GetItemCount(); for (int i = 0; i < effectSize; i++) { Godot.Collections.Dictionary effectData = new Godot.Collections.Dictionary(); effectData["name"] = GetNode <ItemList>("EffectLabel/PanelContainer/VBoxContainer/HBoxContainer/EffectNames").GetItemText(i); effectData["data_id"] = GetNode <ItemList>("EffectLabel/PanelContainer/VBoxContainer/HBoxContainer/DataType").GetItemText(i); effectData["value1"] = GetNode <ItemList>("EffectLabel/PanelContainer/VBoxContainer/HBoxContainer/EffectValue1").GetItemText(i); effectData["value2"] = GetNode <ItemList>("EffectLabel/PanelContainer/VBoxContainer/HBoxContainer/EffectValue2").GetItemText(i); effectList.Add(effectData); } charaData["effects"] = effectList; this.GetParent().GetParent().Call("StoreData", "Character", jsonDictionary); }
public void SyncInventoryState(String state, InventoryDatabase inventoryDatabase) { String[] stateInfo = state.Split(";"); int stateIndex = 0; // Set the current inventory count int inventoryCount = int.Parse(stateInfo[stateIndex]); _availableCapacity = _items.Count - inventoryCount; stateIndex++; // Clean up the inventory for (int index = 0; index < _items.Count; index++) { _items[index] = null; } for (int index = 0; index < inventoryCount; index++) { int inventoryInex = int.Parse(stateInfo[stateIndex]); stateIndex++; _items[inventoryInex] = inventoryDatabase.GetItemByID(stateInfo[stateIndex]); stateIndex++; } // sync used item int usedIndex = int.Parse(stateInfo[stateIndex]); stateIndex++; // Clean up the used index _usedIndex.Clear(); for (int index = 0; index < usedIndex; index++) { _usedIndex.Add(int.Parse(stateInfo[stateIndex])); stateIndex++; } int equipCount = int.Parse(stateInfo[stateIndex]); stateIndex++; _equipmentIndex.Clear(); for (int index = 0; index < equipCount; index++) { String weaponKey = stateInfo[stateIndex]; stateIndex++; int itemIndex = int.Parse(stateInfo[stateIndex]); stateIndex++; int ammo = int.Parse(stateInfo[stateIndex]); stateIndex++; Weapon.WeaponOrder weaponOrder = (Weapon.WeaponOrder) int.Parse(weaponKey.Split("_")[0]); int weaponIndex = int.Parse(weaponKey.Split("_")[1]); if (itemIndex != -1) { _equipmentIndex.Add(weaponKey, itemIndex); if (_agent.GetWeapons(weaponOrder)[weaponIndex] == null || _agent.GetWeapons(weaponOrder)[weaponIndex].ItemResourceID != _items[itemIndex].ItemID) { // Client is not equip same as server, try to enforced it _agent.UnequipWeapon(weaponOrder, weaponIndex); _agent.EquipWeapon(_items[itemIndex].ReferencePackedScene, weaponOrder, weaponIndex); _agent.GetWeapons(weaponOrder)[weaponIndex].SetAmmo(ammo); EmitSignal(nameof(WeaponChangeSignal), weaponOrder, weaponIndex); } } else { if (_agent.GetWeapons(weaponOrder)[weaponIndex] != null) { // Client is equip while server does not, try to enforced it _agent.UnequipWeapon(weaponOrder, weaponIndex); EmitSignal(nameof(WeaponChangeSignal), weaponOrder, weaponIndex); } } } EmitSignal(nameof(InventoryChangeSignal)); }