66#include <dhooks>
77#include <left4dhooks>
88
9- #define PLUGIN_VERSION " 1.1 "
9+ #define PLUGIN_VERSION " 1.2 "
1010
1111public Plugin myinfo =
1212{
@@ -81,7 +81,10 @@ Handle g_CallOnBeginTransition;
8181Handle g_CallOnBeginChangeLevel ;
8282int g_iOffs_m_mapDurationTimer ;
8383int g_iOffs_m_flTotalMissionElaspedTime ;
84+ int g_iOffs_m_szOriginalMap ;
8485Address gp_m_isTransitioning ;
86+ Address gp_s_landmarkName ;
87+ Address gp_s_landmarkPosition ;
8588
8689methodmap CDirector {
8790 public void ClearTeamScores (bool newCampaign ) {
@@ -96,9 +99,15 @@ methodmap CDirector {
9699 property float m_flTotalMissionElaspedTime {
97100 public set (float flTotalMissionElaspedTime ) { StoreToAddress (view_as <Address >(this ) + view_as <Address >(g_iOffs_m_flTotalMissionElaspedTime ), flTotalMissionElaspedTime , NumberType_Int32 ); }
98101 }
102+ property Address m_szOriginalMap {
103+ public get () { return view_as <Address >(this ) + view_as <Address >(g_iOffs_m_szOriginalMap ); }
104+ }
99105 public bool IsTransitioning () {
100106 return LoadFromAddress (gp_m_isTransitioning , NumberType_Int8 );
101107 }
108+ public void SetOriginalMap (const char [] map ) {
109+ UTIL_StoreToAddressString (this .m_szOriginalMap , map , 32 );
110+ }
102111}
103112CDirector TheDirector ;
104113
@@ -110,20 +119,23 @@ public void OnPluginStart()
110119 {SDKType_Bool , SDKPass_Plain }
111120 };
112121 g_CallClearTeamScores = gd .CreateSDKCallOrFail (SDKCall_Raw , SDKConf_Signature , " CDirector::ClearTeamScores" , params , sizeof (params ), false );
113-
122+
114123 SDKCallParamsWrapper params2 [] = {
115124 {SDKType_Bool , SDKPass_Plain }
116125 };
117126 g_CallOnBeginTransition = gd .CreateSDKCallOrFail (SDKCall_Raw , SDKConf_Signature , " CDirector::OnBeginTransition" , params2 , sizeof (params2 ), false );
118-
127+
119128 SDKCallParamsWrapper params3 [] = {
120129 {SDKType_String , SDKPass_Pointer }
121130 };
122131 g_CallOnBeginChangeLevel = gd .CreateSDKCallOrFail (SDKCall_GameRules , SDKConf_Signature , " CTerrorGameRules::OnBeginChangeLevel" , params3 , sizeof (params3 ), false );
123-
132+
124133 g_iOffs_m_mapDurationTimer = gd .GetOffsetOrFail (" CDirector::m_mapDurationTimer" );
125134 g_iOffs_m_flTotalMissionElaspedTime = gd .GetOffsetOrFail (" CDirector::m_flTotalMissionElaspedTime" );
135+ g_iOffs_m_szOriginalMap = gd .GetOffsetOrFail (" CDirector::m_szOriginalMap" );
126136 gp_m_isTransitioning = gd .GetAddressOrFail (" CDirector::m_isTransitioning" );
137+ gp_s_landmarkName = gd .GetAddressOrFail (" s_landmarkName" );
138+ gp_s_landmarkPosition = gd .GetAddressOrFail (" s_landmarkPosition" );
127139
128140 delete gd .CreateDetourOrFail (" CVEngineServer::ChangeLevel" , DTR__CVEngineServer__ChangeLevel );
129141 delete gd ;
@@ -132,29 +144,32 @@ public void OnPluginStart()
132144public void OnAllPluginsLoaded ()
133145{
134146 TheDirector = view_as <CDirector >(L4D_GetPointer (POINTER_DIRECTOR ));
147+ if (! TheDirector )
148+ {
149+ LogError (" Failed to retrieve TheDirector pointer from left4dhooks" );
150+ }
135151}
136152
137153MRESReturn DTR__CVEngineServer__ChangeLevel (DHookParam hParams )
138154{
139155 if (! TheDirector )
140- {
141- LogError (" Failed to retrieve TheDirector pointer from left4dhooks" );
142156 return MRES_Ignored ;
143- }
144-
157+
145158 char map [64 ]/* , reason[64]*/ ;
146159 hParams .GetString (1 , map , sizeof (map ));
147160 // if (!hParams.IsNull(2))
148161 // hParams.GetString(2, reason, sizeof(reason));
149-
162+
150163 if (TheDirector .IsTransitioning ())
151164 return MRES_Ignored ;
152-
165+
153166 TheDirector .ClearTeamScores (true );
154-
167+
155168 ITimer_Start (TheDirector .m_mapDurationTimer );
156169 TheDirector .m_flTotalMissionElaspedTime = 0.0 ;
157170
171+ TheDirector .SetOriginalMap (map );
172+ ClearTransitionedLandmarkName ();
158173 TheDirector .OnBeginTransition (false );
159174 GameRules__OnBeginChangeLevel (map );
160175
@@ -164,4 +179,23 @@ MRESReturn DTR__CVEngineServer__ChangeLevel(DHookParam hParams)
164179void GameRules__OnBeginChangeLevel (const char [] map )
165180{
166181 SDKCall (g_CallOnBeginChangeLevel , map );
182+ }
183+
184+ void ClearTransitionedLandmarkName ()
185+ {
186+ StoreToAddress (gp_s_landmarkName , 0 , NumberType_Int8 );
187+ StoreToAddress (gp_s_landmarkPosition , 0.0 , NumberType_Int32 );
188+ StoreToAddress (gp_s_landmarkPosition + view_as <Address >(4 ), 0.0 , NumberType_Int32 );
189+ StoreToAddress (gp_s_landmarkPosition + view_as <Address >(8 ), 0.0 , NumberType_Int32 );
190+ }
191+
192+ void UTIL_StoreToAddressString (Address dest , const char [] src , int maxlength )
193+ {
194+ int len = strlen (src );
195+ if (len > maxlength - 1 )
196+ len = maxlength - 1 ;
197+ for (int i = 0 ; i < len ; ++ i ) {
198+ StoreToAddress (dest + view_as <Address >(i ), src [i ], NumberType_Int8 );
199+ }
200+ StoreToAddress (dest + view_as <Address >(len ), 0 , NumberType_Int8 );
167201}
0 commit comments