From 42c12705b6291efee89287ed2adcde092e110054 Mon Sep 17 00:00:00 2001 From: D-AIRY <admin@ds-servers.com> Date: Wed, 15 Apr 2020 23:11:29 +0300 Subject: [PATCH] Trigger hurt --- proj/sxgame/vs2013/sxgame.vcxproj | 2 + proj/sxgame/vs2013/sxgame.vcxproj.filters | 6 +++ source/game/EntityManager.h | 4 +- source/game/TriggerHurt.cpp | 63 +++++++++++++++++++++++ source/game/TriggerHurt.h | 45 ++++++++++++++++ 5 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 source/game/TriggerHurt.cpp create mode 100644 source/game/TriggerHurt.h diff --git a/proj/sxgame/vs2013/sxgame.vcxproj b/proj/sxgame/vs2013/sxgame.vcxproj index b6f5abecf..e8820ef50 100644 --- a/proj/sxgame/vs2013/sxgame.vcxproj +++ b/proj/sxgame/vs2013/sxgame.vcxproj @@ -233,6 +233,7 @@ <ClCompile Include="..\..\..\source\game\PointCamera.cpp" /> <ClCompile Include="..\..\..\source\game\PointEntity.cpp" /> <ClCompile Include="..\..\..\source\game\Tracer.cpp" /> + <ClCompile Include="..\..\..\source\game\TriggerHurt.cpp" /> <ClCompile Include="..\..\..\source\game\ZombieHands.cpp" /> </ItemGroup> <ItemGroup> @@ -294,6 +295,7 @@ <ClInclude Include="..\..\..\source\game\PointEntity.h" /> <ClInclude Include="..\..\..\source\game\TakeDamageInfo.h" /> <ClInclude Include="..\..\..\source\game\Tracer.h" /> + <ClInclude Include="..\..\..\source\game\TriggerHurt.h" /> <ClInclude Include="..\..\..\source\game\ZombieHands.h" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/proj/sxgame/vs2013/sxgame.vcxproj.filters b/proj/sxgame/vs2013/sxgame.vcxproj.filters index f21f24ed8..18e2bc35f 100644 --- a/proj/sxgame/vs2013/sxgame.vcxproj.filters +++ b/proj/sxgame/vs2013/sxgame.vcxproj.filters @@ -243,6 +243,9 @@ <ClCompile Include="..\..\..\source\game\EditorObject.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\..\..\source\game\TriggerHurt.cpp"> + <Filter>Source Files\ents\triggers</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\..\source\game\sxgame.h"> @@ -422,5 +425,8 @@ <ClInclude Include="..\..\..\source\game\EditorObject.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\..\..\source\game\TriggerHurt.h"> + <Filter>Header Files\ents\triggers</Filter> + </ClInclude> </ItemGroup> </Project> \ No newline at end of file diff --git a/source/game/EntityManager.h b/source/game/EntityManager.h index c310af62f..9ae3a1738 100644 --- a/source/game/EntityManager.h +++ b/source/game/EntityManager.h @@ -23,7 +23,7 @@ struct ISXConfig; /*! Однократно запустить функцию fn через время time \note Должно вызываться изнутри класса объекта -*/ + */ #define SET_TIMEOUT(fn, time) m_pMgr->setTimeout((void(CBaseEntity::*)(float))&ThisClass::fn, this, time) /*! Запускать функцию fn через каждые time секунд @@ -35,7 +35,7 @@ struct ISXConfig; /*! Отменить интервал по идентификатору \note Должно вызываться изнутри класса объекта */ -#define CLEAR_INTERVAL(id) m_pMgr->clearInterval(id) +#define CLEAR_INTERVAL(id) if(ID_VALID(id)){m_pMgr->clearInterval(id);} id = -1 /*! Отменить таймер по идентификатору \note Должно вызываться изнутри класса объекта diff --git a/source/game/TriggerHurt.cpp b/source/game/TriggerHurt.cpp new file mode 100644 index 000000000..c4ef6d9d4 --- /dev/null +++ b/source/game/TriggerHurt.cpp @@ -0,0 +1,63 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +#include <gcore/sxgcore.h> + +#include "TriggerHurt.h" + +/*! \skydocent trigger_hurt +Триггер нанесения урона +*/ + +BEGIN_PROPTABLE(CTriggerHurt) + //! Сколько урона наносится за удар + DEFINE_FIELD_FLOAT(m_fDamage, PDFF_NONE, "damage", "Damage per interval", EDITOR_TEXTFIELD) + //! Период нанесения урона + DEFINE_FIELD_FLOAT(m_fHurtInterval, PDFF_NONE, "hurt_interval", "Hurt interval", EDITOR_TEXTFIELD) +END_PROPTABLE() + +REGISTER_ENTITY(CTriggerHurt, trigger_hurt); + +CTriggerHurt::CTriggerHurt(CEntityManager * pMgr): + BaseClass(pMgr) +{ + //m_idHurtInterval = SET_INTERVAL(think, 1000.0f); +} + +CTriggerHurt::~CTriggerHurt() +{ + CLEAR_INTERVAL(m_idHurtInterval); +} + +void CTriggerHurt::onTouchStart(CBaseEntity *pActivator) +{ + if(!ID_VALID(m_idHurtInterval)) + { + m_idHurtInterval = SET_INTERVAL(think, m_fHurtInterval); + } + BaseClass::onTouchStart(pActivator); +} +void CTriggerHurt::onTouchEndAll(CBaseEntity *pActivator) +{ + CLEAR_INTERVAL(m_idHurtInterval); + BaseClass::onTouchEnd(pActivator); +} + +void CTriggerHurt::think(float dt) +{ + if(!m_bEnabled) + { + return; + } + + CTakeDamageInfo tdi(this, m_fDamage); + + for(UINT i = 0, l = m_aTouches.size(); i < l; ++i) + { + m_aTouches[i]->dispatchDamage(tdi); + } +} + diff --git a/source/game/TriggerHurt.h b/source/game/TriggerHurt.h new file mode 100644 index 000000000..435e5317d --- /dev/null +++ b/source/game/TriggerHurt.h @@ -0,0 +1,45 @@ + +/*********************************************************** +Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018 +See the license in LICENSE +***********************************************************/ + +/*! +\file +Триггеры +*/ + +/*! \defgroup ctriggerhurt Триггеры урона +\ingroup cbaseanimating +@{ +*/ + +#ifndef __TRIGGER_HURT_H +#define __TRIGGER_HURT_H + +#include "BaseTrigger.h" + +//! Базовый класс триггера +class CTriggerHurt: public CBaseTrigger +{ + DECLARE_CLASS(CTriggerHurt, CBaseTrigger); + DECLARE_PROPTABLE(); +public: + DECLARE_CONSTRUCTOR(); + ~CTriggerHurt(); + +protected: + virtual void onTouchStart(CBaseEntity *pActivator) override; + virtual void onTouchEndAll(CBaseEntity *pActivator) override; + +private: + ID m_idHurtInterval = -1; + float m_fHurtInterval = 0.5f; + float m_fDamage = 10.0f; + + void think(float dt); +}; + +#endif + +/*! @} cbasetrigger */ -- GitLab