diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index 3099472823c..068f15a5b3d 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -210,7 +210,7 @@ static bool IsValidTile(int LayerType, bool EntitiesAreMasked, EMapImageModType if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || EntitiesModType == MAP_IMAGE_MOD_TYPE_DDRACE) { - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_SPEED_BOOST_OLD || TileIndex != TILE_SPEED_BOOST) + if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_SPEED_BOOST_OLD || TileIndex != TILE_SPEED_BOOST || TileIndex != TILE_SPEED_LIMIT) { if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && !IsValidGameTile(TileIndex) && diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp index afdc366cb86..48c8b2433fc 100644 --- a/src/game/client/prediction/entities/character.cpp +++ b/src/game/client/prediction/entities/character.cpp @@ -716,6 +716,15 @@ void CCharacter::HandleSkippableTiles(int Index) } m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); } + else if(Type == TILE_SPEED_LIMIT) + { + float Speed = length(m_Core.m_Vel); + if(Speed > MaxSpeed) + { + TempVel *= (float)MaxSpeed / Speed; + } + m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); + } } } diff --git a/src/game/editor/explanations.cpp b/src/game/editor/explanations.cpp index 1684580ebe7..18eef3f349b 100644 --- a/src/game/editor/explanations.cpp +++ b/src/game/editor/explanations.cpp @@ -147,9 +147,11 @@ const char *CEditor::ExplainDDNet(int Tile, int Layer) if(Layer == LAYER_SPEEDUP) return "SPEEDUP: Gives tee defined speed. Arrow shows direction and angle."; break; - case TILE_TELECHECKOUT: + case TILE_TELECHECKOUT: // also TILE_SPEED_LIMIT if(Layer == LAYER_TELE) return "CHECKPOINT TELEPORT TO: Tees will appear here after touching TELEPORT CHECKPOINT with the same number and falling into CFROM TELEPORT."; + if(Layer == LAYER_SPEEDUP) + return "SPEED LIMIT: Limits the speed of a tee in all directions."; break; case TILE_TELECHECKIN: if(Layer == LAYER_TELE) diff --git a/src/game/mapitems.cpp b/src/game/mapitems.cpp index f9b0420b9a2..06c53a1da78 100644 --- a/src/game/mapitems.cpp +++ b/src/game/mapitems.cpp @@ -78,7 +78,7 @@ bool IsTeleTileNumberUsedAny(int Index) bool IsValidSpeedupTile(int Index) { - return Index == TILE_SPEED_BOOST_OLD || Index == TILE_SPEED_BOOST; + return Index == TILE_SPEED_BOOST_OLD || Index == TILE_SPEED_BOOST || Index == TILE_SPEED_LIMIT; } bool IsValidSwitchTile(int Index) diff --git a/src/game/mapitems.h b/src/game/mapitems.h index 215d5f6f3e3..e4b2d9d0323 100644 --- a/src/game/mapitems.h +++ b/src/game/mapitems.h @@ -130,6 +130,7 @@ enum TILE_TELEOUT, TILE_SPEED_BOOST_OLD = 28, TILE_SPEED_BOOST, + TILE_SPEED_LIMIT, TILE_TELECHECK = 29, TILE_TELECHECKOUT, TILE_TELECHECKIN, diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index b213f0fecc0..e2448fda8c9 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -1492,6 +1492,15 @@ void CCharacter::HandleSkippableTiles(int Index) } m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); } + else if(Type == TILE_SPEED_LIMIT) + { + float Speed = length(m_Core.m_Vel); + if(Speed > MaxSpeed) + { + TempVel *= (float)MaxSpeed / Speed; + } + m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); + } } }