Skip to content

Commit fb231d7

Browse files
committed
fix(vehicles): replace the personal vehicle when the server forces replace
Also spawn clear of the personal vehicle instead of inside it when it is kept.
1 parent 7c3411c commit fb231d7

9 files changed

Lines changed: 70 additions & 15 deletions

File tree

assets/enhanced/language/de.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,7 @@
18771877
"vehiclespawner.category.subtitle": "Fahrzeug-Spawner-Menü",
18781878
"vehiclespawner.link.desc": "Ein Fahrzeug spawnen.",
18791879
"vehiclespawner.oldvehicleremoved": "Dein altes Fahrzeug wurde entfernt. Schalte ~y~Vorheriges Fahrzeug ersetzen~s~ aus, wenn du es beim nächsten Mal behalten willst.",
1880+
"vehiclespawner.personalvehiclereplaced": "Dein persönliches Fahrzeug wurde entfernt und vergessen. Auf diesem Server darfst du nur ein Fahrzeug gleichzeitig haben.",
18801881
"vehiclespawner.replaceprevious": "Vorheriges Fahrzeug ersetzen",
18811882
"vehiclespawner.replaceprevious.binding": "Vorheriges Fahrzeug behalten oder ersetzen",
18821883
"vehiclespawner.replaceprevious.button.off": "Vorheriges ersetzen: Aus",

assets/enhanced/language/es.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,7 @@
18771877
"vehiclespawner.category.subtitle": "Menú del generador de vehículos",
18781878
"vehiclespawner.link.desc": "Genera un vehículo.",
18791879
"vehiclespawner.oldvehicleremoved": "Se ha eliminado tu vehículo anterior. Desactiva ~y~Reemplazar el vehículo anterior~s~ si la próxima vez quieres conservarlo.",
1880+
"vehiclespawner.personalvehiclereplaced": "Tu vehículo personal se ha eliminado y olvidado. Este servidor solo te permite tener un vehículo a la vez.",
18801881
"vehiclespawner.replaceprevious": "Reemplazar el vehículo anterior",
18811882
"vehiclespawner.replaceprevious.binding": "Conservar o reemplazar el vehículo anterior",
18821883
"vehiclespawner.replaceprevious.button.off": "Reemplazar el anterior: no",

assets/enhanced/language/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,7 @@
18771877
"vehiclespawner.category.subtitle": "Menu du générateur de véhicules",
18781878
"vehiclespawner.link.desc": "Faire apparaître un véhicule.",
18791879
"vehiclespawner.oldvehicleremoved": "Votre ancien véhicule a été supprimé. Désactivez ~y~Remplacer le véhicule précédent~s~ si vous voulez le garder la prochaine fois.",
1880+
"vehiclespawner.personalvehiclereplaced": "Votre véhicule personnel a été supprimé et oublié. Ce serveur ne vous autorise qu'un seul véhicule à la fois.",
18801881
"vehiclespawner.replaceprevious": "Remplacer le véhicule précédent",
18811882
"vehiclespawner.replaceprevious.binding": "Garder ou remplacer le véhicule précédent",
18821883
"vehiclespawner.replaceprevious.button.off": "Remplacer le précédent : non",

assets/enhanced/language/nl.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,7 @@
18771877
"vehiclespawner.category.subtitle": "Voertuigspawnermenu",
18781878
"vehiclespawner.link.desc": "Spawn een voertuig.",
18791879
"vehiclespawner.oldvehicleremoved": "Je oude voertuig is verwijderd. Zet ~y~Vorig voertuig vervangen~s~ uit als je het de volgende keer wilt houden.",
1880+
"vehiclespawner.personalvehiclereplaced": "Je persoonlijke voertuig is verwijderd en vergeten. Op deze server mag je maar één voertuig tegelijk hebben.",
18801881
"vehiclespawner.replaceprevious": "Vorig voertuig vervangen",
18811882
"vehiclespawner.replaceprevious.binding": "Vorig voertuig behouden of vervangen",
18821883
"vehiclespawner.replaceprevious.button.off": "Vorige vervangen: uit",

