├── .gitignore ├── LICENSE ├── README.md ├── SharpTimer-main.sln ├── SharpTimer.csproj ├── cfg └── SharpTimer │ ├── MapData │ ├── MapExecs │ │ ├── bhop_.cfg │ │ ├── kz_.cfg │ │ ├── kz_example.cfg │ │ ├── surf_.cfg │ │ └── vnl_.cfg │ ├── bhop_1derland.json │ ├── bhop_aso_wood.json │ ├── bhop_beginnerfriendly.json │ ├── bhop_blankbody.json │ ├── bhop_blue_abstract.json │ ├── bhop_blue_shade.json │ ├── bhop_bobop.json │ ├── bhop_cherryblossom.json │ ├── bhop_cobblestone.json │ ├── bhop_coma.json │ ├── bhop_dreamworld.json │ ├── bhop_eazy.json │ ├── bhop_emevaelx3.json │ ├── bhop_fur.json │ ├── bhop_hilton.json │ ├── bhop_icecapades.json │ ├── bhop_inch.json │ ├── bhop_internetclub.json │ ├── bhop_messup.json │ ├── bhop_minimal.json │ ├── bhop_nira.json │ ├── bhop_ragnarok.json │ ├── bhop_whiteshit.json │ ├── bhop_zentic.json │ ├── bhop_zunron.json │ ├── de_nuke.json │ ├── surf_boomer.json │ ├── surf_kitsune.json │ └── surf_nyx.json │ ├── PlayerRecords │ └── placeholder │ ├── PlayerStageData │ └── placeholder │ ├── admessages.txt │ ├── config.cfg │ ├── custom_exec.cfg │ ├── discordConfig.json │ ├── mysqlConfig.json │ ├── postgresConfig.json │ ├── ranks.json │ └── stgamedata.json ├── lang ├── en.json ├── fi.json ├── fr.json ├── lv.json ├── nb.json ├── pl.json ├── sk.json └── sv.json ├── remote_data ├── bhop_.json ├── kz_.json ├── rank_icons │ ├── bronze.png │ ├── dia1.png │ ├── dia2.png │ ├── dia3.png │ ├── god.gif │ ├── gold1.png │ ├── gold2.png │ ├── gold3.png │ ├── legend1.png │ ├── legend2.png │ ├── legend3.png │ ├── master1.png │ ├── master2.png │ ├── master3.png │ ├── plat1.png │ ├── plat2.png │ ├── plat3.png │ ├── royal1.png │ ├── royal2.png │ ├── royal3.png │ ├── silver1.png │ ├── silver2.png │ ├── silver3.png │ └── unranked.png ├── surf_.json └── tester_bling.json └── src ├── Commands ├── ChatCommands.cs └── ConfigConvars.cs ├── DB ├── DatabaseUtils.cs ├── DbCommandExtensions.cs ├── Migration.cs └── Migrations │ ├── MySQL │ ├── 001_AddStyleConstraints.sql │ └── 002_AddPlayerStageTimesTable.sql │ ├── PostgreSQL │ ├── 001_AddStyleConstraints.sql │ └── 002_AddPlayerStageTimesTable.sql │ └── SQLite │ ├── 001_AddStyleConstraints.sql │ └── 002_AddPlayerStageTimesTable.sql ├── Extensions ├── CBaseUserCmd.cs ├── CUserCmd.cs └── RunCommand.cs ├── Features ├── DiscordWebhook.cs ├── FakeZoneTool.cs ├── JumpStats.cs ├── ReplayUtils.cs └── Styles.cs ├── Hooks ├── Damage.cs └── TriggerHooks.cs ├── Player ├── PlayerChecks.cs ├── PlayerEvents.cs ├── PlayerOnTick.cs ├── PlayerTimers.cs └── PlayerUtils.cs ├── Plugin ├── Classes.cs ├── Globals.cs └── Utils.cs ├── SharpTimer.cs └── Triggers └── TriggerUtils.cs /.gitignore: -------------------------------------------------------------------------------- 1 | CounterStrikeSharp.API.dll 2 | **/obj 3 | **/bin 4 | .vscode/ 5 | .vs/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | ![GitHub Repo stars](https://img.shields.io/github/stars/Letaryat/poor-sharptimer?style=for-the-badge) 5 | ![GitHub all releases](https://img.shields.io/github/downloads/Letaryat/poor-sharptimer/total?style=for-the-badge) 6 |
7 | 8 | > [!NOTE] 9 | > The original creator of SharpTimer is [Dea](https://github.com/girlglock), who discontinued support for the project after version 0.2.6. This fork is now maintaned by the community, mainly [rcnoob](https://github.com/rcnoob). 10 | 11 | 12 | 13 | ## **Join Our Discord For Support** 14 | 15 | 16 | 17 |
18 | 19 |
20 |

21 |
22 | Badge 23 |

24 | 25 | 26 | # SharpTimer 27 | SharpTimer is a "simple" Surf/KZ/Bhop/MG/Deathrun/etc. CS2 Timer plugin using CounterStrikeSharp
28 | 29 | 30 | ## Features 31 |
32 | Timer, speedometer and key input with color customization 33 | 34 |
35 | 36 |
37 | Players PB 38 | 39 |
40 | 41 |
42 | Surf Stages and Checkpoints 43 | 44 |
45 | 46 |
47 | Replays 48 |
49 | 50 |
51 | Discord Webhook 52 |
53 | 54 |
55 | JumpStats 56 |
57 | 58 |
59 | Map CFGs 60 |
61 | 62 |
63 | Custom PlayerModels 64 |
65 | 66 |
67 | VIP Perks 68 |
69 | 70 |
71 | Bonus stages 72 | 73 |
74 | 75 |
76 | Server Point System & Map Ranks 77 |
78 | 79 |
80 | Rank Icons 81 | 82 |
83 | 84 |
85 | KZ Checkpoint system (disabled by default, check config) 86 |
87 |
88 |
89 | 90 |
91 | 92 |

( back to top )

93 | 94 | ## Dependencies 95 | 96 | [**MetaMod**](https://cs2.poggu.me/metamod/installation/) 97 | 98 | [**CounterStrikeSharp** *(v281 and up)*](https://github.com/roflmuffin/CounterStrikeSharp/releases) 99 | 100 | [**SharpTimerModelSetter** *(optional but recommended for custom player models)*](https://github.com/johandrevwyk/STCustomModels) 101 | 102 | [**MovementUnlocker** *(optional but recommended for surf and bhop servers)*](https://github.com/Source2ZE/MovementUnlocker) 103 | 104 | [**RampBugFix** *(optional but recommended for surf servers)*](https://github.com/Interesting-exe/CS2Fixes-RampbugFix/) 105 | 106 | [**Web panel** *(optional but recommended)*](https://github.com/Letaryat/sharptimer-web-panel) 107 | 108 | [**CS2-TeleportAnglesFix** *(optional but recommended)*](https://github.com/M-archand/CS2-TeleportAnglesFix) 109 | 110 | [**STFixes** *(optional but recommended)*](https://github.com/rcnoob/STFixes) 111 | 112 | [**Flashing HUD Fix** *(optional but recommended)*](https://github.com/M-archand/CS2FlashingHtmlHudFix) 113 | 114 | [**SharpTimer-WallLists** *(optional)*](https://github.com/SharpTimer/WallLists) 115 | 116 | [**SharpTimer-Trails** *(optional)*](https://github.com/SharpTimer/Trails) 117 | 118 | 119 | ## Install 120 | * Download the [latest release](https://github.com/Letaryat/poor-sharptimer/releases), 121 | 122 | * Unzip into your servers `game/csgo/` directory, 123 | 124 | * :exclamation: See `game/csgo/cfg/SharpTimer/config.cfg` for basic plugin configuration, 125 | 126 | * :exclamation: It is recommended to have a custom server cfg with your desired settings (for example [SURF](https://github.com/rcnoob/cs-cfg/blob/main/surf.cfg) or [BHOP](https://github.com/rcnoob/cs-cfg/blob/main/bhop.cfg)), 127 | 128 | # [SharpTimer Wiki/Docs](https://github.com/Letaryat/poor-sharptimer/wiki) 129 | 130 | # TODO List 131 | - [x] HUD 132 | - [x] Speedometer 133 | - [x] Pre 134 | - [x] Timer 135 | - [x] Info 136 | - [x] PB 137 | - [x] Map Rank Icon 138 | - [x] Map Rank (ie 1/100) 139 | - [x] Map Tier 140 | - [x] Map Type 141 | - [x] Spectator HUD 142 | - [x] Zones 143 | - [x] Hook common triggers by default 144 | - [x] Manual Zones 145 | - [x] Hook Bonus Zones Triggers (KZ & Surf) 146 | - [x] Player PBs 147 | - [x] Save to Json 148 | - [x] Save to MySQL 149 | - [x] Ranks 150 | - [x] Map !top 151 | - [x] Map !topbonus 152 | - [x] Global server ranks 153 | - [x] !points 154 | - [x] Global Point system 155 | - [ ] Surf Stages/Checkpoint support 156 | - [x] Stage/Checkpoint PBs with u/s 157 | - [x] Json Stage/Checkpoint PBs saving 158 | - [ ] MySql Stage/Checkpoint PBs saving 159 | - [x] MySQL 160 | - [x] Basic Player Records 161 | - [x] Player Server Stats 162 | - [x] Player Map Stats 163 | - [x] Replays 164 | - [x] Jumpstats 165 | - [x] Distance 166 | - [x] Pre 167 | - [x] Max 168 | - [x] Height 169 | - [x] Width 170 | - [ ] Sync 171 | - [ ] Jump Types 172 | - [x] Long Jump 173 | - [x] BunnyHop 174 | - [x] MultiBunnyHop 175 | - [x] Jump Bug 176 | - [ ] Edge Bug 177 | - [ ] Ladder Jump 178 | - [X] Silly Stuff 179 | - [x] Color customization 180 | - [x] Special Tester Gifs 181 | - [x] Custom Player Gifs 182 | - [x] Dioscord Webhook 183 | - [X] Strafe Sync Bar on HUD 184 | 185 | ## Authors: 186 | [Deana](https://twitter.com/girlglock) 187 | [Letaryat](https://github.com/Letaryat) 188 | [rcnoob](https://github.com/rcnoob) 189 | 190 |

( back to top )

191 | -------------------------------------------------------------------------------- /SharpTimer-main.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.002.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpTimer", "SharpTimer.csproj", "{8E786DDC-5BDE-462A-AC36-BB39D6D1560D}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {8E786DDC-5BDE-462A-AC36-BB39D6D1560D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {8E786DDC-5BDE-462A-AC36-BB39D6D1560D}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {8E786DDC-5BDE-462A-AC36-BB39D6D1560D}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {8E786DDC-5BDE-462A-AC36-BB39D6D1560D}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {13C5D9D5-5ED7-46DA-A5AB-EA42410FFC7C} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /SharpTimer.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0 4 | enable 5 | enable 6 | true 7 | 8 | 9 | 10 | none 11 | runtime 12 | compile; build; native; contentfiles; analyzers; buildtransitive 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/MapExecs/bhop_.cfg: -------------------------------------------------------------------------------- 1 | //Round Settings 2 | mp_roundtime 30.000000 3 | mp_roundtime_defuse 30.000000 4 | mp_roundtime_hostage 30.000000 5 | mp_timelimit 30.000000 6 | mp_maxrounds 0 7 | mp_freezetime 0 8 | mp_halftime false 9 | mp_overtime_enable false 10 | mp_round_restart_delay 0.000000 11 | mp_team_intro_time 0.000000 12 | mp_team_timeout_max 1 13 | mp_technical_timeout_per_team 0 14 | sv_warmup_to_freezetime_delay 0 15 | mp_buytime 0.000000 16 | mp_ignore_round_win_conditions false 17 | mp_respawn_immunitytime 0.000000 18 | mp_respawn_on_death_ct true 19 | mp_respawn_on_death_t true 20 | mp_warmuptime 0.000000 21 | 22 | //Movement 23 | sv_airaccelerate 1000.000000 24 | sv_enablebunnyhopping true 25 | sv_autobunnyhopping true 26 | sv_falldamage_scale 0.000000 27 | sv_staminajumpcost 0.000000 28 | sv_staminalandcost 0.000000 29 | sv_timebetweenducks 0.000000 30 | sv_staminarecoveryrate 60.000000 31 | sv_staminamax 0.000000 32 | sv_ladder_scale_speed 1.000000 33 | sv_jump_impulse 301.993378 34 | sv_friction 4.000000 35 | sv_accelerate_use_weapon_speed false 36 | sv_accelerate 5.000000 37 | sv_maxvelocity 99999.000000 38 | sv_air_max_wishspeed 30.000000 39 | sv_gravity 800.000000 40 | sv_standable_normal 0.700000 41 | sv_wateraccelerate 10.000000 42 | 43 | //Team & Map Settings 44 | ff_damage_reduction_bullets 0.000000 45 | ff_damage_reduction_grenade 0.000000 46 | ff_damage_reduction_grenade_self 0.000000 47 | ff_damage_reduction_other 0.000000 48 | mp_damage_headshot_only true 49 | mp_damage_scale_ct_head 1.000000 50 | mp_damage_scale_t_head 1.000000 51 | mp_damage_scale_ct_body 1.000000 52 | mp_damage_scale_t_body 1.000000 53 | mp_autokick false 54 | mp_autoteambalance true 55 | mp_forcecamera 0 56 | mp_force_pick_time 15.000000 57 | mp_friendlyfire false 58 | mp_limitteams 0 59 | mp_randomspawn 0 60 | mp_randomspawn_los false 61 | mp_solid_teammates 2 62 | mp_spectators_max 64 63 | mp_suicide_penalty true 64 | mp_team_timeout_max 1 65 | mp_teamname_1 66 | mp_teamname_2 67 | sv_falldamage_scale 0.000000 68 | sv_show_teammate_death_notification false 69 | sv_disable_radar 1 70 | 71 | //Money & Weapon Stuff 72 | mp_afterroundmoney 0 73 | mp_free_armor 2 74 | mp_maxmoney 0 75 | mp_startmoney 1000 76 | mp_teamcashawards false 77 | mp_playercashawards false 78 | mp_weapons_allow_map_placed true 79 | mp_weapons_allow_zeus 2 80 | mp_weapons_glow_on_ground false 81 | sv_infinite_ammo 0 82 | mp_ct_default_secondary weapon_hkp2000 83 | mp_t_default_secondary weapon_glock 84 | mp_drop_knife_enable false 85 | mp_weapons_allow_map_placed false 86 | mp_death_drop_gun 0 87 | 88 | //Voting Settings 89 | sv_workshop_allow_other_maps true 90 | mp_endmatch_votenextmap false 91 | mp_endmatch_votenextmap_keepcurrent true 92 | mp_match_end_changelevel false 93 | mp_match_end_restart false 94 | mp_match_restart_delay 10 95 | sv_allow_votes true 96 | 97 | //Voice Settings 98 | sv_auto_full_alltalk_during_warmup_half_end false 99 | sv_deadtalk true 100 | sv_full_alltalk true 101 | sv_ignoregrenaderadio false 102 | sv_talk_enemy_dead true 103 | sv_talk_enemy_living true 104 | 105 | //Misc 106 | CS_WarnFriendlyDamageInterval 3 107 | sv_gameinstructor_enable false 108 | mp_disconnect_kills_players true 109 | Bot Settings 110 | bot_controllable true 111 | bot_quota_mode fill 112 | bot_quota 0 113 | 114 | // SharpTimer Settings 115 | sharptimer_remove_legs true 116 | sharptimer_remove_collision true 117 | sharptimer_remove_damage true 118 | sharptimer_kill_pointservercommand_entities true 119 | 120 | sharptimer_use2Dspeed_enabled true 121 | sharptimer_disable_telehop true 122 | sharptimer_max_start_speed_enabled true 123 | sharptimer_max_start_speed 320 124 | sharptimer_force_knife_speed true 125 | sharptimer_forced_player_speed 260 126 | 127 | sharptimer_respawn_enabled true 128 | sharptimer_top_enabled true 129 | sharptimer_rank_enabled true 130 | 131 | sharptimer_checkpoints_enabled true 132 | sharptimer_remove_checkpoints_restrictions true 133 | sharptimer_checkpoints_only_when_timer_stopped true 134 | 135 | sharptimer_jumpstats_enabled false -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/MapExecs/kz_.cfg: -------------------------------------------------------------------------------- 1 | // Round Settings 2 | mp_roundtime 30 3 | mp_roundtime_defuse 30 4 | mp_roundtime_hostage 30 5 | mp_timelimit 30 6 | mp_maxrounds 0 7 | mp_freezetime 0 8 | mp_halftime false 9 | mp_overtime_enable false 10 | mp_round_restart_delay 0 11 | mp_team_intro_time 0 12 | mp_team_timeout_max 0 13 | mp_technical_timeout_per_team 0 14 | sv_warmup_to_freezetime_delay 0 15 | mp_buytime 0 16 | mp_ignore_round_win_conditions true 17 | mp_respawn_immunitytime -1 18 | mp_respawn_on_death_ct true 19 | mp_respawn_on_death_t true 20 | mp_warmuptime 0 21 | mp_warmup_end 22 | 23 | sv_airaccelerate 100.000000 24 | sv_enablebunnyhopping false 25 | sv_autobunnyhopping false 26 | sv_falldamage_scale 0.000000 27 | sv_staminajumpcost 0.000000 28 | sv_staminalandcost 0.000000 29 | sv_timebetweenducks 0.000000 30 | sv_staminarecoveryrate 60.000000 31 | sv_staminamax 0.000000 32 | sv_ladder_scale_speed 1.000000 33 | sv_jump_impulse 301.993378 34 | sv_friction 5.000000 35 | sv_accelerate_use_weapon_speed false 36 | sv_accelerate 6.500000 37 | sv_maxvelocity 2000.000000 38 | sv_air_max_wishspeed 30.000000 39 | sv_gravity 800.000000 40 | sv_standable_normal 0.700000 41 | sv_wateraccelerate 10.000000 42 | 43 | ff_damage_reduction_bullets 0.000000 44 | ff_damage_reduction_grenade 0.000000 45 | ff_damage_reduction_grenade_self 0.000000 46 | ff_damage_reduction_other 0.000000 47 | mp_damage_headshot_only true 48 | mp_damage_scale_ct_head 1.000000 49 | mp_damage_scale_t_head 1.000000 50 | mp_damage_scale_ct_body 1.000000 51 | mp_damage_scale_t_body 1.000000 52 | mp_autokick false 53 | mp_autoteambalance true 54 | mp_forcecamera 0 55 | mp_force_pick_time 15.000000 56 | mp_friendlyfire false 57 | mp_limitteams 0 58 | mp_randomspawn 0 59 | mp_randomspawn_los false 60 | mp_solid_teammates 2 61 | mp_spectators_max 64 62 | mp_suicide_penalty true 63 | mp_team_timeout_max 1 64 | mp_teamname_1 "SHARPTIMER" 65 | mp_teamname_2 "X.COM/DEAFPS_" 66 | sv_falldamage_scale 0.000000 67 | sv_show_teammate_death_notification false 68 | sv_disable_radar 1 69 | 70 | mp_afterroundmoney 0 71 | mp_free_armor 1 72 | mp_maxmoney 0 73 | mp_startmoney 1000 74 | mp_teamcashawards false 75 | mp_playercashawards false 76 | mp_weapons_allow_map_placed true 77 | mp_weapons_allow_zeus 2 78 | mp_weapons_glow_on_ground false 79 | sv_infinite_ammo 0 80 | mp_ct_default_secondary weapon_hkp2000 81 | mp_t_default_secondary weapon_glock 82 | mp_drop_knife_enable true 83 | mp_weapons_allow_map_placed false 84 | mp_death_drop_gun 0 85 | 86 | sv_workshop_allow_other_maps true 87 | mp_endmatch_votenextmap false 88 | mp_endmatch_votenextmap_keepcurrent true 89 | mp_match_end_changelevel false 90 | mp_match_end_restart false 91 | mp_match_restart_delay 10 92 | sv_allow_votes true 93 | 94 | sv_auto_full_alltalk_during_warmup_half_end false 95 | sv_deadtalk true 96 | sv_full_alltalk false 97 | sv_ignoregrenaderadio false 98 | sv_talk_enemy_dead true 99 | sv_talk_enemy_living true 100 | 101 | CS_WarnFriendlyDamageInterval 99999 102 | sv_gameinstructor_enable false 103 | mp_disconnect_kills_players true 104 | 105 | bot_controllable false 106 | bot_quota_mode fill 107 | bot_quota 1 108 | 109 | // SharpTimer Settings 110 | sharptimer_remove_legs true 111 | sharptimer_remove_collision true 112 | sharptimer_remove_damage true 113 | sharptimer_kill_pointservercommand_entities true 114 | 115 | sharptimer_use2Dspeed_enabled false 116 | sharptimer_disable_telehop true 117 | sharptimer_max_start_speed_enabled true 118 | sharptimer_max_start_speed 320 119 | sharptimer_force_knife_speed true 120 | sharptimer_forced_player_speed 260 121 | 122 | sharptimer_respawn_enabled true 123 | sharptimer_top_enabled true 124 | sharptimer_rank_enabled true 125 | 126 | sharptimer_checkpoints_enabled true 127 | sharptimer_remove_checkpoints_restrictions false 128 | sharptimer_checkpoints_only_when_timer_stopped false 129 | 130 | sharptimer_jumpstats_enabled true 131 | sharptimer_jumpstats_min_distance 175.0 132 | sharptimer_jumpstats_max_vert 32.0 133 | sharptimer_jumpstats_movement_unlocker_cap true 134 | sharptimer_jumpstats_movement_unlocker_cap_value 250.0 -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/MapExecs/kz_example.cfg: -------------------------------------------------------------------------------- 1 | //These Commands will exec whenever the server Loads the map "kz_example" 2 | 3 | mp_timelimit 60 4 | sv_airaccelerate 100 -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/MapExecs/surf_.cfg: -------------------------------------------------------------------------------- 1 | // Round Settings 2 | mp_roundtime 30 3 | mp_roundtime_defuse 30 4 | mp_roundtime_hostage 30 5 | mp_timelimit 30 6 | mp_maxrounds 0 7 | mp_freezetime 0 8 | mp_halftime false 9 | mp_overtime_enable false 10 | mp_round_restart_delay 0 11 | mp_team_intro_time 0 12 | mp_team_timeout_max 0 13 | mp_technical_timeout_per_team 0 14 | sv_warmup_to_freezetime_delay 0 15 | mp_buytime 0 16 | mp_ignore_round_win_conditions true 17 | mp_respawn_immunitytime -1 18 | mp_respawn_on_death_ct true 19 | mp_respawn_on_death_t true 20 | mp_warmuptime 0 21 | mp_warmup_end 22 | 23 | // Movement 24 | sv_airaccelerate 150 25 | sv_enablebunnyhopping 1 26 | sv_autobunnyhopping 1 27 | sv_falldamage_scale 0 28 | sv_staminajumpcost 0 29 | sv_staminalandcost 0 30 | sv_timebetweenducks 0.400000 31 | sv_staminarecoveryrate 60.0 32 | sv_staminamax 80.0 33 | sv_ladder_scale_speed 0.780000 34 | sv_jump_impulse 301.993378 35 | sv_friction 5.2 36 | sv_accelerate_use_weapon_speed false 37 | sv_clamp_unsafe_velocities 0 38 | sv_accelerate 6.5 39 | sv_maxvelocity 9876.0 40 | sv_air_max_wishspeed 30.000000 41 | sv_gravity 800.0 42 | sv_ledge_mantle_helper 0.0 43 | sv_standable_normal 0.7 44 | sv_wateraccelerate 10.0 45 | sv_water_movespeed_multiplier 0.8 46 | sv_water_swim_mode 0.0 47 | sv_weapon_encumbrance_per_item 0 48 | sv_weapon_encumbrance_scale 0.0 49 | 50 | 51 | // Team & Map Settings 52 | ff_damage_reduction_bullets 0 53 | ff_damage_reduction_grenade 0 54 | ff_damage_reduction_grenade_self 0 55 | ff_damage_reduction_other 0 56 | mp_damage_headshot_only 1 57 | mp_damage_scale_ct_head 0.0 58 | mp_damage_scale_t_head 0.0 59 | mp_damage_scale_ct_body 0.0 60 | mp_damage_scale_t_body 0.0 61 | mp_autokick 0 62 | mp_autoteambalance 0 63 | mp_forcecamera 0 64 | mp_force_pick_time 60 65 | mp_friendlyfire 0 66 | mp_limitteams 0 67 | mp_randomspawn 0 68 | mp_randomspawn_los 0 69 | mp_solid_teammates 1 70 | mp_spectators_max 64 71 | mp_suicide_penalty false 72 | mp_team_timeout_max 0 73 | mp_teamname_1 "SHARPTIMER" 74 | mp_teamname_2 "X.COM/DEAFPS_" 75 | sv_falldamage_scale 0 76 | sv_show_teammate_death_notification 0 77 | sv_disable_radar 1 78 | 79 | // Money & Weapon Stuff 80 | mp_afterroundmoney 0 81 | mp_free_armor 0 82 | mp_maxmoney 0 83 | mp_startmoney 0 84 | mp_teamcashawards false 85 | mp_playercashawards false 86 | mp_weapons_allow_map_placed false 87 | mp_weapons_allow_zeus 0 88 | mp_weapons_glow_on_ground 0 89 | sv_infinite_ammo 2 90 | mp_ct_default_secondary weapon_usp_silencer 91 | mp_t_default_secondary weapon_usp_silencer 92 | mp_drop_knife_enable 1 93 | mp_weapons_allow_map_placed 0 94 | mp_death_drop_gun 0 95 | 96 | 97 | // Voting Settings 98 | sv_workshop_allow_other_maps true 99 | mp_endmatch_votenextmap true 100 | mp_endmatch_votenextmap_keepcurrent false 101 | mp_match_end_changelevel true 102 | mp_match_end_restart false 103 | mp_match_restart_delay 0 104 | sv_allow_votes true 105 | //sv_vote_kick_ban_duration 1 106 | //sv_vote_failure_timer 500 107 | //sv_vote_creation_timer 500 108 | //sv_vote_quorum_ratio 0.801 109 | //sv_vote_count_spectator_votes false 110 | 111 | 112 | // Voice Settings 113 | sv_auto_full_alltalk_during_warmup_half_end true 114 | sv_deadtalk true 115 | sv_full_alltalk true 116 | sv_ignoregrenaderadio true 117 | sv_talk_enemy_dead true 118 | sv_talk_enemy_living true 119 | 120 | // Misc 121 | CS_WarnFriendlyDamageInterval 99999 122 | sv_gameinstructor_enable 0 123 | mp_disconnect_kills_players true 124 | 125 | // Bot Settings 126 | bot_controllable 0 127 | bot_quota_mode fill 128 | bot_quota 1 129 | 130 | // SharpTimer Settings 131 | sharptimer_remove_legs true 132 | sharptimer_remove_collision true 133 | sharptimer_remove_damage true 134 | sharptimer_kill_pointservercommand_entities true 135 | 136 | sharptimer_use2Dspeed_enabled true 137 | sharptimer_disable_telehop true 138 | sharptimer_max_start_speed_enabled true 139 | sharptimer_max_start_speed 320 140 | sharptimer_force_knife_speed true 141 | sharptimer_forced_player_speed 260 142 | 143 | sharptimer_respawn_enabled true 144 | sharptimer_top_enabled true 145 | sharptimer_rank_enabled true 146 | 147 | sharptimer_checkpoints_enabled true 148 | sharptimer_remove_checkpoints_restrictions true 149 | sharptimer_checkpoints_only_when_timer_stopped true 150 | 151 | sharptimer_jumpstats_enabled false -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/MapExecs/vnl_.cfg: -------------------------------------------------------------------------------- 1 | // Round Settings 2 | mp_roundtime 30 3 | mp_roundtime_defuse 30 4 | mp_roundtime_hostage 30 5 | mp_timelimit 30 6 | mp_maxrounds 0 7 | mp_freezetime 0 8 | mp_halftime false 9 | mp_overtime_enable false 10 | mp_round_restart_delay 0 11 | mp_team_intro_time 0 12 | mp_team_timeout_max 0 13 | mp_technical_timeout_per_team 0 14 | sv_warmup_to_freezetime_delay 0 15 | mp_buytime 0 16 | mp_ignore_round_win_conditions true 17 | mp_respawn_immunitytime -1 18 | mp_respawn_on_death_ct true 19 | mp_respawn_on_death_t true 20 | mp_warmuptime 0 21 | mp_warmup_end 22 | 23 | 24 | // Movement 25 | sv_airaccelerate 12.000000 26 | sv_enablebunnyhopping false 27 | sv_autobunnyhopping false 28 | sv_falldamage_scale 0.000000 29 | sv_staminajumpcost 0.080000 30 | sv_staminalandcost 0.050000 31 | sv_timebetweenducks 0.400000 32 | sv_staminarecoveryrate 60.000000 33 | sv_staminamax 80.000000 34 | sv_ladder_scale_speed 0.780000 35 | sv_jump_impulse 301.993378 36 | sv_friction 5.200000 37 | sv_accelerate_use_weapon_speed true 38 | sv_accelerate 5.500000 39 | sv_maxvelocity 3500.000000 40 | sv_air_max_wishspeed 30.000000 41 | sv_gravity 800.000000 42 | sv_standable_normal 0.700000 43 | sv_wateraccelerate 10.000000 44 | 45 | 46 | // Team & Map Settings 47 | ff_damage_reduction_bullets 0 48 | ff_damage_reduction_grenade 0 49 | ff_damage_reduction_grenade_self 0 50 | ff_damage_reduction_other 0 51 | mp_damage_headshot_only 1 52 | mp_damage_scale_ct_head 0.0 53 | mp_damage_scale_t_head 0.0 54 | mp_damage_scale_ct_body 0.0 55 | mp_damage_scale_t_body 0.0 56 | mp_autokick 0 57 | mp_autoteambalance 0 58 | mp_forcecamera 0 59 | mp_force_pick_time 60 60 | mp_friendlyfire 0 61 | mp_limitteams 0 62 | mp_randomspawn 0 63 | mp_randomspawn_los 0 64 | mp_solid_teammates 1 65 | mp_spectators_max 64 66 | mp_suicide_penalty false 67 | mp_team_timeout_max 0 68 | mp_teamname_1 "SHARPTIMER" 69 | mp_teamname_2 "X.COM/DEAFPS_" 70 | sv_falldamage_scale 0 71 | sv_show_teammate_death_notification 0 72 | sv_disable_radar 1 73 | 74 | 75 | // Money & Weapon Stuff 76 | mp_afterroundmoney 0 77 | mp_free_armor 0 78 | mp_maxmoney 0 79 | mp_startmoney 0 80 | mp_teamcashawards false 81 | mp_playercashawards false 82 | mp_weapons_allow_map_placed false 83 | mp_weapons_allow_zeus 0 84 | mp_weapons_glow_on_ground 0 85 | sv_infinite_ammo 2 86 | mp_ct_default_secondary weapon_usp_silencer 87 | mp_t_default_secondary weapon_usp_silencer 88 | mp_drop_knife_enable 1 89 | mp_weapons_allow_map_placed 0 90 | mp_death_drop_gun 0 91 | 92 | 93 | // Voting Settings 94 | sv_workshop_allow_other_maps true 95 | mp_endmatch_votenextmap true 96 | mp_endmatch_votenextmap_keepcurrent false 97 | mp_match_end_changelevel true 98 | mp_match_end_restart false 99 | mp_match_restart_delay 0 100 | sv_allow_votes true 101 | //sv_vote_kick_ban_duration 1 102 | //sv_vote_failure_timer 500 103 | //sv_vote_creation_timer 500 104 | //sv_vote_quorum_ratio 0.801 105 | //sv_vote_count_spectator_votes false 106 | 107 | 108 | // Voice Settings 109 | sv_auto_full_alltalk_during_warmup_half_end true 110 | sv_deadtalk true 111 | sv_full_alltalk true 112 | sv_ignoregrenaderadio true 113 | sv_talk_enemy_dead true 114 | sv_talk_enemy_living true 115 | 116 | 117 | // Misc 118 | CS_WarnFriendlyDamageInterval 99999 119 | sv_gameinstructor_enable 0 120 | mp_disconnect_kills_players true 121 | 122 | 123 | // Bot Settings 124 | bot_controllable 0 125 | bot_quota_mode fill 126 | bot_quota 1 127 | 128 | 129 | // SharpTimer Settings 130 | sharptimer_remove_legs true 131 | sharptimer_remove_collision true 132 | sharptimer_remove_damage true 133 | sharptimer_kill_pointservercommand_entities true 134 | 135 | sharptimer_use2Dspeed_enabled false 136 | sharptimer_disable_telehop true 137 | sharptimer_max_start_speed_enabled true 138 | sharptimer_max_start_speed 320 139 | sharptimer_force_knife_speed true 140 | sharptimer_forced_player_speed 260 141 | 142 | sharptimer_respawn_enabled true 143 | sharptimer_top_enabled true 144 | sharptimer_rank_enabled true 145 | 146 | sharptimer_checkpoints_enabled true 147 | sharptimer_remove_checkpoints_restrictions false 148 | sharptimer_checkpoints_only_when_timer_stopped false 149 | 150 | sharptimer_jumpstats_enabled true 151 | sharptimer_jumpstats_min_distance 175.0 152 | sharptimer_jumpstats_max_vert 32.0 153 | sharptimer_jumpstats_movement_unlocker_cap true 154 | sharptimer_jumpstats_movement_unlocker_cap_value 250.0 -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_1derland.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-45.07862 -1997.0604 34.03125", 3 | "MapStartC2": "97.30689 -1858.4458 34.03125", 4 | "MapEndC1": "1122.5502 6212.265 34.03125", 5 | "MapEndC2": "992.03186 6070.829 34.03125", 6 | "RespawnPos": "19.835241 -2206.0208 32.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_aso_wood.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-1007.96875 431.96875 192.03125", 3 | "MapStartC2": "-665.36176 -239.96558 192.03125", 4 | "MapEndC1": "1443.8112 -2960.0312 192.03125", 5 | "MapEndC2": "1711.9684 -3631.9688 192.03125", 6 | "RespawnPos": "-848.7768 125.950226 192.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_beginnerfriendly.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-2031.9685 -943.96875 256.03125", 3 | "MapStartC2": "-1040.0378 -163.38287 256.03125", 4 | "MapEndC1": "-1040.038 9254.311 256.03125", 5 | "MapEndC2": "-2031.9688 10223.969 256.03125", 6 | "RespawnPos": "-1543.7466 -504.15234 256.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_blankbody.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "185.73335 627.6922 129.03125", 3 | "MapStartC2": "-184.84938 398.07608 129.03125", 4 | "MapEndC1": "216.31934 4306.5005 3082.0312", 5 | "MapEndC2": "-82.55916 4610.5854 3082.0312", 6 | "RespawnPos": "-44.503296 533.3305 128.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_blue_abstract.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "112.53081 243.0919 2.03125", 3 | "MapStartC2": "-114.18094 -113.42073 2.03125", 4 | "MapEndC1": "6686.439 -1776.9967 -4141.9688", 5 | "MapEndC2": "7042.2637 -1291.6685 -4141.9688", 6 | "RespawnPos": "-13.580017 85.43804 0.03125143" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_blue_shade.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-623.97156 921.1535 144.03125", 3 | "MapStartC2": "1007.96875 1487.9685 144.03125", 4 | "MapEndC1": "31.96739 2402.8682 160.03125", 5 | "MapEndC2": "-1007.9723 1840.0312 160.03125", 6 | "RespawnPos": "206.59383 1261.1068 144.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_bobop.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-649.98553 311.70175 128.03125", 3 | "MapStartC2": "-1019.8031 -303.9679 128.03125", 4 | "MapEndC1": "-666.36566 -8486.719 128.03125", 5 | "MapEndC2": "-1025.2401 -7893.695 128.03125", 6 | "RespawnPos": "-821.53894 8.0569 128.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_cherryblossom.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "1613.6593 311.9121 48.03125", 3 | "MapStartC2": "2040.6968 -124.99468 48.03125", 4 | "MapEndC1": "3940.031 -8171.247 48.03125", 5 | "MapEndC2": "4378.91 -8616.119 48.031242", 6 | "RespawnPos": "1844.5771 106.57258 48.031246" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_cobblestone.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "271.96875 655.9687 128.03125", 3 | "MapStartC2": "-173.51848 208.02823 128.03125", 4 | "MapEndC1": "162.02982 2879.3088 128.03125", 5 | "MapEndC2": "282.01398 2712.938 128.03125", 6 | "RespawnPos": "10.329683 425.54605 128.03125" 7 | } 8 | -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_coma.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-1002.2281 -1008.0316 128.03125", 3 | "MapStartC2": "-1572.2383 -1999.9712 128.03125", 4 | "MapEndC1": "-1129.1311 110.96737 128.03125", 5 | "MapEndC2": "-1478.4275 -743.1673 128.03125", 6 | "RespawnPos": "-1175.0974 -1561.2045 129.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_dreamworld.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-495.96844 -203.93567 136.03125", 3 | "MapStartC2": "431.9675 303.96875 136.03125", 4 | "MapEndC1": "5968.0312 538.3965 376.03125", 5 | "MapEndC2": "6895.9688 871.96875 376.03125", 6 | "RespawnPos": "-40.151123 216.93188 136.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_eazy.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-463.96667 -240.03125 64.03125", 3 | "MapStartC2": "-245.11385 -463.96442 64.03125", 4 | "MapEndC1": "1264.1884 -975.9639 64.03125", 5 | "MapEndC2": "1382.9547 -752.0373 64.03125", 6 | "RespawnPos": "-402.53552 -359.93295 64.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_emevaelx3.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-14755.482 -13946.281 64.03125", 3 | "MapStartC2": "-14999.712 -13704.743 64.03125", 4 | "MapEndC1": "-5715.069 -1391.9689 -1375.9688", 5 | "MapEndC2": "-6248.439 -1008.04407 -1375.9688", 6 | "RespawnPos": "-14865.554 -13795.172 64.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_fur.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-14622.7 15344.006 512.03125", 3 | "MapStartC2": "-15343.969 13840.068 512.03125", 4 | "MapEndC1": "-3439.9688 -528.03235 1152.0312", 5 | "MapEndC2": "-2995.76 -2031.964 1152.0312", 6 | "RespawnPos": "-14787.393 14588.588 512.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_hilton.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-623.9616 702.99976 64.704384", 3 | "MapStartC2": "111.96643 1007.96875 64.03125", 4 | "MapEndC1": "-525.2971 1364.2338 96.03125", 5 | "MapEndC2": "-599.29755 1083.089 96.03125", 6 | "RespawnPos": "-220.82008 821.854 64.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_icecapades.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "980.44104 1048.9982 -511.96875", 3 | "MapStartC2": "556.29156 487.67593 -511.96875", 4 | "MapEndC1": "-6123.156 8729.923 -5631.9688", 5 | "MapEndC2": "-6680.701 8165.15 -5631.9688", 6 | "RespawnPos": "800.80524 770.49133 -511.96875" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_inch.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "3135.5198 36.2732 1440.0312", 3 | "MapStartC2": "3951.9688 -303.96542 1440.0312", 4 | "MapEndC1": "1629.8297 100.26889 40.03125", 5 | "MapEndC2": "2148.641 -231.24821 40.03125", 6 | "RespawnPos": "3541.8757 -77.48657 1440.0312" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_internetclub.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "1535.9368 2990.9155 -611.9614", 3 | "MapStartC2": "1903.1627 3360.4622 -611.9614", 4 | "MapEndC1": "-13513.44 -4668.292 -895.96875", 5 | "MapEndC2": "-13944.714 -5039.651 -895.96875", 6 | "RespawnPos": "1751.9016 3165.3618 -611.9614" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_messup.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-488.73862 -27.332838 192.03125", 3 | "MapStartC2": "164.7258 -230.2553 192.03125", 4 | "MapEndC1": "3619.876 -1392.7449 880.03125", 5 | "MapEndC2": "3008.0308 -808.0319 880.03125", 6 | "RespawnPos": "-137.79271 -142.04677 192.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_minimal.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "241.62413 -13.693617 68.03125", 3 | "MapStartC2": "-237.01852 -239.82024 68.03125", 4 | "MapEndC1": "-4950.7783 3048.1602 324.03125", 5 | "MapEndC2": "-4463.452 3524.032 324.03125", 6 | "RespawnPos": "0 -129.81299 68.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_nira.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-12248.522 -13016.872 128.03125", 3 | "MapStartC2": "-11816.905 -13271.398 128.03125", 4 | "MapEndC1": "-12788.409 2323.1619 -3039.9688", 5 | "MapEndC2": "-11992.586 2582.933 -3036.9607", 6 | "RespawnPos": "-12025.571 -13162.316 128.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_ragnarok.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "16.031263 528.03125 0.03125", 3 | "MapStartC2": "490.25626 1007.9656 0.03125", 4 | "MapEndC1": "-5159.108 2159.9668 -5311.9688", 5 | "MapEndC2": "-5362.3467 1936.034 -5311.9688", 6 | "RespawnPos": "355.95044 787.8352 0.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_whiteshit.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "201.20802 -120.21686 32.03125", 3 | "MapStartC2": "438.73715 247.3408 32.03125", 4 | "MapEndC1": "8847.853 -2254.988 -623.96875", 5 | "MapEndC2": "9261.04 -2670.4534 -623.96875", 6 | "RespawnPos": "276.71 64.34 32.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_zentic.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-67.89055 188.01341 64.03125", 3 | "MapStartC2": "123.32273 -187.58983 64.03125", 4 | "MapEndC1": "13736.031 1540.6246 -639.96875", 5 | "MapEndC2": "13884.47 1915.2767 -639.96875", 6 | "RespawnPos": "-2 0 64.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/bhop_zunron.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "-16.03247 -495.96875 128.03125", 3 | "MapStartC2": "-495.96875 -257.35162 128.03125", 4 | "MapEndC1": "-445.04297 -959.74506 448.03125", 5 | "MapEndC2": "-80.034 -558.9003 448.03125", 6 | "RespawnPos": "-295.09 -461.88 128.03125" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/de_nuke.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartC1": "2791.9688 -280.03308 -351.96875", 3 | "MapStartC2": "2584.8857 -521.578 -344.86807", 4 | "MapEndC1": "120.89461 -1746.9191 -18.96875", 5 | "MapEndC2": "36.237625 -1577.1866 -18.96875", 6 | "RespawnPos": "2961.111 -506.0918 -351.96875" 7 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/surf_boomer.json: -------------------------------------------------------------------------------- 1 | { 2 | "MapStartTrigger": "zippan_start", 3 | "MapEndTrigger": "zippan_end" 4 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/surf_kitsune.json: -------------------------------------------------------------------------------- 1 | { 2 | "OverrideDisableTelehop": "s1_end, s2_end, s3_end, s4_end, s5_end, s6_end, s7_end, s8_end" 3 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/MapData/surf_nyx.json: -------------------------------------------------------------------------------- 1 | { 2 | "OverrideMaxSpeedLimit": "b1_start" 3 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/PlayerRecords/placeholder: -------------------------------------------------------------------------------- 1 | buh -------------------------------------------------------------------------------- /cfg/SharpTimer/PlayerStageData/placeholder: -------------------------------------------------------------------------------- 1 | buh -------------------------------------------------------------------------------- /cfg/SharpTimer/admessages.txt: -------------------------------------------------------------------------------- 1 | // {prefix} {current_map} {max_players} {players} {current_time} {current_date} 2 | // {primary} {default} {red} {white} {darkred} {green}{lightyellow} {lightblue} {olive} {lime} {lightpurple} {purple} {grey} {yellow} {gold} {silver} {blue} {darkblue} {bluegrey} {magenta} {lightred} {orange} -------------------------------------------------------------------------------- /cfg/SharpTimer/config.cfg: -------------------------------------------------------------------------------- 1 | //PLUGIN 2 | sharptimer_hostname A SharpTimer Server // Default Server Hostname. Default value: A SharpTimer Server 3 | sharptimer_autoset_mapinfo_hostname_enabled false // Whether Map Name and Map Tier (if available) should be put into the hostname or not. Default value: false 4 | sharptimer_mysql_enabled false // Whether player times should be put into a MySQL database by default or not. Default value: false 5 | sharptimer_postgres_enabled false // Whether player times should be put into a Postgres database by default or not. Default value: false 6 | sharptimer_force_disable_json false // Whether player times should NOT be saved to JSON. Set to true when using any database. Default value: false 7 | sharptimer_debug_enabled false // Whether debug console messages should be printed or not. Default value: false 8 | 9 | 10 | //DISCORD 11 | sharptimer_discordwebhook_enabled false // Whether player PBs or SRs should be printed into a discord channel or not. Default value: false 12 | sharptimer_discordwebhook_print_sr true // Default value: true 13 | sharptimer_discordwebhook_print_pb true // Default value: true 14 | 15 | 16 | //MISC 17 | sharptimer_connectmsg_enabled true // Whether connect/disconnect messages are enabled by default or not. Default value: true 18 | sharptimer_connect_commands_msg_enabled true // Whether commands on join messages are enabled by default or not. Default value: true 19 | sharptimer_kill_pointservercommand_entities true // If "true" the plugin will kill all point_servercommand ents on map start (necessary to make xplay maps playable. 🖕 @xplay). Default value: true 20 | sharptimer_custom_map_cfgs_enabled true // Whether Custom Map .cfg files should be executed for the corresponding maps (found in cfg/SharpTimer/MapData/MapExecs/kz_example.cfg). Default value: true 21 | sharptimer_command_spam_cooldown 0.5 // Defines the time in seconds between commands can be called. Default value: 0.5 22 | sharptimer_remove_legs true // Whether Legs should be removed or not. Default value: true 23 | sharptimer_remove_collision true // Whether player collision should be removed or not. Default value: true 24 | sharptimer_remove_damage true // Whether dealing damage should be disabled or not (will crash with cs2fixes since they hook/detour damage regardless of you using their feature). Default value: true 25 | sharptimer_remove_crouch_fatigue true // Whether the player should get no crouch fatigue or not. Default value: true 26 | sharptimer_bhop_block_ticks 16 // Ticks allowed on bhop_block. Default value: 16 27 | sharptimer_spawn_on_respawnpos false // Teleports player to respawnpos on spawn. Default value: false 28 | sharptimer_stage_times_enabled true // Whether stage time records are enabled by default or not. Default value: true 29 | sharptimer_enable_checkpoint_verification true // Enable or disable checkpoint verification system. Default value: true (set to false if experiencing "current checkpoint does not match final" issue) 30 | 31 | 32 | //ZONES 33 | sharptimer_zones_box false // Make Zone a 3D Box. Default value: false 34 | sharptimer_override_beam_colors_enabled false // Whether Trigger Beams should use the colors below or not. If false plugin uses sharptimer_hud_primary_color 35 | sharptimer_start_beam_color #00FF00 // Start Zone color. Default Value: #00FF00 (green hex code) 36 | sharptimer_end_beam_color #FF0000 // End Zone color. Default Value: #FF0000 (red hex code) 37 | sharptimer_allow_startzone_jump true // Allow jumping in startzone. Default value: true 38 | sharptimer_fake_zones_height 50 // Fake Zones height in units. Default value: 50 39 | 40 | 41 | //STYLES 42 | sharptimer_styles_enabled true // Whether the plugin should use styles or not !!BROKEN ON WINDOWS!!. Default value: true 43 | sharptimer_style_points_enabled true // Whether the plugin should reward players with style points. Default value: true 44 | sharptimer_style_multiplier_lowgrav 1.1 // Multiplier for Low Gravity. Default value: 1.1 45 | sharptimer_style_multiplier_highgrav 1.3 // Multiplier for High Gravity. Default value: 1.3 46 | sharptimer_style_multiplier_400vel 1.5 // Multiplier for 400vel. Default value: 1.5 47 | sharptimer_style_multiplier_sideways 1.3 // Multiplier for Sideways. Default value: 1.3 48 | sharptimer_style_multiplier_onlyw 1.33 // Multiplier for OnlyW. Default value: 1.33 49 | sharptimer_style_multiplier_onlya 1.33 // Multiplier for OnlyA. Default value: 1.33 50 | sharptimer_style_multiplier_onlys 1.33 // Multiplier for OnlyS. Default value: 1.33 51 | sharptimer_style_multiplier_onlyd 1.33 // Multiplier for OnlyD. Default value: 1.33 52 | sharptimer_style_multiplier_halfsideways 1.3 // Multiplier for HalfSideways. Default value: 1.3 53 | sharptimer_style_multiplier_fastforward 1.3 // Multiplier for FastForward. Default value: 1.3 54 | 55 | 56 | //TIMED MESSAGES 57 | sharptimer_ad_sr_enabled true // Whether to print sr message or not. Default value: true 58 | sharptimer_ad_sr_timer 240 // Interval how often the messages shall be printed to chat. Default value: 240 59 | sharptimer_ad_messages_enabled true // Whether to print messages or not. Default value: true 60 | sharptimer_ad_messages_timer 120 // Interval how often the messages shall be printed to chat. Default value: 120 61 | 62 | 63 | //SPEED 64 | sharptimer_use2Dspeed_enabled true // Whether the plugin should use 2D speed instead of 3D speed 65 | sharptimer_disable_telehop false // Whether the players should lose all speed when entering a teleport map trigger or not. Default value: false 66 | sharptimer_max_start_speed_enabled true // Whether the players speed should be limited on exiting the starting trigger or not. Default value: true 67 | sharptimer_max_start_speed 320 // Defines max speed the player is allowed to have while exiting the start trigger. Default value: 320 68 | sharptimer_max_bonus_start_speed 320 // Defines max speed the player is allowed to have while exiting the bonus start trigger. Default value: 320 69 | sharptimer_force_knife_speed false // Whether the players speed should be always knife speed regardless of weapon held. Default value: false 70 | sharptimer_forced_player_speed 250 // Speed override for sharptimer_force_knife_speed. Default value: 250 71 | 72 | 73 | //HUD 74 | sharptimer_hud_primary_color #00FF00 // Primary Color for Timer HUD (you can use hex codes too). Default value: #00FF00 (green) 75 | sharptimer_hud_secondary_color #FFA500 // Secondary Color for Timer HUD (you can use hex codes too). Default value: #FFA500 (orange) 76 | sharptimer_hud_secondary_color_dynamic false // False = Use the sharptimer_hud_secondary_color color. True = Use dynamic color based on player velocity (surf only). Default value: false 77 | sharptimer_hud_tertiary_color #FFFFFF // Tertiary Color for Timer HUD (you can use hex codes too). Default value: #FFFFFF (white) 78 | sharptimer_enable_timer_hud true // If Timer Hud should be globally enabled or not. Default value: true 79 | sharptimer_enable_keys_hud true // If Keys Hud should be globally enabled or not. Default value: true 80 | sharptimer_enable_rankicons_hud true // If Rank Icons Hud should be globally enabled or not. Default value: true 81 | sharptimer_enable_velocity_hud true // If Speed Velocity Hud should be globally enabled or not. Default value: true 82 | sharptimer_enable_strafesync_hud true // If Stafe Sync % Hud should be globally enabled or not. Default value: true 83 | sharptimer_enable_map_tier_hud true // If Map Tier Hud should be globally enabled or not. Default value: true 84 | sharptimer_enable_map_type_hud true // If Map Type Hud should be globally enabled or not. Default value: true 85 | sharptimer_enable_map_name_hud true // If Map Name Hud should be globally enabled or not. Default value: true 86 | 87 | 88 | //BASIC COMMANDS 89 | sharptimer_respawn_enabled true // Whether !r is enabled by default or not. Default value: true 90 | sharptimer_end_enabled false // Whether !end is enabled by default or not. Default value: false 91 | sharptimer_top_enabled true // Whether !top is enabled by default or not. Default value: true 92 | sharptimer_rank_enabled true // Whether !rank is enabled by default or not. Default value: true 93 | sharptimer_goto_enabled false // Whether !goto is enabled by default or not. Default value: false 94 | sharptimer_help_enabled true // Whether !help is enabled by default or not. Default value: true 95 | sharptimer_enable_noclip false // Whether !noclip/!nc is enabled by default or not. Default value: false 96 | 97 | 98 | //GLOBAL RANK POINTS 99 | sharptimer_global_rank_points_enabled false // Whether the plugin should reward players with global points for completing maps. MySQL Requierd. Default value: false 100 | sharptimer_display_rank_tags_chat true // Whether the plugin should display rank tags infront of players names in chat or not. Default value: true 101 | sharptimer_display_rank_tags_scoreboard true // Whether the plugin should display rank tags infront of players names in scoreboard or not. Default value: true 102 | sharptimer_global_rank_free_points_enabled true // Whether the plugin should reward players with free points for completing maps without beating their PB (31xMapTier). Default value: true 103 | sharptimer_global_rank_max_free_rewards 20 // How many times the player should recieve free 'participation' points for finishing the map without a new PB. Default value: 20 104 | sharptimer_global_rank_min_points_threshold 1000 // Players with Points below this amount will be treated as Unranked. Default value: 1000 105 | 106 | 107 | //REPLAYS 108 | sharptimer_replays_enabled false // Whether replays should be enabled or not. This option might be performance taxing and use more ram & cpu. Default value: false 109 | sharptimer_replay_max_length 300 // The maximum length for a Replay to be saved in seconds. Anything longer will be discarded Default value: 300 110 | sharptimer_replay_bot_enabled false // Whether a looping Server Record bot should be spawned in or not (requires navmesh fix). Default value: false 111 | sharptimer_replay_bot_name SERVER RECORD REPLAY // What the name of the Replay Record bot should be. Default value: SERVER RECORD REPLAY 112 | 113 | 114 | //CHECKPOINTS/SAVELOC 115 | sharptimer_checkpoints_enabled false // Whether !cp/saveloc, !tp/loadloc, and !prevcp/prevloc & !nextcp/nextloc are enabled by default or not. Default value: false 116 | sharptimer_remove_checkpoints_restrictions false // Whether checkpoints/locs should save in the air with the current player speed (enable for surf). Default value: false 117 | sharptimer_checkpoints_only_when_timer_stopped false // Will only allow checkpoints/locs if timer is stopped using !timer 118 | 119 | 120 | //JUMPSTATS (KZ) 121 | sharptimer_jumpstats_enabled false // Whether JumpStats are enabled or not. Default value: false 122 | sharptimer_jumpstats_min_distance 175.0 // Defines the minimum distance for a jumpstat to be printed to chat. Default value: 175.0 123 | sharptimer_jumpstats_max_vert 32.0 // Defines the max vertical distance for a jumpstat to not be printed to chat. Default value: 32.0 124 | sharptimer_jumpstats_movement_unlocker_cap true // Intended for taming movement unlocker, caps speed on the second tick of a player being on the ground. Default value: true 125 | sharptimer_jumpstats_movement_unlocker_cap_value 250.0 // Speed cap value which will kick in on the second tick of the player being on the ground. Default value: 250.0 126 | 127 | 128 | //SOUNDS 129 | sharptimer_enable_sounds_by_default false // Whether to enable sounds for players by default. Default value: false 130 | sharptimer_sound_timer sounds/ui/counter_beep.vsnd // Defines Timer sound. Default value: sounds/ui/counter_beep.vsnd (old: sounds/ui/csgo_ui_button_rollover_large.vsnd) 131 | sharptimer_sound_respawn sounds/buttons/button9.vsnd // Defines Respawn sound. Default value: sounds/buttons/button9.vsnd (old: sounds/buttons/button8.vsnd) 132 | sharptimer_sound_checkpoint sounds/ui/buttonclick.vsnd // Defines Checkpoint sound. Default value: sounds/ui/buttonclick.vsnd (old: sounds/ui/counter_beep.vsnd) 133 | sharptimer_sound_checkpoint_error sounds/ui/weapon_cant_buy.vsnd // Defines Checkpoint Error sound. Default value: sounds/ui/weapon_cant_buy.vsnd 134 | sharptimer_sound_teleport sounds/buttons/blip1.vsnd // Defines Teleport sound. Default value: sounds/buttons/blip1.vsnd (old: sounds/ui/buttonclick.vsnd) 135 | sharptimer_sound_pb sounds/buttons/bell1.vsnd // Defines PB Sound. Default value: sounds/buttons/bell1.vsnd 136 | sharptimer_sound_sr sounds/ui/panorama/round_report_round_won_01.vsnd // Defines SR Sound. Default value: sounds/ui/panorama/round_report_round_won_01.vsnd 137 | sharptimer_sound_sr_all_players true // Whether to play SR sound for all players. Default value: true 138 | sharptimer_sound_stage_all_players true // Whether to play stage record sound for all players. Default value: true 139 | -------------------------------------------------------------------------------- /cfg/SharpTimer/custom_exec.cfg: -------------------------------------------------------------------------------- 1 | //Add your desired server settings here 2 | //Example KZ cfg: https://github.com/deafps/cs-cfg/blob/main/kz.cfg 3 | //Example Surf cfg: https://github.com/deafps/cs-cfg/blob/main/surf.cfg 4 | //All commands here will be executed on Map Start -------------------------------------------------------------------------------- /cfg/SharpTimer/discordConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "DiscordWebhookBotName": "SharpTimer", 3 | "DiscordWebhookPFPUrl": "https://cdn.discordapp.com/icons/1196646791450472488/634963a8207fdb1b30bf909d31f05e57.webp", 4 | "DiscordWebhookMapImageRepoUrl": "https://raw.githubusercontent.com/Letaryat/poor-sharptimermappics/main/pics/", 5 | "DiscordPBWebhookUrl": "your_discord_webhook_url", 6 | "DiscordSRWebhookUrl": "your_discord_webhook_url", 7 | "DiscordPBBonusWebhookUrl": "your_discord_webhook_url", 8 | "DiscordSRBonusWebhookUrl": "your_discord_webhook_url", 9 | "DiscordFooterString": "SharpTimer Discord Webhook", 10 | "DiscordRareGifOdds": 10000, 11 | "DiscordRareGifUrl": "https://files.catbox.moe/q99x7v.gif", 12 | "DiscordWebhookColor": 13369599, 13 | "DiscordWebhookSteamAvatar": true, 14 | "DiscordWebhookTier": true, 15 | "DiscordWebhookTimeChange": true, 16 | "DiscordWebhookTimesFinished": true, 17 | "DiscordWebhookPlacement": true, 18 | "DiscordWebhookSteamLink": true, 19 | "DiscordWebhookDisableStyleRecords": false 20 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/mysqlConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "Host": "your_mysql_host", 3 | "Database": "your_mysql_database", 4 | "Username": "your_mysql_username", 5 | "Password": "your_mysql_password", 6 | "TablePrefix": "", 7 | "Port": 3306, 8 | "Timeout": 30 9 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/postgresConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "Host": "", 3 | "Database": "", 4 | "Username": "", 5 | "Password": "", 6 | "TablePrefix": "", 7 | "Port": 3306 8 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/ranks.json: -------------------------------------------------------------------------------- 1 | { 2 | "Unranked": { 3 | "title": "[Unranked]", 4 | "color": "{default}", 5 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/unranked.png" 6 | }, 7 | "Rank1": { 8 | "title": "[Bronze]", 9 | "percent": 100, 10 | "color": "{lightyellow}", 11 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/dev/remote_data/rank_icons/bronze.png" 12 | }, 13 | "Rank2": { 14 | "title": "[Silver]", 15 | "percent": 85, 16 | "color": "{silver}", 17 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/silver3.png" 18 | }, 19 | "Rank3": { 20 | "title": "[Gold]", 21 | "percent": 70, 22 | "color": "{yellow}", 23 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/gold3.png" 24 | }, 25 | "Rank4": { 26 | "title": "[Platinum]", 27 | "percent": 55, 28 | "color": "{lightblue}", 29 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/plat3.png" 30 | }, 31 | "Rank5": { 32 | "title": "[Diamond]", 33 | "percent": 40, 34 | "color": "{purple}", 35 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/dia3.png" 36 | }, 37 | "Rank6": { 38 | "title": "[Master]", 39 | "percent": 25, 40 | "color": "{lime}", 41 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/master3.png" 42 | }, 43 | "Rank7": { 44 | "title": "[Legend]", 45 | "percent": 10, 46 | "color": "{orange}", 47 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/legend3.png" 48 | }, 49 | "Rank8": { 50 | "title": "[Royalty]", 51 | "percent": 3, 52 | "color": "{lightred}", 53 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/royal3.png" 54 | }, 55 | "Rank9": { 56 | "title": "[God]", 57 | "percent": 1, 58 | "color": "{darkred}", 59 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/god.gif" 60 | }, 61 | "Rank10": { 62 | "title": "[#1]", 63 | "placement": 1, 64 | "color": "{darkred}", 65 | "icon": "https://raw.githubusercontent.com/Letaryat/poor-SharpTimer/main/remote_data/rank_icons/god.gif" 66 | } 67 | } -------------------------------------------------------------------------------- /cfg/SharpTimer/stgamedata.json: -------------------------------------------------------------------------------- 1 | { 2 | "RunCommand": { 3 | "signatures": { 4 | "library": "server", 5 | "windows": "\\x48\\x89\\x5C\\x24\\x18\\x48\\x89\\x6C\\x24\\x20\\x57\\x48\\x83\\xEC\\x20\\x48\\x8B\\xDA", 6 | "linux": "\\x55\\x48\\x89\\xE5\\x41\\x55\\x49\\x89\\xF5\\x41\\x54\\x49\\x89\\xFC\\xE8\\x2A\\x2A\\x2A\\x2A\\x48\\x85\\xC0\\x74\\x30" 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /lang/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Time: [{lime}{0}{default}] {1}", 6 | "timer_style": "Style: [{lime}{0}{default}]", 7 | "stop_using_timer": "Stop your timer using {lime}!timer{default} first!", 8 | "timer_enabled": "Timer: {green}Enabled", 9 | "timer_disabled": "Timer: {red}Disabled", 10 | "timer_cancelled": "Timer cancelled due to illegal skip attempt", 11 | "timer_reset": "You got reset due to illegal skip attempt", 12 | 13 | //records 14 | "no_records_available": "No records available for {0}", 15 | "no_records_available_bonus": "No records available for Bonus {0} on {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}set a new SR!", 18 | "new_stage_server_record": "{lime}{0} {white}set a new stage record!", 19 | "new_server_record_bonus": "{lime}{0} {white}set a new Bonus {1} SR!", 20 | "new_pb_record": "{lime}{0} {white}set a new Map PB!", 21 | "new_pb_record_bonus": "{lime}{0} {white}set a new Bonus {1} PB!", 22 | "map_finish": "{lime}{0} {white}finished the map!", 23 | "map_finish_bonus": "{lime}{0} {white}finished the Bonus {1}!", 24 | "map_finish_rank": "Rank: [{lime}{0}{default}] Times Finished: [{lime}{1}{default}]", 25 | "top10_records": "Top 10 {0} Records for {1}:", 26 | "top10_records_bonus": "Top 10 {0} Records for Bonus {1} on {2}:", 27 | 28 | //stages 29 | "invalid_bonus_stage": "Please enter a valid Bonus stage i.e: {lime}!topbonus 1", 30 | "invalid_bonus_rb": "Please enter a valid Bonus stage i.e: {lime}!rb ", 31 | "stages_unavalible": "Stages unavalible", 32 | "stages_unavalible_respawnpos": "{lightred}No RespawnStagePos with index {0} found for current map!", 33 | "stages_enter_valid": "Please enter a valid stage i.e: {lime}!stage ", 34 | "map_no_stages": "{lightred}Current map has no stages!", 35 | 36 | //rank 37 | "current_rank": "You are currently {0}{1}{lime}", 38 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 39 | "current_pb": "Your current PB on {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_bonus_pb": "Your current PB on {lime}Bonus {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 41 | "current_sr": "Current Server Record on {lime}{0}{white}:", 42 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 43 | "reached_max_free": "You reached your maximum free points rewards of {lime}{0}{default}!", 44 | "gained_points": "{lime}{0} {default}gained {green}+{1} {default}Points {grey}({2})", 45 | "top_10_points": "Top 10 Players with the most points:", 46 | "top_10_points_list": "#{0}: {lime}{1} {default}: {lime}{2} {default}points", 47 | 48 | //replay 49 | "no_replay": "No Replay playing currently", 50 | "end_your_replay": "End your current replay first {lime}!stopreplay", 51 | "available_replay_cmds": "Available replay cmds: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 52 | "no_sr_replay": "No Server Record to replay!", 53 | "replaying_server_top": "Replaying the Server Top {0} type {lime}!stop or {lime}!stopreplay {default}to exit the replay", 54 | "replaying_pb": "Replaying your PB type {lime}!stop or {lime}!stopreplay {default}to exit the replay", 55 | "ending_replay": "Ending Replay!", 56 | "replay_corrupt": "The requested replay seems to be corrupted", 57 | "replay_dont_exist": "The requested replay does not exist", 58 | 59 | //settings 60 | "hud_shown": "Hud is now: {green}Shown", 61 | "hud_hidden": "Hud is now: {red}Hidden", 62 | "keys_shown": "Keys is now: {green}Shown", 63 | "keys_hidden": "Keys is now: {red}Hidden", 64 | "jumpstats_shown": "Jump Stats are now: {green}Shown", 65 | "jumpstats_hidden": "Jump Stats are now: {red}Hidden", 66 | "sounds_on": "Sounds are now: {green}ON", 67 | "sounds_off": "Sounds are now: {red}OFF", 68 | 69 | //zones 70 | "no_respawnpos": "{lightred}No RespawnPos found for current map!", 71 | "no_respawnpos_bonus": "{lightred}No RespawnBonusPos found for current map!", 72 | "no_respawnpos_bonus_index": "{lightred}No RespawnBonusPos with index {0} found for current map!", 73 | "no_endpos": "{lightred}No EndPos found for current map!", 74 | "map_using_manual_zones": "Current Map is using manual zones", 75 | "saved_custom_respawnpos": "Saved custom Start Zone RespawnPos!", 76 | "not_inside_startzone": "You are not inside the Start Zone!", 77 | 78 | //styles 79 | "styles_list": "Style {0}. {lime}{1}", 80 | "style_example": "example: {lime}/style 1 or lowgravity", 81 | "style_set": "Style set to: {lime}{0}", 82 | "style_not_found": "Style {0} does not exist", 83 | "styles_disabled": "Styles are currently disabled on this server", 84 | "styles_not_supported": "Styles are currently not supported on local records :(", 85 | 86 | //checkpoints 87 | "checkpoint_set": "{0} set! {lime}#{1}", 88 | "no_checkpoint_set": "No {0} set!", 89 | "cant_use_checkpoint": "{lightred}Cant use {0} while timer is on, use {default}!timer", 90 | "cant_use_checkpoint_in_air": "{lightred}Cant set {0} while in air", 91 | "used_checkpoint": "Teleported to the next {0}", 92 | "used_recent_checkpoint": "Teleported to most recent {0}", 93 | "used_previous_checkpoint": "Teleported to the previous {0}", 94 | 95 | "goto_player": "Teleporting to {lime}{0}", 96 | "goto_player_not_found": "{lightred}Player name not found! If the name contains spaces please try {lime}!goto 'some name'", 97 | 98 | //jumpstats 99 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 100 | "js_msg2": "{grey}Height: {lime}{0}{grey} | Width: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sync: {lime}{3}%", 101 | 102 | //ad messages 103 | "ad_see_all_commands": "{primary}Type !sthelp{default} to see all commands!", 104 | "ad_replay_pb": "Type {primary}!replaypb{default} to watch a replay of your personal best run!", 105 | "ad_replay_sr": "Type {primary}!replay or {primary}!replaysr{default} to watch a replay of the SR on {primary}{current_map}{default}!", 106 | "ad_replay_top": "Type {primary}!replaytop <1-10>{default} to watch a replay of a top run on {primary}{current_map}{default}!", 107 | "ad_replay_bonus": "Type {primary}!replaybonus <1-10> (or !replayb){default} to watch a replay of a top run on a bonus stage{default}!", 108 | "ad_replay_bonus_pb": "Type {primary}!replaybonuspb (or !replaybpb){default} to watch a replay of your personal best run on a bonus stage{default}!", 109 | "ad_points": "Type {primary}!points{default} to see the top 10 players with the most points!", 110 | "ad_respawn": "Type {primary}!r{default} to respawn back to start!", 111 | "ad_start_pos": "Type {primary}!setresp (or !startpos){default} to save a custom respawn point within the start trigger!", 112 | "ad_top": "Type {primary}!top{default} to see the top 10 players on {primary}{current_map}{default}!", 113 | "ad_rank": "Type {primary}!rank{default} to see your current PB and Rank!", 114 | "ad_save_loc": "Type {primary}!saveloc{default} to save a new loc!", 115 | "ad_cp": "Type {primary}!cp{default} to set a new checkpoint!", 116 | "ad_load_loc": "Type {primary}!loadloc{default} to load the last loc!", 117 | "ad_tp": "Type {primary}!tp{default} to teleport to your last checkpoint!", 118 | "ad_goto": "Type {primary}!goto {default} to teleport to a player!", 119 | "ad_fov": "Type {primary}!fov <0-140>{default} to change your field of view!", 120 | "ad_sounds": "Type {primary}!sounds{default} to toggle timer sounds!", 121 | "ad_hud": "Type {primary}!hud{default} to toggle timer hud!", 122 | "ad_keys": "Type {primary}!keys{default} to toggle hud keys!", 123 | "ad_styles": "Type {primary}!styles{default} to list all available styles!", 124 | "ad_jumpstats": "Type {primaryChatColor}!jumpstats{default} to toggle JumpStats!", 125 | 126 | //other 127 | "command_cooldown": "Command is on cooldown. Chill...", 128 | "error_occured": "{lightred}Error occured.", 129 | "info_version": "This server is running SharpTimer v{0}", 130 | "info_os": "OS: {0}", 131 | "info_runtime": "Runtime: {0}", 132 | "connect_message": "Player {red}{0} {default}connected!", 133 | "connected_message": "Player {red}{0} {default}connected for the {1} time!", 134 | "connected_message_first": "Player {red}{0} {default}connected for the first time!", 135 | "disconnect_message": "Player {red}{0} {default}disconnected!" 136 | } 137 | -------------------------------------------------------------------------------- /lang/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Aika: [{lime}{0}{default}] {1}", 6 | "timer_style": "Tyyli: [{lime}{0}{default}]", 7 | "stop_using_timer": "Pysäytä ensin ajastimesi, käyttämällä {lime}!timer{default} komentoa!", 8 | "timer_enabled": "Ajastin: {green}Käytössä", 9 | "timer_disabled": "Ajastin: {red}Pois käytöstä", 10 | "timer_cancelled": "Ajastin peruutettu laittoman ohitus yrityksen vuoksi", 11 | "timer_reset": "Sinut nollattiin laittoman ohitus yrityksen vuoksi.", 12 | 13 | //records 14 | "no_records_available": "Aikoja ei saatavilla kentällä {0}", 15 | "no_records_available_bonus": "Aikoja ei saatavilla Boonukselle {0} kentällä {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}on asettanut uuden Palvelin Ennätyksen!", 18 | "new_server_record_bonus": "{lime}{0} {white}on asettanut uuden Boonus {1} Palvelin Ennätyksen!", 19 | "new_pb_record": "{lime}{0} {white}on asettanut uuden Kenttä Ennätyksen!", 20 | "new_pb_record_bonus": "{lime}{0} {white}on asettanut uuden Boonus {0} Ennätyksen!", 21 | "map_finish": "{lime}{0} {white}on läpäissyt kentän!", 22 | "map_finish_bonus": "{lime}{0} {white}on läpäissyt Boonuksen {0}!", 23 | "map_finish_rank": "Sijoitus: [{lime}{0}{default}] Läpäissyjen Määrä: [{lime}{1}{default}]", 24 | "top10_records": "Top 10 {0} Aikaa kentällä {1}:", 25 | "top10_records_bonus": "Top 10 {0} Aikaa Boonuksella {1} kentällä {2}:", 26 | 27 | //stages 28 | "invalid_bonus_stage": "Syötä kelvollinen Boonus taso, esim: {lime}!topbonus 1", 29 | "invalid_bonus_rb": "Syötä kelvollinen Boonus taso, esim: {lime}!rb ", 30 | "stages_unavalible": "Kentät eivät ole saatavilla", 31 | "stages_unavalible_respawnpos": "{lightred}Ei löytynyt RespawnStagePos paikkaa indeksillä {0} tämänhetkiselle kentälle!", 32 | "stages_enter_valid": "Syötä kelvollinen taso, esim:: {lime}!stage ", 33 | "map_no_stages": "{lightred}Kentällä ei ole yhtään tasoa!", 34 | 35 | //rank 36 | "current_rank": "Sijoituksesi on nyt {0}{1}{lime}", 37 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 38 | "current_pb": "Ennätyksesi kentällä {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 39 | "current_sr": "Palvelin Ennätys kentällä {lime}{0}{white}:", 40 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 41 | "reached_max_free": "Olet saavuttanut maksimi ilmaiset piste palkintosi kentälle {lime}{0}{default}!", 42 | 43 | //replay 44 | "no_replay": "Ei Replay toistoa käynnissä", 45 | "end_your_replay": "Lopeta tämänhetkinen Replay toistosi ensin {lime}!stopreplay komennolla", 46 | "available_replay_cmds": "Saatavilla olevat replay komennot: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 47 | "replaying_server_record": "Toistetaan Palvelimen Kenttä Ennätyksen Replayta, kirjoita {lime}!stop tai {lime}!stopreplay {default}poistuaksesi toistosta", 48 | "no_sr_replay": "Ei Palvelin Ennätystä jota toistaa!", 49 | "replaying_server_top": "Toistetaan Palvelimen Top {0} ajan Replayta, kirjoita {lime}!stop tai {lime}!stopreplay {default}poistuaksesi toistosta", 50 | "replaying_pb": "Toistetaan Ennätyksesi Replayta, kirjoita {lime}!stop tai {lime}!stopreplay {default}poistuaksesi toistosta", 51 | "ending_replay": "Lopetetaan Replay!", 52 | "replay_corrupt": "Toivottu Replay vaikuttaa olevan korruptoitunut", 53 | "replay_dont_exist": "Toivottu Replay ei ole olemassa", 54 | 55 | //settings 56 | "hud_shown": "Hud on nyt: {green}Piilossa", 57 | "hud_hidden": "Hud on nyt: {red}Piilossa", 58 | "keys_shown": "Napit ovat nyt: {green}Piilossa", 59 | "keys_hidden": "Napit ovat nyt: {red}Piilossa", 60 | "jumpstats_shown": "Hyppytiedot ovat nyt: {green}Piilossa", 61 | "jumpstats_hidden": "Hyppytiedot ovat nyt: {red}Piilossa", 62 | "sounds_on": "Äänet ovat nyt: {green}PÄÄLLÄ", 63 | "sounds_off": "Äänet ovat nyt: {red}POIS PÄÄLTÄ", 64 | 65 | //zones 66 | "no_respawnpos": "{lightred}Ei löytynyt RespawnPos paikkaa tämänhetkiselle kentälle!", 67 | "no_respawnpos_bonus": "{lightred}Ei löytynyt RespawnBonusPos paikkaa tämänhetkiselle kentälle!", 68 | "no_respawnpos_bonus_index": "{lightred}Ei löytynyt RespawnBonusPos paikkaa indeksillä {0} tämänhetkiselle kentälle!", 69 | "no_endpos": "{lightred}Ei löytynyt EndPos paikkaa tämänhetkiselle kentälle!", 70 | "map_using_manual_zones": "Tämänhetkinen kenttä käyttää manuaalisia zone alueita", 71 | "saved_custom_respawnpos": "Tallennettiin custom Aloitus RespawnPos Alue!", 72 | "not_inside_startzone": "Et ole Aloitus Alueen sisällä!", 73 | 74 | //styles 75 | "styles_list": "Tyyli {0}. {lime}{1}", 76 | "style_example": "esimerkki: {lime}/style 1 tai lowgravity", 77 | "style_set": "Tyyli asetettu: {lime}{0} {default}tyyliin", 78 | "style_not_found": "Tyyliä {0} ei ole olemassa", 79 | "styles_disabled": "Tyylit ovat poissa käytöstä palvelimella tällähetkellä", 80 | "styles_not_supported": "Tyylit eivät ole tuettu palvelimen ajastimella :(", 81 | 82 | //checkpoints 83 | "checkpoint_set": "{0}asetettu! {lime}#{1}", 84 | "no_checkpoint_set": "Ei {0} asetettu!", 85 | "cant_use_checkpoint": "{lightred}Ei voi käyttää {0} kun ajastin on päällä, käytä {default}!timer komentoa", 86 | "cant_use_checkpoint_in_air": "{lightred}Et voi asettaa {0} ollessasi ilmassa", 87 | "used_checkpoint": "Teleporttasit seuraavaan {0}", 88 | "used_recent_checkpoint": "Teleporttasit viimeisimpään {0}", 89 | "used_previous_checkpoint": "Teleporttasit edelliseen {0}", 90 | 91 | "goto_player": "Teleportataan pelaajaan {lime}{0}", 92 | "goto_player_not_found": "{lightred}Pelaaja ei löytynyt! Jos nimi sisältää välilyönnin, käytä {lime}!goto 'joku nimi' komentoa", 93 | 94 | //jumpstats 95 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 96 | "js_msg2": "{grey}Height: {lime}{0}{grey} | Width: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sync: {lime}{3}%", 97 | 98 | //other 99 | "command_cooldown": "Komento on jäähyllä. Chillaa...", 100 | "error_occured": "{lightred}Tapahtui virhe.", 101 | "info_version": "Tällä palvelimella on käytössä SharpTimer v{0}", 102 | "info_os": "OS: {0}", 103 | "info_runtime": "Runtime: {0}" 104 | } 105 | -------------------------------------------------------------------------------- /lang/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Temps: [{lime}{0}{default}] {1}", 6 | "timer_style": "Style: [{lime}{0}{default}]", 7 | "stop_using_timer": "Arrêtez votre minuteur en utilisant {lime}!timer{default} en premier !", 8 | "timer_enabled": "Timer: {green}Activé", 9 | "timer_disabled": "Timer: {red}Désactivé", 10 | "timer_cancelled": "Timer annulée en raison d'une tentative de saut illégale", 11 | "timer_reset": "Vous avez été réinitialisé en raison d'une tentative de saut illégale.", 12 | 13 | //records 14 | "no_records_available": "Aucun enregistrement n'est disponible pour {0}", 15 | "no_records_available_bonus": "Aucun enregistrement n'est disponible pour le Bonus {0} sur {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}a établi un nouveau SR !", 18 | "new_server_record_bonus": "{lime}{0} {white}a établi un nouveau SR pour le Bonus {1}!", 19 | "new_pb_record": "{lime}{0} {white}a établi un nouveau record personnel sur la map !", 20 | "new_pb_record_bonus": "{lime}{0} {white}a établi un nouveau record personnel pour le Bonus {1}!", 21 | "map_finish": "{lime}{0} {white}a terminé la map!", 22 | "map_finish_bonus": "{lime}{0} {white}a terminé le Bonus {1}!", 23 | "map_finish_rank": "Classement: [{lime}{0}{default}] Temps accompli: [{lime}{1}{default}]", 24 | "top10_records": "Top 10 {0} des records pour {1}:", 25 | "top10_records_bonus": "Top 10 {0} des records pour le Bonus {1} sur {2}:", 26 | 27 | //stages 28 | "invalid_bonus_stage": "Veuillez saisir un numéro de stage valide pour le Bonus. ex : {lime}!topbonus 1", 29 | "invalid_bonus_rb": "Veuillez saisir un numéro de stage valide. ex: {lime}!rb ", 30 | "stages_unavalible": "Stage indisponible", 31 | "stages_unavalible_respawnpos": "{lightred}Pas de RespawnStagePos avec l'index {0} trouvé pour la map actuelle !", 32 | "stages_enter_valid": "Veuillez saisir un numéro stage valide. ex: {lime}!stage ", 33 | "map_no_stages": "{lightred}La map actuelle ne contient aucun stage!", 34 | 35 | //rank 36 | "current_rank": "Vous êtes actuellement {0}{1}{lime}", 37 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 38 | "current_pb": "Votre PB actuel sur {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 39 | "current_bonus_pb": "Votre PB actuel sur {lime}Bonus {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_sr": "Record actuel sur le serveur pour {lime}{0}{white}:", 41 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 42 | "reached_max_free": "Vous avez atteint le nombre maximum de points gratuits de {lime}{0}{default}!", 43 | "gained_points": "{lime}{0} {default}gagné {green}+{1} {default}Points {grey}({2})", 44 | "top_10_points": "Top 10 des joueurs avec le plus de points :", 45 | "top_10_points_list": "#{0} : {lime}{1} {default} : {lime}{2} {default}points", 46 | 47 | //replay 48 | "no_replay": "Pas de replay en cours", 49 | "end_your_replay": "Terminez d'abord votre replay en cours {lime}!stopreplay", 50 | "available_replay_cmds": "Commandes de replay disponibles: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 51 | "no_sr_replay": "Désolé il n'y a pas de replay pour le record du serveur !", 52 | "replaying_server_top": "Vous visionnez le record Top {0} Utilisez {lime}!stop ou {lime}!stopreplay {default}pour quitter le replay", 53 | "replaying_pb": "Vous visionnez votre record personnel. Utilisez {lime}!stop ou {lime}!stopreplay {default}pour quitter le replay", 54 | "ending_replay": "Replay terminé !", 55 | "replay_corrupt": "Le replay demandé semble être corrompu", 56 | "replay_dont_exist": "Le replay demandé n'existe pas", 57 | 58 | //settings 59 | "hud_shown": "L'Hud est maintenant: {green}Affiché", 60 | "hud_hidden": "L'Hud est maintenant: {red}Caché", 61 | "keys_shown": "Les touches sont maintenant: {green}Affiché", 62 | "keys_hidden": "Les touches sont maintenant: {red}Caché", 63 | "jumpstats_shown": "Les statistiques de saut sont maintenant: {green}Affiché", 64 | "jumpstats_hidden": "Les statistiques de saut sont maintenant: {red}Caché", 65 | "sounds_on": "Les sons sont maintenant: {green}Activé", 66 | "sounds_off": "Les sons sont maintenant: {red}Désactivé", 67 | 68 | //zones 69 | "no_respawnpos": "{lightred}Aucun RespawnPos n'a été trouvé pour la map actuelle !", 70 | "no_respawnpos_bonus": "{lightred}Aucun RespawnBonusPos n'a été trouvé pour la map actuelle !", 71 | "no_respawnpos_bonus_index": "{lightred}Aucun RespawnBonusPos avec l'index {0} n'a été trouvé pour la map actuelle !", 72 | "no_endpos": "{lightred}Aucun EndPos n'a été trouvé pour la map actuelle !", 73 | "map_using_manual_zones": "La map actuelle utilise des zones manuelles", 74 | "saved_custom_respawnpos": "Enregistrement des Positions personnalisées de réapparition de la zone de départ !", 75 | "not_inside_startzone": "Vous n'êtes pas dans la zone de départ !", 76 | 77 | //styles 78 | "styles_list": "Style {0}. {lime}{1}", 79 | "style_example": "example: {lime}/style 1 ou lowgravity", 80 | "style_set": "Style réglé sur: {lime}{0}", 81 | "style_not_found": "Le style {0} n'existe pas", 82 | "styles_disabled": "Les styles sont actuellement désactivés sur ce serveur", 83 | "styles_not_supported": "Les styles ne sont actuellement pas pris en charge par les enregistrements locaux :(", 84 | 85 | //checkpoints 86 | "checkpoint_set": "{0} définit! {lime}#{1}", 87 | "no_checkpoint_set": "Aucune {0} définit!", 88 | "cant_use_checkpoint": "{lightred}Impossible d'utiliser {0} lorsque le timer est activée, utilisez {default}!timer", 89 | "cant_use_checkpoint_in_air": "{lightred}Impossible de définir {0} dans les airs", 90 | "used_checkpoint": "Téléporté au suivant {0}", 91 | "used_recent_checkpoint": "Téléporté au plus récent {0}", 92 | "used_previous_checkpoint": "Téléportation vers le précédent {0}", 93 | 94 | "goto_player": "Téléportation vers {lime}{0}", 95 | "goto_player_not_found": "{lightred}Le nom du joueur n'a pas été trouvé ! Si le nom contient des espaces, essayez {lime}!goto 'joueur lambda'", 96 | 97 | //jumpstats 98 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 99 | "js_msg2": "{grey}Hauteur: {lime}{0}{grey} | Largeur: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sync: {lime}{3}%", 100 | 101 | //other 102 | "command_cooldown": "La commande est en attente. Chill...", 103 | "error_occured": "{lightred}Une erreur s'est produite.", 104 | "info_version": "Ce serveur utilise SharpTimer v{0}", 105 | "info_os": "OS: {0}", 106 | "info_runtime": "Runtime: {0}", 107 | "connect_message": "Joueur {red}{0} {default}connecté!", 108 | "connected_message": "Joueur {red}{0} {default}connecté pour la {1} fois!", 109 | "connected_message_first": "Le joueur {red}{0} {default} s'est connecté pour la première fois!", 110 | "disconnect_message": "Joueur {red}{0} {default}déconnecté!" 111 | } 112 | -------------------------------------------------------------------------------- /lang/lv.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Laiks: [{lime}{0}{default}] {1}", 6 | "timer_style": "Stils: [{lime}{0}{default}]", 7 | "stop_using_timer": "Vispirms apstādini taimeri ar {lime}!timer{default}!", 8 | "timer_enabled": "Taimeris: {green}Ieslēgts", 9 | "timer_disabled": "Taimeris: {red}Izslēgts", 10 | "timer_cancelled": "Timer cancelled due to illegal skip attempt", 11 | "timer_reset": "You got reset due to illegal skip attempt", 12 | 13 | //records 14 | "no_records_available": "Nav pieejamu rezultātu kartē {0}", 15 | "no_records_available_bonus": "Nav pieejamu rezultātu Bonusā {0} kartē {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}uzstādīja jaunu SR!", 18 | "new_stage_server_record": "{lime}{0} {white}uzstādīja jaunu posma rekordu!", 19 | "new_server_record_bonus": "{lime}{0} {white}uzstādīja jaunu Bonusa {1} SR!", 20 | "new_pb_record": "{lime}{0} {white}uzstādīja jaunu kartes PB!", 21 | "new_pb_record_bonus": "{lime}{0} {white}uzstādīja jaunu Bonusa {1} PB!", 22 | "map_finish": "{lime}{0} {white}pabeidza karti!", 23 | "map_finish_bonus": "{lime}{0} {white}pabeidza Bonusu {1}!", 24 | "map_finish_rank": "Ranks: [{lime}{0}{default}] Pabeigtie mēģinājumi: [{lime}{1}{default}]", 25 | "top10_records": "Top 10 {0} rezultāti {1}:", 26 | "top10_records_bonus": "Top 10 {0} rezultāti Bonusā {1} kartē {2}:", 27 | 28 | //stages 29 | "invalid_bonus_stage": "Lūdzu ievadi derīgu Bonusa posmu, piem.: {lime}!topbonus 1", 30 | "invalid_bonus_rb": "Lūdzu ievadi derīgu Bonusa posmu, piem.: {lime}!rb ", 31 | "stages_unavalible": "Posmi nav pieejami", 32 | "stages_unavalible_respawnpos": "{lightred}Nav RespawnStagePos ar indeksu {0} šai kartei!", 33 | "stages_enter_valid": "Lūdzu ievadi derīgu posmu, piem.: {lime}!stage ", 34 | "map_no_stages": "{lightred}Šai kartei nav posmu!", 35 | 36 | //rank 37 | "current_rank": "Tavs pašreizējais ranks ir {0}{1}{lime}", 38 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 39 | "current_pb": "Tavs pašreizējais PB kartē {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_bonus_pb": "Tavs pašreizējais PB kartē {lime}Bonusa {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 41 | "current_sr": "Pašreizējais servera rekords kartē {lime}{0}{white}:", 42 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 43 | "reached_max_free": "Tu esi sasniedzis maksimālo bezmaksas punktu limitu: {lime}{0}{default}!", 44 | "gained_points": "{lime}{0} {default}ieguva {green}+{1} {default}punktus {grey}({2})", 45 | "top_10_points": "Top 10 spēlētāji ar visvairāk punktiem:", 46 | "top_10_points_list": "#{0}: {lime}{1} {default}: {lime}{2} {default}punkti", 47 | 48 | //replay 49 | "no_replay": "No Replay playing currently", 50 | "end_your_replay": "Beidz savu Replay vispirms ar {lime}!stopreplay", 51 | "available_replay_cmds": "Pieejamās Replay komandas: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 52 | "no_sr_replay": "Nav servera rekorda ko parādīt!", 53 | "replaying_server_top": "Replaying the Server Top {0}, raksti {lime}!stop vai {lime}!stopreplay {default}lai izietu no Replay", 54 | "replaying_pb": "Replaying your PB, raksti {lime}!stop vai {lime}!stopreplay {default}lai izietu no Replay", 55 | "ending_replay": "Repaly apturēts!", 56 | "replay_corrupt": "Pieprasītais Replay šķiet bojāts", 57 | "replay_dont_exist": "Pieprasītais Replay neeksistē", 58 | 59 | //settings 60 | "hud_shown": "HUD ir tagad: {green}Redzams", 61 | "hud_hidden": "HUD ir tagad: {red}Paslēpts", 62 | "keys_shown": "Taustiņi tagad ir: {green}Redzami", 63 | "keys_hidden": "Taustiņi tagad ir: {red}Paslēpti", 64 | "jumpstats_shown": "Lēkšanas statistika tagad ir: {green}Redzama", 65 | "jumpstats_hidden": "Lēkšanas statistika tagad ir: {red}Paslēpta", 66 | "sounds_on": "Skaņas tagad ir: {green}IESLĒGTAS", 67 | "sounds_off": "Skaņas tagad ir: {red}IZSLĒGTAS", 68 | 69 | //zones 70 | "no_respawnpos": "{lightred}Šai kartei nav RespawnPos!", 71 | "no_respawnpos_bonus": "{lightred}Šai kartei nav RespawnBonusPos!", 72 | "no_respawnpos_bonus_index": "{lightred}Nav RespawnBonusPos ar indeksu {0} šai kartei!", 73 | "no_endpos": "{lightred}Šai kartei nav EndPos!", 74 | "map_using_manual_zones": "Šī karte izmanto manuālās zonas", 75 | "saved_custom_respawnpos": "Saglabāts pielāgots sākuma zonas RespawnPos!", 76 | "not_inside_startzone": "Tu neesi sākuma zonā!", 77 | 78 | //styles 79 | "styles_list": "Stils {0}. {lime}{1}", 80 | "style_example": "piemērs: {lime}/style 1 vai lowgravity", 81 | "style_set": "Stils iestatīts uz: {lime}{0}", 82 | "style_not_found": "Stils {0} neeksistē", 83 | "styles_disabled": "Stili šobrīd ir izslēgti uz šī servera", 84 | "styles_not_supported": "Stili šobrīd nav atbalstīti lokālajos rezultātos :(", 85 | 86 | //checkpoints 87 | "checkpoint_set": "{0} iestatīts! {lime}#{1}", 88 | "no_checkpoint_set": "Nav iestatīts neviens {0}!", 89 | "cant_use_checkpoint": "{lightred}Nevar izmantot {0} kamēr taimeris ir ieslēgts, izmanto {default}!timer", 90 | "cant_use_checkpoint_in_air": "{lightred}Nevar iestatīt {0} esot gaisā", 91 | "used_checkpoint": "Teleportēts uz nākamo {0}", 92 | "used_recent_checkpoint": "Teleportēts uz nesenāko {0}", 93 | "used_previous_checkpoint": "Teleportēts uz iepriekšējo {0}", 94 | 95 | "goto_player": "Teleportējos pie {lime}{0}", 96 | "goto_player_not_found": "{lightred}Spēlētājs nav atrasts! Ja vārds satur atstarpes, mēģini {lime}!goto 'vārds uzvārds'", 97 | 98 | //jumpstats 99 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 100 | "js_msg2": "{grey}Augstums: {lime}{0}{grey} | Platums: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sinhronizācija: {lime}{3}%", 101 | 102 | //ad messages 103 | "ad_see_all_commands": "{primary}Raksti !sthelp{default} lai redzētu visas komandas!", 104 | "ad_replay_pb": "Raksti {primary}!replaypb{default} lai skatītos savu labāko skrējienu!", 105 | "ad_replay_sr": "Raksti {primary}!replay vai {primary}!replaysr{default} lai skatītos SR atkārtojumu uz {primary}{current_map}{default}!", 106 | "ad_replay_top": "Raksti {primary}!replaytop <1-10>{default} lai skatītos top skrējienu uz {primary}{current_map}{default}!", 107 | "ad_replay_bonus": "Raksti {primary}!replaybonus <1-10> (vai !replayb){default} lai skatītos top skrējienu uz bonusa posma{default}!", 108 | "ad_replay_bonus_pb": "Raksti {primary}!replaybonuspb (vai !replaybpb){default} lai skatītos savu labāko bonusa skrējienu{default}!", 109 | "ad_points": "Raksti {primary}!points{default} lai redzētu top 10 spēlētājus ar visvairāk punktiem!", 110 | "ad_respawn": "Raksti {primary}!r{default} lai respawnotos sākumā!", 111 | "ad_start_pos": "Raksti {primary}!setresp (vai !startpos){default} lai saglabātu pielāgotu respawn punktu sākuma zonā!", 112 | "ad_top": "Raksti {primary}!top{default} lai redzētu top 10 spēlētājus kartē {primary}{current_map}{default}!", 113 | "ad_rank": "Raksti {primary}!rank{default} lai redzētu savu PB un ranku!", 114 | "ad_save_loc": "Raksti {primary}!saveloc{default} lai saglabātu jaunu lokāciju!", 115 | "ad_cp": "Raksti {primary}!cp{default} lai iestatītu jaunu kontrolpunktu!", 116 | "ad_load_loc": "Raksti {primary}!loadloc{default} lai ielādētu pēdējo lokāciju!", 117 | "ad_tp": "Raksti {primary}!tp{default} lai teleportētos uz pēdējo kontrolpunktu!", 118 | "ad_goto": "Raksti {primary}!goto {default} lai teleportētos pie spēlētāja!", 119 | "ad_fov": "Raksti {primary}!fov <0-140>{default} lai mainītu skatījuma leņķi!", 120 | "ad_sounds": "Raksti {primary}!sounds{default} lai pārslēgtu taimera skaņas!", 121 | "ad_hud": "Raksti {primary}!hud{default} lai pārslēgtu HUD!", 122 | "ad_keys": "Raksti {primary}!keys{default} lai pārslēgtu HUD taustiņus!", 123 | "ad_styles": "Raksti {primary}!styles{default} lai redzētu visus pieejamos stilus!", 124 | "ad_jumpstats": "Raksti {primaryChatColor}!jumpstats{default} lai pārslēgtu JumpStats!", 125 | 126 | //other 127 | "command_cooldown": "Command is on cooldown. Chill...", 128 | "error_occured": "{lightred}Radās kļūda.", 129 | "info_version": "Šis serveris darbojas ar SharpTimer v{0}", 130 | "info_os": "OS: {0}", 131 | "info_runtime": "Runtime: {0}", 132 | "connect_message": "Spēlētājs {red}{0} {default}pievienojās!", 133 | "connected_message": "Spēlētājs {red}{0} {default}pievienojās {1}. reizi!", 134 | "connected_message_first": "Spēlētājs {red}{0} {default}pievienojās pirmo reizi!", 135 | "disconnect_message": "Spēlētājs {red}{0} {default}pameta serveri!" 136 | } 137 | -------------------------------------------------------------------------------- /lang/nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Tid: [{lime}{0}{default}] {1}", 6 | "timer_style": "Stil: [{lime}{0}{default}]", 7 | "stop_using_timer": "Stopp din tidtaker med bruk av {lime}!timer{default} først!", 8 | "timer_enabled": "Tidtaker: {green}På", 9 | "timer_disabled": "Tidtaker: {red}Av", 10 | "timer_cancelled": "Tidtaker kansellert på grunn av ulovlig skip forsøk", 11 | "timer_reset": "Du ble tilbakestilt på grunn av ulovlig skip forsøk", 12 | 13 | //records 14 | "no_records_available": "Ingen rekorder tilgjengelig for {0}", 15 | "no_records_available_bonus": "Ingen rekorder tilgjengelig for Bonus {0} på {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}satt en ny SR!", 18 | "new_server_record_bonus": "{lime}{0} {white}satt en ny Bonus {1} SR!", 19 | "new_pb_record": "{lime}{0} {white}satt en ny Kart PB!", 20 | "new_pb_record_bonus": "{lime}{0} {white}satt en ny Bonus {1} PB!", 21 | "map_finish": "{lime}{0} {white}fullførte kartet!", 22 | "map_finish_bonus": "{lime}{0} {white}fullførte Bonusen {1}!", 23 | "map_finish_rank": "Rang: [{lime}{0}{default}] Ganger Fullført: [{lime}{1}{default}]", 24 | "top10_records": "Top 10 {0} Recorder for {1}:", 25 | "top10_records_bonus": "Top 10 {0} Recorder for Bonus {1} on {2}:", 26 | 27 | //stages 28 | "invalid_bonus_stage": "Tast inn et gyldig bonusstadium, for eksempel: {lime}!topbonus 1", 29 | "invalid_bonus_rb": "Tast inn et gyldig bonusstadium, for eksempel: {lime}!rb ", 30 | "stages_unavalible": "Stadium utilgjengelig", 31 | "stages_unavalible_respawnpos": "{lightred}Ingen RespawnStagePos med indeks {0} funnet for gjeldende kartet!", 32 | "stages_enter_valid": "Tast inn et gyldig stadium, for eksempel: {lime}!stage ", 33 | "map_no_stages": "{lightred}Gjeldende kartet har ingen stadium!", 34 | 35 | //rank 36 | "current_rank": "Du er for tiden {0}{1}{lime}", 37 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 38 | "current_pb": "Din nåværende PB på {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 39 | "current_bonus_pb": "Din nåværende PB på {lime}Bonus {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_sr": "Nåværende Server Rekord på {lime}{0}{white}:", 41 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 42 | "reached_max_free": "Du har nådd dine maksimale gratispoeng belønninger på {lime}{0}{default}!", 43 | "gained_points": "{lime}{0} {default}oppnådde {green}+{1} {default}Poeng {grey}({2})", 44 | "top_10_points": "Top 10 Spillere med mest poeng:", 45 | "top_10_points_list": "#{0}: {lime}{1} {default}: {lime}{2} {default}poeng", 46 | 47 | //replay 48 | "no_replay": "Ingen repetisjon spilles for øyeblikket", 49 | "end_your_replay": "Avslutt den nåværende reprisen først {lime}!stopreplay", 50 | "available_replay_cmds": "Tilgjengelig repetisjon kommandoer: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 51 | "no_sr_replay": "Ingen Server Rekord og spille av", 52 | "replaying_server_top": "Spiller av Server Top {0}, skriv {lime}!stop eller {lime}!stopreplay {default}for å slutte reprisen", 53 | "replaying_pb": "Spiller av din PB, skriv {lime}!stop eller {lime}!stopreplay {default}for å slutte reprisen", 54 | "ending_replay": "Slutter reprisen", 55 | "replay_corrupt": "Den forespurte reprisen ser ut til å være ødelagt", 56 | "replay_dont_exist": "Den forespurte reprisen eksisterer ikke", 57 | 58 | //settings 59 | "hud_shown": "Hud er nå: {green}Vist", 60 | "hud_hidden": "Hud er nå: {red}Gjemt", 61 | "keys_shown": "Keys er nå: {green}Vist", 62 | "keys_hidden": "Keys er nå: {red}Gjemt", 63 | "jumpstats_shown": "Hoppstatistikk er nå: {green}Vist", 64 | "jumpstats_hidden": "Hoppstatistikk er nå: {red}Gjemt", 65 | "sounds_on": "Lyder er nå: {green}PÅ", 66 | "sounds_off": "Lyder er nå: {red}AV", 67 | 68 | //zones 69 | "no_respawnpos": "{lightred}Ingen RespawnPos funnet for gjeldende kart!", 70 | "no_respawnpos_bonus": "{lightred}Ingen RespawnBonusPos funnet for gjeldende kart!", 71 | "no_respawnpos_bonus_index": "{lightred}Ingen RespawnBonusPos med indeks {0} funnet for gjeldende kart!", 72 | "no_endpos": "{lightred}Ingen EndPos funnet for gjeldende kart!", 73 | "map_using_manual_zones": "gjeldende kart bruker manuelle soner", 74 | "saved_custom_respawnpos": "Lagret egendefinert startsone RespawnPos!", 75 | "not_inside_startzone": "Du er ikke i startsonen!", 76 | 77 | //styles 78 | "styles_list": "Stil {0}. {lime}{1}", 79 | "style_example": "eksempel: {lime}/style 1 eller lowgravity", 80 | "style_set": "Stil satt til: {lime}{0}", 81 | "style_not_found": "Stil {0} eksisterer ikke", 82 | "styles_disabled": "Stiler er for øyeblikket deaktivert på denne serveren", 83 | "styles_not_supported": "Stiler støttes for øyeblikket ikke på lokale rekorder", 84 | 85 | //checkpoints 86 | "checkpoint_set": "{0} satt! {lime}#{1}", 87 | "no_checkpoint_set": "Ingen {0} satt!", 88 | "cant_use_checkpoint": "{lightred}Kan ikke bruke {0} mens tidtaker er på, bruk {default}!timer", 89 | "cant_use_checkpoint_in_air": "{lightred}Kan ikke bruke {0} Mens i lufta", 90 | "used_checkpoint": "Teleportert til neste {0}", 91 | "used_recent_checkpoint": "Teleportert til mest nylig {0}", 92 | "used_previous_checkpoint": "Teleportert til forrige {0}", 93 | 94 | "goto_player": "Teleporterer til {lime}{0}", 95 | "goto_player_not_found": "{lightred}Finner ikke spillernavnet! Hvis navnet inneholder mellomrom, prøv {lime}!goto 'et navn'", 96 | 97 | //jumpstats 98 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 99 | "js_msg2": "{grey}Høyde: {lime}{0}{grey} | Bredde: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sync: {lime}{3}%", 100 | 101 | //ad messages 102 | "ad_see_all_commands": "{primary}Skriv !sthelp{default} for å se alle kommandoer!", 103 | "ad_replay_pb": "Skriv {primary}!replaypb{default} for å se en reprise av ditt personlige rekord!", 104 | "ad_replay_sr": "Skriv {primary}!replay eller {primary}!replaysr{default} for å se en reprise av SR på {primary}{current_map}{default}!", 105 | "ad_replay_top": "Skriv {primary}!replaytop <1-10>{default} for å se en reprise av et toppløp på {primary}{current_map}{default}!", 106 | "ad_replay_bonus": "Skriv {primary}!replaybonus <1-10> (eller !replayb){default} for å se en reprise av et toppløp på en bonusstadium{default}!", 107 | "ad_replay_bonus_pb": "Skriv {primary}!replaybonuspb (eller !replaybpb){default} for å se en reprise av din personlige rekord på en bonusstadium{default}!", 108 | "ad_points": "Skriv {primary}!points{default} for å se de top 10 spillerne med flest poeng", 109 | "ad_respawn": "Skriv {primary}!r{default} for å starte på nytt!", 110 | "ad_start_pos": "Skriv {primary}!setresp (eller !startpos){default} for å lagre et tilpasset gjenopprettingspunkt i startutløseren!", 111 | "ad_top": "Skriv {primary}!top{default} for å se de 10 beste spillerne på {primary}{current_map}{default}!", 112 | "ad_rank": "Skriv {primary}!rank{default} for å se din nåværende PB og rangering!", 113 | "ad_save_loc": "Skriv {primary}!saveloc{default} for å lagre en ny lokasjon!", 114 | "ad_cp": "Skriv {primary}!cp{default} for å sette et nytt sjekkpunkt!", 115 | "ad_load_loc": "Skriv {primary}!loadloc{default} for å laste din siste plasseringen!", 116 | "ad_tp": "Skriv {primary}!tp{default} for å teleportere til ditt siste sjekkpunkt!", 117 | "ad_goto": "Skriv {primary}!goto {default} for å teleportere til en spiller!", 118 | "ad_fov": "Skriv {primary}!fov <0-140>{default} for å endre synsfeltet ditt!", 119 | "ad_sounds": "Skriv {primary}!sounds{default} for å veksle tidtaker lyd!", 120 | "ad_hud": "Skriv {primary}!hud{default} for å veksle tidtaker hud!", 121 | "ad_keys": "Skriv {primary}!keys{default} for å veksle hud taster!", 122 | "ad_styles": "Skriv {primary}!styles{default} for å liste opp alle tilgjengelige stiler!", 123 | "ad_jumpstats": "Skriv {primaryChatColor}!jumpstats{default} for å veksle JumpStats!", 124 | 125 | //other 126 | "command_cooldown": "Kommandoen er på nedkjøling. Chill...", 127 | "error_occured": "{lightred}Feil oppstod.", 128 | "info_version": "Denne serveren kjører SharpTimer v{0}", 129 | "info_os": "OS: {0}", 130 | "info_runtime": "Kjøretid: {0}", 131 | "connect_message": "Spiller {red}{0} {default}koblet til!", 132 | "connected_message": "Spiller {red}{0} {default}koblet til for den {1} gang!", 133 | "connected_message_first": "Spiller {red}{0} {default}koblet til for første gang!", 134 | "disconnect_message": "Spiller {red}{0} {default}frakoblet!" 135 | } 136 | -------------------------------------------------------------------------------- /lang/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Time: [{lime}{0}{default}] {1}", 6 | "timer_style": "Style: [{lime}{0}{default}]", 7 | "stop_using_timer": "Aby przestac naliczac czas wpisz: {lime}!timer{default!", 8 | "timer_enabled": "Timer: {green}Enabled", 9 | "timer_disabled": "Timer: {red}Disabled", 10 | "timer_cancelled": "Timer zostal wylaczony z powodu proby oszukiwania!", 11 | "timer_reset": "Timer zostal zresetowany z powodu proby oszukiwania!", 12 | 13 | //records 14 | "no_records_available": "Brak dostepnych rekordow dla {0}", 15 | "no_records_available_bonus": "Brak dostepnych rekordow dla bonusu {0} na {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}ustanowil nowy SR!", 18 | "new_server_record_bonus": "{lime}{0} {white}ustanowil nowy Bonus {1} SR!", 19 | "new_pb_record": "{lime}{0} {white}ustanowil nowy PB mapy!", 20 | "new_pb_record_bonus": "{lime}{0} {white}ustanowil nowy Bonus {1} PB!", 21 | "map_finish": "{lime}{0} {white}ukonczyl mape!", 22 | "map_finish_bonus": "{lime}{0} {white}ukonczyl bonus {1}!", 23 | "map_finish_rank": "Ranga: [{lime}{0}{default}] Ukonczono: [{lime}{1}{default}]", 24 | "top10_records": "Top 10 {0} rekordow dla {1}:", 25 | "top10_records_bonus": "Top 10 {0} rekordow dla Bonus {1} na {2}:", 26 | 27 | //stages 28 | "invalid_bonus_stage": "Wprowadz prawidlowy etap bonusu np: {lime}!topbonus 1", 29 | "invalid_bonus_rb": "Wprowadz prawidlowy etap bonusu np: {lime}!rb ", 30 | "stages_unavalible": "Etapy niedostepne", 31 | "stages_unavalible_respawnpos": "{lightred}Brak RespawnStagePos z indexem {0} dla obecnej mapy!", 32 | "stages_enter_valid": "Podaj prawidlowy etap np: {lime}!stage ", 33 | "map_no_stages": "{lightred}Obecna mapa nie posiada etapow!", 34 | 35 | //rank 36 | "current_rank": "Twoja obecna ranga to: {0}{1}{lime}", 37 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 38 | "current_pb": "Twoj obecny PB na mapie: {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 39 | "current_bonus_pb": "Twoj obecny PB na: {lime}Bonus {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_sr": "Obecny rekord serwera: {lime}{0}{white}:", 41 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 42 | "reached_max_free": "Osiagnales maksymalna liczbe darmowych punktow w wysokosci: {lime}{0}{default}!", 43 | "gained_points": "{lime}{0} {default}zdobyłeś {green}+{1} {default}punkty {grey}({2})", 44 | "top_10_points": "10 najlepszych graczy z największą liczbą punktów:", 45 | "top_10_points_list": "#{0}: {lime} {1} {default}: {lime} {2} {default} punkty", 46 | 47 | //replay 48 | "no_replay": "Brak powtorki!", 49 | "end_your_replay": "Pierw zakoncz obecna potworke komenda: {lime}!stopreplay", 50 | "available_replay_cmds": "Komendy zwiazane z powtorkami: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 51 | "no_sr_replay": "Brak powtorki z rekordu serwera!", 52 | "replaying_server_top": "Odtwarzanie powtorki z top serwera {0} wpisz {lime}!stop lub {lime}!stopreplay {default}aby wylaczyc powtorke", 53 | "replaying_pb": "Odtwarzanie powtorki PB. Wpisz {lime}!stop lub {lime}!stopreplay {default}aby wylaczyc powtorke", 54 | "ending_replay": "Zakonczanie powtorki!", 55 | "replay_corrupt": "Ta powtorka wydaje sie byc zepsuta!", 56 | "replay_dont_exist": "Ta powtorka nie istnieje!", 57 | 58 | //settings 59 | "hud_shown": "Hud zostal: {green}Pokazane", 60 | "hud_hidden": "Hud zostal: {red}Ukryte", 61 | "keys_shown": "Klawisze sa teraz: {green}Pokazane", 62 | "keys_hidden": "Klawisze sa teraz: {red}Ukryte", 63 | "jumpstats_shown": "Statystyki skokow zostaly: {green}Pokazane", 64 | "jumpstats_hidden": "Statystyki skokow zostaly: {red}Ukryte", 65 | "sounds_on": "Dzwieki zostaly: {green}Wlaczone", 66 | "sounds_off": "Dzwieki zostaly: {red}Wylaczone", 67 | 68 | //zones 69 | "no_respawnpos": "{lightred}Brak RespawnPos dla tej mapy!", 70 | "no_respawnpos_bonus": "{lightred}Nie znaleziono RespawnBonusPos dla tej mapy!", 71 | "no_respawnpos_bonus_index": "{lightred}Brak RespawnBonusPos z indexem {0}!", 72 | "no_endpos": "{lightred}Brak Endpos dla tej mapy!", 73 | "map_using_manual_zones": "Obecna mapa uzywa manualnie skonfigurowanych stref!", 74 | "saved_custom_respawnpos": "Zapisano niestandardowy Respawnpos!", 75 | "not_inside_startzone": "Nie jestes w startzone!", 76 | 77 | //styles 78 | "styles_list": "Styl {0}. {lime}{1}", 79 | "style_example": "Przyklad {lime}/style 1 lub lowgravity", 80 | "style_set": "Ustawiono styl na: {lime}{0}", 81 | "style_not_found": "Styl {0} nie istnieje", 82 | "styles_disabled": "Style sa obecnie wylaczone na tym serwerze", 83 | "styles_not_supported": "Style obecnie nie sa wspierane na lokalnych rekordach :(", 84 | 85 | //checkpoints 86 | "checkpoint_set": "{0} Ustawiono! {lime}#{1}", 87 | "no_checkpoint_set": "Nie {0} zostal ustawiony!", 88 | "cant_use_checkpoint": "{lightred}Nie mozesz uzywac {0} kiedy timer jest wlaczony! Uzyj {default}!timer", 89 | "cant_use_checkpoint_in_air": "{lightred}Nie mozna ustawic {0} kiedy jestes w powietrzu", 90 | "used_checkpoint": "Przeniesiono do nastepnego {0}", 91 | "used_recent_checkpoint": "Przeniesiono do ostatniego {0}", 92 | "used_previous_checkpoint": "Przeniesiono do poprzedniego {0}", 93 | 94 | "goto_player": "Przeniesiono do {lime}{0}", 95 | "goto_player_not_found": "{lightred}Gracz pod dana nazwa nie zostal znaleziony. Jezeli nazwa posiada spacje sprobuj uzyc: {lime}!goto 'some name'", 96 | 97 | //jumpstats 98 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 99 | "js_msg2": "{grey}Height: {lime}{0}{grey} | Width: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sync: {lime}{3}%", 100 | 101 | //other 102 | "command_cooldown": "Odczekaj zanim ponownie skorzystasz z komendy!", 103 | "error_occured": "{lightred}Wystapil blad.", 104 | "info_version": "Ten serwer uzywa SharpTimer w wersji v{0}", 105 | "info_os": "System: {0}", 106 | "info_runtime": "Czas dzialania: {0}", 107 | "connect_message": "Gracz {red}{0} {default}połączony!", 108 | "connected_message": "Gracz {red}{0} {default}połączył się {1} raz!", 109 | "connected_message_first": "Gracz {red}{0} {default}połączył się po raz pierwszy!", 110 | "disconnect_message": "Gracz {red}{0} {default}rozłączył się!" 111 | } 112 | -------------------------------------------------------------------------------- /lang/sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Čas: [{lime}{0}{default}] {1}", 6 | "timer_style": "Štýl: [{lime}{0}{default}]", 7 | "stop_using_timer": "Zastavte svoj časovač pomocou {lime}!timer{default} naprv!", 8 | "timer_enabled": "Časovač: {green}Zapnutý", 9 | "timer_disabled": "Časovač: {red}Vypnutý", 10 | "timer_cancelled": "Časovač bol zrušený z dôvodu nelegálneho pokusu o preskočenie", 11 | "timer_reset": "Resetovali ste sa kvôli nelegálnemu pokusu o preskočenie", 12 | 13 | //records 14 | "no_records_available": "Pre {0} nie sú dostupné žiadne záznamy", 15 | "no_records_available_bonus": "Pre bonus {0} dňa {1} nie sú k dispozícii žiadne záznamy", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}nastavil nový serverový rekord!", 18 | "new_server_record_bonus": "{lime}{0} {white}nastavil nový serverový rekord na mape {1} (Bonus)!", 19 | "new_pb_record": "{lime}{0} {white}získal nový najlepší čas hráča!", 20 | "new_pb_record_bonus": "{lime}{0} {white}získal nový nalepší čas hráča na mape {1} (Bonus)!", 21 | "map_finish": "{lime}{0} {white}dokončil mapu!", 22 | "map_finish_bonus": "{lime}{0} {white}dokončil Bonus {1}!", 23 | "map_finish_rank": "Hodnosť: [{lime}{0}{default}] Dokončené: [{lime}{1}{default}]", 24 | "top10_records": "Top 10 {0} rekordy pre {1}:", 25 | "top10_records_bonus": "Top 10 {0} rekordy pre bonus {1} na {2}:", 26 | 27 | //stages 28 | "invalid_bonus_stage": "Zadajte platný bonusový stupeň, napr.: {lime}!topbonus 1", 29 | "invalid_bonus_rb": "Zadajte platnú bonusovú fázu, napr.: {lime}!rb ", 30 | "stages_unavalible": "Etapy nedostupné", 31 | "stages_unavalible_respawnpos": "{lightred}Pre aktuálnu mapu sa nenašlo žiadne RespawnStagePos s indexom {0}!", 32 | "stages_enter_valid": "Zadajte platnú fázu, napr.: {lime}!stage ", 33 | "map_no_stages": "{lightred}Aktuálna mapa nemá žiadne fázy!", 34 | 35 | //rank 36 | "current_rank": "Momentálne ste {0}{1}{lime}", 37 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 38 | "current_pb": "Vaša aktuálna PB na {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 39 | "current_bonus_pb": "Vaša aktuálna PB na {lime}Bonus {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_sr": "Aktuálny záznam servera na {lime}{0}{white}:", 41 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 42 | "reached_max_free": "Dosiahli ste maximálny počet bezplatných odmien vo výške {lime}{0}{default}!", 43 | 44 | //replay 45 | "no_replay": "Momentálne sa neprehráva žiadne prehrávanie", 46 | "end_your_replay": "Najprv ukončite svoje aktuálne prehrávanie {lime}!stopreplay", 47 | "available_replay_cmds": "Dostupné replay príkazy: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{predvolené}", 48 | "no_sr_replay": "Žiadny záznam servera na prehratie!", 49 | "replaying_server_top": "Prehrávanie Top Server Top {0} napíšte {lime}!stop alebo {lime}!stopreplay {default}, aby ste ukončili prehrávanie", 50 | "replaying_pb": "Prehrávanie PB typu {lime}!stop alebo {lime}!stopreplay {default}, aby ste ukončili prehrávanie", 51 | "ending_replay": "Ukončenie opakovaného prehrávania!", 52 | "replay_corrupt": "Zdá sa, že požadované prehratie je poškodené", 53 | "replay_dont_exist": "Požadované prehratie neexistuje", 54 | 55 | //settings 56 | "hud_shown": "Hud je práve: {green}Zobrazené", 57 | "hud_hidden": "Hud je práve: {red}Skryté", 58 | "keys_shown": "Keys je práve: {green}Zobrazené", 59 | "keys_hidden": "Keys je práve: {red}Skryté", 60 | "jumpstats_shown": "Jump Stats sú práve: {green}Zobrazené", 61 | "jumpstats_hidden": "Jump Stats sú práve: {red}Skryté", 62 | "sounds_on": "Zvuky sú práve: {green}Zapnuté", 63 | "sounds_off": "Zvuky sú práve: {red}Vypnuté", 64 | 65 | //zones 66 | "no_respawnpos": "{lightred}Pre aktuálnu mapu sa nenašlo žiadne RespawnPos!", 67 | "no_respawnpos_bonus": "{lightred}Pre aktuálnu mapu sa nenašlo žiadne RespawnBonusPos!", 68 | "no_respawnpos_bonus_index": "{lightred}Pre aktuálnu mapu sa nenašlo žiadne RespawnBonusPos s indexom {0}!", 69 | "no_endpos": "{lightred}Pre aktuálnu mapu sa nenašlo žiadne koncové miesto!", 70 | "map_using_manual_zones": "Aktuálna mapa používa manuálne zóny", 71 | "saved_custom_respawnpos": "Uložené vlastné RespawnPos počiatočnej zóny!", 72 | "not_inside_startzone": "Nie ste v štartovacej zóne!", 73 | 74 | //styles 75 | "styles_list": "Štýl {0}. {lime}{1}", 76 | "style_example": "príklad: {lime}/style 1", 77 | "style_set": "Štýl nastavený na: {lime}{0}", 78 | "style_not_found": "Štýl {0} neexistuje", 79 | "styles_disabled": "Štýly sú momentálne na tomto serveri zakázané", 80 | "styles_not_supported": "Štýly momentálne nie sú podporované na miestnych záznamoch :(", 81 | 82 | //checkpoints 83 | "checkpoint_set": "{0} nastavené! {lime}#{1}", 84 | "no_checkpoint_set": "Nič {0} nenastavené!", 85 | "cant_use_checkpoint": "{lightred}Keď je časovač zapnutý, nemožno použiť {0}, použite {default}!timer", 86 | "cant_use_checkpoint_in_air": "{lightred}Vo vzduchu nie je možné nastaviť {0}", 87 | "used_checkpoint": "Teleportované do nasledujúceho {0}", 88 | "used_recent_checkpoint": "Teleportované na najnovšie {0}", 89 | "used_previous_checkpoint": "Teleportované do predchádzajúceho {0}", 90 | 91 | "goto_player": "Teleportuje sa do {lime}{0}", 92 | "goto_player_not_found": "{lightred}Meno hráča sa nenašlo! Ak názov obsahuje medzery, skúste {lime}!goto 'nejaký názov'", 93 | 94 | //jumpstats 95 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 96 | "js_msg2": "{grey}Výška: {lime}{0}{grey} | Šírka: {lime}{1}{grey} | WT: {lime}{2}{grey} | Synchronizácia: {lime}{3} %", 97 | 98 | //other 99 | "command_cooldown": "Príkaz je v režime cooldown. Kľud...", 100 | "error_occured": "{lightred}Vyskytla sa chyba.", 101 | "info_version": "Tento server používa SharpTimer v{0}", 102 | "info_os": "OS: {0}", 103 | "info_runtime": "Runtime: {0}" 104 | } 105 | -------------------------------------------------------------------------------- /lang/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "{lime}SharpTimer ●{white}", 3 | 4 | //timer 5 | "timer_time": "Tid: [{lime}{0}{default}] {1}", 6 | "timer_style": "Style: [{lime}{0}{default}]", 7 | "stop_using_timer": "Stäng av din timer med {lime}!timer{default} först!", 8 | "timer_enabled": "Timer: {green}Aktiverad", 9 | "timer_disabled": "Timer: {red}Inaktiverad", 10 | "timer_cancelled": "Timer avbröts på grund av otillåtet överhoppningsförsök", 11 | "timer_reset": "Du har återställts på grund av ett otillåtet överhoppningsförsök", 12 | 13 | //records 14 | "no_records_available": "Inga rekord tillgängliga för {0}", 15 | "no_records_available_bonus": "Inga rekord tillgängliga för Bonus {0} på {1}", 16 | "records_map": "#{0}: {lime}{1} {default}- {2} {lime}{3}", 17 | "new_server_record": "{lime}{0} {white}tog ett nytt SR!", 18 | "new_server_record_bonus": "{lime}{0} {white}tog ett nytt Bonus {1} SR!", 19 | "new_pb_record": "{lime}{0} {white}tog ett nytt Map PB!", 20 | "new_pb_record_bonus": "{lime}{0} {white}tog ett nytt Bonus {1} PB!", 21 | "map_finish": "{lime}{0} {white}klarade av mappen!", 22 | "map_finish_bonus": "{lime}{0} {white}klarade av Bonus {1}!", 23 | "map_finish_rank": "Rank: [{lime}{0}{default}] Gånger Klarad: [{lime}{1}{default}]", 24 | "top10_records": "Top 10 {0} Rekord for {1}:", 25 | "top10_records_bonus": "Top 10 {0} Rekord för Bonus {1} on {2}:", 26 | 27 | //stages 28 | "invalid_bonus_stage": "Ange ett giltigt Bonus stage t.ex: {lime}!topbonus 1", 29 | "invalid_bonus_rb": "Ange ett giltigt Bonus stage t.ex: {lime}!rb ", 30 | "stages_unavalible": "Stages är inte tillgängliga", 31 | "stages_unavalible_respawnpos": "{lightred}ingen RespawnStagePos med index {0} hittad för denna karta!", 32 | "stages_enter_valid": "Ange ett giltigt stage t.ex: {lime}!stage ", 33 | "map_no_stages": "{lightred}Nuvarande karta har inga stages!", 34 | 35 | //rank 36 | "current_rank": "Du är rank {0}{1}{lime}", 37 | "current_rank_points": "{default}({lime}{0}{default}) [{lime}{1}{default}]", 38 | "current_pb": "Ditt nuvarande PB på {lime}{0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 39 | "current_bonus_pb": "Ditt nuvarande PB på {lime}Bonus {0}{default}: {lime}{1}{default} [{lime}{2}{default}]", 40 | "current_sr": "Nuvarande Server Rekord på {lime}{0}{white}:", 41 | "current_sr_player": "{lime}{0} {white}- {lime}{1}", 42 | "reached_max_free": "Du har nått dina maximala gratispoäng av {lime}{0}{default}!", 43 | "gained_points": "{lime}{0} {default}fick {green}+{1} {default}Poäng {grey}({2})", 44 | "top_10_points": "Topp 10 Spelare med mest poäng:", 45 | "top_10_points_list": "#{0}: {lime}{1} {default}: {lime}{2} {default}poäng", 46 | 47 | //replay 48 | "no_replay": "Ingen Replay spelas just nu", 49 | "end_your_replay": "Avsluta din nuvarande replay först {lime}!stopreplay", 50 | "available_replay_cmds": "Tillgängliga replay cmds: {lime}!replaypb{default} | {lime}!replaytop <1-10>{default} | {lime}!replaysr{default}", 51 | "no_sr_replay": "Inga Server Rekord att spela upp!", 52 | "replaying_server_top": "Uppspelar Server Top {0} skriv {lime}!stop eller {lime}!stopreplay {default}för att avsluta replay", 53 | "replaying_pb": "Uppspelar ditt PB skriv {lime}!stop eller {lime}!stopreplay {default}för att avsluta replay", 54 | "ending_replay": "Avslutar Replay!", 55 | "replay_corrupt": "Den begärda replay verkar vara korrupt", 56 | "replay_dont_exist": "Den begärda replay finns inte", 57 | 58 | //settings 59 | "hud_shown": "HUD är nu: {green}Synlig", 60 | "hud_hidden": "HUD är nu: {red}Gömd", 61 | "keys_shown": "Tangenter är nu: {green}Synliga", 62 | "keys_hidden": "Tangenter är nu: {red}Gömda", 63 | "jumpstats_shown": "Jump Stats är nu: {green}Synliga", 64 | "jumpstats_hidden": "Jump Stats är nu: {red}Gömda", 65 | "sounds_on": "Ljud är nu: {green}PÅ", 66 | "sounds_off": "Ljud är nu: {red}AV", 67 | 68 | //zones 69 | "no_respawnpos": "{lightred}Ingen hittades för denna karta!", 70 | "no_respawnpos_bonus": "{lightred}Ingen RespawnBonusPos hittades för denna karta!", 71 | "no_respawnpos_bonus_index": "{lightred}Ingen RespawnBonusPos med index {0} hittades för denna karta!", 72 | "no_endpos": "{lightred}Ingen EndPos hittades för denna karta!", 73 | "map_using_manual_zones": "Aktuell karta använder manuella zoner", 74 | "saved_custom_respawnpos": "Sparade custom Start Zone RespawnPos!", 75 | "not_inside_startzone": "Du är inte inne i Start Zone!", 76 | 77 | //styles 78 | "styles_list": "Style {0}. {lime}{1}", 79 | "style_example": "exempel: {lime}/style 1 or lowgravity", 80 | "style_set": "Style satt till: {lime}{0}", 81 | "style_not_found": "Style {0} existerar inte", 82 | "styles_disabled": "Styles är inaktiverade på denna server", 83 | "styles_not_supported": "Styles stöds för närvarande inte på lokala rekord :(", 84 | 85 | //checkpoints 86 | "checkpoint_set": "{0} placerad! {lime}#{1}", 87 | "no_checkpoint_set": "Inga {0} är placerade!", 88 | "cant_use_checkpoint": "{lightred}Kan inte använda {0} medans timer är på, använd {default}!timer", 89 | "cant_use_checkpoint_in_air": "{lightred}Kan inte sätta {0} medans du är i luften", 90 | "used_checkpoint": "Teleporterade till nästa {0}", 91 | "used_recent_checkpoint": "Teleporterade till senaste {0}", 92 | "used_previous_checkpoint": "Teleporterade till tidigare {0}", 93 | 94 | "goto_player": "Teleporterar till {lime}{0}", 95 | "goto_player_not_found": "{lightred}Namnet på spelaren hittades inte! Om namnet innehåller mellanslag, försök {lime}!goto 'spelarens namn'", 96 | 97 | //jumpstats 98 | "js_msg1": "{lime}JS: {grey} {0}: {1}{2}{grey} | Pre: {lime}{3}{grey} | Max: {lime}{4}{grey} | Strafes: {lime}{5}", 99 | "js_msg2": "{grey}Height: {lime}{0}{grey} | Width: {lime}{1}{grey} | WT: {lime}{2}{grey} | Sync: {lime}{3}%", 100 | 101 | //other 102 | "command_cooldown": "Command är på cooldown. Chilla...", 103 | "error_occured": "{lightred}Fel uppstod.", 104 | "info_version": "Den här servern kör SharpTimer v{0}", 105 | "info_os": "OS: {0}", 106 | "info_runtime": "Runtime: {0}", 107 | "connect_message": "Spelare {red}{0} {default}ansluten!", 108 | "connected_message": "Spelare {red}{0} {default}ansluten för den {1} gången!", 109 | "connected_message_first": "Spleare {red}{0} {default}ansluten för första gången!", 110 | "disconnect_message": "Spelare {red}{0} {default}lämnade!" 111 | } 112 | -------------------------------------------------------------------------------- /remote_data/rank_icons/bronze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/bronze.png -------------------------------------------------------------------------------- /remote_data/rank_icons/dia1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/dia1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/dia2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/dia2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/dia3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/dia3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/god.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/god.gif -------------------------------------------------------------------------------- /remote_data/rank_icons/gold1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/gold1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/gold2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/gold2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/gold3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/gold3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/legend1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/legend1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/legend2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/legend2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/legend3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/legend3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/master1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/master1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/master2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/master2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/master3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/master3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/plat1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/plat1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/plat2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/plat2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/plat3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/plat3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/royal1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/royal1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/royal2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/royal2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/royal3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/royal3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/silver1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/silver1.png -------------------------------------------------------------------------------- /remote_data/rank_icons/silver2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/silver2.png -------------------------------------------------------------------------------- /remote_data/rank_icons/silver3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/silver3.png -------------------------------------------------------------------------------- /remote_data/rank_icons/unranked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/remote_data/rank_icons/unranked.png -------------------------------------------------------------------------------- /remote_data/tester_bling.json: -------------------------------------------------------------------------------- 1 | { 2 | "76561198106801439": { 3 | "SmolGif": "", 4 | "BigGif": "

" 5 | }, 6 | "76561199123439655": { 7 | "SmolGif": "", 8 | "BigGif": "

" 9 | }, 10 | "76561198100544780": { 11 | "SmolGif": "", 12 | "BigGif": "

" 13 | }, 14 | "76561199138382970": { 15 | "SmolGif": "", 16 | "BigGif": "

" 17 | }, 18 | "76561198033801423": { 19 | "SmolGif": "", 20 | "BigGif": "

" 21 | }, 22 | "76561197964533560": { 23 | "SmolGif": "", 24 | "BigGif": "

" 25 | }, 26 | "76561198026105265": { 27 | "SmolGif": "", 28 | "BigGif": "

" 29 | }, 30 | "76561198798073763": { 31 | "SmolGif": "", 32 | "BigGif": "

" 33 | }, 34 | "76561197995308322": { 35 | "SmolGif": "", 36 | "BigGif": "

" 37 | }, 38 | "76561198138576368": { 39 | "SmolGif": "", 40 | "BigGif": "

" 41 | }, 42 | "76561198080084640": { 43 | "SmolGif": "", 44 | "BigGif": "

" 45 | }, 46 | "76561199386994737": { 47 | "SmolGif": "", 48 | "BigGif": "

" 49 | }, 50 | "76561198370771634": { 51 | "SmolGif": "", 52 | "BigGif": "

" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/DB/DbCommandExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Data; 2 | using System.Data.Common; 3 | 4 | namespace SharpTimer 5 | { 6 | public static class DbCommandExtensions 7 | { 8 | public static void AddParameterWithValue(this DbCommand command, string parameterName, object value) 9 | { 10 | DbParameter parameter = command.CreateParameter(); 11 | parameter.ParameterName = parameterName; 12 | parameter.Value = value; 13 | command.Parameters.Add(parameter); 14 | } 15 | public static bool GetSQLiteBool(this DbDataReader reader, string columnName) 16 | { 17 | return reader.GetInt32(reader.GetOrdinal(columnName)) == 1; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/DB/Migration.cs: -------------------------------------------------------------------------------- 1 | using CounterStrikeSharp.API; 2 | using MySqlConnector; 3 | using Npgsql; 4 | using System.Data; 5 | using System.Data.Common; 6 | using System.Data.SQLite; 7 | using System.Threading.Tasks; 8 | 9 | namespace SharpTimer; 10 | 11 | public partial class SharpTimer 12 | { 13 | public void ExecuteMigrations(IDbConnection connection) 14 | { 15 | string migrationsDirectory = ""; 16 | switch (dbType) 17 | { 18 | case DatabaseType.MySQL: 19 | migrationsDirectory = ModuleDirectory + "/Database/Migrations/MySQL"; 20 | break; 21 | case DatabaseType.PostgreSQL: 22 | migrationsDirectory = ModuleDirectory + "/Database/Migrations/PostgreSQL/"; 23 | break; 24 | case DatabaseType.SQLite: 25 | migrationsDirectory = ModuleDirectory + "/Database/Migrations/SQLite/"; 26 | break; 27 | } 28 | 29 | var files = Directory.GetFiles(migrationsDirectory, "*.sql") 30 | .OrderBy(f => f); 31 | 32 | using (connection) 33 | { 34 | DbCommand? cmd = null; 35 | switch (dbType) 36 | { 37 | case DatabaseType.MySQL: 38 | cmd = new MySqlCommand(""" 39 | CREATE TABLE IF NOT EXISTS st_migrations ( 40 | id INT PRIMARY KEY AUTO_INCREMENT, 41 | version VARCHAR(255) NOT NULL 42 | ); 43 | """, (MySqlConnection)connection); 44 | break; 45 | case DatabaseType.PostgreSQL: 46 | cmd = new NpgsqlCommand(""" 47 | CREATE TABLE IF NOT EXISTS st_migrations ( 48 | id SERIAL PRIMARY KEY, 49 | version VARCHAR(255) NOT NULL 50 | ); 51 | """, (NpgsqlConnection)connection); 52 | break; 53 | case DatabaseType.SQLite: 54 | cmd = new SQLiteCommand(""" 55 | CREATE TABLE IF NOT EXISTS st_migrations ( 56 | id INTEGER PRIMARY KEY AUTOINCREMENT, 57 | version VARCHAR(255) NOT NULL 58 | ); 59 | """, (SQLiteConnection)connection); 60 | break; 61 | } 62 | 63 | using (cmd) 64 | { 65 | cmd?.ExecuteNonQuery(); 66 | } 67 | 68 | // Get the last applied migration version 69 | var lastAppliedVersion = GetLastAppliedVersion(connection); 70 | 71 | foreach (var file in files) 72 | { 73 | var version = Path.GetFileNameWithoutExtension(file); 74 | 75 | // Check if the migration has already been applied 76 | if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) <= 0) continue; 77 | var sqlScript = File.ReadAllText(file); 78 | DbCommand? cmdMigration = null; 79 | switch (dbType) 80 | { 81 | case DatabaseType.MySQL: 82 | cmdMigration = new MySqlCommand(sqlScript, (MySqlConnection)connection); 83 | break; 84 | case DatabaseType.PostgreSQL: 85 | cmdMigration = new NpgsqlCommand(sqlScript, (NpgsqlConnection)connection); 86 | break; 87 | case DatabaseType.SQLite: 88 | cmdMigration = new SQLiteCommand(sqlScript, (SQLiteConnection)connection); 89 | break; 90 | 91 | } 92 | using (cmdMigration) 93 | { 94 | cmdMigration?.ExecuteNonQuery(); 95 | } 96 | 97 | // Update the last applied migration version 98 | UpdateLastAppliedVersion(connection, version); 99 | 100 | SharpTimerDebug($"Migration \"{version}\" successfully applied."); 101 | } 102 | } 103 | } 104 | 105 | private string GetLastAppliedVersion(IDbConnection connection) 106 | { 107 | DbCommand? cmd = null; 108 | switch (dbType) 109 | { 110 | case DatabaseType.MySQL: 111 | cmd = new MySqlCommand("SELECT version FROM st_migrations ORDER BY id DESC LIMIT 1;", (MySqlConnection)connection); 112 | break; 113 | case DatabaseType.PostgreSQL: 114 | cmd = new NpgsqlCommand("SELECT version FROM st_migrations ORDER BY id DESC LIMIT 1;", (NpgsqlConnection)connection); 115 | break; 116 | case DatabaseType.SQLite: 117 | cmd = new SQLiteCommand("SELECT version FROM st_migrations ORDER BY id DESC LIMIT 1;", (SQLiteConnection)connection); 118 | break; 119 | } 120 | using (cmd) 121 | { 122 | var result = cmd?.ExecuteScalar(); 123 | return result?.ToString() ?? string.Empty; 124 | } 125 | } 126 | 127 | private void UpdateLastAppliedVersion(IDbConnection connection, string version) 128 | { 129 | DbCommand? cmd = null; 130 | switch (dbType) 131 | { 132 | case DatabaseType.MySQL: 133 | cmd = new MySqlCommand("INSERT INTO st_migrations (version) VALUES (@Version);", (MySqlConnection)connection); 134 | break; 135 | case DatabaseType.PostgreSQL: 136 | cmd = new NpgsqlCommand("INSERT INTO st_migrations (version) VALUES (@Version);", (NpgsqlConnection)connection); 137 | break; 138 | case DatabaseType.SQLite: 139 | cmd = new SQLiteCommand("INSERT INTO st_migrations (version) VALUES (@Version);", (SQLiteConnection)connection); 140 | break; 141 | 142 | } 143 | using (cmd) 144 | { 145 | cmd?.AddParameterWithValue("@Version", version); 146 | cmd?.ExecuteNonQuery(); 147 | } 148 | } 149 | } -------------------------------------------------------------------------------- /src/DB/Migrations/MySQL/001_AddStyleConstraints.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE PlayerRecords DROP PRIMARY KEY; 2 | ALTER TABLE PlayerRecords ADD CONSTRAINT pk_Records PRIMARY KEY (MapName, SteamID, Style); -------------------------------------------------------------------------------- /src/DB/Migrations/MySQL/002_AddPlayerStageTimesTable.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS PlayerStageTimes ( 2 | MapName VARCHAR(255), 3 | SteamID VARCHAR(20), 4 | PlayerName VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 5 | Stage INT, 6 | TimerTicks INT, 7 | FormattedTime VARCHAR(255), 8 | Velocity VARCHAR(255), 9 | PRIMARY KEY (MapName, SteamID, Stage) 10 | ); -------------------------------------------------------------------------------- /src/DB/Migrations/PostgreSQL/001_AddStyleConstraints.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/src/DB/Migrations/PostgreSQL/001_AddStyleConstraints.sql -------------------------------------------------------------------------------- /src/DB/Migrations/PostgreSQL/002_AddPlayerStageTimesTable.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS "PlayerStageTimes" ( 2 | "MapName" VARCHAR(255), 3 | "SteamID" VARCHAR(20), 4 | "PlayerName" VARCHAR(32), 5 | "Stage" INT, 6 | "TimerTicks" INT, 7 | "FormattedTime" VARCHAR(255), 8 | "Velocity" VARCHAR(255), 9 | PRIMARY KEY ("MapName", "SteamID", "Stage") 10 | ); -------------------------------------------------------------------------------- /src/DB/Migrations/SQLite/001_AddStyleConstraints.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Letaryat/poor-sharptimer/5c72a7870659dc4e8b9242be6bf628ec82a76df2/src/DB/Migrations/SQLite/001_AddStyleConstraints.sql -------------------------------------------------------------------------------- /src/DB/Migrations/SQLite/002_AddPlayerStageTimesTable.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS PlayerStageTimes ( 2 | MapName TEXT, 3 | SteamID TEXT, 4 | PlayerName TEXT, 5 | Stage INT, 6 | TimerTicks INT, 7 | FormattedTime TEXT, 8 | Velocity TEXT, 9 | PRIMARY KEY (MapName, SteamID, Stage) 10 | ); -------------------------------------------------------------------------------- /src/Extensions/CBaseUserCmd.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | using CounterStrikeSharp.API; 3 | using CounterStrikeSharp.API.Modules.Utils; 4 | 5 | public class CBaseUserCmd 6 | { 7 | public CBaseUserCmd(IntPtr pointer) 8 | { 9 | Handle = pointer; 10 | } 11 | 12 | public IntPtr Handle { get; set; } 13 | public float ForwardMove => GetForwardMove(); 14 | public float SideMove => GetSideMove(); 15 | public unsafe float GetForwardMove() 16 | { 17 | var ForwardMove = Unsafe.Read((void*)(Handle + 0x50)); 18 | return ForwardMove; 19 | } 20 | public unsafe float GetMouseX() 21 | { 22 | var MouseX = Unsafe.Read((void*)(Handle + 0x68)); 23 | return MouseX; 24 | } 25 | public unsafe float GetMouseY() 26 | { 27 | var MouseY = Unsafe.Read((void*)(Handle + 0x6C)); 28 | return MouseY; 29 | } 30 | public unsafe float GetSideMove() 31 | { 32 | var SideMove = Unsafe.Read((void*)(Handle + 0x54)); 33 | return SideMove; 34 | } 35 | public unsafe void DisableSideMove() 36 | { 37 | Unsafe.Write((void*)(Handle + 0x54), 0); 38 | } 39 | public unsafe void DisableForwardMove() 40 | { 41 | Unsafe.Write((void*)(Handle + 0x50), 0); 42 | } 43 | } -------------------------------------------------------------------------------- /src/Extensions/CUserCmd.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | using CounterStrikeSharp.API; 3 | using CounterStrikeSharp.API.Core; 4 | using CounterStrikeSharp.API.Modules.Utils; 5 | 6 | public class CUserCmd 7 | { 8 | public CUserCmd(IntPtr pointer) 9 | { 10 | Handle = pointer; 11 | } 12 | 13 | private Dictionary buttonNames = new Dictionary 14 | { 15 | {1, "Left Click"}, 16 | {2, "Jump"}, 17 | {4, "Crouch"}, 18 | {8, "Forward"}, 19 | {16, "Backward"}, 20 | {32, "Use"}, 21 | // 64 ?? 22 | {128, "Turn Left"}, 23 | {256, "Turn Right"}, 24 | {512, "Left"}, 25 | {1024, "Right"}, 26 | {2048, "Right Click"}, 27 | {8192, "Reload"}, 28 | // 16384 ?? 29 | // 32768 ?? 30 | {65536, "Shift"}, 31 | /* 32 | 131072 ?? 33 | 262144 ?? 34 | 524288 ?? 35 | 1048576 ?? 36 | 2097152 ?? 37 | 4194304 ?? 38 | 8388608 ?? 39 | 16777216 ?? 40 | 33554432 ?? 41 | 67108864 ?? 42 | 134217728 ?? 43 | 268435456 ?? 44 | 536870912 ?? 45 | 1073741824 ?? 46 | 2147483648 ?? 47 | 4294967296 ?? 48 | */ 49 | {8589934592, "Scoreboard"}, 50 | {34359738368, "Inspect"} 51 | }; 52 | 53 | public unsafe List GetMovementButton() 54 | { 55 | if (Handle == IntPtr.Zero) 56 | return ["None"]; 57 | 58 | nint inputs = Unsafe.Read((void*)(Handle + 0x60)); 59 | 60 | // System.Console.WriteLine(moveMent); // Use this to see the value of the button you are pressing 61 | 62 | var binary = Convert.ToString(inputs, 2); 63 | binary = binary.PadLeft(64, '0'); 64 | 65 | var movementButtons = new List(); 66 | 67 | foreach (var button in buttonNames) 68 | { 69 | if ((inputs & button.Key) == button.Key) 70 | { 71 | movementButtons.Add(button.Value); 72 | } 73 | } 74 | 75 | 76 | return movementButtons; 77 | } 78 | 79 | public IntPtr Handle { get; set; } 80 | public CBaseUserCmd BaseUserCmd => GetBaseCmd(); 81 | 82 | 83 | public unsafe CBaseUserCmd GetBaseCmd() 84 | { 85 | var baseCmd = Unsafe.Read((void*)(Handle + 0x40)); 86 | 87 | return new CBaseUserCmd(baseCmd); 88 | } 89 | public unsafe void DisableInput(IntPtr userCmd, nint value) 90 | { 91 | Unsafe.Write((void*)(userCmd + 0x50), Unsafe.Read((void*)(userCmd + 0x50)) & ~(value)); 92 | } 93 | } -------------------------------------------------------------------------------- /src/Extensions/RunCommand.cs: -------------------------------------------------------------------------------- 1 | using CounterStrikeSharp.API.Core; 2 | using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; 3 | 4 | namespace SharpTimer; 5 | 6 | public interface IRunCommand { 7 | void Hook(Func handler, HookMode mode); 8 | void Unhook(Func handler, HookMode mode); 9 | } 10 | 11 | public class RunCommandWindows : IRunCommand 12 | { 13 | public MemoryFunctionVoid _RunCommand; 14 | public RunCommandWindows() { 15 | _RunCommand = new(GameData.GetSignature("RunCommand")); 16 | } 17 | 18 | public void Hook(Func handler, HookMode mode) { 19 | _RunCommand.Hook(handler, mode); 20 | } 21 | 22 | public void Unhook(Func handler, HookMode mode) { 23 | _RunCommand.Unhook(handler, mode); 24 | } 25 | } 26 | 27 | public class RunCommandLinux : IRunCommand 28 | { 29 | public MemoryFunctionVoid _RunCommand; 30 | public RunCommandLinux() { 31 | _RunCommand = new(GameData.GetSignature("RunCommand")); 32 | } 33 | 34 | public void Hook(Func handler, HookMode mode) { 35 | _RunCommand.Hook(handler, mode); 36 | } 37 | 38 | public void Unhook(Func handler, HookMode mode) { 39 | _RunCommand.Unhook(handler, mode); 40 | } 41 | } -------------------------------------------------------------------------------- /src/Features/DiscordWebhook.cs: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 Dea Brcka 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | You should have received a copy of the GNU General Public License 13 | along with this program. If not, see . 14 | */ 15 | 16 | using System.Diagnostics.Eventing.Reader; 17 | using System.Net; 18 | using System.Text; 19 | using System.Text.Json; 20 | using System.Xml; 21 | using CounterStrikeSharp.API.Core; 22 | 23 | namespace SharpTimer 24 | { 25 | public partial class SharpTimer 26 | { 27 | private async Task GetDiscordWebhookURLFromConfigFile(string discordURLpath) 28 | { 29 | try 30 | { 31 | using JsonDocument? jsonConfig = await LoadJson(discordURLpath)!; 32 | if (jsonConfig != null) 33 | { 34 | JsonElement root = jsonConfig.RootElement; 35 | 36 | discordWebhookBotName = root.TryGetProperty("DiscordWebhookBotName", out var NameProperty) ? NameProperty.GetString()! : "SharpTimer"; 37 | discordWebhookPFPUrl = root.TryGetProperty("DiscordWebhookPFPUrl", out var PFPurlProperty) ? PFPurlProperty.GetString()! : "https://cdn.discordapp.com/icons/1196646791450472488/634963a8207fdb1b30bf909d31f05e57.webp"; 38 | discordWebhookImageRepoURL = root.TryGetProperty("DiscordWebhookMapImageRepoUrl", out var mapImageRepoUrl) ? mapImageRepoUrl.GetString()! : "https://raw.githubusercontent.com/Letaryat/poor-sharptimermappics/main/pics/"; 39 | discordPBWebhookUrl = root.TryGetProperty("DiscordPBWebhookUrl", out var PBurlProperty) ? PBurlProperty.GetString()! : ""; 40 | discordSRWebhookUrl = root.TryGetProperty("DiscordSRWebhookUrl", out var SRurlProperty) ? SRurlProperty.GetString()! : ""; 41 | discordPBBonusWebhookUrl = root.TryGetProperty("DiscordPBBonusWebhookUrl", out var PBBonusurlProperty) ? PBBonusurlProperty.GetString()! : ""; 42 | discordSRBonusWebhookUrl = root.TryGetProperty("DiscordSRBonusWebhookUrl", out var SRBonusurlProperty) ? SRBonusurlProperty.GetString()! : ""; 43 | discordWebhookFooter = root.TryGetProperty("DiscordFooterString", out var FooterProperty) ? FooterProperty.GetString()! : ""; 44 | discordWebhookRareGif = root.TryGetProperty("DiscordRareGifUrl", out var RareGifProperty) ? RareGifProperty.GetString()! : ""; 45 | discordWebhookRareGifOdds = root.TryGetProperty("DiscordRareGifOdds", out var RareGifOddsProperty) ? RareGifOddsProperty.GetInt16()! : 10000; 46 | discordWebhookColor = root.TryGetProperty("DiscordWebhookColor", out var ColorProperty) ? ColorProperty.GetInt16()! : 13369599; 47 | discordWebhookSteamAvatar = root.TryGetProperty("DiscordWebhookSteamAvatar", out var SteamAvatarProperty) ? SteamAvatarProperty.GetBoolean()! : true; 48 | discordWebhookTier = root.TryGetProperty("DiscordWebhookTier", out var TierProperty) ? TierProperty.GetBoolean()! : true; 49 | discordWebhookTimeChange = root.TryGetProperty("DiscordWebhookTimeChange", out var TimeChangeProperty) ? TimeChangeProperty.GetBoolean()! : true; 50 | discordWebhookTimesFinished = root.TryGetProperty("DiscordWebhookTimesFinished", out var TimesFinishedProperty) ? TimesFinishedProperty.GetBoolean()! : true; 51 | discordWebhookPlacement = root.TryGetProperty("DiscordWebhookPlacement", out var PlacementProperty) ? PlacementProperty.GetBoolean()! : true; 52 | discordWebhookSteamLink = root.TryGetProperty("DiscordWebhookSteamLink", out var SteamProperty) ? SteamProperty.GetBoolean()! : true; 53 | discordWebhookDisableStyleRecords = root.TryGetProperty("DiscordWebhookDisableStyleRecords", out var DisableStyleProperty) ? DisableStyleProperty.GetBoolean()! : true; 54 | } 55 | else 56 | { 57 | SharpTimerError($"DiscordWebhookUrl json was null"); 58 | } 59 | } 60 | catch (Exception ex) 61 | { 62 | SharpTimerError($"Error in GetDiscordWebhookURLFromConfigFile: {ex.Message}"); 63 | } 64 | } 65 | 66 | public async Task DiscordRecordMessage(CCSPlayerController? player, string playerName, string runTime, string steamID, string placement, int timesFinished, bool isSR = false, string timeDifference = "", int bonusX = 0) 67 | { 68 | try 69 | { 70 | string? webhookURL = "your_discord_webhook_url"; 71 | if (isSR && bonusX != 0) 72 | webhookURL = discordSRBonusWebhookUrl; 73 | else if (isSR && bonusX == 0) 74 | webhookURL = discordSRWebhookUrl; 75 | else if (!isSR && bonusX != 0) 76 | webhookURL = discordPBBonusWebhookUrl; 77 | else if (!isSR && bonusX == 0) 78 | webhookURL = discordPBWebhookUrl; 79 | 80 | if (string.IsNullOrEmpty(webhookURL) || webhookURL == "your_discord_webhook_url") 81 | { 82 | SharpTimerError($"DiscordWebhookUrl was invalid"); 83 | return; 84 | } 85 | 86 | string mapImg = await GetMapImage(bonusX); 87 | bool isFirstTime = string.IsNullOrEmpty(timeDifference); 88 | string style = GetNamedStyle(playerTimers[player!.Slot].currentStyle); 89 | 90 | using var client = new HttpClient(); 91 | 92 | var fields = new List(); 93 | 94 | if (!string.IsNullOrEmpty(currentMapName)) 95 | { 96 | fields.Add(new 97 | { 98 | name = "🗺️ Map:", 99 | value = $"{(bonusX == 0 ? currentMapName : $"{currentMapName} bonus #{bonusX}")}", 100 | inline = true 101 | }); 102 | } 103 | 104 | if (discordWebhookTier && currentMapTier != null) 105 | { 106 | fields.Add(new 107 | { 108 | name = "🔰 Tier:", 109 | value = currentMapTier, 110 | inline = true 111 | }); 112 | } 113 | 114 | if (!string.IsNullOrEmpty(runTime)) 115 | { 116 | fields.Add(new 117 | { 118 | name = "⌛ Time:", 119 | value = runTime, 120 | inline = true 121 | }); 122 | } 123 | 124 | if (discordWebhookTimeChange && !isFirstTime) 125 | { 126 | fields.Add(new 127 | { 128 | name = "⏳ Time change:", 129 | value = timeDifference, 130 | inline = true 131 | }); 132 | } 133 | 134 | if (discordWebhookPlacement && !string.IsNullOrEmpty(placement)) 135 | { 136 | fields.Add(new 137 | { 138 | name = "🎖️ Placement:", 139 | value = $"#{placement}", 140 | inline = true 141 | }); 142 | } 143 | 144 | if (discordWebhookTimesFinished) 145 | { 146 | fields.Add(new 147 | { 148 | name = "🔢 Times Finished:", 149 | value = $"{(!isFirstTime ? timesFinished : "First time!")}", 150 | inline = true 151 | }); 152 | } 153 | 154 | if (discordWebhookSteamLink && !string.IsNullOrEmpty(steamID)) 155 | { 156 | fields.Add(new 157 | { 158 | name = "🛈 SteamID:", 159 | value = $"[Profile](https://steamcommunity.com/profiles/{steamID})", 160 | inline = true 161 | }); 162 | } 163 | 164 | if (!discordWebhookDisableStyleRecords && !string.IsNullOrEmpty(style)) 165 | { 166 | fields.Add(new 167 | { 168 | name = "🛹 Style:", 169 | value = style, 170 | inline = true 171 | }); 172 | } 173 | 174 | var spacedFields = new List(); 175 | for (int i = 0; i < fields.Count; i++) 176 | { 177 | spacedFields.Add(fields[i]); 178 | if ((i + 1) % 2 == 0 && i != fields.Count - 1) 179 | { 180 | spacedFields.Add(new 181 | { 182 | name = "\u200B", 183 | value = "\u200B", 184 | inline = true 185 | }); 186 | } 187 | } 188 | if (fields.Count % 2 == 0) 189 | { 190 | spacedFields.Add(new 191 | { 192 | name = "\u200B", 193 | value = "\u200B", 194 | inline = true 195 | }); 196 | } 197 | 198 | var embed = new Dictionary 199 | { 200 | { "title", !isSR ? $"set a new Personal Best!" : $"set a new Server Record!" }, 201 | { "fields", spacedFields.ToArray() }, 202 | { "author", new { name = $"{playerName}", url = $"https://steamcommunity.com/profiles/{steamID}" } }, 203 | { "footer", new { text = discordWebhookFooter, icon_url = discordWebhookPFPUrl } }, 204 | { "image", new { url = mapImg } } 205 | }; 206 | 207 | if (discordWebhookColor != 0) 208 | embed.Add("color", discordWebhookColor); 209 | 210 | if (discordWebhookSteamAvatar) 211 | embed.Add("thumbnail", new { url = await GetAvatarLink($"https://steamcommunity.com/profiles/{steamID}/?xml=1") }); 212 | 213 | var payload = new 214 | { 215 | content = (string?)null, 216 | embeds = new[] { embed }, 217 | username = discordWebhookBotName, 218 | avatar_url = discordWebhookPFPUrl, 219 | attachments = Array.Empty() 220 | }; 221 | 222 | var json = JsonSerializer.Serialize(payload); 223 | var data = new StringContent(json, Encoding.UTF8, "application/json"); 224 | 225 | if (discordWebhookDisableStyleRecords && style != "Normal") 226 | return; 227 | 228 | HttpResponseMessage response = await client.PostAsync(webhookURL, data); 229 | 230 | if (!response.IsSuccessStatusCode) 231 | { 232 | SharpTimerError($"Failed to send message. Status code: {response.StatusCode}"); 233 | } 234 | } 235 | catch (Exception ex) 236 | { 237 | SharpTimerError($"An error occurred while sending Discord PB message: {ex.Message}"); 238 | } 239 | } 240 | 241 | public async Task GetMapImage(int bonusX = 0) 242 | { 243 | if (new Random().Next(1, discordWebhookRareGifOdds + 1) == 69) 244 | { 245 | if (string.IsNullOrEmpty(discordWebhookRareGif)) 246 | return "https://files.catbox.moe/q99x7v.gif"; 247 | else 248 | return discordWebhookRareGif; 249 | } 250 | 251 | string imageRepo = $"{discordWebhookImageRepoURL}{(bonusX == 0 ? currentMapName : $"{currentMapName}_b{bonusX}")}.jpg"; 252 | string error = $"{discordWebhookImageRepoURL}{(currentMapName!.Contains("surf_") ? "surf404" : $"{(currentMapName!.Contains("kz_") ? "kz404" : $"{(currentMapName!.Contains("bhop_") ? "bhop404" : "404")}")}")}.jpg"; 253 | try 254 | { 255 | using var client = new HttpClient(); 256 | if (!await Is404(client, imageRepo)) 257 | { 258 | return imageRepo; 259 | } 260 | else 261 | { 262 | return error; 263 | } 264 | } 265 | catch (Exception ex) 266 | { 267 | SharpTimerError($"Failed to get DiscordWebhook img. {ex.Message}"); 268 | return error; 269 | } 270 | } 271 | 272 | static async Task Is404(HttpClient client, string url) 273 | { 274 | try 275 | { 276 | var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, url)); 277 | 278 | return response.StatusCode == HttpStatusCode.NotFound; 279 | } 280 | catch (HttpRequestException) 281 | { 282 | return true; 283 | } 284 | } 285 | 286 | public async Task GetAvatarLink(string xmlUrl) 287 | { 288 | try 289 | { 290 | using var client = new HttpClient(); 291 | HttpResponseMessage response = await client.GetAsync(xmlUrl); 292 | response.EnsureSuccessStatusCode(); 293 | string xmlContent = await response.Content.ReadAsStringAsync(); 294 | 295 | var xmlDoc = new XmlDocument(); 296 | xmlDoc.LoadXml(xmlContent); 297 | 298 | XmlNode? avatarFullNode = xmlDoc.SelectSingleNode("//avatarFull"); 299 | 300 | string avatarFullLink = avatarFullNode!.InnerText.Trim(); 301 | 302 | return avatarFullLink; 303 | } 304 | catch (Exception ex) 305 | { 306 | SharpTimerError("GetAvatarLink Error occurred: " + ex.Message); 307 | return "https://cdn.discordapp.com/icons/1196646791450472488/634963a8207fdb1b30bf909d31f05e57.webp"; 308 | } 309 | } 310 | } 311 | } -------------------------------------------------------------------------------- /src/Features/Styles.cs: -------------------------------------------------------------------------------- 1 | using CounterStrikeSharp.API.Core; 2 | using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; 3 | 4 | namespace SharpTimer 5 | { 6 | public partial class SharpTimer 7 | { 8 | public void setStyle(CCSPlayerController player, int style) 9 | { 10 | AddTimer(0.1f, () => 11 | { 12 | SetNormalStyle(player); 13 | switch (style) 14 | { 15 | case 0: 16 | SetNormalStyle(player); 17 | return; 18 | case 1: 19 | SetLowGravity(player); 20 | return; 21 | case 2: 22 | SetSideways(player); 23 | return; 24 | case 3: 25 | SetOnlyW(player); 26 | return; 27 | case 4: 28 | Set400Vel(player); 29 | return; 30 | case 5: 31 | SetHighGravity(player); 32 | return; 33 | case 6: 34 | SetOnlyA(player); 35 | return; 36 | case 7: 37 | SetOnlyD(player); 38 | return; 39 | case 8: 40 | SetOnlyS(player); 41 | return; 42 | case 9: 43 | SetHalfSideways(player); 44 | return; 45 | case 10: 46 | SetFastForward(player); 47 | return; 48 | default: 49 | return; 50 | } 51 | }); 52 | } 53 | 54 | public void SetNormalStyle(CCSPlayerController player) 55 | { 56 | playerTimers[player.Slot].currentStyle = 0; // reset currentStyle 57 | playerTimers[player.Slot].changedStyle = true; 58 | player!.Pawn.Value!.GravityScale = 1f; 59 | } 60 | 61 | public void SetLowGravity(CCSPlayerController player) 62 | { 63 | playerTimers[player.Slot].currentStyle = 1; // 1 = low-gravity 64 | player!.Pawn.Value!.GravityScale = 0.5f; 65 | playerTimers[player.Slot].changedStyle = true; 66 | } 67 | public void SetHighGravity(CCSPlayerController player) 68 | { 69 | playerTimers[player.Slot].currentStyle = 5; // 5 = high-gravity 70 | player!.Pawn.Value!.GravityScale = 1.5f; 71 | playerTimers[player.Slot].changedStyle = true; 72 | } 73 | public void SetSlowMo(CCSPlayerController player) 74 | { 75 | //playerTimers[player.Slot].currentStyle = ?; // ? = slowmo (its broken) 76 | //Schema.SetSchemaValue(player!.Pawn.Value!.Handle, "CBaseEntity", "m_flTimeScale", 0.5f); 77 | //Utilities.SetStateChanged(player!.Pawn.Value!, "CBaseEntity", "m_flTimeScale"); 78 | } 79 | 80 | public void SetSideways(CCSPlayerController player) 81 | { 82 | playerTimers[player.Slot].currentStyle = 2; // 2 = sideways 83 | playerTimers[player.Slot].changedStyle = true; 84 | } 85 | public void SetHalfSideways(CCSPlayerController player) 86 | { 87 | playerTimers[player.Slot].currentStyle = 9; // 9 = halfsideways 88 | playerTimers[player.Slot].changedStyle = true; 89 | } 90 | public void SetFastForward(CCSPlayerController player) 91 | { 92 | playerTimers[player.Slot].currentStyle = 10; // 10 = fastforward 93 | playerTimers[player.Slot].changedStyle = true; 94 | } 95 | 96 | public void SetOnlyW(CCSPlayerController player) 97 | { 98 | playerTimers[player.Slot].currentStyle = 3; // 3 = only w 99 | playerTimers[player.Slot].changedStyle = true; 100 | } 101 | public void SetOnlyA(CCSPlayerController player) 102 | { 103 | playerTimers[player.Slot].currentStyle = 6; // 6 = only a 104 | playerTimers[player.Slot].changedStyle = true; 105 | } 106 | public void SetOnlyD(CCSPlayerController player) 107 | { 108 | playerTimers[player.Slot].currentStyle = 7; // 7 = only d 109 | playerTimers[player.Slot].changedStyle = true; 110 | } 111 | public void SetOnlyS(CCSPlayerController player) 112 | { 113 | playerTimers[player.Slot].currentStyle = 8; // 8 = only s 114 | playerTimers[player.Slot].changedStyle = true; 115 | } 116 | 117 | public void Set400Vel(CCSPlayerController player) 118 | { 119 | playerTimers[player.Slot].currentStyle = 4; // 4 = 400vel 120 | playerTimers[player.Slot].changedStyle = true; 121 | } 122 | 123 | public void SetVelocity(CCSPlayerController player, Vector currentVel, int desiredVel) 124 | { 125 | if(currentVel.X > desiredVel) player!.PlayerPawn.Value!.AbsVelocity.X = desiredVel; 126 | if(currentVel.X < -desiredVel) player!.PlayerPawn.Value!.AbsVelocity.X = -desiredVel; 127 | if(currentVel.Y > desiredVel) player!.PlayerPawn.Value!.AbsVelocity.Y = desiredVel; 128 | if(currentVel.Y < -desiredVel) player!.PlayerPawn.Value!.AbsVelocity.Y = -desiredVel; 129 | //do not cap z velocity 130 | } 131 | 132 | public void IncreaseVelocity(CCSPlayerController player) 133 | { 134 | var currentSpeedXY = Math.Round(player!.Pawn.Value!.AbsVelocity.Length2D()); 135 | var targetSpeed = currentSpeedXY + 5; 136 | 137 | AdjustPlayerVelocity2D(player, (float)targetSpeed); 138 | } 139 | 140 | public string GetNamedStyle(int style) 141 | { 142 | switch(style) 143 | { 144 | case 0: 145 | return "Normal"; 146 | case 1: 147 | return "Low Gravity"; 148 | case 2: 149 | return "Sideways"; 150 | case 3: 151 | return "OnlyW"; 152 | case 4: 153 | return "400vel"; 154 | case 5: 155 | return "High Gravity"; 156 | case 6: 157 | return "OnlyA"; 158 | case 7: 159 | return "OnlyD"; 160 | case 8: 161 | return "OnlyS"; 162 | case 9: 163 | return "Half Sideways"; 164 | case 10: 165 | return "Fast Forward"; 166 | default: 167 | return "null"; 168 | } 169 | } 170 | 171 | public double GetStyleMultiplier(int style) 172 | { 173 | switch(style) 174 | { 175 | case 0: 176 | return 1; // 1.0x for normal 177 | case 1: 178 | return lowgravPointModifier; //1.1x for lowgrav 179 | case 2: 180 | return sidewaysPointModifier; // 1.3x for sideways 181 | case 3: 182 | return onlywPointModifier; // 1.33x for onlyw 183 | case 4: 184 | return velPointModifier; // 1.5x for 400vel 185 | case 5: 186 | return highgravPointModifier; // 1.3x for highgrav 187 | case 6: 188 | return onlyaPointModifier; // 1.33x for onlya 189 | case 7: 190 | return onlydPointModifier; // 1.33x for onlyd 191 | case 8: 192 | return onlysPointModifier; // 1.33x for onlys 193 | case 9: 194 | return halfSidewaysPointModifier; // 1.3x for halfsideways 195 | case 10: 196 | return fastForwardPointModifier; // 1.3x for halfsideways 197 | default: 198 | return 1; 199 | } 200 | } 201 | } 202 | } -------------------------------------------------------------------------------- /src/Hooks/Damage.cs: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 Dea Brcka 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | You should have received a copy of the GNU General Public License 13 | along with this program. If not, see . 14 | */ 15 | 16 | using System.Runtime.InteropServices; 17 | using CounterStrikeSharp.API; 18 | using CounterStrikeSharp.API.Core; 19 | using CounterStrikeSharp.API.Modules.Memory; 20 | using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; 21 | using CounterStrikeSharp.API.Modules.Utils; 22 | 23 | namespace SharpTimer 24 | { 25 | public partial class SharpTimer 26 | { 27 | public void DamageHook() 28 | { 29 | try 30 | { 31 | SharpTimerDebug("Init Damage hook..."); 32 | if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) 33 | { 34 | SharpTimerDebug("Trying to register Linux Damage hook..."); 35 | VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(this.OnTakeDamage, HookMode.Pre); 36 | } 37 | else 38 | { 39 | SharpTimerDebug("Trying to register Windows Damage hook..."); 40 | RegisterEventHandler(OnPlayerHurt, HookMode.Pre); 41 | } 42 | } 43 | catch (Exception ex) 44 | { 45 | if (ex.Message == "Invalid function pointer") 46 | SharpTimerError($"Error in DamageHook: Conflict between cs2fixes and SharpTimer"); 47 | else 48 | SharpTimerError($"Error in DamageHook: {ex.Message}"); 49 | } 50 | } 51 | 52 | public void DamageUnHook() 53 | { 54 | try 55 | { 56 | if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) 57 | { 58 | VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Unhook(OnTakeDamage, HookMode.Pre); 59 | } 60 | } 61 | catch (Exception ex) 62 | { 63 | if (ex.Message == "Invalid function pointer") 64 | SharpTimerError($"Error in DamageUnHook: Conflict between cs2fixes and SharpTimer"); 65 | else 66 | SharpTimerError($"Error in DamageUnHook: {ex.Message}"); 67 | } 68 | } 69 | 70 | HookResult OnTakeDamage(DynamicHook h) 71 | { 72 | var ent = h.GetParam(0); 73 | var info = h.GetParam(1); 74 | if(disableDamage) h.GetParam(1).Damage = 0; 75 | 76 | if (!ent.IsValid || !info.Attacker.IsValid) 77 | return HookResult.Continue; 78 | 79 | if (ent.DesignerName == "player" && info.Attacker.Value!.DesignerName == "player") 80 | return HookResult.Handled; 81 | else 82 | return HookResult.Continue; 83 | } 84 | 85 | HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info) 86 | { 87 | if (disableDamage == true) 88 | { 89 | var player = @event.Userid; 90 | 91 | if (!player!.IsValid) 92 | return HookResult.Continue; 93 | 94 | Vector playerSpeed = player!.PlayerPawn.Value!.AbsVelocity ?? new Vector(0, 0, 0); 95 | 96 | player.PlayerPawn.Value.Health = int.MaxValue; 97 | player.PlayerPawn.Value.ArmorValue = int.MaxValue; 98 | 99 | if (!player.PawnHasHelmet) 100 | player.GiveNamedItem("item_assaultsuit"); 101 | 102 | Server.NextFrame(() => 103 | { 104 | if (IsAllowedPlayer(player)) AdjustPlayerVelocity(player, playerSpeed.Length(), true); 105 | }); 106 | } 107 | 108 | return HookResult.Continue; 109 | } 110 | } 111 | } -------------------------------------------------------------------------------- /src/Player/PlayerChecks.cs: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 Dea Brcka 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | You should have received a copy of the GNU General Public License 13 | along with this program. If not, see . 14 | */ 15 | 16 | using System.Text.Json; 17 | using CounterStrikeSharp.API.Core; 18 | using CounterStrikeSharp.API.Modules.Utils; 19 | 20 | namespace SharpTimer 21 | { 22 | public partial class SharpTimer 23 | { 24 | public bool IsAllowedPlayer(CCSPlayerController? player) 25 | { 26 | if (player == null || !player.IsValid || player.Pawn == null || !player.PlayerPawn.IsValid || !player.PawnIsAlive || playerTimers[player.Slot].IsNoclip) 27 | { 28 | return false; 29 | } 30 | 31 | int playerSlot = player.Slot; 32 | 33 | CsTeam teamNum = (CsTeam)player.TeamNum; 34 | 35 | bool isAlive = player.PawnIsAlive; 36 | bool isTeamValid = teamNum == CsTeam.CounterTerrorist || teamNum == CsTeam.Terrorist; 37 | 38 | bool isTeamSpectatorOrNone = teamNum != CsTeam.Spectator && teamNum != CsTeam.None; 39 | bool isConnected = connectedPlayers.ContainsKey(playerSlot) && playerTimers.ContainsKey(playerSlot); 40 | bool isConnectedJS = !jumpStatsEnabled || playerJumpStats.ContainsKey(playerSlot); 41 | 42 | return isTeamValid && isTeamSpectatorOrNone && isConnected && isConnectedJS && isAlive; 43 | } 44 | 45 | private bool IsAllowedSpectator(CCSPlayerController? player) 46 | { 47 | if (player == null || !player.IsValid || player.IsBot) 48 | { 49 | return false; 50 | } 51 | 52 | CsTeam teamNum = (CsTeam)player.TeamNum; 53 | bool isTeamValid = teamNum == CsTeam.Spectator; 54 | bool isConnected = connectedPlayers.ContainsKey(player.Slot) && playerTimers.ContainsKey(player.Slot); 55 | bool isObservingValid = player.Pawn?.Value!.ObserverServices?.ObserverTarget != null && 56 | specTargets.ContainsKey(player.Pawn.Value.ObserverServices.ObserverTarget.Index); 57 | 58 | return isTeamValid && isConnected && isObservingValid; 59 | } 60 | 61 | public bool IsAllowedClient(CCSPlayerController? player) 62 | { 63 | if (player == null || !player.IsValid || player.Pawn == null || !player.PlayerPawn.IsValid) 64 | return false; 65 | 66 | return true; 67 | } 68 | 69 | async Task IsPlayerATester(string steamId64, int playerSlot) 70 | { 71 | try 72 | { 73 | string response = await httpClient.GetStringAsync(testerPersonalGifsSource); 74 | 75 | using (JsonDocument jsonDocument = JsonDocument.Parse(response)) 76 | { 77 | if (playerTimers.TryGetValue(playerSlot, out PlayerTimerInfo? playerTimer)) 78 | { 79 | playerTimer.IsTester = jsonDocument.RootElement.TryGetProperty(steamId64, out JsonElement steamData); 80 | 81 | if (playerTimer.IsTester) 82 | { 83 | if (steamData.TryGetProperty("SmolGif", out JsonElement smolGifElement)) 84 | { 85 | playerTimer.TesterSmolGif = smolGifElement.GetString() ?? ""; 86 | } 87 | 88 | if (steamData.TryGetProperty("BigGif", out JsonElement bigGifElement)) 89 | { 90 | playerTimer.TesterBigGif = bigGifElement.GetString() ?? ""; 91 | } 92 | } 93 | } 94 | else 95 | { 96 | SharpTimerError($"Error in IsPlayerATester: player not on server anymore"); 97 | } 98 | } 99 | } 100 | catch (Exception ex) 101 | { 102 | SharpTimerError($"Error in IsPlayerATester: {ex.Message}"); 103 | } 104 | } 105 | 106 | async Task GetTesterBigGif(string steamId64) 107 | { 108 | try 109 | { 110 | string response = await httpClient.GetStringAsync(testerPersonalGifsSource); 111 | 112 | using (JsonDocument jsonDocument = JsonDocument.Parse(response)) 113 | { 114 | jsonDocument.RootElement.TryGetProperty(steamId64, out JsonElement steamData); 115 | 116 | if (steamData.TryGetProperty("BigGif", out JsonElement bigGifElement)) 117 | return bigGifElement.GetString() ?? ""; 118 | else 119 | return ""; 120 | } 121 | } 122 | catch (Exception ex) 123 | { 124 | SharpTimerError($"Error in GetTesterBigGif: {ex.Message}"); 125 | return ""; 126 | } 127 | } 128 | 129 | async Task GetTesterSmolGif(string steamId64) 130 | { 131 | try 132 | { 133 | string response = await httpClient.GetStringAsync(testerPersonalGifsSource); 134 | 135 | using (JsonDocument jsonDocument = JsonDocument.Parse(response)) 136 | { 137 | jsonDocument.RootElement.TryGetProperty(steamId64, out JsonElement steamData); 138 | 139 | if (steamData.TryGetProperty("SmolGif", out JsonElement smolGifElement)) 140 | return smolGifElement.GetString() ?? ""; 141 | else 142 | return ""; 143 | } 144 | } 145 | catch (Exception ex) 146 | { 147 | SharpTimerError($"Error in GetTesterSmolGif: {ex.Message}"); 148 | return ""; 149 | } 150 | } 151 | 152 | async Task IsSteamIDaTester(string steamId64) 153 | { 154 | try 155 | { 156 | string response = await httpClient.GetStringAsync(testerPersonalGifsSource); 157 | 158 | using (JsonDocument jsonDocument = JsonDocument.Parse(response)) 159 | { 160 | if (jsonDocument.RootElement.TryGetProperty(steamId64, out JsonElement isTester)) 161 | return true; 162 | else 163 | return false; 164 | } 165 | } 166 | catch (Exception ex) 167 | { 168 | SharpTimerError($"Error in IsSteamIDaTester: {ex.Message}"); 169 | return false; 170 | } 171 | } 172 | 173 | private void CheckPlayerCoords(CCSPlayerController? player, Vector playerSpeed) 174 | { 175 | try 176 | { 177 | if (player == null || !IsAllowedPlayer(player)) 178 | { 179 | return; 180 | } 181 | 182 | Vector incorrectVector = new(0, 0, 0); 183 | Vector? playerPos = player.Pawn?.Value!.CBodyComponent?.SceneNode!.AbsOrigin; 184 | bool isInsideStartBox = false; 185 | bool isInsideEndBox = false; 186 | 187 | if (playerPos == null || currentMapStartC1 == incorrectVector || currentMapStartC2 == incorrectVector || 188 | currentMapEndC1 == incorrectVector || currentMapEndC2 == incorrectVector) 189 | { 190 | return; 191 | } 192 | if (!useTriggersAndFakeZones) 193 | { 194 | isInsideStartBox = IsVectorInsideBox(playerPos, currentMapStartC1, currentMapStartC2); 195 | isInsideEndBox = IsVectorInsideBox(playerPos, currentMapEndC1, currentMapEndC2); 196 | } 197 | bool[] isInsideBonusStartBox = new bool[11]; 198 | bool[] isInsideBonusEndBox = new bool[11]; 199 | foreach (int bonus in totalBonuses) 200 | { 201 | if (bonus == 0) 202 | { 203 | 204 | } 205 | else 206 | { 207 | if (currentBonusStartC1 == null || currentBonusStartC1.Length <= bonus || 208 | currentBonusStartC2 == null || currentBonusStartC2.Length <= bonus || 209 | currentBonusEndC1 == null || currentBonusEndC1.Length <= bonus || 210 | currentBonusEndC2 == null || currentBonusEndC2.Length <= bonus) 211 | { 212 | SharpTimerError($"Invalid bonus coordinates for bonus {bonus}"); 213 | 214 | } 215 | else 216 | { 217 | isInsideBonusStartBox[bonus] = IsVectorInsideBox(playerPos, currentBonusStartC1[bonus], currentBonusStartC2[bonus]); 218 | isInsideBonusEndBox[bonus] = IsVectorInsideBox(playerPos, currentBonusEndC1[bonus], currentBonusEndC2[bonus]); 219 | } 220 | } 221 | } 222 | 223 | if (!useTriggersAndFakeZones) 224 | { 225 | if (!isInsideStartBox && isInsideEndBox) 226 | { 227 | OnTimerStop(player); 228 | if (enableReplays) OnRecordingStop(player); 229 | } 230 | else if (isInsideStartBox) 231 | { 232 | if(playerTimers.TryGetValue(player.Slot, out PlayerTimerInfo? playerTimer)) 233 | { 234 | playerTimer.inStartzone = true; 235 | } 236 | 237 | OnTimerStart(player); 238 | if (enableReplays) OnRecordingStart(player); 239 | 240 | if ((maxStartingSpeedEnabled == true && use2DSpeed == false && Math.Round(playerSpeed.Length()) > maxStartingSpeed) || 241 | (maxStartingSpeedEnabled == true && use2DSpeed == true && Math.Round(playerSpeed.Length2D()) > maxStartingSpeed)) 242 | { 243 | Action adjustVelocity = use2DSpeed ? AdjustPlayerVelocity2D : AdjustPlayerVelocity; 244 | adjustVelocity(player, maxStartingSpeed, true); 245 | } 246 | } 247 | else if (!isInsideStartBox && playerTimers.TryGetValue(player.Slot, out PlayerTimerInfo? playerTimer)) 248 | { 249 | playerTimer.inStartzone = false; 250 | } 251 | } 252 | foreach (int bonus in totalBonuses) 253 | { 254 | if (bonus == 0) 255 | { 256 | 257 | } 258 | else 259 | { 260 | if (currentBonusStartC1 == null || currentBonusStartC1.Length <= bonus || 261 | currentBonusStartC2 == null || currentBonusStartC2.Length <= bonus || 262 | currentBonusEndC1 == null || currentBonusEndC1.Length <= bonus || 263 | currentBonusEndC2 == null || currentBonusEndC2.Length <= bonus) 264 | { 265 | SharpTimerError($"Invalid bonus coordinates for bonus {bonus}"); 266 | 267 | } 268 | else 269 | { 270 | if (!isInsideBonusStartBox[bonus] && isInsideBonusEndBox[bonus]) 271 | { 272 | OnBonusTimerStop(player, bonus); 273 | if (enableReplays) OnRecordingStop(player); 274 | } 275 | else if (isInsideBonusStartBox[bonus]) 276 | { 277 | if(playerTimers.TryGetValue(player.Slot, out PlayerTimerInfo? playerTimer)) 278 | { 279 | playerTimer.inStartzone = true; 280 | } 281 | 282 | OnTimerStart(player, bonus); 283 | if (enableReplays) OnRecordingStart(player, bonus); 284 | 285 | if ((maxStartingSpeedEnabled == true && use2DSpeed == false && Math.Round(playerSpeed.Length()) > maxBonusStartingSpeed) || 286 | (maxStartingSpeedEnabled == true && use2DSpeed == true && Math.Round(playerSpeed.Length2D()) > maxBonusStartingSpeed)) 287 | { 288 | Action adjustVelocity = use2DSpeed ? AdjustPlayerVelocity2D : AdjustPlayerVelocity; 289 | adjustVelocity(player, maxBonusStartingSpeed, true); 290 | } 291 | } 292 | else if (!isInsideBonusStartBox[bonus]) 293 | { 294 | if(playerTimers.TryGetValue(player.Slot, out PlayerTimerInfo? playerTimer)) 295 | { 296 | playerTimer.inStartzone = false; 297 | } 298 | 299 | } 300 | } 301 | } 302 | } 303 | 304 | } 305 | catch (Exception ex) 306 | { 307 | SharpTimerError($"Error in CheckPlayerCoords: {ex.Message}"); 308 | } 309 | } 310 | 311 | public bool CommandCooldown(CCSPlayerController? player) 312 | { 313 | if (playerTimers[player!.Slot].TicksSinceLastCmd < cmdCooldown) 314 | { 315 | PrintToChat(player, Localizer["command_cooldown"]); 316 | return true; 317 | } 318 | return false; 319 | } 320 | 321 | public bool IsTimerBlocked(CCSPlayerController? player) 322 | { 323 | if (!playerTimers[player!.Slot].IsTimerBlocked) 324 | { 325 | PrintToChat(player, Localizer["stop_using_timer"]); 326 | return true; 327 | } 328 | return false; 329 | } 330 | 331 | public bool ReplayCheck(CCSPlayerController? player) 332 | { 333 | if (playerTimers[player!.Slot].IsReplaying) 334 | { 335 | PrintToChat(player, Localizer["end_your_replay"]); 336 | return true; 337 | } 338 | return false; 339 | } 340 | 341 | public bool CanCheckpoint(CCSPlayerController? player) 342 | { 343 | if (cpOnlyWhenTimerStopped == true && playerTimers[player!.Slot].IsTimerBlocked == false) 344 | { 345 | PrintToChat(player, Localizer["cant_use_checkpoint", (currentMapName!.Contains("surf_") ? "loc" : "checkpoint")]); 346 | PlaySound(player, cpSoundError); 347 | return true; 348 | } 349 | return false; 350 | } 351 | } 352 | } -------------------------------------------------------------------------------- /src/Player/PlayerEvents.cs: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 Dea Brcka 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | You should have received a copy of the GNU General Public License 13 | along with this program. If not, see . 14 | */ 15 | 16 | using System.Drawing; 17 | using CounterStrikeSharp.API; 18 | using CounterStrikeSharp.API.Core; 19 | using CounterStrikeSharp.API.Modules.Admin; 20 | using CounterStrikeSharp.API.Modules.Commands; 21 | using CounterStrikeSharp.API.Modules.Utils; 22 | 23 | namespace SharpTimer 24 | { 25 | public partial class SharpTimer 26 | { 27 | private void OnPlayerConnect(CCSPlayerController? player, bool isForBot = false) 28 | { 29 | try 30 | { 31 | if (player == null) 32 | { 33 | SharpTimerError("Player object is null."); 34 | return; 35 | } 36 | 37 | if (player.PlayerPawn == null) 38 | { 39 | SharpTimerError("PlayerPawn is null."); 40 | return; 41 | } 42 | 43 | if (player.PlayerPawn.Value!.MovementServices == null) 44 | { 45 | SharpTimerError("MovementServices is null."); 46 | return; 47 | } 48 | 49 | int playerSlot = player.Slot; 50 | string steamID = player.SteamID.ToString(); 51 | string playerName = player.PlayerName; 52 | 53 | try 54 | { 55 | connectedPlayers[playerSlot] = new CCSPlayerController(player.Handle); 56 | playerTimers[playerSlot] = new PlayerTimerInfo(); 57 | playerJumpStats[playerSlot] = new PlayerJumpStats(); 58 | if (enableReplays) playerReplays[playerSlot] = new PlayerReplays(); 59 | playerTimers[playerSlot].MovementService = new CCSPlayer_MovementServices(player.PlayerPawn.Value.MovementServices!.Handle); 60 | playerTimers[playerSlot].StageTimes = new Dictionary(); 61 | playerTimers[playerSlot].StageVelos = new Dictionary(); 62 | if (AdminManager.PlayerHasPermissions(player, "@css/root")) playerTimers[playerSlot].ZoneToolWire = new Dictionary(); 63 | playerTimers[playerSlot].CurrentMapStage = 0; 64 | playerTimers[playerSlot].CurrentMapCheckpoint = 0; 65 | SetNormalStyle(player); 66 | playerTimers[playerSlot].IsRecordingReplay = false; 67 | playerTimers[playerSlot].SetRespawnPos = null; 68 | playerTimers[playerSlot].SetRespawnAng = null; 69 | playerTimers[playerSlot].SoundsEnabled = soundsEnabledByDefault; 70 | 71 | if (isForBot == false) _ = Task.Run(async () => await IsPlayerATester(steamID, playerSlot)); 72 | 73 | //PlayerSettings 74 | if (enableDb) _ = Task.Run(async () => await GetPlayerStats(player, steamID, playerName, playerSlot, true)); 75 | 76 | if (connectMsgEnabled == true && !enableDb) PrintToChatAll(Localizer["connect_message", player.PlayerName]); 77 | if (cmdJoinMsgEnabled == true) PrintAllEnabledCommands(player); 78 | 79 | SharpTimerDebug($"Added player {player.PlayerName} with UserID {player.UserId} to connectedPlayers"); 80 | SharpTimerDebug($"Total players connected: {connectedPlayers.Count}"); 81 | SharpTimerDebug($"Total playerTimers: {playerTimers.Count}"); 82 | SharpTimerDebug($"Total playerReplays: {playerReplays.Count}"); 83 | 84 | if (removeLegsEnabled == true) 85 | { 86 | player.PlayerPawn.Value.Render = Color.FromArgb(254, 254, 254, 254); 87 | Utilities.SetStateChanged(player.PlayerPawn.Value, "CBaseModelEntity", "m_clrRender"); 88 | } 89 | } 90 | finally 91 | { 92 | if (connectedPlayers[playerSlot] == null) 93 | { 94 | connectedPlayers.Remove(playerSlot); 95 | } 96 | 97 | if (playerTimers[playerSlot] == null) 98 | { 99 | playerTimers.Remove(playerSlot); 100 | } 101 | } 102 | } 103 | catch (Exception ex) 104 | { 105 | SharpTimerError($"Error in OnPlayerConnect: {ex.Message}"); 106 | } 107 | } 108 | 109 | private void OnPlayerSpawn(CCSPlayerController? player) 110 | { 111 | //just.. dont ask. 112 | AddTimer(0f, () => 113 | { 114 | if (spawnOnRespawnPos == true && currentRespawnPos != null) 115 | player!.PlayerPawn.Value!.Teleport(currentRespawnPos!, null, null); 116 | }); 117 | } 118 | 119 | private void OnPlayerDisconnect(CCSPlayerController? player, bool isForBot = false) 120 | { 121 | if (player == null) return; 122 | 123 | try 124 | { 125 | if (isForBot == true && connectedReplayBots.TryGetValue(player.Slot, out var connectedReplayBot)) 126 | { 127 | connectedReplayBots.Remove(player.Slot); 128 | SharpTimerDebug($"Removed bot {connectedReplayBot.PlayerName} with UserID {connectedReplayBot.UserId} from connectedReplayBots."); 129 | } 130 | if (connectedPlayers.TryGetValue(player.Slot, out var connectedPlayer)) 131 | { 132 | connectedPlayers.Remove(player.Slot); 133 | 134 | //schizo removing data from memory 135 | playerTimers[player.Slot] = new PlayerTimerInfo(); 136 | playerTimers.Remove(player.Slot); 137 | 138 | //schizo removing data from memory 139 | playerCheckpoints[player.Slot] = new List(); 140 | playerCheckpoints.Remove(player.Slot); 141 | 142 | specTargets.Remove(player.Pawn.Value!.EntityHandle.Index); 143 | 144 | playerTimers[player.Slot].TotalSync = 0; 145 | playerTimers[player.Slot].GoodSync = 0; 146 | playerTimers[player.Slot].Sync = 0; 147 | playerTimers[player.Slot].Rotation = new List(); 148 | 149 | if (enableReplays) 150 | { 151 | //schizo removing data from memory 152 | playerReplays[player.Slot] = new PlayerReplays(); 153 | playerReplays.Remove(player.Slot); 154 | } 155 | 156 | SharpTimerDebug($"Removed player {connectedPlayer.PlayerName} with UserID {connectedPlayer.UserId} from connectedPlayers."); 157 | SharpTimerDebug($"Removed specTarget index {player.Pawn.Value.EntityHandle.Index} from specTargets."); 158 | SharpTimerDebug($"Total players connected: {connectedPlayers.Count}"); 159 | SharpTimerDebug($"Total playerTimers: {playerTimers.Count}"); 160 | SharpTimerDebug($"Total specTargets: {specTargets.Count}"); 161 | 162 | if (connectMsgEnabled == true && isForBot == false) 163 | { 164 | PrintToChatAll(Localizer["disconnect_message", connectedPlayer.PlayerName]); 165 | } 166 | } 167 | } 168 | catch (Exception ex) 169 | { 170 | SharpTimerError($"Error in OnPlayerDisconnect (probably replay bot related lolxd): {ex.Message}"); 171 | } 172 | } 173 | 174 | private HookResult OnPlayerChat(CCSPlayerController? player, CommandInfo message) 175 | { 176 | if (displayChatTags == false) 177 | return HookResult.Continue; 178 | 179 | string msg; 180 | 181 | if (player == null || !player.IsValid || player.IsBot || string.IsNullOrEmpty(message.GetArg(1))) 182 | return HookResult.Handled; 183 | else 184 | msg = message.GetArg(1); 185 | 186 | if (msg.Length > 0 && (msg[0] == '!' || msg[0] == '/' || msg[0] == '.')) 187 | return HookResult.Continue; 188 | else 189 | { 190 | string rankColor = GetRankColorForChat(player); 191 | 192 | if (playerTimers.TryGetValue(player.Slot, out PlayerTimerInfo? value)) 193 | { 194 | string deadText = player.PawnIsAlive ? "" : $"{ChatColors.Grey}*DEAD* "; 195 | string vipText = (value.IsVip ? $"{ChatColors.Magenta}{customVIPTag} " : ""); 196 | if (player.Team == CsTeam.Terrorist) 197 | Server.PrintToChatAll($" {deadText}{vipText}{rankColor}{value.CachedRank} {ChatColors.ForTeam(CsTeam.Terrorist)}{player.PlayerName} {ChatColors.Default}: {msg}"); 198 | if (player.Team == CsTeam.CounterTerrorist) 199 | Server.PrintToChatAll($" {deadText}{vipText}{rankColor}{value.CachedRank} {ChatColors.ForTeam(CsTeam.CounterTerrorist)}{player.PlayerName} {ChatColors.Default}: {msg}"); 200 | if (player.Team == CsTeam.Spectator) 201 | Server.PrintToChatAll($" {ChatColors.Grey}*SPEC* {ChatColors.ForTeam(CsTeam.Spectator)}{player.PlayerName} {ChatColors.Default}: {msg}"); 202 | if (player.Team == CsTeam.None) 203 | Server.PrintToChatAll($" {ChatColors.ForTeam(CsTeam.None)}{player.PlayerName} {ChatColors.Default}: {msg}"); 204 | } 205 | 206 | return HookResult.Handled; 207 | } 208 | 209 | } 210 | } 211 | } -------------------------------------------------------------------------------- /src/Plugin/Classes.cs: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) 2024 Dea Brcka 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 3 of the License, or 7 | (at your option) any later version. 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU General Public License for more details. 12 | You should have received a copy of the GNU General Public License 13 | along with this program. If not, see . 14 | */ 15 | 16 | using System.Text.Json.Serialization; 17 | using CounterStrikeSharp.API; 18 | using CounterStrikeSharp.API.Core; 19 | using CounterStrikeSharp.API.Modules.Utils; 20 | 21 | namespace SharpTimer 22 | { 23 | // Cache for map ents 24 | public class EntityCache 25 | { 26 | public List Triggers { get; private set; } 27 | public List InfoTeleportDestinations { get; private set; } 28 | public List InfoTargetEntities { get; private set; } 29 | 30 | public EntityCache() 31 | { 32 | Triggers = []; 33 | InfoTeleportDestinations = []; 34 | InfoTargetEntities = []; 35 | UpdateCache(); 36 | } 37 | 38 | public void UpdateCache() 39 | { 40 | Triggers = Utilities.FindAllEntitiesByDesignerName("trigger_multiple").ToList(); 41 | InfoTeleportDestinations = Utilities.FindAllEntitiesByDesignerName("info_teleport_destination").ToList(); 42 | } 43 | } 44 | 45 | // MapData JSON 46 | public class MapInfo 47 | { 48 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 49 | public string? MapStartTrigger { get; set; } 50 | 51 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 52 | public string? MapStartC1 { get; set; } 53 | 54 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 55 | public string? MapStartC2 { get; set; } 56 | 57 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 58 | public string? BonusStartC1 { get; set; } 59 | 60 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 61 | public string? BonusStartC2 { get; set; } 62 | 63 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 64 | public string? MapEndTrigger { get; set; } 65 | 66 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 67 | public string? MapEndC1 { get; set; } 68 | 69 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 70 | public string? MapEndC2 { get; set; } 71 | 72 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 73 | public string? BonusEndC1 { get; set; } 74 | 75 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 76 | public string? BonusEndC2 { get; set; } 77 | 78 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 79 | public string? RespawnPos { get; set; } 80 | 81 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 82 | public string? BonusRespawnPos { get; set; } 83 | 84 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 85 | public string? OverrideDisableTelehop { get; set; } 86 | 87 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 88 | public string? OverrideMaxSpeedLimit { get; set; } 89 | 90 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 91 | public string? OverrideStageRequirement { get; set; } 92 | 93 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 94 | public string? GlobalPointsMultiplier { get; set; } 95 | 96 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 97 | public string? MapTier { get; set; } 98 | 99 | [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] 100 | public string? MapType { get; set; } 101 | } 102 | 103 | public class PlayerTimerInfo 104 | { 105 | //timer 106 | public bool IsTimerRunning { get; set; } 107 | 108 | public bool IsOnBhopBlock { get; set; } 109 | public bool IsNoclip { get; set; } 110 | public bool IsTimerBlocked { get; set; } 111 | public int TimerTicks { get; set; } 112 | public int StageTicks { get; set; } 113 | public bool IsBonusTimerRunning { get; set; } 114 | public int BonusTimerTicks { get; set; } 115 | public int BonusStage { get; set; } 116 | public bool inStartzone { get; set; } 117 | public CurrentZoneInfo CurrentZoneInfo { get; set; } = new(); 118 | public int currentStyle { get; set; } 119 | public bool changedStyle { get; set; } 120 | 121 | //replay 122 | public bool IsReplaying { get; set; } 123 | public bool IsRecordingReplay { get; set; } 124 | 125 | //hud 126 | public string? ReplayHUDString { get; set; } 127 | public string? RankHUDIcon { get; set; } 128 | public string? CachedRank { get; set; } 129 | public bool IsRankPbCached { get; set; } 130 | public bool IsRankPbReallyCached { get; set; } 131 | public bool IsSpecTargetCached { get; set; } 132 | public string? PreSpeed { get; set; } 133 | public string? CachedPB { get; set; } 134 | public string? CachedMapPlacement { get; set; } 135 | public Dictionary CachedBonusInfo { get; set; } = new(); 136 | 137 | //logic 138 | public int? TicksInAir { get; set; } 139 | public int TicksOnBhopBlock { get; set; } 140 | public int CheckpointIndex { get; set; } 141 | public Dictionary? StageTimes { get; set; } 142 | public Dictionary? StageVelos { get; set; } 143 | public int CurrentMapStage { get; set; } 144 | public int CurrentMapCheckpoint { get; set; } 145 | public CCSPlayer_MovementServices? MovementService { get; set; } 146 | public double Sync { get; set; } 147 | public int GoodSync { get; set; } 148 | public int TotalSync { get; set; } 149 | public List Rotation { get; set; } = new List(); 150 | 151 | //player settings/stats 152 | public bool Azerty { get; set; } 153 | public bool HideTimerHud { get; set; } 154 | public bool HideKeys { get; set; } 155 | public bool SoundsEnabled { get; set; } 156 | public bool BindsDisabled { get; set; } 157 | public bool HideJumpStats { get; set; } 158 | public int PlayerFov { get; set; } 159 | public int TimesConnected { get; set; } 160 | public int TicksSinceLastCmd { get; set; } 161 | public int TicksSinceLastRankUpdate { get; set; } 162 | 163 | //super special stuff for testers 164 | public bool IsTester { get; set; } 165 | public string? TesterSmolGif { get; set; } 166 | public string? TesterBigGif { get; set; } 167 | 168 | //vip stuff 169 | public bool IsVip { get; set; } 170 | public string? VipReplayGif { get; set; } 171 | public string? VipBigGif { get; set; } 172 | 173 | //admin stuff 174 | public bool IsAddingStartZone { get; set; } 175 | public bool IsAddingBonusStartZone { get; set; } 176 | public string? StartZoneC1 { get; set; } 177 | public string? StartZoneC2 { get; set; } 178 | public string? BonusStartZoneC1 { get; set; } 179 | public string? BonusStartZoneC2 { get; set; } 180 | public bool IsAddingEndZone { get; set; } 181 | public bool IsAddingBonusEndZone { get; set; } 182 | public string? EndZoneC1 { get; set; } 183 | public string? EndZoneC2 { get; set; } 184 | public string? RespawnPos { get; set; } 185 | public string? BonusEndZoneC1 { get; set; } 186 | public string? BonusEndZoneC2 { get; set; } 187 | public string? BonusRespawnPos { get; set; } 188 | public Dictionary? ZoneToolWire { get; set; } 189 | 190 | //set respawn 191 | public string? SetRespawnPos { get; set; } 192 | public string? SetRespawnAng { get; set; } 193 | } 194 | 195 | public class CurrentZoneInfo 196 | { 197 | public bool InMainMapStartZone { get; set; } 198 | public bool InBonusStartZone { get; set; } 199 | public int CurrentBonusNumber { get; set; } 200 | } 201 | 202 | public class PlayerJumpStats 203 | { 204 | public int FramesOnGround { get; set; } 205 | public int LastFramesOnGround { get; set; } 206 | public bool OnGround { get; set; } 207 | public bool LastOnGround { get; set; } 208 | public string? LastPosOnGround { get; set; } 209 | public string? LastSpeed { get; set; } 210 | public string? JumpPos { get; set; } 211 | public string? OldJumpPos { get; set; } 212 | public string? JumpSpeed { get; set; } 213 | public bool Jumped { get; set; } 214 | public string? LastJumpType { get; set; } 215 | public bool LastDucked { get; set; } 216 | public bool LandedFromSound { get; set; } 217 | public bool LastLandedFromSound { get; set; } 218 | public int WTicks { get; set; } 219 | 220 | public List