void CWeapon::OnEvent(NET_Packet& P, u16 type) { switch (type) { case GE_ADDON_CHANGE: { P.r_u8 (m_flagsAddOnState); InitAddons(); UpdateAddonsVisibility(); }break; case GE_WPN_STATE_CHANGE: { u8 state; P.r_u8 (state); P.r_u8 (m_sub_state); // u8 NewAmmoType = P.r_u8(); u8 AmmoElapsed = P.r_u8(); u8 NextAmmo = P.r_u8(); if (NextAmmo == undefined_ammo_type) m_set_next_ammoType_on_reload = undefined_ammo_type; else m_set_next_ammoType_on_reload = NextAmmo; if (OnClient()) SetAmmoElapsed(int(AmmoElapsed)); OnStateSwitch (u32(state)); } break; default: { inherited::OnEvent(P,type); }break; } };
bool CWeaponMagazinedWGrenade::Attach(PIItem pIItem, bool b_send_event) { CGrenadeLauncher* pGrenadeLauncher = smart_cast<CGrenadeLauncher*>(pIItem); if(pGrenadeLauncher && ALife::eAddonAttachable == m_eGrenadeLauncherStatus && 0 == (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher) && !xr_strcmp(*m_sGrenadeLauncherName, pIItem->object().cNameSect())) { m_flagsAddOnState |= CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher; CRocketLauncher::m_fLaunchSpeed = pGrenadeLauncher->GetGrenadeVel(); //уничтожить подствольник из инвентаря if(b_send_event) { if (OnServer()) pIItem->object().DestroyObject (); } InitAddons (); UpdateAddonsVisibility (); if(GetState()==eIdle) PlayAnimIdle (); return true; } else return inherited::Attach(pIItem, b_send_event); }
BOOL CWeapon::net_Spawn (CSE_Abstract* DC) { m_fRTZoomFactor = m_zoom_params.m_fScopeZoomFactor; BOOL bResult = inherited::net_Spawn(DC); CSE_Abstract *e = (CSE_Abstract*)(DC); CSE_ALifeItemWeapon *E = smart_cast<CSE_ALifeItemWeapon*>(e); //iAmmoCurrent = E->a_current; iAmmoElapsed = E->a_elapsed; m_flagsAddOnState = E->m_addon_flags.get(); m_ammoType = E->ammo_type; SetState (E->wpn_state); SetNextState (E->wpn_state); m_DefaultCartridge.Load(m_ammoTypes[m_ammoType].c_str(), m_ammoType); if(iAmmoElapsed) { m_fCurrentCartirdgeDisp = m_DefaultCartridge.param_s.kDisp; for(int i = 0; i < iAmmoElapsed; ++i) m_magazine.push_back(m_DefaultCartridge); } UpdateAddonsVisibility(); InitAddons(); m_dwWeaponIndependencyTime = 0; VERIFY((u32)iAmmoElapsed == m_magazine.size()); m_bAmmoWasSpawned = false; return bResult; }
bool CWeapon::install_upgrade_addon( LPCSTR section, bool test ) { bool result = false; //LPCSTR weapon_section = cNameSect().c_str(); // 0 - no addon // 1 - permanent // 2 - attachable int temp_int = (int)m_eScopeStatus; bool result2 = process_if_exists_set( section, "scope_status", &CInifile::r_s32, temp_int, test ); if ( result2 && !test ) { m_eScopeStatus = (ALife::EWeaponAddonStatus)temp_int; if ( m_eScopeStatus == ALife::eAddonAttachable || m_eScopeStatus == ALife::eAddonPermanent ) { result |= process_if_exists( section, "holder_range_modifier", &CInifile::r_float, m_addon_holder_range_modifier, test ); result |= process_if_exists( section, "holder_fov_modifier", &CInifile::r_float, m_addon_holder_fov_modifier, test ); m_sScopeName = pSettings->r_string( section, "scope_name" ); m_iScopeX = pSettings->r_s32( section, "scope_x" ); m_iScopeY = pSettings->r_s32( section, "scope_y" ); } } result |= result2; temp_int = (int)m_eSilencerStatus; result2 = process_if_exists_set( section, "silencer_status", &CInifile::r_s32, temp_int, test ); if ( result2 && !test ) { m_eSilencerStatus = (ALife::EWeaponAddonStatus)temp_int; if ( m_eSilencerStatus == ALife::eAddonAttachable || m_eSilencerStatus == ALife::eAddonPermanent ) { m_sSilencerName = pSettings->r_string( section, "silencer_name" ); m_iSilencerX = pSettings->r_s32( section, "silencer_x" ); m_iSilencerY = pSettings->r_s32( section, "silencer_y" ); } } result |= result2; temp_int = (int)m_eGrenadeLauncherStatus; result2 = process_if_exists_set( section, "grenade_launcher_status", &CInifile::r_s32, temp_int, test ); if ( result2 && !test ) { m_eGrenadeLauncherStatus = (ALife::EWeaponAddonStatus)temp_int; if ( m_eGrenadeLauncherStatus == ALife::eAddonAttachable || m_eGrenadeLauncherStatus == ALife::eAddonPermanent ) { m_sGrenadeLauncherName = pSettings->r_string( section, "grenade_launcher_name" ); m_iGrenadeLauncherX = pSettings->r_s32( section, "grenade_launcher_x" ); m_iGrenadeLauncherY = pSettings->r_s32( section, "grenade_launcher_y" ); } } result |= result2; InitAddons(); return result; }
bool CWeaponMagazined::Attach(PIItem pIItem, bool b_send_event) { bool result = false; CScope* pScope = smart_cast<CScope*>(pIItem); CSilencer* pSilencer = smart_cast<CSilencer*>(pIItem); CGrenadeLauncher* pGrenadeLauncher = smart_cast<CGrenadeLauncher*>(pIItem); if (pScope && m_eScopeStatus == CSE_ALifeItemWeapon::eAddonAttachable && (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonScope) == 0 && (m_sScopeName == pIItem->object().cNameSect())) { m_flagsAddOnState |= CSE_ALifeItemWeapon::eWeaponAddonScope; result = true; } else if (pSilencer && m_eSilencerStatus == CSE_ALifeItemWeapon::eAddonAttachable && (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonSilencer) == 0 && (m_sSilencerName == pIItem->object().cNameSect())) { m_flagsAddOnState |= CSE_ALifeItemWeapon::eWeaponAddonSilencer; result = true; } else if (pGrenadeLauncher && m_eGrenadeLauncherStatus == CSE_ALifeItemWeapon::eAddonAttachable && (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher) == 0 && (m_sGrenadeLauncherName == pIItem->object().cNameSect())) { m_flagsAddOnState |= CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher; result = true; } if (result) { if (b_send_event && OnServer()) { //уничтожить подсоединенную вещь из инвентаря //. pIItem->Drop (); pIItem->object().DestroyObject(); }; UpdateAddonsVisibility(); InitAddons(); return true; } else return inherited::Attach(pIItem, b_send_event); }
bool CWeaponMagazined::Detach(const char* item_section_name, bool b_spawn_item) { if (m_eScopeStatus == CSE_ALifeItemWeapon::eAddonAttachable && 0 != (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonScope) && (m_sScopeName == item_section_name)) { m_flagsAddOnState &= ~CSE_ALifeItemWeapon::eWeaponAddonScope; UpdateAddonsVisibility(); InitAddons(); return CInventoryItemObject::Detach(item_section_name, b_spawn_item); } else if (m_eSilencerStatus == CSE_ALifeItemWeapon::eAddonAttachable && 0 != (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonSilencer) && (m_sSilencerName == item_section_name)) { m_flagsAddOnState &= ~CSE_ALifeItemWeapon::eWeaponAddonSilencer; UpdateAddonsVisibility(); InitAddons(); return CInventoryItemObject::Detach(item_section_name, b_spawn_item); } else if (m_eGrenadeLauncherStatus == CSE_ALifeItemWeapon::eAddonAttachable && 0 != (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher) && (m_sGrenadeLauncherName == item_section_name)) { m_flagsAddOnState &= ~CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher; UpdateAddonsVisibility(); InitAddons(); return CInventoryItemObject::Detach(item_section_name, b_spawn_item); } else return inherited::Detach(item_section_name, b_spawn_item);; }
// CONSTRUTORA DA CLASSE GERENCIADORGRAFICO GerenciadorGrafico::GerenciadorGrafico() { FilaEventos = NULL; display = NULL; timer = NULL; fonte= NULL; InitAllegro(); // INICIALIZACAO DO ALLEGRO CriaDisplay(); // CRIA O DISPLAY TestaDisplay(); // VERIFICA SE O DISPLAY FOI CRIADO CORRETAMENTE InstalaHardwares(); // INSTALA OS AGENTES EXTERNOS InitAddons(); // INICIALIZACAO DOS ADDONS DO ALLEGRO CriaFilaEventos(); // CRIA A FILA DE EVENTOS CriaTimer(); // CRIA O TEMPORIZADOR RegistraSources(); // REGISTRA OS SOURCES DO ALLEGRO NA FILA DE EVENTOS }
void CWeapon::Load (LPCSTR section) { inherited::Load (section); CShootingObject::Load (section); if(pSettings->line_exist(section, "flame_particles_2")) m_sFlameParticles2 = pSettings->r_string(section, "flame_particles_2"); // load ammo classes m_ammoTypes.clear (); LPCSTR S = pSettings->r_string(section,"ammo_class"); if (S && S[0]) { string128 _ammoItem; int count = _GetItemCount (S); for (int it=0; it<count; ++it) { _GetItem (S,it,_ammoItem); m_ammoTypes.push_back (_ammoItem); } } iAmmoElapsed = pSettings->r_s32 (section,"ammo_elapsed" ); iMagazineSize = pSettings->r_s32 (section,"ammo_mag_size" ); //////////////////////////////////////////////////// // дисперсия стрельбы //подбрасывание камеры во время отдачи u8 rm = READ_IF_EXISTS( pSettings, r_u8, section, "cam_return", 1 ); cam_recoil.ReturnMode = (rm == 1); rm = READ_IF_EXISTS( pSettings, r_u8, section, "cam_return_stop", 0 ); cam_recoil.StopReturn = (rm == 1); float temp_f = 0.0f; temp_f = pSettings->r_float( section,"cam_relax_speed" ); cam_recoil.RelaxSpeed = _abs( deg2rad( temp_f ) ); VERIFY( !fis_zero(cam_recoil.RelaxSpeed) ); if ( fis_zero(cam_recoil.RelaxSpeed) ) { cam_recoil.RelaxSpeed = EPS_L; } cam_recoil.RelaxSpeed_AI = cam_recoil.RelaxSpeed; if ( pSettings->line_exist( section, "cam_relax_speed_ai" ) ) { temp_f = pSettings->r_float( section, "cam_relax_speed_ai" ); cam_recoil.RelaxSpeed_AI = _abs( deg2rad( temp_f ) ); VERIFY( !fis_zero(cam_recoil.RelaxSpeed_AI) ); if ( fis_zero(cam_recoil.RelaxSpeed_AI) ) { cam_recoil.RelaxSpeed_AI = EPS_L; } } temp_f = pSettings->r_float( section, "cam_max_angle" ); cam_recoil.MaxAngleVert = _abs( deg2rad( temp_f ) ); VERIFY( !fis_zero(cam_recoil.MaxAngleVert) ); if ( fis_zero(cam_recoil.MaxAngleVert) ) { cam_recoil.MaxAngleVert = EPS; } temp_f = pSettings->r_float( section, "cam_max_angle_horz" ); cam_recoil.MaxAngleHorz = _abs( deg2rad( temp_f ) ); VERIFY( !fis_zero(cam_recoil.MaxAngleHorz) ); if ( fis_zero(cam_recoil.MaxAngleHorz) ) { cam_recoil.MaxAngleHorz = EPS; } temp_f = pSettings->r_float( section, "cam_step_angle_horz" ); cam_recoil.StepAngleHorz = deg2rad( temp_f ); cam_recoil.DispersionFrac = _abs( READ_IF_EXISTS( pSettings, r_float, section, "cam_dispersion_frac", 0.7f ) ); //подбрасывание камеры во время отдачи в режиме zoom ==> ironsight or scope //zoom_cam_recoil.Clone( cam_recoil ); ==== нельзя !!!!!!!!!! zoom_cam_recoil.RelaxSpeed = cam_recoil.RelaxSpeed; zoom_cam_recoil.RelaxSpeed_AI = cam_recoil.RelaxSpeed_AI; zoom_cam_recoil.DispersionFrac = cam_recoil.DispersionFrac; zoom_cam_recoil.MaxAngleVert = cam_recoil.MaxAngleVert; zoom_cam_recoil.MaxAngleHorz = cam_recoil.MaxAngleHorz; zoom_cam_recoil.StepAngleHorz = cam_recoil.StepAngleHorz; zoom_cam_recoil.ReturnMode = cam_recoil.ReturnMode; zoom_cam_recoil.StopReturn = cam_recoil.StopReturn; if ( pSettings->line_exist( section, "zoom_cam_relax_speed" ) ) { zoom_cam_recoil.RelaxSpeed = _abs( deg2rad( pSettings->r_float( section, "zoom_cam_relax_speed" ) ) ); VERIFY( !fis_zero(zoom_cam_recoil.RelaxSpeed) ); if ( fis_zero(zoom_cam_recoil.RelaxSpeed) ) { zoom_cam_recoil.RelaxSpeed = EPS_L; } } if ( pSettings->line_exist( section, "zoom_cam_relax_speed_ai" ) ) { zoom_cam_recoil.RelaxSpeed_AI = _abs( deg2rad( pSettings->r_float( section,"zoom_cam_relax_speed_ai" ) ) ); VERIFY( !fis_zero(zoom_cam_recoil.RelaxSpeed_AI) ); if ( fis_zero(zoom_cam_recoil.RelaxSpeed_AI) ) { zoom_cam_recoil.RelaxSpeed_AI = EPS_L; } } if ( pSettings->line_exist( section, "zoom_cam_max_angle" ) ) { zoom_cam_recoil.MaxAngleVert = _abs( deg2rad( pSettings->r_float( section, "zoom_cam_max_angle" ) ) ); VERIFY( !fis_zero(zoom_cam_recoil.MaxAngleVert) ); if ( fis_zero(zoom_cam_recoil.MaxAngleVert) ) { zoom_cam_recoil.MaxAngleVert = EPS; } } if ( pSettings->line_exist( section, "zoom_cam_max_angle_horz" ) ) { zoom_cam_recoil.MaxAngleHorz = _abs( deg2rad( pSettings->r_float( section, "zoom_cam_max_angle_horz" ) ) ); VERIFY( !fis_zero(zoom_cam_recoil.MaxAngleHorz) ); if ( fis_zero(zoom_cam_recoil.MaxAngleHorz) ) { zoom_cam_recoil.MaxAngleHorz = EPS; } } if ( pSettings->line_exist( section, "zoom_cam_step_angle_horz" ) ) { zoom_cam_recoil.StepAngleHorz = deg2rad( pSettings->r_float( section, "zoom_cam_step_angle_horz" ) ); } if ( pSettings->line_exist( section, "zoom_cam_dispersion_frac" ) ) { zoom_cam_recoil.DispersionFrac = _abs( pSettings->r_float( section, "zoom_cam_dispersion_frac" ) ); } m_pdm.m_fPDM_disp_base = pSettings->r_float( section, "PDM_disp_base" ); m_pdm.m_fPDM_disp_vel_factor = pSettings->r_float( section, "PDM_disp_vel_factor" ); m_pdm.m_fPDM_disp_accel_factor = pSettings->r_float( section, "PDM_disp_accel_factor" ); m_pdm.m_fPDM_disp_crouch = pSettings->r_float( section, "PDM_disp_crouch" ); m_pdm.m_fPDM_disp_crouch_no_acc = pSettings->r_float( section, "PDM_disp_crouch_no_acc" ); m_crosshair_inertion = READ_IF_EXISTS(pSettings, r_float, section, "crosshair_inertion", 5.91f); m_first_bullet_controller.load (section); fireDispersionConditionFactor = pSettings->r_float(section,"fire_dispersion_condition_factor"); // modified by Peacemaker [17.10.08] // misfireProbability = pSettings->r_float(section,"misfire_probability"); // misfireConditionK = READ_IF_EXISTS(pSettings, r_float, section, "misfire_condition_k", 1.0f); misfireStartCondition = pSettings->r_float(section, "misfire_start_condition"); misfireEndCondition = READ_IF_EXISTS(pSettings, r_float, section, "misfire_end_condition", 0.f); misfireStartProbability = READ_IF_EXISTS(pSettings, r_float, section, "misfire_start_prob", 0.f); misfireEndProbability = pSettings->r_float(section, "misfire_end_prob"); conditionDecreasePerShot = pSettings->r_float(section,"condition_shot_dec"); conditionDecreasePerQueueShot = READ_IF_EXISTS(pSettings, r_float, section, "condition_queue_shot_dec", conditionDecreasePerShot); vLoadedFirePoint = pSettings->r_fvector3 (section,"fire_point" ); if(pSettings->line_exist(section,"fire_point2")) vLoadedFirePoint2= pSettings->r_fvector3 (section,"fire_point2"); else vLoadedFirePoint2= vLoadedFirePoint; // hands eHandDependence = EHandDependence(pSettings->r_s32(section,"hand_dependence")); m_bIsSingleHanded = true; if (pSettings->line_exist(section, "single_handed")) m_bIsSingleHanded = !!pSettings->r_bool(section, "single_handed"); // m_fMinRadius = pSettings->r_float (section,"min_radius"); m_fMaxRadius = pSettings->r_float (section,"max_radius"); // информация о возможных апгрейдах и их визуализации в инвентаре m_eScopeStatus = (ALife::EWeaponAddonStatus)pSettings->r_s32(section,"scope_status"); m_eSilencerStatus = (ALife::EWeaponAddonStatus)pSettings->r_s32(section,"silencer_status"); m_eGrenadeLauncherStatus = (ALife::EWeaponAddonStatus)pSettings->r_s32(section,"grenade_launcher_status"); m_zoom_params.m_bZoomEnabled = !!pSettings->r_bool(section,"zoom_enabled"); m_zoom_params.m_fZoomRotateTime = pSettings->r_float(section,"zoom_rotate_time"); if ( m_eScopeStatus == ALife::eAddonAttachable ) { if(pSettings->line_exist(section, "scopes_sect")) { LPCSTR str = pSettings->r_string(section, "scopes_sect"); for(int i = 0, count = _GetItemCount(str); i < count; ++i ) { string128 scope_section; _GetItem (str, i, scope_section); m_scopes.push_back (scope_section); } } else { m_scopes.push_back(section); } } else if( m_eScopeStatus == ALife::eAddonPermanent ) { shared_str scope_tex_name = pSettings->r_string(cNameSect(), "scope_texture"); m_zoom_params.m_fScopeZoomFactor = pSettings->r_float( cNameSect(), "scope_zoom_factor"); if ( !g_dedicated_server ) { m_UIScope = xr_new<CUIWindow>(); if(!pWpnScopeXml) { pWpnScopeXml = xr_new<CUIXml>(); pWpnScopeXml->Load (CONFIG_PATH, UI_PATH, "scopes.xml"); } CUIXmlInit::InitWindow (*pWpnScopeXml, scope_tex_name.c_str(), 0, m_UIScope); } } if ( m_eSilencerStatus == ALife::eAddonAttachable ) { m_sSilencerName = pSettings->r_string(section,"silencer_name"); m_iSilencerX = pSettings->r_s32(section,"silencer_x"); m_iSilencerY = pSettings->r_s32(section,"silencer_y"); } if ( m_eGrenadeLauncherStatus == ALife::eAddonAttachable ) { m_sGrenadeLauncherName = pSettings->r_string(section,"grenade_launcher_name"); m_iGrenadeLauncherX = pSettings->r_s32(section,"grenade_launcher_x"); m_iGrenadeLauncherY = pSettings->r_s32(section,"grenade_launcher_y"); } InitAddons(); if(pSettings->line_exist(section,"weapon_remove_time")) m_dwWeaponRemoveTime = pSettings->r_u32(section,"weapon_remove_time"); else m_dwWeaponRemoveTime = WEAPON_REMOVE_TIME; if(pSettings->line_exist(section,"auto_spawn_ammo")) m_bAutoSpawnAmmo = pSettings->r_bool(section,"auto_spawn_ammo"); else m_bAutoSpawnAmmo = TRUE; m_zoom_params.m_bHideCrosshairInZoom = true; if(pSettings->line_exist(hud_sect, "zoom_hide_crosshair")) m_zoom_params.m_bHideCrosshairInZoom = !!pSettings->r_bool(hud_sect, "zoom_hide_crosshair"); Fvector def_dof; def_dof.set (-1,-1,-1); // m_zoom_params.m_ZoomDof = READ_IF_EXISTS(pSettings, r_fvector3, section, "zoom_dof", Fvector().set(-1,-1,-1)); // m_zoom_params.m_bZoomDofEnabled = !def_dof.similar(m_zoom_params.m_ZoomDof); // m_zoom_params.m_ReloadDof = READ_IF_EXISTS(pSettings, r_fvector4, section, "reload_dof", Fvector4().set(-1,-1,-1,-1)); m_bHasTracers = !!READ_IF_EXISTS(pSettings, r_bool, section, "tracers", true); m_u8TracerColorID = READ_IF_EXISTS(pSettings, r_u8, section, "tracers_color_ID", u8(-1)); string256 temp; for (int i=egdNovice; i<egdCount; ++i) { strconcat (sizeof(temp),temp,"hit_probability_",get_token_name(difficulty_type_token,i)); m_hit_probability[i] = READ_IF_EXISTS(pSettings,r_float,section,temp,1.f); } m_zoom_params.m_bUseDynamicZoom = READ_IF_EXISTS(pSettings,r_bool,section,"scope_dynamic_zoom",FALSE); m_zoom_params.m_sUseZoomPostprocess = 0; m_zoom_params.m_sUseBinocularVision = 0; }