예제 #1
0
inline int32 CLuaStatusEffect::setStartTime(lua_State* L)
{
    DSP_DEBUG_BREAK_IF(m_PLuaStatusEffect == nullptr);

    DSP_DEBUG_BREAK_IF(lua_isnil(L, 1) || !lua_isnumber(L, 1));


    m_PLuaStatusEffect->SetStartTime(get_server_start_time() + std::chrono::milliseconds(lua_tointeger(L, 1)));
    return 0;
}
예제 #2
0
void CTreasurePool::TreasureLost(uint8 SlotID)
{
    DSP_DEBUG_BREAK_IF(m_PoolItems[SlotID].ID == 0);

    m_PoolItems[SlotID].TimeStamp = get_server_start_time();

    for (uint32 i = 0; i < members.size(); ++i)
    {
        members[i]->pushPacket(new CTreasureLotItemPacket(SlotID, ITEMLOT_WINERROR));
    }
    m_count--;

    m_PoolItems[SlotID].ID = 0;
    m_PoolItems[SlotID].Lotters.clear();
}
예제 #3
0
void CTreasurePool::TreasureError(CCharEntity* winner, uint8 SlotID)
{
    DSP_DEBUG_BREAK_IF(winner == nullptr);
    DSP_DEBUG_BREAK_IF(winner->PTreasurePool != this);
    DSP_DEBUG_BREAK_IF(m_PoolItems[SlotID].ID == 0);

    m_PoolItems[SlotID].TimeStamp = get_server_start_time();

    for (uint32 i = 0; i < members.size(); ++i)
    {
        members[i]->pushPacket(new CTreasureLotItemPacket(winner, SlotID, -1, ITEMLOT_WINERROR));
    }
    m_count--;

    m_PoolItems[SlotID].ID = 0;
    m_PoolItems[SlotID].Lotters.clear();
}
예제 #4
0
uint8 CTreasurePool::AddItem(uint16 ItemID, CBaseEntity* PEntity)
{
    uint8  SlotID;
    uint8  FreeSlotID = -1;
    time_point oldest = time_point::max();

    switch (ItemID)
    {
        case 1126:  //beastmen seal
        case 1127:  //kindred seal
        case 2955:  //kindred crest
        case 2956:  //high kindred crest
            for (uint32 i = 0; i < members.size(); ++i)
            {
                members[i]->PRecastContainer->Add(RECAST_LOOT, 1, 300); //300 = 5 min cooldown
            }
            break;
    }

    for (SlotID = 0; SlotID < 10; ++SlotID)
    {
        if (m_PoolItems[SlotID].ID == 0)
        {
            FreeSlotID = SlotID;
            break;
        }
    }
    if (FreeSlotID > TREASUREPOOL_SIZE)
    {
        //find the oldest non-rare and non-ex item
        for (SlotID = 0; SlotID < 10; ++SlotID)
        {
            CItem* PItem = itemutils::GetItemPointer(m_PoolItems[SlotID].ID);
            if (!(PItem->getFlag() & (ITEM_FLAG_RARE | ITEM_FLAG_EX)) && m_PoolItems[SlotID].TimeStamp < oldest)
            {
                FreeSlotID = SlotID;
                oldest = m_PoolItems[SlotID].TimeStamp;
            }
        }
        if (FreeSlotID > TREASUREPOOL_SIZE)
        {
            //find the oldest non-ex item
            for (SlotID = 0; SlotID < 10; ++SlotID)
            {
                CItem* PItem = itemutils::GetItemPointer(m_PoolItems[SlotID].ID);
                if (!(PItem->getFlag() & (ITEM_FLAG_EX)) && m_PoolItems[SlotID].TimeStamp < oldest)
                {
                    FreeSlotID = SlotID;
                    oldest = m_PoolItems[SlotID].TimeStamp;
                }
            }
            if (FreeSlotID > TREASUREPOOL_SIZE)
            {
                //find the oldest item
                for (SlotID = 0; SlotID < 10; ++SlotID)
                {
                    if (m_PoolItems[SlotID].TimeStamp < oldest)
                    {
                        FreeSlotID = SlotID;
                        oldest = m_PoolItems[SlotID].TimeStamp;
                    }
                }
                if (FreeSlotID > TREASUREPOOL_SIZE)
                {
                    //default fallback
                    FreeSlotID = 0;
                }
            }
        }
    }
    if (SlotID == 10)
    {
        m_PoolItems[FreeSlotID].TimeStamp = get_server_start_time();
        CheckTreasureItem(server_clock::now(), FreeSlotID);
    }

    m_count++;
    m_PoolItems[FreeSlotID].ID = ItemID;
    m_PoolItems[FreeSlotID].TimeStamp = server_clock::now() - treasure_checktime;

    for (uint32 i = 0; i < members.size(); ++i)
    {
        members[i]->pushPacket(new CTreasureFindItemPacket(&m_PoolItems[FreeSlotID], PEntity, false));
    }
    if (m_TreasurePoolType == TREASUREPOOL_SOLO)
    {
        CheckTreasureItem(server_clock::now(), FreeSlotID);
    }
    return m_count;
}
예제 #5
0
inline int32 CLuaStatusEffect::getStartTime(lua_State* L)
{
    DSP_DEBUG_BREAK_IF(m_PLuaStatusEffect == nullptr);

    auto time = std::chrono::duration_cast<std::chrono::milliseconds>(m_PLuaStatusEffect->GetStartTime() - get_server_start_time()).count();

    lua_pushinteger(L, time);
    return 1;
}