Skip to content

Commit

Permalink
Ауры мутантов и контроллер из ЗП с некоторыми модификацими
Browse files Browse the repository at this point in the history
Я переделал способ обнаружения этих аур. В ЗП, мутанты вокруг брались
из ПДА. Они не отображались, но в списке имелись. Решение плохое,
т.к. радиус обнаружения ПДА конфигурируется и он один. Т.е. если
кто-то захочет, что бы ПДА показывал сталкеров только на расстоянии 10
метров, то дополнительно он получит, что все ауры мутантов станут
дейстовать не расстоянии не более 10-ти метров. В моем же варианте
используется свой собственный Feel::Touch, а радиус для него берется,
как максимальная дальность ауры у всех мутантов в онлайне. Когда они
выходят в онлайн, то делают

 Actor()->conditions().set_monsters_aura_radius( m_psy_aura.max_distance() );

Поправил обработку "*_enable_for_dead". Этот параметр указывает,
нужно-ли продолжать использовать эту ауру для мертвого моба. Для
radiation_* он по умолчанию true. Вот только в ЗП, при обновлении
состояния актора, этот параметр не учитывается. Т.е. эффектор
включаться будет, а вот хит наносится не будут, т.к. там учитываются
только живые. В моем варианте хит будет наноситься.

В CActorCondition::GetInjuriousMaterialDamage() я оставил заглушку,
т.к. оно лезет глубоко в физику. Пусть остается на будущее.

Добавил скриптовый метод obj:controller_psy_hit_active(), который
возвращает, производится сейчас атака контроллера или нет. Это когда
он к себе притягивает.
  • Loading branch information
dsh2dsh committed Feb 21, 2019
1 parent b7a5613 commit b10a40c
Show file tree
Hide file tree
Showing 39 changed files with 1,091 additions and 598 deletions.
124 changes: 124 additions & 0 deletions ogsr_engine/xrGame/ActorCondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include "script_callback_ex.h"
#include "object_broker.h"
#include "weapon.h"
#include "PDA.h"
#include "ai/monsters/BaseMonster/base_monster.h"

#define MAX_SATIETY 1.0f
#define START_SATIETY 0.5f
Expand Down Expand Up @@ -42,10 +44,15 @@ CActorCondition::CActorCondition(CActor *object) :
m_object = object;
m_condition_flags.zero ();

m_f_time_affected = Device.fTimeGlobal;

monsters_feel_touch = xr_new<Feel::Touch>();
monsters_aura_radius = 0.f;
}

CActorCondition::~CActorCondition(void)
{
xr_delete( monsters_feel_touch );
}

void CActorCondition::LoadCondition(LPCSTR entity_section)
Expand Down Expand Up @@ -189,8 +196,119 @@ void CActorCondition::UpdateCondition()
inherited::UpdateCondition ();

UpdateTutorialThresholds();

AffectDamage_InjuriousMaterialAndMonstersInfluence();
}

void CActorCondition::AffectDamage_InjuriousMaterialAndMonstersInfluence()
{
float one = 0.1f;
float tg = Device.fTimeGlobal;
if ( m_f_time_affected + one > tg )
{
return;
}

clamp( m_f_time_affected, tg - (one * 3), tg );

float psy_influence = 0;
float fire_influence = 0;
float radiation_influence = GetInjuriousMaterialDamage(); // Get Radiation from Material

// Add Radiation and Psy Level from Monsters
monsters_feel_touch->feel_touch_update(
object().Position(), monsters_aura_radius,
{},
[&]( const auto O ) -> bool {
const auto monster = smart_cast<CBaseMonster*>( O );
return monster ? true : false;
}
);
for ( const auto& it : monsters_feel_touch->feel_touch ) {
const auto monster = smart_cast<CBaseMonster*>( it );
if ( !monster ) continue;
psy_influence += monster->get_psy_influence();
radiation_influence += monster->get_radiation_influence();
fire_influence += monster->get_fire_influence();
}
/*
CPda* const pda = m_object->GetPDA();
if ( pda )
{
using monsters = xr_vector<CObject*>;
for ( monsters::const_iterator it = pda->feel_touch.begin();
it != pda->feel_touch.end();
++it )
{
CBaseMonster* const monster = smart_cast<CBaseMonster*>(*it);
if ( !monster || !monster->g_Alive() ) continue;
psy_influence += monster->get_psy_influence();
radiation_influence += monster->get_radiation_influence();
fire_influence += monster->get_fire_influence();
}
}
*/

struct
{
ALife::EHitType type;
float value;

} hits[] = { { ALife::eHitTypeRadiation, radiation_influence * one },
{ ALife::eHitTypeTelepatic, psy_influence * one },
{ ALife::eHitTypeBurn, fire_influence * one } };

NET_Packet np;

while ( m_f_time_affected + one < tg )
{
m_f_time_affected += one;

for (auto & hit : hits)
{
float damage = hit.value;
ALife::EHitType type = hit.type;

if ( damage > EPS )
{
SHit HDS = SHit(damage,
//. 0.0f,
Fvector().set(0,1,0),
nullptr,
BI_NONE,
Fvector().set(0,0,0),
0.0f,
type,
0.0f,
false);

HDS.GenHeader(GE_HIT, m_object->ID());
HDS.Write_Packet( np );
CGameObject::u_EventSend( np );
}

} // for

}//while
}