src/Client/vMenu.Enhanced.MenuFramework/Localization/Languages/EnglishStrings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ internal static class EnglishStrings
343343
[Loc.VehicleSpawner.SpawnInsideBinding] = "Spawn vehicles inside or outside",
344344
[Loc.VehicleSpawner.ReplacePreviousBinding] = "Keep or replace the previous vehicle",
345345
[Loc.VehicleSpawner.OldVehicleRemoved] = "Your old vehicle was removed. Turn off ~y~Replace Previous Vehicle~s~ if you want to keep it next time.",
346+
[Loc.VehicleSpawner.PersonalVehicleReplaced] = "Your personal vehicle was removed and forgotten. This server only lets you keep one vehicle at a time.",
346347
[Loc.VehicleSpawner.TooManySpawns] = "You are spawning vehicles too quickly. Try again in ~y~{seconds}~s~ second(s).",
347348

348349
[Loc.OnlinePlayers.Title] = "Online Players",

src/Client/vMenu.Enhanced.MenuFramework/Localization/Loc.VehicleSpawner.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public static class VehicleSpawner
5656

5757
public const string OldVehicleRemoved = "vehiclespawner.oldvehicleremoved";
5858

59+
public const string PersonalVehicleReplaced = "vehiclespawner.personalvehiclereplaced";
60+
5961
public const string TooManySpawns = "vehiclespawner.toomanyspawns";
6062
}
6163
}

src/Client/vMenu.Enhanced.Menus/Vehicles/Personal/PersonalVehicle.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,18 @@ public static async Task ForgetAsync()
170170
}
171171
}
172172

173+
public static async Task SurrenderAsync()
174+
{
175+
if (!IsMarked)
176+
{
177+
return;
178+
}
179+
180+
await ServerActions.InvokeAsync(ActionIds.PersonalVehicle.Forget);
181+
182+
Release();
183+
}
184+
173185
public static async Task DeleteAsync()
174186
{
175187
if (_busy || !Guarded())

src/Client/vMenu.Enhanced.Menus/Vehicles/VehicleSpawnOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public static void SetSpawnInside(bool spawnInside) =>
1818
public static bool CanKeepPrevious =>
1919
ClientPermissions.IsAllowed(VehicleSpawnerPermissions.AllowKeepPreviousVehicle);
2020

21+
public static bool ForcedReplace => !CanKeepPrevious;
22+
2123
public static void SetReplacePrevious(bool replace)
2224
{
2325
if (!replace && !CanKeepPrevious)

src/Client/vMenu.Enhanced.Menus/Vehicles/VehicleSpawning.cs

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ public static class VehicleSpawning
6060
rpm = Native.GetVehicleCurrentRpm(currentVehicle.Handle);
6161
}
6262

63-
var position = SpawnPosition(ped, currentVehicle, hash, spawnInside);
63+
var removingCurrent = WillRemoveCurrent(ped.Handle, currentVehicle?.Handle ?? 0);
64+
65+
var position = SpawnPosition(ped, currentVehicle, hash, spawnInside, removingCurrent);
6466

6567
var heading = spawnInside ? ped.Heading : ped.Heading + 90f;
6668

67-
RemovePrevious(ped.Handle, currentVehicle?.Handle ?? 0);
69+
await RemovePreviousAsync(ped.Handle, currentVehicle?.Handle ?? 0, removingCurrent);
6870

6971
var orphanMode = VehicleSpawnerSettings.NormaliseOrphanMode(ClientConfig.Value(VehicleSpawnerSettings.OrphanMode));
7072

@@ -128,7 +130,7 @@ private static void ReportSpawn(int entity)
128130
API.EmitServer(VehicleEvents.Spawned, Native.NetworkGetNetworkIdFromEntity(entity));
129131
}
130132

