void CAccessory::PickUp(EntityId pickerId, bool sound, bool select, bool keepHistory, const char *setup) { CActor *pActor=GetActor(pickerId); if (!pActor) return; if(!CheckAmmoRestrictions(pickerId)) { if (IsServer()) g_pGame->GetGameRules()->SendTextMessage(eTextMessageCenter, "@ammo_maxed_out", eRMI_ToClientChannel, pActor->GetChannelId(), (string("@")+GetEntity()->GetClass()->GetName()).c_str()); return; } TriggerRespawn(); GetEntity()->EnablePhysics(false); Physicalize(false, false); bool soundEnabled = IsSoundEnabled(); EnableSound(sound); SetViewMode(0); SetOwnerId(pickerId); CopyRenderFlags(GetOwner()); Hide(true); m_stats.dropped = false; m_stats.brandnew = false; IInventory *pInventory = pActor->GetInventory(); if (!pInventory) { GameWarning("Actor '%s' has no inventory, when trying to pickup '%s'!",pActor->GetEntity()->GetName(),GetEntity()->GetName()); return; } if(!pInventory->HasAccessory(GetEntity()->GetClass())) { pInventory->AddAccessory(GetEntity()->GetClass()); } OnPickedUp(pickerId, m_sharedparams->params.unique); PlayAction(g_pItemStrings->pickedup); EnableSound(soundEnabled); if (IsServer() && !IsDemoPlayback()) { if(!gEnv->bMultiplayer) RemoveEntity(); else if(g_pGame->GetGameRules()) g_pGame->GetGameRules()->ScheduleEntityRemoval(GetEntityId(),10.0f,false); //Give some time to the clients to pick the msg } if (IsServer()) { GetGameObject()->SetNetworkParent(pickerId); if ((GetEntity()->GetFlags()&(ENTITY_FLAG_CLIENT_ONLY|ENTITY_FLAG_SERVER_ONLY)) == 0) { pActor->GetGameObject()->InvokeRMIWithDependentObject(CActor::ClPickUp(), CActor::PickItemParams(GetEntityId(), m_stats.selected, sound), eRMI_ToAllClients|eRMI_NoLocalCalls, GetEntityId()); const char *displayName=GetDisplayName(); } } }
void CAccessory::PickUp(EntityId pickerId, bool sound, bool select/* =true */, bool keepHistory/* =true */, const char *setup /*= NULL*/) { CActor *pActor=GetActor(pickerId); if (!pActor) return; TriggerRespawn(); GetEntity()->EnablePhysics(false); Physicalize(false, false); bool soundEnabled = IsSoundEnabled(); EnableSound(sound); SetViewMode(0); SetOwnerId(pickerId); CopyRenderFlags(GetOwner()); Hide(true); m_stats.dropped = false; m_stats.detached = false; m_stats.brandnew = false; IInventory *pInventory = pActor->GetInventory(); if (!pInventory) { GameWarning("Actor '%s' has no inventory, when trying to pickup '%s'!",pActor->GetEntity()->GetName(),GetEntity()->GetName()); return; } if (!pActor->IsPlayer() || pActor->IsClient() || gEnv->bMultiplayer) { bool hasAccessory = pInventory->HasAccessory(GetEntity()->GetClass()); bool hasAccessoryForThisWeapon = pInventory->HasAccessory(GetEntity()->GetClass()); if (!hasAccessoryForThisWeapon) pInventory->AddAccessory(GetEntity()->GetClass()); if (!hasAccessory) ProcessAccessoryAmmoCapacities(pInventory, true); if (!hasAccessoryForThisWeapon) ProcessAccessoryAmmo(pInventory); } OnPickedUp(pickerId, m_sharedparams->params.unique); if (select) { PlayAction(GetFragmentIds().pickedup); } EnableSound(soundEnabled); bool isLocalEntity = GetEntity()->GetFlags()&(ENTITY_FLAG_CLIENT_ONLY|ENTITY_FLAG_SERVER_ONLY) ? true : false; if (IsServer() && !IsDemoPlayback()) { if(!gEnv->bMultiplayer || isLocalEntity) RemoveEntity(); else if(g_pGame->GetGameRules()) g_pGame->GetGameRules()->ScheduleEntityRemoval(GetEntityId(),10.0f,false); //Give some time to the clients to pick the msg } if (IsServer()) { GetGameObject()->SetNetworkParent(pickerId); if (!isLocalEntity) { pActor->GetGameObject()->InvokeRMIWithDependentObject(CActor::ClPickUp(), CActor::PickItemParams(GetEntityId(), m_stats.selected, sound), eRMI_ToAllClients|eRMI_NoLocalCalls, GetEntityId()); } } }
void CFlashUICheckAccessoryState ::ProcessEvent( EFlowEvent event, SActivationInfo *pActInfo ) { if(event == eFE_Activate && IsPortActive(pActInfo, 0)) { IActor* pActor = GetInputActor( pActInfo ); bool is_equipped = false; bool is_inInventory = false; if(pActor) { IInventory* pInventory = pActor->GetInventory(); if(pInventory) { IEntityClassRegistry *pRegistry = gEnv->pEntitySystem->GetClassRegistry(); //Find the accessory's class in the registry const string accessory_name = GetPortString(pActInfo, eI_Accessory); IEntityClass* pClass = pRegistry->FindClass(accessory_name); //Check if its in inventory if(pInventory->HasAccessory(pClass) != 0) { is_inInventory = true; } //if it is, check if its equipped as well if(is_inInventory) { //Get the weapon ID via the Input string const char* weapon_name = GetPortString(pActInfo, eI_Weapon).c_str(); EntityId item = pInventory->GetItemByClass(pRegistry->FindClass(weapon_name)); //Fetch the actual weapon via the ID IEntity* pEntity = gEnv->pEntitySystem->GetEntity(item); if(pEntity) { CGameObject * pGameObject = (CGameObject*)pEntity->GetProxy(ENTITY_PROXY_USER); const char* ext = pGameObject->GetEntity()->GetClass()->GetName(); CWeapon* pWeapon = (CWeapon*)pGameObject->QueryExtension(pGameObject->GetEntity()->GetClass()->GetName()); bool selectable = pWeapon->CanSelect(); if(pWeapon) { if(pWeapon->GetAccessory(pClass->GetName()) != 0) { is_equipped = true; } } } } } } if(!is_inInventory) ActivateOutput(pActInfo, eO_DontHave, true); else if(is_equipped) ActivateOutput(pActInfo, eO_Equipped, true); else ActivateOutput(pActInfo, eO_InInventory, true); } }