├── .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 | 
5 | 
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 |
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