@@ -131,6 +131,7 @@ Convar gCV_PrebuiltZones = null;
131131Convar gCV_ClimbButtons = null ;
132132Convar gCV_Interval = null ;
133133Convar gCV_TeleportToStart = null ;
134+ Convar gCV_TeleportToStartOnSpawn = null ;
134135Convar gCV_TeleportToEnd = null ;
135136Convar gCV_AllowDrawAllZones = null ;
136137Convar gCV_UseCustomSprite = null ;
@@ -334,6 +335,7 @@ public void OnPluginStart()
334335 gCV_ClimbButtons = new Convar (" shavit_zones_usebuttons" , " 1" , " Whether to automatically hook climb_* buttons." , 0 , true , 0.0 , true , 1.0 );
335336 gCV_Interval = new Convar (" shavit_zones_interval" , " 1.0" , " Interval between each time a mapzone is being drawn to the players." , 0 , true , 0.25 , true , 5.0 );
336337 gCV_TeleportToStart = new Convar (" shavit_zones_teleporttostart" , " 1" , " Teleport players to the start zone on timer restart?\n 0 - Disabled\n 1 - Enabled" , 0 , true , 0.0 , true , 1.0 );
338+ gCV_TeleportToStartOnSpawn = new Convar (" shavit_zones_teleporttostart_onspawn" , " 1" , " Teleport players to the start zone on player spawn?\n 0 - Disabled\n 1 - Enabled" , 0 , true , 0.0 , true , 1.0 );
337339 gCV_TeleportToEnd = new Convar (" shavit_zones_teleporttoend" , " 1" , " Teleport players to the end zone on sm_end?\n 0 - Disabled\n 1 - Enabled" , 0 , true , 0.0 , true , 1.0 );
338340 gCV_AllowDrawAllZones = new Convar (" shavit_zones_allowdrawallzones" , " 1" , " Allow players to use !drawallzones to see all zones regardless of zone visibility settings.\n 0 - nobody can use !drawallzones\n 1 - admins (sm_zones access) can use !drawallzones\n 2 - anyone can use !drawallzones" , 0 , true , 0.0 , true , 2.0 );
339341 gCV_UseCustomSprite = new Convar (" shavit_zones_usecustomsprite" , " 1" , " Use custom sprite for zone drawing?\n See `configs/shavit-zones.cfg`.\n 0 - Disabled\n 1 - Enabled" , 0 , true , 0.0 , true , 1.0 );
@@ -5071,60 +5073,7 @@ public void Shavit_OnRestart(int client, int track)
50715073
50725074 if (gCV_TeleportToStart .BoolValue )
50735075 {
5074- bool bCustomStart = gB_HasSetStart [client ][track ] && ! gB_StartAnglesOnly [client ][track ];
5075- bool use_CustomStart_over_CustomSpawn = (iIndex != - 1 ) && bCustomStart ;
5076-
5077- // custom spawns
5078- if (! use_CustomStart_over_CustomSpawn && ! EmptyVector (gF_CustomSpawn [track ]))
5079- {
5080- float pos [3 ]; pos = gF_CustomSpawn [track ]; pos [2 ] += 1.0 ;
5081- TeleportEntity (client , pos , NULL_VECTOR , ZERO_VECTOR );
5082- }
5083- // standard zoning
5084- else if (bCustomStart || iIndex != - 1 )
5085- {
5086- float fCenter [3 ];
5087-
5088- if (bCustomStart )
5089- {
5090- fCenter = gF_StartPos [client ][track ];
5091- }
5092- else
5093- {
5094- fCenter [0 ] = gV_ZoneCenter [iIndex ][0 ];
5095- fCenter [1 ] = gV_ZoneCenter [iIndex ][1 ];
5096- fCenter [2 ] = gA_ZoneCache [iIndex ].fCorner1 [2 ] + gCV_ExtraSpawnHeight .FloatValue ;
5097- }
5098-
5099- fCenter [2 ] += 1.0 ;
5100-
5101- TeleportEntity (client , fCenter , gB_HasSetStart [client ][track ] ? gF_StartAng [client ][track ] : NULL_VECTOR , view_as <float >({0.0 , 0.0 , 0.0 }));
5102-
5103- if (gB_ReplayRecorder && gB_HasSetStart [client ][track ])
5104- {
5105- Shavit_HijackAngles (client , gF_StartAng [client ][track ][0 ], gF_StartAng [client ][track ][1 ], - 1 , true );
5106- }
5107-
5108- if (! gB_HasSetStart [client ][track ] || gB_StartAnglesOnly [client ][track ])
5109- {
5110- ResetClientTargetNameAndClassName (client , track );
5111- // normally StartTimer will happen on zone-touch BUT we have this here for zones that are in the air
5112- bool skipGroundCheck = true ;
5113- Shavit_StartTimer (client , track , skipGroundCheck );
5114- }
5115- }
5116- // kz buttons
5117- else if (Shavit_IsKZMap (track ))
5118- {
5119- if (EmptyVector (gF_ClimbButtonCache [client ][track ][0 ]) || EmptyVector (gF_ClimbButtonCache [client ][track ][1 ]))
5120- {
5121- return ;
5122- }
5123-
5124- TeleportEntity (client , gF_ClimbButtonCache [client ][track ][0 ], gF_ClimbButtonCache [client ][track ][1 ], view_as <float >({0.0 , 0.0 , 0.0 }));
5125-
5126- return ;
5127- }
5076+ TeleportToStart (client , iIndex , track );
51285077 }
51295078
51305079 if (iIndex != - 1 )
@@ -5214,7 +5163,74 @@ int GetZoneIndex(int type, int track, int start = 0)
52145163
52155164public void Player_Spawn (Event event , const char [] name , bool dontBroadcast )
52165165{
5217- Reset (GetClientOfUserId (event .GetInt (" userid" )));
5166+ int client = GetClientOfUserId (event .GetInt (" userid" ));
5167+ int track = Shavit_GetClientTrack (client );
5168+ int iIndex = GetZoneIndex (Zone_Start , track );
5169+
5170+ Reset (client );
5171+
5172+ if (GetConVarBool (gCV_TeleportToStartOnSpawn ) && (Shavit_ZoneExists (Zone_Start , track ) || Shavit_IsKZMap (track )))
5173+ {
5174+ TeleportToStart (client , iIndex , track );
5175+ }
5176+ }
5177+
5178+ public void TeleportToStart (int client , int iIndex , int track )
5179+ {
5180+ bool bCustomStart = gB_HasSetStart [client ][track ] && ! gB_StartAnglesOnly [client ][track ];
5181+ bool use_CustomStart_over_CustomSpawn = (iIndex != - 1 ) && bCustomStart ;
5182+
5183+ // custom spawns
5184+ if (! use_CustomStart_over_CustomSpawn && ! EmptyVector (gF_CustomSpawn [track ]))
5185+ {
5186+ float pos [3 ]; pos = gF_CustomSpawn [track ]; pos [2 ] += 1.0 ;
5187+ TeleportEntity (client , pos , NULL_VECTOR , ZERO_VECTOR );
5188+ }
5189+ // standard zoning
5190+ else if (bCustomStart || iIndex != - 1 )
5191+ {
5192+ float fCenter [3 ];
5193+
5194+ if (bCustomStart )
5195+ {
5196+ fCenter = gF_StartPos [client ][track ];
5197+ }
5198+ else
5199+ {
5200+ fCenter [0 ] = gV_ZoneCenter [iIndex ][0 ];
5201+ fCenter [1 ] = gV_ZoneCenter [iIndex ][1 ];
5202+ fCenter [2 ] = gA_ZoneCache [iIndex ].fCorner1 [2 ] + gCV_ExtraSpawnHeight .FloatValue ;
5203+ }
5204+
5205+ fCenter [2 ] += 1.0 ;
5206+
5207+ TeleportEntity (client , fCenter , gB_HasSetStart [client ][track ] ? gF_StartAng [client ][track ] : NULL_VECTOR , view_as <float >({0.0 , 0.0 , 0.0 }));
5208+
5209+ if (gB_ReplayRecorder && gB_HasSetStart [client ][track ])
5210+ {
5211+ Shavit_HijackAngles (client , gF_StartAng [client ][track ][0 ], gF_StartAng [client ][track ][1 ], - 1 , true );
5212+ }
5213+
5214+ if (! gB_HasSetStart [client ][track ] || gB_StartAnglesOnly [client ][track ])
5215+ {
5216+ ResetClientTargetNameAndClassName (client , track );
5217+ // normally StartTimer will happen on zone-touch BUT we have this here for zones that are in the air
5218+ bool skipGroundCheck = true ;
5219+ Shavit_StartTimer (client , track , skipGroundCheck );
5220+ }
5221+ }
5222+ // kz buttons
5223+ else if (Shavit_IsKZMap (track ))
5224+ {
5225+ if (EmptyVector (gF_ClimbButtonCache [client ][track ][0 ]) || EmptyVector (gF_ClimbButtonCache [client ][track ][1 ]))
5226+ {
5227+ return ;
5228+ }
5229+
5230+ TeleportEntity (client , gF_ClimbButtonCache [client ][track ][0 ], gF_ClimbButtonCache [client ][track ][1 ], view_as <float >({0.0 , 0.0 , 0.0 }));
5231+
5232+ return ;
5233+ }
52185234}
52195235
52205236public void Round_Start (Event event , const char [] name , bool dontBroadcast )
0 commit comments