void GuiContainer::AddBottom(GuiLayer *layer, GuiEffect *effect, bool queue) { Lock(); LayerTransform transform; (void)CancelEffectsInProgress(layer, true, &queue, &transform); LayerAdd(layers.end(), true, layer, effect, queue, &transform); Unlock(); }
void GuiContainer::AddTopFixed(GuiLayer *layer, GuiEffect *effect, bool queue) { Lock(); LayerTransform transform; (void)CancelEffectsInProgress(layer, true, &queue, &transform); LayerAdd(first_nonfixed, false, layer, effect, queue, &transform); Unlock(); }
bool GuiContainer::AddBehind(GuiLayer *behind, GuiLayer *layer, GuiEffect *effect, bool queue) { Lock(); LayerTransform transform; (void)CancelEffectsInProgress(layer, true, &queue, &transform); LayerIndex index = LayerGetIndex(behind); if( index != layers.end() ) { LayerAdd(++index, true, layer, effect, queue, &transform); Unlock(); return true; } Unlock(); return false; }
bool CChar::Use_Item_Web( CItem * pItemWeb ) { ADDTOCALLSTACK("CChar::Use_Item_Web"); // IT_WEB // IT_EQ_STUCK // Try to break out of the web. // Or just try to damage it. // // RETURN: true = held in place. // false = walk thru it. if ( GetDispID() == CREID_GIANT_SPIDER || !pItemWeb || !pItemWeb->IsTopLevel() || IsStatFlag(STATF_DEAD|STATF_Insubstantial) || IsPriv(PRIV_GM) ) return false; // just walk through it // Try to break it. int iStr = pItemWeb->m_itWeb.m_Hits_Cur; if ( iStr == 0 ) iStr = pItemWeb->m_itWeb.m_Hits_Cur = 60 + Calc_GetRandVal(250); // Since broken webs become spider silk, we should get out of here now if we aren't in a web. CItem *pFlag = LayerFind(LAYER_FLAG_Stuck); if ( CanMove(pItemWeb, false) ) { if ( pFlag ) pFlag->Delete(); return false; } if ( pFlag ) { if ( pFlag->IsTimerSet() ) // don't allow me to try to damage it too often return true; } int iDmg = pItemWeb->OnTakeDamage(Stat_GetAdjusted(STAT_STR), this); switch ( iDmg ) { case 0: // damage blocked case 1: // web survived default: // unknown if ( GetTopPoint() == pItemWeb->GetTopPoint() ) // is character still stuck on the web? break; case 2: // web turned into silk case INT_MAX: // web destroyed if ( pFlag ) pFlag->Delete(); return false; } // Stuck in it still. if ( !pFlag ) { if ( iDmg < 0 ) return false; // First time message. pFlag = CItem::CreateBase(ITEMID_WEB1_1); ASSERT(pFlag); pFlag->SetAttr(ATTR_DECAY); pFlag->SetType(IT_EQ_STUCK); pFlag->m_uidLink = pItemWeb->GetUID(); pFlag->SetTimeout(pItemWeb->GetTimerDAdjusted()); LayerAdd(pFlag, LAYER_FLAG_Stuck); } else { if ( iDmg < 0 ) { pFlag->Delete(); return false; } SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_ITEMUSE_SWEB_STUCK), pItemWeb->GetName()); } return true; }