Skip to content

Commit 7f4ac8e

Browse files
Merge pull request #289 from rislah/main
Add .savepos and .loadpos commands
2 parents 46087e1 + 785b723 commit 7f4ac8e

File tree

16 files changed

+102
-5
lines changed

16 files changed

+102
-5
lines changed

MatchZy.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ public override void Load(bool hotReload) {
200200
{ ".bestctspawn", OnBestCTSpawnCommand },
201201
{ ".worstctspawn", OnWorstCTSpawnCommand },
202202
{ ".besttspawn", OnBestTSpawnCommand },
203-
{ ".worsttspawn", OnWorstTSpawnCommand }
203+
{ ".worsttspawn", OnWorstTSpawnCommand },
204+
{ ".savepos", OnSavePosCommand},
205+
{ ".loadpos", OnLoadPosCommand}
204206
};
205207

206208
RegisterEventHandler<EventPlayerConnectFull>(EventPlayerConnectFullHandler);

PlayerLocationData.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using CounterStrikeSharp.API.Core;
2+
using CounterStrikeSharp.API.Modules.Utils;
3+
4+
namespace MatchZy;
5+
6+
public class PlayerLocationData
7+
{
8+
public Vector Position { get; set; }
9+
public QAngle Angle { get; set; }
10+
11+
public PlayerLocationData(Vector position, QAngle angle)
12+
{
13+
this.Position = position;
14+
this.Angle = angle;
15+
}
16+
17+
public void LoadPosition(CCSPlayerController player)
18+
{
19+
if (player == null || player.PlayerPawn.Value == null) return;
20+
player.PlayerPawn.Value.Teleport(Position, Angle, new Vector(0, 0, 0));
21+
}
22+
}

PracticeMode.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public partial class MatchZy
122122
Dictionary<int, Dictionary<string, GrenadeThrownData>> nadeSpecificLastGrenadeData = new();
123123
Dictionary<int, DateTime> lastGrenadeThrownTime = new();
124124
Dictionary<int, PlayerPracticeTimer> playerTimers = new();
125+
Dictionary<int, PlayerLocationData> savedPlayerLocationData = new();
125126

126127
public Dictionary<byte, List<Position>> spawnsData = GetEmptySpawnsData();
127128

@@ -179,6 +180,8 @@ public void StartPracticeMode()
179180
Server.PrintToChatAll($" {ChatColors.Green}Nades: {ChatColors.Default}.loadnade, .savenade, .importnade, .listnades");
180181
Server.PrintToChatAll($" {ChatColors.Green}Nade Throw: {ChatColors.Default}.rethrow, .throwindex <index>, .lastindex, .delay <number>");
181182
Server.PrintToChatAll($" {ChatColors.Green}Utility & Toggles: {ChatColors.Default}.clear, .fastforward, .last, .back, .solid, .impacts, .traj");
183+
// On new line to prevent text cutting off
184+
Server.PrintToChatAll($" {ChatColors.Green}Utility & Toggles: {ChatColors.Default}.savepos, .loadpos");
182185
Server.PrintToChatAll($" {ChatColors.Green}Sides & Others: {ChatColors.Default}.ct, .t, .spec, .fas, .god, .dryrun, .break, .exitprac");
183186
}
184187

@@ -1438,6 +1441,38 @@ public void OnRethrowCommand(CCSPlayerController? player, CommandInfo? command)
14381441
AddTimer(lastGrenade.Delay, () => lastGrenade.Throw(player));
14391442
}
14401443

