diff --git a/res/gamedata/scripts/ui_sleep_dialog.script b/res/gamedata/scripts/ui_sleep_dialog.script index 2b6e4c259a1..8caf72f4d03 100644 --- a/res/gamedata/scripts/ui_sleep_dialog.script +++ b/res/gamedata/scripts/ui_sleep_dialog.script @@ -6,6 +6,8 @@ function sleep_dialog:__init() super() if(device().width/device().height>(1024/768+0.01)) then wide = true end + + self:SetAutoDelete(true) local xml = CScriptXmlInit() xml:ParseFile("ui_sleep_dialog.xml") @@ -18,10 +20,10 @@ function sleep_dialog:__init() super() self.static_cover = xml:InitStatic("static_cover", self.back) self.st_marker = xml:InitStatic("st_marker", self.static_cover) - sleep_st_tbl = {} - for i = 1, 24 do - sleep_st_tbl[i] = xml:InitStatic("sleep_st_"..i, self.back) - end + self.sleep_st_tbl = {} + for i = 1, 24 do + self.sleep_st_tbl[i] = xml:InitStatic("sleep_st_"..i, self.back) + end self.time_track = xml:InitTrackBar("time_track", self.back) self:Register(self.time_track, "time_track") @@ -33,6 +35,7 @@ function sleep_dialog:__init() super() self:Register(self.btn_cancel, "btn_cancel") self.sleep_mb = CUIMessageBoxEx() + self.sleep_mb:self:SetAutoDelete(true) self:Register(self.sleep_mb, "sleep_mb") -------------------------------------------------------------------------------- self:AddCallback("btn_sleep", ui_events.BUTTON_CLICKED, self.OnButtonSleep, self) @@ -43,11 +46,11 @@ end function sleep_dialog:Initialize() local cur_hours = level.get_time_hours() for i = 1, 24 do - local hours = cur_hours + i - if(hours>=24) then - hours = hours - 24 - end - sleep_st_tbl[i]:TextControl():SetText(hours..game.translate_string("st_sleep_hours")) + local hours = cur_hours + i + if(hours>=24) then + hours = hours - 24 + end + self.sleep_st_tbl[i]:TextControl():SetText(hours..game.translate_string("st_sleep_hours")) end local delta = math.floor(591/24*cur_hours) @@ -72,6 +75,10 @@ function sleep_dialog:Initialize() self.sleep_static2:SetWndPos(pos) end +function sleep_dialog:__finalize() + sleep_control = nil +end + function sleep_dialog:TestAndShow() if(db.actor.bleeding>0 or db.actor.radiation>0) then self.sleep_mb:InitMessageBox("message_box_ok") diff --git a/src/xrCore/LocatorAPI.cpp b/src/xrCore/LocatorAPI.cpp index 1d92fb218cc..a37f6a22147 100644 --- a/src/xrCore/LocatorAPI.cpp +++ b/src/xrCore/LocatorAPI.cpp @@ -537,6 +537,9 @@ IC bool pred_str_ff(const _finddata_t& x, const _finddata_t& y) bool ignore_name(const char* _name) { + // ignore windows hidden Thumbs.db + if (0 == strcmp(_name, "Thumbs.db")) + return true; // ignore processing ".svn" folders return (_name[0] == '.' && _name[1] == 's' && _name[2] == 'v' && _name[3] == 'n' && _name[4] == 0); } diff --git a/src/xrGame/Actor.h b/src/xrGame/Actor.h index e45edbef28f..e9fdc2eafa0 100644 --- a/src/xrGame/Actor.h +++ b/src/xrGame/Actor.h @@ -244,7 +244,7 @@ struct SDefNewsMsg{ void detach_Vehicle (); void steer_Vehicle (float angle); void attach_Vehicle (CHolderCustom* vehicle); - + bool use_MountedWeapon (CHolderCustom* object); virtual bool can_attach (const CInventoryItem *inventory_item) const; protected: CHolderCustom* m_holder; @@ -252,7 +252,6 @@ struct SDefNewsMsg{ bool use_Holder (CHolderCustom* holder); bool use_Vehicle (CHolderCustom* object); - bool use_MountedWeapon (CHolderCustom* object); void ActorUse (); protected: diff --git a/src/xrGame/ActorAnimation.cpp b/src/xrGame/ActorAnimation.cpp index 209a87f18f7..e5831c06b78 100644 --- a/src/xrGame/ActorAnimation.cpp +++ b/src/xrGame/ActorAnimation.cpp @@ -288,7 +288,6 @@ void CActor::g_SetSprintAnimation( u32 mstate_rl,MotionID &head,MotionID &torso, SActorSprintState& sprint = m_anims->m_sprint; bool jump = (mstate_rl&mcFall) || - (mstate_rl&mcLanding) || (mstate_rl&mcLanding) || (mstate_rl&mcLanding2) || (mstate_rl&mcJump) ; diff --git a/src/xrGame/DestroyablePhysicsObject.cpp b/src/xrGame/DestroyablePhysicsObject.cpp index 8e1afad519a..6afb65018f2 100644 --- a/src/xrGame/DestroyablePhysicsObject.cpp +++ b/src/xrGame/DestroyablePhysicsObject.cpp @@ -30,7 +30,7 @@ CDestroyablePhysicsObject::~CDestroyablePhysicsObject() void CDestroyablePhysicsObject::OnChangeVisual() { if (m_pPhysicsShell){ - if(m_pPhysicsShell)m_pPhysicsShell->Deactivate(); + m_pPhysicsShell->Deactivate(); xr_delete (m_pPhysicsShell); VERIFY (0==Visual()); } diff --git a/src/xrGame/Entity.cpp b/src/xrGame/Entity.cpp index a741fbffb5b..c882f887263 100644 --- a/src/xrGame/Entity.cpp +++ b/src/xrGame/Entity.cpp @@ -246,6 +246,11 @@ void CEntity::net_Destroy () void CEntity::KillEntity(u16 whoID) { + if (this->ID() == Actor()->ID()) + { + Actor()->detach_Vehicle(); + Actor()->use_MountedWeapon(NULL); + } if (whoID != ID()) { #ifdef DEBUG if (m_killer_id != ALife::_OBJECT_ID(-1)) { diff --git a/src/xrGame/HudSound.cpp b/src/xrGame/HudSound.cpp index 0c45d2bf69b..463513c7677 100644 --- a/src/xrGame/HudSound.cpp +++ b/src/xrGame/HudSound.cpp @@ -105,7 +105,7 @@ void HUD_SOUND_ITEM::PlaySound( HUD_SOUND_ITEM& hud_snd, flags, hud_snd.m_activeSnd->delay); - hud_snd.m_activeSnd->snd.set_volume (hud_snd.m_activeSnd->volume * b_hud_mode?psHUDSoundVolume:1.0f); + hud_snd.m_activeSnd->snd.set_volume(hud_snd.m_activeSnd->volume * (b_hud_mode ? psHUDSoundVolume : 1.0f)); } void HUD_SOUND_ITEM::StopSound(HUD_SOUND_ITEM& hud_snd) diff --git a/src/xrGame/Level_bullet_manager_firetrace.cpp b/src/xrGame/Level_bullet_manager_firetrace.cpp index d83cf0fd701..c1900b99615 100644 --- a/src/xrGame/Level_bullet_manager_firetrace.cpp +++ b/src/xrGame/Level_bullet_manager_firetrace.cpp @@ -36,6 +36,9 @@ extern float gCheckHitK; //return TRUE-тестировать объект / FALSE-пропустить объект BOOL CBulletManager::test_callback(const collide::ray_defs& rd, IGameObject* object, LPVOID params) { + if (!object) + return TRUE; + bullet_test_callback_data* pData = (bullet_test_callback_data*)params; SBullet* bullet = pData->pBullet; @@ -44,97 +47,95 @@ BOOL CBulletManager::test_callback(const collide::ray_defs& rd, IGameObject* obj (!bullet->flags.ricochet_was)) return FALSE; BOOL bRes = TRUE; - if (object){ - CEntity* entity = smart_cast(object); - if (entity&&entity->g_Alive()&&(entity->ID()!=bullet->parent_id)){ - ICollisionForm* cform = entity->GetCForm(); - if ((NULL!=cform) && (cftObject==cform->Type())){ - CActor* actor = smart_cast(entity); - CAI_Stalker* stalker= smart_cast(entity); - // в кого попали? - if (actor && IsGameTypeSingle()/**/||stalker/**/){ - // попали в актера или сталкера - Fsphere S = cform->getSphere(); - entity->XFORM().transform_tiny (S.P) ; - float dist = rd.range; - // проверим попали ли мы в описывающую сферу - if (Fsphere::rpNone!=S.intersect_full(bullet->bullet_pos, bullet->dir, dist)) - { - // да попали, найдем кто стрелял - bool play_whine = true; - IGameObject* initiator = Level().Objects.net_Find (bullet->parent_id); - if (actor){ - // попали в актера - float hpf = 1.f; - float ahp = actor->HitProbability(); + CEntity* entity = smart_cast(object); + if (entity&&entity->g_Alive()&&(entity->ID()!=bullet->parent_id)){ + ICollisionForm* cform = entity->GetCForm(); + if ((NULL!=cform) && (cftObject==cform->Type())){ + CActor* actor = smart_cast(entity); + CAI_Stalker* stalker= smart_cast(entity); + // в кого попали? + if (actor && IsGameTypeSingle()/**/||stalker/**/){ + // попали в актера или сталкера + Fsphere S = cform->getSphere(); + entity->XFORM().transform_tiny (S.P) ; + float dist = rd.range; + // проверим попали ли мы в описывающую сферу + if (Fsphere::rpNone!=S.intersect_full(bullet->bullet_pos, bullet->dir, dist)) + { + // да попали, найдем кто стрелял + bool play_whine = true; + IGameObject* initiator = Level().Objects.net_Find (bullet->parent_id); + if (actor){ + // попали в актера + float hpf = 1.f; + float ahp = actor->HitProbability(); #if 1 # if 0 - IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); - if (weapon_object) { - CWeapon *weapon = smart_cast(weapon_object); - if (weapon) { - float fly_dist = bullet->fly_dist+dist; - float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); - ahp = dist_factor*weapon->hit_probability() + (1.f-dist_factor)*1.f; - } + IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); + if (weapon_object) { + CWeapon *weapon = smart_cast(weapon_object); + if (weapon) { + float fly_dist = bullet->fly_dist+dist; + float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); + ahp = dist_factor*weapon->hit_probability() + (1.f-dist_factor)*1.f; } + } # else - float game_difficulty_hit_probability = actor->HitProbability(); - CAI_Stalker *stalker = smart_cast(initiator); - if (stalker) - hpf = stalker->SpecificCharacter().hit_probability_factor(); - - float dist_factor = 1.f; - IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); - if (weapon_object) { - CWeapon *weapon = smart_cast(weapon_object); - if (weapon) { - game_difficulty_hit_probability = weapon->hit_probability(); - float fly_dist = bullet->fly_dist+dist; - dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); - } + float game_difficulty_hit_probability = actor->HitProbability(); + CAI_Stalker *stalker = smart_cast(initiator); + if (stalker) + hpf = stalker->SpecificCharacter().hit_probability_factor(); + + float dist_factor = 1.f; + IGameObject *weapon_object = Level().Objects.net_Find (bullet->weapon_id); + if (weapon_object) { + CWeapon *weapon = smart_cast(weapon_object); + if (weapon) { + game_difficulty_hit_probability = weapon->hit_probability(); + float fly_dist = bullet->fly_dist+dist; + dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); } + } - ahp = dist_factor*game_difficulty_hit_probability + (1.f-dist_factor)*1.f; + ahp = dist_factor*game_difficulty_hit_probability + (1.f-dist_factor)*1.f; # endif #else - CAI_Stalker* i_stalker = smart_cast(initiator); - // если стрелял сталкер, учитываем - hit_probability_factor сталкерa иначе - 1.0 - if (i_stalker) { - hpf = i_stalker->SpecificCharacter().hit_probability_factor(); - float fly_dist = bullet->fly_dist+dist; - float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); - ahp = dist_factor*actor->HitProbability() + (1.f-dist_factor)*1.f; - } + CAI_Stalker* i_stalker = smart_cast(initiator); + // если стрелял сталкер, учитываем - hit_probability_factor сталкерa иначе - 1.0 + if (i_stalker) { + hpf = i_stalker->SpecificCharacter().hit_probability_factor(); + float fly_dist = bullet->fly_dist+dist; + float dist_factor = _min(1.f,fly_dist/Level().BulletManager().m_fHPMaxDist); + ahp = dist_factor*actor->HitProbability() + (1.f-dist_factor)*1.f; + } #endif - if (Random.randF(0.f,1.f)>(ahp*hpf)){ - bRes = FALSE; // don't hit actor - play_whine = true; // play whine sound + if (Random.randF(0.f,1.f)>(ahp*hpf)){ + bRes = FALSE; // don't hit actor + play_whine = true; // play whine sound + }else{ + // real test actor CFORM + Level().BulletManager().m_rq_results.r_clear(); + + if (cform->_RayQuery(rd,Level().BulletManager().m_rq_results)){ + bRes = TRUE; // hit actor + play_whine = false; // don't play whine sound }else{ - // real test actor CFORM - Level().BulletManager().m_rq_results.r_clear(); - - if (cform->_RayQuery(rd,Level().BulletManager().m_rq_results)){ - bRes = TRUE; // hit actor - play_whine = false; // don't play whine sound - }else{ - bRes = FALSE; // don't hit actor - play_whine = true; // play whine sound - } + bRes = FALSE; // don't hit actor + play_whine = true; // play whine sound } } - // play whine sound - if (play_whine){ - Fvector pt; - pt.mad (bullet->bullet_pos, bullet->dir, dist); - Level().BulletManager().PlayWhineSound (bullet,initiator,pt); - } - }else{ - // don't test this object again (return FALSE) - bRes = FALSE; } - + // play whine sound + if (play_whine){ + Fvector pt; + pt.mad (bullet->bullet_pos, bullet->dir, dist); + Level().BulletManager().PlayWhineSound (bullet,initiator,pt); + } + }else{ + // don't test this object again (return FALSE) + bRes = FALSE; } + } } } diff --git a/src/xrGame/alife_online_offline_group.cpp b/src/xrGame/alife_online_offline_group.cpp index a53de79084a..5e819dd0c82 100644 --- a/src/xrGame/alife_online_offline_group.cpp +++ b/src/xrGame/alife_online_offline_group.cpp @@ -231,7 +231,8 @@ void CSE_ALifeOnlineOfflineGroup::switch_online () MEMBERS::iterator I = m_members.begin(); MEMBERS::iterator E = m_members.end(); for ( ; I != E; ++I){ - alife().add_online ((*I).second, false); + if ((*I).second->m_bOnline == false) + alife().add_online((*I).second, false); } alife().scheduled().remove (this); @@ -257,8 +258,11 @@ void CSE_ALifeOnlineOfflineGroup::switch_offline () MEMBERS::iterator I = m_members.begin(); MEMBERS::iterator E = m_members.end(); for ( ; I != E; ++I){ - (*I).second->clear_client_data(); - alife().remove_online ((*I).second, false); + if ((*I).second->m_bOnline == true) + { + (*I).second->clear_client_data(); + alife().remove_online ((*I).second, false); + } } alife().scheduled().add (this); diff --git a/src/xrGame/inventory_item.cpp b/src/xrGame/inventory_item.cpp index 5e23bdcfaa8..71a338113d3 100644 --- a/src/xrGame/inventory_item.cpp +++ b/src/xrGame/inventory_item.cpp @@ -109,9 +109,9 @@ void CInventoryItem::Load(LPCSTR section) m_Description = CStringTable().translate( pSettings->r_string(section, "description") ); m_flags.set(Fbelt, READ_IF_EXISTS(pSettings, r_bool, section, "belt", FALSE)); - m_can_trade = READ_IF_EXISTS(pSettings, r_bool, section, "can_take", TRUE); - m_flags.set(FCanTake, m_can_trade); - m_flags.set(FCanTrade, READ_IF_EXISTS(pSettings, r_bool, section, "can_trade", TRUE)); + m_can_trade = READ_IF_EXISTS(pSettings, r_bool, section, "can_trade", TRUE); + m_flags.set(FCanTake, READ_IF_EXISTS(pSettings, r_bool, section, "can_take", TRUE)); + m_flags.set(FCanTrade, m_can_trade); m_flags.set(FIsQuestItem, READ_IF_EXISTS(pSettings, r_bool, section, "quest_item",FALSE)); diff --git a/src/xrGame/stalker_animation_manager_update.cpp b/src/xrGame/stalker_animation_manager_update.cpp index 7214d0d4222..859802dbbf7 100644 --- a/src/xrGame/stalker_animation_manager_update.cpp +++ b/src/xrGame/stalker_animation_manager_update.cpp @@ -237,8 +237,13 @@ void CStalkerAnimationManager::update () update_impl (); } catch(...) { - Msg ("! error in stalker with visual %s",*object().cNameVisual()); - throw; + Msg("! error in stalker with visual %s and ID %s",*object().cNameVisual(),object().ID()); + head().reset(); + torso().reset(); + legs().reset(); + global().reset(); + return; + //throw; } STOP_PROFILE }