This commit is contained in:
EntenKoeniq
2021-08-22 13:59:15 +02:00
parent d9ea3f426a
commit 72d8f9b92b
10 changed files with 131 additions and 79 deletions

View File

@ -50,6 +50,8 @@ namespace CoopClient
public int VehicleModelHash { get; set; }
private int[] LastVehicleColors = new int[] { 0, 0 };
public int[] VehicleColors { get; set; }
private Dictionary<int, int> LastVehicleMods = new Dictionary<int, int>();
public Dictionary<int, int> VehicleMods { get; set; }
public bool VehicleDead { get; set; }
public float VehicleEngineHealth { get; set; }
public int VehicleSeatIndex { get; set; }
@ -281,13 +283,6 @@ namespace CoopClient
}
#region -- VEHICLE SYNC --
if (VehicleColors != null && VehicleColors != LastVehicleColors)
{
Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]);
LastVehicleColors = VehicleColors;
}
if (Character.IsOnBike && MainVehicle.ClassType == VehicleClass.Cycles)
{
bool isFastPedaling = Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, Character.Handle, PedalingAnimDict(), "fast_pedal_char", 3);
@ -311,6 +306,23 @@ namespace CoopClient
return;
}
if (VehicleColors != null && VehicleColors != LastVehicleColors)
{
Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]);
LastVehicleColors = VehicleColors;
}
if (VehicleMods != null && VehicleMods != LastVehicleMods)
{
Function.Call(Hash.SET_VEHICLE_MOD_KIT, MainVehicle, 0);
foreach (KeyValuePair<int, int> mod in VehicleMods)
{
MainVehicle.Mods[(VehicleModType)mod.Key].Index = mod.Value;
}
}
MainVehicle.EngineHealth = VehicleEngineHealth;
if (VehicleDead && !MainVehicle.IsDead)
@ -606,7 +618,6 @@ namespace CoopClient
Character.CanRagdoll = false;
Character.IsInvincible = true;
Character.Health = Health;
Character.CanBeTargetted = true;
if (username != null)
{
@ -625,6 +636,8 @@ namespace CoopClient
Function.Call(Hash.SET_PED_COMPONENT_VARIATION, Character.Handle, prop.Key, prop.Value, 0, 0);
}
Function.Call(Hash.SET_PED_CAN_BE_TARGETTED, Character, Game.Player, true);
return true;
}

View File

@ -18,10 +18,10 @@ namespace CoopClient
private bool GameLoaded = false;
public static readonly string CurrentModVersion = "V0_5_1";
public static readonly string CurrentModVersion = "V0_6_0";
public static bool ShareNpcsWithPlayers = false;
public static bool DeactivateTraffic = false;
public static bool DisableTraffic = false;
public static bool NpcsAllowed = false;
private static bool IsGoingToCar = false;
@ -204,6 +204,7 @@ namespace CoopClient
}
}
#if DEBUG
private int ArtificialLagCounter;
public static EntitiesPlayer DebugSyncPed;
public static int LastFullDebugSync = 0;
@ -283,6 +284,7 @@ namespace CoopClient
DebugSyncPed.VehicleSpeed = veh.Speed;
DebugSyncPed.VehicleSteeringAngle = veh.SteeringAngle;
DebugSyncPed.VehicleColors = new int[] { primaryColor, secondaryColor };
DebugSyncPed.VehicleMods = Util.GetVehicleMods(veh);
DebugSyncPed.VehDoors = Util.GetVehicleDoors(veh.Doors);
DebugSyncPed.LastSyncWasFull = (flags.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
DebugSyncPed.IsInVehicle = (flags.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
@ -312,5 +314,6 @@ namespace CoopClient
LastFullDebugSync = currentTimestamp;
}
}
#endif
}
}

View File