1444+
[ConsoleCommand("css_savepos", "Saves the player location")]
1445+
public void OnSavePosCommand(CCSPlayerController? player, CommandInfo? command)
1446+
{
1447+
if (!isPractice || player == null || !player.UserId.HasValue || player.PlayerPawn.Value == null) return;
1448+
1449+
int userId = player.UserId.Value;
1450+
var pawn = player.PlayerPawn.Value;
1451+
Vector position = new(pawn.AbsOrigin?.X, pawn.AbsOrigin?.Y, pawn.AbsOrigin?.Z);
1452+
QAngle angle = new(pawn.EyeAngles?.X, pawn.EyeAngles?.Y, pawn.EyeAngles?.Z);
1453+
1454+
savedPlayerLocationData[userId] = new PlayerLocationData(position, angle);
1455+
Log($"[SavePos] Saved position for UserID {userId}, Position: {position}, Angle: {angle}!");
1456+
PrintToPlayerChat(player, Localizer["matchzy.pm.savepos"]);
1457+
}
1458+
1459+
[ConsoleCommand("css_loadpos", "Loads the last saved player location")]
1460+
public void OnLoadPosCommand(CCSPlayerController? player, CommandInfo? command)
1461+
{
1462+
if (!isPractice || player == null || !player.UserId.HasValue) return;
1463+
1464+
int userId = player.UserId.Value;
1465+
if (!savedPlayerLocationData.TryGetValue(userId, out var playerLocationData))
1466+
{
1467+
PrintToPlayerChat(player, Localizer["matchzy.pm.notsavedpos"]);
1468+
return;
1469+
}
1470+
1471+
Log($"[LoadPos] LoadPos position for UserID {userId}, Position: {playerLocationData.Position}, Angles: {playerLocationData.Angle}!");
1472+
playerLocationData.LoadPosition(player);
1473+
PrintToPlayerChat(player, Localizer["matchzy.pm.loadpos"]);
1474+
}
1475+
14411476
[ConsoleCommand("css_throwsmoke", "Throws the last thrown smoke")]
14421477
[ConsoleCommand("css_rethrowsmoke", "Throws the last thrown smoke")]
14431478
public void OnRethrowSmokeCommand(CCSPlayerController? player, CommandInfo? command)

Utility.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,6 +1381,7 @@ private void SendAvailableCommandsMessage(CCSPlayerController? player)
13811381
player.PrintToChat($" {ChatColors.Green}Nades: {ChatColors.Default}.loadnade, .savenade, .importnade, .listnades");
13821382
player.PrintToChat($" {ChatColors.Green}Nade Throw: {ChatColors.Default}.rethrow, .throwindex <index>, .lastindex, .delay <number>");
13831383
player.PrintToChat($" {ChatColors.Green}Utility & Toggles: {ChatColors.Default}.clear, .fastforward, .last, .back, .solid, .impacts, .traj");
1384+
player.PrintToChat($" {ChatColors.Green}Utility & Toggles: {ChatColors.Default}.savepos, .loadpos");
13841385
player.PrintToChat($" {ChatColors.Green}Sides & Others: {ChatColors.Default}.ct, .t, .spec, .fas, .god, .dryrun, .break, .exitprac");
13851386
return;
13861387
}

lang/de.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,10 @@
108108
"matchzy.pm.loadnadenotfound": "Nade not found! Usage: .loadnade <name>",
109109
"matchzy.pm.backtonumber": "Usage: !back <number> (You've thrown {green}{0}{default} grenades till now)",
110110
"matchzy.pm.throwindextonumber": "Usage: !throwindex <number> (You've thrown {green}{0}{default} grenades till now)",
111-
111+
"matchzy.pm.savepos": "Position gespeichert",
112+
"matchzy.pm.loadpos": "Position geladen",
113+
"matchzy.pm.notsavedpos": "Sie haben noch keine Position gespeichert!",
114+
112115
"matchzy.rs.minreadyplayers": "You must have at least {green}{0}{default} player(s) on the server to ready up.",
113116
"matchzy.rs.forcereadiedby": "Your team was force-readied by {green}{0}{default}",
114117

lang/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@
108108
"matchzy.pm.loadnadenotfound": "Nade not found! Usage: .loadnade <name>",
109109
"matchzy.pm.backtonumber": "Usage: !back <number> (You've thrown {green}{0}{default} grenades till now)",
110110
"matchzy.pm.throwindextonumber": "Usage: !throwindex <number> (You've thrown {green}{0}{default} grenades till now)",
111+
"matchzy.pm.savepos": "Position saved",
112+
"matchzy.pm.loadpos": "Position loaded",
113+
"matchzy.pm.notsavedpos": "You have not saved a position yet!",
111114

