//============================================================================== void GameServer::HandleExamine_(const QVariantMap& request, QVariantMap& response) { auto id = request["id"].toInt(); if (!id || idToActor_.count(id) == 0) { WriteResult_(response, EFEMPResult::BAD_ID); return; } Actor* actor = idToActor_[id]; response["type"] = TypeToString[actor->GetType()]; if (actor->GetType() != EActorType::ITEM && actor->GetType() != EActorType::PROJECTILE) { auto m = dynamic_cast<Creature*>(actor); response["health"] = m->GetHealth(); response["maxHealth"] = m->GetMaxHealth(); } if (response["health"] <= 0 && response["type"] != "item" && response["type"] != "projectile") { WriteResult_ (response, EFEMPResult::BAD_ID); return; } if (actor->GetType() == EActorType::MONSTER) { auto m = dynamic_cast<Monster*>(actor); response["mobType"] = m->GetName(); response["race"] = m->GetRace(); QVariantList items; for (auto& a : m->items) { QVariantMap item; item["id"] = a->GetId(); item["name"] = a->Getname(); item["type"] = a->GetTypeItem(); item["class"] = a->GetClass(); item["subtype"] = a->GetSubtype(); item["weight"] = a->GetWeight(); items << item; } response["inventory"] = items; QVariantMap stats; for (auto i = StringToStat.begin(); i != StringToStat.end(); i++) { stats[i.key()] = m->GetStatValue(i.value()); } response["stats"] = stats; } if (actor->GetType() == EActorType::ITEM) { auto m = dynamic_cast<Item*>(actor); QVariantMap item; item["name"] = m->Getname(); item["type"] = m->GetTypeItem(); item["class"] = m->GetClass(); item["subtype"] = m->GetSubtype(); item["weight"] = m->GetWeight(); response["item"] = item; } if (actor->GetType() == EActorType::PLAYER) { auto p = dynamic_cast<Player*>(actor); response["login"] = p->GetLogin(); QVariantList items; for (auto& a : p->items_) { QVariantMap item; item["id"] = a->GetId(); item["name"] = a->Getname(); item["type"] = a->GetTypeItem(); item["class"] = a->GetClass(); item["subtype"] = a->GetSubtype(); item["weight"] = a->GetWeight(); items << item; } response["inventory"] = items; QVariantMap slots_; for (auto i = SlotToString.begin(); i != SlotToString.end(); i++) { Item* item_ = p->GetSlot(i.value()); if (item_ && item_->GetId() != -1) { QVariantMap item; item["id"] = item_->GetId(); item["name"] = item_->Getname(); item["type"] = item_->GetTypeItem(); item["class"] = item_->GetClass(); item["subtype"] = item_->GetSubtype(); item["weight"] = item_->GetWeight(); slots_[i.key()] = item; } } response["slots"] = slots_; QVariantMap stats; for (auto i = StringToStat.begin(); i != StringToStat.end(); i++) { stats[i.key()] = p->GetStatValue(i.value()); } response["stats"] = stats; } response["x"] = actor->GetPosition().x; response["y"] = actor->GetPosition().y; response["id"] = actor->GetId(); }
void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_Matrix* pUser2Device, const CPDF_RenderOptions* pOptions) { if (GetSubtype() == CPDF_Annot::Subtype::POPUP) return; uint32_t annot_flags = GetFlags(); if (annot_flags & ANNOTFLAG_HIDDEN) { return; } bool bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { return; } if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { return; } CPDF_Dictionary* pBS = m_pAnnotDict->GetDictBy("BS"); char style_char; FX_FLOAT width; CPDF_Array* pDashArray = nullptr; if (!pBS) { CPDF_Array* pBorderArray = m_pAnnotDict->GetArrayBy("Border"); style_char = 'S'; if (pBorderArray) { width = pBorderArray->GetNumberAt(2); if (pBorderArray->GetCount() == 4) { pDashArray = pBorderArray->GetArrayAt(3); if (!pDashArray) { return; } size_t nLen = pDashArray->GetCount(); size_t i = 0; for (; i < nLen; ++i) { CPDF_Object* pObj = pDashArray->GetDirectObjectAt(i); if (pObj && pObj->GetInteger()) { break; } } if (i == nLen) { return; } style_char = 'D'; } } else { width = 1; } } else { CFX_ByteString style = pBS->GetStringBy("S"); pDashArray = pBS->GetArrayBy("D"); style_char = style[1]; width = pBS->GetNumberBy("W"); } if (width <= 0) { return; } CPDF_Array* pColor = m_pAnnotDict->GetArrayBy("C"); uint32_t argb = 0xff000000; if (pColor) { int R = (int32_t)(pColor->GetNumberAt(0) * 255); int G = (int32_t)(pColor->GetNumberAt(1) * 255); int B = (int32_t)(pColor->GetNumberAt(2) * 255); argb = ArgbEncode(0xff, R, G, B); } CFX_GraphStateData graph_state; graph_state.m_LineWidth = width; if (style_char == 'D') { if (pDashArray) { size_t dash_count = pDashArray->GetCount(); if (dash_count % 2) { dash_count++; } graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); graph_state.m_DashCount = dash_count; size_t i; for (i = 0; i < pDashArray->GetCount(); ++i) { graph_state.m_DashArray[i] = pDashArray->GetNumberAt(i); } if (i < dash_count) { graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; } } else { graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); graph_state.m_DashCount = 2; graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; } } CFX_FloatRect rect = GetRect(); CFX_PathData path; width /= 2; path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width); int fill_type = 0; if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) { fill_type |= FXFILL_NOPATHSMOOTH; } pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); }