131-
private static Vector3 SpawnPosition(Ped ped, Vehicle? currentVehicle, uint hash, bool spawnInside)
133+
private static Vector3 SpawnPosition(Ped ped, Vehicle? currentVehicle, uint hash, bool spawnInside, bool removingCurrent)
132134
{
133135
if (spawnInside && currentVehicle is null)
134136
{
@@ -139,9 +141,7 @@ private static Vector3 SpawnPosition(Ped ped, Vehicle? currentVehicle, uint hash
139141

140142
var clearance = (Math.Abs((spawnedMin - spawnedMax).Y) / 2) + 1f;
141143

142-
var replace = VehicleSpawnOptions.ReplacePrevious;
143-
144-
if (currentVehicle is not null && replace && currentVehicle.GetPedInVehicleSeat(-1, false) == ped.Handle)
144+
if (currentVehicle is not null && removingCurrent)
145145
{
146146
return currentVehicle.Position;
147147
}
@@ -158,15 +158,15 @@ private static Vector3 SpawnPosition(Ped ped, Vehicle? currentVehicle, uint hash
158158
return Native.GetOffsetFromEntityInWorldCoords(currentVehicle.Handle, 0f, clearance, 0f);
159159
}
160160

161-
private static void RemovePrevious(int ped, int currentVehicle)
161+
private static async Task RemovePreviousAsync(int ped, int currentVehicle, bool removingCurrent)
162162
{
163163
var replace = VehicleSpawnOptions.ReplacePrevious;
164164

165165
if (MayRemove(_previousVehicle, ped))
166166
{
167167
if (replace)
168168
{
169-
VehicleDeletion.DeleteLocally(_previousVehicle);
169+
await RemoveAsync(_previousVehicle, notify: false);
170170
}
171171
else if (!ClientConfig.Value(VehicleSpawnerSettings.KeepSpawnedVehiclesPersistent))
172172
{
@@ -177,26 +177,60 @@ private static void RemovePrevious(int ped, int currentVehicle)
177177
_previousVehicle = 0;
178178
}
179179

180-
if (!replace || currentVehicle == 0 || !Native.DoesEntityExist(currentVehicle))
180+
if (!removingCurrent)
181181
{
182182
return;
183183
}
184184

185-
if (PersonalVehicle.Owns(currentVehicle))
185+
_previousVehicle = _previousVehicle == currentVehicle ? 0 : _previousVehicle;
186+
187+
await RemoveAsync(currentVehicle, notify: true);
188+
}
189+
190+
private static async Task RemoveAsync(int vehicle, bool notify)
191+
{
192+
if (vehicle == 0 || !Native.DoesEntityExist(vehicle))
186193
{
187194
return;
188195
}
189196

190-
if (Native.GetPedInVehicleSeat(currentVehicle, DriverSeat, false) != ped)
197+
var personal = PersonalVehicle.Owns(vehicle);
198+
199+
if (personal)
200+
{
201+
await PersonalVehicle.SurrenderAsync();
202+
}
203+
204+
VehicleDeletion.DeleteLocally(vehicle);
205+
206+
if (personal)
191207
{
208+
Notifications.Info(MenuText.Key(Loc.VehicleSpawner.PersonalVehicleReplaced));
209+
192210
return;
193211
}
194212

195-
_previousVehicle = _previousVehicle == currentVehicle ? 0 : _previousVehicle;
213+
if (notify)
214+
{
215+
Notifications.Info(MenuText.Key(Loc.VehicleSpawner.OldVehicleRemoved));
216+
}
217+
}
196218

197-
VehicleDeletion.DeleteLocally(currentVehicle);
219+
private static bool WillRemoveCurrent(int ped, int currentVehicle)
220+
{
221+
if (!VehicleSpawnOptions.ReplacePrevious
222+
|| currentVehicle == 0
223+
|| !Native.DoesEntityExist(currentVehicle))
224+
{
225+
return false;
226+
}
227+
228+
if (PersonalVehicle.Owns(currentVehicle) && !VehicleSpawnOptions.ForcedReplace)
229+
{
230+
return false;
231+
}
198232

199-
Notifications.Info(MenuText.Key(Loc.VehicleSpawner.OldVehicleRemoved));
233+
return Native.GetPedInVehicleSeat(currentVehicle, DriverSeat, false) == ped;
200234
}
201235

202236
private static bool MayRemove(int vehicle, int ped)
@@ -206,7 +240,7 @@ private static bool MayRemove(int vehicle, int ped)
206240
return false;
207241
}
208242

209-
if (PersonalVehicle.Owns(vehicle))
243+
if (PersonalVehicle.Owns(vehicle) && !VehicleSpawnOptions.ForcedReplace)
210244
{
211245
return false;
212246
}

0 commit comments

Comments
 (0)