//-1 will return equipping feature block //otherwise returns the n'th feature block EffectQueue *Item::GetEffectBlock(Scriptable *self, const Point &pos, int usage, ieDwordSigned invslot, ieDword pro) const { Effect *features; int count; if (usage>=ExtHeaderCount) { return NULL; } if (usage>=0) { features = ext_headers[usage].features; count = ext_headers[usage].FeatureCount; } else { features = equipping_features; count = EquippingFeatureCount; } //collecting all self affecting effects in a single queue, so the random value is rolled only once EffectQueue *fxqueue = new EffectQueue(); EffectQueue *selfqueue = new EffectQueue(); Actor *target = (self->Type==ST_ACTOR)?(Actor *) self:NULL; for (int i=0;i<count;i++) { Effect *fx = features+i; fx->InventorySlot = invslot; fx->CasterLevel = ITEM_CASTERLEVEL; //items all have casterlevel 10 if (usage >= 0) { //this is not coming from the item header, but from the recharge flags fx->SourceFlags = ext_headers[usage].RechargeFlags; } else { fx->SourceFlags = 0; } if (fx->Target != FX_TARGET_SELF) { fx->Projectile = pro; fxqueue->AddEffect( fx ); } else { //Actor *target = (self->Type==ST_ACTOR)?(Actor *) self:NULL; fx->Projectile = 0; fx->PosX=pos.x; fx->PosY=pos.y; if (target) { //core->ApplyEffect(fx, target, self); selfqueue->AddEffect(fx); } } } if (target && selfqueue->GetEffectsCount()) { core->ApplyEffectQueue(selfqueue, target, self); } delete selfqueue; //adding a pulse effect for weapons (PST) //if it is an equipping effect block if ((usage==-1) && (WieldColor!=0xffff)) { if (Flags&IE_ITEM_PULSATING) { Effect *tmp = BuildGlowEffect(WieldColor); if (tmp) { tmp->InventorySlot = invslot; tmp->Projectile=pro; fxqueue->AddEffect( tmp ); delete tmp; } } } return fxqueue; }