public static void ResetEntityProperty(LocalHandle entity, string key) { var handle = NetEntityHandler.EntityToNet(entity.Value); var item = NetEntityHandler.NetToStreamedItem(handle); var prop = item as EntityProperties; if (prop == null || string.IsNullOrEmpty(key)) { return; } if (prop.SyncedProperties == null || !prop.SyncedProperties.ContainsKey(key)) { return; } prop.SyncedProperties.Remove(key); if (!item.LocalOnly) { var delta = new Delta_EntityProperties(); delta.SyncedProperties = new Dictionary <string, NativeArgument>(); delta.SyncedProperties.Add(key, new LocalGamePlayerArgument()); UpdateEntityInfo(handle, EntityType.Prop, delta); } }
public static bool SetEntityProperty(LocalHandle entity, string key, object value) { var handle = NetEntityHandler.EntityToNet(entity.Value); var item = NetEntityHandler.NetToStreamedItem(handle); var prop = item as EntityProperties; if (prop == null || string.IsNullOrEmpty(key)) { return(false); } if (prop.SyncedProperties == null) { prop.SyncedProperties = new Dictionary <string, NativeArgument>(); } var nativeArg = ParseNativeArguments(value).Single(); NativeArgument oldValue = prop.SyncedProperties.Get(key); prop.SyncedProperties.Set(key, nativeArg); if (!item.LocalOnly) { var delta = new Delta_EntityProperties(); delta.SyncedProperties = new Dictionary <string, NativeArgument>(); delta.SyncedProperties.Add(key, nativeArg); UpdateEntityInfo(handle, EntityType.Prop, delta); } JavascriptHook.InvokeDataChangeEvent(entity, key, DecodeArgumentListPure(oldValue).FirstOrDefault()); return(true); }
public static IEnumerable <object> DecodeArgumentList(params NativeArgument[] args) { var list = new List <object>(); foreach (var arg in args) { if (arg is IntArgument) { list.Add(((IntArgument)arg).Data); } else if (arg is UIntArgument) { list.Add(((UIntArgument)arg).Data); } else if (arg is StringArgument) { list.Add(((StringArgument)arg).Data); } else if (arg is FloatArgument) { list.Add(((FloatArgument)arg).Data); } else if (arg is BooleanArgument) { list.Add(((BooleanArgument)arg).Data); } else if (arg is LocalPlayerArgument) { list.Add(Game.Player.Character.Handle); } else if (arg is Vector3Argument) { var tmp = (Vector3Argument)arg; list.Add(tmp.X); list.Add(tmp.Y); list.Add(tmp.Z); } else if (arg is LocalGamePlayerArgument) { list.Add(Game.Player.Handle); } else if (arg is EntityArgument) { list.Add(NetEntityHandler.NetToEntity(((EntityArgument)arg).NetHandle)?.Handle); } else if (arg is EntityPointerArgument) { list.Add(new OutputArgument(NetEntityHandler.NetToEntity(((EntityPointerArgument)arg).NetHandle))); } else if (args == null) { list.Add(null); } } return(list); }
public static bool HasEntityProperty(LocalHandle entity, string key) { var handle = NetEntityHandler.EntityToNet(entity.Value); var prop = NetEntityHandler.NetToStreamedItem(handle) as EntityProperties; if (prop == null || string.IsNullOrEmpty(key) || prop.SyncedProperties == null) { return(false); } return(prop.SyncedProperties.ContainsKey(key)); }
private void HandleBulletPacket(int netHandle, bool shooting, Vector3 aim) { //Util.Util.SafeNotify("Handling Bullet - " + DateTime.Now.Millisecond); var syncPed = NetEntityHandler.GetPlayer(netHandle); syncPed.IsShooting = shooting; syncPed.AimedAtPlayer = false; if (shooting) { syncPed.AimCoords = aim; } }
private void HandleBulletPacket(int netHandle, bool shooting, int netHandleTarget) { //Util.Util.SafeNotify("Handling PlayerBullet - " + DateTime.Now.Millisecond); var syncPed = NetEntityHandler.GetPlayer(netHandle); var syncPedTarget = NetEntityHandler.NetToEntity(netHandleTarget); if (syncPed.StreamedIn && syncPedTarget != null) { syncPed.IsShooting = shooting; syncPed.AimedAtPlayer = true; if (shooting) { syncPed.AimPlayer = new Ped(syncPedTarget.Handle); } } }
public static string[] GetEntityAllProperties(LocalHandle entity) { var handle = NetEntityHandler.EntityToNet(entity.Value); var prop = NetEntityHandler.NetToStreamedItem(handle) as EntityProperties; if (prop == null) { return(new string[0]); } if (prop.SyncedProperties == null || prop.SyncedProperties.Any(pair => string.IsNullOrEmpty(pair.Key))) { return(new string[0]); } //return prop.SyncedProperties.Select(pair => DecodeArgumentListPure(pair.Value).Single().ToString()).ToArray(); //Returns all the values return(prop.SyncedProperties.Select(pair => pair.Key).ToArray()); }
public static object GetEntityProperty(LocalHandle entity, string key) { var handle = NetEntityHandler.EntityToNet(entity.Value); var prop = NetEntityHandler.NetToStreamedItem(handle) as EntityProperties; if (prop == null || string.IsNullOrEmpty(key)) { return(null); } if (prop.SyncedProperties == null || !prop.SyncedProperties.ContainsKey(key)) { return(null); } var natArg = prop.SyncedProperties[key]; return(DecodeArgumentListPure(natArg).Single()); }
private void HandleBasicPacket(int nethandle, Vector3 position) { var syncPed = NetEntityHandler.GetPlayer(nethandle); syncPed.Position = position; syncPed.LastUpdateReceived = Util.Util.TickCount; if (syncPed.VehicleNetHandle != 0) { var car = NetEntityHandler.NetToStreamedItem(syncPed.VehicleNetHandle) as RemoteVehicle; if (car != null) { car.Position = position.ToLVector(); if (car.StreamedIn) { NetEntityHandler.NetToEntity(car).PositionNoOffset = position; } } } }
public static IEnumerable <object> DecodeArgumentListPure(params NativeArgument[] args) { var list = new List <object>(); foreach (var arg in args) { if (arg is IntArgument) { list.Add(((IntArgument)arg).Data); } else if (arg is UIntArgument) { list.Add(((UIntArgument)arg).Data); } else if (arg is StringArgument) { list.Add(((StringArgument)arg).Data); } else if (arg is FloatArgument) { list.Add(((FloatArgument)arg).Data); } else if (arg is BooleanArgument) { list.Add(((BooleanArgument)arg).Data); } else if (arg is LocalPlayerArgument) { list.Add(new LocalHandle(Game.Player.Character.Handle)); } else if (arg is Vector3Argument) { var tmp = (Vector3Argument)arg; list.Add(new GTANetworkShared.Vector3(tmp.X, tmp.Y, tmp.Z)); } else if (arg is LocalGamePlayerArgument) { list.Add(new LocalHandle(Game.Player.Handle)); } else if (arg is EntityArgument) { var ent = NetEntityHandler.NetToStreamedItem(((EntityArgument)arg).NetHandle); if (ent == null) { list.Add(new LocalHandle(0)); } else if (ent is ILocalHandleable) { list.Add(new LocalHandle(ent.RemoteHandle)); } else { list.Add(new LocalHandle(ent.RemoteHandle, HandleType.NetHandle)); } } else if (arg is EntityPointerArgument) { list.Add(new OutputArgument(NetEntityHandler.NetToEntity(((EntityPointerArgument)arg).NetHandle))); } else if (arg is ListArgument) { List <object> output = new List <object>(); var larg = (ListArgument)arg; if (larg.Data != null && larg.Data.Count > 0) { output.AddRange(DecodeArgumentListPure(larg.Data.ToArray())); } list.Add(output); } else { list.Add(null); } } return(list); }
public void DecodeNativeCall(NativeData obj) { if (!NativeWhitelist.IsAllowed(obj.Hash) && obj.Internal == false) { throw new ArgumentException("Hash \"" + obj.Hash.ToString("X") + "\" is not allowed!"); } else if (obj.Hash == (ulong)Hash.REQUEST_SCRIPT_AUDIO_BANK) { if (!SoundWhitelist.IsAllowed(((StringArgument)obj.Arguments[0]).Data)) { throw new ArgumentException("Such SoundSet is not allowed!"); } } else if (obj.Hash == (ulong)Hash.PLAY_SOUND_FRONTEND) { if (!SoundWhitelist.IsAllowed(((StringArgument)obj.Arguments[1]).Data) || !SoundWhitelist.IsAllowed(((StringArgument)obj.Arguments[2]).Data)) { throw new ArgumentException("SoundSet/Name is not allowed!"); } } var list = new List <InputArgument>(); var nativeType = CheckNativeHash(obj.Hash); LogManager.DebugLog("NATIVE TYPE IS " + nativeType); int playerHealth = Game.Player.Character.Health; if (((int)nativeType & (int)Enums.NativeType.VehicleWarp) > 0) { int veh = ((EntityArgument)obj.Arguments[1]).NetHandle; var item = NetEntityHandler.NetToStreamedItem(veh); if (item != null && !item.StreamedIn) { NetEntityHandler.StreamIn(item); } } if (((int)nativeType & (int)Enums.NativeType.EntityWarp) > 0) { float x = ((FloatArgument)obj.Arguments[1]).Data; float y = ((FloatArgument)obj.Arguments[2]).Data; float z = ((FloatArgument)obj.Arguments[3]).Data; int interior; if ((interior = Function.Call <int>(Hash.GET_INTERIOR_AT_COORDS, x, y, z)) != 0) { Function.Call((Hash)0x2CA429C029CCF247, interior); // LOAD_INTERIOR Function.Call(Hash.SET_INTERIOR_ACTIVE, interior, true); Function.Call(Hash.DISABLE_INTERIOR, interior, false); if (Function.Call <bool>(Hash.IS_INTERIOR_CAPPED, interior)) { Function.Call(Hash.CAP_INTERIOR, interior, false); } } } var objectList = DecodeArgumentList(obj.Arguments.ToArray()); var enumerable = objectList as object[] ?? objectList.ToArray(); list.AddRange(enumerable.Select(ob => ob is OutputArgument ? (OutputArgument)ob : new InputArgument(ob))); if (enumerable.Any()) { LogManager.DebugLog("NATIVE CALL ARGUMENTS: " + enumerable.Aggregate((f, s) => f + ", " + s) + ", RETURN TYPE: " + obj.ReturnType); } Model model = null; if (((int)nativeType & (int)Enums.NativeType.NeedsModel) > 0) { LogManager.DebugLog("REQUIRES MODEL"); int position = 0; if (((int)nativeType & (int)Enums.NativeType.NeedsModel1) > 0) { position = 0; } if (((int)nativeType & (int)Enums.NativeType.NeedsModel2) > 0) { position = 1; } if (((int)nativeType & (int)Enums.NativeType.NeedsModel3) > 0) { position = 2; } LogManager.DebugLog("POSITION IS " + position); var modelObj = obj.Arguments[position]; int modelHash = 0; if (modelObj is UIntArgument) { modelHash = unchecked ((int)((UIntArgument)modelObj).Data); } else if (modelObj is IntArgument) { modelHash = ((IntArgument)modelObj).Data; } LogManager.DebugLog("MODEL HASH IS " + modelHash); model = new Model(modelHash); if (model.IsValid) { LogManager.DebugLog("MODEL IS VALID, REQUESTING"); model.Request(10000); } } if (((int)nativeType & (int)Enums.NativeType.NeedsAnimDict) > 0) { var animDict = ((StringArgument)obj.Arguments[1]).Data; Util.Util.LoadDict(animDict); } if (((int)nativeType & (int)Enums.NativeType.PtfxAssetRequest) != 0) { var animDict = ((StringArgument)obj.Arguments[0]).Data; Util.Util.LoadPtfxAsset(animDict); Function.Call(Hash._SET_PTFX_ASSET_NEXT_CALL, animDict); list.RemoveAt(0); } if (((int)nativeType & (int)Enums.NativeType.ReturnsEntity) > 0) { var entId = Function.Call <int>((Hash)obj.Hash, list.ToArray()); lock (EntityCleanup) EntityCleanup.Add(entId); if (obj.ReturnType is IntArgument) { SendNativeCallResponse(obj.Id, entId); } if (model != null) { model.MarkAsNoLongerNeeded(); } return; } if (nativeType == Enums.NativeType.ReturnsBlip) { var blipId = Function.Call <int>((Hash)obj.Hash, list.ToArray()); lock (BlipCleanup) BlipCleanup.Add(blipId); if (obj.ReturnType is IntArgument) { SendNativeCallResponse(obj.Id, blipId); } return; } if (((int)nativeType & (int)Enums.NativeType.TimeSet) > 0) { var newHours = ((IntArgument)obj.Arguments[0]).Data; var newMinutes = ((IntArgument)obj.Arguments[1]).Data; Time = new TimeSpan(newHours, newMinutes, 0); } if (((int)nativeType & (int)Enums.NativeType.WeatherSet) > 0) { var newWeather = ((IntArgument)obj.Arguments[0]).Data; if (newWeather >= 0 && newWeather < Enums._weather.Length) { Weather = Enums._weather[newWeather]; Function.Call((Hash)obj.Hash, Enums._weather[newWeather]); return; } } var tmpArgs = obj.Arguments; if (!ReplacePointerNatives(obj.Hash, ref list, ref tmpArgs)) { return; } if (obj.ReturnType == null) { Function.Call((Hash)obj.Hash, list.ToArray()); } else { if (obj.ReturnType is IntArgument) { SendNativeCallResponse(obj.Id, Function.Call <int>((Hash)obj.Hash, list.ToArray())); } else if (obj.ReturnType is UIntArgument) { SendNativeCallResponse(obj.Id, Function.Call <uint>((Hash)obj.Hash, list.ToArray())); } else if (obj.ReturnType is StringArgument) { SendNativeCallResponse(obj.Id, Function.Call <string>((Hash)obj.Hash, list.ToArray())); } else if (obj.ReturnType is FloatArgument) { SendNativeCallResponse(obj.Id, Function.Call <float>((Hash)obj.Hash, list.ToArray())); } else if (obj.ReturnType is BooleanArgument) { SendNativeCallResponse(obj.Id, Function.Call <bool>((Hash)obj.Hash, list.ToArray())); } else if (obj.ReturnType is Vector3Argument) { SendNativeCallResponse(obj.Id, Function.Call <Vector3>((Hash)obj.Hash, list.ToArray())); } } if (((int)nativeType & (int)Enums.NativeType.PlayerSkinChange) > 0) { Ped PlayerChar = Game.Player.Character; PlayerChar.Style.SetDefaultClothes(); PlayerChar.MaxHealth = 200; PlayerChar.Health = playerHealth; } }
private void OnLocalDisconnect() { try { LogManager.RuntimeLog("PlayerDisconnect:ClearAll:Start"); StopLoadingPrompt(); DEBUG_STEP = 42; if (NetEntityHandler.ServerWorld?.LoadedIpl != null) { foreach (var ipl in NetEntityHandler.ServerWorld.LoadedIpl) { Function.Call(Hash.REMOVE_IPL, ipl); } } DEBUG_STEP = 43; if (NetEntityHandler.ServerWorld?.RemovedIpl != null) { foreach (var ipl in NetEntityHandler.ServerWorld.RemovedIpl) { Function.Call(Hash.REQUEST_IPL, ipl); } } DEBUG_STEP = 44; ClearLocalEntities(); DEBUG_STEP = 45; ClearLocalBlips(); DEBUG_STEP = 49; CameraManager.Reset(); NetEntityHandler.ClearAll(); DEBUG_STEP = 50; JavascriptHook.StopAllScripts(); JavascriptHook.TextElements.Clear(); SyncCollector.ForceAimData = false; StringCache.Dispose(); StringCache = null; _threadsafeSubtitle = null; _cancelDownload = true; _httpDownloadThread?.Abort(); CefController.ShowCursor = false; DEBUG_STEP = 51; DownloadManager.Cancel(); DownloadManager.FileIntegrity.Clear(); Chat = _backupChat; Chat.Clear(); WeaponInventoryManager.Clear(); VehicleSyncManager.StopAll(); HasFinishedDownloading = false; ScriptChatVisible = true; CanOpenChatbox = true; DisplayWastedMessage = true; _password = string.Empty; CEFManager.Draw = false; UIColor = Color.White; DEBUG_STEP = 52; lock (CEFManager.Browsers) { foreach (var browser in CEFManager.Browsers) { browser.Close(); browser.Dispose(); } CEFManager.Browsers.Clear(); } CEFManager.Dispose(); ClearStats(); RestoreMainMenu(); DEBUG_STEP = 56; ResetWorld(); DEBUG_STEP = 57; ResetPlayer(); DEBUG_STEP = 58; LogManager.RuntimeLog("PlayerDisconnect:ClearAll:Finish"); if (_serverProcess != null) { GTA.UI.Notification.Show("~b~~h~AMP~h~~w~~n~Shutting down server..."); _serverProcess.Kill(); _serverProcess.Dispose(); _serverProcess = null; } } catch (AccessViolationException ex) { LogManager.LogException(ex, "OnPlayerDisconnect"); } }
private void AddServerToRecent(string server, string password) { if (string.IsNullOrWhiteSpace(server)) { return; } var split = server.Split(':'); if (split.Length < 2 || string.IsNullOrWhiteSpace(split[0]) || string.IsNullOrWhiteSpace(split[1]) || !int.TryParse(split[1], out int tmpPort)) { return; } if (!PlayerSettings.RecentServers.Contains(server)) { PlayerSettings.RecentServers.Add(server); if (PlayerSettings.RecentServers.Count > 20) { PlayerSettings.RecentServers.RemoveAt(0); } Util.Util.SaveSettings(GTANInstallDir + "\\settings.xml"); var item = new UIMenuItem(server) { Description = server }; item.SetRightLabel(server); item.Activated += (sender, selectedItem) => { if (IsOnServer()) { Client.Disconnect("Switching servers"); NetEntityHandler.ClearAll(); if (Npcs != null) { Npcs.ToList().ForEach(pair => pair.Value.Clear()); Npcs.Clear(); } while (IsOnServer()) { Script.Yield(); } } var splt = server.Split(':'); if (splt.Length < 2) { return; } if (!int.TryParse(splt[1], out int port)) { return; } ConnectToServer(splt[0], port, false, password); MainMenu.TemporarilyHidden = true; _connectTab.RefreshIndex(); }; _recentBrowser.Items.Add(item); } }
private void BuildMainMenu() { MainMenu = new TabView("Cherry Multiplayer") { CanLeave = false, MoneySubtitle = "Cherry MP " + CurrentVersion }; _mainMapItem = new TabMapItem(); #region Welcome Screen { _welcomePage = new TabWelcomeMessageItem("Welcome to Cherry Multiplayer", "Development branch."); MainMenu.Tabs.Add(_welcomePage); } #endregion #region ServerBrowser { var dConnect = new TabButtonArrayItem("Quick Connect"); { var ipButton = new TabButton { Text = "IP Address", Size = new Size(500, 40) }; ipButton.Activated += (sender, args) => { MainMenu.TemporarilyHidden = true; var newIp = InputboxThread.GetUserInput(_clientIp ?? "", 30, TickSpinner); _clientIp = newIp; ipButton.Text = string.IsNullOrWhiteSpace(newIp) ? "IP Address" : newIp; MainMenu.TemporarilyHidden = false; }; dConnect.Buttons.Add(ipButton); } { var ipButton = new TabButton { Text = "Port", Size = new Size(500, 40) }; ipButton.Activated += (sender, args) => { MainMenu.TemporarilyHidden = true; var port = InputboxThread.GetUserInput(Port.ToString(), 30, TickSpinner); if (string.IsNullOrWhiteSpace(port)) { port = "4499"; } if (!int.TryParse(port, out int newPort)) { Util.Util.SafeNotify("Wrong port format!"); MainMenu.TemporarilyHidden = false; return; } Port = newPort; ipButton.Text = Port.ToString(); MainMenu.TemporarilyHidden = false; }; dConnect.Buttons.Add(ipButton); } { var ipButton = new TabButton { Text = "Password", Size = new Size(500, 40) }; ipButton.Activated += (sender, args) => { MainMenu.TemporarilyHidden = true; var newIp = InputboxThread.GetUserInput("", 30, TickSpinner); MainMenu.TemporarilyHidden = false; _QCpassword = newIp; ipButton.Text = string.IsNullOrWhiteSpace(newIp) ? "Password" : "*******"; }; dConnect.Buttons.Add(ipButton); } { var ipButton = new TabButton { Text = "Connect", Size = new Size(500, 40) }; ipButton.Activated += (sender, args) => { var isPassworded = false; if (!string.IsNullOrWhiteSpace(_QCpassword)) { isPassworded = true; } AddServerToRecent(_clientIp + ":" + Port, _QCpassword); ConnectToServer(_clientIp, Port, isPassworded, _QCpassword); MainMenu.TemporarilyHidden = true; }; dConnect.Buttons.Add(ipButton); } _Verified = new TabInteractiveListItem("Verified", new List <UIMenuItem>()); _serverBrowser = new TabInteractiveListItem("Internet", new List <UIMenuItem>()); _favBrowser = new TabInteractiveListItem("Favorites", new List <UIMenuItem>()); _lanBrowser = new TabInteractiveListItem("Local Network", new List <UIMenuItem>()); _recentBrowser = new TabInteractiveListItem("Recent", new List <UIMenuItem>()); _connectTab = new TabSubmenuItem("connect", new List <TabItem>() { dConnect, _favBrowser, _Verified, _serverBrowser, _lanBrowser, _recentBrowser }); MainMenu.AddTab(_connectTab); _connectTab.DrawInstructionalButtons += (sender, args) => { MainMenu.DrawInstructionalButton(4, Control.Jump, "Refresh"); if (Game.IsControlJustPressed(0, Control.Jump)) { RebuildServerBrowser(); } #region Verified, Iternet, LAN and Recent if (_connectTab.Index == 2 && _connectTab.Items[2].Focused || _connectTab.Index == 3 && _connectTab.Items[3].Focused || _connectTab.Index == 4 && _connectTab.Items[4].Focused || _connectTab.Index == 5 && _connectTab.Items[5].Focused) { MainMenu.DrawInstructionalButton(5, Control.Enter, "Add to Favorites"); if (Game.IsControlJustPressed(0, Control.Enter)) { var selectedServer = _serverBrowser.Items[_serverBrowser.Index]; if (_connectTab.Index == 2 && _connectTab.Items[2].Focused) { selectedServer = _Verified.Items[_Verified.Index]; } else if (_connectTab.Index == 4 && _connectTab.Items[4].Focused) { selectedServer = _lanBrowser.Items[_lanBrowser.Index]; } else if (_connectTab.Index == 5 && _connectTab.Items[5].Focused) { selectedServer = _recentBrowser.Items[_recentBrowser.Index]; } selectedServer.SetRightBadge(UIMenuItem.BadgeStyle.None); if (PlayerSettings.FavoriteServers.Contains(selectedServer.Description)) { var favItem = _favBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description); if (favItem != null) { selectedServer.SetRightBadge(UIMenuItem.BadgeStyle.None); RemoveFromFavorites(selectedServer.Description); _favBrowser.Items.Remove(favItem); _favBrowser.RefreshIndex(); } } else { AddToFavorites(selectedServer.Description); selectedServer.SetRightBadge(UIMenuItem.BadgeStyle.Star); var item = new UIMenuItem(selectedServer.Text) { Description = selectedServer.Description }; item.SetRightLabel(selectedServer.RightLabel); item.SetLeftBadge(selectedServer.LeftBadge); item.Activated += (faf, selectedItem) => { if (IsOnServer()) { Client.Disconnect("Switching servers"); NetEntityHandler.ClearAll(); if (Npcs != null) { Npcs.ToList().ForEach(pair => pair.Value.Clear()); Npcs.Clear(); } while (IsOnServer()) { Script.Yield(); } } bool pass = false; if (selectedServer.LeftBadge == UIMenuItem.BadgeStyle.Lock) { pass = true; } var splt = selectedServer.Description.Split(':'); if (splt.Length < 2) { return; } if (!int.TryParse(splt[1], out int port)) { return; } ConnectToServer(splt[0], port, pass); MainMenu.TemporarilyHidden = true; _connectTab.RefreshIndex(); }; _favBrowser.Items.Add(item); } } } #endregion #region Favorites if (_connectTab.Index == 1 && _connectTab.Items[1].Focused) { MainMenu.DrawInstructionalButton(6, Control.NextCamera, "Add Server"); #region Add server if (Game.IsControlJustPressed(0, Control.NextCamera)) { MainMenu.TemporarilyHidden = true; var serverIp = InputboxThread.GetUserInput("Server IP(:Port)", 40, TickSpinner); if (serverIp.Contains("Server IP(:Port)") || string.IsNullOrWhiteSpace(serverIp)) { Util.Util.SafeNotify("Incorrect input!"); MainMenu.TemporarilyHidden = false; return; } else if (!serverIp.Contains(":")) { serverIp += ":4499"; } MainMenu.TemporarilyHidden = false; if (!PlayerSettings.FavoriteServers.Contains(serverIp)) { AddToFavorites(serverIp); var item = new UIMenuItem(serverIp) { Description = serverIp }; _favBrowser.Items.Add(item); } else { Util.Util.SafeNotify("Server already on the list"); return; } } #endregion MainMenu.DrawInstructionalButton(5, Control.Enter, "Remove"); #region Remove if (Game.IsControlJustPressed(0, Control.Enter)) { var selectedServer = _favBrowser.Items[_favBrowser.Index]; var favItem = _favBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description); if (_Verified.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null) { _Verified.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None); } if (_serverBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null) { _serverBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None); } if (_lanBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null) { _lanBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None); } if (_recentBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description) != null) { _recentBrowser.Items.FirstOrDefault(i => i.Description == selectedServer.Description).SetRightBadge(UIMenuItem.BadgeStyle.None); } if (favItem != null) { Util.Util.SafeNotify("Server removed from Favorites!"); RemoveFromFavorites(selectedServer.Description); _favBrowser.Items.Remove(favItem); _favBrowser.RefreshIndex(); } } #endregion } #endregion }; CherryDiscord.CherryDiscord.InMenuDiscordInitialize(CurrentVersion.ToString()); CherryDiscord.CherryDiscord.InMenuDiscordUpdatePresence(); } #endregion #region Settings { #region General Menu var GeneralMenu = new TabInteractiveListItem("General", new List <UIMenuItem>()); { var nameItem = new UIMenuItem("Display Name"); nameItem.SetRightLabel(PlayerSettings.DisplayName); nameItem.Activated += (sender, item) => { if (IsOnServer()) { GTA.UI.Screen.ShowNotification("You cannot change your Display Name while connected to a server."); return; } MainMenu.TemporarilyHidden = true; var newName = InputboxThread.GetUserInput(PlayerSettings.DisplayName ?? "Enter a new Display Name", 32, TickSpinner); if (!string.IsNullOrWhiteSpace(newName)) { if (newName.Length > 32) { newName = newName.Substring(0, 32); } newName = newName.Replace(' ', '_'); PlayerSettings.DisplayName = newName; SaveSettings(); nameItem.SetRightLabel(newName); } MainMenu.TemporarilyHidden = false; }; GeneralMenu.Items.Add(nameItem); } { var debugItem = new UIMenuCheckboxItem("Show Game FPS Counter", PlayerSettings.ShowFPS); debugItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.ShowFPS = @checked; DebugInfo.FPS = @checked; SaveSettings(); }; GeneralMenu.Items.Add(debugItem); } { var debugItem = new UIMenuCheckboxItem("Disable Rockstar Editor", PlayerSettings.DisableRockstarEditor); debugItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.DisableRockstarEditor = @checked; SaveSettings(); }; GeneralMenu.Items.Add(debugItem); } { var debugItem = new UIMenuCheckboxItem("Allow Webcam/Microphone Streaming (Requires restart)", PlayerSettings.MediaStream); debugItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.MediaStream = @checked; SaveSettings(); }; GeneralMenu.Items.Add(debugItem); } { var nameItem = new UIMenuItem("Update Channel"); nameItem.SetRightLabel(PlayerSettings.UpdateChannel); nameItem.Activated += (sender, item) => { MainMenu.TemporarilyHidden = true; var newName = InputboxThread.GetUserInput(PlayerSettings.UpdateChannel ?? "stable", 40, TickSpinner); if (!string.IsNullOrWhiteSpace(newName)) { PlayerSettings.UpdateChannel = newName; SaveSettings(); nameItem.SetRightLabel(newName); } MainMenu.TemporarilyHidden = false; }; GeneralMenu.Items.Add(nameItem); } #endregion #region Chat var ChatboxMenu = new TabInteractiveListItem("Chat", new List <UIMenuItem>()); { var chatItem = new UIMenuCheckboxItem("Enable Timestamp", PlayerSettings.Timestamp); chatItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.Timestamp = @checked; SaveSettings(); }; ChatboxMenu.Items.Add(chatItem); } { var chatItem = new UIMenuCheckboxItem("Use Military Time", PlayerSettings.Militarytime); chatItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.Militarytime = @checked; SaveSettings(); }; ChatboxMenu.Items.Add(chatItem); } { var chatItem = new UIMenuCheckboxItem("Scale Chatbox With Safezone", PlayerSettings.ScaleChatWithSafezone); chatItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.ScaleChatWithSafezone = @checked; SaveSettings(); }; ChatboxMenu.Items.Add(chatItem); } { var chatItem = new UIMenuItem("Horizontal Chatbox Offset"); chatItem.SetRightLabel(PlayerSettings.ChatboxXOffset.ToString()); chatItem.Activated += (sender, item) => { MainMenu.TemporarilyHidden = true; var strInput = InputboxThread.GetUserInput(PlayerSettings.ChatboxXOffset.ToString(), 10, TickSpinner); if (!int.TryParse(strInput, out int newSetting)) { Util.Util.SafeNotify("Input was not in the correct format."); MainMenu.TemporarilyHidden = false; return; } MainMenu.TemporarilyHidden = false; PlayerSettings.ChatboxXOffset = newSetting; chatItem.SetRightLabel(PlayerSettings.ChatboxXOffset.ToString()); SaveSettings(); }; ChatboxMenu.Items.Add(chatItem); } { var chatItem = new UIMenuItem("Vertical Chatbox Offset"); chatItem.SetRightLabel(PlayerSettings.ChatboxYOffset.ToString()); chatItem.Activated += (sender, item) => { MainMenu.TemporarilyHidden = true; var strInput = InputboxThread.GetUserInput(PlayerSettings.ChatboxYOffset.ToString(), 10, TickSpinner); if (!int.TryParse(strInput, out int newSetting)) { Util.Util.SafeNotify("Input was not in the correct format."); MainMenu.TemporarilyHidden = false; return; } MainMenu.TemporarilyHidden = false; PlayerSettings.ChatboxYOffset = newSetting; chatItem.SetRightLabel(PlayerSettings.ChatboxYOffset.ToString()); SaveSettings(); }; ChatboxMenu.Items.Add(chatItem); } { var chatItem = new UIMenuCheckboxItem("Use Classic Chatbox", PlayerSettings.UseClassicChat); chatItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.UseClassicChat = @checked; SaveSettings(); }; ChatboxMenu.Items.Add(chatItem); } #endregion #region Experimental var ExpMenu = new TabInteractiveListItem("Experimental", new List <UIMenuItem>()); { var expItem = new UIMenuCheckboxItem("Disable Chromium Embedded Framework (Requires restart)", PlayerSettings.DisableCEF); expItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.DisableCEF = @checked; SaveSettings(); }; ExpMenu.Items.Add(expItem); } #endregion #region Debug Menu var DebugMenu = new TabInteractiveListItem("Debug", new List <UIMenuItem>()); { { var expItem = new UIMenuCheckboxItem("Enable CEF Development Tools (http://localhost:9222) [Restart required]", PlayerSettings.CEFDevtool); expItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.CEFDevtool = @checked; SaveSettings(); }; DebugMenu.Items.Add(expItem); } { var expItem = new UIMenuCheckboxItem("Enable Debug mode (Requires an extra tool)", PlayerSettings.DebugMode); expItem.CheckboxEvent += (sender, @checked) => { PlayerSettings.DebugMode = @checked; SaveSettings(); }; DebugMenu.Items.Add(expItem); } { var expItem = new UIMenuCheckboxItem("Save Debug to File (Huge performance impact)", SaveDebugToFile); expItem.CheckboxEvent += (sender, @checked) => { SaveDebugToFile = @checked; SaveSettings(); }; DebugMenu.Items.Add(expItem); } { var debugItem = new UIMenuCheckboxItem("Remove Game Entities", RemoveGameEntities); debugItem.CheckboxEvent += (sender, @checked) => { RemoveGameEntities = @checked; }; DebugMenu.Items.Add(debugItem); } { var debugItem = new UIMenuCheckboxItem("Show Streamer Debug Data", DebugInfo.StreamerDebug); debugItem.CheckboxEvent += (sender, @checked) => { DebugInfo.StreamerDebug = @checked; }; DebugMenu.Items.Add(debugItem); } { var debugItem = new UIMenuCheckboxItem("Disable Nametag Draw", ToggleNametagDraw); debugItem.CheckboxEvent += (sender, @checked) => { ToggleNametagDraw = @checked; }; DebugMenu.Items.Add(debugItem); } { var debugItem = new UIMenuCheckboxItem("Disable Position Update", TogglePosUpdate); debugItem.CheckboxEvent += (sender, @checked) => { TogglePosUpdate = @checked; }; DebugMenu.Items.Add(debugItem); } } #endregion var welcomeItem = new TabSubmenuItem("settings", new List <TabItem>() { GeneralMenu, ChatboxMenu, //DisplayMenu, //GraphicsMenu, ExpMenu, DebugMenu }); MainMenu.AddTab(welcomeItem); } #endregion #region Quit { var welcomeItem = new TabTextItem("Quit", "Quit Cherry Multiplayer", "Are you sure you want to quit Cherry Multiplayer and return to desktop?") { CanBeFocused = false }; welcomeItem.Activated += (sender, args) => { if (Client != null && IsOnServer()) { Client.Disconnect("Quit"); } CEFManager.Dispose(); CEFManager.DisposeCef(); Script.Wait(500); //Environment.Exit(0); Process.GetProcessesByName("GTA5")[0].Kill(); Process.GetCurrentProcess().Kill(); }; MainMenu.Tabs.Add(welcomeItem); } #endregion #region Current Server Tab #region Players _serverPlayers = new TabItemSimpleList("Players", new Dictionary <string, string>()); #endregion var favTab = new TabTextItem("Favorite", "Add to Favorites", "Add the current server to favorites.") { CanBeFocused = false }; favTab.Activated += (sender, args) => { var serb = _currentServerIp + ":" + _currentServerPort; AddToFavorites(_currentServerIp + ":" + _currentServerPort); var item = new UIMenuItem(serb) { Description = serb }; Util.Util.SafeNotify("Server added to favorites!"); item.Activated += (faf, selectedItem) => { if (IsOnServer()) { Client.Disconnect("Switching servers"); NetEntityHandler.ClearAll(); if (Npcs != null) { Npcs.ToList().ForEach(pair => pair.Value.Clear()); Npcs.Clear(); } while (IsOnServer()) { Script.Yield(); } } var splt = serb.Split(':'); if (splt.Length < 2) { return; } if (!int.TryParse(splt[1], out int port)) { return; } ConnectToServer(splt[0], port); MainMenu.TemporarilyHidden = true; _connectTab.RefreshIndex(); AddServerToRecent(serb, ""); }; _favBrowser.Items.Add(item); }; var dcItem = new TabTextItem("Disconnect", "Disconnect", "Disconnect from the current server.") { CanBeFocused = false }; dcItem.Activated += (sender, args) => { if (Client != null) { Client.Disconnect("Quit"); } }; _statsItem = new TabTextItem("Statistics", "Network Statistics", "") { CanBeFocused = false }; _serverItem = new TabSubmenuItem("server", new List <TabItem>() { _serverPlayers, favTab, _statsItem, dcItem }) { Parent = MainMenu }; #endregion MainMenu.RefreshIndex(); }
private void HandlePedPacket(PedData fullPacket, bool pure) { if (fullPacket.NetHandle == null) { return; } var syncPed = NetEntityHandler.GetPlayer(fullPacket.NetHandle.Value); syncPed.IsInVehicle = false; syncPed.VehicleNetHandle = 0; if (fullPacket.Position != null) { syncPed.Position = fullPacket.Position.ToVector(); } if (fullPacket.Speed != null) { syncPed.OnFootSpeed = fullPacket.Speed.Value; } if (fullPacket.PedArmor != null) { syncPed.PedArmor = fullPacket.PedArmor.Value; } if (fullPacket.PedModelHash != null) { syncPed.ModelHash = fullPacket.PedModelHash.Value; } if (fullPacket.Quaternion != null) { syncPed.Rotation = fullPacket.Quaternion.ToVector(); } if (fullPacket.PlayerHealth != null) { syncPed.PedHealth = fullPacket.PlayerHealth.Value; } if (fullPacket.AimCoords != null) { syncPed.AimCoords = fullPacket.AimCoords.ToVector(); } if (fullPacket.WeaponHash != null) { syncPed.CurrentWeapon = fullPacket.WeaponHash.Value; } if (fullPacket.Latency != null) { syncPed.Latency = fullPacket.Latency.Value; } if (fullPacket.Velocity != null) { syncPed.PedVelocity = fullPacket.Velocity.ToVector(); } if (fullPacket.WeaponAmmo != null) { syncPed.Ammo = fullPacket.WeaponAmmo.Value; } if (fullPacket.Flag != null) { syncPed.IsFreefallingWithParachute = (fullPacket.Flag.Value & (int)PedDataFlags.InFreefall) > 0; syncPed.IsInMeleeCombat = (fullPacket.Flag.Value & (int)PedDataFlags.InMeleeCombat) > 0; syncPed.IsRagdoll = (fullPacket.Flag.Value & (int)PedDataFlags.Ragdoll) > 0; syncPed.IsAiming = (fullPacket.Flag.Value & (int)PedDataFlags.Aiming) > 0; syncPed.IsJumping = (fullPacket.Flag.Value & (int)PedDataFlags.Jumping) > 0; syncPed.IsParachuteOpen = (fullPacket.Flag.Value & (int)PedDataFlags.ParachuteOpen) > 0; syncPed.IsInCover = (fullPacket.Flag.Value & (int)PedDataFlags.IsInCover) > 0; syncPed.IsInLowCover = (fullPacket.Flag.Value & (int)PedDataFlags.IsInLowerCover) > 0; syncPed.IsCoveringToLeft = (fullPacket.Flag.Value & (int)PedDataFlags.IsInCoverFacingLeft) > 0; syncPed.IsOnLadder = (fullPacket.Flag.Value & (int)PedDataFlags.IsOnLadder) > 0; syncPed.IsReloading = (fullPacket.Flag.Value & (int)PedDataFlags.IsReloading) > 0; syncPed.IsVaulting = (fullPacket.Flag.Value & (int)PedDataFlags.IsVaulting) > 0; syncPed.IsOnFire = (fullPacket.Flag.Value & (int)PedDataFlags.OnFire) != 0; syncPed.IsPlayerDead = (fullPacket.Flag.Value & (int)PedDataFlags.PlayerDead) != 0; syncPed.EnteringVehicle = (fullPacket.Flag.Value & (int)PedDataFlags.EnteringVehicle) != 0; if ((fullPacket.Flag.Value & (int)PedDataFlags.ClosingVehicleDoor) != 0 && syncPed.MainVehicle != null && syncPed.MainVehicle.Model.Hash != (int)VehicleHash.CargoPlane) { syncPed.MainVehicle.Doors[(VehicleDoorIndex)syncPed.VehicleSeat + 1].Close(true); } if (syncPed.EnteringVehicle) { syncPed.VehicleNetHandle = fullPacket.VehicleTryingToEnter.Value; syncPed.VehicleSeat = fullPacket.SeatTryingToEnter.Value; } } if (pure) { syncPed.LastUpdateReceived = Util.Util.TickCount; syncPed.StartInterpolation(); } }
private void HandleVehiclePacket(VehicleData fullData, bool purePacket) { if (fullData.NetHandle == null) { return; } var syncPed = NetEntityHandler.GetPlayer(fullData.NetHandle.Value); syncPed.IsInVehicle = true; if (fullData.VehicleHandle != null) { LogManager.DebugLog("RECEIVED LIGHT VEHICLE PACKET " + fullData.VehicleHandle); } if (fullData.Position != null) { syncPed.Position = fullData.Position.ToVector(); } if (fullData.VehicleHandle != null) { syncPed.VehicleNetHandle = fullData.VehicleHandle.Value; } if (fullData.Velocity != null) { syncPed.VehicleVelocity = fullData.Velocity.ToVector(); } if (fullData.PedModelHash != null) { syncPed.ModelHash = fullData.PedModelHash.Value; } if (fullData.PedArmor != null) { syncPed.PedArmor = fullData.PedArmor.Value; } if (fullData.RPM != null) { syncPed.VehicleRPM = fullData.RPM.Value; } if (fullData.Quaternion != null) { syncPed.VehicleRotation = fullData.Quaternion.ToVector(); } if (fullData.PlayerHealth != null) { syncPed.PedHealth = fullData.PlayerHealth.Value; } if (fullData.VehicleHealth != null) { syncPed.VehicleHealth = fullData.VehicleHealth.Value; } if (fullData.VehicleSeat != null) { syncPed.VehicleSeat = fullData.VehicleSeat.Value; } if (fullData.Latency != null) { syncPed.Latency = fullData.Latency.Value; } if (fullData.Steering != null) { syncPed.SteeringScale = fullData.Steering.Value; } if (fullData.Velocity != null) { syncPed.Speed = fullData.Velocity.ToVector().Length(); } if (fullData.DamageModel != null && syncPed.MainVehicle != null) { syncPed.MainVehicle.SetVehicleDamageModel(fullData.DamageModel); } if (fullData.Flag != null) { syncPed.IsVehDead = (fullData.Flag.Value & (short)VehicleDataFlags.VehicleDead) > 0; syncPed.IsHornPressed = (fullData.Flag.Value & (short)VehicleDataFlags.PressingHorn) > 0; syncPed.Siren = (fullData.Flag.Value & (short)VehicleDataFlags.SirenActive) > 0; syncPed.IsShooting = (fullData.Flag.Value & (short)VehicleDataFlags.Shooting) > 0; syncPed.IsAiming = (fullData.Flag.Value & (short)VehicleDataFlags.Aiming) > 0; syncPed.IsInBurnout = (fullData.Flag.Value & (short)VehicleDataFlags.BurnOut) > 0; syncPed.ExitingVehicle = (fullData.Flag.Value & (short)VehicleDataFlags.ExitingVehicle) != 0; syncPed.IsPlayerDead = (fullData.Flag.Value & (int)VehicleDataFlags.PlayerDead) != 0; syncPed.Braking = (fullData.Flag.Value & (short)VehicleDataFlags.Braking) != 0; } if (fullData.WeaponHash != null) { syncPed.CurrentWeapon = fullData.WeaponHash.Value; } if (fullData.AimCoords != null) { syncPed.AimCoords = fullData.AimCoords.ToVector(); } if (syncPed.VehicleNetHandle != 0 && fullData.Position != null) { var car = NetEntityHandler.NetToStreamedItem(syncPed.VehicleNetHandle) as RemoteVehicle; if (car != null) { car.Position = fullData.Position; car.Rotation = fullData.Quaternion; } } else if (syncPed.VehicleNetHandle != 00 && fullData.Position == null && fullData.Flag != null && !PacketOptimization.CheckBit(fullData.Flag.Value, VehicleDataFlags.Driver)) { var car = NetEntityHandler.NetToStreamedItem(syncPed.VehicleNetHandle) as RemoteVehicle; if (car != null) { syncPed.Position = car.Position.ToVector(); syncPed.VehicleRotation = car.Rotation.ToVector(); } } if (purePacket) { syncPed.LastUpdateReceived = Util.Util.TickCount; syncPed.StartInterpolation(); } }
private void Spectate(SizeF res) { Ped PlayerChar = Game.Player.Character; if (!IsSpectating && _lastSpectating) { PlayerChar.Opacity = 255; PlayerChar.IsPositionFrozen = false; Game.Player.IsInvincible = false; PlayerChar.IsCollisionEnabled = true; SpectatingEntity = 0; CurrentSpectatingPlayer = null; _currentSpectatingPlayerIndex = 100000; PlayerChar.PositionNoOffset = _preSpectatorPos; } if (IsSpectating) { if (SpectatingEntity != 0) { PlayerChar.Opacity = 0; PlayerChar.IsPositionFrozen = true; PlayerChar.IsInvincible = true; PlayerChar.IsCollisionEnabled = false; Control[] exceptions = new[] { Control.LookLeftRight, Control.LookUpDown, Control.LookLeft, Control.LookRight, Control.LookUp, Control.LookDown, }; Game.DisableAllControlsThisFrame(); foreach (var c in exceptions) { Game.EnableControlThisFrame(c); } var ent = NetEntityHandler.NetToEntity(SpectatingEntity); if (ent != null) { if (Function.Call <bool>(Hash.IS_ENTITY_A_PED, ent) && new Ped(ent.Handle).IsInVehicle()) { PlayerChar.PositionNoOffset = ent.Position + new Vector3(0, 0, 1.3f); } else { PlayerChar.PositionNoOffset = ent.Position; } } } else if (SpectatingEntity == 0 && CurrentSpectatingPlayer == null && NetEntityHandler.ClientMap.Values.Count(op => op is SyncPed && !((SyncPed)op).IsSpectating && (((SyncPed)op).Team == 0 || ((SyncPed)op).Team == Main.LocalTeam) && (((SyncPed)op).Dimension == 0 || ((SyncPed)op).Dimension == Main.LocalDimension)) > 0) { CurrentSpectatingPlayer = NetEntityHandler.ClientMap.Values.Where( op => op is SyncPed && !((SyncPed)op).IsSpectating && (((SyncPed)op).Team == 0 || ((SyncPed)op).Team == Main.LocalTeam) && (((SyncPed)op).Dimension == 0 || ((SyncPed)op).Dimension == Main.LocalDimension)) .ElementAt(_currentSpectatingPlayerIndex % NetEntityHandler.ClientMap.Values.Count( op => op is SyncPed && !((SyncPed)op).IsSpectating && (((SyncPed)op).Team == 0 || ((SyncPed)op).Team == Main.LocalTeam) && (((SyncPed)op).Dimension == 0 || ((SyncPed)op).Dimension == Main.LocalDimension))) as SyncPed; } else if (SpectatingEntity == 0 && CurrentSpectatingPlayer != null) { PlayerChar.Opacity = 0; PlayerChar.IsPositionFrozen = true; Game.Player.IsInvincible = true; PlayerChar.IsCollisionEnabled = false; Game.DisableAllControlsThisFrame(); if (CurrentSpectatingPlayer.Character == null) { PlayerChar.PositionNoOffset = CurrentSpectatingPlayer.Position; } else if (CurrentSpectatingPlayer.IsInVehicle) { PlayerChar.PositionNoOffset = CurrentSpectatingPlayer.Character.Position + new Vector3(0, 0, 1.3f); } else { PlayerChar.PositionNoOffset = CurrentSpectatingPlayer.Character.Position; } if (Game.IsControlJustPressed(Control.PhoneLeft)) { _currentSpectatingPlayerIndex--; CurrentSpectatingPlayer = null; } else if (Game.IsControlJustPressed(Control.PhoneRight)) { _currentSpectatingPlayerIndex++; CurrentSpectatingPlayer = null; } if (CurrentSpectatingPlayer != null) { var center = new Point((int)(res.Width / 2), (int)(res.Height / 2)); new UIResText("Now spectating:~n~" + CurrentSpectatingPlayer.Name, new Point(center.X, (int)(res.Height - 200)), 0.4f, Color.White, GTA.UI.Font.ChaletLondon, UIResText.Alignment.Centered) { Outline = true, }.Draw(); new Sprite("mparrow", "mp_arrowxlarge", new Point(center.X - 264, (int)(res.Height - 232)), new Size(64, 128), 180f, Color.White).Draw(); new Sprite("mparrow", "mp_arrowxlarge", new Point(center.X + 200, (int)(res.Height - 232)), new Size(64, 128)).Draw(); } } } _lastSpectating = IsSpectating; }
public static void AddMap(ServerMap map) { //File.WriteAllText(GTANInstallDir + "\\logs\\map.json", JsonConvert.SerializeObject(map)); Ped PlayerChar = Game.Player.Character; try { NetEntityHandler.ServerWorld = map.World; if (map.World.LoadedIpl != null) { foreach (var ipl in map.World.LoadedIpl) { Function.Call(Hash.REQUEST_IPL, ipl); } } if (map.World.RemovedIpl != null) { foreach (var ipl in map.World.RemovedIpl) { Function.Call(Hash.REMOVE_IPL, ipl); } } if (map.Objects != null) { foreach (var pair in map.Objects) { if (NetEntityHandler.ClientMap.ContainsKey(pair.Key)) { continue; } NetEntityHandler.CreateObject(pair.Key, pair.Value); //GTA.UI.Screen.ShowSubtitle("Creating object...", 500000); } } if (map.Vehicles != null) { foreach (var pair in map.Vehicles) { if (NetEntityHandler.ClientMap.ContainsKey(pair.Key)) { continue; } NetEntityHandler.CreateVehicle(pair.Key, pair.Value); //GTA.UI.Screen.ShowSubtitle("Creating vehicle...", 500000); } } if (map.Blips != null) { foreach (var blip in map.Blips) { if (NetEntityHandler.ClientMap.ContainsKey(blip.Key)) { continue; } NetEntityHandler.CreateBlip(blip.Key, blip.Value); } } if (map.Markers != null) { foreach (var marker in map.Markers) { if (NetEntityHandler.ClientMap.ContainsKey(marker.Key)) { continue; } NetEntityHandler.CreateMarker(marker.Key, marker.Value); } } if (map.Pickups != null) { foreach (var pickup in map.Pickups) { if (NetEntityHandler.ClientMap.ContainsKey(pickup.Key)) { continue; } NetEntityHandler.CreatePickup(pickup.Key, pickup.Value); } } if (map.TextLabels != null) { //map.TextLabels.GroupBy(x => x.Key).Select(y => y.First()); //Remove duplicates before procceeding foreach (var label in map.TextLabels) { if (NetEntityHandler.ClientMap.ContainsKey(label.Key)) { continue; } NetEntityHandler.CreateTextLabel(label.Key, label.Value); } } if (map.Peds != null) { foreach (var ped in map.Peds) { if (NetEntityHandler.ClientMap.ContainsKey(ped.Key)) { continue; } NetEntityHandler.CreatePed(ped.Key, ped.Value); } } if (map.Particles != null) { foreach (var ped in map.Particles) { if (NetEntityHandler.ClientMap.ContainsKey(ped.Key)) { continue; } NetEntityHandler.CreateParticle(ped.Key, ped.Value); } } if (map.Players != null) { LogManager.DebugLog("STARTING PLAYER MAP"); foreach (var pair in map.Players) { if (NetEntityHandler.NetToEntity(pair.Key)?.Handle == PlayerChar.Handle) { // It's us! var remPl = NetEntityHandler.NetToStreamedItem(pair.Key) as RemotePlayer; remPl.Name = pair.Value.Name; } else { var ourSyncPed = NetEntityHandler.GetPlayer(pair.Key); NetEntityHandler.UpdatePlayer(pair.Key, pair.Value); if (ourSyncPed.Character != null) { ourSyncPed.Character.RelationshipGroup = (pair.Value.Team == LocalTeam && pair.Value.Team != -1) ? Main.FriendRelGroup : Main.RelGroup; for (int i = 0; i < 15; i++) //NEEDS A CHECK { Function.Call(Hash.SET_PED_COMPONENT_VARIATION, ourSyncPed.Character, i, pair.Value.Props.Get((byte)i), pair.Value.Textures.Get((byte)i), 2); } lock (NetEntityHandler.HandleMap) NetEntityHandler.HandleMap.Set(pair.Key, ourSyncPed.Character.Handle); ourSyncPed.Character.Opacity = pair.Value.Alpha; /* * if (ourSyncPed.Character.AttachedBlip != null) * { * ourSyncPed.Character.AttachedBlip.Sprite = (BlipSprite)pair.Value.BlipSprite; * ourSyncPed.Character.AttachedBlip.Color = (BlipColor)pair.Value.BlipColor; * ourSyncPed.Character.AttachedBlip.Alpha = pair.Value.BlipAlpha; * } */ NetEntityHandler.ReattachAllEntities(ourSyncPed, false); } } } } } catch (Exception ex) { GTA.UI.Notification.Show("FATAL ERROR WHEN PARSING MAP"); GTA.UI.Notification.Show(ex.Message); Client.Disconnect("Map Parse Error"); LogManager.LogException(ex, "MAP PARSE"); return; } World.CurrentTimeOfDay = new TimeSpan(map.World.Hours, map.World.Minutes, 00); Time = new TimeSpan(map.World.Hours, map.World.Minutes, 00); if (map.World.Weather >= 0 && map.World.Weather < Enums._weather.Length) { Weather = Enums._weather[map.World.Weather]; Function.Call(Hash.SET_WEATHER_TYPE_NOW_PERSIST, Enums._weather[map.World.Weather]); } Function.Call(Hash.PAUSE_CLOCK, true); }
public static List <NativeArgument> ParseNativeArguments(params object[] args) { var list = new List <NativeArgument>(); foreach (var o in args) { if (o is int) { list.Add(new IntArgument() { Data = ((int)o) }); } else if (o is uint) { list.Add(new UIntArgument() { Data = ((uint)o) }); } else if (o is string) { list.Add(new StringArgument() { Data = ((string)o) }); } else if (o is float) { list.Add(new FloatArgument() { Data = ((float)o) }); } else if (o is double) { list.Add(new FloatArgument() { Data = ((float)(double)o) }); } else if (o is bool) { list.Add(new BooleanArgument() { Data = ((bool)o) }); } else if (o is GTANetworkShared.Vector3) { var tmp = (GTANetworkShared.Vector3)o; list.Add(new Vector3Argument() { X = tmp.X, Y = tmp.Y, Z = tmp.Z, }); } else if (o is Vector3) { var tmp = (Vector3)o; list.Add(new Vector3Argument() { X = tmp.X, Y = tmp.Y, Z = tmp.Z, }); } else if (o is LocalPlayerArgument) { list.Add((LocalPlayerArgument)o); } else if (o is OpponentPedHandleArgument) { list.Add((OpponentPedHandleArgument)o); } else if (o is LocalGamePlayerArgument) { list.Add((LocalGamePlayerArgument)o); } else if (o is EntityArgument) { list.Add((EntityArgument)o); } else if (o is EntityPointerArgument) { list.Add((EntityPointerArgument)o); } else if (o is NetHandle) { list.Add(new EntityArgument(((NetHandle)o).Value)); } else if (o is LocalHandle) { list.Add(new EntityArgument(NetEntityHandler.EntityToNet(((LocalHandle)o).Value))); } else if (o is IList) { var larg = new ListArgument(); var l = ((IList)o); object[] array = new object[l.Count]; l.CopyTo(array, 0); larg.Data = new List <NativeArgument>(ParseNativeArguments(array)); list.Add(larg); } else { list.Add(null); } } return(list); }
public static void HandleUnoccupiedVehicleSync(VehicleData data) { if (data.VehicleHandle != null) { var car = NetEntityHandler.NetToStreamedItem(data.VehicleHandle.Value) as RemoteVehicle; if (car != null) { if (data.VehicleHealth != null) { car.Health = data.VehicleHealth.Value; } car.IsDead = (data.Flag & (int)VehicleDataFlags.VehicleDead) != 0; if (car.DamageModel == null) { car.DamageModel = new VehicleDamageModel(); } car.DamageModel.BrokenWindows = data.DamageModel.BrokenWindows; car.DamageModel.BrokenDoors = data.DamageModel.BrokenDoors; if (data.PlayerHealth != null) { car.Tires = data.PlayerHealth.Value; if (car.StreamedIn) { var ent = NetEntityHandler.NetToEntity(data.VehicleHandle.Value); if (ent != null) { if (data.Velocity != null) { VehicleSyncManager.Interpolate(data.VehicleHandle.Value, ent.Handle, data.Position.ToVector(), data.Velocity, data.Quaternion.ToVector()); } else { car.Position = data.Position; car.Rotation = data.Quaternion; } var veh = new Vehicle(ent.Handle); veh.SetVehicleDamageModel(car.DamageModel); veh.EngineHealth = car.Health; if (!ent.IsDead && car.IsDead) { ent.IsInvincible = false; veh.Explode(); } for (int i = 0; i < 8; i++) { bool busted = (data.PlayerHealth.Value & (byte)(1 << i)) != 0; if (busted && !veh.IsTireBurst(i)) { veh.Wheels[i].Burst(); } else if (!busted && veh.IsTireBurst(i)) { veh.Wheels[i].Fix(); } } } } else { car.Position = data.Position; car.Rotation = data.Quaternion; } } } } }
public void OnTick(object sender, EventArgs e) { Main.TickCount++; try { Ped player = Game.Player.Character; var res = UIMenu.GetScreenResolutionMantainRatio(); if (Environment.TickCount - _lastCheck > 1000) { _bytesSentPerSecond = _bytesSent - _lastBytesSent; _bytesReceivedPerSecond = _bytesReceived - _lastBytesReceived; _lastBytesReceived = _bytesReceived; _lastBytesSent = _bytesSent; _lastCheck = Environment.TickCount; } if (!string.IsNullOrWhiteSpace(_threadsafeSubtitle)) { GTA.UI.Screen.ShowSubtitle(_threadsafeSubtitle, 500); } DEBUG_STEP = 1; if (!_hasInitialized) { RebuildServerBrowser(); #if INTEGRITYCHECK if (!VerifyGameIntegrity()) { _mainWarning = new Warning("alert", "Could not verify game integrity.\nPlease restart your game, or update Grand Theft Auto V."); _mainWarning.OnAccept = () => { if (Client != null && IsOnServer()) { Client.Disconnect("Quit"); } CEFManager.Dispose(); CEFManager.DisposeCef(); Script.Wait(500); //Environment.Exit(0); Process.GetProcessesByName("GTA5")[0].Kill(); Process.GetCurrentProcess().Kill(); }; } #endif _hasInitialized = true; } DEBUG_STEP = 2; if (!_hasPlayerSpawned && player != null && player.Handle != 0 && !Game.IsLoading) { GTA.UI.Screen.FadeOut(1); ResetPlayer(); MainMenu.RefreshIndex(); _hasPlayerSpawned = true; MainMenu.Visible = true; World.RenderingCamera = MainMenuCamera; var address = Util.Util.FindPattern("\x32\xc0\xf3\x0f\x11\x09", "xxxxxx"); // Weapon/radio slowdown DEBUG_STEP = 3; if (address != IntPtr.Zero) { Util.Util.WriteMemory(address, 0x90, 6); } address = Util.Util.FindPattern("\x48\x85\xC0\x0F\x84\x00\x00\x00\x00\x8B\x48\x50", "xxxxx????xxx"); // unlock objects; credit goes to the GTA-MP team DEBUG_STEP = 4; if (address != IntPtr.Zero) { Util.Util.WriteMemory(address, 0x90, 24); } //TerminateGameScripts(); GTA.UI.Screen.FadeIn(1000); } DEBUG_STEP = 5; Game.DisableControlThisFrame(0, Control.EnterCheatCode); Game.DisableControlThisFrame(0, Control.FrontendPause); Game.DisableControlThisFrame(0, Control.FrontendPauseAlternate); Game.DisableControlThisFrame(0, Control.FrontendSocialClub); Game.DisableControlThisFrame(0, Control.FrontendSocialClubSecondary); if (!player.IsJumping) { //Game.DisableControlThisFrame(0, Control.MeleeAttack1); Game.DisableControlThisFrame(0, Control.MeleeAttackLight); } Function.Call(Hash.HIDE_HELP_TEXT_THIS_FRAME); if (Game.Player.Character.IsRagdoll) { Game.DisableControlThisFrame(0, Control.Attack); Game.DisableControlThisFrame(0, Control.Attack2); } if (_mainWarning != null) { _mainWarning.Draw(); return; } if ((Game.IsControlJustPressed(0, Control.FrontendPauseAlternate) || Game.IsControlJustPressed(0, Control.FrontendPause)) && !MainMenu.Visible && !_wasTyping) { MainMenu.Visible = true; if (!IsOnServer()) { if (MainMenu.Visible) { World.RenderingCamera = MainMenuCamera; } else { World.RenderingCamera = null; } } else if (MainMenu.Visible) { RebuildPlayersList(); } MainMenu.RefreshIndex(); } else { if (!BlockControls) { MainMenu.ProcessControls(); } MainMenu.Update(); MainMenu.CanLeave = IsOnServer(); if (MainMenu.Visible && !MainMenu.TemporarilyHidden && !_mainMapItem.Focused && _hasScAvatar && File.Exists(GTANInstallDir + "\\images\\scavatar.png")) { var safe = new Point(300, 180); Util.Util.DxDrawTexture(0, GTANInstallDir + "images\\scavatar.png", res.Width - safe.X - 64, safe.Y - 80, 64, 64, 0, 255, 255, 255, 255, false); } if (!IsOnServer()) { Game.EnableControlThisFrame(0, Control.FrontendPause); } } DEBUG_STEP = 6; if (_isGoingToCar && Game.IsControlJustPressed(0, Control.PhoneCancel)) { Game.Player.Character.Task.ClearAll(); _isGoingToCar = false; } if (Client == null || Client.ConnectionStatus == NetConnectionStatus.Disconnected || Client.ConnectionStatus == NetConnectionStatus.None) { return; } // BELOW ONLY ON SERVER _versionLabel.Position = new Point((int)(res.Width / 2), 0); _versionLabel.TextAlignment = UIResText.Alignment.Centered; _versionLabel.Draw(); DEBUG_STEP = 7; if (_wasTyping) { Game.DisableControlThisFrame(0, Control.FrontendPauseAlternate); } var playerCar = Game.Player.Character.CurrentVehicle; DEBUG_STEP = 8; Watcher.Tick(); DEBUG_STEP = 9; _playerGodMode = Game.Player.IsInvincible; //invokeonLocalPlayerShoot if (player != null && player.IsShooting) { JavascriptHook.InvokeCustomEvent( api => api?.invokeonLocalPlayerShoot((int)(player.Weapons.Current?.Hash ?? 0), RaycastEverything(new Vector2(0, 0)).ToLVector())); } DEBUG_STEP = 10; int netPlayerCar = 0; RemoteVehicle cc = null; if (playerCar != null && (netPlayerCar = NetEntityHandler.EntityToNet(playerCar.Handle)) != 0) { var item = NetEntityHandler.NetToStreamedItem(netPlayerCar) as RemoteVehicle; if (item != null) { var lastHealth = item.Health; var lastDamageModel = item.DamageModel; item.Position = playerCar.Position.ToLVector(); item.Rotation = playerCar.Rotation.ToLVector(); item.Health = playerCar.EngineHealth; item.IsDead = playerCar.IsDead; item.DamageModel = playerCar.GetVehicleDamageModel(); if (lastHealth != playerCar.EngineHealth) { JavascriptHook.InvokeCustomEvent(api => api?.invokeonVehicleHealthChange((int)lastHealth)); } if (playerCar.IsEngineRunning ^ !PacketOptimization.CheckBit(item.Flag, EntityFlag.EngineOff)) { playerCar.IsEngineRunning = !PacketOptimization.CheckBit(item.Flag, EntityFlag.EngineOff); } if (lastDamageModel != null) { if (lastDamageModel.BrokenWindows != item.DamageModel.BrokenWindows) { for (int i = 0; i < 8; i++) { if (((lastDamageModel.BrokenWindows ^ item.DamageModel.BrokenWindows) & 1 << i) != 0) { var i1 = i; JavascriptHook.InvokeCustomEvent(api => api?.invokeonVehicleWindowSmash(i1)); } } } if (lastDamageModel.BrokenDoors != item.DamageModel.BrokenDoors) { for (int i = 0; i < 8; i++) { if (((lastDamageModel.BrokenDoors ^ item.DamageModel.BrokenDoors) & 1 << i) != 0) { var i1 = i; JavascriptHook.InvokeCustomEvent(api => api?.invokeonVehicleDoorBreak(i1)); } } } } } cc = item; } DEBUG_STEP = 11; if (playerCar != _lastPlayerCar) { if (_lastPlayerCar != null) { var c = NetEntityHandler.EntityToStreamedItem(_lastPlayerCar.Handle) as RemoteVehicle; if (VehicleSyncManager.IsSyncing(c)) { _lastPlayerCar.IsInvincible = c?.IsInvincible ?? false; } else { _lastPlayerCar.IsInvincible = true; } if (c != null) { Function.Call(Hash.SET_VEHICLE_ENGINE_ON, _lastPlayerCar, !PacketOptimization.CheckBit(c.Flag, EntityFlag.EngineOff), true, true); } int h = _lastPlayerCar.Handle; var lh = new LocalHandle(h); JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerExitVehicle(lh)); _lastVehicleSiren = false; } if (playerCar != null) { if (!NetEntityHandler.ContainsLocalHandle(playerCar.Handle)) { playerCar.Delete(); playerCar = null; } else { playerCar.IsInvincible = cc?.IsInvincible ?? false; LocalHandle handle = new LocalHandle(playerCar.Handle); JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerEnterVehicle(handle)); } } LastCarEnter = DateTime.Now; } DEBUG_STEP = 12; if (playerCar != null) { if (playerCar.GetResponsiblePed().Handle == player.Handle) { playerCar.IsInvincible = cc?.IsInvincible ?? false; } else { playerCar.IsInvincible = true; } var siren = playerCar.SirenActive; if (siren != _lastVehicleSiren) { JavascriptHook.InvokeCustomEvent(api => api?.invokeonVehicleSirenToggle()); } _lastVehicleSiren = siren; } Game.Player.Character.MaxHealth = 200; var playerObj = NetEntityHandler.EntityToStreamedItem(Game.Player.Character.Handle) as RemotePlayer; if (playerObj != null) { Game.Player.IsInvincible = playerObj.IsInvincible; } if (!string.IsNullOrWhiteSpace(CustomAnimation)) { var sp = CustomAnimation.Split(); if ( !Function.Call <bool>(Hash.IS_ENTITY_PLAYING_ANIM, Game.Player.Character, sp[0], sp[1], 3)) { Game.Player.Character.Task.ClearSecondary(); Function.Call(Hash.TASK_PLAY_ANIM, Game.Player.Character, Util.Util.LoadDict(sp[0]), sp[1], 8f, 10f, -1, AnimationFlag, -8f, 1, 1, 1); } } DEBUG_STEP = 13; _lastPlayerCar = playerCar; if (Game.IsControlJustPressed(0, Control.ThrowGrenade) && !Game.Player.Character.IsInVehicle() && IsOnServer() && !Chat.IsFocused) { var vehs = World.GetAllVehicles().OrderBy(v => v.Position.DistanceToSquared(Game.Player.Character.Position)).Take(1).ToList(); if (vehs.Any() && Game.Player.Character.IsInRangeOfEx(vehs[0].Position, 6f)) { var relPos = vehs[0].GetOffsetFromWorldCoords(Game.Player.Character.Position); VehicleSeat seat = VehicleSeat.Any; if (relPos.X < 0 && relPos.Y > 0) { seat = VehicleSeat.LeftRear; } else if (relPos.X >= 0 && relPos.Y > 0) { seat = VehicleSeat.RightFront; } else if (relPos.X < 0 && relPos.Y <= 0) { seat = VehicleSeat.LeftRear; } else if (relPos.X >= 0 && relPos.Y <= 0) { seat = VehicleSeat.RightRear; } if (vehs[0].PassengerCapacity == 1) { seat = VehicleSeat.Passenger; } if (vehs[0].PassengerCapacity > 3 && vehs[0].GetPedOnSeat(seat).Handle != 0) { if (seat == VehicleSeat.LeftRear) { for (int i = 3; i < vehs[0].PassengerCapacity; i += 2) { if (vehs[0].GetPedOnSeat((VehicleSeat)i).Handle == 0) { seat = (VehicleSeat)i; break; } } } else if (seat == VehicleSeat.RightRear) { for (int i = 4; i < vehs[0].PassengerCapacity; i += 2) { if (vehs[0].GetPedOnSeat((VehicleSeat)i).Handle == 0) { seat = (VehicleSeat)i; break; } } } } if (WeaponDataProvider.DoesVehicleSeatHaveGunPosition((VehicleHash)vehs[0].Model.Hash, 0, true) && Game.Player.Character.IsIdle && !Game.Player.IsAiming) { Game.Player.Character.SetIntoVehicle(vehs[0], seat); } else { Game.Player.Character.Task.EnterVehicle(vehs[0], seat, -1, 2f); } _isGoingToCar = true; } } DEBUG_STEP = 14; Game.DisableControlThisFrame(0, Control.SpecialAbility); Game.DisableControlThisFrame(0, Control.SpecialAbilityPC); Game.DisableControlThisFrame(0, Control.SpecialAbilitySecondary); Game.DisableControlThisFrame(0, Control.CharacterWheel); Game.DisableControlThisFrame(0, Control.Phone); Game.DisableControlThisFrame(0, Control.Duck); DEBUG_STEP = 15; VehicleSyncManager?.Pulse(); DEBUG_STEP = 16; if (StringCache != null) { StringCache?.Pulse(); } DEBUG_STEP = 17; double aver = 0; lock (_averagePacketSize) aver = _averagePacketSize.Count > 0 ? _averagePacketSize.Average() : 0; _statsItem.Text = string.Format( "~h~Bytes Sent~h~: {0}~n~~h~Bytes Received~h~: {1}~n~~h~Bytes Sent / Second~h~: {5}~n~~h~Bytes Received / Second~h~: {6}~n~~h~Average Packet Size~h~: {4}~n~~n~~h~Messages Sent~h~: {2}~n~~h~Messages Received~h~: {3}", _bytesSent, _bytesReceived, _messagesSent, _messagesReceived, aver, _bytesSentPerSecond, _bytesReceivedPerSecond); DEBUG_STEP = 18; if (Game.IsControlPressed(0, Control.Aim) && !Game.Player.Character.IsInVehicle() && Game.Player.Character.Weapons.Current.Hash != WeaponHash.Unarmed) { Game.DisableControlThisFrame(0, Control.Jump); } //CRASH WORKAROUND: DISABLE PARACHUTE RUINER2 if (Game.Player.Character.IsInVehicle()) { if (Game.Player.Character.CurrentVehicle.IsInAir && Game.Player.Character.CurrentVehicle.Model.Hash == 941494461) { Game.DisableAllControlsThisFrame(0); } } DEBUG_STEP = 19; Function.Call((Hash)0x5DB660B38DD98A31, Game.Player, 0f); DEBUG_STEP = 20; Game.MaxWantedLevel = 0; Game.Player.WantedLevel = 0; DEBUG_STEP = 21; lock (_localMarkers) { foreach (var marker in _localMarkers) { World.DrawMarker((MarkerType)marker.Value.MarkerType, marker.Value.Position.ToVector(), marker.Value.Direction.ToVector(), marker.Value.Rotation.ToVector(), marker.Value.Scale.ToVector(), Color.FromArgb(marker.Value.Alpha, marker.Value.Red, marker.Value.Green, marker.Value.Blue)); } } DEBUG_STEP = 22; var hasRespawned = (Function.Call <int>(Hash.GET_TIME_SINCE_LAST_DEATH) < 8000 && Function.Call <int>(Hash.GET_TIME_SINCE_LAST_DEATH) != -1 && Game.Player.CanControlCharacter); if (hasRespawned && !_lastDead) { _lastDead = true; var msg = Client.CreateMessage(); msg.Write((byte)PacketType.PlayerRespawned); Client.SendMessage(msg, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.SyncEvent); JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerRespawn()); if (Weather != null) { Function.Call(Hash.SET_WEATHER_TYPE_NOW_PERSIST, Weather); } if (Time.HasValue) { World.CurrentDayTime = new TimeSpan(Time.Value.Hours, Time.Value.Minutes, 00); } Function.Call(Hash.PAUSE_CLOCK, true); var us = NetEntityHandler.EntityToStreamedItem(Game.Player.Character.Handle); NetEntityHandler.ReattachAllEntities(us, true); foreach ( var source in Main.NetEntityHandler.ClientMap.Values.Where( item => item is RemoteParticle && ((RemoteParticle)item).EntityAttached == us.RemoteHandle) .Cast <RemoteParticle>()) { Main.NetEntityHandler.StreamOut(source); Main.NetEntityHandler.StreamIn(source); } } var pHealth = player.Health; var pArmor = player.Armor; var pGun = player.Weapons.Current?.Hash ?? WeaponHash.Unarmed; var pModel = player.Model.Hash; if (pHealth != _lastPlayerHealth) { int test = _lastPlayerHealth; JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerHealthChange(test)); } if (pArmor != _lastPlayerArmor) { int test = _lastPlayerArmor; JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerArmorChange(test)); } if (pGun != _lastPlayerWeapon) { WeaponHash test = _lastPlayerWeapon; JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerWeaponSwitch((int)test)); } if (pModel != (int)_lastPlayerModel) { PedHash test = _lastPlayerModel; JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerModelChange((int)test)); } _lastPlayerHealth = pHealth; _lastPlayerArmor = pArmor; _lastPlayerWeapon = pGun; _lastPlayerModel = (PedHash)pModel; DEBUG_STEP = 23; _lastDead = hasRespawned; DEBUG_STEP = 24; var killed = Game.Player.Character.IsDead; DEBUG_STEP = 25; if (killed && !_lastKilled) { var msg = Client.CreateMessage(); msg.Write((byte)PacketType.PlayerKilled); var killer = Function.Call <int>(Hash.GET_PED_SOURCE_OF_DEATH, Game.Player.Character); var weapon = Function.Call <int>(Hash.GET_PED_CAUSE_OF_DEATH, Game.Player.Character); var killerEnt = NetEntityHandler.EntityToNet(killer); msg.Write(killerEnt); msg.Write(weapon); /* * var playerMod = (PedHash)Game.Player.Character.Model.Hash; * if (playerMod != PedHash.Michael && playerMod != PedHash.Franklin && playerMod != PedHash.Trevor) * { * _lastModel = Game.Player.Character.Model.Hash; * var lastMod = new Model(PedHash.Michael); * lastMod.Request(10000); * Function.Call(Hash.SET_PLAYER_MODEL, Game.Player, lastMod); * Game.Player.Character.Kill(); * } * else * { * _lastModel = 0; * } */ Client.SendMessage(msg, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.SyncEvent); JavascriptHook.InvokeCustomEvent(api => api?.invokeonPlayerDeath(new LocalHandle(killer), weapon)); NativeUI.BigMessageThread.MessageInstance.ShowColoredShard("WASTED", "", HudColor.HUD_COLOUR_BLACK, HudColor.HUD_COLOUR_RED, 7000); Function.Call(Hash.REQUEST_SCRIPT_AUDIO_BANK, "HUD_MINI_GAME_SOUNDSET", true); Function.Call(Hash.PLAY_SOUND_FRONTEND, -1, "CHECKPOINT_NORMAL", "HUD_MINI_GAME_SOUNDSET"); } /* * if (Function.Call<int>(Hash.GET_TIME_SINCE_LAST_DEATH) < 8000 && * Function.Call<int>(Hash.GET_TIME_SINCE_LAST_DEATH) != -1) * { * if (_lastModel != 0 && Game.Player.Character.Model.Hash != _lastModel) * { * var lastMod = new Model(_lastModel); * lastMod.Request(10000); * Function.Call(Hash.SET_PLAYER_MODEL, new InputArgument(Game.Player), lastMod.Hash); * } * } */ DEBUG_STEP = 28; if (!IsSpectating && _lastSpectating) { Game.Player.Character.Opacity = 255; Game.Player.Character.IsPositionFrozen = false; Game.Player.IsInvincible = false; Game.Player.Character.IsCollisionEnabled = true; SpectatingEntity = 0; CurrentSpectatingPlayer = null; _currentSpectatingPlayerIndex = 100000; Game.Player.Character.PositionNoOffset = _preSpectatorPos; } if (IsSpectating) { if (SpectatingEntity != 0) { Game.Player.Character.Opacity = 0; Game.Player.Character.IsPositionFrozen = true; Game.Player.IsInvincible = true; Game.Player.Character.IsCollisionEnabled = false; Control[] exceptions = new[] { Control.LookLeftRight, Control.LookUpDown, Control.LookLeft, Control.LookRight, Control.LookUp, Control.LookDown, }; Game.DisableAllControlsThisFrame(0); foreach (var c in exceptions) { Game.EnableControlThisFrame(0, c); } var ent = NetEntityHandler.NetToEntity(SpectatingEntity); if (ent != null) { if (Function.Call <bool>(Hash.IS_ENTITY_A_PED, ent) && new Ped(ent.Handle).IsInVehicle()) { Game.Player.Character.PositionNoOffset = ent.Position + new GTA.Math.Vector3(0, 0, 1.3f); } else { Game.Player.Character.PositionNoOffset = ent.Position; } } } else if (SpectatingEntity == 0 && CurrentSpectatingPlayer == null && NetEntityHandler.ClientMap.Values.Count(op => op is SyncPed && !((SyncPed)op).IsSpectating && (((SyncPed)op).Team == 0 || ((SyncPed)op).Team == Main.LocalTeam) && (((SyncPed)op).Dimension == 0 || ((SyncPed)op).Dimension == Main.LocalDimension)) > 0) { CurrentSpectatingPlayer = NetEntityHandler.ClientMap.Values.Where( op => op is SyncPed && !((SyncPed)op).IsSpectating && (((SyncPed)op).Team == 0 || ((SyncPed)op).Team == Main.LocalTeam) && (((SyncPed)op).Dimension == 0 || ((SyncPed)op).Dimension == Main.LocalDimension)) .ElementAt(_currentSpectatingPlayerIndex % NetEntityHandler.ClientMap.Values.Count( op => op is SyncPed && !((SyncPed)op).IsSpectating && (((SyncPed)op).Team == 0 || ((SyncPed)op).Team == Main.LocalTeam) && (((SyncPed)op).Dimension == 0 || ((SyncPed)op).Dimension == Main.LocalDimension))) as SyncPed; } else if (SpectatingEntity == 0 && CurrentSpectatingPlayer != null) { Game.Player.Character.Opacity = 0; Game.Player.Character.IsPositionFrozen = true; Game.Player.IsInvincible = true; Game.Player.Character.IsCollisionEnabled = false; Game.DisableAllControlsThisFrame(0); if (CurrentSpectatingPlayer.Character == null) { Game.Player.Character.PositionNoOffset = CurrentSpectatingPlayer.Position; } else if (CurrentSpectatingPlayer.IsInVehicle) { Game.Player.Character.PositionNoOffset = CurrentSpectatingPlayer.Character.Position + new GTA.Math.Vector3(0, 0, 1.3f); } else { Game.Player.Character.PositionNoOffset = CurrentSpectatingPlayer.Character.Position; } if (Game.IsControlJustPressed(0, Control.PhoneLeft)) { _currentSpectatingPlayerIndex--; CurrentSpectatingPlayer = null; } else if (Game.IsControlJustPressed(0, Control.PhoneRight)) { _currentSpectatingPlayerIndex++; CurrentSpectatingPlayer = null; } if (CurrentSpectatingPlayer != null) { var center = new Point((int)(res.Width / 2), (int)(res.Height / 2)); new UIResText("Now spectating:~n~" + CurrentSpectatingPlayer.Name, new Point(center.X, (int)(res.Height - 200)), 0.4f, Color.White, GTA.UI.Font.ChaletLondon, UIResText.Alignment.Centered) { Outline = true, }.Draw(); new Sprite("mparrow", "mp_arrowxlarge", new Point(center.X - 264, (int)(res.Height - 232)), new Size(64, 128), 180f, Color.White).Draw(); new Sprite("mparrow", "mp_arrowxlarge", new Point(center.X + 200, (int)(res.Height - 232)), new Size(64, 128)).Draw(); } } } _lastSpectating = IsSpectating; _lastKilled = killed; var collection = new CallCollection(); collection.Call(Hash.SET_RANDOM_TRAINS, 0); collection.Call(Hash.CAN_CREATE_RANDOM_COPS, false); DEBUG_STEP = 29; collection.Call(Hash.SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f); collection.Call(Hash.SET_VEHICLE_POPULATION_BUDGET, 0); collection.Call(Hash.SET_PED_POPULATION_BUDGET, 0); collection.Call(Hash.SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME); collection.Call(Hash.SUPPRESS_AGITATION_EVENTS_NEXT_FRAME); collection.Call(Hash.SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f); collection.Call(Hash.SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f); collection.Call(Hash.SET_NUMBER_OF_PARKED_VEHICLES, -1); collection.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, false); collection.Call(Hash.SET_FAR_DRAW_VEHICLES, false); collection.Call(Hash.DESTROY_MOBILE_PHONE); collection.Call((Hash)0x015C49A93E3E086E, true); collection.Call(Hash.SET_PED_DENSITY_MULTIPLIER_THIS_FRAME, 0f); collection.Call(Hash.SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME, 0f, 0f); collection.Call(Hash.SET_CAN_ATTACK_FRIENDLY, Game.Player.Character, true, true); collection.Call(Hash.SET_PED_CAN_BE_TARGETTED, Game.Player.Character, true); collection.Call((Hash)0xF796359A959DF65D, false); // Display distant vehicles collection.Call(Hash.SET_AUTO_GIVE_PARACHUTE_WHEN_ENTER_PLANE, Game.Player, false); collection.Call((Hash)0xD2B315B6689D537D, Game.Player, false); collection.Call(Hash.DISPLAY_CASH, false); collection.Execute(); DEBUG_STEP = 30; GameScript.Pulse(); if ((Game.Player.Character.Position - _lastWaveReset).LengthSquared() > 10000f) // 100f * 100f { Function.Call((Hash)0x5E5E99285AE812DB); Function.Call((Hash)0xB96B00E976BE977F, 0f); _lastWaveReset = Game.Player.Character.Position; } Function.Call((Hash)0x2F9A292AD0A3BD89); Function.Call((Hash)0x5F3B7749C112D552); if (Function.Call <bool>(Hash.IS_STUNT_JUMP_IN_PROGRESS)) { Function.Call(Hash.CANCEL_STUNT_JUMP); } DEBUG_STEP = 31; if (Function.Call <int>(Hash.GET_PED_PARACHUTE_STATE, Game.Player.Character) == 2) { Game.DisableControlThisFrame(0, Control.Aim); Game.DisableControlThisFrame(0, Control.Attack); } DEBUG_STEP = 32; if (RemoveGameEntities && Util.Util.TickCount - _lastEntityRemoval > 500) // Save ressource { _lastEntityRemoval = Util.Util.TickCount; foreach (var entity in World.GetAllPeds()) { if (!NetEntityHandler.ContainsLocalHandle(entity.Handle) && entity != Game.Player.Character) { entity.Kill(); //"Some special peds like Epsilon guys or seashark minigame will refuse to despawn if you don't kill them first." - Guad entity.Delete(); } } foreach (var entity in World.GetAllVehicles()) { if (entity == null) { continue; } var veh = NetEntityHandler.NetToStreamedItem(entity.Handle, useGameHandle: true) as RemoteVehicle; if (veh == null) { entity.Delete(); continue; } //TO CHECK if (entity.IsVehicleEmpty() && !VehicleSyncManager.IsInterpolating(entity.Handle) && veh.TraileredBy == 0 && !VehicleSyncManager.IsSyncing(veh) && ((entity.Handle == Game.Player.LastVehicle?.Handle && DateTime.Now.Subtract(LastCarEnter).TotalMilliseconds > 3000) || entity.Handle != Game.Player.LastVehicle?.Handle)) { if (entity.Position.DistanceToSquared(veh.Position.ToVector()) > 2f) { entity.PositionNoOffset = veh.Position.ToVector(); entity.Quaternion = veh.Rotation.ToVector().ToQuaternion(); } } //veh.Position = entity.Position.ToLVector(); //veh.Rotation = entity.Rotation.ToLVector(); } } _whoseturnisitanyways = !_whoseturnisitanyways; DEBUG_STEP = 34; NetEntityHandler.UpdateAttachments(); DEBUG_STEP = 35; NetEntityHandler.DrawMarkers(); DEBUG_STEP = 36; NetEntityHandler.DrawLabels(); DEBUG_STEP = 37; NetEntityHandler.UpdateMisc(); DEBUG_STEP = 38; NetEntityHandler.UpdateInterpolations(); DEBUG_STEP = 39; WeaponInventoryManager.Update(); DEBUG_STEP = 40; /*string stats = string.Format("{0}Kb (D)/{1}Kb (U), {2}Msg (D)/{3}Msg (U)", _bytesReceived / 1000, * _bytesSent / 1000, _messagesReceived, _messagesSent); */ //GTA.UI.Screen.ShowSubtitle(stats); PedThread.OnTick("thisaintnullnigga", e); DebugInfo.Draw(); //Thread calcucationThread = new Thread(Work); //calcucationThread.IsBackground = true; //calcucationThread.Start(); lock (_threadJumping) { if (_threadJumping.Any()) { Action action = _threadJumping.Dequeue(); if (action != null) { action.Invoke(); } } } DEBUG_STEP = 41; } catch (Exception ex) // Catch any other exception. (can prevent crash) { LogManager.LogException(ex, "MAIN OnTick: STEP : " + DEBUG_STEP); } }