@ -10,16 +10,18 @@ namespace CoopClient.Menus.Sub
Alignment = Main.MainSettings.FlipMenu ? GTA.UI.Alignment.Right : GTA.UI.Alignment.Left
};
private readonly NativeCheckboxItem DeactivateTraffic = new NativeCheckboxItem("Deactivate Traffic", Main.DeactivateTraffic);
private readonly NativeCheckboxItem DisableTraffic = new NativeCheckboxItem("Disable Traffic", Main.DisableTraffic);
private readonly NativeCheckboxItem ShareNpcsItem = new NativeCheckboxItem("Share Npcs", Main.ShareNpcsWithPlayers) { Enabled = false };
private readonly NativeSliderItem StreamedNpcsItem = new NativeSliderItem(string.Format("Streamed Npcs ({0})", Main.MainSettings.StreamedNpc), 20, Main.MainSettings.StreamedNpc);
private readonly NativeSliderItem StreamedNpcsItem = new NativeSliderItem(string.Format("Streamed Npcs ({0})", Main.MainSettings.StreamedNpc), 20, Main.MainSettings.StreamedNpc > 20 ? 20 : Main.MainSettings.StreamedNpc);
private readonly NativeCheckboxItem FlipMenuItem = new NativeCheckboxItem("Flip menu", Main.MainSettings.FlipMenu);
#if DEBUG
private readonly NativeCheckboxItem UseDebugItem = new NativeCheckboxItem("Debug", Main.UseDebug);
private readonly NativeCheckboxItem ShowNetworkInfo = new NativeCheckboxItem("Show Network Info", Main.MainNetworking.ShowNetworkInfo);
#endif
public Settings()
{
DeactivateTraffic.CheckboxChanged += DisableTrafficCheckboxChanged;
DisableTraffic.CheckboxChanged += DisableTrafficCheckboxChanged;
ShareNpcsItem.CheckboxChanged += (item, check) => { Main.ShareNpcsWithPlayers = ShareNpcsItem.Checked; };
StreamedNpcsItem.ValueChanged += StreamedNpcsValueChanged;
FlipMenuItem.CheckboxChanged += FlipMenuCheckboxChanged;
@ -28,7 +30,7 @@ namespace CoopClient.Menus.Sub
ShowNetworkInfo.CheckboxChanged += ShowNetworkInfoCheckboxChanged;
#endif
MainMenu.Add(DeactivateTraffic);
MainMenu.Add(DisableTraffic);
MainMenu.Add(ShareNpcsItem);
MainMenu.Add(StreamedNpcsItem);
MainMenu.Add(FlipMenuItem);
@ -38,6 +40,25 @@ namespace CoopClient.Menus.Sub
#endif
}
public void DisableTrafficCheckboxChanged(object a, System.EventArgs b)
{
Main.DisableTraffic = DisableTraffic.Checked;
if (DisableTraffic.Checked)
{
if (ShareNpcsItem.Checked)
{
ShareNpcsItem.Checked = false;
}
ShareNpcsItem.Enabled = false;
}
else if (Main.NpcsAllowed && !ShareNpcsItem.Enabled)
{
ShareNpcsItem.Enabled = true;
}
}
public void StreamedNpcsValueChanged(object a, System.EventArgs b)
{
Main.MainSettings.StreamedNpc = StreamedNpcsItem.Value;
@ -54,6 +75,7 @@ namespace CoopClient.Menus.Sub
Util.SaveSettings();
}
#if DEBUG
public void UseDebugCheckboxChanged(object a, System.EventArgs b)
{
Main.UseDebug = UseDebugItem.Checked;
@ -82,24 +104,6 @@ namespace CoopClient.Menus.Sub
Main.MainNetworking.BytesSend = 0;
}
}
public void DisableTrafficCheckboxChanged(object a, System.EventArgs b)
{
Main.DeactivateTraffic = DeactivateTraffic.Checked;
if (DeactivateTraffic.Checked)
{
if (ShareNpcsItem.Checked)
{
ShareNpcsItem.Checked = false;
}
ShareNpcsItem.Enabled = false;
}
else if (Main.NpcsAllowed && !ShareNpcsItem.Enabled)
{
ShareNpcsItem.Enabled = true;
}
}
#endif
}
}

View File

