//------------------------------------------------------------------------ void CItem::SetDualSlaveAccessory(bool noNetwork) { if(!gEnv->bMultiplayer || (GetOwnerActor() && GetOwnerActor()->IsClient())) { CItem *pSlave = static_cast<CItem *>(GetDualWieldSlave()); if (!pSlave) return; //Detach current accessories of the slave TAccessoryMap temp = pSlave->m_accessories; for (TAccessoryMap::const_iterator it=temp.begin(); it!=temp.end(); ++it) { if(m_accessories.find(it->first)==m_accessories.end()) pSlave->SwitchAccessory(it->first.c_str()); //Only remove if not in the master } //Attach on the slave same accessories as "parent" for (TAccessoryMap::const_iterator it=m_accessories.begin(); it!=m_accessories.end(); ++it) { if(pSlave->m_accessories.find(it->first)==pSlave->m_accessories.end()) { if(noNetwork) pSlave->AttachAccessory(it->first.c_str(), true, true, true); else pSlave->SwitchAccessory(it->first.c_str()); //Only add if not already attached } } } }
//------------------------------------------------------------------------ void CItem::UpdateFPView(float frameTime) { if (!m_stats.selected) return; CheckViewChange(); if (!m_stats.fp && !m_stats.mounted) return; if (GetGameObject()->GetAspectProfile(eEA_Physics)!=eIPhys_NotPhysicalized) return; if (m_camerastats.animating) { if (m_camerastats.position) m_camerastats.pos=GetSlotHelperPos(eIGS_FirstPerson, m_camerastats.helper.c_str(), false, true); if (m_camerastats.rotation) m_camerastats.rot=Quat(GetSlotHelperRotation(eIGS_FirstPerson, m_camerastats.helper.c_str(), false, true)); //*Quat::CreateRotationZ(-gf_PI); } if (!m_stats.mounted) { UpdateFPPosition(frameTime); UpdateFPCharacter(frameTime); } if (IItem *pSlave = GetDualWieldSlave()) pSlave->UpdateFPView(frameTime); //UpdateMounted() is only updated in CItem::Update() //if (m_stats.mounted && GetOwnerActor() && GetOwnerActor()->IsClient()) //UpdateMounted(frameTime); }
//------------------------------------------------------------------------ void CItem::ResetDualWield() { if (m_dualWieldSlaveId) { IItem *pSlave = GetDualWieldSlave(); if (pSlave) pSlave->ResetDualWield(); } SetActionSuffix(""); EnableSelect(true); m_dualWieldSlaveId = 0; m_dualWieldMasterId = 0; }
//------------------------------------------------------------------------ void CItem::SetDualWieldSlave(EntityId slaveId) { m_dualWieldSlaveId = slaveId; CItem *pSlave = static_cast<CItem *>(GetDualWieldSlave()); if (!pSlave) return; SetActionSuffix(m_sharedparams->params.dual_wield_suffix.c_str()); pSlave->EnableSelect(false); if (m_stats.hand == eIH_Left) pSlave->SetHand(eIH_Right); else pSlave->SetHand(eIH_Left); }
//------------------------------------------------------ void CWeapon::ForcePendingActions(uint8 blockedActions) { CItem::ForcePendingActions(blockedActions); CActor* pOwner = GetOwnerActor(); if(!pOwner || !pOwner->IsClient()) return; //Force start firing, if needed and possible if(m_requestedFire) { if(!IsDualWield() && !IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } else if(IsDualWield() && IsDualWieldMaster()) { IItem *slave = GetDualWieldSlave(); if(!IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } else if(slave && slave->GetIWeapon()) { CWeapon* dualwield = static_cast<CWeapon*>(slave); if(!dualwield->IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } } } } }
//-------------------------------------------------------------------- bool CWeapon::OnActionAttack(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if(!m_modifying) { COffHand * offHandWeapon = NULL; bool isOffHandSelected = false; GetOffHandInfo(this,isOffHandSelected,&offHandWeapon); if(IsTwoHand()) { if(offHandWeapon && (offHandWeapon->GetOffHandState()&(eOHS_HOLDING_GRENADE|eOHS_SWITCHING_GRENADE|eOHS_PICKING_ITEM))) return false; } if (activationMode == eAAM_OnPress) { if(PreActionAttack(true)) return true; bool isDualWield = false; CWeapon *dualWield = NULL; GetDualWieldInfo(this,isDualWield,&dualWield); // EXPANSION: Dino has rewritten dual wield control! /*if (isDualWield) { m_fire_alternation = !m_fire_alternation; m_requestedFire = true; if (!m_fire_alternation && dualWield->OutOfAmmo(false) && dualWield->CanReload()) { dualWield->Reload(); return true; } else if(m_fire_alternation && OutOfAmmo(false) && CanReload()) { Reload(); return true; } if (m_fire_alternation || (!dualWield->CanFire() || !dualWield->IsSelected())) { if(!IsWeaponRaised() && CanFire()) StartFire(); else if(!dualWield->IsWeaponRaised() && dualWield->IsSelected()) dualWield->StartFire(); } else if (dualWield->CanFire()) { if(!dualWield->IsWeaponRaised() && dualWield->CanFire()) dualWield->StartFire(); else if(!IsWeaponRaised()) StartFire(); } }*/ // /EXPANSION if (isDualWield) { if (offHandWeapon && !(offHandWeapon->GetOffHandState() & (eOHS_INIT_STATE))) return false; m_fire_alternation = false; if (!dualWield->IsWeaponRaised())// && dualWield->CanFire()) { dualWield->StartFire(); } /* else if(dualWield->OutOfAmmo(false) && !dualWield->IsReloading()) { dualWield->Reload(); }*/ dualWield->m_requestedFire = true; } else { if(!m_weaponRaised) { StartFire(); } m_requestedFire = true; } } else if (activationMode == eAAM_OnRelease) { PreActionAttack(false); // EXP 1: Don't stop both slave and master simultaneously!!! //Stop slave if(IsDualWieldMaster()) { //FireSlave(actorId,false); CWeapon *dualWield = NULL; IItem *slave = GetDualWieldSlave(); if (slave && slave->GetIWeapon()) dualWield = static_cast<CWeapon *>(slave); if(dualWield) { dualWield->StopFire(); dualWield->m_requestedFire=false; } } else if (m_fm) { m_fm->StopFire(); m_requestedFire = false; } // StopFire(); // /EXP 1 } } return true; }
void CItem::AttachAccessory(const ItemString &name, bool attach, bool noanim, bool force, bool initialSetup) { if(!force && IsBusy()) return; bool anim = !noanim && m_stats.fp; SAccessoryParams *params = GetAccessoryParams(name); if(!params) return; if(attach) { if(!IsAccessoryHelperFree(params->attach_helper)) return; if(CItem *pAccessory = AddAccessory(name)) { pAccessory->Physicalize(false, false); pAccessory->SetViewMode(m_stats.viewmode); if(!initialSetup) pAccessory->m_bonusAccessoryAmmo.clear(); SetCharacterAttachment(eIGS_FirstPerson, params->attach_helper, pAccessory->GetEntity(), eIGS_FirstPerson, 0); SetBusy(true); AttachAction action(pAccessory, params); if(anim) { PlayAction(params->attach_action, 0, false, eIPAF_Default|eIPAF_NoBlend); m_scheduler.TimerAction(GetCurrentAnimationTime(eIGS_FirstPerson), CSchedulerAction<AttachAction>::Create(action), false); } else action.execute(this); } } else { if(CItem *pAccessory = GetAccessory(name)) { DetachAction action(pAccessory, params); if(anim) { StopLayer(params->attach_layer, eIPAF_Default|eIPAF_NoBlend); PlayAction(params->detach_action, 0, false, eIPAF_Default|eIPAF_NoBlend); m_scheduler.TimerAction(GetCurrentAnimationTime(eIGS_FirstPerson), CSchedulerAction<DetachAction>::Create(action), false); SetBusy(true); } else { SetBusy(true); action.execute(this); } } } //Skip all this for the offhand if(GetEntity()->GetClass()!=CItem::sOffHandClass) FixAccessories(params, attach); //Attach silencer to 2nd SOCOM ///////////////////////////////////////////////////////////// bool isDualWield = IsDualWieldMaster(); CItem *dualWield = 0; if(isDualWield) { IItem *slave = GetDualWieldSlave(); if(slave && slave->GetIWeapon()) dualWield = static_cast<CItem *>(slave); else isDualWield = false; } if(isDualWield) dualWield->AttachAccessory(name,attach,noanim); ////////////////////////////////////////////////////////////// //Luciano - send game event g_pGame->GetIGameFramework()->GetIGameplayRecorder()->Event(GetOwner(), GameplayEvent(eGE_AttachedAccessory, name, (float)attach, (void *)GetEntityId())); }