// Конструктор сразу определяет тип данных public Resource(Transform AParent, ResourceType AResType, TSHClassStorageSlot ASlot) { UID = (int)AResType; ResType = AResType; Slot = ASlot; Model = PrefabManager.CreateResourceModel(AResType).transform; Transform = PrefabManager.CreateResourceCore().transform; Transform.SetParent(AParent, false); Model.SetParent(Transform, false); FScript = Transform.GetComponent <MSHObjectResource>(); FScript.Init(this); }
// Создание и настройка слота protected override void DoInit(Interactive ASubject) { FSelf = (TSHClassStorageSlot)ASubject; FImage = FSelf.Transform.GetComponent <Image>(); FImageColorPassive = FImage.color; FImageColorActive = FImageColorPassive; FImageColorActive.a = 125; FInfoCount = FSelf.Transform.Find("Info"); FCount = FInfoCount.Find("Count").GetComponent <Text>(); FBackground = GetComponent <Image>(); FCollider = GetComponent <Collider>(); ChangeEnable(false); }
// Клонирование указанного количества слотов private void DoStorageCreate(int AStart, int ACount, bool AClear) { // Слоты всегда создаются для игрока, либо разово для планеты if ((PlayerStorage) || (FSlots.Count == 0)) { TSHClassStorageSlot LSlot; int LDefCount; if (PlayerStorage) { LDefCount = ACount; } else { LDefCount = FPlanetarStorageCount; } for (int LIndex = AStart; LIndex < LDefCount; LIndex++) { LSlot = new TSHClassStorageSlot(UIStorageSlots, LIndex + 1, PlayerStorage); FSlots.Add(LSlot); } } // Для планеты включим нужные слоты, удалив данные о старых if (!PlayerStorage) { for (int LIndex = 0; LIndex < FPlanetarStorageCount; LIndex++) { if (AClear) { // Удалить висящую модельку DoResourceClear(ref FSlots[LIndex].Resource); // Выключить все тексты FSlots[LIndex].ChangeEnable(false); } // Включаем только нужные слоты и делаем их активными, другие выключаем FSlots[LIndex].ChangeState(LIndex < ACount, ActiveSlot); } } FStorageCount = ACount; }
// Обновление данных указанного слота, создание ресурсов в нем public void Change(int APlanet, int AIndex, int AResID, int ACount, int AFlags, bool AActive) { if (Engine.UIPlanetDetails.ActivePlanetId() != APlanet) { return; } TSHClassStorageSlot LSlot = FSlots[AIndex - 1]; // Выставление фона слоту if (!AActive) { LSlot.ChangeState(true, PassiveSlot); } else { LSlot.ChangeState(true, ActiveSlot); } // Обновим сам слот LSlot.Active = AActive; DoStorageUpdate(LSlot, (Shared.ResourceType)AResID, ACount); }
// Очистка слота от ресурсов public void Clear(int APlanet, int AIndex) { if (Engine.UIPlanetDetails.ActivePlanetId() != APlanet) { return; } TSHClassStorageSlot LSlot = FSlots[AIndex - 1]; // Удалим сам ресурс если он есть DoResourceClear(ref LSlot.Resource); // Скроем слот если он был неактивным или цифры если активный if (!LSlot.Active) { LSlot.ChangeState(false, null); } else { LSlot.ChangeEnable(false); } }
// Логика обновления любого хранилища по запросу сервера private void DoStorageUpdate(TSHClassStorageSlot ASlot, Shared.ResourceType AResourceType, int ACount) { // Удалим старый ресурс, если добавляется ресурс другого типа if ((ASlot.Resource != null) && (ASlot.Resource.ResType != AResourceType)) { DoResourceClear(ref ASlot.Resource); } // Если входящий ресурс есть if (AResourceType != Shared.ResourceType.Empty) { // Создадим ресурс, если его нет в слоте if (ASlot.Resource == null) { ASlot.Resource = new Shared.Resource(ASlot.Transform, AResourceType, ASlot); ASlot.Resource.OnResourceMove = DoResourceMove; } ASlot.Resource.Count = ACount; } // Обновим количество ресурса ASlot.ChangeCount(ACount); ASlot.ChangeEnable(ACount > 0); }