Finalize Surgery

This commit is contained in:
VegaZ
2021-05-03 21:33:56 +02:00
81 changed files with 3654 additions and 609 deletions

View File

@@ -32,21 +32,6 @@ namespace ReallifeGamemode.Server.Managers
[RemoteEvent("creatorSave")]
public void CreatorSave(Player player, bool gender, string parentData, string featureData, string appearanceData, string hairAndColorData)
{
var charExists = false;
var genderSwap = false;
var cUser = player.GetUser();
if (cUser.CharacterId != null)
{
charExists = true;
if(cUser.Character.Gender != gender)
{
genderSwap = true;
}
}
var jParentData = JObject.Parse(parentData);
var jFeatureData = JArray.Parse(featureData);
var jAppearanceData = JArray.Parse(appearanceData);
@@ -79,27 +64,27 @@ namespace ReallifeGamemode.Server.Managers
float neckWidth = jFeatureData.Value<float>(19);
byte blemishes = jAppearanceData[0].Value<byte>("Value");
float blemishesOpacity = jAppearanceData[0].Value<byte>("Opacity");
float blemishesOpacity = jAppearanceData[0].Value<float>("Opacity");
byte facialHair = jAppearanceData[1].Value<byte>("Value");
float facialHairOpacity = jAppearanceData[1].Value<byte>("Opacity");
float facialHairOpacity = jAppearanceData[1].Value<float>("Opacity");
byte eyebrows = jAppearanceData[2].Value<byte>("Value");
float eyebrowsOpacity = jAppearanceData[2].Value<byte>("Opacity");
float eyebrowsOpacity = jAppearanceData[2].Value<float>("Opacity");
byte ageing = jAppearanceData[3].Value<byte>("Value");
float ageingOpacity = jAppearanceData[3].Value<byte>("Opacity");
float ageingOpacity = jAppearanceData[3].Value<float>("Opacity");
byte makeup = jAppearanceData[4].Value<byte>("Value");
float makeupOpacity = jAppearanceData[4].Value<byte>("Opacity");
float makeupOpacity = jAppearanceData[4].Value<float>("Opacity");
byte blush = jAppearanceData[5].Value<byte>("Value");
float blushOpacity = jAppearanceData[5].Value<byte>("Opacity");
float blushOpacity = jAppearanceData[5].Value<float>("Opacity");
byte complexion = jAppearanceData[6].Value<byte>("Value");
float complexionOpacity = jAppearanceData[6].Value<byte>("Opacity");
float complexionOpacity = jAppearanceData[6].Value<float>("Opacity");
byte sunDamage = jAppearanceData[7].Value<byte>("Value");
float sunDamageOpacity = jAppearanceData[7].Value<byte>("Opacity");
float sunDamageOpacity = jAppearanceData[7].Value<float>("Opacity");
byte lipstick = jAppearanceData[8].Value<byte>("Value");
float lipstickOpacity = jAppearanceData[8].Value<byte>("Opacity");
float lipstickOpacity = jAppearanceData[8].Value<float>("Opacity");
byte freckles = jAppearanceData[9].Value<byte>("Value");
float frecklesOpacity = jAppearanceData[9].Value<byte>("Opacity");
float frecklesOpacity = jAppearanceData[9].Value<float>("Opacity");
byte chestHair = jAppearanceData[10].Value<byte>("Value");
float chestHairOpacity = jAppearanceData[10].Value<byte>("Opacity");
float chestHairOpacity = jAppearanceData[10].Value<float>("Opacity");
byte hair = jHairAndColorData.Value<byte>(0);
byte hairColor = jHairAndColorData.Value<byte>(1);
@@ -111,8 +96,26 @@ namespace ReallifeGamemode.Server.Managers
byte lipstickColor = jHairAndColorData.Value<byte>(7);
byte chestHairColor = jHairAndColorData.Value<byte>(8);
var charExists = false;
var genderSwap = false;
using (var saveCharacter = new DatabaseContext())
{
var userId = player.GetUser(saveCharacter).Id;
var user = saveCharacter.Users.SingleOrDefault(u => u.Id == userId);
var oldChar = saveCharacter.Characters.FirstOrDefault(c => c.UserId == user.Id);
if (user.CharacterId != null)
{
charExists = true;
if (oldChar.Gender != gender)
{
genderSwap = true;
}
}
var character = new Database.Entities.Character
{
UserId = player.GetUser().Id,
@@ -181,20 +184,15 @@ namespace ReallifeGamemode.Server.Managers
saveCharacter.Characters.Add(character);
saveCharacter.SaveChanges();
var userId = player.GetUser().Id;
var user = saveCharacter.Users.SingleOrDefault(u => u.Id == userId);
user.CharacterId = character.Id;
if (genderSwap)
{
var charClothes = saveCharacter.CharacterClothes.Where(c => c.UserId == user.Id);
foreach(var cloth in charClothes)
{
saveCharacter.Remove(cloth);
saveCharacter.SaveChanges();
}
var charClothes = saveCharacter.CharacterClothes.Where(c => c.UserId == user.Id);
saveCharacter.RemoveRange(charClothes);
saveCharacter.SaveChanges();
}
for (var x = 1; x <= 11; x++)
@@ -280,12 +278,12 @@ namespace ReallifeGamemode.Server.Managers
}
}
if (charExists)
{
user.BankAccount.Balance -= 15000;
if(user.FreeSurgery == true) user.FreeSurgery = false;
}
saveCharacter.Remove(oldChar);
}
saveCharacter.SaveChanges();
}
//HeadOverlay makeupHo = new HeadOverlay()
@@ -304,14 +302,15 @@ namespace ReallifeGamemode.Server.Managers
//};
//player.SetHeadOverlay(4, makeupHo);
//player.SetHeadOverlay(5, blushHo);
player.SafeTeleport(Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING, true);
player.TriggerEvent("draw", player.Name, player.Handle.Value);
player.Dimension = 0;
if (charExists)
{
ApplyCharacter(player);
UpdateCharacterCloth.LoadCharacterDefaults(player);
{
LeaveSurgery(player);
}
else
{
player.SafeTeleport(Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING, true);
player.TriggerEvent("draw", player.Name, player.Handle.Value);
player.Dimension = 0;
}
}

