void FGAGameEffectContainer::RemoveEffect(FGAGameEffectHandle& HandleIn) { EGAEffectAggregation aggregatiopn = HandleIn.GetEffectRef().GameEffect->EffectAggregation; UObject* Instigator = HandleIn.GetContextRef().Instigator.Get(); TSharedPtr<FGAGameEffect> effect = ActiveEffects.FindAndRemoveChecked(HandleIn); if (effect.IsValid()) { switch (aggregatiopn) { case EGAEffectAggregation::AggregateByInstigator: { TMap<FGAGameEffectHandle, TSharedPtr<FGAGameEffect>>* effects = InstigatorEffects.Find(Instigator); TMap<FName, TSet<FGAGameEffectHandle>>* EffectByClass = InstigatorEffectHandles.Find(Instigator); if (EffectByClass) { //Probabaly need another path for removing just single effect from stack. EffectByClass->Remove(HandleIn.GetEffectSpec()->GetFName()); } if (effects) { effects->FindAndRemoveChecked(HandleIn); if (effects->Num() == 0) { InstigatorEffects.Remove(Instigator); } } break; } case EGAEffectAggregation::AggregateByTarget: { //TargetEffects.FindAndRemoveChecked(HandleIn); TSet<FGAGameEffectHandle>* Handles = TargetEffectByType.Find(HandleIn.GetEffectSpec()->GetFName()); //check aggregation type to know which effect to remove exactly ? TargetEffectByType.Remove(HandleIn.GetEffectSpec()->GetFName()); break; } } for (FGAGameEffectModifier& Modifier : effect->GameEffect->Modifiers) { if (Modifier.Attribute.IsValid()) { FGAAttributeBase* Attribute = OwningComp->GetAttribute(Modifier.Attribute); if (Attribute) { Attribute->RemoveBonus(HandleIn); } } } UE_LOG(GameAttributesEffects, Log, TEXT("FGAGameEffectContainer:: Removing Effect")) effect.Reset(); } }
void FGAGameEffectContainer::RemoveEffect(FGAGameEffectHandle& HandleIn) { EGAEffectAggregation aggregatiopn = HandleIn.GetEffectRef().GameEffect->EffectAggregation; UObject* Instigator = HandleIn.GetContextRef().Instigator.Get(); TSharedPtr<FGAGameEffect> effect = ActiveEffects.FindAndRemoveChecked(HandleIn); if (effect.IsValid()) { switch (aggregatiopn) { case EGAEffectAggregation::AggregateByInstigator: { TMap<FGAGameEffectHandle, TSharedPtr<FGAGameEffect>>* effects = InstigatorEffects.Find(Instigator); TMap<UClass*, FGAGameEffectHandle>* EffectByClass = InstigatorEffectHandles.Find(Instigator); if (EffectByClass) { EffectByClass->Remove(HandleIn.GetEffectSpec()->StaticClass()); } if (effects) { effects->FindAndRemoveChecked(HandleIn); if (effects->Num() == 0) { InstigatorEffects.Remove(Instigator); } } break; } case EGAEffectAggregation::AggregateByTarget: { TargetEffects.FindAndRemoveChecked(HandleIn); break; } } for (FGAGameEffectModifier& Modifier : effect->GameEffect->Modifiers) { if (Modifier.Attribute.IsValid()) { FGAAttributeBase* Attribute = OwningComp->GetAttribute(Modifier.Attribute); if (Attribute) { Attribute->RemoveBonus(HandleIn); } } } UE_LOG(GameAttributesEffects, Log, TEXT("FGAGameEffectContainer:: Removing Effect")) effect.Reset(); } }
void FIOSDeviceHelper::DoDeviceDisconnect(void* deviceHandle) { IOSDevice* device = NULL; for (auto DeviceIterator = ConnectedDevices.CreateIterator(); DeviceIterator; ++DeviceIterator) { if (DeviceIterator.Key()->Handle() == deviceHandle) { device = DeviceIterator.Key(); break; } } if (device != NULL) { // extract the device id from the connected list¯ FIOSLaunchDaemonPong Event = ConnectedDevices.FindAndRemoveChecked(device); // fire the event FIOSDeviceHelper::OnDeviceDisconnected().Broadcast(Event); // delete the device delete device; } }