#include "characterphysicssupport.h"
float CActorCondition::GetInjuriousMaterialDamage()
{
/*
u16 mat_injurios = m_object->character_physics_support()->movement()->injurious_material_idx();
if(mat_injurios!=GAMEMTL_NONE_IDX)
{
const SGameMtl* mtl = GMLib.GetMaterialByIdx(mat_injurios);
return mtl->fInjuriousSpeed;
}else
*/
return 0.0f;
}

void CActorCondition::UpdateSatiety()
{
Expand Down Expand Up @@ -428,3 +546,9 @@ void CActorCondition::UpdateTutorialThresholds()
fl ();
}
}


void CActorCondition::net_Relcase( CObject* O ) {
if ( Level().is_removing_objects() ) return;
monsters_feel_touch->feel_touch_relcase( O );
}
14 changes: 14 additions & 0 deletions ogsr_engine/xrGame/ActorCondition.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "EntityCondition.h"
#include "actor_defs.h"
#include "..\xr_3da\feel_touch.h"

template <typename _return_type>
class CScriptCallbackEx;
Expand Down Expand Up @@ -66,6 +67,9 @@ class CActorCondition: public CEntityCondition {
float GetSatiety () {return m_fSatiety;}
void SetMaxWalkWeight (float _weight) { m_MaxWalkWeight = _weight; }

void AffectDamage_InjuriousMaterialAndMonstersInfluence();
float GetInjuriousMaterialDamage ();

public:
IC CActor &object () const
{
Expand Down Expand Up @@ -99,6 +103,8 @@ class CActorCondition: public CEntityCondition {
float m_fOverweightJumpK;
float m_fAccelK;
float m_fSprintK;

float m_f_time_affected;

//порог силы и здоровья меньше которого актер начинает хромать
float m_fLimpingPowerBegin;
Expand All @@ -111,4 +117,12 @@ class CActorCondition: public CEntityCondition {

float m_fLimpingHealthBegin;
float m_fLimpingHealthEnd;

protected:
Feel::Touch* monsters_feel_touch;
float monsters_aura_radius;

public:
void net_Relcase( CObject* O );
void set_monsters_aura_radius( float r ) { if ( r > monsters_aura_radius ) monsters_aura_radius = r; };
};
36 changes: 16 additions & 20 deletions ogsr_engine/xrGame/ActorEffector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -302,28 +302,27 @@ void SndShockEffector::Update()

//////////////////////////////////////////////////////////////////////////

#define DELTA_ANGLE_X 0.5f * PI / 180
#define DELTA_ANGLE_Y 0.5f * PI / 180
#define DELTA_ANGLE_Z 0.5f * PI / 180
#define ANGLE_SPEED 1.5f
static const float DELTA_ANGLE_XYZ = 0.5f * PI / 180;
static const float ANGLE_SPEED = 1.5f;

CControllerPsyHitCamEffector::CControllerPsyHitCamEffector(ECamEffectorType type, const Fvector &src_pos, const Fvector &target_pos, float time)
const float _base_fov = 170.f;
const float _max_fov_add = 30.f;

CControllerPsyHitCamEffector::CControllerPsyHitCamEffector(ECamEffectorType type, const Fvector &src_pos, const Fvector &target_pos, float time, float base_fov, float dest_fov)
:inherited(eCEControllerPsyHit, flt_max)
{
m_base_fov = base_fov;
m_dest_fov = dest_fov;
m_time_total = time;
m_time_current = 0;
m_dangle_target.set (angle_normalize(Random.randFs(DELTA_ANGLE_X)),angle_normalize(Random.randFs(DELTA_ANGLE_Y)),angle_normalize(Random.randFs(DELTA_ANGLE_Z)));
m_dangle_target.set(angle_normalize(Random.randFs(DELTA_ANGLE_XYZ)), angle_normalize(Random.randFs(DELTA_ANGLE_XYZ)), angle_normalize(Random.randFs(DELTA_ANGLE_XYZ)));
m_dangle_current.set (0.f, 0.f, 0.f);
m_position_source = src_pos;
m_direction.sub (target_pos,src_pos);
m_distance = m_direction.magnitude();
m_direction.normalize ();
}

const float _base_fov = 170.f;
const float _max_fov_add = 160.f;


BOOL CControllerPsyHitCamEffector::Process(Fvector &p, Fvector &d, Fvector &n, float& fFov, float& fFar, float& fAspect)
{
Fmatrix Mdef;
Expand All @@ -335,17 +334,14 @@ BOOL CControllerPsyHitCamEffector::Process(Fvector &p, Fvector &d, Fvector &n, f

//////////////////////////////////////////////////////////////////////////

if (angle_lerp(m_dangle_current.x, m_dangle_target.x, ANGLE_SPEED, Device.fTimeDelta)) {
m_dangle_target.x = angle_normalize(Random.randFs(DELTA_ANGLE_X));
}
if (angle_lerp(m_dangle_current.x, m_dangle_target.x, ANGLE_SPEED, Device.fTimeDelta))
m_dangle_target.x = angle_normalize(Random.randFs(DELTA_ANGLE_XYZ));

if (angle_lerp(m_dangle_current.y, m_dangle_target.y, ANGLE_SPEED, Device.fTimeDelta)) {
m_dangle_target.y = angle_normalize(Random.randFs(DELTA_ANGLE_Y));
}
if (angle_lerp(m_dangle_current.y, m_dangle_target.y, ANGLE_SPEED, Device.fTimeDelta))
m_dangle_target.y = angle_normalize(Random.randFs(DELTA_ANGLE_XYZ));

if (angle_lerp(m_dangle_current.z, m_dangle_target.z, ANGLE_SPEED, Device.fTimeDelta)) {
m_dangle_target.z = angle_normalize(Random.randFs(DELTA_ANGLE_Z));
}
if (angle_lerp(m_dangle_current.z, m_dangle_target.z, ANGLE_SPEED, Device.fTimeDelta))
m_dangle_target.z = angle_normalize(Random.randFs(DELTA_ANGLE_XYZ));

//////////////////////////////////////////////////////////////////////////

Expand All @@ -355,7 +351,7 @@ BOOL CControllerPsyHitCamEffector::Process(Fvector &p, Fvector &d, Fvector &n, f
float cur_dist = m_distance * perc_past;

Mdef.c.mad (m_position_source, m_direction, cur_dist);
fFov = _base_fov - _max_fov_add*perc_past;
fFov = m_base_fov + (m_dest_fov - m_base_fov) * perc_past;

m_time_current += Device.fTimeDelta;

Expand Down
4 changes: 3 additions & 1 deletion ogsr_engine/xrGame/ActorEffector.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,11 @@ class CControllerPsyHitCamEffector :public CEffectorCam {
Fvector m_position_source;
Fvector m_direction;
float m_distance;
float m_base_fov;
float m_dest_fov;

public:
CControllerPsyHitCamEffector (ECamEffectorType type, const Fvector &src_pos, const Fvector &target_pos, float time);
CControllerPsyHitCamEffector (ECamEffectorType type, const Fvector &src_pos, const Fvector &target_pos, float time, float base_fov, float dest_fov);
virtual BOOL Process (Fvector &p, Fvector &d, Fvector &n, float& fFov, float& fFar, float& fAspect);
};
//////////////////////////////////////////////////////////////////////////
2 changes: 2 additions & 0 deletions ogsr_engine/xrGame/Actor_Network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#include "game_cl_base_weapon_usage_statistic.h"
#include "clsid_game.h"
#include "alife_simulator_header.h"
#include "actorcondition.h"

#ifdef DEBUG
# include "debug_renderer.h"
Expand Down Expand Up @@ -746,6 +747,7 @@ void CActor::net_Relcase (CObject* O)

memory().remove_links(O);
m_pPhysics_support->in_NetRelcase(O);
conditions().net_Relcase( O );
}

BOOL CActor::net_Relevant () // relevant for export to server
Expand Down
43 changes: 42 additions & 1 deletion ogsr_engine/xrGame/ai/monsters/basemonster/base_monster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,10 @@
#include "script_engine.h"
#include "../anti_aim_ability.h"

CBaseMonster::CBaseMonster()
CBaseMonster::CBaseMonster() : m_psy_aura(this, "psy"),
m_fire_aura(this, "fire"),
m_radiation_aura(this, "radiation"),
m_base_aura(this, "base")
{
m_pPhysics_support=xr_new<CCharacterPhysicsSupport>(CCharacterPhysicsSupport::etBitting,this);

Expand Down Expand Up @@ -336,6 +339,11 @@ void CBaseMonster::shedule_Update(u32 dt)
m_anti_aim->update_schedule();
}

m_psy_aura.update_schedule();
m_fire_aura.update_schedule();
m_base_aura.update_schedule();
m_radiation_aura.update_schedule();

control().update_schedule ();

Morale.update_schedule (dt);
Expand All @@ -357,6 +365,11 @@ void CBaseMonster::Die(CObject* who)
{
if (StateMan) StateMan->critical_finalize();

m_psy_aura.on_monster_death();
m_radiation_aura.on_monster_death();
m_fire_aura.on_monster_death();
m_base_aura.on_monster_death();

if ( m_anti_aim )
{
m_anti_aim->on_monster_death ();
Expand Down Expand Up @@ -883,6 +896,34 @@ float CBaseMonster::get_attack_on_move_prepare_time()
return m_attack_on_move_params.prepare_time;
}

float CBaseMonster::get_psy_influence ()
{
if ( g_Alive() || m_psy_aura.enable_for_dead() )
return m_psy_aura.calculate();
return 0.f;
}

float CBaseMonster::get_radiation_influence ()
{
if ( g_Alive() || m_radiation_aura.enable_for_dead() )
return m_radiation_aura.calculate();
return 0.f;
}

float CBaseMonster::get_fire_influence ()
{
if ( g_Alive() || m_fire_aura.enable_for_dead() )
return m_fire_aura.calculate();
return 0.f;
}

void CBaseMonster::play_detector_sound()
{
m_psy_aura.play_detector_sound();
m_radiation_aura.play_detector_sound();
m_fire_aura.play_detector_sound();
}

bool CBaseMonster::is_jumping()
{
return m_com_manager.is_jumping();
Expand Down
16 changes: 16 additions & 0 deletions ogsr_engine/xrGame/ai/monsters/basemonster/base_monster.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "../control_manager_custom.h"
#include "../ai_monster_shared_data.h"
#include "../monster_sound_defs.h"
#include "../monster_aura.h"
#include "../../../inventoryowner.h"
#include "../ai_monster_squad.h"

Expand Down Expand Up @@ -528,6 +529,21 @@ IC void wake_up (){m_bSleep = false;}
protected:
attack_on_move_params_t m_attack_on_move_params;

//-------------------------------------------------------------------
// CBaseMonster's Auras
//-------------------------------------------------------------------
public:
float get_psy_influence ();
float get_radiation_influence ();
float get_fire_influence ();
void play_detector_sound ();

private:
monster_aura m_psy_aura;
monster_aura m_radiation_aura;
monster_aura m_fire_aura;
monster_aura m_base_aura;

protected:
//-------------------------------------------------------------------
// CBaseMonster's Anti-Aim Ability
Expand Down

0 comments on commit b10a40c

Please sign in to comment.