View File

@@ -24,7 +24,7 @@ namespace ReallifeGamemode.Server.Managers
{
foreach (Door door in dbContext.Doors)
{
_doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, 30f);
_doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, door.AlwaysOpen ? 200f : 30f);
}
}
}
@@ -63,7 +63,7 @@ namespace ReallifeGamemode.Server.Managers
player.SendNotification(notStr, true);
NAPI.Pools.GetAllPlayers().ForEach(p => p.TriggerEvent("changeDoorState", d.Model, d.X, d.Y, d.Z, (d.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f));
NAPI.Pools.GetAllPlayers().ForEach(p => UpdateDoorState(p, d));
}
}
dbContext.SaveChanges();
@@ -80,9 +80,14 @@ namespace ReallifeGamemode.Server.Managers
using (var dbContext = new DatabaseContext())
{
Door door = dbContext.Doors.Where(d => d.Id == doorId).First();
player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f);
UpdateDoorState(player, door);
}
}
}
private static void UpdateDoorState(Player player, Door door)
{
player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked || door.AlwaysOpen ? 1 : 0), 0.0f, 0.0f, door.AlwaysOpen ? 1.0f : 0.0f);
}
}
}

View File

@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
using Newtonsoft.Json;
@@ -603,16 +603,16 @@ namespace ReallifeGamemode.Server.Managers
{
if (amount > 0 && amount <= 10000)
{
player.SendNotification($"~w~Du hast ~y~{targetname} ~w~ein Ticket in Höhe von ~b~{amount}$ ~w~gestellt. Grund: ~g~{reason}~w~.");
target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} | {playername} ~w~hat dir ein Ticket in Höhe von ~y~{amount}$ ~w~gestellt.", true);
target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Strafticket im Interaktionsmenü annehmen.", true);
player.SendNotification($"~w~Du hast ~y~{targetname} ~w~ein Ticket in Höhe von ~b~${amount} ~w~ausgestellt. Grund: ~g~{reason}~w~.");
target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} {playername} ~w~hat dir ein Ticket in Höhe von ~y~${amount} ~w~ausgestellt.", true);
target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Das Ticket kann im Interaktionsmenü angenommen werden.", true);
target.SetData("ticket_boolean", true);
target.SetData<int>("ticket_amount", amount);
target.SetData<Player>("ticket_player", player);
}
else
{
player.SendNotification("~r~Du kannst nur zwischen 1$ und 10000$ angeben!");
player.SendNotification("~r~Du kannst nur zwischen $1 und $10.000 angeben!");
}
}
}
@@ -668,8 +668,8 @@ namespace ReallifeGamemode.Server.Managers
targetUser.Points += amount;
player.SendNotification($"~w~Du hast ~y~{targetname} ~b~{amount} ~w~Strafpunkte gegeben. Grund: ~g~{reason}~w~.");
target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} | {playername} ~w~hat dir ~y~{amount} ~w~Strafpunkte gegeben.", true);
ChatService.HQMessage(targetname + " hat von " + playername + " " + amount + " Strafpunkt(e) erhalten. Gesamt: " + targetUser.Points);
target.SendNotification($"~b~{player.GetUser().FactionRank.RankName} {playername} ~w~hat dir ~y~{amount} ~w~Strafpunkte gegeben (Grund: ~r~{reason}~w~).", true);
ChatService.HQMessage(targetname + " hat von " + playername + " " + amount + " Strafpunkt(e) erhalten (Grund: " + reason + "). Gesamt: " + targetUser.Points);
if (targetUser.Points < 0)
{
@@ -677,9 +677,7 @@ namespace ReallifeGamemode.Server.Managers
}
else if (targetUser.Points >= 12)
{
target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~r~12/12 ~x~Strafpunkten.", true);
target.SendNotification($"~w~Dir wird ~r~Auto- ~w~und ~r~Motorradführerschein ~w~entzogen.", true); //FlashNotif
target.SendNotification($"~x~Du hast nun ~r~12/12 ~x~Strafpunkte. ~w~Dir wurde dein ~r~Auto- und dein Motorradführerschein ~w~entzogen.", true);
ChatService.HQMessage(targetname + " besitzt nun keinen Führerschein mehr.");
targetUser.Points = 0;
@@ -688,7 +686,7 @@ namespace ReallifeGamemode.Server.Managers
}
else
{
target.SendNotification($"~w~Grund: ~g~{reason}~w~. ~x~Du hast nun ~y~{targetUser.Points}/12 ~x~Strafpunkten.", true);
target.SendNotification($"~x~Du hast nun ~y~{targetUser.Points}/12 ~x~Strafpunkt(e).", true);
}
dbContext.SaveChanges();
@@ -755,7 +753,16 @@ namespace ReallifeGamemode.Server.Managers
public void InteractionMenu_Pay(Player player, string jsonNameOrId, string stringAmount)
{
string nameOrId = (string)JsonConvert.DeserializeObject(jsonNameOrId);
int amount = Int32.Parse(stringAmount);
int amount;
try
{
amount = Int32.Parse(stringAmount);
}
catch
{
player.SendNotification("~r~" + stringAmount + " ist kein gültiger Betrag.");
return;
}
Player target = PlayerService.GetPlayerByNameOrId(nameOrId);
List<Player> nearbyPlayers = NAPI.Player.GetPlayersInRadiusOfPlayer(3, player);
@@ -771,7 +778,7 @@ namespace ReallifeGamemode.Server.Managers
}
else if (!nearbyPlayers.Contains(target))
{
player.SendNotification("~r~Dieser Spieler befindet sich nicht in deiner nähe!");
player.SendNotification("~r~Dieser Spieler befindet sich nicht in deiner Nähe!");
}
else if (player.GetUser().Handmoney < amount)
{

View File

@@ -531,8 +531,7 @@ namespace ReallifeGamemode.Server.Managers
{
if (usableItemObj.Use(fItem))
{
List<InventoryItem> items = backpackItems[player];
player.SetSharedData("backpackItems", JsonConvert.SerializeObject(items.ToArray()));
SetBackpackItems(player);
player.TriggerEvent("aproveUse", 1, iItem.Name);
}
}
@@ -590,6 +589,7 @@ namespace ReallifeGamemode.Server.Managers
break;
}
context.SaveChanges();
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -204,7 +204,7 @@ namespace ReallifeGamemode.Server.Managers
if (job != null && job.GetUsersInJob().Contains(player))
{
if(job.CheckVehicle(player, veh) && seat == 0)
if (job.CheckVehicle(player, veh) && seat == 0)
{
if (!playerTimersJobVehicleRespawn.ContainsKey(player))
return;
@@ -212,7 +212,7 @@ namespace ReallifeGamemode.Server.Managers
playerTimersJobVehicleRespawn[player].Stop();
playerTimersJobVehicleRespawn.Remove(player);
}
else
else if (job != GetJob<RefuseCollectorJob>())
{
player.StopAnimation();
player.WarpOutOfVehicle();

View File

@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
using ReallifeGamemode.Server.Shop.Clothing;
@@ -32,6 +32,11 @@ namespace ReallifeGamemode.Server.Managers
public static List<AmmunationPoint> AmmunationPoints = new List<AmmunationPoint>();
public static List<RentcarPoint> rentcarPoints = new List<RentcarPoint>();
public static Vector3 eventportPosition;
public static bool eventportActive = false;
public static void LoadPositionManager()
{
#region DutyPoints
@@ -148,7 +153,7 @@ namespace ReallifeGamemode.Server.Managers
};
ElevatorPoint FibElevatorPointGarage = new ElevatorPoint()
{
Position = new Vector3(124.2521, -741.3329, 33.13322), //FBI ganz ganz unten
Position = new Vector3(125.172, -739.3329, 33.13322), //FBI ganz ganz unten
FactionId = 3,
Stage = "Garage"
};
@@ -304,8 +309,47 @@ namespace ReallifeGamemode.Server.Managers
}
#endregion Shops
#region RentCar
RentcarPoint rentCarNoobSpawn = new RentcarPoint()
{
Position = Rentcar.noobSpawnBlipPosition
};
RentcarPoint rentCarStadthalle = new RentcarPoint()
{
Position = Rentcar.stadthalleBlipPosition
};
RentcarPoint rentCarKnast = new RentcarPoint()
{
Position = Rentcar.knastBlipPosition
};
RentcarPoint rentCarPaleto = new RentcarPoint()
{
Position = Rentcar.paletoBlipPosition
};
RentcarPoint rentCarLamesa = new RentcarPoint()
{
Position = Rentcar.lamesaBlipPosition
};
rentcarPoints.Add(rentCarNoobSpawn);
rentcarPoints.Add(rentCarLamesa);
rentcarPoints.Add(rentCarStadthalle);
rentcarPoints.Add(rentCarKnast);
rentcarPoints.Add(rentCarPaleto);
foreach (RentcarPoint point in rentcarPoints)
{
NAPI.Marker.CreateMarker(1, new Vector3(point.Position.X, point.Position.Y, point.Position.Z - 2), new Vector3(point.Position.X, point.Position.Y, point.Position.Z + 1),
new Vector3(0, 0, 0), 1.5f, new Color(255, 255, 255, 50), false, 0);
NAPI.TextLabel.CreateTextLabel("~y~Fahrzeugverleih\n~w~Drücke ~b~E~w~ um ein Fahrzeug zu mieten", point.Position, 7, 1, 0, new Color(255, 255, 255), false, 0);
NAPI.Blip.CreateBlip(88, new Vector3(point.Position.X, point.Position.Y, point.Position.Z), (float)0.7, 59, "Fahrzeugvermietung", 255, 200, true, 0, 0);
}
}
#endregion RentCar
[RemoteEvent("sendClientToStage")]
public void ElevatorSendToStage(Player player, string level)
{
@@ -436,3 +480,9 @@ public class AmmunationPoint
public Vector3 Position { get; set; }
public Ammunation Ammunation { get; set; }
}
public class RentcarPoint
{
public Vector3 Position { get; set; }
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
using ReallifeGamemode.Database.Entities;
@@ -35,7 +36,7 @@ namespace ReallifeGamemode.Server.Managers
colShape.OnEntityEnterColShape += (cs, c) =>
{
using var dbContext = new DatabaseContext();
if (c.IsInVehicle && c.VehicleSeat == 0)
if (c.IsInVehicle && c.VehicleSeat == 0 && IsPlayerAllowedToTuneVehicle(c, c.Vehicle, dbContext))
{
c.TriggerEvent("showTuningInfo");
}
@@ -43,12 +44,42 @@ namespace ReallifeGamemode.Server.Managers
colShape.OnEntityExitColShape += (cs, c) =>
{
c.TriggerEvent("hideTuningInfo", true);
if(c.IsInVehicle)
{
c.TriggerEvent("hideTuningInfo", true);
}
};
tuningGarages.Add(colShape);
}
private static bool IsPlayerAllowedToTuneVehicle(Player c, Vehicle vehicle, DatabaseContext dbContext)
{
User user = c.GetUser();
if(user == null)
{
return false;
}
ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext);
if(serverVehicle == null)
{
return false;
}
if(serverVehicle is UserVehicle userVehicle && userVehicle.UserId == user.Id)
{
return true;
}
if(serverVehicle is FactionVehicle factionVehicle && factionVehicle.GetOwners().Contains(user.FactionId ?? 0))
{
return true;
}
return false;
}
public static void ApplyTuningToServerVehicle(ServerVehicle sVeh)
{
Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(sVeh);
@@ -81,7 +112,33 @@ namespace ReallifeGamemode.Server.Managers
{
if (!player.IsInVehicle) return;
player.TriggerEvent("showTuningMenu");
player.TriggerEvent("showTuningMenu", false, GetVehicleBasePrice(player.Vehicle));
}
private int GetVehicleBasePrice(Vehicle vehicle)
{
if(vehicle == null)
{
return 0;
}
ServerVehicle serverVehicle = vehicle.GetServerVehicle();
if(serverVehicle == null)
{
return 0;
}
if(serverVehicle is UserVehicle userVehicle)
{
return userVehicle.Price ?? 0;
}
if(serverVehicle is FactionVehicle factionVehicle)
{
return factionVehicle.BuyPrice;
}
return 0;
}
[RemoteEvent("repairVehicle")]

View File

@@ -5,7 +5,9 @@ using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Log;
using ReallifeGamemode.Server.Services;
using ReallifeGamemode.Server.Util;
using ReallifeGamemode.Services;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -770,11 +772,13 @@ namespace ReallifeGamemode.Server.Managers
"fibd2",//mod
"fibj",//mod
"fibn3",//mod
"fibr"//mod
"fibr",//mod
"vicechee", //mod
"sheriffcoqm", //mod
"polcoquette", //mod
};
private static readonly Dictionary<int, NetHandle> _serverVehicles = new Dictionary<int, NetHandle>();
private static readonly Dictionary<int, ushort> _serverVehicles = new Dictionary<int, ushort>();
private static readonly Dictionary<NetHandle, Vector3> lastPositions = new Dictionary<NetHandle, Vector3>();
private static DateTime lastSave = DateTime.UtcNow;
@@ -855,17 +859,23 @@ namespace ReallifeGamemode.Server.Managers
{
if (_serverVehicles.ContainsKey(serverVehicle.Id))
{
logger.LogCritical("Server Vehicle {Id} already has a spawned vehicle", serverVehicle.Id);
_serverVehicles[serverVehicle.Id].Entity<Vehicle>().Delete();
var spawnedHandle = _serverVehicles.Where(s => s.Key == serverVehicle.Id).First().Value;
logger.LogCritical("Server Vehicle {Id} already has a spawned vehicle with handle {spawnedHandle}", serverVehicle.Id, spawnedHandle);
new NetHandle(_serverVehicles[serverVehicle.Id], EntityType.Vehicle).Entity<Vehicle>().Delete();
}
if (_serverVehicles.ContainsValue(vehicle.Handle))
if (_serverVehicles.ContainsValue(vehicle.Handle.Value))
{
logger.LogCritical("Vehicle handle {Handle} already belongs");
var dbId = _serverVehicles.Where(v => v.Value == vehicle.Handle.Value).First().Key;
var dbIdHandle = vehicle.Handle.Value;
logger.LogCritical("Vehicle handle {handle} already belongs to server vehicle {dbIdHandle}", dbIdHandle, dbId);
return;
}
_serverVehicles[serverVehicle.Id] = vehicle.Handle;
var id = serverVehicle.Id;
var handle = vehicle.Handle.Value;
logger.LogInformation("Mapping server vehicle id {id} to vehicle {handle}", id, handle);
_serverVehicles[serverVehicle.Id] = vehicle.Handle.Value;
}
internal static void DeleteVehicle(Vehicle veh)
@@ -873,15 +883,18 @@ namespace ReallifeGamemode.Server.Managers
ServerVehicle sVeh;
if ((sVeh = GetServerVehicleFromVehicle(veh)) != null)
{
var id = sVeh.Id;
var handle = veh.Handle.Value;
logger.LogInformation("Deleting server vehicle {id} mapping to spawned veh {handle}", id, handle);
_serverVehicles.Remove(sVeh.Id);
}
veh?.Delete();
}
public static Vehicle GetVehicleFromHandle(NetHandle handle)
public static Vehicle GetVehicleFromHandle(ushort handle)
{
return NAPI.Pools.GetAllVehicles().Find(v => v.Handle == handle);
return NAPI.Pools.GetAllVehicles().Find(v => v.Handle.Value == handle);
}
public static Vehicle GetVehicleFromId(int id)
@@ -917,9 +930,9 @@ namespace ReallifeGamemode.Server.Managers
dbContext = dbContext ?? new DatabaseContext();
foreach (KeyValuePair<int, NetHandle> pair in _serverVehicles)
foreach (KeyValuePair<int, ushort> pair in _serverVehicles)
{
if (pair.Value == veh.Handle)
if (pair.Value == veh.Handle.Value)
{
return dbContext.ServerVehicles.Find(pair.Key);
}
@@ -946,6 +959,17 @@ namespace ReallifeGamemode.Server.Managers
[ServerEvent(Event.VehicleDeath)]
public static void VehicleManagerVehicleDeath(Vehicle vehicle)
{
/*
String rentCarOwner = Rentcar.mapPlayerRentcarBill.FirstOrDefault(x => x.Value.Item1 == vehicle).Key;
ChatService.Broadcast("a:" + "");
if (rentCarOwner != null)
{
Player target = PlayerService.GetPlayerByNameOrId(rentCarOwner);
Rentcar.cancelRent(target);
}
*/
ServerVehicle serverVehicle = GetServerVehicleFromVehicle(vehicle);
if (serverVehicle == null)