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; }
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(); }
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(); }
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; }
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; }