@ -133,7 +133,7 @@ namespace CoopClient
Main.MainMenu.MainMenu.Items[2].Enabled = true;
Main.MainMenu.MainMenu.Items[2].Title = "Disconnect";
Main.MainMenu.SubSettings.MainMenu.Items[1].Enabled = !Main.DeactivateTraffic && Main.NpcsAllowed;
Main.MainMenu.SubSettings.MainMenu.Items[1].Enabled = !Main.DisableTraffic && Main.NpcsAllowed;
Main.MainMenu.MainMenu.Visible = false;
Main.MainMenu.MenuPool.RefreshAll();
@ -323,6 +323,7 @@ namespace CoopClient
player.VehicleSpeed = packet.VehSpeed;
player.VehicleSteeringAngle = packet.VehSteeringAngle;
player.VehicleColors = packet.VehColors;
player.VehicleMods = packet.VehMods;
player.VehDoors = packet.VehDoors;
player.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
player.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
@ -592,13 +593,18 @@ namespace CoopClient
}
else
{
int secondaryColor;
int primaryColor;
bool isDriver = Util.GetResponsiblePedHandle(player.CurrentVehicle) == player.Handle;
int secondaryColor = 0;
int primaryColor = 0;
if (isDriver)
{
unsafe
{
Function.Call<int>(Hash.GET_VEHICLE_COLOURS, player.CurrentVehicle, &primaryColor, &secondaryColor);
}
}
new FullSyncPlayerVehPacket()
{
@ -612,14 +618,15 @@ namespace CoopClient
Props = Util.GetPedProps(player),
VehModelHash = player.CurrentVehicle.Model.Hash,
VehSeatIndex = (int)player.SeatIndex,
VehPosition = player.CurrentVehicle.Position.ToLVector(),
VehRotation = player.CurrentVehicle.Quaternion.ToLQuaternion(),
VehEngineHealth = player.CurrentVehicle.EngineHealth,
VehVelocity = player.CurrentVehicle.Velocity.ToLVector(),
VehSpeed = player.CurrentVehicle.Speed,
VehSteeringAngle = player.CurrentVehicle.SteeringAngle,
VehColors = new int[] { primaryColor, secondaryColor },
VehDoors = Util.GetVehicleDoors(player.CurrentVehicle.Doors),
VehPosition = isDriver ? player.CurrentVehicle.Position.ToLVector() : new LVector3(),
VehRotation = isDriver ? player.CurrentVehicle.Quaternion.ToLQuaternion() : new LQuaternion(),
VehEngineHealth = isDriver ? player.CurrentVehicle.EngineHealth : 0f,
VehVelocity = isDriver ? player.CurrentVehicle.Velocity.ToLVector() : new LVector3(),
VehSpeed = isDriver ? player.CurrentVehicle.Speed : 0f,
VehSteeringAngle = isDriver ? player.CurrentVehicle.SteeringAngle : 0f,
VehColors = isDriver ? new int[] { primaryColor, secondaryColor } : new int[0],
VehMods = isDriver ? Util.GetVehicleMods(player.CurrentVehicle) : null,
VehDoors = isDriver ? Util.GetVehicleDoors(player.CurrentVehicle.Doors) : null,
Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
@ -650,6 +657,8 @@ namespace CoopClient
}
else
{
bool isDriver = Util.GetResponsiblePedHandle(player.CurrentVehicle) == player.Handle;
new LightSyncPlayerVehPacket()
{
Extra = new PlayerPacket()
@ -660,11 +669,11 @@ namespace CoopClient
},
VehModelHash = player.CurrentVehicle.Model.Hash,
VehSeatIndex = (int)player.SeatIndex,
VehPosition = player.CurrentVehicle.Position.ToLVector(),
VehRotation = player.CurrentVehicle.Quaternion.ToLQuaternion(),
VehVelocity = player.CurrentVehicle.Velocity.ToLVector(),
VehSpeed = player.CurrentVehicle.Speed,
VehSteeringAngle = player.CurrentVehicle.SteeringAngle,
VehPosition = isDriver ? player.CurrentVehicle.Position.ToLVector() : new LVector3(),
VehRotation = isDriver ? player.CurrentVehicle.Quaternion.ToLQuaternion() : new LQuaternion(),
VehVelocity = isDriver ? player.CurrentVehicle.Velocity.ToLVector() : new LVector3(),
VehSpeed = isDriver ? player.CurrentVehicle.Speed : 0f,
VehSteeringAngle = isDriver ? player.CurrentVehicle.SteeringAngle : 0f,
Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, false)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
@ -704,13 +713,18 @@ namespace CoopClient
}
else
{
int secondaryColor;
int primaryColor;
bool isDriver = Util.GetResponsiblePedHandle(npc.CurrentVehicle) == npc.Handle;
int secondaryColor = 0;
int primaryColor = 0;
if (isDriver)
{
unsafe
{
Function.Call<int>(Hash.GET_VEHICLE_COLOURS, npc.CurrentVehicle, &primaryColor, &secondaryColor);
}
}
new FullSyncNpcVehPacket()
{
@ -721,14 +735,15 @@ namespace CoopClient
Position = npc.Position.ToLVector(),
VehModelHash = npc.CurrentVehicle.Model.Hash,
VehSeatIndex = (int)npc.SeatIndex,
VehPosition = npc.CurrentVehicle.Position.ToLVector(),
VehRotation = npc.CurrentVehicle.Quaternion.ToLQuaternion(),
VehEngineHealth = npc.CurrentVehicle.EngineHealth,
VehVelocity = npc.CurrentVehicle.Velocity.ToLVector(),
VehSpeed = npc.CurrentVehicle.Speed,
VehSteeringAngle = npc.CurrentVehicle.SteeringAngle,
VehColors = new int[] { primaryColor, secondaryColor },
VehDoors = Util.GetVehicleDoors(npc.CurrentVehicle.Doors),
VehPosition = isDriver ? npc.CurrentVehicle.Position.ToLVector() : new LVector3(),
VehRotation = isDriver ? npc.CurrentVehicle.Quaternion.ToLQuaternion() : new LQuaternion(),
VehEngineHealth = isDriver ? npc.CurrentVehicle.EngineHealth : 0f,
VehVelocity = isDriver ? npc.CurrentVehicle.Velocity.ToLVector() : new LVector3(),
VehSpeed = isDriver ? npc.CurrentVehicle.Speed : 0f,
VehSteeringAngle = isDriver ? npc.CurrentVehicle.SteeringAngle : 0f,
VehColors = isDriver ? new int[] { primaryColor, secondaryColor } : new int[0],
VehMods = isDriver ? Util.GetVehicleMods(npc.CurrentVehicle) : null,
VehDoors = isDriver ? Util.GetVehicleDoors(npc.CurrentVehicle.Doors) : null,
Flag = Util.GetVehicleFlags(npc, npc.CurrentVehicle, true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}

View File

@ -412,9 +412,12 @@ namespace CoopClient
public int[] VehColors { get; set; }
[ProtoMember(13)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(15)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -445,6 +448,7 @@ namespace CoopClient
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
Flag = data.Flag;
}
@ -777,9 +781,12 @@ namespace CoopClient
public int[] VehColors { get; set; }
[ProtoMember(15)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(16)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(17)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -812,6 +819,7 @@ namespace CoopClient
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
Flag = data.Flag;
}

View File

@ -33,9 +33,8 @@ namespace CoopClient
Function.Call((Hash)0xB96B00E976BE977F, 0.0f); // _SET_WAVES_INTENSITY
Function.Call(Hash.SET_CAN_ATTACK_FRIENDLY, Game.Player.Character.Handle, true, false);
Function.Call(Hash.SET_PED_CAN_BE_TARGETTED, Game.Player.Character.Handle, true);
if (Main.DeactivateTraffic)
if (Main.DisableTraffic)
{
if (!LastDisableTraffic)
{
@ -55,7 +54,7 @@ namespace CoopClient
Traffic(true);
}
LastDisableTraffic = Main.DeactivateTraffic;
LastDisableTraffic = Main.DisableTraffic;
}
private static void Traffic(bool enable)

View File

@ -33,9 +33,9 @@ namespace FirstGameMode
API.SendChatMessageToPlayer(ctx.Player.Username, "Server has been running for: " + RunningSince + " seconds!");
}
public static void OnPlayerConnected(EntitiesPlayer client)
public static void OnPlayerConnected(EntitiesPlayer player)
{
API.SendChatMessageToAll("Player " + client.Username + " connected!");
API.SendChatMessageToAll("Player " + player.Username + " connected!");
}
public static void OnPlayerDisconnected(EntitiesPlayer player)

View File

@ -345,9 +345,12 @@ namespace CoopServer
public int[] VehColors { get; set; }
[ProtoMember(13)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(15)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -378,6 +381,7 @@ namespace CoopServer
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
Flag = data.Flag;
}
@ -710,9 +714,12 @@ namespace CoopServer
public int[] VehColors { get; set; }
[ProtoMember(15)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(16)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(17)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -745,6 +752,7 @@ namespace CoopServer
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
Flag = data.Flag;
}

View File

@ -21,7 +21,7 @@ namespace CoopServer
class Server
{
public static readonly string CurrentModVersion = "V0_5_1";
public static readonly string CurrentModVersion = "V0_6_0";
public static readonly Settings MainSettings = Util.Read<Settings>("CoopSettings.xml");
private readonly Blocklist MainBlocklist = Util.Read<Blocklist>("Blocklist.xml");
@ -690,15 +690,11 @@ namespace CoopServer
private static void FullSyncNpcVeh(NetConnection local, FullSyncNpcVehPacket packet)
{
List<NetConnection> playerList = Util.GetAllInRange(packet.Position, 300f, local);
if (playerList.Count == 0)
{
return;
}
NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage();
packet.PacketToNetOutGoingMessage(outgoingMessage);
MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.UnreliableSequenced, 0);
MainNetServer.SendMessage(outgoingMessage, MainNetServer.Connections, NetDeliveryMethod.UnreliableSequenced, 0);
}
#endregion

View File

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Lidgren.Network;
@ -124,6 +125,11 @@ namespace CoopServer
return Server.Players;
}
public static Entities.EntitiesPlayer GetPlayerByUsername(string username)
{
return Server.Players.FirstOrDefault(x => x.Value.Username == username).Value;
}
public static void KickPlayerByUsername(string username, string[] reason)
{
NetConnection userConnection = Util.GetConnectionByUsername(username);