112115
"matchzy.rs.minreadyplayers": "You must have at least {green}{0}{default} player(s) on the server to ready up.",
113116
"matchzy.rs.forcereadiedby": "Your team was force-readied by {green}{0}{default}",

lang/es-ES.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@
108108
"matchzy.pm.loadnadenotfound": "¡Granada no encontrada! Uso: .loadnade <nombre>",
109109
"matchzy.pm.backtonumber": "Uso: !back <número> (Has tirado {green}{0}{default} granadas hasta ahora)",
110110
"matchzy.pm.throwindextonumber": "Uso: !throwindex <número> (Has tirado {green}{0}{default} granadas hasta ahora)",
111+
"matchzy.pm.savepos": "Posición guardada",
112+
"matchzy.pm.loadpos": "Posición cargada",
113+
"matchzy.pm.notsavedpos": "¡Aún no has guardado ninguna posición!",
111114

112115
"matchzy.rs.minreadyplayers": "Debes tener como mínimo {green}{0}{default} jugador(es) en el servidor para estar preparado.",
113116
"matchzy.rs.forcereadiedby": "Tu equipo ha sido forzado a estar preparado por {green}{0}{default}",

lang/fr.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,10 @@
108108
"matchzy.pm.loadnadenotfound": "Nade not found! Usage: .loadnade <name>",
109109
"matchzy.pm.backtonumber": "Usage: !back <number> (You've thrown {green}{0}{default} grenades till now)",
110110
"matchzy.pm.throwindextonumber": "Usage: !throwindex <number> (You've thrown {green}{0}{default} grenades till now)",
111-
111+
"matchzy.pm.savepos": "Position enregistrée",
112+
"matchzy.pm.loadpos": "Position chargée",
113+
"matchzy.pm.notsavedpos": "Vous n'avez pas encore enregistré de position !",
114+
112115
"matchzy.rs.minreadyplayers": "You must have at least {green}{0}{default} player(s) on the server to ready up.",
113116
"matchzy.rs.forcereadiedby": "Your team was force-readied by {green}{0}{default}",
114117

lang/hu.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,8 @@
121121
"matchzy.pracc.molotov": "A molotovot {red}{0}{default} dobta, és {green}{1}{default} mp alatt robbant fel",
122122
"matchzy.pracc.decoy": "A csaligránátot {red}{0}{default} dobta, és {green}{1}{default} mp alatt robbant fel",
123123
"matchzy.pracc.damage": "{red}{0}{default} sebzést okozott {lightblue}{1}{default}-nak ({green}{2}{default} egészség)",
124-
"matchzy.pracc.blind": "{lightblue}{0}{default} vakítva lett {green}{1}{default} mp-re"
124+
"matchzy.pracc.blind": "{lightblue}{0}{default} vakítva lett {green}{1}{default} mp-re",
125+
"matchzy.pm.savepos": "Pozíció mentve",
126+
"matchzy.pm.loadpos": "Pozíció betöltve",
127+
"matchzy.pm.notsavedpos": "Még nem mentettél pozíciót!"
125128
}

lang/ja.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@
108108
"matchzy.pm.loadnadenotfound": "手榴弾が見つかりません! 使用法: .loadnade <name>",
109109
"matchzy.pm.backtonumber": "使用法: !back <number> (これまでに{green}{0}{default}個の手榴弾を投げました)",
110110
"matchzy.pm.throwindextonumber": "使用法: !throwindex <number> (これまでに{green}{0}{default}個の手榴弾を投げました)",
111+
"matchzy.pm.savepos": "位置を保存しました",
112+
"matchzy.pm.loadpos": "位置を読み込みました",
113+
"matchzy.pm.notsavedpos": "まだ位置を保存していません!",
111114

112115
"matchzy.rs.minreadyplayers": "準備するには、サーバーに少なくとも {green}{0}{default} 人のプレイヤーが必要です。",
113116
"matchzy.rs.forcereadiedby": "あなたのチームは{green}{0}{default}によって強制的に準備されました",

0 commit comments

Comments
 (0)