Skip to content

Commit c826696

Browse files
revolucasXottab-DUTY
authored andcommitted
+ added alife().jump_to_level
+ added alife().teleport_object + added level.get_target_obj + added level.get_target_dist + added level.send + added several condition checks to stalker_combat_actions.cpp to further the validity of the performed action.
1 parent 9eb0a68 commit c826696

File tree

5 files changed

+79
-33
lines changed

5 files changed

+79
-33
lines changed

src/xrGame/alife_online_offline_group.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -368,13 +368,12 @@ void CSE_ALifeOnlineOfflineGroup::force_change_position(Fvector position)
368368

369369
//Alundaio: force new graph location
370370
/*
371-
void CSE_ALifeOnlineOfflineGroup::force_change_game_vertex_id(u32 game_vertex_id)
371+
void CSE_ALifeOnlineOfflineGroup::force_change_game_vertex_id(GameGraph::_GRAPH_ID game_vertex_id)
372372
{
373373
if (game_vertex_id && ai().game_graph().valid_vertex_id(game_vertex_id))
374374
{
375-
const CGameGraph::CVertex vertex = *ai().game_graph().vertex(game_vertex_id);
376-
m_tNodeID = vertex.level_vertex_id;
377-
o_Position = vertex.level_point;
375+
m_tNodeID = ai().game_graph().vertex(game_vertex_id)->level_vertex_id();
376+
o_Position = ai().game_graph().vertex(game_vertex_id)->level_point();
378377
379378
if (m_tGraphID != game_vertex_id)
380379
{

src/xrGame/alife_simulator_script.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,10 @@ SCRIPT_EXPORT(CALifeSimulator, (), {
352352
.def("dont_has_info", &dont_has_info)
353353
.def("switch_distance", &CALifeSimulator::switch_distance)
354354
.def("switch_distance", &CALifeSimulator::set_switch_distance)
355+
//Alundaio: extend alife simulator exports
356+
.def("jump_to_level", (void (CALifeSimulator::*) (LPCSTR))(&CALifeSimulator::jump_to_level))
357+
.def("teleport_object", (void (CALifeSimulator::*) (ALife::_OBJECT_ID, GameGraph::_GRAPH_ID, u32, Fvector))(&CALifeSimulator::teleport_object))
358+
//Alundaio: END
355359

356360
,
357361
def("alife", &alife)];

src/xrGame/level_script.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "alife_object_registry.h"
3838
#include "xrServer_Objects_ALife_Monsters.h"
3939
#include "xrScriptEngine/ScriptExporter.hpp"
40+
#include "HUDManager.h"
4041

4142
using namespace luabind;
4243
using namespace luabind::policy;
@@ -585,6 +586,34 @@ void stop_tutorial()
585586

586587
LPCSTR translate_string(LPCSTR str) { return *CStringTable().translate(str); }
587588
bool has_active_tutotial() { return (g_tutorial != NULL); }
589+
590+
//Alundaio: namespace level exports extension
591+
592+
//ability to update level netpacket
593+
void g_send(NET_Packet& P, bool bReliable = false, bool bSequential = true, bool bHighPriority = false, bool bSendImmediately = false)
594+
{
595+
Level().Send(P, net_flags(bReliable, bSequential, bHighPriority, bSendImmediately));
596+
}
597+
598+
//ability to get the target game_object at crosshair
599+
CGameObject* g_get_target_obj()
600+
{
601+
collide::rq_result& RQ = HUD().GetCurrentRayQuery();
602+
CGameObject* object = smart_cast<CGameObject*>(RQ.O);
603+
if (object)
604+
return object;
605+
}
606+
607+
float g_get_target_dist()
608+
{
609+
collide::rq_result& RQ = HUD().GetCurrentRayQuery();
610+
CGameObject* object = smart_cast<CGameObject*>(RQ.O);
611+
if (object)
612+
return RQ.range;
613+
}
614+
615+
//Alundaio: END
616+
588617
IC static void CLevel_Export(lua_State* luaState)
589618
{
590619
class_<CEnvDescriptor>("CEnvDescriptor")
@@ -594,6 +623,12 @@ IC static void CLevel_Export(lua_State* luaState)
594623
class_<CEnvironment>("CEnvironment").def("current", current_environment);
595624

596625
module(luaState, "level")[
626+
//Alundaio: Extend level namespace exports
627+
def("send", g_send) , //allow the ability to send netpacket to level
628+
//def("ray_pick",g_ray_pick),
629+
def("get_target_obj", g_get_target_obj) , //intentionally named to what is in xray extensions
630+
def("get_target_dist", g_get_target_dist) ,
631+
//Alundaio: END
597632
// obsolete\deprecated
598633
def("object_by_id", get_object_by_id),
599634
#ifdef DEBUG

src/xrGame/stalker_combat_actions.cpp

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,6 @@ void CStalkerActionRetreatFromEnemy::execute()
205205
{
206206
inherited::execute();
207207

208-
if (!object().memory().enemy().selected())
209-
return;
210-
211208
if (!object().memory().enemy().selected())
212209
return;
213210

@@ -437,27 +434,26 @@ void CStalkerActionKillEnemy::execute()
437434
#endif // TEST_MENTAL_STATE
438435

439436
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));
440441

441-
object().sight().setup(CSightAction(object().memory().enemy().selected(), true, true));
442-
443-
// u32 min_queue_size, max_queue_size, min_queue_interval, max_queue_interval;
444-
// float distance =
445-
// object().memory().enemy().selected()->Position().distance_to(object().Position());
446-
// select_queue_params (distance,min_queue_size, max_queue_size, min_queue_interval,
447-
// max_queue_interval);
448-
// object().CObjectHandler::set_goal (eObjectActionFire1,object().best_weapon(),min_queue_size, max_queue_size,
449-
// min_queue_interval, max_queue_interval);
450-
fire();
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();
451447

452-
if (object().memory().enemy().selected())
453-
{
454448
CMemoryInfo mem_object = object().memory().memory(object().memory().enemy().selected());
455449

456450
if (mem_object.m_object)
457-
{
458451
object().best_cover(mem_object.m_object_params.m_position);
459-
}
460452
}
453+
else
454+
object().sight().setup(CSightAction(SightManager::eSightTypePathDirection, true, true));
455+
456+
//Alundaio: END
461457
}
462458

463459
//////////////////////////////////////////////////////////////////////////
@@ -488,7 +484,7 @@ void CStalkerActionTakeCover::initialize()
488484
m_storage->set_property(eWorldPropertyEnemyDetoured, false);
489485

490486
#ifndef SILENT_COMBAT
491-
if (object().memory().enemy().selected()->human_being())
487+
if (object().memory().enemy().selected() && object().memory().enemy().selected()->human_being())
492488
{
493489
if (object().agent_manager().member().can_cry_noninfo_phrase())
494490
if (object().Position().distance_to_sqr(object().memory().enemy().selected()->Position()) < _sqr(10.f))
@@ -508,6 +504,9 @@ void CStalkerActionTakeCover::execute()
508504

509505
inherited::execute();
510506

507+
if (!object().memory().enemy().selected())
508+
return;
509+
511510
CMemoryInfo mem_object = object().memory().memory(object().memory().enemy().selected());
512511

513512
if (!mem_object.m_object)
@@ -625,6 +624,9 @@ void CStalkerActionLookOut::execute()
625624

626625
inherited::execute();
627626

627+
if (!object().memory().enemy().selected())
628+
return;
629+
628630
CMemoryInfo mem_object = object().memory().memory(object().memory().enemy().selected());
629631

630632
if (!mem_object.m_object)
@@ -710,6 +712,9 @@ void CStalkerActionHoldPosition::execute()
710712

711713
inherited::execute();
712714

715+
if (!object().memory().enemy().selected())
716+
return;
717+
713718
CMemoryInfo mem_object = object().memory().memory(object().memory().enemy().selected());
714719

715720
if (!mem_object.m_object)
@@ -1016,7 +1021,7 @@ void CStalkerActionSuddenAttack::execute()
10161021

10171022
inherited::execute();
10181023

1019-
//Alundaio: Removed check to allow stalkers to sneak up on enemy even if they are in a squad; most likely removed because of friendly fire but not an issue with rx_ff scheme
1024+
//Alundaio: Removed check to allow stalkers to sneak up on enemy even if they are in a group.
10201025
//if (object().agent_manager().member().combat_members().size() > 1)
10211026
// m_storage->set_property(eWorldPropertyUseSuddenness, false);
10221027
//Alundaio: END
@@ -1093,7 +1098,7 @@ void CStalkerActionSuddenAttack::execute()
10931098

10941099
CVisualMemoryManager* visual_memory_manager = object().memory().enemy().selected()->visual_memory();
10951100
VERIFY(visual_memory_manager);
1096-
if (!visual_memory_manager->visible_now(&object()))
1101+
if (object().memory().enemy().selected()->g_Alive() && !visual_memory_manager->visible_now(&object()))
10971102
return;
10981103

10991104
m_storage->set_property(eWorldPropertyUseSuddenness, false);
@@ -1179,16 +1184,19 @@ void CStalkerActionCriticalHit::initialize()
11791184
object().brain().affect_cover(false);
11801185
object().movement().set_movement_type(eMovementTypeStand);
11811186

1182-
if (object().memory().enemy().selected())
1187+
if (object().inventory().ActiveItem() && object().best_weapon() && (object().inventory().ActiveItem()->object().ID() == object().best_weapon()->object().ID()))
11831188
{
1184-
u32 min_queue_size, max_queue_size, min_queue_interval, max_queue_interval;
1185-
float distance = object().memory().enemy().selected()->Position().distance_to(object().Position());
1186-
select_queue_params(distance, min_queue_size, max_queue_size, min_queue_interval, max_queue_interval);
1187-
object().CObjectHandler::set_goal(eObjectActionIdle, object().best_weapon(), min_queue_size, max_queue_size,
1188-
min_queue_interval, max_queue_interval);
1189+
if (object().memory().enemy().selected())
1190+
{
1191+
u32 min_queue_size, max_queue_size, min_queue_interval, max_queue_interval;
1192+
float distance = object().memory().enemy().selected()->Position().distance_to(object().Position());
1193+
select_queue_params(distance, min_queue_size, max_queue_size, min_queue_interval, max_queue_interval);
1194+
object().set_goal(eObjectActionIdle, object().best_weapon(), min_queue_size, max_queue_size,
1195+
min_queue_interval, max_queue_interval);
1196+
}
1197+
else
1198+
object().set_goal(eObjectActionIdle, object().best_weapon());
11891199
}
1190-
else
1191-
object().CObjectHandler::set_goal(eObjectActionIdle, object().best_weapon());
11921200

11931201
object().sight().setup(CSightAction(SightManager::eSightTypeCurrentDirection, true, true));
11941202
object().sound().play(eStalkerSoundInjuring);

src/xrServerEntities/xrServer_Objects_ALife_Monsters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ class CSE_ALifeOnlineOfflineGroup : public CSE_ALifeDynamicObject,
720720
void clear_location_types();
721721
void add_location_type(LPCSTR mask);
722722
void force_change_position(Fvector position);
723-
//void force_change_game_vertex_id(u32 game_vertex_id);
723+
//void force_change_game_vertex_id(GameGraph::_GRAPH_ID game_vertex_id);
724724
virtual void on_failed_switch_online();
725725
#else
726726
public:

0 commit comments

Comments
 (0)