Skip to content
Snippets Groups Projects
Commit fcb16857 authored by D-AIRY's avatar D-AIRY
Browse files

func_narrow_passage entity

parent 0831ec94
No related branches found
No related tags found
No related merge requests found
Showing
with 353 additions and 8 deletions
[{D8CE1F61-7941-498F-BD0A-D768A8257ADB}]
up_point = 3.700012 0.000000 0.000000
speed = 0.500000
rotation = 0.000000 -0.707107 0.000000 -0.707107
parent =
origin = 0.000008 0.100000 -1.849973
name =
flags = 0
classname = func_narrow_passage
OnPlayerGetOn =
OnPlayerGetOff =
[{DC740742-575B-4B03-873A-1717475B2375}]
team = -842150451
rotation = 0.000000 0.000000 0.000000 1.000000
parent =
origin = 0.096405 0.000000 -3.485951
name =
flags = 0
classname = info_player_spawn
[level]
type = indoor
local_name = demo_narrow_passage
[terrax]
vp_layout = 0
grid_step = 4
grid_show = 1
cam3_view = 1
cam3_scale = 0.009128
cam3_rot = 0.000000 0.000000 0.000000 1.000000
cam3_pos = -0.616946 0.147523 -1000.000000
cam2_view = 2
cam2_scale = 0.008899
cam2_rot = 0.000000 0.707107 0.000000 0.707107
cam2_pos = 1000.000000 1.106782 -17.269983
cam1_view = 0
cam1_scale = 0.034539
cam1_rot = -0.707107 0.000000 0.000000 0.707107
cam1_pos = -5.000654 1000.000000 0.807223
cam0_view = -1
cam0_scale = 1.000000
cam0_rot = 0.219844 0.603690 -0.178066 -0.745332
cam0_pos = -8.303119 6.760478 -3.441035
[
]
[
]
{"brushes":[
{
"brush": [{"v":[[-5,-0.2,5],[-5,-0.2,-5],[5,-0.2,-5],[5,-0.2,5],[-5,0,5],[-5,0,-5],[5,0,-5],[5,0,5]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[-0,-0,-1,4.76837e-007,1],"t":[0,-1,0,0,1],"m":0},"e":[8,4,9,0],"n":[-1,-0,-0],"i":0},{"t":{"s":[1,0,0,9.53674e-007,1],"t":[0,-1,0,0,1],"m":0},"e":[9,5,10,1],"n":[0,0,-1],"i":0},{"t":{"s":[-0,0,1,-4.76837e-007,1],"t":[0,-1,0,0,1],"m":0},"e":[10,6,11,2],"n":[1,0,-0],"i":0},{"t":{"s":[-1,0,0,-9.53674e-007,1],"t":[0,-1,0,0,1],"m":0},"e":[11,7,8,3],"n":[0,0,1],"i":0},{"t":{"s":[1,0,-0,9.53674e-007,1],"t":[0,0,1,-4.76837e-007,1],"m":0},"e":[0,1,2,3],"n":[0,-1,0],"i":0},{"t":{"s":[-1,0,0,-9.53674e-007,1],"t":[0,0,1,-4.76837e-007,1],"m":0},"e":[7,6,5,4],"n":[-0,1,-0],"i":0}],"m":["dev_floor"]}]
,"guid": "{6A81568F-6D71-402D-AED0-B5F6B29E7C92}"
,"color": "0.000000 0.101126 0.607227"
,"name": ""
}
,{
"brush": [{"v":[[-1.00002,6.55651e-006,-1.6],[-0.200004,6.07967e-006,-1.6],[-0.200001,-1.19209e-007,1.60005],[-1.00001,3.57628e-007,1.60005],[-1.00001,2.20004,-1.6],[-0.200004,2.20004,-1.6],[-0.2,2.20003,1.60005],[-1.00001,2.20003,1.60005]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[1.00001,-2.38715e-007,-1.55717e-006,18.5,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399965,1],"m":1},"e":[8,4,9,0],"n":[-1.55717e-006,1.92885e-006,-1.00001],"i":0},{"t":{"s":[1.55717e-006,-1.92885e-006,1.00001,1.59998,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399965,1],"m":1},"e":[9,5,10,1],"n":[1.00001,-2.38715e-007,-1.55717e-006],"i":0},{"t":{"s":[-1.00001,2.38715e-007,1.55717e-006,-18.5,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399965,1],"m":1},"e":[10,6,11,2],"n":[1.55717e-006,-1.92885e-006,1.00001],"i":0},{"t":{"s":[-1.55717e-006,1.92885e-006,-1.00001,-1.59998,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399965,1],"m":1},"e":[11,7,8,3],"n":[-1.00001,2.38715e-007,1.55717e-006],"i":0},{"t":{"s":[1.55717e-006,-1.92885e-006,1.00001,1.59998,1],"t":[-1.00001,2.38715e-007,1.55717e-006,-18.5,1],"m":1},"e":[0,1,2,3],"n":[-2.38717e-007,-1.00002,-1.92885e-006],"i":0},{"t":{"s":[-1.55717e-006,1.92885e-006,-1.00001,-1.59998,1],"t":[-1.00001,2.38715e-007,1.55717e-006,-18.5,1],"m":1},"e":[7,6,5,4],"n":[2.38717e-007,1.00002,1.92885e-006],"i":0}],"m":["asphalt_01_A","dev_wall"]}]
,"guid": "{7B6F5ECE-1D4B-41FF-9553-4EC6989AFA4F}"
,"color": "0.000000 0.101126 0.607227"
,"name": ""
}
,{
"brush": [{"v":[[0.199986,6.55651e-006,-1.6],[0.999996,6.07967e-006,-1.6],[1,-1.19209e-007,1.60005],[0.19999,3.57628e-007,1.60005],[0.199986,2.20004,-1.59999],[0.999996,2.20004,-1.59999],[1,2.20003,1.60005],[0.19999,2.20003,1.60005]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[1.00001,-2.38715e-007,-1.55717e-006,17.7,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399964,1],"m":1},"e":[8,4,9,0],"n":[-1.55717e-006,1.92885e-006,-1.00001],"i":0},{"t":{"s":[1.55717e-006,-1.92885e-006,1.00001,1.59997,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399964,1],"m":1},"e":[9,5,10,1],"n":[1.00001,-2.38715e-007,-1.55717e-006],"i":0},{"t":{"s":[-1.00001,2.38715e-007,1.55717e-006,-17.7,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399964,1],"m":1},"e":[10,6,11,2],"n":[1.55717e-006,-1.92885e-006,1.00001],"i":0},{"t":{"s":[-1.55717e-006,1.92885e-006,-1.00001,-1.59997,1],"t":[-2.38717e-007,-1.00002,-1.92885e-006,-0.399964,1],"m":1},"e":[11,7,8,3],"n":[-1.00001,2.38715e-007,1.55717e-006],"i":0},{"t":{"s":[1.55717e-006,-1.92885e-006,1.00001,1.59997,1],"t":[-1.00001,2.38715e-007,1.55717e-006,-17.7,1],"m":1},"e":[0,1,2,3],"n":[-2.38717e-007,-1.00002,-1.92885e-006],"i":0},{"t":{"s":[-1.55717e-006,1.92885e-006,-1.00001,-1.59997,1],"t":[-1.00001,2.38715e-007,1.55717e-006,-17.7,1],"m":1},"e":[7,6,5,4],"n":[2.38717e-007,1.00002,1.92885e-006],"i":0}],"m":["asphalt_01_A","dev_wall"]}]
,"guid": "{FC09E082-D68A-40AE-8BDA-22244DC3B346}"
,"color": "0.000000 0.273974 0.827866"
,"name": ""
}
,{
"brush": [{"v":[[-5.4,-0.2,5.4],[-5.4,-0.2,5],[5.4,-0.2,5],[5.4,-0.2,5.4],[-5.4,2,5.4],[-5.4,2,5],[5.4,2,5],[5.4,2,5.4]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[-0,-0,-1,0,1],"t":[0,-1,0,0,1],"m":0},"e":[8,4,9,0],"n":[-1,-0,-0],"i":0},{"t":{"s":[1,0,0,0,1],"t":[0,-1,0,0,1],"m":0},"e":[9,5,10,1],"n":[0,0,-1],"i":0},{"t":{"s":[-0,0,1,0,1],"t":[0,-1,0,0,1],"m":0},"e":[10,6,11,2],"n":[1,0,-0],"i":0},{"t":{"s":[-1,0,0,0,1],"t":[0,-1,0,0,1],"m":0},"e":[11,7,8,3],"n":[0,0,1],"i":0},{"t":{"s":[1,0,-0,0,1],"t":[0,0,1,0,1],"m":0},"e":[0,1,2,3],"n":[0,-1,0],"i":0},{"t":{"s":[-1,0,0,0,1],"t":[0,0,1,0,1],"m":0},"e":[7,6,5,4],"n":[-0,1,-0],"i":0}],"m":["dev_wall"]}]
,"guid": "{9954F53A-4FDD-4A58-BA7C-4BE5A1C0985A}"
,"color": "0.000000 0.256697 0.873049"
,"name": ""
}
,{
"brush": [{"v":[[-5.4,-0.2,5],[-5.4,-0.2,-5],[-5,-0.2,-5],[-5,-0.2,5],[-5.4,2,5],[-5.4,2,-5],[-5,2,-5],[-5,2,5]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[0,0,-1,-5.20001,1],"t":[0,-1,0,5.96046e-008,1],"m":0},"e":[8,4,9,0],"n":[-1,0,0],"i":0},{"t":{"s":[1,0,0,5.2,1],"t":[0,-1,0,5.96046e-008,1],"m":0},"e":[9,5,10,1],"n":[0,0,-1],"i":0},{"t":{"s":[0,0,1,5.20001,1],"t":[0,-1,0,5.96046e-008,1],"m":0},"e":[10,6,11,2],"n":[1,0,0],"i":0},{"t":{"s":[-1,0,0,-5.2,1],"t":[0,-1,0,5.96046e-008,1],"m":0},"e":[11,7,8,3],"n":[0,0,1],"i":0},{"t":{"s":[1,0,0,5.2,1],"t":[0,0,1,5.20001,1],"m":0},"e":[0,1,2,3],"n":[0,-1,0],"i":0},{"t":{"s":[-1,0,0,-5.2,1],"t":[0,0,1,5.20001,1],"m":0},"e":[7,6,5,4],"n":[0,1,0],"i":0}],"m":["dev_wall"]}]
,"guid": "{0EB30997-28DE-4FD5-AE94-5117B1A7B4C8}"
,"color": "0.000000 0.256697 0.873049"
,"name": ""
}
,{
"brush": [{"v":[[-5.4,-0.2,-5],[-5.4,-0.2,-5.4],[5.4,-0.2,-5.4],[5.4,-0.2,-5],[-5.4,2,-5],[-5.4,2,-5.4],[5.4,2,-5.4],[5.4,2,-5]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[0,0,-1,-10.4,1],"t":[0,-1,0,0,1],"m":0},"e":[8,4,9,0],"n":[-1,0,0],"i":0},{"t":{"s":[1,0,0,0,1],"t":[0,-1,0,0,1],"m":0},"e":[9,5,10,1],"n":[0,0,-1],"i":0},{"t":{"s":[0,0,1,10.4,1],"t":[0,-1,0,0,1],"m":0},"e":[10,6,11,2],"n":[1,0,0],"i":0},{"t":{"s":[-1,0,0,0,1],"t":[0,-1,0,0,1],"m":0},"e":[11,7,8,3],"n":[0,0,1],"i":0},{"t":{"s":[1,0,0,0,1],"t":[0,0,1,10.4,1],"m":0},"e":[0,1,2,3],"n":[0,-1,0],"i":0},{"t":{"s":[-1,0,0,0,1],"t":[0,0,1,10.4,1],"m":0},"e":[7,6,5,4],"n":[0,1,0],"i":0}],"m":["dev_wall"]}]
,"guid": "{69DE4191-351F-4FF1-8781-E915708CE2E3}"
,"color": "0.000000 0.256697 0.873049"
,"name": ""
}
,{
"brush": [{"v":[[5,-0.2,5],[5,-0.2,-5],[5.4,-0.2,-5],[5.4,-0.2,5],[5,2,5],[5,2,-5],[5.4,2,-5],[5.4,2,5]],"e":[[0,1,0],[1,2,0],[2,3,0],[3,0,0],[4,5,0],[5,6,0],[6,7,0],[4,7,0],[0,4,0],[1,5,0],[2,6,0],[3,7,0]],"f":[{"t":{"s":[0,0,-1,-5.20001,1],"t":[0,-1,0,1.19209e-007,1],"m":0},"e":[8,4,9,0],"n":[-1,0,0],"i":0},{"t":{"s":[1,0,0,-5.2,1],"t":[0,-1,0,1.19209e-007,1],"m":0},"e":[9,5,10,1],"n":[0,0,-1],"i":0},{"t":{"s":[0,0,1,5.20001,1],"t":[0,-1,0,1.19209e-007,1],"m":0},"e":[10,6,11,2],"n":[1,0,0],"i":0},{"t":{"s":[-1,0,0,5.2,1],"t":[0,-1,0,1.19209e-007,1],"m":0},"e":[11,7,8,3],"n":[0,0,1],"i":0},{"t":{"s":[1,0,0,-5.2,1],"t":[0,0,1,5.20001,1],"m":0},"e":[0,1,2,3],"n":[0,-1,0],"i":0},{"t":{"s":[-1,0,0,5.2,1],"t":[0,0,1,5.20001,1],"m":0},"e":[7,6,5,4],"n":[0,1,0],"i":0}],"m":["dev_wall"]}]
,"guid": "{28576378-47EB-43D6-A078-BD3C9CA2E5C2}"
,"color": "0.000000 0.256697 0.873049"
,"name": ""
}
]
,"models":[
]}
File added
File added
......@@ -39,3 +39,7 @@ inv_stackable = 0
[base_weapon]
inv_equip_type = 1
[func_narrow_passage]
speed = 0.5
up_point = 2 0 0
......@@ -202,6 +202,7 @@
<ClCompile Include="..\..\..\source\game\EntityManager.cpp" />
<ClCompile Include="..\..\..\source\game\EnvSkybox.cpp" />
<ClCompile Include="..\..\..\source\game\FuncLadder.cpp" />
<ClCompile Include="..\..\..\source\game\FuncNarrowPassage.cpp" />
<ClCompile Include="..\..\..\source\game\FuncRotating.cpp" />
<ClCompile Include="..\..\..\source\game\FuncTrain.cpp" />
<ClCompile Include="..\..\..\source\game\GameData.cpp" />
......@@ -220,6 +221,7 @@
<ClCompile Include="..\..\..\source\game\LogicEntityExists.cpp" />
<ClCompile Include="..\..\..\source\game\LogicRelay.cpp" />
<ClCompile Include="..\..\..\source\game\LogicStringbuilder.cpp" />
<ClCompile Include="..\..\..\source\game\NarrowPassageMovementController.cpp" />
<ClCompile Include="..\..\..\source\game\NPCBase.cpp" />
<ClCompile Include="..\..\..\source\game\NPCZombie.cpp" />
<ClCompile Include="..\..\..\source\game\PathCorner.cpp" />
......@@ -286,6 +288,7 @@
<ClInclude Include="..\..\..\source\game\EntityPointer.h" />
<ClInclude Include="..\..\..\source\game\EnvSkybox.h" />
<ClInclude Include="..\..\..\source\game\FuncLadder.h" />
<ClInclude Include="..\..\..\source\game\FuncNarrowPassage.h" />
<ClInclude Include="..\..\..\source\game\FuncRotating.h" />
<ClInclude Include="..\..\..\source\game\GameStateManager.h" />
<ClInclude Include="..\..\..\source\game\CharacterInventory.h" />
......@@ -303,6 +306,7 @@
<ClInclude Include="..\..\..\source\game\LogicEntityExists.h" />
<ClInclude Include="..\..\..\source\game\LogicRelay.h" />
<ClInclude Include="..\..\..\source\game\LogicStringbuilder.h" />
<ClInclude Include="..\..\..\source\game\NarrowPassageMovementController.h" />
<ClInclude Include="..\..\..\source\game\physics_util.h" />
<ClInclude Include="..\..\..\source\game\PointChangelevel.h" />
<ClInclude Include="..\..\..\source\game\PropBreakable.h" />
......
......@@ -378,6 +378,12 @@
<ClCompile Include="..\..\..\source\game\FuncLadder.cpp">
<Filter>Source Files\ents\func\mover</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\game\FuncNarrowPassage.cpp">
<Filter>Source Files\ents\func\mover</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\game\NarrowPassageMovementController.cpp">
<Filter>Source Files\character_movement</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\source\game\sxgame.h">
......@@ -656,6 +662,12 @@
<ClInclude Include="..\..\..\source\game\FuncLadder.h">
<Filter>Header Files\ents\func\mover</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\game\FuncNarrowPassage.h">
<Filter>Header Files\ents\func\mover</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\game\NarrowPassageMovementController.h">
<Filter>Header Files\character_movement</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\source\game\sxgame.rc">
......
......@@ -5,8 +5,12 @@ TODO("Trigger OnPlayerGetOn/OnPlayerGetOff events");
TODO("Handle MOVER_NO_AUTOMOUNT flag");
BEGIN_PROPTABLE(CBaseMover)
//! Конечная точка
DEFINE_FIELD_VECTORFN(m_vUpPoint, PDFF_USE_GIZMO, "up_point", "End point", setUpPoint, EDITOR_POINTCOORD)
//! Скорость движения
DEFINE_FIELD_FLOAT(m_fSpeed, PDFF_NONE, "speed", "Speed", EDITOR_TEXTFIELD)
//! Игрок присоединился
DEFINE_OUTPUT(m_onPlayerGetOn, "OnPlayerGetOn", "On player get on")
//! Игрок отсоединился
......@@ -19,8 +23,11 @@ BEGIN_PROPTABLE(CBaseMover)
//! Переключает состояние
DEFINE_INPUT(toggle, "toggle", "Toggle", PDF_NONE)
//! Изначально выключена
DEFINE_FLAG(MOVER_INITIALLY_DISABLED, "Start disabled")
//! Отключить автомонтирование (требуется нажать кнопку взаимодействия)
DEFINE_FLAG(MOVER_NO_AUTOMOUNT, "Disable automount")
END_PROPTABLE()
......@@ -365,6 +372,11 @@ float3 CBaseMover::getUpPos()
return(getOrient() * m_vUpPoint + getPos());
}
float CBaseMover::getSpeed()
{
return(m_fSpeed);
}
void CBaseMover::handleCharacterMount(CBaseEntity *pEntity)
{
if(fstrcmp(pEntity->getClassName(), "player"))
......@@ -461,7 +473,7 @@ void CBaseMover::newMovementController(IMovementController **ppOut)
//##########################################################################
void CPhysicsLadderTickEventListener::onEvent(const XEventPhysicsStep *pData)
void CPhysicsMoverTickEventListener::onEvent(const XEventPhysicsStep *pData)
{
m_pMover->onPhysicsStep();
}
......@@ -7,10 +7,10 @@
#define MOVER_NO_AUTOMOUNT ENT_FLAG_1
class CBaseMover;
class CPhysicsLadderTickEventListener final: public IEventListener<XEventPhysicsStep>
class CPhysicsMoverTickEventListener final: public IEventListener<XEventPhysicsStep>
{
public:
CPhysicsLadderTickEventListener(CBaseMover *pMover):
CPhysicsMoverTickEventListener(CBaseMover *pMover):
m_pMover(pMover)
{
}
......@@ -25,7 +25,7 @@ class CBaseMover: public CPointEntity
{
DECLARE_CLASS(CBaseMover, CPointEntity);
DECLARE_PROPTABLE();
friend class CPhysicsLadderTickEventListener;
friend class CPhysicsMoverTickEventListener;
public:
DECLARE_CONSTRUCTOR();
~CBaseMover();
......@@ -42,6 +42,8 @@ public:
float3 getUpPos();
float getSpeed();
private:
void handleCharacterMount(CBaseEntity *pEntity);
void createPhysBody();
......@@ -70,9 +72,11 @@ private:
IXGhostObject *m_pGhostObject = NULL;
IXConvexHullShape *m_pCollideShape = NULL;
static IEventChannel<XEventPhysicsStep> *m_pTickEventChannel;
CPhysicsLadderTickEventListener m_physicsTicker;
CPhysicsMoverTickEventListener m_physicsTicker;
Array<CBaseEntity*> m_aTouchedEntities;
float m_fSpeed = 3.0f;
};
#endif
......@@ -17,7 +17,6 @@ class CFuncLadder: public CBaseMover
{
DECLARE_CLASS(CFuncLadder, CBaseMover);
DECLARE_PROPTABLE();
friend class CPhysicsLadderTickEventListener;
public:
DECLARE_TRIVIAL_CONSTRUCTOR();
......
#include "FuncNarrowPassage.h"
#include "BaseCharacter.h"
#include "NarrowPassageMovementController.h"
BEGIN_PROPTABLE(CFuncNarrowPassage)
// empty
END_PROPTABLE()
REGISTER_ENTITY(CFuncNarrowPassage, func_narrow_passage);
void CFuncNarrowPassage::newMovementController(IMovementController **ppOut)
{
*ppOut = new CNarrowPassageMovementController(this);
}
#ifndef __FUNC_NARROW_PASSAGE_H
#define __FUNC_NARROW_PASSAGE_H
#include "BaseMover.h"
class CFuncNarrowPassage: public CBaseMover
{
DECLARE_CLASS(CFuncNarrowPassage, CBaseMover);
DECLARE_PROPTABLE();
public:
DECLARE_TRIVIAL_CONSTRUCTOR();
private:
void newMovementController(IMovementController **ppOut) override;
};
#endif
......@@ -9,6 +9,8 @@ CLadderMovementController::CLadderMovementController(CFuncLadder *pLadder)
m_vLadderPoint[1] = pLadder->getUpPos();
m_vLadderDir = SMVector3Normalize(m_vLadderPoint[1] - m_vLadderPoint[0]);
m_fSpeed = pLadder->getSpeed();
}
CLadderMovementController::~CLadderMovementController()
{
......@@ -18,7 +20,7 @@ CLadderMovementController::~CLadderMovementController()
}
}
float3 SMProjectPointOnLine(const float3 &vPos, const float3 &vStart, const float3 &vEnd)
static float3 SMProjectPointOnLine(const float3 &vPos, const float3 &vStart, const float3 &vEnd)
{
float3 vN = SMVector3Normalize(vEnd - vStart);
float fDot0 = SMVector3Dot(vN, vPos - vStart);
......@@ -88,7 +90,7 @@ void CLadderMovementController::update(float fDt)
{
float fDot = SMVector3Dot(m_vLadderDir, m_vMoveDir);
float3 vSpeed = m_vLadderDir * 3.0f;
float3 vSpeed = m_vLadderDir * m_fSpeed;
float3 vNewPos;
if(fDot > /*-SM_PIDIV4*/ -SMToRadian(10.0f))
......
......@@ -26,6 +26,8 @@ private:
float3_t m_vMoveDir;
float m_fSpeed = 3.0f;
struct
{
bool is = false;
......
#include "NarrowPassageMovementController.h"
#include "BaseCharacter.h"
#include "FuncNarrowPassage.h"
#include "Player.h"
CNarrowPassageMovementController::CNarrowPassageMovementController(CFuncNarrowPassage *pPassage)
{
m_vLadderPoint[0] = pPassage->getPos();
m_vLadderPoint[1] = pPassage->getUpPos();
m_vLadderDir = SMVector3Normalize(m_vLadderPoint[1] - m_vLadderPoint[0]);
m_fSpeed = pPassage->getSpeed();
}
CNarrowPassageMovementController::~CNarrowPassageMovementController()
{
if(m_pCharacter)
{
m_pCharacter->getCharacterController()->setGravity(float3(0.0f, -10.0f, 0.0f));
}
}
static float3 SMProjectPointOnLine(const float3 &vPos, const float3 &vStart, const float3 &vEnd)
{
float3 vN = SMVector3Normalize(vEnd - vStart);
float fDot0 = SMVector3Dot(vN, vPos - vStart);
if(fDot0 <= 0.0f)
{
return(vStart);
}
float fDot1 = SMVector3Dot(vN, vPos - vEnd);
if(fDot1 >= 0.0f)
{
return(vEnd);
}
return(vStart + vN * fDot0);
}
void CNarrowPassageMovementController::setCharacter(CBaseCharacter *pCharacter)
{
m_pCharacter = pCharacter;
IXCharacterController *pCharacterController = pCharacter->getCharacterController();
pCharacterController->setGravity(float3(0.0f, 0.0f, 0.0f));
pCharacterController->setVelocityForTimeInterval(float3(0.0f, 0.0f, 0.0f), 0.0f);
m_mounting.is = true;
m_mounting.fFrac = 0.0f;
m_mounting.vStartPos = m_pCharacter->getPos();
m_mounting.vTargetPos = SMProjectPointOnLine(m_pCharacter->getPos(), m_vLadderPoint[0], m_vLadderPoint[1]);
}
void CNarrowPassageMovementController::handleMove(const float3 &vDir)
{
m_vMoveDir = vDir;
}
void CNarrowPassageMovementController::handleJump()
{
m_bWillDismount = true;
}
bool CNarrowPassageMovementController::handleUse()
{
m_bWillDismount = true;
return(true);
}
void CNarrowPassageMovementController::update(float fDt)
{
if(m_mounting.is)
{
m_mounting.fFrac += 7.0f * fDt;
if(m_mounting.fFrac > 1.0f)
{
m_mounting.fFrac = 1.0f;
m_mounting.is = false;
}
m_pCharacter->setPos(vlerp(m_mounting.vStartPos, m_mounting.vTargetPos, m_mounting.fFrac));
}
else if(m_bWillDismount)
{
((CPlayer*)m_pCharacter)->m_vCurrentSpeed = m_vMoveDir;
m_pCharacter->setMovementController(NULL);
}
else if(!SMIsZero(SMVector3Length2(m_vMoveDir)))
{
float fDot = SMVector3Dot(m_vLadderDir, m_vMoveDir);
float3 vSpeed = m_vLadderDir * m_fSpeed;
float3 vNewPos;
if(fDot > /*-SM_PIDIV4*/ -SMToRadian(10.0f))
{
if(SMIsZero(SMVector3Length2(m_vLadderPoint[1] - m_pCharacter->getPos())))
{
m_bWillDismount = true;
}
else
{
vNewPos = m_pCharacter->getPos() + vSpeed * fDt;
if(SMVector3Length2(vNewPos - m_vLadderPoint[0]) > SMVector3Length2(m_vLadderPoint[1] - m_vLadderPoint[0]))
{
vNewPos = m_vLadderPoint[1];
}
}
}
else
{
if(SMIsZero(SMVector3Length2(m_vLadderPoint[0] - m_pCharacter->getPos())))
{
m_bWillDismount = true;
}
else
{
vNewPos = m_pCharacter->getPos() - vSpeed * fDt;
if(SMVector3Length2(vNewPos - m_vLadderPoint[1]) > SMVector3Length2(m_vLadderPoint[1] - m_vLadderPoint[0]))
{
vNewPos = m_vLadderPoint[0];
}
}
}
if(!m_bWillDismount)
{
m_pCharacter->setPos(vNewPos);
}
}
}
#ifndef __NARROWPASSAGEMOVEMENTCONTROLLER_H
#define __NARROWPASSAGEMOVEMENTCONTROLLER_H
#include "IMovementController.h"
class CFuncNarrowPassage;
class CNarrowPassageMovementController: public IXUnknownImplementation<IMovementController>
{
public:
CNarrowPassageMovementController(CFuncNarrowPassage *pPassage);
~CNarrowPassageMovementController();
void setCharacter(CBaseCharacter *pCharacter) override;
void handleMove(const float3 &vDir) override;
void handleJump() override;
bool handleUse() override;
void update(float fDt) override;
private:
CBaseCharacter *m_pCharacter;
float3_t m_vLadderPoint[2];
float3_t m_vLadderDir;
float3_t m_vMoveDir;
float m_fSpeed = 3.0f;
struct
{
bool is = false;
float fFrac = 0.0f;
float3_t vStartPos;
float3_t vTargetPos;
}
m_mounting;
bool m_bWillDismount = false;
};
#endif
......@@ -25,7 +25,9 @@ See the license in LICENSE
//! Класс игрока \ingroup cbaseanimating
class CPlayer: public CBaseCharacter
{
TODO("Fix that");
friend class CLadderMovementController;
friend class CNarrowPassageMovementController;
DECLARE_CLASS(CPlayer, CBaseCharacter);
DECLARE_PROPTABLE();
public:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment