@@ -434,25 +434,23 @@ void CStalkerActionKillEnemy::execute()
434434#endif // TEST_MENTAL_STATE
435435
436436 inherited::execute ();
437- // Alundaio
438- if ( object (). memory (). enemy (). selected () && object ().memory ().enemy ().selected ()-> g_Alive ())
439- {
440- object (). sight (). setup ( CSightAction ( object (). memory (). enemy (). selected (), true , true )) ;
437+ // Alundaio: Prevent Stalkers from shooting at walls for prolonged periods due to kill if not visible
438+ const CEntityAlive* enemy = object ().memory ().enemy ().selected ();
439+ if (!enemy || !enemy-> g_Alive ())
440+ return ;
441441
442- // u32 min_queue_size, max_queue_size, min_queue_interval, max_queue_interval;
443- // float distance = object().memory().enemy().selected()->Position().distance_to(object().Position());
444- // select_queue_params(distance,min_queue_size, max_queue_size, min_queue_interval, max_queue_interval);
445- // object().CObjectHandler::set_goal (eObjectActionFire1,object().best_weapon(),min_queue_size, max_queue_size, min_queue_interval, max_queue_interval);
446- fire ();
442+ CMemoryInfo mem_object = object ().memory ().memory (enemy);
443+ if (!mem_object.m_object )
444+ return ;
447445
448- CMemoryInfo mem_object = object ().memory (). memory ( object (). memory (). enemy (). selected () );
446+ object ().best_cover (mem_object. m_object_params . m_position );
449447
450- if (mem_object.m_object )
451- object ().best_cover (mem_object.m_object_params .m_position );
448+ u32 last_time_seen = object ().memory ().visual ().visible_object_time_last_seen (enemy);
449+ if (last_time_seen != u32 (-1 ) && Device.dwTimeGlobal - last_time_seen <= 2000 )
450+ {
451+ object ().sight ().setup (CSightAction (enemy, true , true ));
452+ fire ();
452453 }
453- else
454- object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection, true , true ));
455-
456454 // Alundaio: END
457455}
458456
@@ -505,12 +503,10 @@ void CStalkerActionTakeCover::execute()
505503 inherited::execute ();
506504
507505 const CEntityAlive* enemy = object ().memory ().enemy ().selected ();
508-
509506 if (!enemy)
510507 return ;
511508
512509 CMemoryInfo mem_object = object ().memory ().memory (enemy);
513-
514510 if (!mem_object.m_object )
515511 return ;
516512
@@ -540,13 +536,7 @@ void CStalkerActionTakeCover::execute()
540536 // if (object().memory().visual().visible_now(object().memory().enemy().selected()) && object().can_kill_enemy())
541537 // if (object().memory().visual().visible_now(object().memory().enemy().selected()))
542538
543- if (object ().movement ().path_completed ())
544- {// && (object().memory().enemy().selected()->Position().distance_to_sqr(object().Position()) >= 10.f))
545- object ().best_cover_can_try_advance ();
546- m_storage->set_property (eWorldPropertyInCover, true );
547- }
548-
549- // Alundaio: Fix CAIStalker shooting at walls or aiming at ceiling or floor during this action
539+ // Alundaio: Fix shooting at walls or aiming at ceiling or floor during this action
550540 u32 last_time_seen = object ().memory ().visual ().visible_object_time_last_seen (enemy);
551541 if (last_time_seen != u32 (-1 ) && Device.dwTimeGlobal - last_time_seen <= 2000 && fire_make_sense ())
552542 {
@@ -561,8 +551,11 @@ void CStalkerActionTakeCover::execute()
561551 }
562552 else
563553 {
564- if (_abs (object ().Position ().y - enemy->Position ().y ) > 3 .f )
565- object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
554+ if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
555+ {
556+ Fvector3 Vpos = { mem_object.m_object_params .m_position .x , object ().Position ().y + 1 .f , mem_object.m_object_params .m_position .z };
557+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, Vpos, true ));
558+ }
566559 else
567560 object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
568561 }
@@ -634,16 +627,20 @@ void CStalkerActionLookOut::execute()
634627
635628 inherited::execute ();
636629
637- if (!object ().memory ().enemy ().selected ())
630+ const CEntityAlive* enemy = object ().memory ().enemy ().selected ();
631+ if (!enemy)
638632 return ;
639633
640- CMemoryInfo mem_object = object ().memory ().memory (object ().memory ().enemy ().selected ());
641-
634+ CMemoryInfo mem_object = object ().memory ().memory (enemy);
642635 if (!mem_object.m_object )
643636 return ;
644- // Alundaio: Prevent stalkers from staring at ceiling or floor for this action
637+
638+ // Alundaio: Prevent stalkers from staring at floor or ceiling for this action
645639 if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
646- object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
640+ {
641+ Fvector3 Vpos = { mem_object.m_object_params .m_position .x , object ().Position ().y + 1 .f , mem_object.m_object_params .m_position .z };
642+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, Vpos, true ));
643+ }
647644 else
648645 object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
649646 // -Alundaio
@@ -679,15 +676,7 @@ void CStalkerActionLookOut::execute()
679676 // object().movement().set_nearest_accessible_position ();
680677 // }
681678
682- if (object ().memory ().enemy ().selected ())
683- {
684- CMemoryInfo mem_object = object ().memory ().memory (object ().memory ().enemy ().selected ());
685-
686- if (mem_object.m_object )
687- {
688- object ().best_cover (mem_object.m_object_params .m_position );
689- }
690- }
679+ object ().best_cover (mem_object.m_object_params .m_position );
691680}
692681
693682// ////////////////////////////////////////////////////////////////////////
@@ -726,11 +715,11 @@ void CStalkerActionHoldPosition::execute()
726715
727716 inherited::execute ();
728717
729- if (!object ().memory ().enemy ().selected ())
718+ const CEntityAlive* enemy = object ().memory ().enemy ().selected ();
719+ if (!enemy)
730720 return ;
731721
732- CMemoryInfo mem_object = object ().memory ().memory (object ().memory ().enemy ().selected ());
733-
722+ CMemoryInfo mem_object = object ().memory ().memory (enemy);
734723 if (!mem_object.m_object )
735724 return ;
736725
@@ -739,7 +728,10 @@ void CStalkerActionHoldPosition::execute()
739728
740729 // Alundaio: Prevent stalkers from staring at floor or ceiling for this action
741730 if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
742- object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
731+ {
732+ Fvector3 Vpos = { mem_object.m_object_params .m_position .x , object ().Position ().y + 1 .f , mem_object.m_object_params .m_position .z };
733+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, Vpos, true ));
734+ }
743735 else
744736 object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
745737 // -Alundaio
@@ -832,12 +824,11 @@ void CStalkerActionDetourEnemy::execute()
832824
833825 inherited::execute ();
834826
835- // Alundaio: Sanity
836- if (!object (). memory (). enemy (). selected () )
827+ const CEntityAlive* enemy = object (). memory (). enemy (). selected ();
828+ if (!enemy)
837829 return ;
838- // Alundaio: END
839830
840- CMemoryInfo mem_object = object ().memory ().memory (object (). memory (). enemy (). selected () );
831+ CMemoryInfo mem_object = object ().memory ().memory (enemy);
841832
842833 if (!mem_object.m_object )
843834 return ;
@@ -869,9 +860,12 @@ void CStalkerActionDetourEnemy::execute()
869860 m_storage->set_property (eWorldPropertyEnemyDetoured, true );
870861 }
871862
872- // Alundaio: Prevent stalkers from looking at ceiling or floor during action
873- if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) >= 3 .f )
874- object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
863+ // Alundaio: Prevent stalkers from staring at floor or ceiling for this action
864+ if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
865+ {
866+ Fvector3 Vpos = { mem_object.m_object_params .m_position .x , object ().Position ().y + 1 .f , mem_object.m_object_params .m_position .z };
867+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, Vpos, true ));
868+ }
875869 else
876870 object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
877871 // -Alundaio
@@ -1054,7 +1048,6 @@ void CStalkerActionSuddenAttack::execute()
10541048 return ;
10551049
10561050 CMemoryInfo mem_object = object ().memory ().memory (enemy);
1057-
10581051 if (!mem_object.m_object )
10591052 return ;
10601053
@@ -1065,12 +1058,17 @@ void CStalkerActionSuddenAttack::execute()
10651058 object ().sight ().setup (CSightAction (enemy, true ));
10661059 else
10671060 {
1068- if (_abs (object ().Position ().y - enemy->Position ().y ) >= 3 .f )
1069- object ().sight ().setup (CSightAction (SightManager::eSightTypePathDirection));
1061+ // Alundaio: Prevent stalkers from staring at floor or ceiling for this action
1062+ if (_abs (object ().Position ().y - mem_object.m_object_params .m_position .y ) > 3 .f )
1063+ {
1064+ Fvector3 Vpos = {mem_object.m_object_params .m_position .x , object ().Position ().y + 1 .f , mem_object.m_object_params .m_position .z };
1065+ object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, Vpos, true ));
1066+ }
10701067 else
10711068 object ().sight ().setup (CSightAction (SightManager::eSightTypePosition, mem_object.m_object_params .m_position , true ));
1069+ // -Alundaio
10721070 }
1073- // -Alundaio
1071+
10741072
10751073 if (object ().movement ().accessible (mem_object.m_object_params .m_level_vertex_id ))
10761074 object ().movement ().set_level_dest_vertex (mem_object.m_object_params .m_level_vertex_id );
0 commit comments