diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index ce111e3f..ad9d1d4a 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -194,6 +194,9 @@ PilotRouteList(globalData); import gangwarHandle from './util/Gangwar'; gangwarHandle(globalData); +import weapondamageUtil from './util/weapondamage'; +weapondamageUtil(); + import clotheShopList from './Interaction/clothes/ClotheShop'; clotheShopList(globalData); diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts new file mode 100644 index 00000000..3eeddd5d --- /dev/null +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -0,0 +1,91 @@ +export default function weapondamageUtil() { + mp.events.add('SERVER:WeaponModifier', (player) => { + //mp.gui.chat.push("Modifier steht jetzt auf" + modifier); + //mp.players.local.setWeaponDamageModifier(modifier); + let modifier = 1; + let meelemodifier = 1; + + switch (player.weapon) { + case 0x1B06D571: //Pistol + modifier = 0.4; + meelemodifier = 1; + mp.gui.chat.push("PistolModifier: " + modifier); + break; + case 0xBFE256D4: //Pistol_MK2 + modifier = 0.4; + meelemodifier = 1; + break; + case 0x5EF9FEC4: //Combatpistol + modifier = 0.5; + meelemodifier = 1; + break; + case 0x99AEEB3B: //Pistol50 + modifier = 0.35; + meelemodifier = 1; + break; + case 0x2BE6766B: //SMG + modifier = 0.25; + meelemodifier = 1; + break; + case 0x1D073A89: //Pumpshotgun + modifier = 0.2; + meelemodifier = 1; + break; + case 0x83BF0278: //Cabinerifle + modifier = 0.25; + meelemodifier = 1; + break; + case 0x624FE830: //Compactrifle + modifier = 0.2; + meelemodifier = 1; + break; + case 0x05FC3C11: //Sniperrifle + modifier = 0.5; + meelemodifier = 1; + break; + case 0xA2719263: //Meele Umarmed Fist + meelemodifier = 0.1; + modifier = 1; + mp.gui.chat.push("FistModifier: " + meelemodifier); + break; + case 0x958A4A8F: //Meele Baseball Bat + meelemodifier = 0.15; + modifier = 1; + break; + case 0x8BB05FD7: //Meele Flashlight + meelemodifier = 0.1; + modifier = 1; + break; + case 0xD8DF3C3C: //Meele Knuckle + meelemodifier = 0.1; + modifier = 1; + mp.gui.chat.push("KnuckleModifier: " + meelemodifier); + break; + case 0x678B81B1: //Meele Nightstick + meelemodifier = 0.1; + modifier = 1; + break; + default: + modifier = 1; + meelemodifier = 1; + break; + } + mp.game.invoke("0xCE07B9F7817AADA3", player, modifier); + mp.game.invoke("0x4A3DC7ECCC321032", player, meelemodifier); + mp.gui.chat.push("Modifier: " + modifier + "MeeleModifier: " +meelemodifier); + }); + mp.events.add('SERVER:WeaponModifier2', (player, modifier, meelemodifier) => { + //mp.gui.chat.push("Modifier steht jetzt auf" + modifier); + //mp.players.local.setWeaponDamageModifier(modifier); + mp.game.invoke("0xCE07B9F7817AADA3", player, modifier); + mp.game.invoke("0x4A3DC7ECCC321032", player, meelemodifier); + mp.gui.chat.push("Modifier: " + modifier + "MeeleModifier: " + meelemodifier); + }); + /*mp.events.add('playerWeaponShot', (targetPosition, targetEntity) => { +for (var x in this.weaponAmmo) { + if (this.weaponAmmo[x].id != this.currentWeapon) { + continue; + } + this.weaponAmmo[x].ammo = this.weaponAmmo[x].ammo - 1; +}*/ +} \ No newline at end of file diff --git a/ReallifeGamemode.Database/Entities/NoobVehicle.cs b/ReallifeGamemode.Database/Entities/NoobVehicle.cs new file mode 100644 index 00000000..70735419 --- /dev/null +++ b/ReallifeGamemode.Database/Entities/NoobVehicle.cs @@ -0,0 +1,7 @@ +namespace ReallifeGamemode.Database.Entities +{ + public partial class NoobVehicle : ServerVehicle + { + //public int SchoolId { get; set; } + } +} diff --git a/ReallifeGamemode.Database/Entities/User.cs b/ReallifeGamemode.Database/Entities/User.cs index 043e32bd..01f206ba 100644 --- a/ReallifeGamemode.Database/Entities/User.cs +++ b/ReallifeGamemode.Database/Entities/User.cs @@ -21,6 +21,12 @@ namespace ReallifeGamemode.Database.Entities [NotMapped] private int _wanteds; + [NotMapped] + private int _handMoney; + + public delegate void UserHandMoneyChangedEvent(User account); + public static event UserHandMoneyChangedEvent HandMoneyChanged; + [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } @@ -40,7 +46,16 @@ namespace ReallifeGamemode.Database.Entities public AdminLevel AdminLevel { get; set; } public bool Dead { get; set; } - public int Handmoney { get; set; } + public int Handmoney + { + get => _handMoney; + + set + { + _handMoney = value; + + } + } public float PositionX { get; set; } public float PositionY { get; set; } @@ -80,7 +95,7 @@ namespace ReallifeGamemode.Database.Entities set { this._wanteds = value; - Player.TriggerEvent("SERVER:SetWanteds", value); + HandMoneyChanged?.Invoke(this); } } @@ -90,6 +105,8 @@ namespace ReallifeGamemode.Database.Entities public int PaydayTimer { get; set; } = 60; + public int PlayedMinutes { get; set; } = 1; + public bool DriverLicenseVehicle { get; set; } = false; public bool FlyingLicensePlane { get; set; } = false; diff --git a/ReallifeGamemode.Database/Models/DatabaseContext.cs b/ReallifeGamemode.Database/Models/DatabaseContext.cs index 16b07774..0bf0ee48 100644 --- a/ReallifeGamemode.Database/Models/DatabaseContext.cs +++ b/ReallifeGamemode.Database/Models/DatabaseContext.cs @@ -136,6 +136,9 @@ namespace ReallifeGamemode.Database.Models //Driving/Bike/Flight School public DbSet SchoolVehicles { get; set; } + //Noob Vehicles + public DbSet NoobVehicles { get; set; } + //Gangwar public DbSet Turfs { get; set; } diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 5b2a975d..91e443a2 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -147,21 +147,36 @@ namespace ReallifeGamemode.Server.Commands ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position"); break; case AdminLevel.SUPPORTER: - ChatService.SendMessage(player, "~b~ " + "/tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position, /tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); break; case AdminLevel.ADMIN: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position, /tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); ChatService.SendMessage(player, "~b~ " + "/a, /countdown, /freeze, /unfreeze, /mark, /gotmark, /gotox, /up, /setdimension, /spec, /warn, /ip, /kick, /ban /unban, /slap, /takeweapon, /tov, /ghv, /factionlist, /businesslist, /joblist"); break; case AdminLevel.ADMIN2: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position, /tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); + ChatService.SendMessage(player, "~b~ " + "/a, /countdown, /freeze, /unfreeze, /mark, /gotmark, /gotox, /up, /setdimension, /spec, /warn, /ip, /kick, /ban /unban, /slap, /takeweapon, /tov, /ghv, /factionlist, /businesslist, /joblist"); ChatService.SendMessage(player, "~b~ " + "/sethp, /setarmor, /arevive, /aunjail, /aclear, /clothes, /props"); break; case AdminLevel.ADMIN3: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position, /tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); + ChatService.SendMessage(player, "~b~ " + "/a, /countdown, /freeze, /unfreeze, /mark, /gotmark, /gotox, /up, /setdimension, /spec, /warn, /ip, /kick, /ban /unban, /slap, /takeweapon, /tov, /ghv, /factionlist, /businesslist, /joblist"); + ChatService.SendMessage(player, "~b~ " + "/sethp, /setarmor, /arevive, /aunjail, /aclear, /clothes, /props"); ChatService.SendMessage(player, "~b~ " + "/adice, /settime, /setweather, /rsetarmor, /rgiveweapon, /giveweapon, /veh, /fv, /vfix, /vdestroy, /vlivery, /vcolor, /vehsmoke, /aneon, /mod, /showtuningmenu, /rvdestroy, /vsethp"); break; case AdminLevel.HEADADMIN: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position, /tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); + ChatService.SendMessage(player, "~b~ " + "/a, /countdown, /freeze, /unfreeze, /mark, /gotmark, /gotox, /up, /setdimension, /spec, /warn, /ip, /kick, /ban /unban, /slap, /takeweapon, /tov, /ghv, /factionlist, /businesslist, /joblist"); + ChatService.SendMessage(player, "~b~ " + "/sethp, /setarmor, /arevive, /aunjail, /aclear, /clothes, /props"); + ChatService.SendMessage(player, "~b~ " + "/adice, /settime, /setweather, /rsetarmor, /rgiveweapon, /giveweapon, /veh, /fv, /vfix, /vdestroy, /vlivery, /vcolor, /vehsmoke, /aneon, /mod, /showtuningmenu, /rvdestroy, /vsethp"); ChatService.SendMessage(player, "~b~ " + "/aspeed, /set, /setmoney, /givemoney, /sethandmoney, /givehandmoney, /paydaydrop, /setwage, /freekh, /ainvite, /makeleader, /managefactionranks, /setweaponrack, /rmweaponrack, /setweaponrank, /giveitem, /inventory, /save, /remove, /house, /setbusinessbankbalance, /reloaddors, /interior, /editmode, /setbliptemplate, /ipl, /load, /quicksavemode, /createturf, /setturf, /cancleturf, /reloadturfs, /deleteturfs, /setturfpoint"); break; case AdminLevel.PROJEKTLEITUNG: + ChatService.SendMessage(player, "~b~ " + "/team, /tc, /position, /tsupport, /showtickets, /rc, /rc quit, /o, /pm, /dimension, /to, /gh, /clearchat, /skick"); + ChatService.SendMessage(player, "~b~ " + "/a, /countdown, /freeze, /unfreeze, /mark, /gotmark, /gotox, /up, /setdimension, /spec, /warn, /ip, /kick, /ban /unban, /slap, /takeweapon, /tov, /ghv, /factionlist, /businesslist, /joblist"); + ChatService.SendMessage(player, "~b~ " + "/sethp, /setarmor, /arevive, /aunjail, /aclear, /clothes, /props"); + ChatService.SendMessage(player, "~b~ " + "/adice, /settime, /setweather, /rsetarmor, /rgiveweapon, /giveweapon, /veh, /fv, /vfix, /vdestroy, /vlivery, /vcolor, /vehsmoke, /aneon, /mod, /showtuningmenu, /rvdestroy, /vsethp"); + ChatService.SendMessage(player, "~b~ " + "/aspeed, /set, /setmoney, /givemoney, /sethandmoney, /givehandmoney, /paydaydrop, /setwage, /freekh, /ainvite, /makeleader, /managefactionranks, /setweaponrack, /rmweaponrack, /setweaponrank, /giveitem, /inventory, /save, /remove, /house, /setbusinessbankbalance, /reloaddors, /interior, /editmode, /setbliptemplate, /ipl, /load, /quicksavemode, /createturf, /setturf, /cancleturf, /reloadturfs, /deleteturfs, /setturfpoint"); ChatService.SendMessage(player, "~b~ " + "/makeadmin, /whitelist, /blind"); break; } @@ -230,15 +245,23 @@ namespace ReallifeGamemode.Server.Commands ChatService.NotAuthorized(player); return; } + if(!player.IsAdminDuty()) + { + ChatService.SendMessage(player, "~r~ Du bist nicht im Admin-Duty-Modus!"); + ChatService.SendMessage(player, "1"+player.GetData("Adminduty")); + return; + } if (!GlobalHelper.tsupAdmins.Contains(player)) { + ChatService.SendMessage(player, "2"+player.GetData("Adminduty")); GlobalHelper.tsupAdmins.Add(player); player.SetSharedData("blipColor", 30); ChatService.SendMessage(player, "~g~ ** " + "Du befindest dich im T-Support"); } else { + ChatService.SendMessage(player, "3"+player.GetData("Adminduty")); GlobalHelper.tsupAdmins.Remove(player); ChatService.SendMessage(player, "!{#ee4d2e}** " + "Du befindest dich nicht mehr im T-Support"); @@ -265,7 +288,6 @@ namespace ReallifeGamemode.Server.Commands } } } - [Command("aduty", "~m~Benutzung: ~s~/aduty")] public void CmdAduty(Player player) { @@ -275,18 +297,17 @@ namespace ReallifeGamemode.Server.Commands return; } - if (!GlobalHelper.DutyAdmins.Contains(player)) + if (player.GetData("Adminduty") == false) { - GlobalHelper.DutyAdmins.Add(player); + player.SetData("Adminduty", true); ChatService.Broadcast("~g~[SUPPORT] " + player.Name + " hat sich zum Support angemeldet"); player.TriggerEvent("toggleADutyMode", true); - } else { - GlobalHelper.DutyAdmins.Remove(player); + player.SetData("Adminduty", false); ChatService.Broadcast("!{#ee4d2e}[SUPPORT] " + player.Name + " hat sich vom Support abgemeldet"); player.TriggerEvent("toggleADutyMode", false); @@ -1602,6 +1623,18 @@ namespace ReallifeGamemode.Server.Commands #endregion #region ALevel1337 + [Command("wepmod", "~m~Benutzung: ~s~/wepmod [Variable]")] + public void CmdWeaponModifier(Player player, float modifier) + { + player.SendChatMessage("Modifier steht auf" + modifier); + player.TriggerEvent("SERVER:WeaponModifier2", player, modifier, 1); + } + [Command("wepmmod", "~m~Benutzung: ~s~/wepmmod [Variable]")] + public void CmdWeaponMeeleModifier(Player player, float modifier) + { + player.SendChatMessage("MeeleModifier steht auf" + modifier); + player.TriggerEvent("SERVER:WeaponModifier2", player, 1, modifier); + } [Command("gotocp", "~m~Benutzung: ~s~/gotocp")] public void CmdAdminGotocp(Player admin) { @@ -1973,7 +2006,7 @@ namespace ReallifeGamemode.Server.Commands } } - [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip~s~, ~g~Goto (X)~s~, ~r~Marker~s~, ~r~Ped~s~, ~r~Pickup~s~, ~r~TextLabel~s~, ~g~Vehicle~s~, ~g~FVehicle~s~, ~g~SVehicle (X)~s~, ~g~JVehicle (X)~s~, ~g~Location~s~] (Weitere Angaben) = (X)", GreedyArg = true)] + [Command("save", "~m~Benutzung: ~s~/save [Typ = ~g~Blip~s~, ~g~Goto (X)~s~, ~r~Marker~s~, ~r~Ped~s~, ~r~Pickup~s~, ~r~TextLabel~s~, ~g~Vehicle~s~, ~g~FVehicle~s~, ~g~SVehicle (X)~s~, ~g~JVehicle (X)~s~, ~g~SchoolVehicle (X)~s~, ~g~NoobVehicle~s~, ~g~Location~s~] (Weitere Angaben) = (X)", GreedyArg = true)] public void CmdAdminSave(Player player, string typ, string option1 = null, string option2 = null) { if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) @@ -2152,6 +2185,16 @@ namespace ReallifeGamemode.Server.Commands player.SetIntoVehicle(vehicle, 0); } break; + case "noobvehicle": + if (player.IsInVehicle) + { + Vehicle vehicle = player.Vehicle; + vehicle = SaveManager.SaveNoobVehicleData(vehicle, (VehicleHash)vehicle.Model, vehicle.Position, vehicle.Heading, vehicle.NumberPlate, + vehicle.PrimaryColor, vehicle.SecondaryColor, vehicle.Locked, vehicle.EngineStatus); + player.SendNotification("Noobfahrzeug ~g~" + vehicle.DisplayName + "~s~ gespeichert.", true); + player.SetIntoVehicle(vehicle, 0); + } + break; case "location": if (option1 == null || option1.Length < 0) diff --git a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs index d8e78c7d..eeeba2b5 100644 --- a/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs +++ b/ReallifeGamemode.Server/Events/EnterVehicleAttempt.cs @@ -39,6 +39,7 @@ namespace ReallifeGamemode.Server.Events player.SendNotification("~r~Du darfst dieses Fahrzeug nicht benutzen!", true); return; } + } if (vehicle.GetServerVehicle() is SchoolVehicle sVeh) { @@ -55,6 +56,22 @@ namespace ReallifeGamemode.Server.Events return; } } + if (vehicle.GetServerVehicle() is NoobVehicle nVeh) + { + if (!player.IsAdminDuty()) + { + if (player.GetUser().PlayedMinutes > 1800) + { + player.StopAnimation(); + player.SendNotification("~r~Du hast schon über 30 Spielstunden!", true); + return; + } + } + else if (player.IsAdminDuty()) + { + player.SendNotification("~g~Freie Fahrt!", true); + } + } } } } diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index c723d4f4..9f3a5927 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -70,6 +70,10 @@ namespace ReallifeGamemode.Server.Extensions var user = player.GetUser(); return user.GetData("duty", false); } + public static bool IsAdminDuty(this Player player) + { + return player.HasData("Adminduty") ? player.GetData("Adminduty") : false; + } public static Vector3 GetPositionFromPlayer(Player player, float distance, int offset = 0) { var pos = player.Position; diff --git a/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs b/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs index 666f7402..7d8568aa 100644 --- a/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs +++ b/ReallifeGamemode.Server/Extensions/ServerVehicleExtensions.cs @@ -66,6 +66,14 @@ namespace ReallifeGamemode.Server.Extensions { numberplate = $"J{jV.JobId} " + numberplate; } + if (veh is SchoolVehicle) + { + numberplate = "FS" + numberplate; + } + if (veh is NoobVehicle) + { + numberplate = "NV" + numberplate; + } NAPI.Vehicle.SetVehicleNumberPlate(newVeh, numberplate); veh.NumberPlate = numberplate; diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 676c21e8..5b8f2b9f 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -166,6 +166,7 @@ namespace ReallifeGamemode.Server.Finance User user = player.GetUser(dbContext); if (player.IsLoggedIn()) { + user.PlayedMinutes += 1; if (user.PaydayTimer <= 0) { Economy.SetPaycheck(player); diff --git a/ReallifeGamemode.Server/Main.cs b/ReallifeGamemode.Server/Main.cs index c81678c9..e103bc54 100644 --- a/ReallifeGamemode.Server/Main.cs +++ b/ReallifeGamemode.Server/Main.cs @@ -130,6 +130,11 @@ namespace ReallifeGamemode.Server PlayerService.GetPlayerByNameOrId(user).TriggerEvent("updateMoney", account.Balance); } }; + + User.HandMoneyChanged += (user) => + { + user.Player.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney); + }; } [RemoteEvent("CLIENT:Event")] diff --git a/ReallifeGamemode.Server/Managers/SaveManager.cs b/ReallifeGamemode.Server/Managers/SaveManager.cs index 7025c1e8..3059e607 100644 --- a/ReallifeGamemode.Server/Managers/SaveManager.cs +++ b/ReallifeGamemode.Server/Managers/SaveManager.cs @@ -131,6 +131,31 @@ namespace ReallifeGamemode.Server.Managers } } + public static Vehicle SaveNoobVehicleData(Vehicle veh, VehicleHash vehicleModel, Vector3 vehiclePosition, float vehicleHeading, + string vehicleNumberPlate, int vehiclePrimaryColor, int vehicleSecondaryColor, bool vehicleLocked, bool vehicleEngine) + { + using (var saveData = new DatabaseContext()) + { + var dataSet = new NoobVehicle + { + Model = vehicleModel, + PositionX = vehiclePosition.X, + PositionY = vehiclePosition.Y, + PositionZ = vehiclePosition.Z, + Heading = vehicleHeading, + NumberPlate = vehicleNumberPlate, + PrimaryColor = vehiclePrimaryColor, + SecondaryColor = vehicleSecondaryColor, + Locked = vehicleLocked, + Active = true + }; + saveData.NoobVehicles.Add(dataSet); + saveData.SaveChanges(); + + return dataSet.Spawn(veh); + } + } + public static Vehicle SaveFactionVehicleData(Vehicle veh, VehicleHash vehicleModel, Vector3 vehiclePosition, float vehicleHeading, @@ -210,8 +235,13 @@ namespace ReallifeGamemode.Server.Managers //Alle Spieler foreach (Player player in NAPI.Pools.GetAllPlayers()) { - Vector3 pos = player.Position; User user = player.GetUser(saveAll); + if (user == null) + { + continue; + } + + Vector3 pos = player.Position; user.PositionX = pos.X; user.PositionY = pos.Y; user.PositionZ = pos.Z; diff --git a/ReallifeGamemode.Server/Util/FactionHelper.cs b/ReallifeGamemode.Server/Util/FactionHelper.cs index ff7c4550..2170afee 100644 --- a/ReallifeGamemode.Server/Util/FactionHelper.cs +++ b/ReallifeGamemode.Server/Util/FactionHelper.cs @@ -43,7 +43,7 @@ namespace ReallifeGamemode.Server.Util CharacterCreator.ApplyCharacter(player); Events.UpdateCharacterCloth.LoadCharacterDefaults(player); - player.TriggerEvent("toggleDutyMode", true); + player.TriggerEvent("toggleDutyMode", false); int medicCount = 0; foreach (Player c in NAPI.Pools.GetAllPlayers()) { diff --git a/ReallifeGamemode.Server/Util/WeaponDamage.cs b/ReallifeGamemode.Server/Util/WeaponDamage.cs new file mode 100644 index 00000000..7f6f2145 --- /dev/null +++ b/ReallifeGamemode.Server/Util/WeaponDamage.cs @@ -0,0 +1,13 @@ +using GTANetworkAPI; + +namespace ReallifeGamemode.Server.Util +{ + class WeaponDamage : Script + { + [ServerEvent(Event.PlayerWeaponSwitch)] + public void OnPlayerWeaponSwitch(Player player, WeaponHash oldWeapon, WeaponHash newWeapon) + { + NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:WeaponModifier", player); + } + } +}