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